summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-26 04:05:56 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-26 04:05:56 +0000
commit67c6a4d1dccb62159b9d9b2dea4e2f487446e276 (patch)
tree9ccbb35137f480bbbdb899accbda52a8135d3416
parentAdding upstream version 9.4.0+dfsg. (diff)
downloadansible-67c6a4d1dccb62159b9d9b2dea4e2f487446e276.tar.xz
ansible-67c6a4d1dccb62159b9d9b2dea4e2f487446e276.zip
Adding upstream version 9.5.1+dfsg.upstream/9.5.1+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--CHANGELOG-v9.md1537
-rw-r--r--CHANGELOG-v9.rst621
-rw-r--r--PKG-INFO4
-rw-r--r--ansible.egg-info/PKG-INFO4
-rw-r--r--ansible.egg-info/SOURCES.txt675
-rw-r--r--ansible.egg-info/requires.txt2
-rw-r--r--ansible_collections/amazon/aws/.github/workflows/docs-pr.yml1
-rw-r--r--ansible_collections/amazon/aws/CHANGELOG.rst28
-rw-r--r--ansible_collections/amazon/aws/FILES.json61
-rw-r--r--ansible_collections/amazon/aws/MANIFEST.json4
-rw-r--r--ansible_collections/amazon/aws/changelogs/changelog.yaml27
-rw-r--r--ansible_collections/amazon/aws/docs/docsite/rst/CHANGELOG.rst28
-rw-r--r--ansible_collections/amazon/aws/plugins/module_utils/common.py2
-rw-r--r--ansible_collections/amazon/aws/plugins/module_utils/iam.py191
-rw-r--r--ansible_collections/amazon/aws/plugins/module_utils/transformation.py96
-rw-r--r--ansible_collections/amazon/aws/plugins/modules/cloudwatchlogs_log_group_info.py17
-rw-r--r--ansible_collections/amazon/aws/plugins/modules/iam_user_info.py19
-rw-r--r--ansible_collections/amazon/aws/plugins/modules/s3_object.py9
-rw-r--r--ansible_collections/amazon/aws/plugins/plugin_utils/inventory.py36
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/ec2_ami/tasks/main.yml4
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/ec2_security_group/tasks/multi_nested_target.yml18
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/playbooks/create_inventory_config.yml5
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/config.ini.j23
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory_with_template.yml.j22
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/s3_object/aliases1
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/copy_object.yml71
-rw-r--r--ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/main.yml4
-rw-r--r--ansible_collections/amazon/aws/tests/unit/module_utils/iam/test_iam_resource_transforms.py583
-rw-r--r--ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_boto3_resource_to_ansible_dict.py140
-rw-r--r--ansible_collections/amazon/aws/tests/unit/plugin_utils/inventory/test_inventory_base.py131
-rw-r--r--ansible_collections/amazon/aws/tests/unit/plugins/inventory/test_aws_ec2.py1
-rw-r--r--ansible_collections/ansible_community.py2
-rw-r--r--ansible_collections/ansible_release.py2
-rw-r--r--ansible_collections/cisco/aci/.github/workflows/ansible-test.yml21
-rw-r--r--ansible_collections/cisco/aci/.github/workflows/galaxy-importer.cfg2
-rw-r--r--ansible_collections/cisco/aci/CHANGELOG.rst78
-rw-r--r--ansible_collections/cisco/aci/FILES.json2988
-rw-r--r--ansible_collections/cisco/aci/MANIFEST.json4
-rw-r--r--ansible_collections/cisco/aci/README.md2
-rw-r--r--ansible_collections/cisco/aci/changelogs/.plugin-cache.yaml462
-rw-r--r--ansible_collections/cisco/aci/changelogs/changelog.yaml98
-rw-r--r--ansible_collections/cisco/aci/meta/runtime.yml65
-rw-r--r--ansible_collections/cisco/aci/plugins/doc_fragments/aci.py10
-rw-r--r--ansible_collections/cisco/aci/plugins/filter/listify.py295
-rw-r--r--ansible_collections/cisco/aci/plugins/httpapi/aci.py13
-rw-r--r--ansible_collections/cisco/aci/plugins/module_utils/aci.py203
-rw-r--r--ansible_collections/cisco/aci/plugins/module_utils/annotation_unsupported.py853
-rw-r--r--ansible_collections/cisco/aci/plugins/module_utils/constants.py338
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_aaa_certificate_authority.py290
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_aaa_key_ring.py339
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_aaa_security_default_settings.py531
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_aaa_ssh_auth.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_port_block_to_access_port.py158
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_port_to_interface_policy_leaf_profile.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile.py279
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile_to_spine_switch_profile.py292
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_selector.py326
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_profile.py277
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_selector.py321
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_sub_port_block_to_access_port.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_access_switch_policy_group.py600
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_action_rule_additional_communities.py304
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path.py304
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path_asn.py312
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_aep.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_aep_to_epg.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bd.py238
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bd_rogue_exception_mac.py299
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bd_to_netflow_monitor_policy.py292
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bfd_multihop_node_policy.py320
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bgp_address_family_context_policy.py382
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bgp_best_path_policy.py12
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bgp_peer_prefix_policy.py322
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bgp_route_summarization_policy.py310
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_asn.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_node.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_bgp_timers_policy.py12
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_cloud_subnet.py53
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_config_snapshot.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_service_graph.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option.py306
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option_policy.py276
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay_provider.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_dns_domain.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_dns_profile.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_dns_provider.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_domain.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_encap_pool.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_encap_pool_range.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_epg.py71
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract.py74
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_interface.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_epg_to_domain.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_block_statement.py348
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_simple_statement.py436
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_esg_ip_subnet_selector.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_connection_profile.py311
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_routing_profile.py315
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_interface_policy_group.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_profile.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access.py700
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access_https_cipher.py282
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod.py292
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_connectivity_profile.py336
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_external_tep.py321
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_profile.py267
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_remote_pool.py294
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_selector.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_profile.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_switch_assoc.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_block.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_policy_group.py32
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_fabric_wide_settings.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_igmp_interface_policy.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_blacklist.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_description.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd.py318
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd_multihop.py318
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_eigrp.py371
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_hsrp.py310
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_fc_policy_group.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_policy_group.py85
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_link_level.py5
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_pim.py444
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_storm_control.py434
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_key_policy.py325
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_keychain_policy.py276
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l2out.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg_to_contract.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_path.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_profile.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_node_profile.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out.py88
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_interface_profile.py367
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_multihop_interface_profile.py366
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_peer.py163
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_dhcp_relay_label.py354
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_eigrp_interface_profile.py392
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg_to_contract.py99
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_extsubnet.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi.py475
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path.py491
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path_secondary_ip.py398
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_secondary_ip.py362
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_group.py393
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_interface_profile.py320
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_secondary_vip.py344
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface.py121
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface_secondary_ip.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile.py202
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile_ospf_policy.py19
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_vpc_member.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node.py48
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node_profile.py40
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes_nexthop.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_l3out_to_sr_mpls_infra_l3out.py355
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group_node.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_match_route_destination.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_netflow_exporter_policy.py490
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_policy.py300
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_to_exporter.py290
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_netflow_record_policy.py313
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_node_block.py390
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_node_mgmt_epg.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_ntp_policy.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_ntp_server.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_entry.py329
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_policy.py276
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_qos_custom_policy.py284
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_qos_dot1p_class.py355
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_qos_dscp_class.py356
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_rest.py48
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_snmp_client.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_snmp_client_group.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_snmp_community_policy.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_snmp_policy.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_snmp_user.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_static_node_mgmt_address.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_subject_label.py746
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_switch_leaf_selector.py30
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_vpc_protection_group.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_syslog_group.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_syslog_remote_dest.py5
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_syslog_source.py2
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_system.py9
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_tag.py6
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_tenant_action_rule_profile.py232
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_vmm_controller.py22
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_vmm_vswitch_policy.py4
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_vrf_multicast.py702
-rw-r--r--ansible_collections/cisco/aci/plugins/modules/aci_vzany_to_contract.py4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/inventory.networking6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/pki/admin.crt14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/tasks/main.yml305
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_custom_privilege/tasks/main.yml28
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_domain/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.crt14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.key16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/tasks/main.yml364
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_role/tasks/main.yml34
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/tasks/main.yml235
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_certificate/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_domain/tasks/main.yml24
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_role/tasks/main.yml32
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_block_to_access_port/tasks/main.yml152
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_to_interface_policy_leaf_profile/tasks/main.yml74
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_dst_group/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group_entry/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src_path/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/tasks/main.yml183
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/tasks/main.yml176
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/tasks/main.yml204
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/tasks/main.yml183
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/tasks/main.yml193
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_sub_port_block_to_access_port/tasks/main.yml10
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/tasks/main.yml1122
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/tasks/main.yml147
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/tasks/main.yml148
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/tasks/main.yml156
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aep/tasks/main.yml96
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_domain/tasks/main.yml20
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_epg/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_ap/tasks/main.yml80
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd/tasks/main.yml442
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd_dhcp_label/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/tasks/main.yml186
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd_subnet/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_l3out/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/tasks/main.yml191
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/tasks/main.yml245
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/tasks/main.yml244
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_best_path_policy/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/tasks/main.yml151
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/tasks/main.yml255
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_asn/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_node/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_timers_policy/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_bulk_static_binding_to_epg/tasks/main.yml62
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ap/tasks/main.yml10
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_aws_provider/tasks/main.yml8
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_bgp_asn/tasks/main.yml30
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_cidr/tasks/main.yml66
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ctx_profile/tasks/main.yml54
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg_selector/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg_selector/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_provider/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_region/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_subnet/tasks/main.yml312
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_vpn_gateway/tasks/main.yml28
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_zone/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_config_export_policy/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_config_rollback/tasks/main.yml10
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_config_snapshot/tasks/main.yml20
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_contract/tasks/main.yml8
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_contract_export/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_filter/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_service_graph/tasks/main.yml8
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/tasks/main.yml188
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/tasks/main.yml139
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay/tasks/main.yml32
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay_provider/tasks/main.yml30
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dns_domain/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dns_profile/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_dns_provider/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/fc.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l2dom.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l3dom.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/phys.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/vmm-vmware.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_encap_pool/tasks/main.yml118
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml20
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vlan.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vxlan.yml24
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/vlan.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg/tasks/main.yml351
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_monitoring_policy/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_subnet/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract/tasks/main.yml83
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_interface/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_master/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_domain/tasks/main.yml82
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/tasks/main.yml251
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/main.yml261
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/simple_block_levels.yml156
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_esg/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_esg_contract_master/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_esg_epg_selector/tasks/main.yml28
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_esg_ip_subnet_selector/tasks/main.yml20
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_esg_tag_selector/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/tasks/main.yml222
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/tasks/main.yml278
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_interface_policy_group/tasks/main.yml64
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_profile/tasks/main.yml32
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_switch_assoc/tasks/main.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.crt14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.key16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/tasks/main.yml328
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.crt14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.key16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/tasks/main.yml233
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node_control/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/tasks/main.yml206
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/tasks/main.yml225
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/tasks/main.yml210
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_policy_group/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/tasks/main.yml153
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/tasks/main.yml246
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_selector/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_scheduler/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_dst_group/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_node/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_path/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_profile/tasks/main.yml32
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_switch_assoc/tasks/main.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_block/tasks/main.yml60
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_policy_group/tasks/main.yml44
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_wide_settings/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_file_remote_path/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_filter/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_filter_entry/tasks/main.yml20
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/tasks/main.yml197
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group_node/tasks/main.yml44
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_policy/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_source/tasks/main.yml42
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_igmp_interface_policy/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_blacklist/tasks/main.yml64
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_config/tasks/main.yml42
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_description/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/tasks/main.yml245
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/tasks/main.yml245
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_cdp/tasks/main.yml10
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/tasks/main.yml192
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_fc/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/tasks/main.yml184
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_l2/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_breakout_port_group/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_fc_policy_group/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_policy_group/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile_fex_policy_group/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_link_level/tasks/main.yml149
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_lldp/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_mcp/tasks/main.yml64
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_ospf/tasks/main.yml20
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/tasks/main.yml275
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_channel/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_security/tasks/main.yml34
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spanning_tree/tasks/main.yml34
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spine_policy_group/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/tasks/main.yml285
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/tasks/main.yml153
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/tasks/main.yml135
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l2out/tasks/main.yml34
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg_to_contract/tasks/main.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_path/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_profile/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_node_profile/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out/tasks/main.yml223
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/tasks/main.yml226
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/tasks/main.yml233
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_peer/tasks/main.yml380
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_protocol_profile/tasks/main.yml46
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/tasks/main.yml242
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/tasks/main.yml224
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg_to_contract/tasks/main.yml236
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extsubnet/tasks/main.yml34
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/tasks/main.yml220
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/tasks/main.yml365
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/tasks/main.yml226
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/tasks/main.yml159
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/tasks/main.yml195
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/tasks/main.yml152
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/tasks/main.yml173
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface/tasks/main.yml362
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface_secondary_ip/tasks/main.yml86
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile/tasks/main.yml346
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile_ospf_policy/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_vpc_member/tasks/main.yml26
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node/tasks/main.yml161
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node_profile/tasks/main.yml89
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_route_tag_policy/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes/tasks/main.yml56
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes_nexthop/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/tasks/main.yml238
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_lookup_interface_range/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group/tasks/main.yml44
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group_node/tasks/main.yml48
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_policy/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_match_as_path_regex_term/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_factor/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_regex_term/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_term/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_match_route_destination/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_match_rule/tasks/main.yml36
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/tasks/main.yml337
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/tasks/main.yml193
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/tasks/main.yml172
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/tasks/main.yml194
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/tasks/main.yml275
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_node_mgmt_epg/tasks/main.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_policy/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_server/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/tasks/main.yml196
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/tasks/main.yml135
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/tasks/main.yml139
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/tasks/main.yml167
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/tasks/main.yml167
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/error_handling.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_inline.yml175
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_string.yml175
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_file.yml125
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tag.xml1
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml1
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation_children.xml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_string.yml137
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_inline.yml141
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_string.yml141
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_context/tasks/main.yml46
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_profile/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client_group/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_community_policy/tasks/main.yml34
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_policy/tasks/main.yml30
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_static_binding_to_epg/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_static_node_mgmt_address/tasks/main.yml60
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/main.yml253
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/subject_label.yml188
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_switch_leaf_selector/tasks/main.yml10
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_leaf_profile/tasks/main.yml18
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_vpc_protection_group/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_group/tasks/main.yml30
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_remote_dest/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_source/tasks/main.yml40
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_system/tasks/main.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_system_banner/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_system_endpoint_controls/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_system_global_aes_passphrase_encryption/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_taboo_contract/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tag/tasks/main.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/httpapi_connection.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/main.yml106
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_action_rule_profile/tasks/main.yml220
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_ep_retention_policy/tasks/main.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_dst_group/tasks/main.yml42
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_src/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_to_dst_group/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/dynamic.yml24
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/main.yml4
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/static.yml24
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool_encap_block/tasks/main.yml50
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_controller/tasks/main.yml94
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/vmware.yml16
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink/tasks/main.yml28
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink_container/tasks/main.yml38
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_vswitch_policy/tasks/main.yml42
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vrf/tasks/main.yml8
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_leak_internal_subnet/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/aliases2
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/tasks/main.yml1133
-rw-r--r--ansible_collections/cisco/aci/tests/integration/targets/aci_vzany_to_contract/tasks/main.yml12
-rw-r--r--ansible_collections/cisco/aci/tests/unit/compat/builtins.py13
-rw-r--r--ansible_collections/cisco/aci/tests/unit/mock/loader.py2
-rw-r--r--ansible_collections/cisco/aci/tests/unit/module_utils/test_aci.py2
-rw-r--r--ansible_collections/cisco/dnac/.github/workflows/docs.yml8
-rw-r--r--ansible_collections/cisco/dnac/.github/workflows/sanity_tests.yml20
-rw-r--r--ansible_collections/cisco/dnac/.github/workflows/sanity_tests_devel.yml32
-rw-r--r--ansible_collections/cisco/dnac/FILES.json831
-rw-r--r--ansible_collections/cisco/dnac/MANIFEST.json6
-rw-r--r--ansible_collections/cisco/dnac/README.md16
-rw-r--r--ansible_collections/cisco/dnac/changelogs/changelog.yaml17
-rw-r--r--ansible_collections/cisco/dnac/meta/runtime.yml2
-rw-r--r--ansible_collections/cisco/dnac/playbooks/PnP.yml4
-rw-r--r--ansible_collections/cisco/dnac/playbooks/PnP_Workflow_Manager_Playbook.yml2
-rw-r--r--ansible_collections/cisco/dnac/playbooks/device_details.template20
-rw-r--r--ansible_collections/cisco/dnac/playbooks/device_provision_workflow.yml10
-rw-r--r--ansible_collections/cisco/dnac/playbooks/template_workflow_manager.yml16
-rw-r--r--ansible_collections/cisco/dnac/plugins/module_utils/dnac.py61
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/accesspoint_configuration_details_by_task_id_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/app_policy_default_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/app_policy_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/app_policy_intent_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/application_sets.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/application_sets_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/application_sets_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/applications.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/applications_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/applications_health_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/applications_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/assign_device_to_site.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/associate_site_to_network_profile.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate_p12.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/authentication_policy_servers_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/buildings_planned_access_points_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/business_sda_virtual_network_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/cli_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/client_detail_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/client_enrichment_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/client_health_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/client_proximity_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/command_runner_run_command.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/compliance_check_run.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/compliance_device_by_id_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/compliance_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/compliance_device_status_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_clone.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_status_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_v2.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_project.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_template.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_project.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_template.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_project.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_project_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/credential_to_site_by_siteid_create_v2.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_configurations_export.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_credential_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_credential_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_credential_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_credential_intent.py17
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_credential_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_credential_workflow_manager.py17
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_enrichment_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_family_identifiers_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_health_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_interface_by_ip_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_interface_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_interface_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_interface_isis_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_interface_ospf_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_replacement.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_replacement_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_replacement_deploy.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/device_replacement_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/disassociate_site_to_network_profile.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_operationstatus_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_status_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_device_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_device_range_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_intent.py156
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_job_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_range_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_range_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/discovery_workflow_manager.py156
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/dna_command_runner_keywords_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/dnac_packages_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/dnacaap_management_execution_status_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/eox_status_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/eox_status_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_api_status_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_artifact_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_artifact_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_config_connector_types_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_email_config.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_email_config_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_email_config_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_email_config_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_parent_records_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_series_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_series_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_snmp_config_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_email_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_rest_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_syslog_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_email.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_email_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_syslog_config.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_syslog_config_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_webhook_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/event_webhook_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/execute_suggested_actions_commands.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/file_import.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/file_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/file_namespace_files_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/file_namespaces_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/global_credential_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/global_credential_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/global_credential_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/global_credential_v2.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/global_credential_v2_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/global_pool.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/global_pool_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/golden_image_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/http_read_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/http_write_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/interface_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/interface_network_device_detail_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/interface_network_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/interface_network_device_range_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/interface_operation_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/interface_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/inventory_intent.py167
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/inventory_workflow_manager.py172
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/issues_enrichment_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/issues_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/itsm_cmdb_sync_status_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_failed_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_retry.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/lan_automation_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/lan_automation_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/lan_automation_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_by_serial_number_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/lan_automation_status_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_device_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_device_deregistration.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_device_license_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_device_license_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_device_registration.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_smart_account_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_term_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_usage_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_change.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/netconf_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_by_ip_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_by_serial_number_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_chassis_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_config_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_config_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_equipment_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_export.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_functional_capability_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_global_polling_interval_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_interface_neighbor_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_interface_poe_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_inventory_insight_link_mismatch_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_lexicographically_sorted_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_linecard_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_meraki_organization_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_module_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_module_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_poe_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_polling_interval_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_range_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_register_for_wsa_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_stack_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_supervisor_card_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_sync.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_update_role.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_vlan_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_wireless_lan_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_device_with_snmp_v3_des_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_settings_intent.py12
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_settings_workflow_manager.py12
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_v2.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/network_v2_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/nfv_profile.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/nfv_profile_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/nfv_provision.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/nfv_provision_detail_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/nfv_provision_details.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/path_trace.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/path_trace_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/planned_access_points_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/platform_nodes_configuration_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/platform_release_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_authorize.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim_to_site.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_config_preview.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_history_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_import.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_reset.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_device_unclaim.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_intent.py29
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_server_profile_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_smart_account_domains_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_add.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_deregister.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_devices_sync.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_sync_result_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_accounts_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_workflow.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_manager.py29
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/profiling_rules_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/profiling_rules_in_bulk_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/projects_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/provision_intent.py10
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/provision_workflow_manager.py29
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/qos_device_interface.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reports.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reports_executions_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reports_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reports_view_group_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reports_view_group_view_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/role_permissions_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/roles_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_device_role_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_multicast.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_multicast_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_provision_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_provision_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/security_advisories_devices_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/security_advisories_ids_per_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/security_advisories_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/security_advisories_per_device_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/security_advisories_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sensor.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sensor_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sensor_test_run.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_duplicate.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_edit.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/service_provider_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/service_provider_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/service_provider_profile_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/service_provider_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/service_provider_v2.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/service_provider_v2_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_assign_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_assign_device.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_delete.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_design_floormap.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_design_floormap_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_health_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_intent.py23
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_membership_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/site_workflow_manager.py23
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/snmp_properties.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/snmp_properties_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/snmpv2_read_community_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/snmpv2_write_community_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/snmpv3_credential.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/sp_profile_delete_v2.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/swim_image_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/swim_import_local.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/swim_import_via_url.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/swim_intent.py26
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/swim_trigger_activation.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/swim_trigger_distribution.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/swim_workflow_manager.py26
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/syslog_config_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/syslog_config_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/system_health_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/system_health_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/system_performance_historical_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/system_performance_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag_member.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag_member_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag_member_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag_member_type_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/tag_membership.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/task_count_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/task_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/task_operation_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/task_tree_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/template_intent.py12
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/template_preview.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/template_workflow_manager.py864
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/templates_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/threat_detail.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/threat_detail_count.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/threat_summary.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/topology_layer_2_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/topology_layer_3_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/topology_network_health_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/topology_physical_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/topology_site_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/topology_vlan_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/transit_peer_network.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/transit_peer_network_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/user.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/user_enrichment_details_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/user_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/users_external_servers_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_accespoint_configuration.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_accesspoint_configuration_summary_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_profile.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_profile_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_provision_access_point.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_create.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_update.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_create_provision.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_delete_reprovision.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_psk_override.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile_info.py4
-rw-r--r--ansible_collections/cisco/dnac/plugins/modules/wireless_sensor_test_results_info.py4
-rw-r--r--ansible_collections/cisco/intersight/CHANGELOG.md3
-rw-r--r--ansible_collections/cisco/intersight/FILES.json6
-rw-r--r--ansible_collections/cisco/intersight/MANIFEST.json4
-rw-r--r--ansible_collections/cisco/intersight/plugins/modules/intersight_local_user_policy.py54
-rw-r--r--ansible_collections/cisco/intersight/plugins/modules/intersight_server_profile.py8
-rw-r--r--ansible_collections/cisco/ise/.DS_Storebin10244 -> 0 bytes
-rw-r--r--ansible_collections/cisco/ise/.vscode/launch.json16
-rw-r--r--ansible_collections/cisco/ise/.vscode/settings.json24
-rw-r--r--ansible_collections/cisco/ise/FILES.json44
-rw-r--r--ansible_collections/cisco/ise/MANIFEST.json6
-rw-r--r--ansible_collections/cisco/ise/Pipfile13
-rw-r--r--ansible_collections/cisco/ise/changelogs/changelog.yaml8
-rw-r--r--ansible_collections/cisco/ise/plugins/.DS_Storebin8196 -> 0 bytes
-rw-r--r--ansible_collections/cisco/meraki/.vscode/settings.json3
-rw-r--r--ansible_collections/cisco/meraki/FILES.json1766
-rw-r--r--ansible_collections/cisco/meraki/MANIFEST.json6
-rw-r--r--ansible_collections/cisco/meraki/README.md132
-rw-r--r--ansible_collections/cisco/meraki/changelogs/changelog.yaml62
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_entitlements_info.py90
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_bind.py91
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim.py95
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim_key_validate.py87
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_compliance_statuses_info.py94
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_info.py128
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices.py65
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings.py211
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings_info.py90
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_blink_leds.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_camera_custom_analytics.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_camera_generate_snapshot.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_camera_quality_and_retention.py42
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_camera_sense.py22
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_camera_wireless_profiles.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_lan.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_port_forwarding_rules.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table.py174
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table_info.py79
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test.py180
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test_info.py79
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test.py174
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test_info.py79
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan.py186
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan_info.py79
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_sensor_relationships.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_switch_ports.py213
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces.py90
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces_dhcp.py82
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_routes.py32
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_wireless_alternate_management_interface_ipv6.py89
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/devices_wireless_radio_settings.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks.py45
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_alerts_settings.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_content_filtering.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles.py252
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles_info.py90
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_malware.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_single_lan.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_ssids.py74
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_custom_performance_classes.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection.py22
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_vpn_exclusions.py91
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans.py209
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_bgp.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_site_to_site_vpn.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_bind.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_camera_quality_retention_profiles.py64
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_camera_wireless_profiles.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_dhcp.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_subnet_pool.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_clients_info.py98
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_rollbacks.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_defer.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_rollbacks.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_groups.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_floor_plans.py54
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_group_policies.py72
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_meraki_auth_users.py57
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_mqtt_brokers.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_netflow.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sensor_alerts_profiles.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_settings.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_checkin.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_fields.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_install_apps.py93
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_lock.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_modify_tags.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_move.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_reboot.py103
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_shutdown.py95
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_uninstall_apps.py91
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wipe.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_sm_profiles_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_access_policies.py186
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_alternate_management_interface.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_qos_rules_order.py72
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_routing_ospf.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_settings.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces.py90
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces_dhcp.py82
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_static_routes.py32
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_traffic_analysis.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles.py260
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_by_device_info.py120
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_reassign.py93
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_info.py92
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers.py30
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_webhooks_payload_templates.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_alternate_management_interface.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_bluetooth_settings.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles.py270
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_assign.py91
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_info.py102
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_set_default.py89
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_rf_profiles.py113
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_settings.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids.py542
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_bonjour_forwarding.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_device_type_group_policies.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_eap_override.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_firewall_l3_firewall_rules.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_hotspot20.py58
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_identity_psks.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_splash_settings.py132
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_traffic_shaping_rules.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_vpn.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_action_batches.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_acls.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_groups.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_policies.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_admins.py30
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_alerts_profiles.py58
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py112
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_statuses_overview_info.py90
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_usage_by_network_info.py102
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies.py50
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_areas_by_device_info.py94
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_lines_by_device_info.py94
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_camera_detections_history_by_boundary_by_interval_info.py116
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_camera_permissions_info.py102
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles.py252
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles_info.py90
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_claim.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_config_templates.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports.py182
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_change_history_info.py136
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_devices_boots_history_info.py132
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_early_access_features_opt_ins.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_by_device_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_info.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_insight_monitored_media_servers.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_inventory_claim.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_export_events.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_networks_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_login_security.py96
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_networks_combine.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_openapi_spec_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects.py66
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects_groups.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_saml_idps.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles.py256
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles_info.py108
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments.py89
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments_by_network_info.py112
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_snmp.py22
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_networks_by_status_info.py108
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_callbacks_statuses_info.py102
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_device_info.py132
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_network_info.py132
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py132
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py132
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_client_info.py136
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_device_info.py136
-rw-r--r--ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_network_info.py136
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/administered_identities_me_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_entitlements_info.py83
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_bind.py95
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim.py112
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim_key_validate.py99
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_compliance_statuses_info.py107
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_info.py164
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices.py3
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_appliance_performance_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings.py128
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings_info.py87
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings.py40
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings_info.py40
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_appliance_vmx_authentication_token.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_blink_leds.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_analytics_live_info.py11
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics.py15
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_generate_snapshot.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_link_info.py7
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings.py9
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings_info.py11
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan.py30
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan_info.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_port_forwarding_rules_info.py21
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims.py3
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims_info.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_info.py46
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table.py120
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table_info.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test.py130
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test_info.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping.py50
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device.py50
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device_info.py35
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_info.py30
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test.py126
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test_info.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan.py131
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan_info.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_lldp_cdp_info.py7
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_management_interface.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_management_interface_info.py32
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships_info.py25
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports.py64
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_cycle.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_info.py92
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_statuses_info.py91
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces.py78
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp.py42
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp_info.py42
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_info.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes.py39
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_alternate_management_interface_ipv6.py125
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_connection_stats_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_latency_stats_info.py33
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/devices_wireless_status_info.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks.py46
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_alerts_history_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings_info.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_connectivity_monitoring_destinations_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_categories_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_cellular_firewall_rules_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l3_firewall_rules_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_application_categories_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_many_nat_rules_info.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_one_nat_rules_info.py25
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_port_forwarding_rules_info.py19
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_settings_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles.py199
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles_info.py108
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_custom_performance_classes.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_info.py7
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_rules_info.py25
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py62
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py62
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_vpn_exclusions.py119
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans.py84
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_info.py64
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn_info.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_appliance_warm_spare_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_bind.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_bluetooth_clients_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles.py60
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles_info.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_connectivity_monitoring_destinations_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool.py1
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink.py9
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink_info.py7
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_clients_info.py162
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_clients_overview_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy.py7
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_clients_provision.py64
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_clients_splash_authorization_status_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim_vmx.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_events_event_types_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_events_info.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades.py273
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_info.py246
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_rollbacks.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events.py55
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_defer.py22
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_info.py22
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_rollbacks.py22
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups.py49
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans.py116
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans_info.py62
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_group_policies.py241
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_group_policies_info.py130
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_health_alerts_info.py46
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_insight_applications_health_by_time_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users.py51
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_mqtt_brokers.py35
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_netflow.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_netflow_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_pii_pii_keys_info.py23
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_pii_requests_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_devices_for_key_info.py9
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_owners_for_key_info.py9
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_policies_by_client_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_current_overview_by_metric_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_overview_by_metric_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles.py228
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles_info.py79
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sensor_relationships_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_settings.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_settings_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_bypass_activation_lock_attempts_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_certs_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_checkin.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_desktop_logs_info.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_command_logs_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_profiles_info.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_fields.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_info.py30
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_install_apps.py87
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_lock.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_modify_tags.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_move.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_performance_history_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_reboot.py126
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_security_centers_info.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_shutdown.py104
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_unenroll.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_uninstall_apps.py81
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wipe.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_profiles_info.py11
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups.py29
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_trusted_access_configs_info.py11
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_user_access_devices_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_device_profiles_info.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_info.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_softwares_info.py2
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_snmp.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_snmp_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_split.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies.py97
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies_info.py45
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_alternate_management_interface_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy.py25
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_warnings_by_device_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_info.py23
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_v4_servers_seen_info.py116
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_dscp_to_cos_mappings_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations.py44
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules.py95
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules_info.py15
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order.py33
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast.py41
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_info.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points_info.py15
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_ospf_info.py32
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_remove.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces.py71
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp.py40
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp_info.py38
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_info.py31
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_storm_control.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_topology_link_layer_info.py59
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis.py25
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_application_categories_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py5
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_unbind.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles.py168
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_by_device_info.py135
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_reassign.py102
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_info.py100
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates.py32
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_webhook_tests_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_alternate_management_interface_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing.py21
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_channel_utilization_history_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_client_count_history_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_connection_stats_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_latency_stats_info.py29
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_data_rate_history_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_devices_connection_stats_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles.py171
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_assign.py87
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_info.py100
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_set_default.py76
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_failed_connections_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_history_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_stats_info.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_mesh_statuses_info.py19
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles.py689
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles_info.py225
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings.py38
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_signal_quality_history_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids.py336
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_device_type_group_policies_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules.py11
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules_info.py15
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules_info.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_hotspot20_info.py51
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_info.py57
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_schedules_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings.py79
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings_info.py75
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules_info.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_vpn_info.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/networks_wireless_usage_history_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations.py36
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches.py81
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches_info.py32
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls.py32
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups_info.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_overview_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies.py34
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies_info.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_settings_info.py9
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_admins.py48
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_admins_info.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_alerts_profiles.py60
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py124
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_statuses_overview_info.py83
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_usage_by_network_info.py109
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py40
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py40
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py26
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies.py94
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_info.py42
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_areas_by_device_info.py100
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_lines_by_device_info.py104
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts.py13
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts_info.py15
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_detections_history_by_boundary_by_interval_info.py123
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_permissions_info.py84
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles.py129
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles_info.py106
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_claim.py22
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_clients_bandwidth_usage_history_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_clients_overview_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_clients_search_info.py51
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_clone.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates.py25
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports.py82
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports_info.py56
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_change_history_info.py174
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_boots_history_info.py149
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_info.py27
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_info.py58
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_overview_info.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_addresses_by_device_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_loss_and_latency_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins.py24
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_by_device_info.py42
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_info.py58
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_info.py38
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_insight_applications_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers.py21
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_claim.py19
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_devices_info.py23
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports.py4
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports_info.py8
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_networks_info.py17
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_prepare.py20
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_release.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_licenses.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_assign_seats.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_info.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_overview_info.py61
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_renew_seats.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_info.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_move.py60
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_login_security.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_login_security_info.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_networks_combine.py12
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_openapi_spec_info.py39
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects.py43
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups.py31
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups_info.py19
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_info.py21
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles.py44
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles_info.py29
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_history_info.py48
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_latest_info.py46
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles.py92
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles_info.py118
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments.py134
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments_by_network_info.py138
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_sm_vpp_accounts_info.py19
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_snmp.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_snmp_info.py16
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_appliances_by_utilization_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_by_usage_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py6
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_by_usage_info.py30
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_models_by_usage_info.py10
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_networks_by_status_info.py145
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_ssids_by_usage_info.py18
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py14
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_switch_ports_by_switch_info.py38
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_uplinks_statuses_info.py28
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_callbacks_statuses_info.py99
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_device_info.py159
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_network_info.py157
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py161
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py159
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py40
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_client_info.py163
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_device_info.py166
-rw-r--r--ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_network_info.py159
-rw-r--r--ansible_collections/cisco/mso/.github/workflows/ansible-test.yml24
-rw-r--r--ansible_collections/cisco/mso/.github/workflows/galaxy-importer.cfg2
-rw-r--r--ansible_collections/cisco/mso/CHANGELOG.rst31
-rw-r--r--ansible_collections/cisco/mso/FILES.json405
-rw-r--r--ansible_collections/cisco/mso/MANIFEST.json4
-rw-r--r--ansible_collections/cisco/mso/README.md3
-rw-r--r--ansible_collections/cisco/mso/changelogs/.plugin-cache.yaml16
-rw-r--r--ansible_collections/cisco/mso/changelogs/changelog.yaml642
-rw-r--r--ansible_collections/cisco/mso/meta/runtime.yml11
-rw-r--r--ansible_collections/cisco/mso/plugins/module_utils/constants.py39
-rw-r--r--ansible_collections/cisco/mso/plugins/module_utils/mso.py217
-rw-r--r--ansible_collections/cisco/mso/plugins/module_utils/schema.py75
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_backup.py10
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_backup_schedule.py5
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy_option.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy_provider.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_label.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_remote_location.py5
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_rest.py5
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_role.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema.py70
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_clone.py1
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_bulk_staticport.py9
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_domain.py208
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_selector.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticleaf.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticport.py569
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_subnet.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_useg_attribute.py18
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_l3out.py5
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_subnet.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph.py376
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph_listener.py739
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg.py40
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg_selector.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_l3out.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_service_graph.py164
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr_subnet.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_hub_network.py3
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template.py21
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg.py5
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_contract.py358
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_selector.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_subnet.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_useg_attribute.py16
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_dhcp_policy.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_subnet.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_clone.py3
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_filter.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_service_graph.py3
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy.py3
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy_status.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg.py5
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_contract.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_selector.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_subnet.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_externalepg.py5
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_filter_entry.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_l3out.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_migrate.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_service_graph.py11
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf_contract.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_schema_validate.py10
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_service_node_type.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_site.py4
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_tenant.py36
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_tenant_site.py9
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_user.py6
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/mso_version.py1
-rw-r--r--ansible_collections/cisco/mso/plugins/modules/ndo_schema_template_deploy.py5
-rw-r--r--ansible_collections/cisco/mso/tests/integration/inventory.networking4
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_backup/tasks/main.yml120
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_backup_schedule/tasks/main.yml39
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy/tasks/main.yaml72
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy_option/tasks/main.yaml102
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy/tasks/main.yaml66
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy_provider/tasks/main.yaml124
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_label/tasks/main.yml104
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_remote_location/tasks/main.yml47
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/error_handling.yml22
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_inline.yml52
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_string.yml42
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_template.yml14
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_inline.yml42
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_string.yml42
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/main.yml14
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-ro.yml20
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-rw.yml72
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema/tasks/main.yml145
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_clone/tasks/main.yml22
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site/tasks/main.yml62
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp/tasks/main.yml104
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg/tasks/main.yml140
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_bulk_staticport/tasks/main.yml138
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_domain/tasks/main.yml341
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_selector/tasks/main.yml194
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_staticport/tasks/main.yml696
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_useg_attribute/tasks/main.yml191
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd/tasks/main.yml152
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_l3out/tasks/main.yml94
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_subnet/tasks/main.yml134
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/aliases2
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/l4_l7_devices.yml312
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/main.yml935
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/aliases2
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/l4_l7_devices.yml222
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/main.yml1604
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/pki/admin.crt14
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg/tasks/main.yml435
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg_selector/tasks/main.yml104
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/l4_l7_devices.yml237
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/main.yml1948
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region/tasks/main.yml96
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr/tasks/main.yml172
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr_subnet/tasks/main.yml204
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/hub_network.yml130
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/main.yml6
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template/tasks/main.yml160
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp/tasks/main.yml68
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg/tasks/main.yml240
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_contract/tasks/main.yml642
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_selector/tasks/main.yml142
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_useg_attribute/tasks/main.yml189
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd/tasks/main.yml304
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_dhcp_policy/tasks/main.yml98
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_subnet/tasks/main.yml122
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_clone/tasks/main.yml26
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_filter/tasks/main.yml242
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_service_graph/tasks/main.yml106
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy_status/tasks/main.yml156
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg/tasks/main.yml226
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_contract/tasks/main.yml126
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_selector/tasks/main.yml92
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_subnet/tasks/main.yml114
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_filter_entry/tasks/main.yml34
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_l3out/tasks/main.yml54
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_migrate/tasks/main.yml62
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_service_graph/tasks/main.yml255
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf/tasks/main.yml116
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf_contract/tasks/main.yml158
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_schema_validate/tasks/main.yml2
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_service_node_type/tasks/main.yml28
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_site/tasks/main.yml148
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_tenant/tasks/main.yml234
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_tenant_site/tasks/main.yml160
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_user/tasks/main.yml117
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/mso_version/tasks/main.yml20
-rw-r--r--ansible_collections/cisco/mso/tests/integration/targets/ndo_schema_template_deploy/tasks/main.yml2
-rw-r--r--ansible_collections/community/aws/CHANGELOG.rst31
-rw-r--r--ansible_collections/community/aws/FILES.json37
-rw-r--r--ansible_collections/community/aws/MANIFEST.json4
-rw-r--r--ansible_collections/community/aws/changelogs/changelog.yaml23
-rw-r--r--ansible_collections/community/aws/docs/docsite/rst/CHANGELOG.rst31
-rw-r--r--ansible_collections/community/aws/meta/runtime.yml1
-rw-r--r--ansible_collections/community/aws/plugins/connection/aws_ssm.py5
-rw-r--r--ansible_collections/community/aws/plugins/module_utils/common.py2
-rw-r--r--ansible_collections/community/aws/plugins/modules/dynamodb_table_info.py292
-rw-r--r--ansible_collections/community/aws/plugins/modules/glue_job.py5
-rw-r--r--ansible_collections/community/aws/plugins/modules/msk_cluster.py22
-rw-r--r--ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/main.yml21
-rw-r--r--ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/test_pay_per_request.yml52
-rw-r--r--ansible_collections/community/aws/tests/integration/targets/elb_target/tasks/lambda_target.yml2
-rw-r--r--ansible_collections/community/aws/tests/integration/targets/s3_bucket_notification/tasks/test_lambda_notifications.yml2
-rw-r--r--ansible_collections/community/aws/tests/integration/targets/secretsmanager_secret/tasks/rotation.yml4
-rw-r--r--ansible_collections/community/aws/tests/integration/targets/sns_topic/tasks/main.yml2
-rw-r--r--ansible_collections/community/aws/tests/sanity/ignore-2.17.txt2
-rw-r--r--ansible_collections/community/crypto/.azure-pipelines/azure-pipelines.yml136
-rw-r--r--ansible_collections/community/crypto/.github/workflows/ansible-test.yml19
-rw-r--r--ansible_collections/community/crypto/.github/workflows/reuse.yml2
-rw-r--r--ansible_collections/community/crypto/CHANGELOG.md620
-rw-r--r--ansible_collections/community/crypto/CHANGELOG.rst29
-rw-r--r--ansible_collections/community/crypto/FILES.json139
-rw-r--r--ansible_collections/community/crypto/MANIFEST.json4
-rw-r--r--ansible_collections/community/crypto/README.md3
-rw-r--r--ansible_collections/community/crypto/changelogs/changelog.yaml27
-rw-r--r--ansible_collections/community/crypto/docs/docsite/config.yml7
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/acme/backend_cryptography.py45
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/acme/backend_openssl_cli.py35
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/acme/backends.py17
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_crl.py45
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_support.py27
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate.py6
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_entrust.py8
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_info.py11
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_ownca.py12
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_selfsigned.py12
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/pem.py29
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/crypto/support.py29
-rw-r--r--ansible_collections/community/crypto/plugins/module_utils/openssh/certificate.py26
-rw-r--r--ansible_collections/community/crypto/plugins/modules/acme_certificate.py2
-rw-r--r--ansible_collections/community/crypto/plugins/modules/acme_challenge_cert_helper.py37
-rw-r--r--ansible_collections/community/crypto/plugins/modules/get_certificate.py14
-rw-r--r--ansible_collections/community/crypto/plugins/modules/x509_certificate_convert.py280
-rw-r--r--ansible_collections/community/crypto/plugins/modules/x509_certificate_info.py6
-rw-r--r--ansible_collections/community/crypto/plugins/modules/x509_crl.py31
-rw-r--r--ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/aliases7
-rw-r--r--ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/meta/main.yml9
-rw-r--r--ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/impl.yml212
-rw-r--r--ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/main.yml136
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.10.txt1
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.11.txt1
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.12.txt1
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.13.txt1
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.14.txt1
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt2
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt.license3
-rw-r--r--ansible_collections/community/crypto/tests/sanity/ignore-2.9.txt1
-rw-r--r--ansible_collections/community/dns/.github/workflows/ansible-test.yml8
-rw-r--r--ansible_collections/community/dns/.github/workflows/docs-pr.yml1
-rw-r--r--ansible_collections/community/dns/.github/workflows/docs-push.yml1
-rw-r--r--ansible_collections/community/dns/CHANGELOG.md362
-rw-r--r--ansible_collections/community/dns/CHANGELOG.rst23
-rw-r--r--ansible_collections/community/dns/FILES.json103
-rw-r--r--ansible_collections/community/dns/MANIFEST.json4
-rw-r--r--ansible_collections/community/dns/README.md4
-rw-r--r--ansible_collections/community/dns/changelogs/changelog.yaml20
-rw-r--r--ansible_collections/community/dns/docs/docsite/config.yml7
-rw-r--r--ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst5
-rw-r--r--ansible_collections/community/dns/plugins/filter/quote_txt.yml46
-rw-r--r--ansible_collections/community/dns/plugins/filter/txt.py47
-rw-r--r--ansible_collections/community/dns/plugins/filter/unquote_txt.yml42
-rw-r--r--ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py3
-rw-r--r--ansible_collections/community/dns/plugins/plugin_utils/unsafe.py41
-rw-r--r--ansible_collections/community/dns/plugins/public_suffix_list.dat211
-rw-r--r--ansible_collections/community/dns/tests/integration/targets/filter_txt/aliases6
-rw-r--r--ansible_collections/community/dns/tests/integration/targets/filter_txt/tasks/main.yml49
-rw-r--r--ansible_collections/community/dns/tests/sanity/ignore-2.18.txt1
-rw-r--r--ansible_collections/community/dns/tests/sanity/ignore-2.18.txt.license3
-rw-r--r--ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py72
-rw-r--r--ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py76
-rw-r--r--ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt2
-rw-r--r--ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml100
-rw-r--r--ansible_collections/community/docker/.github/workflows/ansible-test.yml15
-rw-r--r--ansible_collections/community/docker/CHANGELOG.md491
-rw-r--r--ansible_collections/community/docker/CHANGELOG.rst25
-rw-r--r--ansible_collections/community/docker/FILES.json66
-rw-r--r--ansible_collections/community/docker/MANIFEST.json4
-rw-r--r--ansible_collections/community/docker/README.md2
-rw-r--r--ansible_collections/community/docker/changelogs/changelog.yaml40
-rw-r--r--ansible_collections/community/docker/docs/docsite/config.yml3
-rw-r--r--ansible_collections/community/docker/meta/ee-requirements.txt1
-rw-r--r--ansible_collections/community/docker/plugins/doc_fragments/compose_v2.py25
-rw-r--r--ansible_collections/community/docker/plugins/inventory/docker_containers.py2
-rw-r--r--ansible_collections/community/docker/plugins/inventory/docker_machine.py2
-rw-r--r--ansible_collections/community/docker/plugins/inventory/docker_swarm.py2
-rw-r--r--ansible_collections/community/docker/plugins/module_utils/_api/api/daemon.py62
-rw-r--r--ansible_collections/community/docker/plugins/module_utils/_api/utils/utils.py7
-rw-r--r--ansible_collections/community/docker/plugins/module_utils/compose_v2.py86
-rw-r--r--ansible_collections/community/docker/plugins/modules/docker_compose_v2.py16
-rw-r--r--ansible_collections/community/docker/plugins/modules/docker_compose_v2_pull.py12
-rw-r--r--ansible_collections/community/docker/plugins/plugin_utils/unsafe.py41
-rw-r--r--ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml264
-rw-r--r--ansible_collections/community/docker/tests/sanity/ignore-2.17.txt3
-rw-r--r--ansible_collections/community/docker/tests/sanity/ignore-2.18.txt4
-rw-r--r--ansible_collections/community/docker/tests/sanity/ignore-2.18.txt.license3
-rw-r--r--ansible_collections/community/docker/tests/unit/plugins/module_utils/_api/api/test_client.py51
-rw-r--r--ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml131
-rw-r--r--ansible_collections/community/general/.github/BOTMETA.yml7
-rw-r--r--ansible_collections/community/general/.github/workflows/ansible-test.yml21
-rw-r--r--ansible_collections/community/general/CHANGELOG.md164
-rw-r--r--ansible_collections/community/general/CHANGELOG.rst54
-rw-r--r--ansible_collections/community/general/FILES.json269
-rw-r--r--ansible_collections/community/general/MANIFEST.json4
-rw-r--r--ansible_collections/community/general/README.md2
-rw-r--r--ansible_collections/community/general/changelogs/changelog.yaml112
-rw-r--r--ansible_collections/community/general/docs/docsite/config.yml7
-rw-r--r--ansible_collections/community/general/meta/runtime.yml40
-rw-r--r--ansible_collections/community/general/plugins/callback/hipchat.py4
-rw-r--r--ansible_collections/community/general/plugins/callback/loganalytics.py13
-rw-r--r--ansible_collections/community/general/plugins/callback/logstash.py9
-rw-r--r--ansible_collections/community/general/plugins/callback/splunk.py13
-rw-r--r--ansible_collections/community/general/plugins/callback/sumologic.py14
-rw-r--r--ansible_collections/community/general/plugins/filter/from_ini.py2
-rw-r--r--ansible_collections/community/general/plugins/filter/to_ini.py2
-rw-r--r--ansible_collections/community/general/plugins/inventory/cobbler.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/gitlab_runners.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/icinga2.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/linode.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/lxd.py2
-rw-r--r--ansible_collections/community/general/plugins/inventory/nmap.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/online.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/opennebula.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/proxmox.py2
-rw-r--r--ansible_collections/community/general/plugins/inventory/scaleway.py2
-rw-r--r--ansible_collections/community/general/plugins/inventory/stackpath_compute.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/virtualbox.py3
-rw-r--r--ansible_collections/community/general/plugins/inventory/xen_orchestra.py2
-rw-r--r--ansible_collections/community/general/plugins/lookup/bitwarden.py40
-rw-r--r--ansible_collections/community/general/plugins/lookup/bitwarden_secrets_manager.py21
-rw-r--r--ansible_collections/community/general/plugins/lookup/passwordstore.py31
-rw-r--r--ansible_collections/community/general/plugins/module_utils/datetime.py32
-rw-r--r--ansible_collections/community/general/plugins/module_utils/gitlab.py13
-rw-r--r--ansible_collections/community/general/plugins/module_utils/identity/keycloak/keycloak.py102
-rw-r--r--ansible_collections/community/general/plugins/module_utils/ipa.py2
-rw-r--r--ansible_collections/community/general/plugins/module_utils/puppet.py1
-rw-r--r--ansible_collections/community/general/plugins/module_utils/redfish_utils.py50
-rw-r--r--ansible_collections/community/general/plugins/module_utils/scaleway.py8
-rw-r--r--ansible_collections/community/general/plugins/modules/aix_filesystem.py2
-rw-r--r--ansible_collections/community/general/plugins/modules/apt_rpm.py33
-rw-r--r--ansible_collections/community/general/plugins/modules/cobbler_sync.py9
-rw-r--r--ansible_collections/community/general/plugins/modules/cobbler_system.py9
-rw-r--r--ansible_collections/community/general/plugins/modules/filesystem.py50
-rw-r--r--ansible_collections/community/general/plugins/modules/flatpak.py83
-rw-r--r--ansible_collections/community/general/plugins/modules/github_key.py10
-rw-r--r--ansible_collections/community/general/plugins/modules/gitlab_issue.py8
-rw-r--r--ansible_collections/community/general/plugins/modules/gitlab_label.py12
-rw-r--r--ansible_collections/community/general/plugins/modules/gitlab_milestone.py12
-rw-r--r--ansible_collections/community/general/plugins/modules/haproxy.py2
-rw-r--r--ansible_collections/community/general/plugins/modules/imc_rest.py13
-rw-r--r--ansible_collections/community/general/plugins/modules/ini_file.py133
-rw-r--r--ansible_collections/community/general/plugins/modules/java_cert.py37
-rw-r--r--ansible_collections/community/general/plugins/modules/keycloak_client.py16
-rw-r--r--ansible_collections/community/general/plugins/modules/keycloak_client_rolescope.py280
-rw-r--r--ansible_collections/community/general/plugins/modules/keycloak_clientscope.py9
-rw-r--r--ansible_collections/community/general/plugins/modules/keycloak_clienttemplate.py9
-rw-r--r--ansible_collections/community/general/plugins/modules/keycloak_realm.py29
-rw-r--r--ansible_collections/community/general/plugins/modules/lxd_container.py41
-rw-r--r--ansible_collections/community/general/plugins/modules/nmcli.py47
-rw-r--r--ansible_collections/community/general/plugins/modules/osx_defaults.py18
-rw-r--r--ansible_collections/community/general/plugins/modules/pagerduty.py10
-rw-r--r--ansible_collections/community/general/plugins/modules/pagerduty_change.py8
-rw-r--r--ansible_collections/community/general/plugins/modules/portage.py11
-rw-r--r--ansible_collections/community/general/plugins/modules/puppet.py10
-rw-r--r--ansible_collections/community/general/plugins/modules/redfish_command.py17
-rw-r--r--ansible_collections/community/general/plugins/modules/riak.py15
-rw-r--r--ansible_collections/community/general/plugins/modules/scaleway_compute.py5
-rw-r--r--ansible_collections/community/general/plugins/modules/scaleway_database_backup.py7
-rw-r--r--ansible_collections/community/general/plugins/modules/scaleway_lb.py5
-rw-r--r--ansible_collections/community/general/plugins/modules/ssh_config.py5
-rw-r--r--ansible_collections/community/general/plugins/modules/statusio_maintenance.py12
-rw-r--r--ansible_collections/community/general/plugins/modules/xml.py9
-rw-r--r--ansible_collections/community/general/plugins/plugin_utils/unsafe.py41
-rw-r--r--ansible_collections/community/general/tests/integration/targets/filesystem/defaults/main.yml1
-rw-r--r--ansible_collections/community/general/tests/integration/targets/filesystem/tasks/main.yml6
-rw-r--r--ansible_collections/community/general/tests/integration/targets/filesystem/tasks/setup.yml10
-rw-r--r--ansible_collections/community/general/tests/integration/targets/filter_from_ini/tasks/main.yml10
-rw-r--r--ansible_collections/community/general/tests/integration/targets/filter_to_ini/tasks/main.yml6
-rw-r--r--ansible_collections/community/general/tests/integration/targets/flatpak/tasks/check_mode.yml98
-rw-r--r--ansible_collections/community/general/tests/integration/targets/flatpak/tasks/test.yml159
-rw-r--r--ansible_collections/community/general/tests/integration/targets/ini_file/tasks/main.yml4
-rw-r--r--ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/08-section.yml341
-rw-r--r--ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/README.md20
-rw-r--r--ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/aliases5
-rw-r--r--ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/tasks/main.yml317
-rw-r--r--ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/vars/main.yml26
-rw-r--r--ansible_collections/community/general/tests/integration/targets/lookup_lmdb_kv/test.yml4
-rw-r--r--ansible_collections/community/general/tests/sanity/ignore-2.18.txt17
-rw-r--r--ansible_collections/community/general/tests/sanity/ignore-2.18.txt.license3
-rw-r--r--ansible_collections/community/general/tests/unit/plugins/callback/test_loganalytics.py14
-rw-r--r--ansible_collections/community/general/tests/unit/plugins/callback/test_splunk.py12
-rw-r--r--ansible_collections/community/general/tests/unit/plugins/lookup/test_bitwarden.py86
-rw-r--r--ansible_collections/community/hrobot/.github/workflows/ansible-test.yml2
-rw-r--r--ansible_collections/community/hrobot/.github/workflows/docs-pr.yml1
-rw-r--r--ansible_collections/community/hrobot/.github/workflows/docs-push.yml1
-rw-r--r--ansible_collections/community/hrobot/CHANGELOG.md116
-rw-r--r--ansible_collections/community/hrobot/CHANGELOG.rst13
-rw-r--r--ansible_collections/community/hrobot/FILES.json53
-rw-r--r--ansible_collections/community/hrobot/MANIFEST.json4
-rw-r--r--ansible_collections/community/hrobot/README.md2
-rw-r--r--ansible_collections/community/hrobot/changelogs/changelog.yaml10
-rw-r--r--ansible_collections/community/hrobot/docs/docsite/config.yml7
-rw-r--r--ansible_collections/community/hrobot/plugins/inventory/robot.py2
-rw-r--r--ansible_collections/community/hrobot/plugins/plugin_utils/unsafe.py41
-rw-r--r--ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt1
-rw-r--r--ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt.license3
-rw-r--r--ansible_collections/community/hrobot/tests/unit/plugins/inventory/test_robot.py20
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/.github/workflows/ansible-test.yml2
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-pr.yml92
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-push.yml51
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/.github/workflows/extra-tests.yml4
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/.github/workflows/import-galaxy.yml79
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/.github/workflows/reuse.yml9
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md34
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md.license3
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst7
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/FILES.json93
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/MANIFEST.json4
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/README.md26
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/changelogs/changelog.yaml6
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/changelogs/config.yaml3
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/docs/docsite/config.yml7
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/docs/docsite/extra-docs.yml9
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/docs/docsite/links.yml20
-rw-r--r--ansible_collections/community/library_inventory_filtering_v1/docs/docsite/rst/usage_guide.rst75
-rw-r--r--ansible_collections/community/mongodb/CHANGELOG.rst13
-rw-r--r--ansible_collections/community/mongodb/FILES.json8
-rw-r--r--ansible_collections/community/mongodb/MANIFEST.json4
-rw-r--r--ansible_collections/community/mongodb/README.md2
-rw-r--r--ansible_collections/community/mongodb/changelogs/changelog.yaml5
-rw-r--r--ansible_collections/community/mongodb/roles/mongodb_mongod/templates/mongod.conf.j22
-rw-r--r--ansible_collections/community/rabbitmq/.azure-pipelines/azure-pipelines.yml239
-rw-r--r--ansible_collections/community/rabbitmq/CHANGELOG.rst17
-rw-r--r--ansible_collections/community/rabbitmq/FILES.json65
-rw-r--r--ansible_collections/community/rabbitmq/MANIFEST.json4
-rw-r--r--ansible_collections/community/rabbitmq/changelogs/changelog.yaml24
-rw-r--r--ansible_collections/community/rabbitmq/plugins/lookup/rabbitmq.py3
-rw-r--r--ansible_collections/community/rabbitmq/plugins/module_utils/rabbitmq.py1
-rw-r--r--ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_parameter.py15
-rw-r--r--ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_publish.py8
-rw-r--r--ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py504
-rw-r--r--ansible_collections/community/rabbitmq/tests/integration/targets/lookup_rabbitmq/tasks/main.yml4
-rw-r--r--ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_publish/tasks/main.yml4
-rw-r--r--ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_queue/tasks/main.yml4
-rw-r--r--ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/main.yml2
-rw-r--r--ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/tests_api.yml131
-rw-r--r--ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/tasks/main.yml4
-rw-r--r--ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_vhost_limits/tasks/main.yml4
-rw-r--r--ansible_collections/community/rabbitmq/tests/sanity/ignore-2.10.txt2
-rw-r--r--ansible_collections/community/rabbitmq/tests/sanity/ignore-2.11.txt2
-rw-r--r--ansible_collections/community/rabbitmq/tests/sanity/ignore-2.15.txt2
-rw-r--r--ansible_collections/community/rabbitmq/tests/sanity/ignore-2.16.txt3
-rw-r--r--ansible_collections/community/rabbitmq/tests/sanity/ignore-2.17.txt3
-rw-r--r--ansible_collections/community/rabbitmq/tests/sanity/ignore-2.9.txt2
-rw-r--r--ansible_collections/community/rabbitmq/tests/sanity/ignore.txt2
-rw-r--r--ansible_collections/community/rabbitmq/tests/unit/compat/mock.py6
-rw-r--r--ansible_collections/community/rabbitmq/tests/unit/mock/loader.py2
-rwxr-xr-xansible_collections/community/rabbitmq/tests/utils/shippable/shippable.sh1
-rw-r--r--ansible_collections/community/routeros/.github/workflows/ansible-test.yml6
-rw-r--r--ansible_collections/community/routeros/CHANGELOG.md193
-rw-r--r--ansible_collections/community/routeros/CHANGELOG.rst22
-rw-r--r--ansible_collections/community/routeros/FILES.json37
-rw-r--r--ansible_collections/community/routeros/MANIFEST.json4
-rw-r--r--ansible_collections/community/routeros/README.md2
-rw-r--r--ansible_collections/community/routeros/changelogs/changelog.yaml32
-rw-r--r--ansible_collections/community/routeros/docs/docsite/config.yml7
-rw-r--r--ansible_collections/community/routeros/plugins/module_utils/_api_data.py378
-rw-r--r--ansible_collections/community/routeros/plugins/modules/api_info.py13
-rw-r--r--ansible_collections/community/routeros/plugins/modules/api_modify.py13
-rw-r--r--ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt2
-rw-r--r--ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt.license3
-rw-r--r--ansible_collections/community/vmware/.github/workflows/ansible-test.yml4
-rw-r--r--ansible_collections/community/vmware/.github/workflows/extra-docs-linting.yml6
-rw-r--r--ansible_collections/community/vmware/CHANGELOG.rst23
-rw-r--r--ansible_collections/community/vmware/FILES.json289
-rw-r--r--ansible_collections/community/vmware/MANIFEST.json4
-rw-r--r--ansible_collections/community/vmware/changelogs/changelog.yaml28
-rw-r--r--ansible_collections/community/vmware/docs/docsite/extra-docs.yml3
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/scenario_guide.rst33
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/faq.rst26
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_clone_template.rst223
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_find_vm_folder.rst121
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_remove_vm.rst127
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_rename_vm.rst174
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_http.rst162
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_tools_connection.rst120
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_concepts.rst45
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_external_doc_links.rst10
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_getting_started.rst9
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_intro.rst54
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory.rst91
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_filters.rst216
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_hostnames.rst128
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_vm_attributes.rst1184
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_module_reference.rst9
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_requirements.rst73
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_scenarios.rst17
-rw-r--r--ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_troubleshooting.rst103
-rw-r--r--ansible_collections/community/vmware/meta/runtime.yml1
-rw-r--r--ansible_collections/community/vmware/plugins/doc_fragments/vmware.py1
-rw-r--r--ansible_collections/community/vmware/plugins/doc_fragments/vmware_rest_client.py3
-rw-r--r--ansible_collections/community/vmware/plugins/module_utils/vmware.py6
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vcenter_folder.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_all_snapshots_info.py204
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_category.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_category_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_cluster.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_cluster_dpm.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_cluster_drs.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_cluster_ha.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_cluster_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_cluster_vcls.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_cluster_vsan.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_ovf_template.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_template.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_content_library_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_content_library_manager.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster_manager.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_datastore_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_deploy_ovf.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_dvswitch.py49
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_export_ovf.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest.py37
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_boot_manager.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_controller.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_cross_vc_clone.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_customization_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_disk.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_disk_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_instant_clone.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_move.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_powerstate.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_register_operation.py4
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_screenshot.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_sendkey.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_snapshot.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_storage_policy.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_tools_info.py7
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_tpm.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu_info.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_guest_video.py2
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_host_datastore.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_host_dns_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown_exceptions.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_host_scanhba.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_local_user_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_object_rename.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_tag.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_tag_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_tag_manager.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_vc_infraprofile_info.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_vm_config_option.py1
-rw-r--r--ansible_collections/community/vmware/plugins/modules/vmware_vm_shell.py1
-rw-r--r--ansible_collections/community/vmware/scripts/inventory/vmware_inventory.py2
-rw-r--r--ansible_collections/community/vmware/tests/sanity/ignore-2.18.txt4
-rw-r--r--ansible_collections/community/vmware/tests/unit/mock/loader.py2
-rw-r--r--ansible_collections/containers/podman/CHANGELOG.rst52
-rw-r--r--ansible_collections/containers/podman/FILES.json1127
-rw-r--r--ansible_collections/containers/podman/MANIFEST.json4
-rw-r--r--ansible_collections/containers/podman/changelogs/changelog.yaml33
-rw-r--r--ansible_collections/containers/podman/docs/buildah_connection.html2
-rw-r--r--ansible_collections/containers/podman/docs/index.html2
-rw-r--r--ansible_collections/containers/podman/docs/objects.invbin6943 -> 7128 bytes
-rw-r--r--ansible_collections/containers/podman/docs/podman_connection.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_container_exec_module.html18
-rw-r--r--ansible_collections/containers/podman/docs/podman_container_info_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_container_module.html105
-rw-r--r--ansible_collections/containers/podman/docs/podman_containers_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_export_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_generate_systemd_module.html3
-rw-r--r--ansible_collections/containers/podman/docs/podman_image_info_module.html4
-rw-r--r--ansible_collections/containers/podman/docs/podman_image_module.html42
-rw-r--r--ansible_collections/containers/podman/docs/podman_import_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_load_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_login_info_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_login_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_logout_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_network_info_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_network_module.html36
-rw-r--r--ansible_collections/containers/podman/docs/podman_play_module.html51
-rw-r--r--ansible_collections/containers/podman/docs/podman_pod_info_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_pod_module.html50
-rw-r--r--ansible_collections/containers/podman/docs/podman_prune_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_runlabel_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_save_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_secret_info_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_secret_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_tag_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_unshare_become.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_volume_info_module.html2
-rw-r--r--ansible_collections/containers/podman/docs/podman_volume_module.html39
-rw-r--r--ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py30
-rw-r--r--ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py49
-rw-r--r--ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py636
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_container.py36
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_container_exec.py14
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py1
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_image.py45
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_image_info.py2
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_login.py5
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_network.py41
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_play.py100
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_pod.py33
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_pod_info.py7
-rw-r--r--ansible_collections/containers/podman/plugins/modules/podman_volume.py45
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml277
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml20
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml20
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml139
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml11
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml128
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml125
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml27
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml184
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml40
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml3
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml4
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml332
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml3
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml16
-rw-r--r--ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml128
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt1
-rw-r--r--ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt1
-rw-r--r--ansible_collections/dellemc/powerflex/.github/CODEOWNERS2
-rw-r--r--ansible_collections/dellemc/powerflex/CHANGELOG.rst15
-rw-r--r--ansible_collections/dellemc/powerflex/FILES.json81
-rw-r--r--ansible_collections/dellemc/powerflex/MANIFEST.json10
-rw-r--r--ansible_collections/dellemc/powerflex/README.md52
-rw-r--r--ansible_collections/dellemc/powerflex/changelogs/.plugin-cache.yaml12
-rw-r--r--ansible_collections/dellemc/powerflex/changelogs/changelog.yaml12
-rw-r--r--ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md8
-rw-r--r--ansible_collections/dellemc/powerflex/docs/INSTALLATION.md4
-rw-r--r--ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md4
-rw-r--r--ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md2
-rw-r--r--ansible_collections/dellemc/powerflex/docs/Release Notes.md18
-rw-r--r--ansible_collections/dellemc/powerflex/docs/SECURITY.md2
-rw-r--r--ansible_collections/dellemc/powerflex/docs/modules/info.rst172
-rw-r--r--ansible_collections/dellemc/powerflex/docs/modules/resource_group.rst281
-rw-r--r--ansible_collections/dellemc/powerflex/meta/runtime.yml35
-rw-r--r--ansible_collections/dellemc/powerflex/playbooks/modules/info.yml57
-rw-r--r--ansible_collections/dellemc/powerflex/playbooks/modules/resource_group.yml71
-rw-r--r--ansible_collections/dellemc/powerflex/plugins/doc_fragments/powerflex.py2
-rw-r--r--ansible_collections/dellemc/powerflex/plugins/module_utils/storage/dell/utils.py38
-rw-r--r--ansible_collections/dellemc/powerflex/plugins/modules/info.py233
-rw-r--r--ansible_collections/dellemc/powerflex/plugins/modules/resource_group.py631
-rw-r--r--ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.14.txt3
-rw-r--r--ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.15.txt3
-rw-r--r--ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.16.txt3
-rw-r--r--ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.17.txt1
-rw-r--r--ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_info_api.py3
-rw-r--r--ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_resource_group_api.py162
-rw-r--r--ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_info.py21
-rw-r--r--ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_resource_group.py228
-rw-r--r--ansible_collections/fortinet/fortios/CHANGELOG.rst28
-rw-r--r--ansible_collections/fortinet/fortios/FILES.json1384
-rw-r--r--ansible_collections/fortinet/fortios/MANIFEST.json4
-rw-r--r--ansible_collections/fortinet/fortios/README.md10
-rw-r--r--ansible_collections/fortinet/fortios/changelogs/.plugin-cache.yaml2
-rw-r--r--ansible_collections/fortinet/fortios/changelogs/changelog.yaml24
-rw-r--r--ansible_collections/fortinet/fortios/meta/runtime.yml2
-rw-r--r--ansible_collections/fortinet/fortios/plugins/module_utils/fortios/comparison.py2
-rw-r--r--ansible_collections/fortinet/fortios/plugins/module_utils/fortios/secret_field.py4
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_alertemail_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_exempt_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_heuristic.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_mms_checksum.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_notification.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_quarantine.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_application_custom.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_application_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_application_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_application_name.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_application_rule_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_rule.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_scheme.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_setting.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_automation_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_profile.py22
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_saas_application.py32
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_user_activity.py42
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_ca.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_crl.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_local.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_remote.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_domain_controller.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_profile.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_configuration_fact.py300
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_credential_store_domain_controller.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_diameter_filter_profile.py542
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_data_type.py30
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_dictionary.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_exact_data_match.py411
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_filepattern.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_doc_source.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_sensitivity.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_profile.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensitivity.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensor.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_settings.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_domain_filter.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_cpus.py22
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_global.py14
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_block_allow_list.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bwl.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bword.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_dnsbl.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_fortishield.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_iptrust.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_mheader.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_options.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_client.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems.py36
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems_override.py38
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_ems.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_registration_sync.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_registered_forticlient.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_export_config_playbook.py311
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_dataplan.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_extender_info.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_by_mcc_mnc.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_list.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_modem_status.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_sys_info.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_dataplan.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_file_filter_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_ssh_client_cert.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_virtual_host.py73
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl6.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address.py35
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6_template.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp.py19
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_auth_portal.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_carrier_endpoint_bwl.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_central_snat_map.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_city.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_consolidated_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_country.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_decrypted_traffic_mirror.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dnstranslation.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy.py203
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy6.py203
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_global.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_gtp.py1038
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_identity_based_route.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy.py16
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy6.py16
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_addition.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_append.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_botnet.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom_group.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_definition.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_extension.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_group.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_reason.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_vendor.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_name.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_owner.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_reputation.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_sld.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ip_translation.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_table.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_iprope_list.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipv6_eh_filter.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ldb_monitor.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy.py67
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy6.py67
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_mms_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy.py57
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy6.py57
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_network_service_dynamic.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_pfcp.py33
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy.py158
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy46.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy64.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_group.py18
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_protocol_options.py29
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proute.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_address.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_addrgrp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_policy.py76
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_region.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_onetime.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_recurring.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_security_policy.py78
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_category.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_custom.py40
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_group.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_per_ip_shaper.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_traffic_shaper.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_policy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_sniffer.py218
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_host_key.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_ca.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_key.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_server.py64
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_ssh_profile.py39
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_traffic_class.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ttl_policy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vendor_mac.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip.py134
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip46.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip6.py183
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip64.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp46.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp64.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_custom.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_group.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ftp_proxy_explicit.py63
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn_shaper.py27
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apngrp.py19
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_allow_list.py39
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_white_list.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v0v1.py93
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v2.py115
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_rat_timeout_profile.py33
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_tunnel_limit.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_nic.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_dce.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_session_stats.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_sse_stats.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_profile.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_custom.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_decoder.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_global.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_sensor.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_settings.py21
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_view_map.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_custom_field.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_filter.py32
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_setting.py14
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_eventfilter.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_filter.py27
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_setting.py18
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_setting.py16
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_filter.py27
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_setting.py18
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_setting.py16
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_filter.py27
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_filter.py27
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_setting.py18
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_setting.py16
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_gui_display.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_global_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_setting.py23
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_filter.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_filter.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_filter.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_threat_weight.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_filter.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor.py6
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor_fact.py60
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_np6_ipsec_engine.py20
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_npu_hpe.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_service_chain.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_setting.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_pfcp_message_filter.py47
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_report_chart.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_report_dataset.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_report_layout.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_report_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_report_style.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_report_theme.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_aspath_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_auth_path.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd6.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bgp.py711
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_community_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_extcommunity_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_isis.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_key_chain.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast_flow.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf6.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_rip.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ripng.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_route_map.py24
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_sctp_filter_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bwl.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bword.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_dnsbl.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_fortishield.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_iptrust.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_mheader.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_options.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_ssh_filter_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_802_1x_settings.py109
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_ingress.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_custom.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_default.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_custom_command.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_dynamic_port_policy.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_flow_tracking.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_fortilink_settings.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_global.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_igmp_snooping.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_template.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_vlans.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_profile.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_settings.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_location.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_sync_settings.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_managed_switch.py234
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_device.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_network_monitor_settings.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_poe.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_port_policy.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_interface_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_dot1p_map.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_ip_dscp_map.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_qos_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_queue_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_quarantine.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_remote_log.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_802_1x.py14
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_captive_portal.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_local_access.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_sflow.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_community.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_sysinfo.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_trap_threshold.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_user.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_instance.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_interface_tag.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_log.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_system.py16
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_sniffer.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_virtual_port_pool.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan_policy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_3g_modem_custom.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_accprofile.py99
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_acme.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_admin.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_interrupt.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_packet_redistribution.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alarm.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alias.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_api_user.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_arp_table.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_install.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_script.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_action.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_destination.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_stitch.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_trigger.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_push_update.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_schedule.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_tunneling.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_central_management.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_cluster_sync.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_console.py31
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_csf.py14
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_custom_language.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ddns.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dedicated_mgmt.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_device_upgrade.py47
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp6_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp_server.py187
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns64.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_database.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dscp_based_priority.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_email_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_evpn.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_external_resource.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fabric_vpn.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_federated_upgrade.py36
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fips_cc.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fm.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiai.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiguard.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortimanager.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortindr.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortisandbox.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fsso_polling.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ftm_push.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geneve.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_country.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_override.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gi_gk.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_global.py437
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gre_tunnel.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha.py74
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha_monitor.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ike.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_interface.py387
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipam.py29
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipip_tunnel.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns6.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipsec_aggregate.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_neighbor_cache.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_tunnel.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_isf_queue_profile.py48
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_link_monitor.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lldp_network_policy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lte_modem.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mac_address_table.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_management_tunnel.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mem_mgr.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mobile_tunnel.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_modem.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nat64.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nd_proxy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_netflow.py88
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_network_visibility.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_np6.py179
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu.py6043
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu_vlink.py352
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ntp.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_object_tagging.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy_guest_admin.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pcp_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_performance_top.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_physical_switch.py19
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pppoe_interface.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_probe_response.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_proxy_arp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ptp.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_admin.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_alertmail.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_auth.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_automation.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_device_detection_portal.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ec.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_fortiguard_wf.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ftp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_group.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_http.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_icap.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_image.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mail.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm1.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm3.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm4.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm7.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mms.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nac_quar.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nntp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_spam.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_sslvpn.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_traffic_quota.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_utm.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_webproxy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_resource_limits.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_saml.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_connector.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_proxy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdwan.py92
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_helper.py33
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_ttl.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_settings.py59
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sflow.py87
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sit_tunnel.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_smc_ntp.py36
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sms_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_community.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_mib_view.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_sysinfo.py26
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_user.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_schedule.py46
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_setting.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_admin.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_forticloud_admin.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_fortigate_cloud_admin.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_standalone_cluster.py29
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_storage.py22
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_stp.py19
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_switch_interface.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_tos_based_priority.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_dns.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_exception.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_link.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_netflow.py88
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_property.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_radius_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_sflow.py89
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_switch.py28
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wan_link.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wire_pair.py37
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vne_tunnel.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vxlan.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_wccp.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_system_zone.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_adgrp.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_certificate.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_access_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_category.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_domain_controller.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_exchange.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_external_identity_provider.py462
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fortitoken.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso_polling.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_group.py21
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_krb_keytab.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_ldap.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_local.py20
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_nac_policy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_password_policy.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peer.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peergrp.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_pop3.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_quarantine.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_radius.py21
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_saml.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_security_exempt_list.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_setting.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_user_tacacsplus.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_keyword.py438
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_profile.py173
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_channel_filter.py33
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_key.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_virtual_patch_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_voip_profile.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ca.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_crl.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_local.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ocsp_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_remote.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_setting.py16
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ike_gateway.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_concentrator.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_fec.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_forticlient.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey_interface.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1.py205
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1_interface.py163
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2_interface.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_kmip_server.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_l2tp.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ocvpn.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_pptp.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_qkd.py403
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_client.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_host_check_software.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_portal.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_realm.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_bookmark.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_group_bookmark.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_main_class.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_profile.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_signature.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_sub_class.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_auth_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_cache_service.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_content_delivery_network_rule.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_peer.py7
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_remote_storage.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_settings.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_webcache.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_debug_url.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_explicit.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_fast_fallback.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server.py25
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_global.py51
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_profile.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_url_match.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_wisp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content_header.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_fortiguard.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_cat.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_rating.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_cache_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting6.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_override.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_profile.py59
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_search_engine.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_status.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_urlfilter.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_access_control_list.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_address.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_addrgrp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ap_status.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_apcfg_profile.py13
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_arrp_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ble_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_bonjour_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_client_info.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_global.py33
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_3gpp_cellular.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_ip_address_type.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_nai_realm.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_network_auth_type.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_roaming_consortium.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_name.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_url.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_advice_of_charge.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_conn_capability.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_operator_name.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider_nai.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_terms_and_conditions.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_wan_metric.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_hs_profile.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_icon.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_qos_map.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_inter_controller.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_log.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_mpsk_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_nac_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_qos_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_region.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_rf_analysis.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_setting.py23
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_snmp.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_spectral_info.py17
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ssid_policy.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_status.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_syslog_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_timers.py41
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_utm_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap.py191
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_group.py9
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_status.py15
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wag_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wids_profile.py11
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp.py50
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_group.py19
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_profile.py306
-rw-r--r--ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_status.py15
-rw-r--r--ansible_collections/infinidat/infinibox/CHANGELOG.rst49
-rw-r--r--ansible_collections/infinidat/infinibox/FILES.json132
-rw-r--r--ansible_collections/infinidat/infinibox/MANIFEST.json8
-rw-r--r--ansible_collections/infinidat/infinibox/README.md12
-rw-r--r--ansible_collections/infinidat/infinibox/ibox_vars/iboxCICD.yaml166
-rw-r--r--ansible_collections/infinidat/infinibox/ibox_vars/iboxNNNN_example.yaml59
-rw-r--r--ansible_collections/infinidat/infinibox/ibox_vars/vibox.yaml283
-rw-r--r--ansible_collections/infinidat/infinibox/playbooks/configure_array.yml134
-rw-r--r--ansible_collections/infinidat/infinibox/plugins/modules/infini_infinimetrics.py358
-rw-r--r--ansible_collections/infinidat/infinibox/plugins/modules/infini_notification_rule.py41
-rw-r--r--ansible_collections/infinidat/infinibox/plugins/modules/infini_pool.py68
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_absent.json14
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_present.json17
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_1521.json9
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_vibox.json9
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present.json4
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_1521.json13
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_vibox.json13
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_absent.json9
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_present.json15
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_stat.json9
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_1521.json15
-rw-r--r--ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_vibox.json15
-rw-r--r--ansible_collections/netapp/ontap/CHANGELOG.rst18
-rw-r--r--ansible_collections/netapp/ontap/FILES.json151
-rw-r--r--ansible_collections/netapp/ontap/MANIFEST.json4
-rw-r--r--ansible_collections/netapp/ontap/README.md14
-rw-r--r--ansible_collections/netapp/ontap/changelogs/.DS_Storebin6148 -> 0 bytes
-rw-r--r--ansible_collections/netapp/ontap/changelogs/.plugin-cache.yaml391
-rw-r--r--ansible_collections/netapp/ontap/changelogs/changelog.yaml23
-rw-r--r--ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6356.yaml2
-rw-r--r--ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6691.yaml2
-rw-r--r--ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6715.yaml2
-rw-r--r--ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6721.yaml2
-rw-r--r--ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6747.yaml2
-rw-r--r--ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6807.yaml2
-rw-r--r--ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6825.yaml2
-rw-r--r--ansible_collections/netapp/ontap/plugins/module_utils/netapp.py2
-rw-r--r--ansible_collections/netapp/ontap/plugins/modules/na_ontap_cifs.py20
-rw-r--r--ansible_collections/netapp/ontap/plugins/modules/na_ontap_dns.py4
-rw-r--r--ansible_collections/netapp/ontap/plugins/modules/na_ontap_fpolicy_policy.py5
-rw-r--r--ansible_collections/netapp/ontap/plugins/modules/na_ontap_net_ifgrp.py2
-rw-r--r--ansible_collections/netapp/ontap/plugins/modules/na_ontap_quotas.py22
-rw-r--r--ansible_collections/netapp/ontap/plugins/modules/na_ontap_security_config.py12
-rw-r--r--ansible_collections/netapp/ontap/plugins/modules/na_ontap_vserver_audit.py113
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/.gitignore2
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/CACHEDIR.TAG4
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/README.md8
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/lastfailed3
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/nodeids6
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/stepwise1
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_cifs.py26
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_quotas.py55
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_security_config.py14
-rw-r--r--ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vserver_audit.py91
-rw-r--r--ansible_collections/purestorage/flashblade/CHANGELOG.rst16
-rw-r--r--ansible_collections/purestorage/flashblade/FILES.json44
-rw-r--r--ansible_collections/purestorage/flashblade/MANIFEST.json4
-rw-r--r--ansible_collections/purestorage/flashblade/changelogs/.plugin-cache.yaml2
-rw-r--r--ansible_collections/purestorage/flashblade/changelogs/changelog.yaml18
-rw-r--r--ansible_collections/purestorage/flashblade/changelogs/fragments/270_add_go.yaml2
-rw-r--r--ansible_collections/purestorage/flashblade/changelogs/fragments/271_add_worm.yaml2
-rw-r--r--ansible_collections/purestorage/flashblade/changelogs/fragments/273_add_nap.yaml3
-rw-r--r--ansible_collections/purestorage/flashblade/changelogs/fragments/274_fan_in.yaml2
-rw-r--r--ansible_collections/purestorage/flashblade/plugins/modules/purefb_bucket.py108
-rw-r--r--ansible_collections/purestorage/flashblade/plugins/modules/purefb_connect.py10
-rw-r--r--ansible_collections/purestorage/flashblade/plugins/modules/purefb_fs.py48
-rw-r--r--ansible_collections/purestorage/flashblade/plugins/modules/purefb_info.py5
-rw-r--r--ansible_collections/purestorage/flashblade/plugins/modules/purefb_policy.py391
-rwxr-xr-xbuild-ansible.sh4
-rw-r--r--porting_guide_9.rst37
-rw-r--r--setup.cfg10
-rw-r--r--tags.yaml96
2967 files changed, 132472 insertions, 31415 deletions
diff --git a/CHANGELOG-v9.md b/CHANGELOG-v9.md
index 5168c5627..00795de78 100644
--- a/CHANGELOG-v9.md
+++ b/CHANGELOG-v9.md
@@ -2,136 +2,789 @@
This changelog describes changes since Ansible 8\.0\.0\.
-- <a href="#v9-4-0">v9\.4\.0</a>
+- <a href="#v9-5-1">v9\.5\.1</a>
- <a href="#release-summary">Release Summary</a>
- <a href="#ansible-core">Ansible\-core</a>
- <a href="#changed-collections">Changed Collections</a>
+ - <a href="#major-changes">Major Changes</a>
- <a href="#minor-changes">Minor Changes</a>
- <a href="#deprecated-features">Deprecated Features</a>
- - <a href="#security-fixes">Security Fixes</a>
- <a href="#bugfixes">Bugfixes</a>
- <a href="#new-plugins">New Plugins</a>
- <a href="#new-modules">New Modules</a>
- <a href="#unchanged-collections">Unchanged Collections</a>
-- <a href="#v9-3-0">v9\.3\.0</a>
+- <a href="#v9-4-0">v9\.4\.0</a>
- <a href="#release-summary-1">Release Summary</a>
- - <a href="#ansible-core-3">Ansible\-core</a>
+ - <a href="#ansible-core-2">Ansible\-core</a>
- <a href="#changed-collections-1">Changed Collections</a>
- - <a href="#major-changes">Major Changes</a>
- <a href="#minor-changes-1">Minor Changes</a>
- <a href="#deprecated-features-1">Deprecated Features</a>
+ - <a href="#security-fixes">Security Fixes</a>
- <a href="#bugfixes-1">Bugfixes</a>
- <a href="#new-plugins-1">New Plugins</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#unchanged-collections-1">Unchanged Collections</a>
-- <a href="#v9-2-0">v9\.2\.0</a>
+- <a href="#v9-3-0">v9\.3\.0</a>
- <a href="#release-summary-2">Release Summary</a>
- - <a href="#added-collections">Added Collections</a>
- <a href="#ansible-core-5">Ansible\-core</a>
- <a href="#changed-collections-2">Changed Collections</a>
- <a href="#major-changes-1">Major Changes</a>
- <a href="#minor-changes-2">Minor Changes</a>
- <a href="#deprecated-features-2">Deprecated Features</a>
- - <a href="#security-fixes-1">Security Fixes</a>
- <a href="#bugfixes-2">Bugfixes</a>
- - <a href="#known-issues">Known Issues</a>
- <a href="#new-plugins-2">New Plugins</a>
- <a href="#new-modules-2">New Modules</a>
- <a href="#unchanged-collections-2">Unchanged Collections</a>
-- <a href="#v9-1-0">v9\.1\.0</a>
+- <a href="#v9-2-0">v9\.2\.0</a>
- <a href="#release-summary-3">Release Summary</a>
- - <a href="#ansible-core-8">Ansible\-core</a>
+ - <a href="#added-collections">Added Collections</a>
+ - <a href="#ansible-core-7">Ansible\-core</a>
- <a href="#changed-collections-3">Changed Collections</a>
+ - <a href="#major-changes-2">Major Changes</a>
- <a href="#minor-changes-3">Minor Changes</a>
- - <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- - <a href="#security-fixes-2">Security Fixes</a>
+ - <a href="#deprecated-features-3">Deprecated Features</a>
+ - <a href="#security-fixes-1">Security Fixes</a>
- <a href="#bugfixes-3">Bugfixes</a>
- - <a href="#known-issues-1">Known Issues</a>
+ - <a href="#known-issues">Known Issues</a>
- <a href="#new-plugins-3">New Plugins</a>
- <a href="#new-modules-3">New Modules</a>
- <a href="#unchanged-collections-3">Unchanged Collections</a>
-- <a href="#v9-0-1">v9\.0\.1</a>
+- <a href="#v9-1-0">v9\.1\.0</a>
- <a href="#release-summary-4">Release Summary</a>
- - <a href="#ansible-core-12">Ansible\-core</a>
+ - <a href="#ansible-core-10">Ansible\-core</a>
+ - <a href="#changed-collections-4">Changed Collections</a>
+ - <a href="#minor-changes-4">Minor Changes</a>
+ - <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
+ - <a href="#security-fixes-2">Security Fixes</a>
- <a href="#bugfixes-4">Bugfixes</a>
+ - <a href="#known-issues-1">Known Issues</a>
+ - <a href="#new-plugins-4">New Plugins</a>
+ - <a href="#new-modules-4">New Modules</a>
- <a href="#unchanged-collections-4">Unchanged Collections</a>
-- <a href="#v9-0-0">v9\.0\.0</a>
+- <a href="#v9-0-1">v9\.0\.1</a>
- <a href="#release-summary-5">Release Summary</a>
+ - <a href="#ansible-core-14">Ansible\-core</a>
+ - <a href="#bugfixes-5">Bugfixes</a>
+ - <a href="#unchanged-collections-5">Unchanged Collections</a>
+- <a href="#v9-0-0">v9\.0\.0</a>
+ - <a href="#release-summary-6">Release Summary</a>
- <a href="#removed-collections">Removed Collections</a>
- <a href="#added-collections-1">Added Collections</a>
- - <a href="#ansible-core-13">Ansible\-core</a>
+ - <a href="#ansible-core-15">Ansible\-core</a>
- <a href="#included-collections">Included Collections</a>
- - <a href="#major-changes-2">Major Changes</a>
- - <a href="#minor-changes-4">Minor Changes</a>
+ - <a href="#major-changes-3">Major Changes</a>
+ - <a href="#minor-changes-5">Minor Changes</a>
- <a href="#breaking-changes--porting-guide-1">Breaking Changes / Porting Guide</a>
- - <a href="#deprecated-features-3">Deprecated Features</a>
+ - <a href="#deprecated-features-4">Deprecated Features</a>
- <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
- <a href="#security-fixes-3">Security Fixes</a>
- - <a href="#bugfixes-5">Bugfixes</a>
+ - <a href="#bugfixes-6">Bugfixes</a>
- <a href="#known-issues-2">Known Issues</a>
- - <a href="#new-plugins-4">New Plugins</a>
- - <a href="#new-modules-4">New Modules</a>
+ - <a href="#new-plugins-5">New Plugins</a>
+ - <a href="#new-modules-5">New Modules</a>
- <a href="#new-roles">New Roles</a>
- - <a href="#unchanged-collections-5">Unchanged Collections</a>
+ - <a href="#unchanged-collections-6">Unchanged Collections</a>
-<a id="v9-4-0"></a>
-## v9\.4\.0
+<a id="v9-5-1"></a>
+## v9\.5\.1
- <a href="#release-summary">Release Summary</a>
- <a href="#ansible-core">Ansible\-core</a>
- <a href="#changed-collections">Changed Collections</a>
+- <a href="#major-changes">Major Changes</a>
+ - <a href="#containers-podman">containers\.podman</a>
+ - <a href="#fortinet-fortios">fortinet\.fortios</a>
- <a href="#minor-changes">Minor Changes</a>
- - <a href="#ansible-core-1">Ansible\-core</a>
- <a href="#amazon-aws">amazon\.aws</a>
- - <a href="#ansible-windows">ansible\.windows</a>
+ - <a href="#cisco-aci">cisco\.aci</a>
- <a href="#cisco-dnac">cisco\.dnac</a>
- - <a href="#cisco-ise">cisco\.ise</a>
+ - <a href="#cisco-meraki">cisco\.meraki</a>
+ - <a href="#cisco-mso">cisco\.mso</a>
+ - <a href="#community-aws">community\.aws</a>
+ - <a href="#community-crypto">community\.crypto</a>
+ - <a href="#community-docker">community\.docker</a>
- <a href="#community-general">community\.general</a>
- - <a href="#community-hashi-vault">community\.hashi\_vault</a>
+ - <a href="#community-rabbitmq">community\.rabbitmq</a>
- <a href="#community-routeros">community\.routeros</a>
- - <a href="#community-windows">community\.windows</a>
+ - <a href="#community-vmware">community\.vmware</a>
+ - <a href="#containers-podman-1">containers\.podman</a>
- <a href="#dellemc-powerflex">dellemc\.powerflex</a>
- - <a href="#ibm-storage-virtualize">ibm\.storage\_virtualize</a>
- - <a href="#microsoft-ad">microsoft\.ad</a>
- - <a href="#purestorage-flasharray">purestorage\.flasharray</a>
+ - <a href="#netapp-ontap">netapp\.ontap</a>
- <a href="#purestorage-flashblade">purestorage\.flashblade</a>
- <a href="#deprecated-features">Deprecated Features</a>
+ - <a href="#community-crypto-1">community\.crypto</a>
+ - <a href="#community-general-1">community\.general</a>
+ - <a href="#community-vmware-1">community\.vmware</a>
+- <a href="#bugfixes">Bugfixes</a>
+ - <a href="#ansible-core-1">Ansible\-core</a>
- <a href="#amazon-aws-1">amazon\.aws</a>
-- <a href="#security-fixes">Security Fixes</a>
+ - <a href="#cisco-aci-1">cisco\.aci</a>
+ - <a href="#cisco-ise">cisco\.ise</a>
+ - <a href="#cisco-mso-1">cisco\.mso</a>
+ - <a href="#community-aws-1">community\.aws</a>
+ - <a href="#community-crypto-2">community\.crypto</a>
- <a href="#community-dns">community\.dns</a>
- - <a href="#community-docker">community\.docker</a>
- - <a href="#community-general-1">community\.general</a>
+ - <a href="#community-docker-1">community\.docker</a>
+ - <a href="#community-general-2">community\.general</a>
- <a href="#community-hrobot">community\.hrobot</a>
-- <a href="#bugfixes">Bugfixes</a>
- - <a href="#ansible-core-2">Ansible\-core</a>
+ - <a href="#community-vmware-2">community\.vmware</a>
+ - <a href="#containers-podman-2">containers\.podman</a>
+ - <a href="#fortinet-fortios-1">fortinet\.fortios</a>
+ - <a href="#netapp-ontap-1">netapp\.ontap</a>
+- <a href="#new-plugins">New Plugins</a>
+ - <a href="#filter">Filter</a>
+- <a href="#new-modules">New Modules</a>
+ - <a href="#community-aws-2">community\.aws</a>
+ - <a href="#community-crypto-3">community\.crypto</a>
+ - <a href="#community-general-3">community\.general</a>
+ - <a href="#dellemc-powerflex-1">dellemc\.powerflex</a>
+- <a href="#unchanged-collections">Unchanged Collections</a>
+
+<a id="release-summary"></a>
+### Release Summary
+
+Release Date\: 2024\-04\-24
+
+[Porting Guide](https\://docs\.ansible\.com/ansible/devel/porting\_guides\.html)
+
+Please note that this release replaces a mistakenly released 9\.5\.0 that included a breaking change\. The 9\.5\.0 release has been yanked from PyPI and is not part of the official release history\.
+
+<a id="ansible-core"></a>
+### Ansible\-core
+
+Ansible 9\.5\.1 contains ansible\-core version 2\.16\.6\.
+This is a newer version than version 2\.16\.5 contained in the previous Ansible release\.
+
+The changes are reported in the combined changelog below\.
+
+<a id="changed-collections"></a>
+### Changed Collections
+
+If not mentioned explicitly\, the changes are reported in the combined changelog below\.
+
+| Collection | Ansible 9.4.0 | Ansible 9.5.1 | Notes |
+| ---------------------------------------- | ------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------- |
+| amazon.aws | 7.4.0 | 7.5.0 | |
+| cisco.aci | 2.8.0 | 2.9.0 | |
+| cisco.dnac | 6.13.1 | 6.13.3 | |
+| cisco.intersight | 2.0.7 | 2.0.8 | Unfortunately, this collection does not provide changelog data in a format that can be processed by the changelog generator. |
+| cisco.ise | 2.8.0 | 2.8.1 | |
+| cisco.meraki | 2.17.2 | 2.18.0 | |
+| cisco.mso | 2.5.0 | 2.6.0 | |
+| community.aws | 7.1.0 | 7.2.0 | |
+| community.crypto | 2.18.0 | 2.19.0 | |
+| community.dns | 2.8.3 | 2.9.0 | |
+| community.docker | 3.8.1 | 3.9.0 | |
+| community.general | 8.5.0 | 8.6.0 | |
+| community.hrobot | 1.9.1 | 1.9.2 | |
+| community.library_inventory_filtering_v1 | 1.0.0 | 1.0.1 | |
+| community.mongodb | 1.7.2 | 1.7.3 | There are no changes recorded in the changelog. |
+| community.rabbitmq | 1.2.3 | 1.3.0 | |
+| community.routeros | 2.14.0 | 2.15.0 | |
+| community.vmware | 4.2.0 | 4.3.0 | |
+| containers.podman | 1.12.0 | 1.13.0 | |
+| dellemc.powerflex | 2.2.0 | 2.3.0 | |
+| fortinet.fortios | 2.3.5 | 2.3.6 | |
+| infinidat.infinibox | 1.4.3 | 1.4.5 | Unfortunately, this collection does not provide changelog data in a format that can be processed by the changelog generator. |
+| netapp.ontap | 22.10.0 | 22.11.0 | |
+| purestorage.flashblade | 1.16.0 | 1.17.0 | |
+
+<a id="major-changes"></a>
+### Major Changes
+
+<a id="containers-podman"></a>
+#### containers\.podman
+
+* Add quadlet support for Podman modules
+
+<a id="fortinet-fortios"></a>
+#### fortinet\.fortios
+
+* Add notes for backup modules in the documentation in both monitor and monitor\_fact modules\.
+* Supported new FOS versions 7\.4\.2 and 7\.4\.3\, and support data type mac\_address in the collection\.
+* Update the documentation for the supported versions from latest to a fix version number\.
+* Update the required ansible version to 2\.15\.
+
+<a id="minor-changes"></a>
+### Minor Changes
+
+<a id="amazon-aws"></a>
+#### amazon\.aws
+
+* iam\_user\_info \- Add <code>login\_profile</code> to return info that is get from a user\, to know if they can login from AWS console \([https\://github\.com/ansible\-collections/amazon\.aws/pull/2012](https\://github\.com/ansible\-collections/amazon\.aws/pull/2012)\)\.
+* module\_utils\.iam \- refactored normalization functions to use <code>boto3\_resource\_to\_ansible\_dict\(\)</code> and <code>boto3\_resource\_list\_to\_ansible\_dict\(\)</code> \([https\://github\.com/ansible\-collections/amazon\.aws/pull/2006](https\://github\.com/ansible\-collections/amazon\.aws/pull/2006)\)\.
+* module\_utils\.transformations \- add <code>boto3\_resource\_to\_ansible\_dict\(\)</code> and <code>boto3\_resource\_list\_to\_ansible\_dict\(\)</code> helpers \([https\://github\.com/ansible\-collections/amazon\.aws/pull/2006](https\://github\.com/ansible\-collections/amazon\.aws/pull/2006)\)\.
+
+<a id="cisco-aci"></a>
+#### cisco\.aci
+
+* Add Authentification option for EIGRP interface profile\.
+* Add L3out Floating SVI modules \(aci\_l3out\_floating\_svi\, aci\_l3out\_floating\_svi\_path\, aci\_l3out\_floating\_svi\_path\_secondary\_ip and aci\_l3out\_floating\_svi\_secondary\_ip\) \(\#478\)
+* Add No\-verification flag option to reduce the number of API calls\. If true\, a verifying GET will not be sent after a POST update to APIC
+* Add access spine interface selector and port block binding in aci\_access\_port\_block\_to\_access\_port
+* Add aci\_access\_spine\_interface\_selector module
+* Add aci\_action\_rule\_additional\_communities module
+* Add aci\_action\_rule\_set\_as\_path and aci\_action\_rule\_set\_as\_path\_asn modules
+* Add aci\_bgp\_peer\_prefix\_policy\, aci\_bgp\_route\_summarization\_policy and aci\_bgp\_address\_family\_context\_policy modules
+* Add aci\_fabric\_pod\, aci\_fabric\_pod\_external\_tep\, aci\_fabric\_pod\_profile\, aci\_fabric\_pod\_remote\_pool modules \(\#558\)
+* Add aci\_hsrp\_interface\_policy\, aci\_l3out\_hsrp\_group\, aci\_l3out\_hsrp\_interface\_profile and aci\_l3out\_hsrp\_secondary\_vip modules \(\#505\)
+* Add aci\_interface\_policy\_eigrp \(class\:eigrpIfPol\) module
+* Add aci\_interface\_policy\_pim module
+* Add aci\_interface\_policy\_storm\_control module
+* Add aci\_keychain\_policy and aci\_key\_policy modules
+* Add aci\_l3out\_bfd\_multihop\_interface\_profile\, aci\_l3out\_bfd\_interface\_profile\, aci\_interface\_policy\_bfd\_multihop\, aci\_interface\_policy\_bfd and aci\_bfd\_multihop\_node\_policy modules \(\#492\)
+* Add aci\_l3out\_dhcp\_relay\_label\, aci\_dhcp\_option\_policy and aci\_dhcp\_option modules
+* Add aci\_l3out\_eigrp\_interface\_profile module
+* Add aci\_listify filter plugin to flattens nested dictionaries
+* Add aci\_netflow\_exporter\_policy module
+* Add aci\_netflow\_monitor\_policy and aci\_netflow\_record\_policy modules
+* Add aci\_netflow\_monitor\_to\_exporter module
+* Add aci\_node\_block module
+* Add aci\_pim\_route\_map\_policy and aci\_pim\_route\_map\_entry modules
+* Add aci\_qos\_custom\_policy and aci\_qos\_dscp\_class modules
+* Add aci\_qos\_dot1p\_class module
+* Add action rules attributes to aci\_tenant\_action\_rule\_profile\.
+* Add auto to speed attribute options in aci\_interface\_policy\_link\_level module \(\#577\)
+* Add missing options to aci\_bd module
+* Add modules aci\_bd\_to\_netflow\_monitor\_policy and aci\_bd\_rogue\_exception\_mac \(\#600\)
+* Add modules for Fabric External Connection Policies and its childs
+* Add option to set delimiter to \_ in aci\_epg\_to\_domain module
+* Add qos\_custom\_policy\, pim\_interface\_policy and igmp\_interface\_policy as new child\_classes for aci\_l3out\_logical\_interface\_profile\.
+* Add support for annotation in aci\_rest module \(\#437\)
+* Add support for block statements in useg attributes with the aci\_epg\_useg\_attribute\_block\_statement module
+* Add support for configuration of access switch policy groups with aci\_access\_switch\_policy\_group module
+* Add support for configuration of certificate authorities in aci\_aaa\_certificate\_authority
+* Add support for configuration of fabric management access policies in aci\_fabric\_management\_access
+* Add support for configuration of vrf multicast with aci\_vrf\_multicast module
+* Add support for configuring Azure cloud subnets using the aci\_cloud\_subnet module
+* Add support for encap scope in aci\_l3out\_interface
+* Add support for https ssl cipher configuration in aci\_fabric\_management\_access\_https\_cipher
+* Add support for infra l3out nodes bgp\-evpn loopback\, mpls transport loopback and segment id in aci\_l3out\_logical\_node
+* Add support for infra sr mpls micro bfd in aci\_l3out\_interface
+* Add support for intra epg\, taboo\, and contract interface in aci\_epg\_to\_contract
+* Add support for key ring configuration in aci\_aaa\_key\_ring
+* Add support for mac and description in aci\_l3out\_interface
+* Add support for mpls custom qos policy for infra sr mpls l3outs node profiles in aci\_l3out\_logical\_node\_profile
+* Add support for security default settings configuration in aci\_aaa\_security\_default\_settings
+* Add support for simple statements in useg attributes with the aci\_epg\_useg\_attribute\_simple\_statement module
+* Add support for sr\-mpls bgpInfraPeerP and bgp\_password in aci\_l3out\_bgp\_peer module \(\#543\)
+* Add support for sr\-mpls in aci\_l3out module
+* Add support for sr\-mpls l3out to infra l3out in aci\_l3out\_to\_sr\_mpls\_infra\_l3out
+* Add support for subject labels for EPG\, EPG Contract\, ESG\, Contract Subject\, L2Out External EPG\, L3out External EPG\, and L3out External EPG Contract with the aci\_subject\_label module
+* Add support for taboo contract\, contract interface and intra\_epg contract in aci\_l3out\_extepg\_to\_contract
+* Add support for useg default block statement configuration for useg epg in aci\_epg
+* Modify child class node block conditions to be optional in aci\_switch\_leaf\_selector
+
+<a id="cisco-dnac"></a>
+#### cisco\.dnac
+
+* Added a method to validate IP addresses\.
+* Added the op\_modifies\=True when calling SDK APIs in the workflow manager modules\.
+* Adding support to importing a template using JSON file
+* Changes in discovery workflow manager modules relating to different states of the discovery job
+* Changes in inventory and swim workflow manager modules\.
+* Fixed a minor issue in the site workflow manager module\.
+* Updating galaxy\.yml ansible\.utils dependencies\.
+
+<a id="cisco-meraki"></a>
+#### cisco\.meraki
+
+* Ansible collection now support v1\.44\.1 of Dashboard Api\.
+* administered\_licensing\_subscription\_entitlements\_info \- new plugin\.
+* administered\_licensing\_subscription\_subscriptions\_bind \- new plugin\.
+* administered\_licensing\_subscription\_subscriptions\_claim \- new plugin\.
+* administered\_licensing\_subscription\_subscriptions\_claim\_key\_validate \- new plugin\.
+* administered\_licensing\_subscription\_subscriptions\_compliance\_statuses\_info \- new plugin\.
+* administered\_licensing\_subscription\_subscriptions\_info \- new plugin\.
+* devices\_appliance\_radio\_settings \- new plugin\.
+* devices\_appliance\_radio\_settings\_info \- new plugin\.
+* devices\_live\_tools\_arp\_table \- new plugin\.
+* devices\_live\_tools\_arp\_table\_info \- new plugin\.
+* devices\_live\_tools\_cable\_test \- new plugin\.
+* devices\_live\_tools\_cable\_test\_info \- new plugin\.
+* devices\_live\_tools\_throughput\_test \- new plugin\.
+* devices\_live\_tools\_throughput\_test\_info \- new plugin\.
+* devices\_live\_tools\_wake\_on\_lan \- new plugin\.
+* devices\_live\_tools\_wake\_on\_lan\_info \- new plugin\.
+* devices\_wireless\_alternate\_management\_interface\_ipv6 \- new plugin\.
+* networks\_appliance\_rf\_profiles \- new plugin\.
+* networks\_appliance\_rf\_profiles\_info \- new plugin\.
+* networks\_appliance\_traffic\_shaping\_vpn\_exclusions \- new plugin\.
+* networks\_sm\_devices\_install\_apps \- new plugin\.
+* networks\_sm\_devices\_reboot \- new plugin\.
+* networks\_sm\_devices\_shutdown \- new plugin\.
+* networks\_sm\_devices\_uninstall\_apps \- new plugin\.
+* networks\_vlan\_profiles \- new plugin\.
+* networks\_vlan\_profiles\_assignments\_by\_device\_info \- new plugin\.
+* networks\_vlan\_profiles\_assignments\_reassign \- new plugin\.
+* networks\_vlan\_profiles\_info \- new plugin\.
+* networks\_wireless\_ethernet\_ports\_profiles \- new plugin\.
+* networks\_wireless\_ethernet\_ports\_profiles\_assign \- new plugin\.
+* networks\_wireless\_ethernet\_ports\_profiles\_info \- new plugin\.
+* networks\_wireless\_ethernet\_ports\_profiles\_set\_default \- new plugin\.
+* organizations\_appliance\_traffic\_shaping\_vpn\_exclusions\_by\_network\_info \- new plugin\.
+* organizations\_appliance\_uplinks\_statuses\_overview\_info \- new plugin\.
+* organizations\_appliance\_uplinks\_usage\_by\_network\_info \- new plugin\.
+* organizations\_camera\_boundaries\_areas\_by\_device\_info \- new plugin\.
+* organizations\_camera\_boundaries\_lines\_by\_device\_info \- new plugin\.
+* organizations\_camera\_detections\_history\_by\_boundary\_by\_interval\_info \- new plugin\.
+* organizations\_camera\_permissions\_info \- new plugin\.
+* organizations\_camera\_roles \- new plugin\.
+* organizations\_camera\_roles\_info \- new plugin\.
+* organizations\_devices\_availabilities\_change\_history\_info \- new plugin\.
+* organizations\_devices\_boots\_history\_info \- new plugin\.
+* organizations\_sm\_admins\_roles \- new plugin\.
+* organizations\_sm\_admins\_roles\_info \- new plugin\.
+* organizations\_sm\_sentry\_policies\_assignments \- new plugin\.
+* organizations\_sm\_sentry\_policies\_assignments\_by\_network\_info \- new plugin\.
+* organizations\_summary\_top\_networks\_by\_status\_info \- new plugin\.
+* organizations\_webhooks\_callbacks\_statuses\_info \- new plugin\.
+* organizations\_wireless\_devices\_channel\_utilization\_by\_device\_info \- new plugin\.
+* organizations\_wireless\_devices\_channel\_utilization\_by\_network\_info \- new plugin\.
+* organizations\_wireless\_devices\_channel\_utilization\_history\_by\_device\_by\_interval\_info \- new plugin\.
+* organizations\_wireless\_devices\_channel\_utilization\_history\_by\_network\_by\_interval\_info \- new plugin\.
+* organizations\_wireless\_devices\_packet\_loss\_by\_client\_info \- new plugin\.
+* organizations\_wireless\_devices\_packet\_loss\_by\_device\_info \- new plugin\.
+* organizations\_wireless\_devices\_packet\_loss\_by\_network\_info \- new plugin\.
+
+<a id="cisco-mso"></a>
+#### cisco\.mso
+
+* Add Azure Cloud site support to mso\_schema\_site\_contract\_service\_graph
+* Add Azure Cloud site support to mso\_schema\_site\_service\_graph
+* Add functionality to resolve same name in remote and local user\.
+* Add l3out\_template and l3out\_schema arguments to mso\_schema\_site\_external\_epg \(\#394\)
+* Add mso\_schema\_site\_contract\_service\_graph module to manage site contract service graph
+* Add mso\_schema\_site\_contract\_service\_graph\_listener module to manage Azure site contract service graph listeners and update other modules
+* Add new parameter remote\_user to add multiple remote users associated with multiple login domains
+* Add support for replacing all existing contracts with new provided contracts in a single operation with one request and adding/removing multiple contracts in multiple operations with a single request in mso\_schema\_template\_anp\_epg\_contract module
+* Add support for replacing all existing static ports with new provided static ports in a single operation with one request and adding/removing multiple static ports in multiple operations with a single request in mso\_schema\_template\_anp\_epg\_staticport module
+* Add support for required attributes introduced in NDO 4\.2 for mso\_schema\_site\_anp\_epg\_domain
+* Support for creation of schemas without templates with the mso\_schema module
+
+<a id="community-aws"></a>
+#### community\.aws
+
+* glue\_job \- add support for 2 new instance types which are G\.4X and G\.8X \([https\://github\.com/ansible\-collections/community\.aws/pull/2048](https\://github\.com/ansible\-collections/community\.aws/pull/2048)\)\.
+* msk\_cluster \- Support for additional <code>m5</code> and <code>m7g</code> types of MSK clusters \([https\://github\.com/ansible\-collections/community\.aws/pull/1947](https\://github\.com/ansible\-collections/community\.aws/pull/1947)\)\.
+
+<a id="community-crypto"></a>
+#### community\.crypto
+
+* When using cryptography \>\= 42\.0\.0\, use offset\-aware <code>datetime\.datetime</code> objects \(with timezone UTC\) instead of offset\-naive UTC timestamps \([https\://github\.com/ansible\-collections/community\.crypto/issues/726](https\://github\.com/ansible\-collections/community\.crypto/issues/726)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/727](https\://github\.com/ansible\-collections/community\.crypto/pull/727)\)\.
+* openssh\_cert \- avoid UTC functions deprecated in Python 3\.12 when using Python 3 \([https\://github\.com/ansible\-collections/community\.crypto/pull/727](https\://github\.com/ansible\-collections/community\.crypto/pull/727)\)\.
+
+<a id="community-docker"></a>
+#### community\.docker
+
+* The EE requirements now include PyYAML\, since the <code>docker\_compose\_v2\*</code> modules depend on it when the <code>definition</code> option is used\. This should not have a noticable effect on generated EEs since ansible\-core itself depends on PyYAML as well\, and ansible\-builder explicitly ignores this dependency \([https\://github\.com/ansible\-collections/community\.docker/pull/832](https\://github\.com/ansible\-collections/community\.docker/pull/832)\)\.
+* docker\_compose\_v2\* \- the new option <code>check\_files\_existing</code> allows to disable the check for one of the files <code>compose\.yaml</code>\, <code>compose\.yml</code>\, <code>docker\-compose\.yaml</code>\, and <code>docker\-compose\.yml</code> in <code>project\_src</code> if <code>files</code> is not specified\. This is necessary if a non\-standard compose filename is specified through other means\, like the <code>COMPOSE\_FILE</code> environment variable \([https\://github\.com/ansible\-collections/community\.docker/issues/838](https\://github\.com/ansible\-collections/community\.docker/issues/838)\, [https\://github\.com/ansible\-collections/community\.docker/pull/839](https\://github\.com/ansible\-collections/community\.docker/pull/839)\)\.
+* docker\_compose\_v2\* modules \- allow to provide an inline definition of the compose content instead of having to provide a <code>project\_src</code> directory with the compose file written into it \([https\://github\.com/ansible\-collections/community\.docker/issues/829](https\://github\.com/ansible\-collections/community\.docker/issues/829)\, [https\://github\.com/ansible\-collections/community\.docker/pull/832](https\://github\.com/ansible\-collections/community\.docker/pull/832)\)\.
+* vendored Docker SDK for Python \- remove unused code that relies on functionality deprecated in Python 3\.12 \([https\://github\.com/ansible\-collections/community\.docker/pull/834](https\://github\.com/ansible\-collections/community\.docker/pull/834)\)\.
+
+<a id="community-general"></a>
+#### community\.general
+
+* Use offset\-aware <code>datetime\.datetime</code> objects \(with timezone UTC\) instead of offset\-naive UTC timestamps\, which are deprecated in Python 3\.12 \([https\://github\.com/ansible\-collections/community\.general/pull/8222](https\://github\.com/ansible\-collections/community\.general/pull/8222)\)\.
+* apt\_rpm \- add new states <code>latest</code> and <code>present\_not\_latest</code>\. The value <code>latest</code> is equivalent to the current behavior of <code>present</code>\, which will upgrade a package if a newer version exists\. <code>present\_not\_latest</code> does what most users would expect <code>present</code> to do\: it does not upgrade if the package is already installed\. The current behavior of <code>present</code> will be deprecated in a later version\, and eventually changed to that of <code>present\_not\_latest</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8217](https\://github\.com/ansible\-collections/community\.general/issues/8217)\, [https\://github\.com/ansible\-collections/community\.general/pull/8247](https\://github\.com/ansible\-collections/community\.general/pull/8247)\)\.
+* bitwarden lookup plugin \- add support to filter by organization ID \([https\://github\.com/ansible\-collections/community\.general/pull/8188](https\://github\.com/ansible\-collections/community\.general/pull/8188)\)\.
+* filesystem \- add bcachefs support \([https\://github\.com/ansible\-collections/community\.general/pull/8126](https\://github\.com/ansible\-collections/community\.general/pull/8126)\)\.
+* ini\_file \- add an optional parameter <code>section\_has\_values</code>\. If the target ini file contains more than one <code>section</code>\, use <code>section\_has\_values</code> to specify which one should be updated \([https\://github\.com/ansible\-collections/community\.general/pull/7505](https\://github\.com/ansible\-collections/community\.general/pull/7505)\)\.
+* java\_cert \- add <code>cert\_content</code> argument \([https\://github\.com/ansible\-collections/community\.general/pull/8153](https\://github\.com/ansible\-collections/community\.general/pull/8153)\)\.
+* keycloak\_client\, keycloak\_clientscope\, keycloak\_clienttemplate \- added <code>docker\-v2</code> protocol support\, enhancing alignment with Keycloak\'s protocol options \([https\://github\.com/ansible\-collections/community\.general/issues/8215](https\://github\.com/ansible\-collections/community\.general/issues/8215)\, [https\://github\.com/ansible\-collections/community\.general/pull/8216](https\://github\.com/ansible\-collections/community\.general/pull/8216)\)\.
+* nmcli \- adds OpenvSwitch support with new <code>type</code> values <code>ovs\-port</code>\, <code>ovs\-interface</code>\, and <code>ovs\-bridge</code>\, and new <code>slave\_type</code> value <code>ovs\-port</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8154](https\://github\.com/ansible\-collections/community\.general/pull/8154)\)\.
+* osx\_defaults \- add option <code>check\_types</code> to enable changing the type of existing defaults on the fly \([https\://github\.com/ansible\-collections/community\.general/pull/8173](https\://github\.com/ansible\-collections/community\.general/pull/8173)\)\.
+* passwordstore lookup \- add <code>missing\_subkey</code> parameter defining the behavior of the lookup when a passwordstore subkey is missing \([https\://github\.com/ansible\-collections/community\.general/pull/8166](https\://github\.com/ansible\-collections/community\.general/pull/8166)\)\.
+* portage \- adds the possibility to explicitely tell portage to write packages to world file \([https\://github\.com/ansible\-collections/community\.general/issues/6226](https\://github\.com/ansible\-collections/community\.general/issues/6226)\, [https\://github\.com/ansible\-collections/community\.general/pull/8236](https\://github\.com/ansible\-collections/community\.general/pull/8236)\)\.
+* redfish\_command \- add command <code>ResetToDefaults</code> to reset manager to default state \([https\://github\.com/ansible\-collections/community\.general/issues/8163](https\://github\.com/ansible\-collections/community\.general/issues/8163)\)\.
+* redfish\_info \- add boolean return value <code>MultipartHttpPush</code> to <code>GetFirmwareUpdateCapabilities</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8194](https\://github\.com/ansible\-collections/community\.general/issues/8194)\, [https\://github\.com/ansible\-collections/community\.general/pull/8195](https\://github\.com/ansible\-collections/community\.general/pull/8195)\)\.
+* ssh\_config \- allow <code>accept\-new</code> as valid value for <code>strict\_host\_key\_checking</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8257](https\://github\.com/ansible\-collections/community\.general/pull/8257)\)\.
+
+<a id="community-rabbitmq"></a>
+#### community\.rabbitmq
+
+* rabbitmq\_user \- add support to user manipulation through RabbitMQ API \([https\://github\.com/ansible\-collections/community\.rabbitmq/issues/76](https\://github\.com/ansible\-collections/community\.rabbitmq/issues/76)\)
+
+<a id="community-routeros"></a>
+#### community\.routeros
+
+* api\_info\, api\_modify \- Add RouterOS 7\.x support to <code>/mpls ldp</code> path \([https\://github\.com/ansible\-collections/community\.routeros/pull/271](https\://github\.com/ansible\-collections/community\.routeros/pull/271)\)\.
+* api\_info\, api\_modify \- add <code>/ip route rule</code> path for RouterOS 6\.x \([https\://github\.com/ansible\-collections/community\.routeros/pull/278](https\://github\.com/ansible\-collections/community\.routeros/pull/278)\)\.
+* api\_info\, api\_modify \- add <code>/routing filter</code> path for RouterOS 6\.x \([https\://github\.com/ansible\-collections/community\.routeros/pull/279](https\://github\.com/ansible\-collections/community\.routeros/pull/279)\)\.
+* api\_info\, api\_modify \- add default value for <code>from\-pool</code> field in <code>/ipv6 address</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/270](https\://github\.com/ansible\-collections/community\.routeros/pull/270)\)\.
+* api\_info\, api\_modify \- add missing path <code>/interface pppoe\-server server</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/273](https\://github\.com/ansible\-collections/community\.routeros/pull/273)\)\.
+* api\_info\, api\_modify \- add missing path <code>/ip dhcp\-relay</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/276](https\://github\.com/ansible\-collections/community\.routeros/pull/276)\)\.
+* api\_info\, api\_modify \- add missing path <code>/queue simple</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/269](https\://github\.com/ansible\-collections/community\.routeros/pull/269)\)\.
+* api\_info\, api\_modify \- add missing path <code>/queue type</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/274](https\://github\.com/ansible\-collections/community\.routeros/pull/274)\)\.
+* api\_info\, api\_modify \- add missing paths <code>/routing bgp aggregate</code>\, <code>/routing bgp network</code> and <code>/routing bgp peer</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/277](https\://github\.com/ansible\-collections/community\.routeros/pull/277)\)\.
+* api\_info\, api\_modify \- add support for paths <code>/mpls interface</code>\, <code>/mpls ldp accept\-filter</code>\, <code>/mpls ldp advertise\-filter</code> and <code>mpls ldp interface</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/272](https\://github\.com/ansible\-collections/community\.routeros/pull/272)\)\.
+
+<a id="community-vmware"></a>
+#### community\.vmware
+
+* Document that all parameters and VMware object names are case sensitive \([https\://github\.com/ansible\-collections/community\.vmware/issues/2019](https\://github\.com/ansible\-collections/community\.vmware/issues/2019)\)\.
+* Drop the outdated \(and actually unmaintained\) scenario guides \([https\://github\.com/ansible\-collections/community\.vmware/pull/2022](https\://github\.com/ansible\-collections/community\.vmware/pull/2022)\)\.
+* vmware\_dvswitch \- Add switchIpAddress/switch\_ip parameter for netflow config
+* vmware\_guest\_tools\_info \- Use <em class="title-reference">toolsVersionStatus2</em> instead of <em class="title-reference">toolsVersionStatus</em> \([https\://github\.com/ansible\-collections/community\.vmware/issues/2033](https\://github\.com/ansible\-collections/community\.vmware/issues/2033)\)\.
+
+<a id="containers-podman-1"></a>
+#### containers\.podman
+
+* CI \- Fix rootfs test in CI
+* CI \- add custom podman path to tasks
+* CI \- add parametrized executables to tests
+* podman\_container \- Add pasta as default network mode after v5
+* podman\_container\_exec \- Return data for podman exec module
+* podman\_generate\_systemd \- Fix broken example for podman\_generate\_systemd \(\#708\)
+* podman\_login \- Update podman\_login\.py
+* podman\_play \- Add support for kube yaml files with multi\-documents \(\#724\)
+* podman\_play \- Update the logic for deleting pods/containers in podman\_play
+* podman\_pod\_info \- handle return being list in Podman 5 \(\#713\)
+
+<a id="dellemc-powerflex"></a>
+#### dellemc\.powerflex
+
+* Added support for PowerFlex ansible modules and roles on Azure\.
+* Added support for resource group provisioning to validate\, deploy\, edit\, add nodes and delete a resource group\.
+* The Info module is enhanced to list the firmware repositories\.
+
+<a id="netapp-ontap"></a>
+#### netapp\.ontap
+
+* na\_ontap\_cifs \- new option <em class="title-reference">offline\_files</em> added in REST\, requires ONTAP 9\.10 or later\.
+* na\_ontap\_net\_ifgrp \- updated documentation for parameter <em class="title-reference">name</em>\.
+* na\_ontap\_vserver\_audit \- new options <em class="title-reference">schedule\.\*</em> added under <em class="title-reference">log\.rotation</em>\, requires ONTAP 9\.6 or later\.
+
+<a id="purestorage-flashblade"></a>
+#### purestorage\.flashblade
+
+* purefb\_bucket \- Add support for strict 17a\-4 WORM compliance\.
+* purefb\_connect \- Increase Fan\-In and Fan\-Out maximums
+* purefb\_fs \- Add <code>group\_ownership</code> parameter from Purity//FB 4\.4\.0\.
+* purefb\_info \- Show array network access policy from Purity//FB 4\.4\.0
+* purefb\_policy \- Add support for network access policies from Purity//FB 4\.4\.0
+
+<a id="deprecated-features"></a>
+### Deprecated Features
+
+<a id="community-crypto-1"></a>
+#### community\.crypto
+
+* acme\.backends module utils \- from community\.crypto on\, all implementations of <code>CryptoBackend</code> must override <code>get\_ordered\_csr\_identifiers\(\)</code>\. The current default implementation\, which simply sorts the result of <code>get\_csr\_identifiers\(\)</code>\, will then be removed \([https\://github\.com/ansible\-collections/community\.crypto/pull/725](https\://github\.com/ansible\-collections/community\.crypto/pull/725)\)\.
+
+<a id="community-general-1"></a>
+#### community\.general
+
+* hipchat callback plugin \- the hipchat service has been discontinued and the self\-hosted variant has been End of Life since 2020\. The callback plugin is therefore deprecated and will be removed from community\.general 10\.0\.0 if nobody provides compelling reasons to still keep it \([https\://github\.com/ansible\-collections/community\.general/issues/8184](https\://github\.com/ansible\-collections/community\.general/issues/8184)\, [https\://github\.com/ansible\-collections/community\.general/pull/8189](https\://github\.com/ansible\-collections/community\.general/pull/8189)\)\.
+
+<a id="community-vmware-1"></a>
+#### community\.vmware
+
+* vmware\_guest\_tools\_info \- <em class="title-reference">vm\_tools\_install\_status</em> will be removed from next major version \(5\.0\.0\) of the collection since the API call that provides this information has been deprecated by VMware\. Use <em class="title-reference">vm\_tools\_running\_status</em> / <em class="title-reference">vm\_tools\_version\_status</em> instead \([https\://github\.com/ansible\-collections/community\.vmware/issues/2033](https\://github\.com/ansible\-collections/community\.vmware/issues/2033)\)\.
+
+<a id="bugfixes"></a>
+### Bugfixes
+
+<a id="ansible-core-1"></a>
+#### Ansible\-core
+
+* Consolidated the list of internal static vars\, centralized them as constant and completed from some missing entries\.
+* Fix check for missing \_sub\_plugin attribute in older connection plugins \([https\://github\.com/ansible/ansible/pull/82954](https\://github\.com/ansible/ansible/pull/82954)\)
+* Fixes permission for cache json file from 600 to 644 \([https\://github\.com/ansible/ansible/issues/82683](https\://github\.com/ansible/ansible/issues/82683)\)\.
+* Slight optimization to hostvars \(instantiate template only once per host\, vs per call to var\)\.
+* allow\_duplicates \- fix evaluating if the current role allows duplicates instead of using the initial value from the duplicate\'s cached role\.
+* ansible\-config will now properly template defaults before dumping them\.
+* ansible\-test ansible\-doc sanity test \- do not remove underscores from plugin names in collections before calling <code>ansible\-doc</code> \([https\://github\.com/ansible/ansible/pull/82574](https\://github\.com/ansible/ansible/pull/82574)\)\.
+* async \- Fix bug that stopped running async task in <code>\-\-check</code> when <code>check\_mode\: False</code> was set as a task attribute \- [https\://github\.com/ansible/ansible/issues/82811](https\://github\.com/ansible/ansible/issues/82811)
+* blockinfile \- when <code>create\=true</code> is used with a filename without path\, the module crashed \([https\://github\.com/ansible/ansible/pull/81638](https\://github\.com/ansible/ansible/pull/81638)\)\.
+* dnf \- fix an issue when cached RPMs were left in the cache directory even when the keepcache setting was unset \([https\://github\.com/ansible/ansible/issues/81954](https\://github\.com/ansible/ansible/issues/81954)\)
+* dnf5 \- replace removed API calls
+* facts \- add a generic detection for VMware in product name\.
+* fetch \- add error message when using <code>dest</code> with a trailing slash that becomes a local directory \- [https\://github\.com/ansible/ansible/issues/82878](https\://github\.com/ansible/ansible/issues/82878)
+* find \- do not fail on Permission errors \([https\://github\.com/ansible/ansible/issues/82027](https\://github\.com/ansible/ansible/issues/82027)\)\.
+* unarchive modules now uses zipinfo options without relying on implementation defaults\, making it more compatible with all OS/distributions\.
+* winrm \- Do not raise another exception during cleanup when a task is timed out \- [https\://github\.com/ansible/ansible/issues/81095](https\://github\.com/ansible/ansible/issues/81095)
+
+<a id="amazon-aws-1"></a>
+#### amazon\.aws
+
+* cloudwatchlogs\_log\_group\_info \- Implement exponential backoff when making API calls to prevent throttling exceptions \([https\://github\.com/ansible\-collections/amazon\.aws/issues/2011](https\://github\.com/ansible\-collections/amazon\.aws/issues/2011)\)\.
+* plugin\_utils\.inventory \- Ensure templated options in lookup plugins are converted \([https\://github\.com/ansible\-collections/amazon\.aws/issues/1955](https\://github\.com/ansible\-collections/amazon\.aws/issues/1955)\)\.
+* s3\_object \- Fix the issue when copying an object with overriding metadata\. \([https\://github\.com/ansible\-collections/amazon\.aws/issues/1991](https\://github\.com/ansible\-collections/amazon\.aws/issues/1991)\)\.
+
+<a id="cisco-aci-1"></a>
+#### cisco\.aci
+
+* Fix auto logout issue in aci connection plugin to keep connection active between tasks
+* Fix idempotency for l3out configuration when l3protocol is used in aci\_l3out
+* Fix issues with new attributes in aci\_interface\_policy\_leaf\_policy\_group module by adding conditions to include attributes in the payload only when they are specified by the user \(\#578\)
+* Fix query in aci\_vmm\_controller
+
+<a id="cisco-ise"></a>
+#### cisco\.ise
+
+* ansible\.utils changes to <em class="title-reference">\"\>\=2\.0\.0\,\<5\.0\"</em> in galaxy\.yml dependencies\.
+
+<a id="cisco-mso-1"></a>
+#### cisco\.mso
+
+* Fix TypeError for iteration on NoneType in mso\_schema\_template
+* Fixed the useg\_subnet logic in mso\_schema\_template\_anp\_epg\_useg\_attribute
+
+<a id="community-aws-1"></a>
+#### community\.aws
+
+* ssm\(connection\) \- fix bucket region logic when region is <code>us\-east\-1</code> \([https\://github\.com/ansible\-collections/community\.aws/pull/1908](https\://github\.com/ansible\-collections/community\.aws/pull/1908)\)\.
+
+<a id="community-crypto-2"></a>
+#### community\.crypto
+
+* acme\_certificate \- respect the order of the CNAME and SAN identifiers that are passed on when creating an ACME order \([https\://github\.com/ansible\-collections/community\.crypto/issues/723](https\://github\.com/ansible\-collections/community\.crypto/issues/723)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/725](https\://github\.com/ansible\-collections/community\.crypto/pull/725)\)\.
+
+<a id="community-dns"></a>
+#### community\.dns
+
+* Update Public Suffix List\.
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \([https\://github\.com/ansible\-collections/community\.dns/pull/197](https\://github\.com/ansible\-collections/community\.dns/pull/197)\)\.
+
+<a id="community-docker-1"></a>
+#### community\.docker
+
+* docker\_compose\_v2\* \- allow <code>project\_src</code> to be a relative path\, by converting it to an absolute path before using it \([https\://github\.com/ansible\-collections/community\.docker/issues/827](https\://github\.com/ansible\-collections/community\.docker/issues/827)\, [https\://github\.com/ansible\-collections/community\.docker/pull/828](https\://github\.com/ansible\-collections/community\.docker/pull/828)\)\.
+* docker\_compose\_v2\* modules \- abort with a nice error message instead of crash when the Docker Compose CLI plugin version is <code>dev</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/825](https\://github\.com/ansible\-collections/community\.docker/issues/825)\, [https\://github\.com/ansible\-collections/community\.docker/pull/826](https\://github\.com/ansible\-collections/community\.docker/pull/826)\)\.
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \([https\://github\.com/ansible\-collections/community\.docker/pull/835](https\://github\.com/ansible\-collections/community\.docker/pull/835)\)\.
+
+<a id="community-general-2"></a>
+#### community\.general
+
+* aix\_filesystem \- fix <code>\_validate\_vg</code> not passing VG name to <code>lsvg\_cmd</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8151](https\://github\.com/ansible\-collections/community\.general/issues/8151)\)\.
+* apt\_rpm \- when checking whether packages were installed after running <code>apt\-get \-y install \<packages\></code>\, only the last package name was checked \([https\://github\.com/ansible\-collections/community\.general/pull/8263](https\://github\.com/ansible\-collections/community\.general/pull/8263)\)\.
+* bitwarden\_secrets\_manager lookup plugin \- implements retry with exponential backoff to avoid lookup errors when Bitwardn\'s API rate limiting is encountered \([https\://github\.com/ansible\-collections/community\.general/issues/8230](https\://github\.com/ansible\-collections/community\.general/issues/8230)\, [https\://github\.com/ansible\-collections/community\.general/pull/8238](https\://github\.com/ansible\-collections/community\.general/pull/8238)\)\.
+* from\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\.
+* gitlab\_issue\, gitlab\_label\, gitlab\_milestone \- avoid crash during version comparison when the python\-gitlab Python module is not installed \([https\://github\.com/ansible\-collections/community\.general/pull/8158](https\://github\.com/ansible\-collections/community\.general/pull/8158)\)\.
+* haproxy \- fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable \([https\://github\.com/ansible\-collections/community\.general/issues/8092](https\://github\.com/ansible\-collections/community\.general/issues/8092)\)\.
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \(\([https\://github\.com/ansible\-collections/community\.general/issues/8212](https\://github\.com/ansible\-collections/community\.general/issues/8212)\, [https\://github\.com/ansible\-collections/community\.general/pull/8225](https\://github\.com/ansible\-collections/community\.general/pull/8225)\)\.
+* ipa \- fix get version regex in IPA module\_utils \([https\://github\.com/ansible\-collections/community\.general/pull/8175](https\://github\.com/ansible\-collections/community\.general/pull/8175)\)\.
+* keycloak\_client \- add sorted <code>defaultClientScopes</code> and <code>optionalClientScopes</code> to normalizations \([https\://github\.com/ansible\-collections/community\.general/pull/8223](https\://github\.com/ansible\-collections/community\.general/pull/8223)\)\.
+* keycloak\_realm \- add normalizations for <code>enabledEventTypes</code> and <code>supportedLocales</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8224](https\://github\.com/ansible\-collections/community\.general/pull/8224)\)\.
+* puppet \- add option <code>environment\_lang</code> to set the environment language encoding\. Defaults to lang <code>C</code>\. It is recommended to set it to <code>C\.UTF\-8</code> or <code>en\_US\.UTF\-8</code> depending on what is available on your system\. \([https\://github\.com/ansible\-collections/community\.general/issues/8000](https\://github\.com/ansible\-collections/community\.general/issues/8000)\)
+* riak \- support <code>riak admin</code> sub\-command in newer Riak KV versions beside the legacy <code>riak\-admin</code> main command \([https\://github\.com/ansible\-collections/community\.general/pull/8211](https\://github\.com/ansible\-collections/community\.general/pull/8211)\)\.
+* to\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\.
+* xml \- make module work with lxml 5\.1\.1\, which removed some internals that the module was relying on \([https\://github\.com/ansible\-collections/community\.general/pull/8169](https\://github\.com/ansible\-collections/community\.general/pull/8169)\)\.
+
+<a id="community-hrobot"></a>
+#### community\.hrobot
+
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \([https\://github\.com/ansible\-collections/community\.hrobot/pull/102](https\://github\.com/ansible\-collections/community\.hrobot/pull/102)\)\.
+
+<a id="community-vmware-2"></a>
+#### community\.vmware
+
+* Use <em class="title-reference">isinstance\(\)</em> instead of <em class="title-reference">type\(\)</em> for a typecheck \([https\://github\.com/ansible\-collections/community\.vmware/pull/2011](https\://github\.com/ansible\-collections/community\.vmware/pull/2011)\)\.
+* vmware\_guest \- Fix a error while updating the VM by adding a new disk\. While adding a disk to an existing VM\, it leaves it in invalid state\. \([https\://github\.com/ansible\-collections/community\.vmware/pull/2044](https\://github\.com/ansible\-collections/community\.vmware/pull/2044)\)\.
+* vmware\_guest \- Fix a missing error message while setting a template parameter with inconsistency guest\_os ID \([https\://github\.com/ansible\-collections/community\.vmware/pull/2036](https\://github\.com/ansible\-collections/community\.vmware/pull/2036)\)\.
+
+<a id="containers-podman-2"></a>
+#### containers\.podman
+
+* Fix pod info for non\-existant pods
+* podman\_container \- Add check and fixed for v5 network diff
+* podman\_container \- Fix pasta networking idempotency for v5 \(\#728\)
+* podman\_container\_exec \- Remove unnecessary quotes in podman\_container\_exec module
+* podman\_image\_info \- Fix wrong return data type in podman\_image\_info
+* podman\_play \- Fix kube play annotations
+* podman\_pod \- Fix broken info of pods in Podman v5
+* podman\_pod \- Fix pod for Podman v5
+* podman\_pod \- Fix podman pod v5 broken info issue
+
+<a id="fortinet-fortios-1"></a>
+#### fortinet\.fortios
+
+* Fix the issue that ssl\-certificate cannot be set in <em class="title-reference">fortios\_firewall\_vip</em> and <em class="title-reference">fortios\_firewall\_vip6</em>\.
+* Github issue
+* mantis issue
+
+<a id="netapp-ontap-1"></a>
+#### netapp\.ontap
+
+* na\_ontap\_dns \- fix issue with modifying DNS servers in REST\.
+* na\_ontap\_fpolicy\_policy \- fixed issue with idempotency in REST\.
+* na\_ontap\_quotas \- fixed issue with idempotency in REST\.
+* na\_ontap\_security\_config \- added warning for missing <em class="title-reference">supported\_cipher\_suites</em> to maintain idempotency in REST\.
+
+<a id="new-plugins"></a>
+### New Plugins
+
+<a id="filter"></a>
+#### Filter
+
+* community\.dns\.quote\_txt \- Quotes a string to use as a TXT record entry
+* community\.dns\.unquote\_txt \- Unquotes a TXT record entry to a string
+
+<a id="new-modules"></a>
+### New Modules
+
+<a id="community-aws-2"></a>
+#### community\.aws
+
+* community\.aws\.dynamodb\_table\_info \- Returns information about a Dynamo DB table
+
+<a id="community-crypto-3"></a>
+#### community\.crypto
+
+* community\.crypto\.x509\_certificate\_convert \- Convert X\.509 certificates
+
+<a id="community-general-3"></a>
+#### community\.general
+
+* community\.general\.keycloak\_client\_rolescope \- Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications\.
+
+<a id="dellemc-powerflex-1"></a>
+#### dellemc\.powerflex
+
+* dellemc\.powerflex\.resource\_group \- Manage resource group deployments on Dell PowerFlex
+
+<a id="unchanged-collections"></a>
+### Unchanged Collections
+
+* ansible\.netcommon \(still version 5\.3\.0\)
+* ansible\.posix \(still version 1\.5\.4\)
+* ansible\.utils \(still version 2\.12\.0\)
+* ansible\.windows \(still version 2\.3\.0\)
+* arista\.eos \(still version 6\.2\.2\)
+* awx\.awx \(still version 23\.9\.0\)
+* azure\.azcollection \(still version 1\.19\.0\)
+* check\_point\.mgmt \(still version 5\.2\.3\)
+* chocolatey\.chocolatey \(still version 1\.5\.1\)
+* cisco\.asa \(still version 4\.0\.3\)
+* cisco\.ios \(still version 5\.3\.0\)
+* cisco\.iosxr \(still version 6\.1\.1\)
+* cisco\.nxos \(still version 5\.3\.0\)
+* cisco\.ucs \(still version 1\.10\.0\)
+* cloud\.common \(still version 2\.1\.4\)
+* cloudscale\_ch\.cloud \(still version 2\.3\.1\)
+* community\.azure \(still version 2\.0\.0\)
+* community\.ciscosmb \(still version 1\.0\.7\)
+* community\.digitalocean \(still version 1\.26\.0\)
+* community\.grafana \(still version 1\.8\.0\)
+* community\.hashi\_vault \(still version 6\.2\.0\)
+* community\.libvirt \(still version 1\.3\.0\)
+* community\.mysql \(still version 3\.9\.0\)
+* community\.network \(still version 5\.0\.2\)
+* community\.okd \(still version 2\.3\.0\)
+* community\.postgresql \(still version 3\.4\.0\)
+* community\.proxysql \(still version 1\.5\.1\)
+* community\.sap \(still version 2\.0\.0\)
+* community\.sap\_libs \(still version 1\.4\.2\)
+* community\.sops \(still version 1\.6\.7\)
+* community\.windows \(still version 2\.2\.0\)
+* community\.zabbix \(still version 2\.3\.1\)
+* cyberark\.conjur \(still version 1\.2\.2\)
+* cyberark\.pas \(still version 1\.0\.25\)
+* dellemc\.enterprise\_sonic \(still version 2\.4\.0\)
+* dellemc\.openmanage \(still version 8\.7\.0\)
+* dellemc\.unity \(still version 1\.7\.1\)
+* f5networks\.f5\_modules \(still version 1\.28\.0\)
+* fortinet\.fortimanager \(still version 2\.4\.0\)
+* frr\.frr \(still version 2\.0\.2\)
+* gluster\.gluster \(still version 1\.0\.2\)
+* google\.cloud \(still version 1\.3\.0\)
+* grafana\.grafana \(still version 2\.2\.5\)
+* hetzner\.hcloud \(still version 2\.5\.0\)
+* hpe\.nimble \(still version 1\.1\.4\)
+* ibm\.qradar \(still version 2\.1\.0\)
+* ibm\.spectrum\_virtualize \(still version 2\.0\.0\)
+* ibm\.storage\_virtualize \(still version 2\.3\.1\)
+* infoblox\.nios\_modules \(still version 1\.6\.1\)
+* inspur\.ispim \(still version 2\.2\.0\)
+* inspur\.sm \(still version 2\.3\.0\)
+* junipernetworks\.junos \(still version 5\.3\.1\)
+* kubernetes\.core \(still version 2\.4\.2\)
+* lowlydba\.sqlserver \(still version 2\.3\.2\)
+* microsoft\.ad \(still version 1\.5\.0\)
+* netapp\.aws \(still version 21\.7\.1\)
+* netapp\.azure \(still version 21\.10\.1\)
+* netapp\.cloudmanager \(still version 21\.22\.1\)
+* netapp\.elementsw \(still version 21\.7\.0\)
+* netapp\.storagegrid \(still version 21\.12\.0\)
+* netapp\.um\_info \(still version 21\.8\.1\)
+* netapp\_eseries\.santricity \(still version 1\.4\.0\)
+* netbox\.netbox \(still version 3\.17\.0\)
+* ngine\_io\.cloudstack \(still version 2\.3\.0\)
+* ngine\_io\.exoscale \(still version 1\.1\.0\)
+* openstack\.cloud \(still version 2\.2\.0\)
+* openvswitch\.openvswitch \(still version 2\.1\.1\)
+* ovirt\.ovirt \(still version 3\.2\.0\)
+* purestorage\.flasharray \(still version 1\.27\.0\)
+* purestorage\.fusion \(still version 1\.6\.1\)
+* sensu\.sensu\_go \(still version 1\.14\.0\)
+* splunk\.es \(still version 2\.1\.2\)
+* t\_systems\_mms\.icinga\_director \(still version 2\.0\.1\)
+* telekom\_mms\.icinga\_director \(still version 1\.35\.0\)
+* theforeman\.foreman \(still version 3\.15\.0\)
+* vmware\.vmware\_rest \(still version 2\.3\.1\)
+* vultr\.cloud \(still version 1\.12\.1\)
+* vyos\.vyos \(still version 4\.1\.0\)
+* wti\.remote \(still version 1\.0\.5\)
+
+<a id="v9-4-0"></a>
+## v9\.4\.0
+
+- <a href="#release-summary-1">Release Summary</a>
+- <a href="#ansible-core-2">Ansible\-core</a>
+- <a href="#changed-collections-1">Changed Collections</a>
+- <a href="#minor-changes-1">Minor Changes</a>
+ - <a href="#ansible-core-3">Ansible\-core</a>
- <a href="#amazon-aws-2">amazon\.aws</a>
- - <a href="#ansible-windows-1">ansible\.windows</a>
+ - <a href="#ansible-windows">ansible\.windows</a>
+ - <a href="#cisco-dnac-1">cisco\.dnac</a>
+ - <a href="#cisco-ise-1">cisco\.ise</a>
+ - <a href="#community-general-4">community\.general</a>
+ - <a href="#community-hashi-vault">community\.hashi\_vault</a>
+ - <a href="#community-routeros-1">community\.routeros</a>
+ - <a href="#community-windows">community\.windows</a>
+ - <a href="#dellemc-powerflex-2">dellemc\.powerflex</a>
+ - <a href="#ibm-storage-virtualize">ibm\.storage\_virtualize</a>
+ - <a href="#microsoft-ad">microsoft\.ad</a>
+ - <a href="#purestorage-flasharray">purestorage\.flasharray</a>
+ - <a href="#purestorage-flashblade-1">purestorage\.flashblade</a>
+- <a href="#deprecated-features-1">Deprecated Features</a>
+ - <a href="#amazon-aws-3">amazon\.aws</a>
+- <a href="#security-fixes">Security Fixes</a>
- <a href="#community-dns-1">community\.dns</a>
- - <a href="#community-docker-1">community\.docker</a>
- - <a href="#community-general-2">community\.general</a>
+ - <a href="#community-docker-2">community\.docker</a>
+ - <a href="#community-general-5">community\.general</a>
+ - <a href="#community-hrobot-1">community\.hrobot</a>
+- <a href="#bugfixes-1">Bugfixes</a>
+ - <a href="#ansible-core-4">Ansible\-core</a>
+ - <a href="#amazon-aws-4">amazon\.aws</a>
+ - <a href="#ansible-windows-1">ansible\.windows</a>
+ - <a href="#community-dns-2">community\.dns</a>
+ - <a href="#community-docker-3">community\.docker</a>
+ - <a href="#community-general-6">community\.general</a>
- <a href="#community-windows-1">community\.windows</a>
- <a href="#ibm-storage-virtualize-1">ibm\.storage\_virtualize</a>
- <a href="#kubernetes-core">kubernetes\.core</a>
- <a href="#lowlydba-sqlserver">lowlydba\.sqlserver</a>
- <a href="#microsoft-ad-1">microsoft\.ad</a>
- <a href="#purestorage-flasharray-1">purestorage\.flasharray</a>
- - <a href="#purestorage-flashblade-1">purestorage\.flashblade</a>
-- <a href="#new-plugins">New Plugins</a>
- - <a href="#filter">Filter</a>
-- <a href="#new-modules">New Modules</a>
- - <a href="#community-general-3">community\.general</a>
+ - <a href="#purestorage-flashblade-2">purestorage\.flashblade</a>
+- <a href="#new-plugins-1">New Plugins</a>
+ - <a href="#filter-1">Filter</a>
+- <a href="#new-modules-1">New Modules</a>
+ - <a href="#community-general-7">community\.general</a>
- <a href="#community-hashi-vault-1">community\.hashi\_vault</a>
- - <a href="#dellemc-powerflex-1">dellemc\.powerflex</a>
-- <a href="#unchanged-collections">Unchanged Collections</a>
+ - <a href="#dellemc-powerflex-3">dellemc\.powerflex</a>
+- <a href="#unchanged-collections-1">Unchanged Collections</a>
-<a id="release-summary"></a>
+<a id="release-summary-1"></a>
### Release Summary
Release Date\: 2024\-03\-27
[Porting Guide](https\://docs\.ansible\.com/ansible/devel/porting\_guides\.html)
-<a id="ansible-core"></a>
+<a id="ansible-core-2"></a>
### Ansible\-core
Ansible 9\.4\.0 contains ansible\-core version 2\.16\.5\.
@@ -139,7 +792,7 @@ This is a newer version than version 2\.16\.4 contained in the previous Ansible
The changes are reported in the combined changelog below\.
-<a id="changed-collections"></a>
+<a id="changed-collections-1"></a>
### Changed Collections
If not mentioned explicitly\, the changes are reported in the combined changelog below\.
@@ -168,15 +821,15 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
| purestorage.flasharray | 1.26.0 | 1.27.0 | |
| purestorage.flashblade | 1.15.0 | 1.16.0 | |
-<a id="minor-changes"></a>
+<a id="minor-changes-1"></a>
### Minor Changes
-<a id="ansible-core-1"></a>
+<a id="ansible-core-3"></a>
#### Ansible\-core
* ansible\-test \- Add a work\-around for permission denied errors when using <code>pytest \>\= 8</code> on multi\-user systems with an installed version of <code>ansible\-test</code>\.
-<a id="amazon-aws"></a>
+<a id="amazon-aws-2"></a>
#### amazon\.aws
* AnsibeAWSModule \- added <code>fail\_json\_aws\_error\(\)</code> as a wrapper for <code>fail\_json\(\)</code> and <code>fail\_json\_aws\(\)</code> when passed an <code>AnsibleAWSError</code> exception \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1997](https\://github\.com/ansible\-collections/amazon\.aws/pull/1997)\)\.
@@ -197,7 +850,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* win\_uri \- Max depth for json object conversion used to be 2\. Can now send json objects with up to 20 levels of nesting
-<a id="cisco-dnac"></a>
+<a id="cisco-dnac-1"></a>
#### cisco\.dnac
* Added attributes \'dnac\_api\_task\_timeout\' and \'dnac\_task\_poll\_interval\' in intent and workflow\_manager modules\.
@@ -211,12 +864,12 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* inventory\_workflow\_manager \- Added attributes \'add\_user\_defined\_field\'\, \'update\_interface\_details\'\, \'export\_device\_list\' and \'admin\_status\'
* inventory\_workflow\_manager \- Removed attributes \'provision\_wireless\_device\'\, \'reprovision\_wired\_device\'
-<a id="cisco-ise"></a>
+<a id="cisco-ise-1"></a>
#### cisco\.ise
* Changes the minimum supported version from Ansible v2\.9\.10 to v2\.14\.0
-<a id="community-general"></a>
+<a id="community-general-4"></a>
#### community\.general
* bitwarden lookup plugin \- allows to fetch all records of a given collection ID\, by allowing to pass an empty value for <code>search\_value</code> when <code>collection\_id</code> is provided \([https\://github\.com/ansible\-collections/community\.general/pull/8013](https\://github\.com/ansible\-collections/community\.general/pull/8013)\)\.
@@ -234,7 +887,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* cert auth \- add option to set the <code>cert\_auth\_public\_key</code> and <code>cert\_auth\_private\_key</code> parameters using the variables <code>ansible\_hashi\_vault\_cert\_auth\_public\_key</code> and <code>ansible\_hashi\_vault\_cert\_auth\_private\_key</code> \([https\://github\.com/ansible\-collections/community\.hashi\_vault/issues/428](https\://github\.com/ansible\-collections/community\.hashi\_vault/issues/428)\)\.
-<a id="community-routeros"></a>
+<a id="community-routeros-1"></a>
#### community\.routeros
* api\_info\, api\_modify \- add read\-only fields <code>installed\-version</code>\, <code>latest\-version</code> and <code>status</code> in <code>system package update</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/263](https\://github\.com/ansible\-collections/community\.routeros/pull/263)\)\.
@@ -246,7 +899,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* win\_regmerge \- Add content \'content\' parameter for specifying registry file contents directly
-<a id="dellemc-powerflex"></a>
+<a id="dellemc-powerflex-2"></a>
#### dellemc\.powerflex
* The Info module is enhanced to retrieve lists related to fault sets\, service templates\, deployments\, and managed devices\.
@@ -282,15 +935,15 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* purefa\_syslog \- <code>name</code> becomes a required parameter as module converts to full REST 2 support
* purefa\_vnc \- Convert to REST v2
-<a id="purestorage-flashblade"></a>
+<a id="purestorage-flashblade-1"></a>
#### purestorage\.flashblade
* purefb\_ds \- Add <em class="title-reference">force\_bind\_password</em> parameter to allow module to be idempotent\.
-<a id="deprecated-features"></a>
+<a id="deprecated-features-1"></a>
### Deprecated Features
-<a id="amazon-aws-1"></a>
+<a id="amazon-aws-3"></a>
#### amazon\.aws
* iam\_role\_info \- in a release after 2026\-05\-01 paths must begin and end with <code>/</code> \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1998](https\://github\.com/ansible\-collections/amazon\.aws/pull/1998)\)\.
@@ -298,30 +951,30 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="security-fixes"></a>
### Security Fixes
-<a id="community-dns"></a>
+<a id="community-dns-1"></a>
#### community\.dns
* hosttech\_dns\_records and hetzner\_dns\_records inventory plugins \- make sure all data received from the remote servers is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.dns/pull/189](https\://github\.com/ansible\-collections/community\.dns/pull/189)\)\.
-<a id="community-docker"></a>
+<a id="community-docker-2"></a>
#### community\.docker
* docker\_containers\, docker\_machine\, and docker\_swarm inventory plugins \- make sure all data received from the Docker daemon / Docker machine is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.docker/pull/815](https\://github\.com/ansible\-collections/community\.docker/pull/815)\)\.
-<a id="community-general-1"></a>
+<a id="community-general-5"></a>
#### community\.general
* cobbler\, gitlab\_runners\, icinga2\, linode\, lxd\, nmap\, online\, opennebula\, proxmox\, scaleway\, stackpath\_compute\, virtualbox\, and xen\_orchestra inventory plugin \- make sure all data received from the remote servers is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.general/pull/8098](https\://github\.com/ansible\-collections/community\.general/pull/8098)\)\.
-<a id="community-hrobot"></a>
+<a id="community-hrobot-1"></a>
#### community\.hrobot
* robot inventory plugin \- make sure all data received from the Hetzner robot service server is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.hrobot/pull/99](https\://github\.com/ansible\-collections/community\.hrobot/pull/99)\)\.
-<a id="bugfixes"></a>
+<a id="bugfixes-1"></a>
### Bugfixes
-<a id="ansible-core-2"></a>
+<a id="ansible-core-4"></a>
#### Ansible\-core
* Fix an issue when setting a plugin name from an unsafe source resulted in <code>ValueError\: unmarshallable object</code> \([https\://github\.com/ansible/ansible/issues/82708](https\://github\.com/ansible/ansible/issues/82708)\)
@@ -330,7 +983,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* template \- Fix error when templating an unsafe string which corresponds to an invalid type in Python \([https\://github\.com/ansible/ansible/issues/82600](https\://github\.com/ansible/ansible/issues/82600)\)\.
* winrm \- does not hang when attempting to get process output when stdin write failed
-<a id="amazon-aws-2"></a>
+<a id="amazon-aws-4"></a>
#### amazon\.aws
* cloudwatchevent\_rule \- Fix to avoid adding quotes to JSON input for provided input\_template \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1883](https\://github\.com/ansible\-collections/amazon\.aws/pull/1883)\)\.
@@ -343,13 +996,13 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* win\_get\_url \- Fix Tls1\.3 getting removed from the list of security protocols
* win\_powershell \- Remove unecessary using in code causing stray error records in output \- [https\://github\.com/ansible\-collections/ansible\.windows/issues/571](https\://github\.com/ansible\-collections/ansible\.windows/issues/571)
-<a id="community-dns-1"></a>
+<a id="community-dns-2"></a>
#### community\.dns
* DNS record modules\, inventory plugins \- fix the TXT entry encoder to avoid splitting up escape sequences for quotes and backslashes over multiple TXT strings \([https\://github\.com/ansible\-collections/community\.dns/issues/190](https\://github\.com/ansible\-collections/community\.dns/issues/190)\, [https\://github\.com/ansible\-collections/community\.dns/pull/191](https\://github\.com/ansible\-collections/community\.dns/pull/191)\)\.
* Update Public Suffix List\.
-<a id="community-docker-1"></a>
+<a id="community-docker-3"></a>
#### community\.docker
* docker\_compose\_v2 \- do not fail when non\-fatal errors occur\. This can happen when pulling an image fails\, but then the image can be built for another service\. Docker Compose emits an error in that case\, but <code>docker compose up</code> still completes successfully \([https\://github\.com/ansible\-collections/community\.docker/issues/807](https\://github\.com/ansible\-collections/community\.docker/issues/807)\, [https\://github\.com/ansible\-collections/community\.docker/pull/810](https\://github\.com/ansible\-collections/community\.docker/pull/810)\, [https\://github\.com/ansible\-collections/community\.docker/pull/811](https\://github\.com/ansible\-collections/community\.docker/pull/811)\)\.
@@ -357,7 +1010,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* docker\_compose\_v2\* modules \- parse <code>logfmt</code> warnings emitted by Docker Compose \([https\://github\.com/ansible\-collections/community\.docker/issues/787](https\://github\.com/ansible\-collections/community\.docker/issues/787)\, [https\://github\.com/ansible\-collections/community\.docker/pull/811](https\://github\.com/ansible\-collections/community\.docker/pull/811)\)\.
* docker\_compose\_v2\_pull \- fixing idempotence by checking actual pull progress events instead of service\-level pull request when <code>policy\=always</code>\. This stops the module from reporting <code>changed\=true</code> if no actual change happened when pulling\. In check mode\, it has to assume that a change happens though \([https\://github\.com/ansible\-collections/community\.docker/issues/813](https\://github\.com/ansible\-collections/community\.docker/issues/813)\, [https\://github\.com/ansible\-collections/community\.docker/pull/814](https\://github\.com/ansible\-collections/community\.docker/pull/814)\)\.
-<a id="community-general-2"></a>
+<a id="community-general-6"></a>
#### community\.general
* aix\_filesystem \- fix issue with empty list items in crfs logic and option order \([https\://github\.com/ansible\-collections/community\.general/pull/8052](https\://github\.com/ansible\-collections/community\.general/pull/8052)\)\.
@@ -408,26 +1061,26 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* purefa\_inventory \- Fix issue with iSCSI\-only FlashArrays
* purefa\_pgsnap \- Add support for restoring volumes connected to hosts in a host\-based protection group and hosts in a hostgroup\-based protection group\.
-<a id="purestorage-flashblade-1"></a>
+<a id="purestorage-flashblade-2"></a>
#### purestorage\.flashblade
* purefb\_bucket \- Changed logic to allow complex buckets to be created in a single call\, rather than having to split into two tasks\.
* purefb\_lag \- Enable LAG port configuration with multi\-chassis
* purefb\_timeout \- Fixed arithmetic error that resulted in module incorrectly reporting changed when no change was required\.
-<a id="new-plugins"></a>
+<a id="new-plugins-1"></a>
### New Plugins
-<a id="filter"></a>
+<a id="filter-1"></a>
#### Filter
* microsoft\.ad\.dn\_escape \- Escape an LDAP DistinguishedName value string\.
* microsoft\.ad\.parse\_dn \- Parses an LDAP DistinguishedName string into an object\.
-<a id="new-modules"></a>
+<a id="new-modules-1"></a>
### New Modules
-<a id="community-general-3"></a>
+<a id="community-general-7"></a>
#### community\.general
* community\.general\.usb\_facts \- Allows listing information about USB devices
@@ -451,12 +1104,12 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.hashi\_vault\.vault\_database\_static\_role\_rotate\_credentials \- Trigger the credential rotation for a static role
* community\.hashi\_vault\.vault\_database\_static\_roles\_list \- Returns a list of available static roles
-<a id="dellemc-powerflex-1"></a>
+<a id="dellemc-powerflex-3"></a>
#### dellemc\.powerflex
* dellemc\.powerflex\.fault\_set \- Manage Fault Sets on Dell PowerFlex
-<a id="unchanged-collections"></a>
+<a id="unchanged-collections-1"></a>
### Unchanged Collections
* ansible\.netcommon \(still version 5\.3\.0\)
@@ -545,71 +1198,71 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="v9-3-0"></a>
## v9\.3\.0
-- <a href="#release-summary-1">Release Summary</a>
-- <a href="#ansible-core-3">Ansible\-core</a>
-- <a href="#changed-collections-1">Changed Collections</a>
-- <a href="#major-changes">Major Changes</a>
+- <a href="#release-summary-2">Release Summary</a>
+- <a href="#ansible-core-5">Ansible\-core</a>
+- <a href="#changed-collections-2">Changed Collections</a>
+- <a href="#major-changes-1">Major Changes</a>
- <a href="#community-mysql">community\.mysql</a>
- - <a href="#fortinet-fortios">fortinet\.fortios</a>
-- <a href="#minor-changes-1">Minor Changes</a>
- - <a href="#amazon-aws-3">amazon\.aws</a>
- - <a href="#community-crypto">community\.crypto</a>
- - <a href="#community-docker-2">community\.docker</a>
- - <a href="#community-general-4">community\.general</a>
+ - <a href="#fortinet-fortios-2">fortinet\.fortios</a>
+- <a href="#minor-changes-2">Minor Changes</a>
+ - <a href="#amazon-aws-5">amazon\.aws</a>
+ - <a href="#community-crypto-4">community\.crypto</a>
+ - <a href="#community-docker-4">community\.docker</a>
+ - <a href="#community-general-8">community\.general</a>
- <a href="#community-grafana">community\.grafana</a>
- <a href="#community-mysql-1">community\.mysql</a>
- <a href="#community-postgresql">community\.postgresql</a>
- - <a href="#community-routeros-1">community\.routeros</a>
- - <a href="#community-vmware">community\.vmware</a>
- - <a href="#containers-podman">containers\.podman</a>
+ - <a href="#community-routeros-2">community\.routeros</a>
+ - <a href="#community-vmware-3">community\.vmware</a>
+ - <a href="#containers-podman-3">containers\.podman</a>
- <a href="#fortinet-fortimanager">fortinet\.fortimanager</a>
- <a href="#grafana-grafana">grafana\.grafana</a>
- <a href="#hetzner-hcloud">hetzner\.hcloud</a>
- <a href="#lowlydba-sqlserver-1">lowlydba\.sqlserver</a>
- - <a href="#netapp-ontap">netapp\.ontap</a>
+ - <a href="#netapp-ontap-2">netapp\.ontap</a>
- <a href="#netapp-storagegrid">netapp\.storagegrid</a>
- <a href="#netbox-netbox">netbox\.netbox</a>
- <a href="#purestorage-fusion">purestorage\.fusion</a>
-- <a href="#deprecated-features-1">Deprecated Features</a>
- - <a href="#community-crypto-1">community\.crypto</a>
-- <a href="#bugfixes-1">Bugfixes</a>
- - <a href="#ansible-core-4">Ansible\-core</a>
- - <a href="#amazon-aws-4">amazon\.aws</a>
- - <a href="#community-crypto-2">community\.crypto</a>
- - <a href="#community-dns-2">community\.dns</a>
- - <a href="#community-docker-3">community\.docker</a>
- - <a href="#community-general-5">community\.general</a>
+- <a href="#deprecated-features-2">Deprecated Features</a>
+ - <a href="#community-crypto-5">community\.crypto</a>
+- <a href="#bugfixes-2">Bugfixes</a>
+ - <a href="#ansible-core-6">Ansible\-core</a>
+ - <a href="#amazon-aws-6">amazon\.aws</a>
+ - <a href="#community-crypto-6">community\.crypto</a>
+ - <a href="#community-dns-3">community\.dns</a>
+ - <a href="#community-docker-5">community\.docker</a>
+ - <a href="#community-general-9">community\.general</a>
- <a href="#community-grafana-1">community\.grafana</a>
- <a href="#community-mysql-2">community\.mysql</a>
- <a href="#community-postgresql-1">community\.postgresql</a>
- - <a href="#community-routeros-2">community\.routeros</a>
- - <a href="#containers-podman-1">containers\.podman</a>
+ - <a href="#community-routeros-3">community\.routeros</a>
+ - <a href="#containers-podman-4">containers\.podman</a>
- <a href="#f5networks-f5-modules">f5networks\.f5\_modules</a>
- <a href="#fortinet-fortimanager-1">fortinet\.fortimanager</a>
- - <a href="#fortinet-fortios-1">fortinet\.fortios</a>
+ - <a href="#fortinet-fortios-3">fortinet\.fortios</a>
- <a href="#lowlydba-sqlserver-2">lowlydba\.sqlserver</a>
- - <a href="#netapp-ontap-1">netapp\.ontap</a>
+ - <a href="#netapp-ontap-3">netapp\.ontap</a>
- <a href="#netapp-storagegrid-1">netapp\.storagegrid</a>
- <a href="#netbox-netbox-1">netbox\.netbox</a>
-- <a href="#new-plugins-1">New Plugins</a>
+- <a href="#new-plugins-2">New Plugins</a>
- <a href="#callback">Callback</a>
- - <a href="#filter-1">Filter</a>
-- <a href="#new-modules-1">New Modules</a>
- - <a href="#community-general-6">community\.general</a>
- - <a href="#containers-podman-2">containers\.podman</a>
+ - <a href="#filter-2">Filter</a>
+- <a href="#new-modules-2">New Modules</a>
+ - <a href="#community-general-10">community\.general</a>
+ - <a href="#containers-podman-5">containers\.podman</a>
- <a href="#fortinet-fortimanager-2">fortinet\.fortimanager</a>
- <a href="#hetzner-hcloud-1">hetzner\.hcloud</a>
- <a href="#netbox-netbox-2">netbox\.netbox</a>
-- <a href="#unchanged-collections-1">Unchanged Collections</a>
+- <a href="#unchanged-collections-2">Unchanged Collections</a>
-<a id="release-summary-1"></a>
+<a id="release-summary-2"></a>
### Release Summary
Release Date\: 2024\-02\-27
[Porting Guide](https\://docs\.ansible\.com/ansible/devel/porting\_guides\.html)
-<a id="ansible-core-3"></a>
+<a id="ansible-core-5"></a>
### Ansible\-core
Ansible 9\.3\.0 contains ansible\-core version 2\.16\.4\.
@@ -617,7 +1270,7 @@ This is a newer version than version 2\.16\.3 contained in the previous Ansible
The changes are reported in the combined changelog below\.
-<a id="changed-collections-1"></a>
+<a id="changed-collections-2"></a>
### Changed Collections
If not mentioned explicitly\, the changes are reported in the combined changelog below\.
@@ -651,7 +1304,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
| netbox.netbox | 3.16.0 | 3.17.0 | |
| purestorage.fusion | 1.6.0 | 1.6.1 | |
-<a id="major-changes"></a>
+<a id="major-changes-1"></a>
### Major Changes
<a id="community-mysql"></a>
@@ -659,7 +1312,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Collection version 2\.\*\.\* is EOL\, no more bugfixes will be backported\. Please consider upgrading to the latest version\.
-<a id="fortinet-fortios"></a>
+<a id="fortinet-fortios-2"></a>
#### fortinet\.fortios
* Update all the boolean values to true/false in the documents and examples\.
@@ -668,10 +1321,10 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Update the required ansible version to 2\.14\.
* Update the supported version ranges instead of concrete version numbers to reduce the collection size\.
-<a id="minor-changes-1"></a>
+<a id="minor-changes-2"></a>
### Minor Changes
-<a id="amazon-aws-3"></a>
+<a id="amazon-aws-5"></a>
#### amazon\.aws
* backup\_plan \- Let user to set <code>schedule\_expression\_timezone</code> for backup plan rules when when using botocore \>\= 1\.31\.36 \([https\://github\.com/ansible\-collections/amazon\.aws/issues/1952](https\://github\.com/ansible\-collections/amazon\.aws/issues/1952)\)\.
@@ -682,19 +1335,19 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* s3\_bucket\_info \- add parameter <code>bucket\_versioning</code> to return the versioning state of a bucket \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1919](https\://github\.com/ansible\-collections/amazon\.aws/pull/1919)\)\.
* s3\_object\_info \- fix exception raised when listing objects from empty bucket \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1919](https\://github\.com/ansible\-collections/amazon\.aws/pull/1919)\)\.
-<a id="community-crypto"></a>
+<a id="community-crypto-4"></a>
#### community\.crypto
* x509\_crl \- the new option <code>serial\_numbers</code> allow to configure in which format serial numbers can be provided to <code>revoked\_certificates\[\]\.serial\_number</code>\. The default is as integers \(<code>serial\_numbers\=integer</code>\) for backwards compatibility\; setting <code>serial\_numbers\=hex\-octets</code> allows to specify colon\-separated hex octet strings like <code>00\:11\:22\:FF</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/687](https\://github\.com/ansible\-collections/community\.crypto/issues/687)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/715](https\://github\.com/ansible\-collections/community\.crypto/pull/715)\)\.
-<a id="community-docker-2"></a>
+<a id="community-docker-4"></a>
#### community\.docker
* docker\_compose\_v2 \- allow to wait until containers are running/health when running <code>docker compose up</code> with the new <code>wait</code> option \([https\://github\.com/ansible\-collections/community\.docker/issues/794](https\://github\.com/ansible\-collections/community\.docker/issues/794)\, [https\://github\.com/ansible\-collections/community\.docker/pull/796](https\://github\.com/ansible\-collections/community\.docker/pull/796)\)\.
* docker\_container \- the <code>pull\_check\_mode\_behavior</code> option now allows to control the module\'s behavior in check mode when <code>pull\=always</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/792](https\://github\.com/ansible\-collections/community\.docker/issues/792)\, [https\://github\.com/ansible\-collections/community\.docker/pull/797](https\://github\.com/ansible\-collections/community\.docker/pull/797)\)\.
* docker\_container \- the <code>pull</code> option now accepts the three values <code>never</code>\, <code>missing\_image</code> \(default\)\, and <code>never</code>\, next to the previously valid values <code>true</code> \(equivalent to <code>always</code>\) and <code>false</code> \(equivalent to <code>missing\_image</code>\)\. This allows the equivalent to <code>\-\-pull\=never</code> from the Docker command line \([https\://github\.com/ansible\-collections/community\.docker/issues/783](https\://github\.com/ansible\-collections/community\.docker/issues/783)\, [https\://github\.com/ansible\-collections/community\.docker/pull/797](https\://github\.com/ansible\-collections/community\.docker/pull/797)\)\.
-<a id="community-general-4"></a>
+<a id="community-general-8"></a>
#### community\.general
* bitwarden lookup plugin \- add <code>bw\_session</code> option\, to pass session key instead of reading from env \([https\://github\.com/ansible\-collections/community\.general/pull/7994](https\://github\.com/ansible\-collections/community\.general/pull/7994)\)\.
@@ -727,13 +1380,13 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* postgresql\_db \- add the <code>icu\_locale</code> argument \([https\://github\.com/ansible\-collections/community\.postgresql/issues/666](https\://github\.com/ansible\-collections/community\.postgresql/issues/666)\)\.
* postgresql\_db \- add the <code>locale\_provider</code> argument \([https\://github\.com/ansible\-collections/community\.postgresql/issues/666](https\://github\.com/ansible\-collections/community\.postgresql/issues/666)\)\.
-<a id="community-routeros-1"></a>
+<a id="community-routeros-2"></a>
#### community\.routeros
* api\_info\, api\_modify \- make path <code>user group</code> modifiable and add <code>comment</code> attribute \([https\://github\.com/ansible\-collections/community\.routeros/issues/256](https\://github\.com/ansible\-collections/community\.routeros/issues/256)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/257](https\://github\.com/ansible\-collections/community\.routeros/pull/257)\)\.
* api\_modify\, api\_info \- add support for the <code>ip vrf</code> path in RouterOS 7 \([https\://github\.com/ansible\-collections/community\.routeros/pull/259](https\://github\.com/ansible\-collections/community\.routeros/pull/259)\)
-<a id="community-vmware"></a>
+<a id="community-vmware-3"></a>
#### community\.vmware
* Add standard function vmware\_argument\_spec\(\) from module\_utils for using default env fallback function\. [https\://github\.com/ansible\-collections/community\.vmware/issues/1977](https\://github\.com/ansible\-collections/community\.vmware/issues/1977)
@@ -743,7 +1396,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* vmware\_vmkernel \- Add the function to set the enable\_backup\_nfc setting \([https\://github\.com/ansible\-collections/community\.vmware/pull/1978](https\://github\.com/ansible\-collections/community\.vmware/pull/1978)\)
* vsphere\_copy \- Add parameter to tell vsphere\_copy which diskformat is being uploaded \([https\://github\.com/ansible\-collections/community\.vmware/pull/1995](https\://github\.com/ansible\-collections/community\.vmware/pull/1995)\)\.
-<a id="containers-podman"></a>
+<a id="containers-podman-3"></a>
#### containers\.podman
* Add log\_opt and annotaion options to podman\_play module
@@ -798,7 +1451,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Add ability to prevent changing login\'s password\, even if password supplied\.
* Add new input strings to be compatible with dbops v0\.9\.x \([https\://github\.com/lowlydba/lowlydba\.sqlserver/pull/231](https\://github\.com/lowlydba/lowlydba\.sqlserver/pull/231)\)
-<a id="netapp-ontap"></a>
+<a id="netapp-ontap-2"></a>
#### netapp\.ontap
* na\_ontap\_cifs\_server \- new option <em class="title-reference">is\_multichannel\_enabled</em> added in REST\, requires ONTAP 9\.10 or later\.
@@ -833,22 +1486,22 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* fusion\_volume \- Allow creating a new volume from already existing volume or volume snapshot
-<a id="deprecated-features-1"></a>
+<a id="deprecated-features-2"></a>
### Deprecated Features
* The <code>inspur\.sm</code> collection is considered unmaintained and will be removed from Ansible 11 if no one starts maintaining it again before Ansible 11\. See [the removal process for details on how this works](https\://github\.com/ansible\-collections/overview/blob/main/removal\_from\_ansible\.rst\#cancelling\-removal\-of\-an\-unmaintained\-collection) \([https\://forum\.ansible\.com/t/2854](https\://forum\.ansible\.com/t/2854)\)\.
* The <code>netapp\.storagegrid</code> collection is considered unmaintained and will be removed from Ansible 11 if no one starts maintaining it again before Ansible 11\. See [the removal process for details on how this works](https\://github\.com/ansible\-collections/overview/blob/main/removal\_from\_ansible\.rst\#cancelling\-removal\-of\-an\-unmaintained\-collection) \([https\://forum\.ansible\.com/t/2811](https\://forum\.ansible\.com/t/2811)\)\.
* The <code>purestorage\.fusion</code> collection is officially unmaintained and has been archived\. Therefore\, it will be removed from Ansible 10 \([https\://forum\.ansible\.com/t/3712](https\://forum\.ansible\.com/t/3712)\)\.
-<a id="community-crypto-1"></a>
+<a id="community-crypto-5"></a>
#### community\.crypto
* openssl\_csr\_pipe\, openssl\_privatekey\_pipe\, x509\_certificate\_pipe \- the current behavior of check mode is deprecated and will change in community\.crypto 3\.0\.0\. The current behavior is similar to the modules without <code>\_pipe</code>\: if the object needs to be \(re\-\)generated\, only the <code>changed</code> status is set\, but the object is not updated\. From community\.crypto 3\.0\.0 on\, the modules will ignore check mode and always act as if check mode is not active\. This behavior can already achieved now by adding <code>check\_mode\: false</code> to the task\. If you think this breaks your use\-case of this module\, please [create an issue in the community\.crypto repository](https\://github\.com/ansible\-collections/community\.crypto/issues/new/choose) \([https\://github\.com/ansible\-collections/community\.crypto/issues/712](https\://github\.com/ansible\-collections/community\.crypto/issues/712)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/714](https\://github\.com/ansible\-collections/community\.crypto/pull/714)\)\.
-<a id="bugfixes-1"></a>
+<a id="bugfixes-2"></a>
### Bugfixes
-<a id="ansible-core-4"></a>
+<a id="ansible-core-6"></a>
#### Ansible\-core
* Fix loading vars\_plugins in roles \([https\://github\.com/ansible/ansible/issues/82239](https\://github\.com/ansible/ansible/issues/82239)\)\.
@@ -856,32 +1509,32 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* include\_vars \- fix calculating <code>depth</code> relative to the root and ensure all files are included \([https\://github\.com/ansible/ansible/issues/80987](https\://github\.com/ansible/ansible/issues/80987)\)\.
* templating \- ensure syntax errors originating from a template being compiled into Python code object result in a failure \([https\://github\.com/ansible/ansible/issues/82606](https\://github\.com/ansible/ansible/issues/82606)\)
-<a id="amazon-aws-4"></a>
+<a id="amazon-aws-6"></a>
#### amazon\.aws
* backup\_plan \- Fix idempotency issue when using botocore \>\= 1\.31\.36 \([https\://github\.com/ansible\-collections/amazon\.aws/issues/1952](https\://github\.com/ansible\-collections/amazon\.aws/issues/1952)\)\.
* plugins/inventory/aws\_ec2 \- Fix failure when retrieving information for more than 40 instances with use\_ssm\_inventory \([https\://github\.com/ansible\-collections/amazon\.aws/issues/1713](https\://github\.com/ansible\-collections/amazon\.aws/issues/1713)\)\.
-<a id="community-crypto-2"></a>
+<a id="community-crypto-6"></a>
#### community\.crypto
* luks\_device \- fixed module a bug that prevented using <code>remove\_keyslot</code> with the value <code>0</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/710](https\://github\.com/ansible\-collections/community\.crypto/pull/710)\)\.
* luks\_device \- fixed module falsely outputting <code>changed\=false</code> when trying to add a new slot with a key that is already present in another slot\. The module now rejects adding keys that are already present in another slot \([https\://github\.com/ansible\-collections/community\.crypto/pull/710](https\://github\.com/ansible\-collections/community\.crypto/pull/710)\)\.
* luks\_device \- fixed testing of LUKS passphrases in when specifying a keyslot for cryptsetup version 2\.0\.3\. The output of this cryptsetup version slightly differs from later versions \([https\://github\.com/ansible\-collections/community\.crypto/pull/710](https\://github\.com/ansible\-collections/community\.crypto/pull/710)\)\.
-<a id="community-dns-2"></a>
+<a id="community-dns-3"></a>
#### community\.dns
* Update Public Suffix List\.
-<a id="community-docker-3"></a>
+<a id="community-docker-5"></a>
#### community\.docker
* docker\_compose\_v2 \- do not consider a <code>Waiting</code> event as an action/change \([https\://github\.com/ansible\-collections/community\.docker/pull/804](https\://github\.com/ansible\-collections/community\.docker/pull/804)\)\.
* docker\_compose\_v2 \- do not treat service\-level pull events as changes to avoid incorrect <code>changed\=true</code> return value of <code>pull\=always</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/802](https\://github\.com/ansible\-collections/community\.docker/issues/802)\, [https\://github\.com/ansible\-collections/community\.docker/pull/803](https\://github\.com/ansible\-collections/community\.docker/pull/803)\)\.
* docker\_compose\_v2\, docker\_compose\_v2\_pull \- fix parsing of pull messages for Docker Compose 2\.20\.0 \([https\://github\.com/ansible\-collections/community\.docker/issues/785](https\://github\.com/ansible\-collections/community\.docker/issues/785)\, [https\://github\.com/ansible\-collections/community\.docker/pull/786](https\://github\.com/ansible\-collections/community\.docker/pull/786)\)\.
-<a id="community-general-5"></a>
+<a id="community-general-9"></a>
#### community\.general
* cargo \- fix idempotency issues when using a custom installation path for packages \(using the <code>\-\-path</code> parameter\)\. The initial installation runs fine\, but subsequent runs use the <code>get\_installed\(\)</code> function which did not check the given installation location\, before running <code>cargo install</code>\. This resulted in a false <code>changed</code> state\. Also the removal of packeges using <code>state\: absent</code> failed\, as the installation check did not use the given parameter \([https\://github\.com/ansible\-collections/community\.general/pull/7970](https\://github\.com/ansible\-collections/community\.general/pull/7970)\)\.
@@ -909,12 +1562,12 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* postgresql\_privs \- fix a failure when altering privileges with <code>grant\_option\: true</code> \([https\://github\.com/ansible\-collections/community\.postgresql/issues/668](https\://github\.com/ansible\-collections/community\.postgresql/issues/668)\)\.
-<a id="community-routeros-2"></a>
+<a id="community-routeros-3"></a>
#### community\.routeros
* facts \- fix date not getting removed for idempotent config export \([https\://github\.com/ansible\-collections/community\.routeros/pull/262](https\://github\.com/ansible\-collections/community\.routeros/pull/262)\)\.
-<a id="containers-podman-1"></a>
+<a id="containers-podman-4"></a>
#### containers\.podman
* Add idempotency for podman\_secret module
@@ -951,7 +1604,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Reduced the size of module\_arg\_spec in each module\.
* Removed most of the sanity test ignores\.
-<a id="fortinet-fortios-1"></a>
+<a id="fortinet-fortios-3"></a>
#### fortinet\.fortios
* Github issue
@@ -962,7 +1615,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Add ActiveStartDate to the compare properties so this item is marked accurately as changed\.
* Fixed the formatting of the SPN by updating the backslash to a forward\-slash for the \$spn var \(lowlydba\.sqlserver\.spn\)
-<a id="netapp-ontap-1"></a>
+<a id="netapp-ontap-3"></a>
#### netapp\.ontap
* na\_ontap\_igroup\_initiator \- fixed issue with idempotency\.
@@ -977,7 +1630,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* netbox\_vlan \- Fix documentation of vlan\_group \[\#1138\]\([https\://github\.com/netbox\-community/ansible\_modules/pull/1138](https\://github\.com/netbox\-community/ansible\_modules/pull/1138)\)
-<a id="new-plugins-1"></a>
+<a id="new-plugins-2"></a>
### New Plugins
<a id="callback"></a>
@@ -985,7 +1638,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.general\.default\_without\_diff \- The default ansible callback without diff output
-<a id="filter-1"></a>
+<a id="filter-2"></a>
#### Filter
* community\.crypto\.parse\_serial \- Convert a serial number as a colon\-separated list of hex numbers to an integer
@@ -995,16 +1648,16 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.general\.lists\_symmetric\_difference \- Symmetric Difference of lists with a predictive order
* community\.general\.lists\_union \- Union of lists with a predictive order
-<a id="new-modules-1"></a>
+<a id="new-modules-2"></a>
### New Modules
-<a id="community-general-6"></a>
+<a id="community-general-10"></a>
#### community\.general
* community\.general\.gitlab\_group\_access\_token \- Manages GitLab group access tokens
* community\.general\.gitlab\_project\_access\_token \- Manages GitLab project access tokens
-<a id="containers-podman-2"></a>
+<a id="containers-podman-5"></a>
#### containers\.podman
* containers\.podman\.podman\_secret\_info \- Secrets info module
@@ -1044,7 +1697,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* netbox\.netbox\.netbox\_virtual\_disk \- Create\, updates\, or removes a disk from a Virtual Machine
-<a id="unchanged-collections-1"></a>
+<a id="unchanged-collections-2"></a>
### Unchanged Collections
* ansible\.netcommon \(still version 5\.3\.0\)
@@ -1128,93 +1781,93 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="v9-2-0"></a>
## v9\.2\.0
-- <a href="#release-summary-2">Release Summary</a>
+- <a href="#release-summary-3">Release Summary</a>
- <a href="#added-collections">Added Collections</a>
-- <a href="#ansible-core-5">Ansible\-core</a>
-- <a href="#changed-collections-2">Changed Collections</a>
-- <a href="#major-changes-1">Major Changes</a>
- - <a href="#community-docker-4">community\.docker</a>
+- <a href="#ansible-core-7">Ansible\-core</a>
+- <a href="#changed-collections-3">Changed Collections</a>
+- <a href="#major-changes-2">Major Changes</a>
+ - <a href="#community-docker-6">community\.docker</a>
- <a href="#community-hashi-vault-2">community\.hashi\_vault</a>
- <a href="#dellemc-openmanage">dellemc\.openmanage</a>
- <a href="#infoblox-nios-modules">infoblox\.nios\_modules</a>
-- <a href="#minor-changes-2">Minor Changes</a>
- - <a href="#amazon-aws-5">amazon\.aws</a>
+- <a href="#minor-changes-3">Minor Changes</a>
+ - <a href="#amazon-aws-7">amazon\.aws</a>
- <a href="#check-point-mgmt">check\_point\.mgmt</a>
- - <a href="#cisco-ise-1">cisco\.ise</a>
- - <a href="#cisco-meraki">cisco\.meraki</a>
- - <a href="#community-aws">community\.aws</a>
- - <a href="#community-crypto-3">community\.crypto</a>
+ - <a href="#cisco-ise-2">cisco\.ise</a>
+ - <a href="#cisco-meraki-1">cisco\.meraki</a>
+ - <a href="#community-aws-3">community\.aws</a>
+ - <a href="#community-crypto-7">community\.crypto</a>
- <a href="#community-digitalocean">community\.digitalocean</a>
- - <a href="#community-dns-3">community\.dns</a>
- - <a href="#community-docker-5">community\.docker</a>
- - <a href="#community-general-7">community\.general</a>
+ - <a href="#community-dns-4">community\.dns</a>
+ - <a href="#community-docker-7">community\.docker</a>
+ - <a href="#community-general-11">community\.general</a>
- <a href="#community-grafana-2">community\.grafana</a>
- - <a href="#community-hrobot-1">community\.hrobot</a>
+ - <a href="#community-hrobot-2">community\.hrobot</a>
- <a href="#community-postgresql-2">community\.postgresql</a>
- - <a href="#community-routeros-3">community\.routeros</a>
- - <a href="#community-vmware-1">community\.vmware</a>
+ - <a href="#community-routeros-4">community\.routeros</a>
+ - <a href="#community-vmware-4">community\.vmware</a>
- <a href="#community-zabbix">community\.zabbix</a>
- <a href="#dellemc-enterprise-sonic">dellemc\.enterprise\_sonic</a>
- <a href="#dellemc-openmanage-1">dellemc\.openmanage</a>
- <a href="#grafana-grafana-1">grafana\.grafana</a>
- <a href="#ibm-storage-virtualize-2">ibm\.storage\_virtualize</a>
- - <a href="#netapp-ontap-2">netapp\.ontap</a>
+ - <a href="#netapp-ontap-4">netapp\.ontap</a>
- <a href="#netbox-netbox-3">netbox\.netbox</a>
- <a href="#purestorage-flasharray-2">purestorage\.flasharray</a>
- - <a href="#purestorage-flashblade-2">purestorage\.flashblade</a>
+ - <a href="#purestorage-flashblade-3">purestorage\.flashblade</a>
- <a href="#vultr-cloud">vultr\.cloud</a>
-- <a href="#deprecated-features-2">Deprecated Features</a>
- - <a href="#community-dns-4">community\.dns</a>
- - <a href="#community-docker-6">community\.docker</a>
- - <a href="#community-general-8">community\.general</a>
- - <a href="#community-hrobot-2">community\.hrobot</a>
+- <a href="#deprecated-features-3">Deprecated Features</a>
+ - <a href="#community-dns-5">community\.dns</a>
+ - <a href="#community-docker-8">community\.docker</a>
+ - <a href="#community-general-12">community\.general</a>
+ - <a href="#community-hrobot-3">community\.hrobot</a>
- <a href="#security-fixes-1">Security Fixes</a>
- - <a href="#ansible-core-6">Ansible\-core</a>
-- <a href="#bugfixes-2">Bugfixes</a>
- - <a href="#ansible-core-7">Ansible\-core</a>
- - <a href="#amazon-aws-6">amazon\.aws</a>
+ - <a href="#ansible-core-8">Ansible\-core</a>
+- <a href="#bugfixes-3">Bugfixes</a>
+ - <a href="#ansible-core-9">Ansible\-core</a>
+ - <a href="#amazon-aws-8">amazon\.aws</a>
- <a href="#check-point-mgmt-1">check\_point\.mgmt</a>
- - <a href="#cisco-meraki-1">cisco\.meraki</a>
- - <a href="#community-aws-1">community\.aws</a>
- - <a href="#community-crypto-4">community\.crypto</a>
+ - <a href="#cisco-meraki-2">cisco\.meraki</a>
+ - <a href="#community-aws-4">community\.aws</a>
+ - <a href="#community-crypto-8">community\.crypto</a>
- <a href="#community-digitalocean-1">community\.digitalocean</a>
- - <a href="#community-dns-5">community\.dns</a>
- - <a href="#community-docker-7">community\.docker</a>
- - <a href="#community-general-9">community\.general</a>
+ - <a href="#community-dns-6">community\.dns</a>
+ - <a href="#community-docker-9">community\.docker</a>
+ - <a href="#community-general-13">community\.general</a>
- <a href="#community-grafana-3">community\.grafana</a>
- <a href="#community-postgresql-3">community\.postgresql</a>
- <a href="#community-sap-libs">community\.sap\_libs</a>
- - <a href="#community-vmware-2">community\.vmware</a>
+ - <a href="#community-vmware-5">community\.vmware</a>
- <a href="#community-zabbix-1">community\.zabbix</a>
- <a href="#dellemc-enterprise-sonic-1">dellemc\.enterprise\_sonic</a>
- <a href="#dellemc-openmanage-2">dellemc\.openmanage</a>
- <a href="#fortinet-fortimanager-3">fortinet\.fortimanager</a>
- <a href="#infoblox-nios-modules-1">infoblox\.nios\_modules</a>
- - <a href="#netapp-ontap-3">netapp\.ontap</a>
+ - <a href="#netapp-ontap-5">netapp\.ontap</a>
- <a href="#netbox-netbox-4">netbox\.netbox</a>
- <a href="#purestorage-flasharray-3">purestorage\.flasharray</a>
- - <a href="#purestorage-flashblade-3">purestorage\.flashblade</a>
+ - <a href="#purestorage-flashblade-4">purestorage\.flashblade</a>
- <a href="#vultr-cloud-1">vultr\.cloud</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#dellemc-openmanage-3">dellemc\.openmanage</a>
-- <a href="#new-plugins-2">New Plugins</a>
+- <a href="#new-plugins-3">New Plugins</a>
- <a href="#connection">Connection</a>
- - <a href="#filter-2">Filter</a>
+ - <a href="#filter-3">Filter</a>
- <a href="#lookup">Lookup</a>
-- <a href="#new-modules-2">New Modules</a>
+- <a href="#new-modules-3">New Modules</a>
- <a href="#check-point-mgmt-2">check\_point\.mgmt</a>
- <a href="#community-digitalocean-2">community\.digitalocean</a>
- - <a href="#community-docker-8">community\.docker</a>
- - <a href="#community-general-10">community\.general</a>
+ - <a href="#community-docker-10">community\.docker</a>
+ - <a href="#community-general-14">community\.general</a>
- <a href="#dellemc-enterprise-sonic-2">dellemc\.enterprise\_sonic</a>
- <a href="#dellemc-openmanage-4">dellemc\.openmanage</a>
- <a href="#infoblox-nios-modules-2">infoblox\.nios\_modules</a>
- - <a href="#netapp-ontap-4">netapp\.ontap</a>
- - <a href="#purestorage-flashblade-4">purestorage\.flashblade</a>
+ - <a href="#netapp-ontap-6">netapp\.ontap</a>
+ - <a href="#purestorage-flashblade-5">purestorage\.flashblade</a>
- <a href="#vultr-cloud-2">vultr\.cloud</a>
-- <a href="#unchanged-collections-2">Unchanged Collections</a>
+- <a href="#unchanged-collections-3">Unchanged Collections</a>
-<a id="release-summary-2"></a>
+<a id="release-summary-3"></a>
### Release Summary
Release Date\: 2024\-01\-30
@@ -1226,7 +1879,7 @@ Release Date\: 2024\-01\-30
* community\.library\_inventory\_filtering\_v1 \(version 1\.0\.0\)
-<a id="ansible-core-5"></a>
+<a id="ansible-core-7"></a>
### Ansible\-core
Ansible 9\.2\.0 contains ansible\-core version 2\.16\.3\.
@@ -1234,7 +1887,7 @@ This is a newer version than version 2\.16\.1 contained in the previous Ansible
The changes are reported in the combined changelog below\.
-<a id="changed-collections-2"></a>
+<a id="changed-collections-3"></a>
### Changed Collections
If not mentioned explicitly\, the changes are reported in the combined changelog below\.
@@ -1276,10 +1929,10 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
| purestorage.flashblade | 1.14.0 | 1.15.0 | |
| vultr.cloud | 1.10.1 | 1.12.1 | |
-<a id="major-changes-1"></a>
+<a id="major-changes-2"></a>
### Major Changes
-<a id="community-docker-4"></a>
+<a id="community-docker-6"></a>
#### community\.docker
* The <code>community\.docker</code> collection now depends on the <code>community\.library\_inventory\_filtering\_v1</code> collection\. This utility collection provides host filtering functionality for inventory plugins\. If you use the Ansible community package\, both collections are included and you do not have to do anything special\. If you install the collection with <code>ansible\-galaxy collection install</code>\, it will be installed automatically\. If you install the collection by copying the files of the collection to a place where ansible\-core can find it\, for example by cloning the git repository\, you need to make sure that you also have to install the dependency if you are using the inventory plugins \([https\://github\.com/ansible\-collections/community\.docker/pull/698](https\://github\.com/ansible\-collections/community\.docker/pull/698)\)\.
@@ -1304,10 +1957,10 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Upgrade Ansible version support from 2\.13 to 2\.16\.
* Upgrade Python version support from 3\.8 to 3\.10\.
-<a id="minor-changes-2"></a>
+<a id="minor-changes-3"></a>
### Minor Changes
-<a id="amazon-aws-5"></a>
+<a id="amazon-aws-7"></a>
#### amazon\.aws
* autoscaling\_group \- minor PEP8 whitespace sanity fixes \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1846](https\://github\.com/ansible\-collections/amazon\.aws/pull/1846)\)\.
@@ -1360,24 +2013,24 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* New resource modules for R81\.20 JHF Take 43
* meta/runtime\.yml \- update minimum Ansible version required to 2\.14\.0\.
-<a id="cisco-ise-1"></a>
+<a id="cisco-ise-2"></a>
#### cisco\.ise
* cisco\.ise collection now supports ansible\.utils v3
-<a id="cisco-meraki"></a>
+<a id="cisco-meraki-1"></a>
#### cisco\.meraki
* Adding support to ansible\.utils \"\>\=2\.0\.0\, \<4\.00\"\.
-<a id="community-aws"></a>
+<a id="community-aws-3"></a>
#### community\.aws
* aws\_ssm \- Updated the documentation to explicitly state that an S3 bucket is required\, the behavior of the files in that bucket\, and requirements around that\. \([https\://github\.com/ansible\-collections/community\.aws/issues/1775](https\://github\.com/ansible\-collections/community\.aws/issues/1775)\)\.
* cloudfront\_distribution \- added support for <code>cache\_policy\_id</code> and <code>origin\_request\_policy\_id</code> for behaviors \([https\://github\.com/ansible\-collections/community\.aws/pull/1589](https\://github\.com/ansible\-collections/community\.aws/pull/1589)\)
* mq\_broker \- add support to wait for broker state via <code>wait</code> and <code>wait\_timeout</code> parameter values \([https\://github\.com/ansible\-collections/community\.aws/pull/1879](https\://github\.com/ansible\-collections/community\.aws/pull/1879)\)\.
-<a id="community-crypto-3"></a>
+<a id="community-crypto-7"></a>
#### community\.crypto
* luks\_device \- add allow discards option \([https\://github\.com/ansible\-collections/community\.crypto/pull/693](https\://github\.com/ansible\-collections/community\.crypto/pull/693)\)\.
@@ -1388,14 +2041,14 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* digital\_ocean\_kubernetes \- add project\_name parameter \([https\://github\.com/ansible\-collections/community\.digitalocean/issues/264](https\://github\.com/ansible\-collections/community\.digitalocean/issues/264)\)\.
* fix sanity tests \([https\://github\.com/ansible\-collections/community\.digitalocean/issues/323](https\://github\.com/ansible\-collections/community\.digitalocean/issues/323)\)\.
-<a id="community-dns-3"></a>
+<a id="community-dns-4"></a>
#### community\.dns
* hetzner\_dns\_records and hosttech\_dns\_records inventory plugins \- the <code>filters</code> option has been renamed to <code>simple\_filters</code>\. The old name still works until community\.hrobot 2\.0\.0\. Then it will change to allow more complex filtering with the <code>community\.library\_inventory\_filtering\_v1</code> collection\'s functionality \([https\://github\.com/ansible\-collections/community\.dns/pull/181](https\://github\.com/ansible\-collections/community\.dns/pull/181)\)\.
* nameserver\_info and nameserver\_record\_info \- add <code>server</code> parameter to specify custom DNS servers \([https\://github\.com/ansible\-collections/community\.dns/pull/168](https\://github\.com/ansible\-collections/community\.dns/pull/168)\, [https\://github\.com/ansible\-collections/community\.dns/pull/178](https\://github\.com/ansible\-collections/community\.dns/pull/178)\)\.
* wait\_for\_txt \- add <code>server</code> parameter to specify custom DNS servers \([https\://github\.com/ansible\-collections/community\.dns/pull/178](https\://github\.com/ansible\-collections/community\.dns/pull/178)\)\.
-<a id="community-docker-5"></a>
+<a id="community-docker-7"></a>
#### community\.docker
* The <code>ca\_cert</code> option available to almost all modules and plugins has been renamed to <code>ca\_path</code>\. The name <code>ca\_path</code> is also used for similar options in ansible\-core and other collections\. The old name has been added as an alias and can still be used \([https\://github\.com/ansible\-collections/community\.docker/pull/744](https\://github\.com/ansible\-collections/community\.docker/pull/744)\)\.
@@ -1409,7 +2062,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* docker\_image \- allow to specify memory size and swap memory size in other units than bytes \([https\://github\.com/ansible\-collections/community\.docker/pull/727](https\://github\.com/ansible\-collections/community\.docker/pull/727)\)\.
* inventory plugins \- add <code>filter</code> option which allows to include and exclude hosts based on Jinja2 conditions \([https\://github\.com/ansible\-collections/community\.docker/pull/698](https\://github\.com/ansible\-collections/community\.docker/pull/698)\, [https\://github\.com/ansible\-collections/community\.docker/issues/610](https\://github\.com/ansible\-collections/community\.docker/issues/610)\)\.
-<a id="community-general-7"></a>
+<a id="community-general-11"></a>
#### community\.general
* consul\_auth\_method\, consul\_binding\_rule\, consul\_policy\, consul\_role\, consul\_session\, consul\_token \- added action group <code>community\.general\.consul</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7897](https\://github\.com/ansible\-collections/community\.general/pull/7897)\)\.
@@ -1444,7 +2097,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Add support for Grafana Tempo datasource type \([https\://grafana\.com/docs/grafana/latest/datasources/tempo/](https\://grafana\.com/docs/grafana/latest/datasources/tempo/)\)
* default to true/false in docs and code
-<a id="community-hrobot-1"></a>
+<a id="community-hrobot-2"></a>
#### community\.hrobot
* robot inventory plugin \- the <code>filters</code> option has been renamed to <code>simple\_filters</code>\. The old name still works until community\.hrobot 2\.0\.0\. Then it will change to allow more complex filtering with the <code>community\.library\_inventory\_filtering\_v1</code> collection\'s functionality \([https\://github\.com/ansible\-collections/community\.hrobot/pull/94](https\://github\.com/ansible\-collections/community\.hrobot/pull/94)\)\.
@@ -1459,7 +2112,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* postgresql\_subscription \- add the <code>comment</code> argument \([https\://github\.com/ansible\-collections/community\.postgresql/issues/354](https\://github\.com/ansible\-collections/community\.postgresql/issues/354)\)\.
* postgresql\_tablespace \- add the <code>comment</code> argument \([https\://github\.com/ansible\-collections/community\.postgresql/issues/354](https\://github\.com/ansible\-collections/community\.postgresql/issues/354)\)\.
-<a id="community-routeros-3"></a>
+<a id="community-routeros-4"></a>
#### community\.routeros
* api\_info\, api\_modify \- add <code>interface ovpn\-client</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/242](https\://github\.com/ansible\-collections/community\.routeros/issues/242)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/244](https\://github\.com/ansible\-collections/community\.routeros/pull/244)\)\.
@@ -1470,7 +2123,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* api\_info\, api\_modify \- removed <code>host</code> primary key in <code>tool netwatch</code> path \([https\://github\.com/ansible\-collections/community\.routeros/pull/248](https\://github\.com/ansible\-collections/community\.routeros/pull/248)\)\.
* api\_modify\, api\_info \- added support for <code>interface wifiwave2</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/226](https\://github\.com/ansible\-collections/community\.routeros/pull/226)\)\.
-<a id="community-vmware-1"></a>
+<a id="community-vmware-4"></a>
#### community\.vmware
* vmware\_guest \- Add IPv6 support for VM network interfaces \([https\://github\.com/ansible\-collections/community\.vmware/pull/1937](https\://github\.com/ansible\-collections/community\.vmware/pull/1937)\)\.
@@ -1569,7 +2222,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* ibm\_svc\_info \- Added support to display information about thinclone/clone volumes and volumegroups\.
* ibm\_svc\_manage\_volumgroup \- Added support to delete volumegroups keeping volumes via \'evictvolumes\'\.
-<a id="netapp-ontap-2"></a>
+<a id="netapp-ontap-4"></a>
#### netapp\.ontap
* na\_ontap\_cifs\_server \- new option <em class="title-reference">lm\_compatibility\_level</em> added in REST\, requires ONTAP 9\.8 or later\.
@@ -1599,7 +2252,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* purefa\_policy \- Added NFS security flavors for accessing files in the mount point\.
* purefa\_policy \- Remove default setting for nfs\_version to allow for change of version at policy level
-<a id="purestorage-flashblade-2"></a>
+<a id="purestorage-flashblade-3"></a>
#### purestorage\.flashblade
* purefb\_bucket \- Add support for public buckets
@@ -1616,25 +2269,25 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Implemented a feature to distinguish resources by region if available\. This allows to have identical name per region e\.g\. a VPC named <code>default</code> in each region\. \([https\://github\.com/vultr/ansible\-collection\-vultr/pull/98](https\://github\.com/vultr/ansible\-collection\-vultr/pull/98)\)\.
* instance \- Added a new param <code>user\_scheme</code> to change user scheme to non\-root on Linux while creating the instance \([https\://github\.com/vultr/ansible\-collection\-vultr/issues/96](https\://github\.com/vultr/ansible\-collection\-vultr/issues/96)\)\.
-<a id="deprecated-features-2"></a>
+<a id="deprecated-features-3"></a>
### Deprecated Features
-<a id="community-dns-4"></a>
+<a id="community-dns-5"></a>
#### community\.dns
* hetzner\_dns\_records and hosttech\_dns\_records inventory plugins \- the <code>filters</code> option has been renamed to <code>simple\_filters</code>\. The old name will stop working in community\.hrobot 2\.0\.0 \([https\://github\.com/ansible\-collections/community\.dns/pull/181](https\://github\.com/ansible\-collections/community\.dns/pull/181)\)\.
-<a id="community-docker-6"></a>
+<a id="community-docker-8"></a>
#### community\.docker
* docker\_container \- the default <code>ignore</code> for the <code>image\_name\_mismatch</code> parameter has been deprecated and will switch to <code>recreate</code> in community\.docker 4\.0\.0\. A deprecation warning will be printed in situations where the default value is used and where a behavior would change once the default changes \([https\://github\.com/ansible\-collections/community\.docker/pull/703](https\://github\.com/ansible\-collections/community\.docker/pull/703)\)\.
-<a id="community-general-8"></a>
+<a id="community-general-12"></a>
#### community\.general
* consul\_acl \- the module has been deprecated and will be removed in community\.general 10\.0\.0\. <code>consul\_token</code> and <code>consul\_policy</code> can be used instead \([https\://github\.com/ansible\-collections/community\.general/pull/7901](https\://github\.com/ansible\-collections/community\.general/pull/7901)\)\.
-<a id="community-hrobot-2"></a>
+<a id="community-hrobot-3"></a>
#### community\.hrobot
* robot inventory plugin \- the <code>filters</code> option has been renamed to <code>simple\_filters</code>\. The old name will stop working in community\.hrobot 2\.0\.0 \([https\://github\.com/ansible\-collections/community\.hrobot/pull/94](https\://github\.com/ansible\-collections/community\.hrobot/pull/94)\)\.
@@ -1642,15 +2295,15 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="security-fixes-1"></a>
### Security Fixes
-<a id="ansible-core-6"></a>
+<a id="ansible-core-8"></a>
#### Ansible\-core
* ANSIBLE\_NO\_LOG \- Address issue where ANSIBLE\_NO\_LOG was ignored \(CVE\-2024\-0690\)
-<a id="bugfixes-2"></a>
+<a id="bugfixes-3"></a>
### Bugfixes
-<a id="ansible-core-7"></a>
+<a id="ansible-core-9"></a>
#### Ansible\-core
* Run all handlers with the same <code>listen</code> topic\, even when notified from another handler \([https\://github\.com/ansible/ansible/issues/82363](https\://github\.com/ansible/ansible/issues/82363)\)\.
@@ -1667,7 +2320,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* unsafe data \- Address an incompatibility with <code>AnsibleUnsafeText</code> and <code>AnsibleUnsafeBytes</code> when pickling with <code>protocol\=0</code>
* unsafe data \- Enable directly using <code>AnsibleUnsafeText</code> with Python <code>pathlib</code> \([https\://github\.com/ansible/ansible/issues/82414](https\://github\.com/ansible/ansible/issues/82414)\)
-<a id="amazon-aws-6"></a>
+<a id="amazon-aws-8"></a>
#### amazon\.aws
* ec2\_vpc\_subnet \- cleanly handle failure when subnet isn\'t created in time \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1848](https\://github\.com/ansible\-collections/amazon\.aws/pull/1848)\)\.
@@ -1680,19 +2333,19 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* httpapi/checkpoint\.py \- Raise a fatal error if login wasn\'t successful\.
-<a id="cisco-meraki-1"></a>
+<a id="cisco-meraki-2"></a>
#### cisco\.meraki
* Adding <em class="title-reference">smartquotes \= False</em> to <em class="title-reference">conf\.py</em> and romoving <em class="title-reference">\'</em> from rst files\.
* Adding build\_ignore property to galaxy file\.
* Adding support to ansible\.utils \>\=3\.0
-<a id="community-aws-1"></a>
+<a id="community-aws-4"></a>
#### community\.aws
-* aws\_ssm \- disable <em class="title-reference">enable\-bracketed\-paste</em> to fix issue with amazon linux 2023 and other OSes \([https\://github\.com/ansible\-collections/community\.aws/issues/1756](https\://github\.com/ansible\-collections/community\.aws/issues/1756)\)
+* aws\_ssm \- disable <code>enable\-bracketed\-paste</code> to fix issue with amazon linux 2023 and other OSes \([https\://github\.com/ansible\-collections/community\.aws/issues/1756](https\://github\.com/ansible\-collections/community\.aws/issues/1756)\)
-<a id="community-crypto-4"></a>
+<a id="community-crypto-8"></a>
#### community\.crypto
* acme\_\* modules \- directly react on bad return data for account creation/retrieval/updating requests \([https\://github\.com/ansible\-collections/community\.crypto/pull/682](https\://github\.com/ansible\-collections/community\.crypto/pull/682)\)\.
@@ -1710,13 +2363,13 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* digital\_ocean\_kubernetes \- module didn\'t return kubeconfig properly\, return documentation was invalid\. Fixed version returns data with the same structure all the time\, also it is aligned with M\(community\.digitalocean\.digital\_ocean\_kubernetes\_info\) documentation return data now\. \([https\://github\.com/ansible\-collections/community\.digitalocean/issues/322](https\://github\.com/ansible\-collections/community\.digitalocean/issues/322)\)\.
* inventory plugin \- restore reading auth token from env variables \([https\://github\.com/ansible\-collections/community\.digitalocean/pull/315](https\://github\.com/ansible\-collections/community\.digitalocean/pull/315)\)\.
-<a id="community-dns-5"></a>
+<a id="community-dns-6"></a>
#### community\.dns
* Update Public Suffix List\.
* wait\_for\_txt\, nameserver\_info\, nameserver\_record\_info \- when looking up nameservers for a domain\, do not treat <code>NXDOMAIN</code> as a fatal error \([https\://github\.com/ansible\-collections/community\.dns/pull/177](https\://github\.com/ansible\-collections/community\.dns/pull/177)\)\.
-<a id="community-docker-7"></a>
+<a id="community-docker-9"></a>
#### community\.docker
* Use <code>unix\:///var/run/docker\.sock</code> instead of the legacy <code>unix\://var/run/docker\.sock</code> as default for <code>docker\_host</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/736](https\://github\.com/ansible\-collections/community\.docker/pull/736)\)\.
@@ -1727,7 +2380,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* modules and plugins using the Docker SDK for Python \- remove <code>tls\_hostname</code> from the parameters passed to Docker SDK for Python 7\.0\.0\+\. Explicitly fail with a nicer error message if it was explicitly set in this case \([https\://github\.com/ansible\-collections/community\.docker/pull/721](https\://github\.com/ansible\-collections/community\.docker/pull/721)\)\.
* vendored Docker SDK for Python \- avoid passing on <code>ssl\_version</code> and <code>tls\_hostname</code> if they were not provided by the user\. Remove dead code\. \([https\://github\.com/ansible\-collections/community\.docker/pull/722](https\://github\.com/ansible\-collections/community\.docker/pull/722)\)\.
-<a id="community-general-9"></a>
+<a id="community-general-13"></a>
#### community\.general
* homebrew \- detect already installed formulae and casks using JSON output from <code>brew info</code> \([https\://github\.com/ansible\-collections/community\.general/issues/864](https\://github\.com/ansible\-collections/community\.general/issues/864)\)\.
@@ -1760,7 +2413,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* fixes failures in sanity test for all modules
-<a id="community-vmware-2"></a>
+<a id="community-vmware-5"></a>
#### community\.vmware
* Fix InsecureRequestWarning for modules based on the VmwareRestClient module util when setting <code>validate\_certs</code> to <code>False</code> \([https\://github\.com/ansible\-collections/community\.vmware/pull/1969](https\://github\.com/ansible\-collections/community\.vmware/pull/1969)\)\.
@@ -1810,7 +2463,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Fixes index error for transform fields in DTC LBDN \(auth\_zone and Pool\) and DTC POOL \(servers and monitors\) [\#209](https\://github\.com/infobloxopen/infoblox\-ansible/pull/209)
* Fixes typo for environment variable INFOBLOX\_WAPI\_VERSION [\#209](https\://github\.com/infobloxopen/infoblox\-ansible/pull/209)
-<a id="netapp-ontap-3"></a>
+<a id="netapp-ontap-5"></a>
#### netapp\.ontap
* na\_ontap\_nfs \- fix error with <em class="title-reference">windows</em> in REST for ONTAP 9\.10 or earlier\.
@@ -1831,7 +2484,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* purefa\_ds \- Fix issue with SDK returning empty data for data directory services even when it does exist
* purefa\_policy \- Fix incorrect call of psot instead of patch for NFS policies
-<a id="purestorage-flashblade-3"></a>
+<a id="purestorage-flashblade-4"></a>
#### purestorage\.flashblade
* purefb\_info \- Added missing object lock retention details if enabledd
@@ -1858,7 +2511,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* ome\_diagnostics \- Issue\(279193\) \- Export of SupportAssist collection logs to the share location fails on OME version 4\.0\.0\.
* ome\_smart\_fabric\_uplink \- Issue\(186024\) \- The module supported by OpenManage Enterprise Modular\, however it does not allow the creation of multiple uplinks of the same name\. If an uplink is created using the same name as an existing uplink\, then the existing uplink is modified\.
-<a id="new-plugins-2"></a>
+<a id="new-plugins-3"></a>
### New Plugins
<a id="connection"></a>
@@ -1866,7 +2519,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.general\.incus \- Run tasks in Incus instances via the Incus CLI\.
-<a id="filter-2"></a>
+<a id="filter-3"></a>
#### Filter
* community\.general\.from\_ini \- Converts INI text input into a dictionary
@@ -1877,7 +2530,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.general\.github\_app\_access\_token \- Obtain short\-lived Github App Access tokens
-<a id="new-modules-2"></a>
+<a id="new-modules-3"></a>
### New Modules
<a id="check-point-mgmt-2"></a>
@@ -1895,7 +2548,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.digitalocean\.digital\_ocean\_project\_resource\_info \- Gather information about DigitalOcean Project Resources
-<a id="community-docker-8"></a>
+<a id="community-docker-10"></a>
#### community\.docker
* community\.docker\.docker\_compose\_v2 \- Manage multi\-container Docker applications with Docker Compose CLI plugin
@@ -1907,7 +2560,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.docker\.docker\_image\_remove \- Remove Docker images
* community\.docker\.docker\_image\_tag \- Tag Docker images with new names and/or tags
-<a id="community-general-10"></a>
+<a id="community-general-14"></a>
#### community\.general
* community\.general\.consul\_acl\_bootstrap \- Bootstrap ACLs in Consul
@@ -1945,14 +2598,14 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* infoblox\.nios\_modules\.nios\_dtc\_monitor\_tcp \- Configures the Infoblox NIOS DTC TCP monitor
* infoblox\.nios\_modules\.nios\_dtc\_topology \- Configures the Infoblox NIOS DTC Topology
-<a id="netapp-ontap-4"></a>
+<a id="netapp-ontap-6"></a>
#### netapp\.ontap
* netapp\.ontap\.na\_ontap\_cifs\_unix\_symlink\_mapping \- NetApp ONTAP module to manage UNIX symbolic link mapping for CIFS clients\.
* netapp\.ontap\.na\_ontap\_cli\_timeout \- NetApp ONTAP module to set the CLI inactivity timeout value\.
* netapp\.ontap\.na\_ontap\_snmp\_config \- NetApp ONTAP module to modify SNMP configuration\.
-<a id="purestorage-flashblade-4"></a>
+<a id="purestorage-flashblade-5"></a>
#### purestorage\.flashblade
* purestorage\.flashblade\.purefb\_hardware \- Manage FlashBlade Hardware
@@ -1962,7 +2615,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* vultr\.cloud\.object\_storage \- Manages object storages on Vultr
-<a id="unchanged-collections-2"></a>
+<a id="unchanged-collections-3"></a>
### Unchanged Collections
* ansible\.netcommon \(still version 5\.3\.0\)
@@ -2038,21 +2691,21 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="v9-1-0"></a>
## v9\.1\.0
-- <a href="#release-summary-3">Release Summary</a>
-- <a href="#ansible-core-8">Ansible\-core</a>
-- <a href="#changed-collections-3">Changed Collections</a>
-- <a href="#minor-changes-3">Minor Changes</a>
+- <a href="#release-summary-4">Release Summary</a>
+- <a href="#ansible-core-10">Ansible\-core</a>
+- <a href="#changed-collections-4">Changed Collections</a>
+- <a href="#minor-changes-4">Minor Changes</a>
- <a href="#ansible-utils">ansible\.utils</a>
- <a href="#ansible-windows-2">ansible\.windows</a>
- <a href="#cisco-ios">cisco\.ios</a>
- - <a href="#cisco-ise-2">cisco\.ise</a>
+ - <a href="#cisco-ise-3">cisco\.ise</a>
- <a href="#cisco-nxos">cisco\.nxos</a>
- - <a href="#community-general-11">community\.general</a>
- - <a href="#community-routeros-4">community\.routeros</a>
+ - <a href="#community-general-15">community\.general</a>
+ - <a href="#community-routeros-5">community\.routeros</a>
- <a href="#community-windows-2">community\.windows</a>
- <a href="#community-zabbix-2">community\.zabbix</a>
- <a href="#dellemc-openmanage-5">dellemc\.openmanage</a>
- - <a href="#dellemc-powerflex-2">dellemc\.powerflex</a>
+ - <a href="#dellemc-powerflex-4">dellemc\.powerflex</a>
- <a href="#f5networks-f5-modules-1">f5networks\.f5\_modules</a>
- <a href="#google-cloud">google\.cloud</a>
- <a href="#hetzner-hcloud-2">hetzner\.hcloud</a>
@@ -2062,52 +2715,52 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
- <a href="#telekom-mms-icinga-director">telekom\_mms\.icinga\_director</a>
- <a href="#theforeman-foreman">theforeman\.foreman</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- - <a href="#ansible-core-9">Ansible\-core</a>
-- <a href="#security-fixes-2">Security Fixes</a>
- - <a href="#ansible-core-10">Ansible\-core</a>
-- <a href="#bugfixes-3">Bugfixes</a>
- <a href="#ansible-core-11">Ansible\-core</a>
+- <a href="#security-fixes-2">Security Fixes</a>
+ - <a href="#ansible-core-12">Ansible\-core</a>
+- <a href="#bugfixes-4">Bugfixes</a>
+ - <a href="#ansible-core-13">Ansible\-core</a>
- <a href="#ansible-windows-3">ansible\.windows</a>
- <a href="#arista-eos">arista\.eos</a>
- <a href="#cisco-ios-1">cisco\.ios</a>
- <a href="#cisco-iosxr">cisco\.iosxr</a>
- - <a href="#cisco-ise-3">cisco\.ise</a>
- - <a href="#cisco-meraki-2">cisco\.meraki</a>
- - <a href="#community-crypto-5">community\.crypto</a>
- - <a href="#community-dns-6">community\.dns</a>
- - <a href="#community-general-12">community\.general</a>
- - <a href="#community-vmware-3">community\.vmware</a>
+ - <a href="#cisco-ise-4">cisco\.ise</a>
+ - <a href="#cisco-meraki-3">cisco\.meraki</a>
+ - <a href="#community-crypto-9">community\.crypto</a>
+ - <a href="#community-dns-7">community\.dns</a>
+ - <a href="#community-general-16">community\.general</a>
+ - <a href="#community-vmware-6">community\.vmware</a>
- <a href="#community-windows-3">community\.windows</a>
- <a href="#community-zabbix-3">community\.zabbix</a>
- <a href="#dellemc-openmanage-6">dellemc\.openmanage</a>
- <a href="#hetzner-hcloud-3">hetzner\.hcloud</a>
- <a href="#junipernetworks-junos">junipernetworks\.junos</a>
- <a href="#microsoft-ad-3">microsoft\.ad</a>
- - <a href="#netapp-ontap-5">netapp\.ontap</a>
+ - <a href="#netapp-ontap-7">netapp\.ontap</a>
- <a href="#purestorage-flasharray-5">purestorage\.flasharray</a>
- <a href="#splunk-es">splunk\.es</a>
- <a href="#theforeman-foreman-1">theforeman\.foreman</a>
- <a href="#vultr-cloud-3">vultr\.cloud</a>
- <a href="#known-issues-1">Known Issues</a>
- <a href="#dellemc-openmanage-7">dellemc\.openmanage</a>
-- <a href="#new-plugins-3">New Plugins</a>
- - <a href="#filter-3">Filter</a>
+- <a href="#new-plugins-4">New Plugins</a>
+ - <a href="#filter-4">Filter</a>
- <a href="#lookup-1">Lookup</a>
- <a href="#test">Test</a>
-- <a href="#new-modules-3">New Modules</a>
+- <a href="#new-modules-4">New Modules</a>
- <a href="#cisco-ios-2">cisco\.ios</a>
- - <a href="#community-general-13">community\.general</a>
+ - <a href="#community-general-17">community\.general</a>
- <a href="#purestorage-flasharray-6">purestorage\.flasharray</a>
-- <a href="#unchanged-collections-3">Unchanged Collections</a>
+- <a href="#unchanged-collections-4">Unchanged Collections</a>
-<a id="release-summary-3"></a>
+<a id="release-summary-4"></a>
### Release Summary
Release Date\: 2023\-12\-05
[Porting Guide](https\://docs\.ansible\.com/ansible/devel/porting\_guides\.html)
-<a id="ansible-core-8"></a>
+<a id="ansible-core-10"></a>
### Ansible\-core
Ansible 9\.1\.0 contains ansible\-core version 2\.16\.1\.
@@ -2115,7 +2768,7 @@ This is a newer version than version 2\.16\.0 contained in the previous Ansible
The changes are reported in the combined changelog below\.
-<a id="changed-collections-3"></a>
+<a id="changed-collections-4"></a>
### Changed Collections
If not mentioned explicitly\, the changes are reported in the combined changelog below\.
@@ -2155,7 +2808,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
| theforeman.foreman | 3.14.0 | 3.15.0 | |
| vultr.cloud | 1.10.0 | 1.10.1 | |
-<a id="minor-changes-3"></a>
+<a id="minor-changes-4"></a>
### Minor Changes
<a id="ansible-utils"></a>
@@ -2181,7 +2834,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* ios\_vlans \- added vlan config CLI feature\.
* ios\_vrf \- added MDT related keys
-<a id="cisco-ise-2"></a>
+<a id="cisco-ise-3"></a>
#### cisco\.ise
* Services included configuration\, edda\, dataconnect\_services\, subscriber\.
@@ -2191,7 +2844,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* nxos\_config \- Relax restrictions on I\(src\) parameter so it can be used more like I\(lines\)\. \([https\://github\.com/ansible\-collections/cisco\.nxos/issues/89](https\://github\.com/ansible\-collections/cisco\.nxos/issues/89)\)\.
-<a id="community-general-11"></a>
+<a id="community-general-15"></a>
#### community\.general
* bitwarden lookup plugin \- when looking for items using an item ID\, the item is now accessed directly with <code>bw get item</code> instead of searching through all items\. This doubles the lookup speed \([https\://github\.com/ansible\-collections/community\.general/pull/7468](https\://github\.com/ansible\-collections/community\.general/pull/7468)\)\.
@@ -2228,7 +2881,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* redfish\_info \- adding the <code>BootProgress</code> property when getting <code>Systems</code> info \([https\://github\.com/ansible\-collections/community\.general/pull/7626](https\://github\.com/ansible\-collections/community\.general/pull/7626)\)\.
* ssh\_config \- adds <code>controlmaster</code>\, <code>controlpath</code> and <code>controlpersist</code> parameters \([https\://github\.com/ansible\-collections/community\.general/pull/7456](https\://github\.com/ansible\-collections/community\.general/pull/7456)\)\.
-<a id="community-routeros-4"></a>
+<a id="community-routeros-5"></a>
#### community\.routeros
* api\_info\, api\_modify \- add missing DoH parameters <code>doh\-max\-concurrent\-queries</code>\, <code>doh\-max\-server\-connections</code>\, and <code>doh\-timeout</code> to the <code>ip dns</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/230](https\://github\.com/ansible\-collections/community\.routeros/issues/230)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/235](https\://github\.com/ansible\-collections/community\.routeros/pull/235)\)
@@ -2267,7 +2920,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Ansible lint issues are fixed for the collections\.
* Module <code>redfish\_storage\_volume</code> is enhanced to support reboot options and job tracking operation\.
-<a id="dellemc-powerflex-2"></a>
+<a id="dellemc-powerflex-4"></a>
#### dellemc\.powerflex
* Added support for PowerFlex Denver version\(4\.5\.x\) to TB and Config role\.
@@ -2337,7 +2990,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="breaking-changes--porting-guide"></a>
### Breaking Changes / Porting Guide
-<a id="ansible-core-9"></a>
+<a id="ansible-core-11"></a>
#### Ansible\-core
* assert \- Nested templating may result in an inability for the conditional to be evaluated\. See the porting guide for more information\.
@@ -2345,15 +2998,15 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="security-fixes-2"></a>
### Security Fixes
-<a id="ansible-core-10"></a>
+<a id="ansible-core-12"></a>
#### Ansible\-core
* templating \- Address issues where internal templating can cause unsafe variables to lose their unsafe designation \(CVE\-2023\-5764\)
-<a id="bugfixes-3"></a>
+<a id="bugfixes-4"></a>
### Bugfixes
-<a id="ansible-core-11"></a>
+<a id="ansible-core-13"></a>
#### Ansible\-core
* Fix issue where an <code>include\_tasks</code> handler in a role was not able to locate a file in <code>tasks/</code> when <code>tasks\_from</code> was used as a role entry point and <code>main\.yml</code> was not present \([https\://github\.com/ansible/ansible/issues/82241](https\://github\.com/ansible/ansible/issues/82241)\)
@@ -2394,13 +3047,13 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Fix issue in gathered state of interfaces and l3\_interfaces RMs\([https\://github\.com/ansible\-collections/cisco\.iosxr/issues/452](https\://github\.com/ansible\-collections/cisco\.iosxr/issues/452)\, [https\://github\.com/ansible\-collections/cisco\.iosxr/issues/451](https\://github\.com/ansible\-collections/cisco\.iosxr/issues/451)\)
-<a id="cisco-ise-3"></a>
+<a id="cisco-ise-4"></a>
#### cisco\.ise
* Added missing import re in endpoint module
* Updated to use ciscoisesdk v2\.1\.1 or newer fixing ciscoisesdk problem\.
-<a id="cisco-meraki-2"></a>
+<a id="cisco-meraki-3"></a>
#### cisco\.meraki
* Adding <em class="title-reference">network\_clients\_info</em> and <em class="title-reference">network\_client\_info</em>\.
@@ -2424,18 +3077,18 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Removing logs in meraki\.py\.
* networks\_syslog\_servers is now just an Update action to API\.
-<a id="community-crypto-5"></a>
+<a id="community-crypto-9"></a>
#### community\.crypto
* acme\_\* modules \- also retry requests in case of socket errors\, bad status lines\, and unknown connection errors\; improve error messages in these cases \([https\://github\.com/ansible\-collections/community\.crypto/issues/680](https\://github\.com/ansible\-collections/community\.crypto/issues/680)\)\.
-<a id="community-dns-6"></a>
+<a id="community-dns-7"></a>
#### community\.dns
* Update Public Suffix List\.
* nameserver\_record\_info \- fix crash when more than one record is retrieved \([https\://github\.com/ansible\-collections/community\.dns/pull/172](https\://github\.com/ansible\-collections/community\.dns/pull/172)\)\.
-<a id="community-general-12"></a>
+<a id="community-general-16"></a>
#### community\.general
* apt\-rpm \- the module did not upgrade packages if a newer version exists\. Now the package will be reinstalled if the candidate is newer than the installed version \([https\://github\.com/ansible\-collections/community\.general/issues/7414](https\://github\.com/ansible\-collections/community\.general/issues/7414)\)\.
@@ -2453,7 +3106,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
[https\://github\.com/ansible\-collections/community\.general/pull/7624](https\://github\.com/ansible\-collections/community\.general/pull/7624)\)\.
* terraform \- fix multiline string handling in complex variables \([https\://github\.com/ansible\-collections/community\.general/pull/7535](https\://github\.com/ansible\-collections/community\.general/pull/7535)\)\.
-<a id="community-vmware-3"></a>
+<a id="community-vmware-6"></a>
#### community\.vmware
* vmware\_vm\_info \- Fix an AttributeError when gathering network information \([https\://github\.com/ansible\-collections/community\.vmware/pull/1919](https\://github\.com/ansible\-collections/community\.vmware/pull/1919)\)\.
@@ -2493,7 +3146,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* debug\_ldap\_client \- handle failures when attempting to get the krb5 context and default CCache rather than fail with a traceback
-<a id="netapp-ontap-5"></a>
+<a id="netapp-ontap-7"></a>
#### netapp\.ontap
* na\_ontap\_ems\_destination \- fix field error with <em class="title-reference">certificate\.name</em> for ONTAP 9\.11\.1 or later in REST\.
@@ -2537,10 +3190,10 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* ome\_diagnostics \- Issue\(279193\) \- Export of SupportAssist collection logs to the share location fails on OME version 4\.0\.0\.
* ome\_smart\_fabric\_uplink \- Issue\(186024\) \- The module supported by OpenManage Enterprise Modular\, however it does not allow the creation of multiple uplinks of the same name\. If an uplink is created using the same name as an existing uplink\, then the existing uplink is modified\.
-<a id="new-plugins-3"></a>
+<a id="new-plugins-4"></a>
### New Plugins
-<a id="filter-3"></a>
+<a id="filter-4"></a>
#### Filter
* ansible\.utils\.fact\_diff \- Find the difference between currently set facts
@@ -2555,7 +3208,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.general\.fqdn\_valid \- Validates fully\-qualified domain names against RFC 1123
-<a id="new-modules-3"></a>
+<a id="new-modules-4"></a>
### New Modules
<a id="cisco-ios-2"></a>
@@ -2565,7 +3218,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* cisco\.ios\.ios\_evpn\_global \- Resource module to configure L2VPN EVPN\.
* cisco\.ios\.ios\_vxlan\_vtep \- Resource module to configure VXLAN VTEP interface\.
-<a id="community-general-13"></a>
+<a id="community-general-17"></a>
#### community\.general
* community\.general\.git\_config\_info \- Read git configuration
@@ -2577,7 +3230,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* purestorage\.flasharray\.purefa\_hardware \- Manage FlashArray Hardware Identification
-<a id="unchanged-collections-3"></a>
+<a id="unchanged-collections-4"></a>
### Unchanged Collections
* amazon\.aws \(still version 7\.0\.0\)
@@ -2654,30 +3307,30 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="v9-0-1"></a>
## v9\.0\.1
-- <a href="#release-summary-4">Release Summary</a>
-- <a href="#ansible-core-12">Ansible\-core</a>
-- <a href="#bugfixes-4">Bugfixes</a>
-- <a href="#unchanged-collections-4">Unchanged Collections</a>
+- <a href="#release-summary-5">Release Summary</a>
+- <a href="#ansible-core-14">Ansible\-core</a>
+- <a href="#bugfixes-5">Bugfixes</a>
+- <a href="#unchanged-collections-5">Unchanged Collections</a>
-<a id="release-summary-4"></a>
+<a id="release-summary-5"></a>
### Release Summary
Release Date\: 2023\-11\-21
[Porting Guide](https\://docs\.ansible\.com/ansible/devel/porting\_guides\.html)
-<a id="ansible-core-12"></a>
+<a id="ansible-core-14"></a>
### Ansible\-core
Ansible 9\.0\.1 contains ansible\-core version 2\.16\.0\.
This is the same version of ansible\-core as in the previous Ansible release\.
-<a id="bugfixes-4"></a>
+<a id="bugfixes-5"></a>
### Bugfixes
* Fix the Python package metadata in <code>setup\.cfg</code> to require Python <code>\>\=3\.10</code> to ensure that pip can properly install <code>ansible</code> on older Python versions\.
-<a id="unchanged-collections-4"></a>
+<a id="unchanged-collections-5"></a>
### Unchanged Collections
* amazon\.aws \(still version 7\.0\.0\)
@@ -2786,13 +3439,13 @@ This is the same version of ansible\-core as in the previous Ansible release\.
<a id="v9-0-0"></a>
## v9\.0\.0
-- <a href="#release-summary-5">Release Summary</a>
+- <a href="#release-summary-6">Release Summary</a>
- <a href="#removed-collections">Removed Collections</a>
- <a href="#added-collections-1">Added Collections</a>
-- <a href="#ansible-core-13">Ansible\-core</a>
+- <a href="#ansible-core-15">Ansible\-core</a>
- <a href="#included-collections">Included Collections</a>
-- <a href="#major-changes-2">Major Changes</a>
- - <a href="#amazon-aws-7">amazon\.aws</a>
+- <a href="#major-changes-3">Major Changes</a>
+ - <a href="#amazon-aws-9">amazon\.aws</a>
- <a href="#chocolatey-chocolatey">chocolatey\.chocolatey</a>
- <a href="#cisco-ios-3">cisco\.ios</a>
- <a href="#cisco-nxos-1">cisco\.nxos</a>
@@ -2800,43 +3453,43 @@ This is the same version of ansible\-core as in the previous Ansible release\.
- <a href="#community-mysql-3">community\.mysql</a>
- <a href="#community-postgresql-4">community\.postgresql</a>
- <a href="#community-sap">community\.sap</a>
- - <a href="#community-vmware-4">community\.vmware</a>
+ - <a href="#community-vmware-7">community\.vmware</a>
- <a href="#fortinet-fortimanager-4">fortinet\.fortimanager</a>
- - <a href="#fortinet-fortios-2">fortinet\.fortios</a>
+ - <a href="#fortinet-fortios-4">fortinet\.fortios</a>
- <a href="#grafana-grafana-2">grafana\.grafana</a>
-- <a href="#minor-changes-4">Minor Changes</a>
- - <a href="#ansible-core-14">Ansible\-core</a>
- - <a href="#amazon-aws-8">amazon\.aws</a>
+- <a href="#minor-changes-5">Minor Changes</a>
+ - <a href="#ansible-core-16">Ansible\-core</a>
+ - <a href="#amazon-aws-10">amazon\.aws</a>
- <a href="#ansible-netcommon">ansible\.netcommon</a>
- <a href="#ansible-utils-1">ansible\.utils</a>
- <a href="#ansible-windows-4">ansible\.windows</a>
- <a href="#arista-eos-1">arista\.eos</a>
- <a href="#check-point-mgmt-3">check\_point\.mgmt</a>
- <a href="#chocolatey-chocolatey-1">chocolatey\.chocolatey</a>
- - <a href="#cisco-aci">cisco\.aci</a>
+ - <a href="#cisco-aci-2">cisco\.aci</a>
- <a href="#cisco-ios-4">cisco\.ios</a>
- <a href="#cisco-iosxr-1">cisco\.iosxr</a>
- - <a href="#cisco-meraki-3">cisco\.meraki</a>
- - <a href="#cisco-mso">cisco\.mso</a>
+ - <a href="#cisco-meraki-4">cisco\.meraki</a>
+ - <a href="#cisco-mso-2">cisco\.mso</a>
- <a href="#cisco-nxos-2">cisco\.nxos</a>
- - <a href="#community-aws-2">community\.aws</a>
+ - <a href="#community-aws-5">community\.aws</a>
- <a href="#community-ciscosmb">community\.ciscosmb</a>
- - <a href="#community-crypto-6">community\.crypto</a>
+ - <a href="#community-crypto-10">community\.crypto</a>
- <a href="#community-digitalocean-3">community\.digitalocean</a>
- - <a href="#community-dns-7">community\.dns</a>
- - <a href="#community-general-14">community\.general</a>
+ - <a href="#community-dns-8">community\.dns</a>
+ - <a href="#community-general-18">community\.general</a>
- <a href="#community-grafana-4">community\.grafana</a>
- <a href="#community-libvirt">community\.libvirt</a>
- <a href="#community-mysql-4">community\.mysql</a>
- <a href="#community-postgresql-5">community\.postgresql</a>
- - <a href="#community-routeros-5">community\.routeros</a>
- - <a href="#community-vmware-5">community\.vmware</a>
+ - <a href="#community-routeros-6">community\.routeros</a>
+ - <a href="#community-vmware-8">community\.vmware</a>
- <a href="#community-windows-4">community\.windows</a>
- <a href="#community-zabbix-4">community\.zabbix</a>
- - <a href="#containers-podman-3">containers\.podman</a>
+ - <a href="#containers-podman-6">containers\.podman</a>
- <a href="#dellemc-enterprise-sonic-3">dellemc\.enterprise\_sonic</a>
- <a href="#dellemc-openmanage-8">dellemc\.openmanage</a>
- - <a href="#dellemc-powerflex-3">dellemc\.powerflex</a>
+ - <a href="#dellemc-powerflex-5">dellemc\.powerflex</a>
- <a href="#dellemc-unity">dellemc\.unity</a>
- <a href="#f5networks-f5-modules-2">f5networks\.f5\_modules</a>
- <a href="#fortinet-fortimanager-5">fortinet\.fortimanager</a>
@@ -2847,11 +3500,11 @@ This is the same version of ansible\-core as in the previous Ansible release\.
- <a href="#junipernetworks-junos-1">junipernetworks\.junos</a>
- <a href="#lowlydba-sqlserver-3">lowlydba\.sqlserver</a>
- <a href="#microsoft-ad-4">microsoft\.ad</a>
- - <a href="#netapp-ontap-6">netapp\.ontap</a>
+ - <a href="#netapp-ontap-8">netapp\.ontap</a>
- <a href="#netbox-netbox-5">netbox\.netbox</a>
- <a href="#ovirt-ovirt">ovirt\.ovirt</a>
- <a href="#purestorage-flasharray-7">purestorage\.flasharray</a>
- - <a href="#purestorage-flashblade-5">purestorage\.flashblade</a>
+ - <a href="#purestorage-flashblade-6">purestorage\.flashblade</a>
- <a href="#purestorage-fusion-1">purestorage\.fusion</a>
- <a href="#sensu-sensu-go">sensu\.sensu\_go</a>
- <a href="#t-systems-mms-icinga-director">t\_systems\_mms\.icinga\_director</a>
@@ -2859,24 +3512,24 @@ This is the same version of ansible\-core as in the previous Ansible release\.
- <a href="#vultr-cloud-4">vultr\.cloud</a>
- <a href="#vyos-vyos">vyos\.vyos</a>
- <a href="#breaking-changes--porting-guide-1">Breaking Changes / Porting Guide</a>
- - <a href="#ansible-core-15">Ansible\-core</a>
- - <a href="#amazon-aws-9">amazon\.aws</a>
- - <a href="#community-aws-3">community\.aws</a>
- - <a href="#community-general-15">community\.general</a>
+ - <a href="#ansible-core-17">Ansible\-core</a>
+ - <a href="#amazon-aws-11">amazon\.aws</a>
+ - <a href="#community-aws-6">community\.aws</a>
+ - <a href="#community-general-19">community\.general</a>
- <a href="#community-hashi-vault-3">community\.hashi\_vault</a>
- - <a href="#community-vmware-6">community\.vmware</a>
+ - <a href="#community-vmware-9">community\.vmware</a>
- <a href="#dellemc-enterprise-sonic-4">dellemc\.enterprise\_sonic</a>
- <a href="#hetzner-hcloud-5">hetzner\.hcloud</a>
-- <a href="#deprecated-features-3">Deprecated Features</a>
- - <a href="#ansible-core-16">Ansible\-core</a>
- - <a href="#amazon-aws-10">amazon\.aws</a>
+- <a href="#deprecated-features-4">Deprecated Features</a>
+ - <a href="#ansible-core-18">Ansible\-core</a>
+ - <a href="#amazon-aws-12">amazon\.aws</a>
- <a href="#ansible-netcommon-1">ansible\.netcommon</a>
- <a href="#ansible-windows-5">ansible\.windows</a>
- <a href="#cisco-ios-5">cisco\.ios</a>
- <a href="#cisco-iosxr-2">cisco\.iosxr</a>
- <a href="#community-ciscosmb-1">community\.ciscosmb</a>
- - <a href="#community-crypto-7">community\.crypto</a>
- - <a href="#community-general-16">community\.general</a>
+ - <a href="#community-crypto-11">community\.crypto</a>
+ - <a href="#community-general-20">community\.general</a>
- <a href="#community-postgresql-6">community\.postgresql</a>
- <a href="#community-sap-1">community\.sap</a>
- <a href="#community-windows-5">community\.windows</a>
@@ -2885,112 +3538,112 @@ This is the same version of ansible\-core as in the previous Ansible release\.
- <a href="#purestorage-fusion-2">purestorage\.fusion</a>
- <a href="#t-systems-mms-icinga-director-1">t\_systems\_mms\.icinga\_director</a>
- <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
- - <a href="#ansible-core-17">Ansible\-core</a>
+ - <a href="#ansible-core-19">Ansible\-core</a>
- <a href="#ansible-windows-6">ansible\.windows</a>
- <a href="#cisco-ios-6">cisco\.ios</a>
- <a href="#cisco-nxos-3">cisco\.nxos</a>
- <a href="#community-ciscosmb-2">community\.ciscosmb</a>
- - <a href="#community-general-17">community\.general</a>
+ - <a href="#community-general-21">community\.general</a>
- <a href="#community-hashi-vault-4">community\.hashi\_vault</a>
- - <a href="#community-vmware-7">community\.vmware</a>
+ - <a href="#community-vmware-10">community\.vmware</a>
- <a href="#community-windows-6">community\.windows</a>
- <a href="#dellemc-openmanage-9">dellemc\.openmanage</a>
- <a href="#hetzner-hcloud-6">hetzner\.hcloud</a>
- <a href="#security-fixes-3">Security Fixes</a>
- - <a href="#ansible-core-18">Ansible\-core</a>
-- <a href="#bugfixes-5">Bugfixes</a>
- - <a href="#ansible-core-19">Ansible\-core</a>
- - <a href="#amazon-aws-11">amazon\.aws</a>
+ - <a href="#ansible-core-20">Ansible\-core</a>
+- <a href="#bugfixes-6">Bugfixes</a>
+ - <a href="#ansible-core-21">Ansible\-core</a>
+ - <a href="#amazon-aws-13">amazon\.aws</a>
- <a href="#ansible-netcommon-2">ansible\.netcommon</a>
- <a href="#ansible-utils-2">ansible\.utils</a>
- <a href="#ansible-windows-7">ansible\.windows</a>
- <a href="#arista-eos-2">arista\.eos</a>
- <a href="#check-point-mgmt-4">check\_point\.mgmt</a>
- <a href="#chocolatey-chocolatey-2">chocolatey\.chocolatey</a>
- - <a href="#cisco-aci-1">cisco\.aci</a>
+ - <a href="#cisco-aci-3">cisco\.aci</a>
- <a href="#cisco-ios-7">cisco\.ios</a>
- <a href="#cisco-iosxr-3">cisco\.iosxr</a>
- - <a href="#cisco-ise-4">cisco\.ise</a>
- - <a href="#cisco-meraki-4">cisco\.meraki</a>
- - <a href="#cisco-mso-1">cisco\.mso</a>
+ - <a href="#cisco-ise-5">cisco\.ise</a>
+ - <a href="#cisco-meraki-5">cisco\.meraki</a>
+ - <a href="#cisco-mso-3">cisco\.mso</a>
- <a href="#cisco-nxos-4">cisco\.nxos</a>
- <a href="#cloud-common">cloud\.common</a>
- <a href="#cloudscale-ch-cloud-1">cloudscale\_ch\.cloud</a>
- - <a href="#community-aws-4">community\.aws</a>
+ - <a href="#community-aws-7">community\.aws</a>
- <a href="#community-ciscosmb-3">community\.ciscosmb</a>
- - <a href="#community-crypto-8">community\.crypto</a>
+ - <a href="#community-crypto-12">community\.crypto</a>
- <a href="#community-digitalocean-4">community\.digitalocean</a>
- - <a href="#community-dns-8">community\.dns</a>
- - <a href="#community-docker-9">community\.docker</a>
- - <a href="#community-general-18">community\.general</a>
+ - <a href="#community-dns-9">community\.dns</a>
+ - <a href="#community-docker-11">community\.docker</a>
+ - <a href="#community-general-22">community\.general</a>
- <a href="#community-grafana-5">community\.grafana</a>
- <a href="#community-hashi-vault-5">community\.hashi\_vault</a>
- - <a href="#community-hrobot-3">community\.hrobot</a>
+ - <a href="#community-hrobot-4">community\.hrobot</a>
- <a href="#community-libvirt-1">community\.libvirt</a>
- <a href="#community-mysql-5">community\.mysql</a>
- <a href="#community-network">community\.network</a>
- <a href="#community-postgresql-7">community\.postgresql</a>
- - <a href="#community-routeros-6">community\.routeros</a>
+ - <a href="#community-routeros-7">community\.routeros</a>
- <a href="#community-sops">community\.sops</a>
- - <a href="#community-vmware-8">community\.vmware</a>
+ - <a href="#community-vmware-11">community\.vmware</a>
- <a href="#community-windows-7">community\.windows</a>
- <a href="#community-zabbix-5">community\.zabbix</a>
- - <a href="#containers-podman-4">containers\.podman</a>
+ - <a href="#containers-podman-7">containers\.podman</a>
- <a href="#dellemc-enterprise-sonic-5">dellemc\.enterprise\_sonic</a>
- <a href="#dellemc-openmanage-10">dellemc\.openmanage</a>
- <a href="#f5networks-f5-modules-3">f5networks\.f5\_modules</a>
- <a href="#fortinet-fortimanager-6">fortinet\.fortimanager</a>
- - <a href="#fortinet-fortios-3">fortinet\.fortios</a>
+ - <a href="#fortinet-fortios-5">fortinet\.fortios</a>
- <a href="#google-cloud-2">google\.cloud</a>
- <a href="#hetzner-hcloud-7">hetzner\.hcloud</a>
- <a href="#junipernetworks-junos-3">junipernetworks\.junos</a>
- <a href="#microsoft-ad-6">microsoft\.ad</a>
- - <a href="#netapp-ontap-7">netapp\.ontap</a>
+ - <a href="#netapp-ontap-9">netapp\.ontap</a>
- <a href="#netbox-netbox-6">netbox\.netbox</a>
- <a href="#ovirt-ovirt-1">ovirt\.ovirt</a>
- <a href="#purestorage-flasharray-8">purestorage\.flasharray</a>
- - <a href="#purestorage-flashblade-6">purestorage\.flashblade</a>
+ - <a href="#purestorage-flashblade-7">purestorage\.flashblade</a>
- <a href="#purestorage-fusion-3">purestorage\.fusion</a>
- <a href="#t-systems-mms-icinga-director-2">t\_systems\_mms\.icinga\_director</a>
- <a href="#theforeman-foreman-3">theforeman\.foreman</a>
- <a href="#vultr-cloud-5">vultr\.cloud</a>
- <a href="#vyos-vyos-1">vyos\.vyos</a>
- <a href="#known-issues-2">Known Issues</a>
- - <a href="#ansible-core-20">Ansible\-core</a>
- - <a href="#community-crypto-9">community\.crypto</a>
- - <a href="#community-dns-9">community\.dns</a>
- - <a href="#community-docker-10">community\.docker</a>
- - <a href="#community-general-19">community\.general</a>
- - <a href="#community-hrobot-4">community\.hrobot</a>
- - <a href="#community-routeros-7">community\.routeros</a>
+ - <a href="#ansible-core-22">Ansible\-core</a>
+ - <a href="#community-crypto-13">community\.crypto</a>
+ - <a href="#community-dns-10">community\.dns</a>
+ - <a href="#community-docker-12">community\.docker</a>
+ - <a href="#community-general-23">community\.general</a>
+ - <a href="#community-hrobot-5">community\.hrobot</a>
+ - <a href="#community-routeros-8">community\.routeros</a>
- <a href="#community-sops-1">community\.sops</a>
- <a href="#dellemc-openmanage-11">dellemc\.openmanage</a>
-- <a href="#new-plugins-4">New Plugins</a>
+- <a href="#new-plugins-5">New Plugins</a>
- <a href="#cliconf">Cliconf</a>
- - <a href="#filter-4">Filter</a>
+ - <a href="#filter-5">Filter</a>
- <a href="#inventory">Inventory</a>
- <a href="#lookup-2">Lookup</a>
-- <a href="#new-modules-4">New Modules</a>
- - <a href="#amazon-aws-12">amazon\.aws</a>
+- <a href="#new-modules-5">New Modules</a>
+ - <a href="#amazon-aws-14">amazon\.aws</a>
- <a href="#cisco-ios-8">cisco\.ios</a>
- <a href="#cisco-iosxr-4">cisco\.iosxr</a>
- <a href="#cisco-nxos-5">cisco\.nxos</a>
- <a href="#cloudscale-ch-cloud-2">cloudscale\_ch\.cloud</a>
- - <a href="#community-aws-5">community\.aws</a>
- - <a href="#community-dns-10">community\.dns</a>
- - <a href="#community-general-20">community\.general</a>
+ - <a href="#community-aws-8">community\.aws</a>
+ - <a href="#community-dns-11">community\.dns</a>
+ - <a href="#community-general-24">community\.general</a>
- <a href="#community-grafana-6">community\.grafana</a>
- - <a href="#community-vmware-9">community\.vmware</a>
+ - <a href="#community-vmware-12">community\.vmware</a>
- <a href="#community-zabbix-6">community\.zabbix</a>
- - <a href="#containers-podman-5">containers\.podman</a>
+ - <a href="#containers-podman-8">containers\.podman</a>
- <a href="#dellemc-enterprise-sonic-6">dellemc\.enterprise\_sonic</a>
- <a href="#dellemc-openmanage-12">dellemc\.openmanage</a>
- - <a href="#dellemc-powerflex-4">dellemc\.powerflex</a>
+ - <a href="#dellemc-powerflex-6">dellemc\.powerflex</a>
- <a href="#dellemc-unity-1">dellemc\.unity</a>
- <a href="#f5networks-f5-modules-4">f5networks\.f5\_modules</a>
- <a href="#fortinet-fortimanager-7">fortinet\.fortimanager</a>
- <a href="#inspur-ispim-2">inspur\.ispim</a>
- - <a href="#netapp-ontap-8">netapp\.ontap</a>
+ - <a href="#netapp-ontap-10">netapp\.ontap</a>
- <a href="#netbox-netbox-7">netbox\.netbox</a>
- <a href="#ngine-io-exoscale">ngine\_io\.exoscale</a>
- <a href="#purestorage-flasharray-9">purestorage\.flasharray</a>
@@ -2999,9 +3652,9 @@ This is the same version of ansible\-core as in the previous Ansible release\.
- <a href="#theforeman-foreman-4">theforeman\.foreman</a>
- <a href="#vultr-cloud-6">vultr\.cloud</a>
- <a href="#new-roles">New Roles</a>
-- <a href="#unchanged-collections-5">Unchanged Collections</a>
+- <a href="#unchanged-collections-6">Unchanged Collections</a>
-<a id="release-summary-5"></a>
+<a id="release-summary-6"></a>
### Release Summary
\[YANKED\] Release Date\: 2023\-11\-21 [Porting Guide](https\://docs\.ansible\.com/ansible/devel/porting\_guides\.html)
@@ -3022,7 +3675,7 @@ This is the same version of ansible\-core as in the previous Ansible release\.
* ibm\.storage\_virtualize \(version 2\.1\.0\)
* telekom\_mms\.icinga\_director \(version 1\.34\.1\)
-<a id="ansible-core-13"></a>
+<a id="ansible-core-15"></a>
### Ansible\-core
Ansible 9\.0\.0 contains ansible\-core version 2\.16\.0\.
@@ -3118,10 +3771,10 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
| vyos.vyos | 4.0.2 | 4.1.0 | |
| wti.remote | 1.0.4 | 1.0.5 | Unfortunately, this collection does not provide changelog data in a format that can be processed by the changelog generator. |
-<a id="major-changes-2"></a>
+<a id="major-changes-3"></a>
### Major Changes
-<a id="amazon-aws-7"></a>
+<a id="amazon-aws-9"></a>
#### amazon\.aws
* aws\_region\_info \- The module has been migrated from the <code>community\.aws</code> collection\. Playbooks using the Fully Qualified Collection Name for this module should be updated to use <code>amazon\.aws\.aws\_region\_info</code>\.
@@ -3181,7 +3834,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* all modules \- everything is now a redirect to the new collection community\.sap\_libs
-<a id="community-vmware-4"></a>
+<a id="community-vmware-7"></a>
#### community\.vmware
* vmware\_vasa \- added a new module to register/unregister a VASA provider
@@ -3193,7 +3846,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Support all FortiManager versions in 6\.2\, 6\.4\, 7\.0\, 7\.2 and 7\.4\. 139 new modules\.
* Support token based authentication\.
-<a id="fortinet-fortios-2"></a>
+<a id="fortinet-fortios-4"></a>
#### fortinet\.fortios
* Add new fortios version 7\.4\.1\.
@@ -3218,12 +3871,12 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Grafana Plugins support on\-prem Grafana installation by \@ishanjainn
* Updated Service for flow mode by \@bentonam
-<a id="minor-changes-4"></a>
+<a id="minor-changes-5"></a>
### Minor Changes
* Move setuptools configuration into the declarative <code>setup\.cfg</code> format\. <code>ansible</code> sdists still contain a stub <code>setup\.py</code> file\, but we recommend that users move to tools like pip and build and the PEP 517 interface instead of setuptools\' deprecated <code>setup\.py</code> interface \([https\://github\.com/ansible\-community/antsibull/pull/530](https\://github\.com/ansible\-community/antsibull/pull/530)\)\.
-<a id="ansible-core-14"></a>
+<a id="ansible-core-16"></a>
#### Ansible\-core
* Add Python type hints to the Display class \([https\://github\.com/ansible/ansible/issues/80841](https\://github\.com/ansible/ansible/issues/80841)\)
@@ -3320,7 +3973,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* user \- add new option <code>password\_expire\_warn</code> \(supported on Linux only\) to set the number of days of warning before a password change is required \([https\://github\.com/ansible/ansible/issues/79882](https\://github\.com/ansible/ansible/issues/79882)\)\.
* yum\_repository \- Align module documentation with parameters
-<a id="amazon-aws-8"></a>
+<a id="amazon-aws-10"></a>
#### amazon\.aws
* amazon\.aws collection \- apply isort code formatting to ensure consistent formatting of code \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1771](https\://github\.com/ansible\-collections/amazon\.aws/pull/1771)\)\.
@@ -3393,7 +4046,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* All modules \- Ensure modules are compatible with both Chocolatey CLI v2\.x and v1\.x
* win\_chocolatey \- Improve error messages when installation of Chocolatey CLI v2\.x fails due to unmet \.NET Framework 4\.8 dependency on client
-<a id="cisco-aci"></a>
+<a id="cisco-aci-2"></a>
#### cisco\.aci
* Add 8\.0 option for dvs\_version attribute in aci\_vmm\_controller
@@ -3467,7 +4120,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* iosxr\_facts \- Add CPU utilization\.
* iosxr\_l2\_interfaces \- fix issue in supporting multiple iosxr version\. \([https\://github\.com/ansible\-collections/cisco\.iosxr/issues/379](https\://github\.com/ansible\-collections/cisco\.iosxr/issues/379)\)\.
-<a id="cisco-meraki-3"></a>
+<a id="cisco-meraki-4"></a>
#### cisco\.meraki
* administered\_identities\_me\_info \- new plugin\.
@@ -3900,7 +4553,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* organizations\_webhooks\_logs\_info \- new plugin\.
* organizations\_wireless\_devices\_ethernet\_statuses\_info \- new plugin\.
-<a id="cisco-mso"></a>
+<a id="cisco-mso-2"></a>
#### cisco\.mso
* Add login domain attribute to mso httpapi connection plugin with restructure of connection parameter handling
@@ -3920,7 +4573,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* nxos\_user \- Added dev\-ops role to BUILTINS \([https\://github\.com/ansible\-collections/cisco\.nxos/issues/690](https\://github\.com/ansible\-collections/cisco\.nxos/issues/690)\)
* route\_maps \- support extcommunity rt option \([https\://github\.com/ansible\-collections/cisco\.nxos/issues/743](https\://github\.com/ansible\-collections/cisco\.nxos/issues/743)\)\.
-<a id="community-aws-2"></a>
+<a id="community-aws-5"></a>
#### community\.aws
* api\_gateway \- add support for parameters <code>name</code>\, <code>lookup</code>\, <code>tags</code> and <code>purge\_tags</code> \([https\://github\.com/ansible\-collections/community\.aws/pull/1845](https\://github\.com/ansible\-collections/community\.aws/pull/1845)\)\.
@@ -3944,7 +4597,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* removed unused portion of code in cliconf/ciscosmb\.yml
* test Ansible 2\.14
-<a id="community-crypto-6"></a>
+<a id="community-crypto-10"></a>
#### community\.crypto
* acme\_certificate \- allow to use no challenge by providing <code>no challenge</code> for the <code>challenge</code> option\. This is needed for ACME servers where validation is done without challenges \([https\://github\.com/ansible\-collections/community\.crypto/issues/613](https\://github\.com/ansible\-collections/community\.crypto/issues/613)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/615](https\://github\.com/ansible\-collections/community\.crypto/pull/615)\)\.
@@ -3964,13 +4617,13 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* tests \- run C\(psf/black\) across all files \([https\://github\.com/ansible\-collections/community\.digitalocean/pull/310](https\://github\.com/ansible\-collections/community\.digitalocean/pull/310)\)\.
* tests \- test against Ansible Core 2\.12\, 2\.13\, and 2\.14 \([https\://github\.com/ansible\-collections/community\.digitalocean/pull/310](https\://github\.com/ansible\-collections/community\.digitalocean/pull/310)\)\.
-<a id="community-dns-7"></a>
+<a id="community-dns-8"></a>
#### community\.dns
* wait\_for\_txt \- add <code>servfail\_retries</code> parameter that allows retrying after SERVFAIL errors \([https\://github\.com/ansible\-collections/community\.dns/pull/159](https\://github\.com/ansible\-collections/community\.dns/pull/159)\)\.
* wait\_for\_txt\, resolver module utils \- use [EDNS](https\://en\.wikipedia\.org/wiki/Extension\_Mechanisms\_for\_DNS) \([https\://github\.com/ansible\-collections/community\.dns/pull/158](https\://github\.com/ansible\-collections/community\.dns/pull/158)\)\.
-<a id="community-general-14"></a>
+<a id="community-general-18"></a>
#### community\.general
* The collection will start using semantic markup \([https\://github\.com/ansible\-collections/community\.general/pull/6539](https\://github\.com/ansible\-collections/community\.general/pull/6539)\)\.
@@ -4139,7 +4792,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* postgresql\_privs \- added support for implicit roles CURRENT\_ROLE\, CURRENT\_USER\, and SESSION\_USER \([https\://github\.com/ansible\-collections/community\.postgresql/pull/502](https\://github\.com/ansible\-collections/community\.postgresql/pull/502)\)\.
* postgresql\_tablespace \- added idempotence when dropping a non\-existing tablespace \([https\://github\.com/ansible\-collections/community\.postgresql/pull/554](https\://github\.com/ansible\-collections/community\.postgresql/pull/554)\)\.
-<a id="community-routeros-5"></a>
+<a id="community-routeros-6"></a>
#### community\.routeros
* api\_info \- add new <code>include\_read\_only</code> option to select behavior for read\-only values\. By default these are not returned \([https\://github\.com/ansible\-collections/community\.routeros/pull/213](https\://github\.com/ansible\-collections/community\.routeros/pull/213)\)\.
@@ -4165,7 +4818,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* api\_modify \- add new <code>handle\_read\_only</code> and <code>handle\_write\_only</code> options to handle the module\'s behavior for read\-only and write\-only fields \([https\://github\.com/ansible\-collections/community\.routeros/pull/213](https\://github\.com/ansible\-collections/community\.routeros/pull/213)\)\.
* api\_modify\, api\_info \- support API paths <code>routing id</code>\, <code>routing bgp connection</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/220](https\://github\.com/ansible\-collections/community\.routeros/pull/220)\)\.
-<a id="community-vmware-5"></a>
+<a id="community-vmware-8"></a>
#### community\.vmware
* Removed module / plugin documentation RST files from the repository \([https\://github\.com/ansible\-collections/community\.vmware/pull/1897](https\://github\.com/ansible\-collections/community\.vmware/pull/1897)\)\.
@@ -4206,7 +4859,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* zabbix\_settings module added
* zabbix\_token module added
-<a id="containers-podman-3"></a>
+<a id="containers-podman-6"></a>
#### containers\.podman
* Update docs
@@ -4305,7 +4958,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Role <code>idrac\_os\_deployment</code> is enhanced to remove the auto installation of required libraries and to support custom ISO and kickstart file as input\.
* Updated the idrac\_gather\_facts role to use jinja template filters\.
-<a id="dellemc-powerflex-3"></a>
+<a id="dellemc-powerflex-5"></a>
#### dellemc\.powerflex
* Added Ansible role to support creation and deletion of protection domain\, storage pool and fault set\.
@@ -4460,7 +5113,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* microsoft\.ad\.ldap \- Added the option <code>filter\_without\_computer</code> to not add the AND clause <code>objectClass\=computer</code> to the final filter used \- [https\://github\.com/ansible\-collections/microsoft\.ad/issues/55](https\://github\.com/ansible\-collections/microsoft\.ad/issues/55)
* microsoft\.ad\.ldap \- Allow setting LDAP connection and authentication options through environment variables \- [https\://github\.com/ansible\-collections/microsoft\.ad/issues/34](https\://github\.com/ansible\-collections/microsoft\.ad/issues/34)
-<a id="netapp-ontap-6"></a>
+<a id="netapp-ontap-8"></a>
#### netapp\.ontap
* na\_ontap\_broadcast\_domain \- changed documentation for ipspace as it is required while using REST\.
@@ -4526,7 +5179,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* purefa\_snap \- Added new parameter to support snapshot throttling
* purefa\_vg \- Add rename parameter
-<a id="purestorage-flashblade-5"></a>
+<a id="purestorage-flashblade-6"></a>
#### purestorage\.flashblade
* purefb\_bucket\_replica \- Added support for cascading replica links
@@ -4619,14 +5272,14 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="breaking-changes--porting-guide-1"></a>
### Breaking Changes / Porting Guide
-<a id="ansible-core-15"></a>
+<a id="ansible-core-17"></a>
#### Ansible\-core
* Any plugin using the config system and the <em class="title-reference">cli</em> entry to use the <em class="title-reference">timeout</em> from the command line\, will see the value change if the use had configured it in any of the lower precedence methods\. If relying on this behaviour to consume the global/generic timeout from the DEFAULT\_TIMEOUT constant\, please consult the documentation on plugin configuration to add the overlaping entries\.
* ansible\-test \- Test plugins that rely on containers no longer support reusing running containers\. The previous behavior was an undocumented\, untested feature\.
* service module will not permanently configure variables/flags for openbsd when doing enable/disable operation anymore\, this module was never meant to do this type of work\, just to manage the service state itself\. A rcctl\_config or similar module should be created and used instead\.
-<a id="amazon-aws-9"></a>
+<a id="amazon-aws-11"></a>
#### amazon\.aws
* The amazon\.aws collection has dropped support for <code>botocore\<1\.29\.0</code> and <code>boto3\<1\.26\.0</code>\. Most modules will continue to work with older versions of the AWS SDK\, however compatability with older versions of the SDK is not guaranteed and will not be tested\. When using older versions of the SDK a warning will be emitted by Ansible \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1763](https\://github\.com/ansible\-collections/amazon\.aws/pull/1763)\)\.
@@ -4634,7 +5287,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* module\_utils \- <code>module\_utils\.urls</code> was previously deprecated and has been removed \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1540](https\://github\.com/ansible\-collections/amazon\.aws/pull/1540)\)\.
* module\_utils\.\_version \- vendored copy of distutils\.version has been dropped \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1587](https\://github\.com/ansible\-collections/amazon\.aws/pull/1587)\)\.
-<a id="community-aws-3"></a>
+<a id="community-aws-6"></a>
#### community\.aws
* The community\.aws collection has dropped support for <code>botocore\<1\.29\.0</code> and <code>boto3\<1\.26\.0</code>\. Most modules will continue to work with older versions of the AWS SDK\, however compatability with older versions of the SDK is not guaranteed and will not be tested\. When using older versions of the SDK a warning will be emitted by Ansible \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1763](https\://github\.com/ansible\-collections/amazon\.aws/pull/1763)\)\.
@@ -4652,7 +5305,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* s3\_bucket\_info \- The module has been migrated from the <code>community\.aws</code> collection\. Playbooks using the Fully Qualified Collection Name for this module should be updated to use <code>amazon\.aws\.s3\_bucket\_info</code>\.
* sts\_assume\_role \- The module has been migrated from the <code>community\.aws</code> collection\. Playbooks using the Fully Qualified Collection Name for this module should be updated to use <code>amazon\.aws\.sts\_assume\_role</code>\.
-<a id="community-general-15"></a>
+<a id="community-general-19"></a>
#### community\.general
* collection\_version lookup plugin \- remove compatibility code for ansible\-base 2\.10 and ansible\-core 2\.11 \([https\://github\.com/ansible\-collections/community\.general/pull/7269](https\://github\.com/ansible\-collections/community\.general/pull/7269)\)\.
@@ -4666,7 +5319,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* The minimum required version of <code>hvac</code> is now <code>1\.2\.1</code> \([https\://docs\.ansible\.com/ansible/devel/collections/community/hashi\_vault/docsite/user\_guide\.html\#hvac\-version\-specifics](https\://docs\.ansible\.com/ansible/devel/collections/community/hashi\_vault/docsite/user\_guide\.html\#hvac\-version\-specifics)\)\.
-<a id="community-vmware-6"></a>
+<a id="community-vmware-9"></a>
#### community\.vmware
* Removed support for ansible\-core version \< 2\.15\.0\.
@@ -4687,7 +5340,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* hcloud\-python 1\.20\.0 is now required for full compatibility
* inventory plugin \- Don\'t set the server image variables \(<em class="title-reference">image\_id</em>\, <em class="title-reference">image\_os\_flavor</em> and <em class="title-reference">image\_name</em>\) when the server image is not defined\.
-<a id="deprecated-features-3"></a>
+<a id="deprecated-features-4"></a>
### Deprecated Features
* The <code>community\.azure</code> collection is officially unmaintained and has been archived\. Therefore\, it will be removed from Ansible 10\. There is already a successor collection <code>azure\.azcollection</code> in the community package which should cover the same functionality \([https\://github\.com/ansible\-community/community\-topics/issues/263](https\://github\.com/ansible\-community/community\-topics/issues/263)\)\.
@@ -4699,7 +5352,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* The netapp\.elementsw collection is considered unmaintained and will be removed from Ansible 10 if no one starts maintaining it again before Ansible 10\. See [the removal process for details on how this works](https\://github\.com/ansible\-collections/overview/blob/main/removal\_from\_ansible\.rst\#cancelling\-removal\-of\-an\-unmaintained\-collection) \([https\://github\.com/ansible\-community/community\-topics/issues/235](https\://github\.com/ansible\-community/community\-topics/issues/235)\)\.
* The netapp\.um\_info collection is considered unmaintained and will be removed from Ansible 10 if no one starts maintaining it again before Ansible 10\. See [the removal process for details on how this works](https\://github\.com/ansible\-collections/overview/blob/main/removal\_from\_ansible\.rst\#cancelling\-removal\-of\-an\-unmaintained\-collection) \([https\://github\.com/ansible\-community/community\-topics/issues/244](https\://github\.com/ansible\-community/community\-topics/issues/244)\)\.
-<a id="ansible-core-16"></a>
+<a id="ansible-core-18"></a>
#### Ansible\-core
* Deprecated ini config option <code>collections\_paths</code>\, use the singular form <code>collections\_path</code> instead
@@ -4711,7 +5364,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* vault and unfault filters \- the undocumented <code>vaultid</code> parameter is deprecated and will be removed in ansible\-core 2\.20\. Use <code>vault\_id</code> instead\.
* yum\_repository \- deprecated parameter \'keepcache\' \([https\://github\.com/ansible/ansible/issues/78693](https\://github\.com/ansible/ansible/issues/78693)\)\.
-<a id="amazon-aws-10"></a>
+<a id="amazon-aws-12"></a>
#### amazon\.aws
* ec2\_instance \- deprecation of <code>tenancy</code> and <code>placement\_group</code> in favor of <code>placement</code> attribute \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1825](https\://github\.com/ansible\-collections/amazon\.aws/pull/1825)\)\.
@@ -4749,12 +5402,12 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* support for Python 2\.6 nad 2\.7
* support for ansible 2\.9
-<a id="community-crypto-7"></a>
+<a id="community-crypto-11"></a>
#### community\.crypto
* get\_certificate \- the default <code>false</code> of the <code>asn1\_base64</code> option is deprecated and will change to <code>true</code> in community\.crypto 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.crypto/pull/600](https\://github\.com/ansible\-collections/community\.crypto/pull/600)\)\.
-<a id="community-general-16"></a>
+<a id="community-general-20"></a>
#### community\.general
* CmdRunner module utils \- deprecate <code>cmd\_runner\_fmt\.as\_default\_type\(\)</code> formatter \([https\://github\.com/ansible\-collections/community\.general/pull/6601](https\://github\.com/ansible\-collections/community\.general/pull/6601)\)\.
@@ -4876,7 +5529,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* <code>community\.google</code> was considered unmaintained and removed from Ansible 9 as per the [removal from Ansible process](https\://github\.com/ansible\-collections/overview/blob/main/removal\_from\_ansible\.rst\#unmaintained\-collections)\. Users can still install this collection with <code>ansible\-galaxy collection install community\.google</code>\.
* <code>community\.skydive</code> was considered unmaintained and removed from Ansible 9 as per the [removal from Ansible process](https\://github\.com/ansible\-collections/overview/blob/main/removal\_from\_ansible\.rst\#unmaintained\-collections)\. Users can still install this collection with <code>ansible\-galaxy collection install community\.skydive</code>\.
-<a id="ansible-core-17"></a>
+<a id="ansible-core-19"></a>
#### Ansible\-core
* ActionBase \- remove deprecated <code>\_remote\_checksum</code> method
@@ -4928,7 +5581,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* remove testing for Python 2\.6 nad 2\.7
* remove testing for ansible 2\.9
-<a id="community-general-17"></a>
+<a id="community-general-21"></a>
#### community\.general
* The collection no longer supports ansible\-core 2\.11 and ansible\-core 2\.12\. Parts of the collection might still work on these ansible\-core versions\, but others might not \([https\://github\.com/ansible\-collections/community\.general/pull/7269](https\://github\.com/ansible\-collections/community\.general/pull/7269)\)\.
@@ -4951,7 +5604,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* The minimum supported version of <code>ansible\-core</code> is now <code>2\.14</code>\, support for <code>2\.13</code> has been dropped \([https\://github\.com/ansible\-collections/community\.hashi\_vault/pull/403](https\://github\.com/ansible\-collections/community\.hashi\_vault/pull/403)\)\.
-<a id="community-vmware-7"></a>
+<a id="community-vmware-10"></a>
#### community\.vmware
* Removed module util <em class="title-reference">version</em> \([https\://github\.com/ansible\-collections/community\.vmware/issues/1639](https\://github\.com/ansible\-collections/community\.vmware/issues/1639)\)\.
@@ -4989,15 +5642,15 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="security-fixes-3"></a>
### Security Fixes
-<a id="ansible-core-18"></a>
+<a id="ansible-core-20"></a>
#### Ansible\-core
* ansible\-galaxy \- Prevent roles from using symlinks to overwrite files outside of the installation directory \(CVE\-2023\-5115\)
-<a id="bugfixes-5"></a>
+<a id="bugfixes-6"></a>
### Bugfixes
-<a id="ansible-core-19"></a>
+<a id="ansible-core-21"></a>
#### Ansible\-core
* Allow for searching handler subdir for included task via include\_role \([https\://github\.com/ansible/ansible/issues/81722](https\://github\.com/ansible/ansible/issues/81722)\)
@@ -5147,7 +5800,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* win\_fetch \- Add support for using file with wildcards in file name\. \([https\://github\.com/ansible/ansible/issues/73128](https\://github\.com/ansible/ansible/issues/73128)\)
* winrm \- Better handle send input failures when communicating with hosts under load
-<a id="amazon-aws-11"></a>
+<a id="amazon-aws-13"></a>
#### amazon\.aws
* autoscaling\_group \- fix ValidationError when describing an autoscaling group that has more than 20 target groups attached to it by breaking the request into chunks \([https\://github\.com/ansible\-collections/amazon\.aws/pull/1593](https\://github\.com/ansible\-collections/amazon\.aws/pull/1593)\)\.
@@ -5218,7 +5871,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* win\-chocolatey \- unable to install packages if a license is already installed and chocolatey\.extension is not installed
-<a id="cisco-aci-1"></a>
+<a id="cisco-aci-3"></a>
#### cisco\.aci
* Change input of prefix\_suppression to type string to allow enable\, disable and inherit options for aci\_interface\_policy\_ospf
@@ -5264,7 +5917,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* l2\_interfaces Fix issue in qvlan parsing\.\([https\://github\.com/ansible\-collections/cisco\.iosxr/issues/403](https\://github\.com/ansible\-collections/cisco\.iosxr/issues/403)\)
* l3\_interfaces \- Fix issue in <code>gather</code> state of not gathering management interface\. \([https\://github\.com/ansible\-collections/cisco\.iosxr/issues/381](https\://github\.com/ansible\-collections/cisco\.iosxr/issues/381)\)
-<a id="cisco-ise-4"></a>
+<a id="cisco-ise-5"></a>
#### cisco\.ise
* Cannot get cisco\.ise\.active\_directory\_groups\_by\_domain\_info to work\.
@@ -5275,7 +5928,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* system\_certificate \- added support for none value in the used\_by param\.
* system\_certificate \- fixed get\_object\_by\_id response\.
-<a id="cisco-meraki-4"></a>
+<a id="cisco-meraki-5"></a>
#### cisco\.meraki
* Adding condition to avoid error on exists on devices\.
@@ -5316,7 +5969,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* meraki\_devices \- Fix endpoints due to breaking change in Meraki API v1\.33
* runtime updated requires\_ansible from 2\.9\.10 to \'\>\=2\.14\.0\'\.
-<a id="cisco-mso-1"></a>
+<a id="cisco-mso-3"></a>
#### cisco\.mso
* Fix mso\_tenant\_site \"site not found\" issue on absent \(\#368\)
@@ -5350,7 +6003,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Add missing modules to the \"cloudscale\_ch\.cloud\.cloudscale\" action group\.
* Remove outdated Ansible version requirement from the README\.
-<a id="community-aws-4"></a>
+<a id="community-aws-7"></a>
#### community\.aws
* Remove <code>apigateway</code> and <code>apigateway\_deployment</code> from meta/runtime\.yml \([https\://github\.com/ansible\-collections/community\.aws/pull/1905](https\://github\.com/ansible\-collections/community\.aws/pull/1905)\)\.
@@ -5373,7 +6026,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* added Cisco device config guide to address issue
* added extra \"n\" to sending commands to address issue
-<a id="community-crypto-8"></a>
+<a id="community-crypto-12"></a>
#### community\.crypto
* Fix PEM detection/identification to also accept random other lines before the line starting with <code>\-\-\-\-\-BEGIN</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/627](https\://github\.com/ansible\-collections/community\.crypto/issues/627)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/628](https\://github\.com/ansible\-collections/community\.crypto/pull/628)\)\.
@@ -5387,14 +6040,14 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* digital\_ocean\_domain \- fix <code>all\_domains</code> by using <code>get\_paginated\_data</code> to retrieve all of the domains in the account from the paginated domains api endpoint \([https\://github\.com/ansible\-collections/community\.digitalocean/pull/307](https\://github\.com/ansible\-collections/community\.digitalocean/pull/307)\)\.
-<a id="community-dns-8"></a>
+<a id="community-dns-9"></a>
#### community\.dns
* HTTP module utils \- make compatible with ansible\-core 2\.17 \([https\://github\.com/ansible\-collections/community\.dns/pull/165](https\://github\.com/ansible\-collections/community\.dns/pull/165)\)\.
* Update Public Suffix List\.
* wait\_for\_txt\, resolver module utils \- improve error handling \([https\://github\.com/ansible\-collections/community\.dns/pull/158](https\://github\.com/ansible\-collections/community\.dns/pull/158)\)\.
-<a id="community-docker-9"></a>
+<a id="community-docker-11"></a>
#### community\.docker
* docker\_swarm \- make init and join operations work again with Docker SDK for Python before 4\.0\.0 \([https\://github\.com/ansible\-collections/community\.docker/issues/695](https\://github\.com/ansible\-collections/community\.docker/issues/695)\, [https\://github\.com/ansible\-collections/community\.docker/pull/696](https\://github\.com/ansible\-collections/community\.docker/pull/696)\)\.
@@ -5402,7 +6055,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* docker\_volume \- fix crash caused by accessing an empty dictionary\. The <code>has\_different\_config\(\)</code> was raising an <code>AttributeError</code> because the <code>self\.existing\_volume\[\"Labels\"\]</code> dictionary was <code>None</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/702](https\://github\.com/ansible\-collections/community\.docker/pull/702)\)\.
* vendored Docker SDK for Python code \- cherry\-pick changes from the Docker SDK for Python code to align code\. These changes should not affect the parts used by the collection\'s code \([https\://github\.com/ansible\-collections/community\.docker/pull/694](https\://github\.com/ansible\-collections/community\.docker/pull/694)\)\.
-<a id="community-general-18"></a>
+<a id="community-general-22"></a>
#### community\.general
* CmdRunner module utils \- does not attempt to resolve path if executable is a relative or absolute path \([https\://github\.com/ansible\-collections/community\.general/pull/7200](https\://github\.com/ansible\-collections/community\.general/pull/7200)\)\.
@@ -5503,7 +6156,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* vault\_write \- the <code>vault\_write</code> lookup and module were not able to write data containing keys named <code>path</code> or <code>wrap\_ttl</code> due to a bug in the <code>hvac</code> library\. These plugins have now been updated to take advantage of fixes in <code>hvac\>\=1\.2</code> to address this \([https\://github\.com/ansible\-collections/community\.hashi\_vault/issues/389](https\://github\.com/ansible\-collections/community\.hashi\_vault/issues/389)\)\.
-<a id="community-hrobot-3"></a>
+<a id="community-hrobot-4"></a>
#### community\.hrobot
* Show more information \(if available\) from error messages \([https\://github\.com/ansible\-collections/community\.hrobot/pull/89](https\://github\.com/ansible\-collections/community\.hrobot/pull/89)\)\.
@@ -5544,7 +6197,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* postgresql\_set \- fixed GUC\_LIST\_QUOTE parameters \([https\://github\.com/ansible\-collections/community\.postgresql/pull/521](https\://github\.com/ansible\-collections/community\.postgresql/pull/521)\)\.
* postgresql\_set \- fixed error message in param\_set function \([https\://github\.com/ansible\-collections/community\.postgresql/pull/505](https\://github\.com/ansible\-collections/community\.postgresql/pull/505)\)\.
-<a id="community-routeros-6"></a>
+<a id="community-routeros-7"></a>
#### community\.routeros
* api\_info\, api\_modify \- in the <code>snmp</code> path\, ensure that <code>engine\-id\-suffix</code> is only available on RouterOS 7\.10\+\, and that <code>engine\-id</code> is read\-only on RouterOS 7\.10\+ \([https\://github\.com/ansible\-collections/community\.routeros/issues/208](https\://github\.com/ansible\-collections/community\.routeros/issues/208)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/218](https\://github\.com/ansible\-collections/community\.routeros/pull/218)\)\.
@@ -5562,7 +6215,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* install role \- make sure that the <code>pkg\_mgr</code> fact is definitely available when installing on <code>localhost</code>\. This can improve error messages in some cases \([https\://github\.com/ansible\-collections/community\.sops/issues/145](https\://github\.com/ansible\-collections/community\.sops/issues/145)\, [https\://github\.com/ansible\-collections/community\.sops/pull/146](https\://github\.com/ansible\-collections/community\.sops/pull/146)\)\.
* sops\_encrypt \- ensure that output\-type is set to <code>yaml</code> when the file extension <code>\.yml</code> is used\. Now both <code>\.yaml</code> and <code>\.yml</code> files use the SOPS <code>\-\-output\-type\=yaml</code> formatting \([https\://github\.com/ansible\-collections/community\.sops/issues/164](https\://github\.com/ansible\-collections/community\.sops/issues/164)\)\.
-<a id="community-vmware-8"></a>
+<a id="community-vmware-11"></a>
#### community\.vmware
* Add missing modules to runtime\.yml \([https\://github\.com/ansible\-collections/community\.vmware/pull/1764](https\://github\.com/ansible\-collections/community\.vmware/pull/1764)\)\.
@@ -5592,7 +6245,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* zabbix\_proxy role \- undefined vars at updating proxy definition\. Fix adds null defaults for zabbix\_proxy\_tlsaccept and zabbix\_proxy\_tlsconnect\.
* zabbix\_web role \- removed \'ssl on\;\' nginx configuration\, which is no longer supported since nginx version 1\.25\.1\.
-<a id="containers-podman-4"></a>
+<a id="containers-podman-7"></a>
#### containers\.podman
* Add hooks\-dir parameter for containers
@@ -5703,7 +6356,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* Improve sanity tests\.
* When the JSON data sent by FortiManager is not in the right format\, the collection can still execute correctly\.
-<a id="fortinet-fortios-3"></a>
+<a id="fortinet-fortios-5"></a>
#### fortinet\.fortios
* Fix the error of pure number password\.
@@ -5757,7 +6410,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* microsoft\.ad\.user \- Ensure the <code>spn</code> diff after key is <code>spn</code> and not <code>kerberos\_encryption\_types</code>
* microsoft\.ad\.user \- treat an expired account as a password that needs to be changed
-<a id="netapp-ontap-7"></a>
+<a id="netapp-ontap-9"></a>
#### netapp\.ontap
* na\_ontap\_dns \- fix DNS not working with Cluster mode\.
@@ -5828,7 +6481,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* purefa\_subnet \- Fixed IPv6 support issues\.
* purefa\_volume \- Fixed bug with NULL suffix for multiple volume creation\.
-<a id="purestorage-flashblade-6"></a>
+<a id="purestorage-flashblade-7"></a>
#### purestorage\.flashblade
* purefb\_bucket \- Fixed bucket type mode name typo
@@ -5876,38 +6529,38 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
<a id="known-issues-2"></a>
### Known Issues
-<a id="ansible-core-20"></a>
+<a id="ansible-core-22"></a>
#### Ansible\-core
* ansible\-galaxy \- dies in the middle of installing a role when that role contains Java inner classes \(files with \$ in the file name\)\. This is by design\, to exclude temporary or backup files\. \([https\://github\.com/ansible/ansible/pull/81553](https\://github\.com/ansible/ansible/pull/81553)\)\.
* ansible\-test \- The <code>pep8</code> sanity test is unable to detect f\-string spacing issues \(E201\, E202\) on Python 3\.10 and 3\.11\. They are correctly detected under Python 3\.12\. See \([https\://github\.com/PyCQA/pycodestyle/issues/1190](https\://github\.com/PyCQA/pycodestyle/issues/1190)\)\.
-<a id="community-crypto-9"></a>
+<a id="community-crypto-13"></a>
#### community\.crypto
* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/crypto/](https\://docs\.ansible\.com/ansible/devel/collections/community/crypto/)\.
-<a id="community-dns-9"></a>
+<a id="community-dns-10"></a>
#### community\.dns
* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/dns/](https\://docs\.ansible\.com/ansible/devel/collections/community/dns/)\.
-<a id="community-docker-10"></a>
+<a id="community-docker-12"></a>
#### community\.docker
* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/docker/](https\://docs\.ansible\.com/ansible/devel/collections/community/docker/)\.
-<a id="community-general-19"></a>
+<a id="community-general-23"></a>
#### community\.general
* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/general/](https\://docs\.ansible\.com/ansible/devel/collections/community/general/) \([https\://github\.com/ansible\-collections/community\.general/pull/6539](https\://github\.com/ansible\-collections/community\.general/pull/6539)\)\.
-<a id="community-hrobot-4"></a>
+<a id="community-hrobot-5"></a>
#### community\.hrobot
* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/hrobot/](https\://docs\.ansible\.com/ansible/devel/collections/community/hrobot/)\.
-<a id="community-routeros-7"></a>
+<a id="community-routeros-8"></a>
#### community\.routeros
* Ansible markup will show up in raw form on ansible\-doc text output for ansible\-core before 2\.15\. If you have trouble deciphering the documentation markup\, please upgrade to ansible\-core 2\.15 \(or newer\)\, or read the HTML documentation on [https\://docs\.ansible\.com/ansible/devel/collections/community/routeros/](https\://docs\.ansible\.com/ansible/devel/collections/community/routeros/)\.
@@ -5930,7 +6583,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* ome\_device\_quick\_deploy \- Issue\(275231\) \- This module does not deploy a new configuration to a slot that has disabled IPv6\.
* ome\_smart\_fabric\_uplink \- Issue\(186024\) \- Despite the module supported by OpenManage Enterprise Modular\, it does not allow the creation of multiple uplinks of the same name\. If an uplink is created using the same name as an existing uplink\, the existing uplink is modified\.
-<a id="new-plugins-4"></a>
+<a id="new-plugins-5"></a>
### New Plugins
<a id="cliconf"></a>
@@ -5938,7 +6591,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* ansible\.netcommon\.default \- General purpose cliconf plugin for new platforms
-<a id="filter-4"></a>
+<a id="filter-5"></a>
#### Filter
* ansible\.utils\.ipcut \- This filter is designed to get 1st or last few bits of IP address\.
@@ -5958,10 +6611,10 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.dns\.lookup\_as\_dict \- Look up DNS records as dictionaries
* community\.general\.bitwarden\_secrets\_manager \- Retrieve secrets from Bitwarden Secrets Manager
-<a id="new-modules-4"></a>
+<a id="new-modules-5"></a>
### New Modules
-<a id="amazon-aws-12"></a>
+<a id="amazon-aws-14"></a>
#### amazon\.aws
* amazon\.aws\.ec2\_import\_image \- Manage AWS EC2 import image tasks
@@ -5995,18 +6648,18 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* cloudscale\_ch\.cloud\.load\_balancer\_pool \- Manages load balancer pools on the cloudscale\.ch IaaS service
* cloudscale\_ch\.cloud\.load\_balancer\_pool\_member \- Manages load balancer pool members on the cloudscale\.ch IaaS service
-<a id="community-aws-5"></a>
+<a id="community-aws-8"></a>
#### community\.aws
* community\.aws\.route53\_wait \- wait for changes in Amazons Route 53 DNS service to propagate
-<a id="community-dns-10"></a>
+<a id="community-dns-11"></a>
#### community\.dns
* community\.dns\.nameserver\_info \- Look up nameservers for a DNS name
* community\.dns\.nameserver\_record\_info \- Look up all records of a type from all nameservers for a DNS name
-<a id="community-general-20"></a>
+<a id="community-general-24"></a>
#### community\.general
* community\.general\.consul\_policy \- Manipulate Consul policies
@@ -6034,7 +6687,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.grafana\.grafana\_organization\_user \- Manage Grafana Organization Users\.
-<a id="community-vmware-9"></a>
+<a id="community-vmware-12"></a>
#### community\.vmware
* community\.vmware\.vcenter\_root\_password\_expiration \- root password expiration of vCSA
@@ -6051,7 +6704,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* community\.zabbix\.zabbix\_settings \- Update Zabbix global settings\.
* community\.zabbix\.zabbix\_token \- Create/Update/Generate/Delete Zabbix token\.
-<a id="containers-podman-5"></a>
+<a id="containers-podman-8"></a>
#### containers\.podman
* containers\.podman\.podman\_container\_exec \- Executes a command in a running container
@@ -6085,7 +6738,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* dellemc\.openmanage\.ome\_alert\_policies\_message\_id\_info \- Get message ID information of alert policies\.
* dellemc\.openmanage\.redfish\_firmware\_rollback \- To perform a component firmware rollback using component name\.
-<a id="dellemc-powerflex-4"></a>
+<a id="dellemc-powerflex-6"></a>
#### dellemc\.powerflex
* dellemc\.powerflex\.snapshot\_policy \- Manage snapshot policies on Dell PowerFlex
@@ -6282,7 +6935,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* inspur\.ispim\.hba\_info \- Get CPU information
* inspur\.ispim\.update\_psu \- Update PSU
-<a id="netapp-ontap-8"></a>
+<a id="netapp-ontap-10"></a>
#### netapp\.ontap
* netapp\.ontap\.na\_ontap\_active\_directory\_domain\_controllers \- NetApp ONTAP configure active directory preferred domain controllers
@@ -6339,7 +6992,7 @@ If not mentioned explicitly\, the changes are reported in the combined changelog
* dellemc\.openmanage\.idrac\_reset \- Role to reset and restart iDRAC \(iDRAC8 and iDRAC9 only\) for Dell PowerEdge servers\.
* dellemc\.openmanage\.idrac\_storage\_controller \- Role to configure the physical disk\, virtual disk\, and storage controller settings on iDRAC9 based PowerEdge servers\.
-<a id="unchanged-collections-5"></a>
+<a id="unchanged-collections-6"></a>
### Unchanged Collections
* ansible\.posix \(still version 1\.5\.4\)
diff --git a/CHANGELOG-v9.rst b/CHANGELOG-v9.rst
index d3abd5c05..156f5870c 100644
--- a/CHANGELOG-v9.rst
+++ b/CHANGELOG-v9.rst
@@ -7,6 +7,625 @@ This changelog describes changes since Ansible 8.0.0.
.. contents::
:depth: 2
+v9.5.1
+======
+
+.. contents::
+ :local:
+ :depth: 2
+
+Release Summary
+---------------
+
+Release Date: 2024-04-24
+
+`Porting Guide <https://docs.ansible.com/ansible/devel/porting_guides.html>`_
+
+Please note that this release replaces a mistakenly released 9.5.0 that included a breaking change. The 9.5.0 release has been yanked from PyPI and is not part of the official release history.
+
+Ansible-core
+------------
+
+Ansible 9.5.1 contains ansible-core version 2.16.6.
+This is a newer version than version 2.16.5 contained in the previous Ansible release.
+
+The changes are reported in the combined changelog below.
+
+Changed Collections
+-------------------
+
+If not mentioned explicitly, the changes are reported in the combined changelog below.
+
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| Collection | Ansible 9.4.0 | Ansible 9.5.1 | Notes |
++==========================================+===============+===============+==============================================================================================================================+
+| amazon.aws | 7.4.0 | 7.5.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| cisco.aci | 2.8.0 | 2.9.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| cisco.dnac | 6.13.1 | 6.13.3 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| cisco.intersight | 2.0.7 | 2.0.8 | Unfortunately, this collection does not provide changelog data in a format that can be processed by the changelog generator. |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| cisco.ise | 2.8.0 | 2.8.1 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| cisco.meraki | 2.17.2 | 2.18.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| cisco.mso | 2.5.0 | 2.6.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.aws | 7.1.0 | 7.2.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.crypto | 2.18.0 | 2.19.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.dns | 2.8.3 | 2.9.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.docker | 3.8.1 | 3.9.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.general | 8.5.0 | 8.6.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.hrobot | 1.9.1 | 1.9.2 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.library_inventory_filtering_v1 | 1.0.0 | 1.0.1 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.mongodb | 1.7.2 | 1.7.3 | There are no changes recorded in the changelog. |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.rabbitmq | 1.2.3 | 1.3.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.routeros | 2.14.0 | 2.15.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| community.vmware | 4.2.0 | 4.3.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| containers.podman | 1.12.0 | 1.13.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| dellemc.powerflex | 2.2.0 | 2.3.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| fortinet.fortios | 2.3.5 | 2.3.6 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| infinidat.infinibox | 1.4.3 | 1.4.5 | Unfortunately, this collection does not provide changelog data in a format that can be processed by the changelog generator. |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| netapp.ontap | 22.10.0 | 22.11.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+| purestorage.flashblade | 1.16.0 | 1.17.0 | |
++------------------------------------------+---------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
+
+Major Changes
+-------------
+
+containers.podman
+~~~~~~~~~~~~~~~~~
+
+- Add quadlet support for Podman modules
+
+fortinet.fortios
+~~~~~~~~~~~~~~~~
+
+- Add notes for backup modules in the documentation in both monitor and monitor_fact modules.
+- Supported new FOS versions 7.4.2 and 7.4.3, and support data type mac_address in the collection.
+- Update the documentation for the supported versions from latest to a fix version number.
+- Update the required ansible version to 2.15.
+
+Minor Changes
+-------------
+
+amazon.aws
+~~~~~~~~~~
+
+- iam_user_info - Add ``login_profile`` to return info that is get from a user, to know if they can login from AWS console (https://github.com/ansible-collections/amazon.aws/pull/2012).
+- module_utils.iam - refactored normalization functions to use ``boto3_resource_to_ansible_dict()`` and ``boto3_resource_list_to_ansible_dict()`` (https://github.com/ansible-collections/amazon.aws/pull/2006).
+- module_utils.transformations - add ``boto3_resource_to_ansible_dict()`` and ``boto3_resource_list_to_ansible_dict()`` helpers (https://github.com/ansible-collections/amazon.aws/pull/2006).
+
+cisco.aci
+~~~~~~~~~
+
+- Add Authentification option for EIGRP interface profile.
+- Add L3out Floating SVI modules (aci_l3out_floating_svi, aci_l3out_floating_svi_path, aci_l3out_floating_svi_path_secondary_ip and aci_l3out_floating_svi_secondary_ip) (#478)
+- Add No-verification flag option to reduce the number of API calls. If true, a verifying GET will not be sent after a POST update to APIC
+- Add access spine interface selector and port block binding in aci_access_port_block_to_access_port
+- Add aci_access_spine_interface_selector module
+- Add aci_action_rule_additional_communities module
+- Add aci_action_rule_set_as_path and aci_action_rule_set_as_path_asn modules
+- Add aci_bgp_peer_prefix_policy, aci_bgp_route_summarization_policy and aci_bgp_address_family_context_policy modules
+- Add aci_fabric_pod, aci_fabric_pod_external_tep, aci_fabric_pod_profile, aci_fabric_pod_remote_pool modules (#558)
+- Add aci_hsrp_interface_policy, aci_l3out_hsrp_group, aci_l3out_hsrp_interface_profile and aci_l3out_hsrp_secondary_vip modules (#505)
+- Add aci_interface_policy_eigrp (class:eigrpIfPol) module
+- Add aci_interface_policy_pim module
+- Add aci_interface_policy_storm_control module
+- Add aci_keychain_policy and aci_key_policy modules
+- Add aci_l3out_bfd_multihop_interface_profile, aci_l3out_bfd_interface_profile, aci_interface_policy_bfd_multihop, aci_interface_policy_bfd and aci_bfd_multihop_node_policy modules (#492)
+- Add aci_l3out_dhcp_relay_label, aci_dhcp_option_policy and aci_dhcp_option modules
+- Add aci_l3out_eigrp_interface_profile module
+- Add aci_listify filter plugin to flattens nested dictionaries
+- Add aci_netflow_exporter_policy module
+- Add aci_netflow_monitor_policy and aci_netflow_record_policy modules
+- Add aci_netflow_monitor_to_exporter module
+- Add aci_node_block module
+- Add aci_pim_route_map_policy and aci_pim_route_map_entry modules
+- Add aci_qos_custom_policy and aci_qos_dscp_class modules
+- Add aci_qos_dot1p_class module
+- Add action rules attributes to aci_tenant_action_rule_profile.
+- Add auto to speed attribute options in aci_interface_policy_link_level module (#577)
+- Add missing options to aci_bd module
+- Add modules aci_bd_to_netflow_monitor_policy and aci_bd_rogue_exception_mac (#600)
+- Add modules for Fabric External Connection Policies and its childs
+- Add option to set delimiter to _ in aci_epg_to_domain module
+- Add qos_custom_policy, pim_interface_policy and igmp_interface_policy as new child_classes for aci_l3out_logical_interface_profile.
+- Add support for annotation in aci_rest module (#437)
+- Add support for block statements in useg attributes with the aci_epg_useg_attribute_block_statement module
+- Add support for configuration of access switch policy groups with aci_access_switch_policy_group module
+- Add support for configuration of certificate authorities in aci_aaa_certificate_authority
+- Add support for configuration of fabric management access policies in aci_fabric_management_access
+- Add support for configuration of vrf multicast with aci_vrf_multicast module
+- Add support for configuring Azure cloud subnets using the aci_cloud_subnet module
+- Add support for encap scope in aci_l3out_interface
+- Add support for https ssl cipher configuration in aci_fabric_management_access_https_cipher
+- Add support for infra l3out nodes bgp-evpn loopback, mpls transport loopback and segment id in aci_l3out_logical_node
+- Add support for infra sr mpls micro bfd in aci_l3out_interface
+- Add support for intra epg, taboo, and contract interface in aci_epg_to_contract
+- Add support for key ring configuration in aci_aaa_key_ring
+- Add support for mac and description in aci_l3out_interface
+- Add support for mpls custom qos policy for infra sr mpls l3outs node profiles in aci_l3out_logical_node_profile
+- Add support for security default settings configuration in aci_aaa_security_default_settings
+- Add support for simple statements in useg attributes with the aci_epg_useg_attribute_simple_statement module
+- Add support for sr-mpls bgpInfraPeerP and bgp_password in aci_l3out_bgp_peer module (#543)
+- Add support for sr-mpls in aci_l3out module
+- Add support for sr-mpls l3out to infra l3out in aci_l3out_to_sr_mpls_infra_l3out
+- Add support for subject labels for EPG, EPG Contract, ESG, Contract Subject, L2Out External EPG, L3out External EPG, and L3out External EPG Contract with the aci_subject_label module
+- Add support for taboo contract, contract interface and intra_epg contract in aci_l3out_extepg_to_contract
+- Add support for useg default block statement configuration for useg epg in aci_epg
+- Modify child class node block conditions to be optional in aci_switch_leaf_selector
+
+cisco.dnac
+~~~~~~~~~~
+
+- Added a method to validate IP addresses.
+- Added the op_modifies=True when calling SDK APIs in the workflow manager modules.
+- Adding support to importing a template using JSON file
+- Changes in discovery workflow manager modules relating to different states of the discovery job
+- Changes in inventory and swim workflow manager modules.
+- Fixed a minor issue in the site workflow manager module.
+- Updating galaxy.yml ansible.utils dependencies.
+
+cisco.meraki
+~~~~~~~~~~~~
+
+- Ansible collection now support v1.44.1 of Dashboard Api.
+- administered_licensing_subscription_entitlements_info - new plugin.
+- administered_licensing_subscription_subscriptions_bind - new plugin.
+- administered_licensing_subscription_subscriptions_claim - new plugin.
+- administered_licensing_subscription_subscriptions_claim_key_validate - new plugin.
+- administered_licensing_subscription_subscriptions_compliance_statuses_info - new plugin.
+- administered_licensing_subscription_subscriptions_info - new plugin.
+- devices_appliance_radio_settings - new plugin.
+- devices_appliance_radio_settings_info - new plugin.
+- devices_live_tools_arp_table - new plugin.
+- devices_live_tools_arp_table_info - new plugin.
+- devices_live_tools_cable_test - new plugin.
+- devices_live_tools_cable_test_info - new plugin.
+- devices_live_tools_throughput_test - new plugin.
+- devices_live_tools_throughput_test_info - new plugin.
+- devices_live_tools_wake_on_lan - new plugin.
+- devices_live_tools_wake_on_lan_info - new plugin.
+- devices_wireless_alternate_management_interface_ipv6 - new plugin.
+- networks_appliance_rf_profiles - new plugin.
+- networks_appliance_rf_profiles_info - new plugin.
+- networks_appliance_traffic_shaping_vpn_exclusions - new plugin.
+- networks_sm_devices_install_apps - new plugin.
+- networks_sm_devices_reboot - new plugin.
+- networks_sm_devices_shutdown - new plugin.
+- networks_sm_devices_uninstall_apps - new plugin.
+- networks_vlan_profiles - new plugin.
+- networks_vlan_profiles_assignments_by_device_info - new plugin.
+- networks_vlan_profiles_assignments_reassign - new plugin.
+- networks_vlan_profiles_info - new plugin.
+- networks_wireless_ethernet_ports_profiles - new plugin.
+- networks_wireless_ethernet_ports_profiles_assign - new plugin.
+- networks_wireless_ethernet_ports_profiles_info - new plugin.
+- networks_wireless_ethernet_ports_profiles_set_default - new plugin.
+- organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info - new plugin.
+- organizations_appliance_uplinks_statuses_overview_info - new plugin.
+- organizations_appliance_uplinks_usage_by_network_info - new plugin.
+- organizations_camera_boundaries_areas_by_device_info - new plugin.
+- organizations_camera_boundaries_lines_by_device_info - new plugin.
+- organizations_camera_detections_history_by_boundary_by_interval_info - new plugin.
+- organizations_camera_permissions_info - new plugin.
+- organizations_camera_roles - new plugin.
+- organizations_camera_roles_info - new plugin.
+- organizations_devices_availabilities_change_history_info - new plugin.
+- organizations_devices_boots_history_info - new plugin.
+- organizations_sm_admins_roles - new plugin.
+- organizations_sm_admins_roles_info - new plugin.
+- organizations_sm_sentry_policies_assignments - new plugin.
+- organizations_sm_sentry_policies_assignments_by_network_info - new plugin.
+- organizations_summary_top_networks_by_status_info - new plugin.
+- organizations_webhooks_callbacks_statuses_info - new plugin.
+- organizations_wireless_devices_channel_utilization_by_device_info - new plugin.
+- organizations_wireless_devices_channel_utilization_by_network_info - new plugin.
+- organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info - new plugin.
+- organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info - new plugin.
+- organizations_wireless_devices_packet_loss_by_client_info - new plugin.
+- organizations_wireless_devices_packet_loss_by_device_info - new plugin.
+- organizations_wireless_devices_packet_loss_by_network_info - new plugin.
+
+cisco.mso
+~~~~~~~~~
+
+- Add Azure Cloud site support to mso_schema_site_contract_service_graph
+- Add Azure Cloud site support to mso_schema_site_service_graph
+- Add functionality to resolve same name in remote and local user.
+- Add l3out_template and l3out_schema arguments to mso_schema_site_external_epg (#394)
+- Add mso_schema_site_contract_service_graph module to manage site contract service graph
+- Add mso_schema_site_contract_service_graph_listener module to manage Azure site contract service graph listeners and update other modules
+- Add new parameter remote_user to add multiple remote users associated with multiple login domains
+- Add support for replacing all existing contracts with new provided contracts in a single operation with one request and adding/removing multiple contracts in multiple operations with a single request in mso_schema_template_anp_epg_contract module
+- Add support for replacing all existing static ports with new provided static ports in a single operation with one request and adding/removing multiple static ports in multiple operations with a single request in mso_schema_template_anp_epg_staticport module
+- Add support for required attributes introduced in NDO 4.2 for mso_schema_site_anp_epg_domain
+- Support for creation of schemas without templates with the mso_schema module
+
+community.aws
+~~~~~~~~~~~~~
+
+- glue_job - add support for 2 new instance types which are G.4X and G.8X (https://github.com/ansible-collections/community.aws/pull/2048).
+- msk_cluster - Support for additional ``m5`` and ``m7g`` types of MSK clusters (https://github.com/ansible-collections/community.aws/pull/1947).
+
+community.crypto
+~~~~~~~~~~~~~~~~
+
+- When using cryptography >= 42.0.0, use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead of offset-naive UTC timestamps (https://github.com/ansible-collections/community.crypto/issues/726, https://github.com/ansible-collections/community.crypto/pull/727).
+- openssh_cert - avoid UTC functions deprecated in Python 3.12 when using Python 3 (https://github.com/ansible-collections/community.crypto/pull/727).
+
+community.docker
+~~~~~~~~~~~~~~~~
+
+- The EE requirements now include PyYAML, since the ``docker_compose_v2*`` modules depend on it when the ``definition`` option is used. This should not have a noticable effect on generated EEs since ansible-core itself depends on PyYAML as well, and ansible-builder explicitly ignores this dependency (https://github.com/ansible-collections/community.docker/pull/832).
+- docker_compose_v2* - the new option ``check_files_existing`` allows to disable the check for one of the files ``compose.yaml``, ``compose.yml``, ``docker-compose.yaml``, and ``docker-compose.yml`` in ``project_src`` if ``files`` is not specified. This is necessary if a non-standard compose filename is specified through other means, like the ``COMPOSE_FILE`` environment variable (https://github.com/ansible-collections/community.docker/issues/838, https://github.com/ansible-collections/community.docker/pull/839).
+- docker_compose_v2* modules - allow to provide an inline definition of the compose content instead of having to provide a ``project_src`` directory with the compose file written into it (https://github.com/ansible-collections/community.docker/issues/829, https://github.com/ansible-collections/community.docker/pull/832).
+- vendored Docker SDK for Python - remove unused code that relies on functionality deprecated in Python 3.12 (https://github.com/ansible-collections/community.docker/pull/834).
+
+community.general
+~~~~~~~~~~~~~~~~~
+
+- Use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead of offset-naive UTC timestamps, which are deprecated in Python 3.12 (https://github.com/ansible-collections/community.general/pull/8222).
+- apt_rpm - add new states ``latest`` and ``present_not_latest``. The value ``latest`` is equivalent to the current behavior of ``present``, which will upgrade a package if a newer version exists. ``present_not_latest`` does what most users would expect ``present`` to do: it does not upgrade if the package is already installed. The current behavior of ``present`` will be deprecated in a later version, and eventually changed to that of ``present_not_latest`` (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8247).
+- bitwarden lookup plugin - add support to filter by organization ID (https://github.com/ansible-collections/community.general/pull/8188).
+- filesystem - add bcachefs support (https://github.com/ansible-collections/community.general/pull/8126).
+- ini_file - add an optional parameter ``section_has_values``. If the target ini file contains more than one ``section``, use ``section_has_values`` to specify which one should be updated (https://github.com/ansible-collections/community.general/pull/7505).
+- java_cert - add ``cert_content`` argument (https://github.com/ansible-collections/community.general/pull/8153).
+- keycloak_client, keycloak_clientscope, keycloak_clienttemplate - added ``docker-v2`` protocol support, enhancing alignment with Keycloak's protocol options (https://github.com/ansible-collections/community.general/issues/8215, https://github.com/ansible-collections/community.general/pull/8216).
+- nmcli - adds OpenvSwitch support with new ``type`` values ``ovs-port``, ``ovs-interface``, and ``ovs-bridge``, and new ``slave_type`` value ``ovs-port`` (https://github.com/ansible-collections/community.general/pull/8154).
+- osx_defaults - add option ``check_types`` to enable changing the type of existing defaults on the fly (https://github.com/ansible-collections/community.general/pull/8173).
+- passwordstore lookup - add ``missing_subkey`` parameter defining the behavior of the lookup when a passwordstore subkey is missing (https://github.com/ansible-collections/community.general/pull/8166).
+- portage - adds the possibility to explicitely tell portage to write packages to world file (https://github.com/ansible-collections/community.general/issues/6226, https://github.com/ansible-collections/community.general/pull/8236).
+- redfish_command - add command ``ResetToDefaults`` to reset manager to default state (https://github.com/ansible-collections/community.general/issues/8163).
+- redfish_info - add boolean return value ``MultipartHttpPush`` to ``GetFirmwareUpdateCapabilities`` (https://github.com/ansible-collections/community.general/issues/8194, https://github.com/ansible-collections/community.general/pull/8195).
+- ssh_config - allow ``accept-new`` as valid value for ``strict_host_key_checking`` (https://github.com/ansible-collections/community.general/pull/8257).
+
+community.rabbitmq
+~~~~~~~~~~~~~~~~~~
+
+- rabbitmq_user - add support to user manipulation through RabbitMQ API (https://github.com/ansible-collections/community.rabbitmq/issues/76)
+
+community.routeros
+~~~~~~~~~~~~~~~~~~
+
+- api_info, api_modify - Add RouterOS 7.x support to ``/mpls ldp`` path (https://github.com/ansible-collections/community.routeros/pull/271).
+- api_info, api_modify - add ``/ip route rule`` path for RouterOS 6.x (https://github.com/ansible-collections/community.routeros/pull/278).
+- api_info, api_modify - add ``/routing filter`` path for RouterOS 6.x (https://github.com/ansible-collections/community.routeros/pull/279).
+- api_info, api_modify - add default value for ``from-pool`` field in ``/ipv6 address`` (https://github.com/ansible-collections/community.routeros/pull/270).
+- api_info, api_modify - add missing path ``/interface pppoe-server server`` (https://github.com/ansible-collections/community.routeros/pull/273).
+- api_info, api_modify - add missing path ``/ip dhcp-relay`` (https://github.com/ansible-collections/community.routeros/pull/276).
+- api_info, api_modify - add missing path ``/queue simple`` (https://github.com/ansible-collections/community.routeros/pull/269).
+- api_info, api_modify - add missing path ``/queue type`` (https://github.com/ansible-collections/community.routeros/pull/274).
+- api_info, api_modify - add missing paths ``/routing bgp aggregate``, ``/routing bgp network`` and ``/routing bgp peer`` (https://github.com/ansible-collections/community.routeros/pull/277).
+- api_info, api_modify - add support for paths ``/mpls interface``, ``/mpls ldp accept-filter``, ``/mpls ldp advertise-filter`` and ``mpls ldp interface`` (https://github.com/ansible-collections/community.routeros/pull/272).
+
+community.vmware
+~~~~~~~~~~~~~~~~
+
+- Document that all parameters and VMware object names are case sensitive (https://github.com/ansible-collections/community.vmware/issues/2019).
+- Drop the outdated (and actually unmaintained) scenario guides (https://github.com/ansible-collections/community.vmware/pull/2022).
+- vmware_dvswitch - Add switchIpAddress/switch_ip parameter for netflow config
+- vmware_guest_tools_info - Use `toolsVersionStatus2` instead of `toolsVersionStatus` (https://github.com/ansible-collections/community.vmware/issues/2033).
+
+containers.podman
+~~~~~~~~~~~~~~~~~
+
+- CI - Fix rootfs test in CI
+- CI - add custom podman path to tasks
+- CI - add parametrized executables to tests
+- podman_container - Add pasta as default network mode after v5
+- podman_container_exec - Return data for podman exec module
+- podman_generate_systemd - Fix broken example for podman_generate_systemd (#708)
+- podman_login - Update podman_login.py
+- podman_play - Add support for kube yaml files with multi-documents (#724)
+- podman_play - Update the logic for deleting pods/containers in podman_play
+- podman_pod_info - handle return being list in Podman 5 (#713)
+
+dellemc.powerflex
+~~~~~~~~~~~~~~~~~
+
+- Added support for PowerFlex ansible modules and roles on Azure.
+- Added support for resource group provisioning to validate, deploy, edit, add nodes and delete a resource group.
+- The Info module is enhanced to list the firmware repositories.
+
+netapp.ontap
+~~~~~~~~~~~~
+
+- na_ontap_cifs - new option `offline_files` added in REST, requires ONTAP 9.10 or later.
+- na_ontap_net_ifgrp - updated documentation for parameter `name`.
+- na_ontap_vserver_audit - new options `schedule.*` added under `log.rotation`, requires ONTAP 9.6 or later.
+
+purestorage.flashblade
+~~~~~~~~~~~~~~~~~~~~~~
+
+- purefb_bucket - Add support for strict 17a-4 WORM compliance.
+- purefb_connect - Increase Fan-In and Fan-Out maximums
+- purefb_fs - Add ``group_ownership`` parameter from Purity//FB 4.4.0.
+- purefb_info - Show array network access policy from Purity//FB 4.4.0
+- purefb_policy - Add support for network access policies from Purity//FB 4.4.0
+
+Deprecated Features
+-------------------
+
+community.crypto
+~~~~~~~~~~~~~~~~
+
+- acme.backends module utils - from community.crypto on, all implementations of ``CryptoBackend`` must override ``get_ordered_csr_identifiers()``. The current default implementation, which simply sorts the result of ``get_csr_identifiers()``, will then be removed (https://github.com/ansible-collections/community.crypto/pull/725).
+
+community.general
+~~~~~~~~~~~~~~~~~
+
+- hipchat callback plugin - the hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020. The callback plugin is therefore deprecated and will be removed from community.general 10.0.0 if nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184, https://github.com/ansible-collections/community.general/pull/8189).
+
+community.vmware
+~~~~~~~~~~~~~~~~
+
+- vmware_guest_tools_info - `vm_tools_install_status` will be removed from next major version (5.0.0) of the collection since the API call that provides this information has been deprecated by VMware. Use `vm_tools_running_status` / `vm_tools_version_status` instead (https://github.com/ansible-collections/community.vmware/issues/2033).
+
+Bugfixes
+--------
+
+Ansible-core
+~~~~~~~~~~~~
+
+- Consolidated the list of internal static vars, centralized them as constant and completed from some missing entries.
+- Fix check for missing _sub_plugin attribute in older connection plugins (https://github.com/ansible/ansible/pull/82954)
+- Fixes permission for cache json file from 600 to 644 (https://github.com/ansible/ansible/issues/82683).
+- Slight optimization to hostvars (instantiate template only once per host, vs per call to var).
+- allow_duplicates - fix evaluating if the current role allows duplicates instead of using the initial value from the duplicate's cached role.
+- ansible-config will now properly template defaults before dumping them.
+- ansible-test ansible-doc sanity test - do not remove underscores from plugin names in collections before calling ``ansible-doc`` (https://github.com/ansible/ansible/pull/82574).
+- async - Fix bug that stopped running async task in ``--check`` when ``check_mode: False`` was set as a task attribute - https://github.com/ansible/ansible/issues/82811
+- blockinfile - when ``create=true`` is used with a filename without path, the module crashed (https://github.com/ansible/ansible/pull/81638).
+- dnf - fix an issue when cached RPMs were left in the cache directory even when the keepcache setting was unset (https://github.com/ansible/ansible/issues/81954)
+- dnf5 - replace removed API calls
+- facts - add a generic detection for VMware in product name.
+- fetch - add error message when using ``dest`` with a trailing slash that becomes a local directory - https://github.com/ansible/ansible/issues/82878
+- find - do not fail on Permission errors (https://github.com/ansible/ansible/issues/82027).
+- unarchive modules now uses zipinfo options without relying on implementation defaults, making it more compatible with all OS/distributions.
+- winrm - Do not raise another exception during cleanup when a task is timed out - https://github.com/ansible/ansible/issues/81095
+
+amazon.aws
+~~~~~~~~~~
+
+- cloudwatchlogs_log_group_info - Implement exponential backoff when making API calls to prevent throttling exceptions (https://github.com/ansible-collections/amazon.aws/issues/2011).
+- plugin_utils.inventory - Ensure templated options in lookup plugins are converted (https://github.com/ansible-collections/amazon.aws/issues/1955).
+- s3_object - Fix the issue when copying an object with overriding metadata. (https://github.com/ansible-collections/amazon.aws/issues/1991).
+
+cisco.aci
+~~~~~~~~~
+
+- Fix auto logout issue in aci connection plugin to keep connection active between tasks
+- Fix idempotency for l3out configuration when l3protocol is used in aci_l3out
+- Fix issues with new attributes in aci_interface_policy_leaf_policy_group module by adding conditions to include attributes in the payload only when they are specified by the user (#578)
+- Fix query in aci_vmm_controller
+
+cisco.ise
+~~~~~~~~~
+
+- ansible.utils changes to `">=2.0.0,<5.0"` in galaxy.yml dependencies.
+
+cisco.mso
+~~~~~~~~~
+
+- Fix TypeError for iteration on NoneType in mso_schema_template
+- Fixed the useg_subnet logic in mso_schema_template_anp_epg_useg_attribute
+
+community.aws
+~~~~~~~~~~~~~
+
+- ssm(connection) - fix bucket region logic when region is ``us-east-1`` (https://github.com/ansible-collections/community.aws/pull/1908).
+
+community.crypto
+~~~~~~~~~~~~~~~~
+
+- acme_certificate - respect the order of the CNAME and SAN identifiers that are passed on when creating an ACME order (https://github.com/ansible-collections/community.crypto/issues/723, https://github.com/ansible-collections/community.crypto/pull/725).
+
+community.dns
+~~~~~~~~~~~~~
+
+- Update Public Suffix List.
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.dns/pull/197).
+
+community.docker
+~~~~~~~~~~~~~~~~
+
+- docker_compose_v2* - allow ``project_src`` to be a relative path, by converting it to an absolute path before using it (https://github.com/ansible-collections/community.docker/issues/827, https://github.com/ansible-collections/community.docker/pull/828).
+- docker_compose_v2* modules - abort with a nice error message instead of crash when the Docker Compose CLI plugin version is ``dev`` (https://github.com/ansible-collections/community.docker/issues/825, https://github.com/ansible-collections/community.docker/pull/826).
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.docker/pull/835).
+
+community.general
+~~~~~~~~~~~~~~~~~
+
+- aix_filesystem - fix ``_validate_vg`` not passing VG name to ``lsvg_cmd`` (https://github.com/ansible-collections/community.general/issues/8151).
+- apt_rpm - when checking whether packages were installed after running ``apt-get -y install <packages>``, only the last package name was checked (https://github.com/ansible-collections/community.general/pull/8263).
+- bitwarden_secrets_manager lookup plugin - implements retry with exponential backoff to avoid lookup errors when Bitwardn's API rate limiting is encountered (https://github.com/ansible-collections/community.general/issues/8230, https://github.com/ansible-collections/community.general/pull/8238).
+- from_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185).
+- gitlab_issue, gitlab_label, gitlab_milestone - avoid crash during version comparison when the python-gitlab Python module is not installed (https://github.com/ansible-collections/community.general/pull/8158).
+- haproxy - fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable (https://github.com/ansible-collections/community.general/issues/8092).
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX ((https://github.com/ansible-collections/community.general/issues/8212, https://github.com/ansible-collections/community.general/pull/8225).
+- ipa - fix get version regex in IPA module_utils (https://github.com/ansible-collections/community.general/pull/8175).
+- keycloak_client - add sorted ``defaultClientScopes`` and ``optionalClientScopes`` to normalizations (https://github.com/ansible-collections/community.general/pull/8223).
+- keycloak_realm - add normalizations for ``enabledEventTypes`` and ``supportedLocales`` (https://github.com/ansible-collections/community.general/pull/8224).
+- puppet - add option ``environment_lang`` to set the environment language encoding. Defaults to lang ``C``. It is recommended to set it to ``C.UTF-8`` or ``en_US.UTF-8`` depending on what is available on your system. (https://github.com/ansible-collections/community.general/issues/8000)
+- riak - support ``riak admin`` sub-command in newer Riak KV versions beside the legacy ``riak-admin`` main command (https://github.com/ansible-collections/community.general/pull/8211).
+- to_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185).
+- xml - make module work with lxml 5.1.1, which removed some internals that the module was relying on (https://github.com/ansible-collections/community.general/pull/8169).
+
+community.hrobot
+~~~~~~~~~~~~~~~~
+
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.hrobot/pull/102).
+
+community.vmware
+~~~~~~~~~~~~~~~~
+
+- Use `isinstance()` instead of `type()` for a typecheck (https://github.com/ansible-collections/community.vmware/pull/2011).
+- vmware_guest - Fix a error while updating the VM by adding a new disk. While adding a disk to an existing VM, it leaves it in invalid state. (https://github.com/ansible-collections/community.vmware/pull/2044).
+- vmware_guest - Fix a missing error message while setting a template parameter with inconsistency guest_os ID (https://github.com/ansible-collections/community.vmware/pull/2036).
+
+containers.podman
+~~~~~~~~~~~~~~~~~
+
+- Fix pod info for non-existant pods
+- podman_container - Add check and fixed for v5 network diff
+- podman_container - Fix pasta networking idempotency for v5 (#728)
+- podman_container_exec - Remove unnecessary quotes in podman_container_exec module
+- podman_image_info - Fix wrong return data type in podman_image_info
+- podman_play - Fix kube play annotations
+- podman_pod - Fix broken info of pods in Podman v5
+- podman_pod - Fix pod for Podman v5
+- podman_pod - Fix podman pod v5 broken info issue
+
+fortinet.fortios
+~~~~~~~~~~~~~~~~
+
+- Fix the issue that ssl-certificate cannot be set in `fortios_firewall_vip` and `fortios_firewall_vip6`.
+- Github issue
+- mantis issue
+
+netapp.ontap
+~~~~~~~~~~~~
+
+- na_ontap_dns - fix issue with modifying DNS servers in REST.
+- na_ontap_fpolicy_policy - fixed issue with idempotency in REST.
+- na_ontap_quotas - fixed issue with idempotency in REST.
+- na_ontap_security_config - added warning for missing `supported_cipher_suites` to maintain idempotency in REST.
+
+New Plugins
+-----------
+
+Filter
+~~~~~~
+
+- community.dns.quote_txt - Quotes a string to use as a TXT record entry
+- community.dns.unquote_txt - Unquotes a TXT record entry to a string
+
+New Modules
+-----------
+
+community.aws
+~~~~~~~~~~~~~
+
+- community.aws.dynamodb_table_info - Returns information about a Dynamo DB table
+
+community.crypto
+~~~~~~~~~~~~~~~~
+
+- community.crypto.x509_certificate_convert - Convert X.509 certificates
+
+community.general
+~~~~~~~~~~~~~~~~~
+
+- community.general.keycloak_client_rolescope - Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications.
+
+dellemc.powerflex
+~~~~~~~~~~~~~~~~~
+
+- dellemc.powerflex.resource_group - Manage resource group deployments on Dell PowerFlex
+
+Unchanged Collections
+---------------------
+
+- ansible.netcommon (still version 5.3.0)
+- ansible.posix (still version 1.5.4)
+- ansible.utils (still version 2.12.0)
+- ansible.windows (still version 2.3.0)
+- arista.eos (still version 6.2.2)
+- awx.awx (still version 23.9.0)
+- azure.azcollection (still version 1.19.0)
+- check_point.mgmt (still version 5.2.3)
+- chocolatey.chocolatey (still version 1.5.1)
+- cisco.asa (still version 4.0.3)
+- cisco.ios (still version 5.3.0)
+- cisco.iosxr (still version 6.1.1)
+- cisco.nxos (still version 5.3.0)
+- cisco.ucs (still version 1.10.0)
+- cloud.common (still version 2.1.4)
+- cloudscale_ch.cloud (still version 2.3.1)
+- community.azure (still version 2.0.0)
+- community.ciscosmb (still version 1.0.7)
+- community.digitalocean (still version 1.26.0)
+- community.grafana (still version 1.8.0)
+- community.hashi_vault (still version 6.2.0)
+- community.libvirt (still version 1.3.0)
+- community.mysql (still version 3.9.0)
+- community.network (still version 5.0.2)
+- community.okd (still version 2.3.0)
+- community.postgresql (still version 3.4.0)
+- community.proxysql (still version 1.5.1)
+- community.sap (still version 2.0.0)
+- community.sap_libs (still version 1.4.2)
+- community.sops (still version 1.6.7)
+- community.windows (still version 2.2.0)
+- community.zabbix (still version 2.3.1)
+- cyberark.conjur (still version 1.2.2)
+- cyberark.pas (still version 1.0.25)
+- dellemc.enterprise_sonic (still version 2.4.0)
+- dellemc.openmanage (still version 8.7.0)
+- dellemc.unity (still version 1.7.1)
+- f5networks.f5_modules (still version 1.28.0)
+- fortinet.fortimanager (still version 2.4.0)
+- frr.frr (still version 2.0.2)
+- gluster.gluster (still version 1.0.2)
+- google.cloud (still version 1.3.0)
+- grafana.grafana (still version 2.2.5)
+- hetzner.hcloud (still version 2.5.0)
+- hpe.nimble (still version 1.1.4)
+- ibm.qradar (still version 2.1.0)
+- ibm.spectrum_virtualize (still version 2.0.0)
+- ibm.storage_virtualize (still version 2.3.1)
+- infoblox.nios_modules (still version 1.6.1)
+- inspur.ispim (still version 2.2.0)
+- inspur.sm (still version 2.3.0)
+- junipernetworks.junos (still version 5.3.1)
+- kubernetes.core (still version 2.4.2)
+- lowlydba.sqlserver (still version 2.3.2)
+- microsoft.ad (still version 1.5.0)
+- netapp.aws (still version 21.7.1)
+- netapp.azure (still version 21.10.1)
+- netapp.cloudmanager (still version 21.22.1)
+- netapp.elementsw (still version 21.7.0)
+- netapp.storagegrid (still version 21.12.0)
+- netapp.um_info (still version 21.8.1)
+- netapp_eseries.santricity (still version 1.4.0)
+- netbox.netbox (still version 3.17.0)
+- ngine_io.cloudstack (still version 2.3.0)
+- ngine_io.exoscale (still version 1.1.0)
+- openstack.cloud (still version 2.2.0)
+- openvswitch.openvswitch (still version 2.1.1)
+- ovirt.ovirt (still version 3.2.0)
+- purestorage.flasharray (still version 1.27.0)
+- purestorage.fusion (still version 1.6.1)
+- sensu.sensu_go (still version 1.14.0)
+- splunk.es (still version 2.1.2)
+- t_systems_mms.icinga_director (still version 2.0.1)
+- telekom_mms.icinga_director (still version 1.35.0)
+- theforeman.foreman (still version 3.15.0)
+- vmware.vmware_rest (still version 2.3.1)
+- vultr.cloud (still version 1.12.1)
+- vyos.vyos (still version 4.1.0)
+- wti.remote (still version 1.0.5)
+
v9.4.0
======
@@ -1529,7 +2148,7 @@ cisco.meraki
community.aws
~~~~~~~~~~~~~
-- aws_ssm - disable `enable-bracketed-paste` to fix issue with amazon linux 2023 and other OSes (https://github.com/ansible-collections/community.aws/issues/1756)
+- aws_ssm - disable ``enable-bracketed-paste`` to fix issue with amazon linux 2023 and other OSes (https://github.com/ansible-collections/community.aws/issues/1756)
community.crypto
~~~~~~~~~~~~~~~~
diff --git a/PKG-INFO b/PKG-INFO
index 20e6e9c14..7397f21b8 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: ansible
-Version: 9.4.0
+Version: 9.5.1
Summary: Radically simple IT automation
Home-page: https://ansible.com/
Author: Ansible, Inc.
@@ -28,7 +28,7 @@ Classifier: Programming Language :: Python :: 3 :: Only
Requires-Python: >=3.10
Description-Content-Type: text/x-rst
License-File: COPYING
-Requires-Dist: ansible-core~=2.16.5
+Requires-Dist: ansible-core~=2.16.6
..
GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
diff --git a/ansible.egg-info/PKG-INFO b/ansible.egg-info/PKG-INFO
index 20e6e9c14..7397f21b8 100644
--- a/ansible.egg-info/PKG-INFO
+++ b/ansible.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: ansible
-Version: 9.4.0
+Version: 9.5.1
Summary: Radically simple IT automation
Home-page: https://ansible.com/
Author: Ansible, Inc.
@@ -28,7 +28,7 @@ Classifier: Programming Language :: Python :: 3 :: Only
Requires-Python: >=3.10
Description-Content-Type: text/x-rst
License-File: COPYING
-Requires-Dist: ansible-core~=2.16.5
+Requires-Dist: ansible-core~=2.16.6
..
GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
diff --git a/ansible.egg-info/SOURCES.txt b/ansible.egg-info/SOURCES.txt
index 27d50939c..526c6786b 100644
--- a/ansible.egg-info/SOURCES.txt
+++ b/ansible.egg-info/SOURCES.txt
@@ -1562,16 +1562,21 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/doc_fragments/aci.py
./ansible_collections/cisco/aci/plugins/doc_fragments/annotation.py
./ansible_collections/cisco/aci/plugins/doc_fragments/owner.py
+./ansible_collections/cisco/aci/plugins/filter/listify.py
./ansible_collections/cisco/aci/plugins/httpapi/aci.py
./ansible_collections/cisco/aci/plugins/lookup/__init__.py
./ansible_collections/cisco/aci/plugins/lookup/interface_range.py
./ansible_collections/cisco/aci/plugins/module_utils/__init__.py
./ansible_collections/cisco/aci/plugins/module_utils/aci.py
+./ansible_collections/cisco/aci/plugins/module_utils/annotation_unsupported.py
./ansible_collections/cisco/aci/plugins/module_utils/constants.py
./ansible_collections/cisco/aci/plugins/modules/__init__.py
+./ansible_collections/cisco/aci/plugins/modules/aci_aaa_certificate_authority.py
./ansible_collections/cisco/aci/plugins/modules/aci_aaa_custom_privilege.py
./ansible_collections/cisco/aci/plugins/modules/aci_aaa_domain.py
+./ansible_collections/cisco/aci/plugins/modules/aci_aaa_key_ring.py
./ansible_collections/cisco/aci/plugins/modules/aci_aaa_role.py
+./ansible_collections/cisco/aci/plugins/modules/aci_aaa_security_default_settings.py
./ansible_collections/cisco/aci/plugins/modules/aci_aaa_ssh_auth.py
./ansible_collections/cisco/aci/plugins/modules/aci_aaa_user.py
./ansible_collections/cisco/aci/plugins/modules/aci_aaa_user_certificate.py
@@ -1585,16 +1590,31 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_access_span_src_group.py
./ansible_collections/cisco/aci/plugins/modules/aci_access_span_src_group_src.py
./ansible_collections/cisco/aci/plugins/modules/aci_access_span_src_group_src_path.py
+./ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile_to_spine_switch_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_selector.py
+./ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_selector.py
./ansible_collections/cisco/aci/plugins/modules/aci_access_sub_port_block_to_access_port.py
+./ansible_collections/cisco/aci/plugins/modules/aci_access_switch_policy_group.py
+./ansible_collections/cisco/aci/plugins/modules/aci_action_rule_additional_communities.py
+./ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path.py
+./ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path_asn.py
./ansible_collections/cisco/aci/plugins/modules/aci_aep.py
./ansible_collections/cisco/aci/plugins/modules/aci_aep_to_domain.py
./ansible_collections/cisco/aci/plugins/modules/aci_aep_to_epg.py
./ansible_collections/cisco/aci/plugins/modules/aci_ap.py
./ansible_collections/cisco/aci/plugins/modules/aci_bd.py
./ansible_collections/cisco/aci/plugins/modules/aci_bd_dhcp_label.py
+./ansible_collections/cisco/aci/plugins/modules/aci_bd_rogue_exception_mac.py
./ansible_collections/cisco/aci/plugins/modules/aci_bd_subnet.py
./ansible_collections/cisco/aci/plugins/modules/aci_bd_to_l3out.py
+./ansible_collections/cisco/aci/plugins/modules/aci_bd_to_netflow_monitor_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_bfd_multihop_node_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_bgp_address_family_context_policy.py
./ansible_collections/cisco/aci/plugins/modules/aci_bgp_best_path_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_bgp_peer_prefix_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_bgp_route_summarization_policy.py
./ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_asn.py
./ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_node.py
./ansible_collections/cisco/aci/plugins/modules/aci_bgp_timers_policy.py
@@ -1621,6 +1641,8 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_contract_subject.py
./ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_filter.py
./ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_service_graph.py
+./ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option.py
+./ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option_policy.py
./ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay.py
./ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay_provider.py
./ansible_collections/cisco/aci/plugins/modules/aci_dns_domain.py
@@ -1638,17 +1660,28 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_interface.py
./ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_master.py
./ansible_collections/cisco/aci/plugins/modules/aci_epg_to_domain.py
+./ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_block_statement.py
+./ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_simple_statement.py
./ansible_collections/cisco/aci/plugins/modules/aci_esg.py
./ansible_collections/cisco/aci/plugins/modules/aci_esg_contract_master.py
./ansible_collections/cisco/aci/plugins/modules/aci_esg_epg_selector.py
./ansible_collections/cisco/aci/plugins/modules/aci_esg_ip_subnet_selector.py
./ansible_collections/cisco/aci/plugins/modules/aci_esg_tag_selector.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_connection_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_routing_profile.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_interface_policy_group.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_profile.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_switch_assoc.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access_https_cipher.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_node.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_node_control.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_connectivity_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_external_tep.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_policy_group.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_remote_pool.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_selector.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_scheduler.py
./ansible_collections/cisco/aci/plugins/modules/aci_fabric_span_dst_group.py
@@ -1672,8 +1705,12 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_interface_blacklist.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_config.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_description.py
+./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd.py
+./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd_multihop.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_cdp.py
+./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_eigrp.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_fc.py
+./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_hsrp.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_l2.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_breakout_port_group.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_fc_policy_group.py
@@ -1684,11 +1721,15 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_lldp.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_mcp.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_ospf.py
+./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_pim.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_port_channel.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_port_security.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_spanning_tree.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_spine_policy_group.py
+./ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_storm_control.py
./ansible_collections/cisco/aci/plugins/modules/aci_interface_selector_to_switch_policy_leaf_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_key_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_keychain_policy.py
./ansible_collections/cisco/aci/plugins/modules/aci_l2out.py
./ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg.py
./ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg_to_contract.py
@@ -1696,11 +1737,22 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_profile.py
./ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_node_profile.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_interface_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_multihop_interface_profile.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_peer.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_protocol_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_dhcp_relay_label.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_eigrp_interface_profile.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg_to_contract.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_extsubnet.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path_secondary_ip.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_secondary_ip.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_group.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_interface_profile.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_secondary_vip.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface_secondary_ip.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile.py
@@ -1711,6 +1763,7 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_route_tag_policy.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes.py
./ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes_nexthop.py
+./ansible_collections/cisco/aci/plugins/modules/aci_l3out_to_sr_mpls_infra_l3out.py
./ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group.py
./ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group_node.py
./ansible_collections/cisco/aci/plugins/modules/aci_maintenance_policy.py
@@ -1720,9 +1773,19 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_match_community_term.py
./ansible_collections/cisco/aci/plugins/modules/aci_match_route_destination.py
./ansible_collections/cisco/aci/plugins/modules/aci_match_rule.py
+./ansible_collections/cisco/aci/plugins/modules/aci_netflow_exporter_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_to_exporter.py
+./ansible_collections/cisco/aci/plugins/modules/aci_netflow_record_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_node_block.py
./ansible_collections/cisco/aci/plugins/modules/aci_node_mgmt_epg.py
./ansible_collections/cisco/aci/plugins/modules/aci_ntp_policy.py
./ansible_collections/cisco/aci/plugins/modules/aci_ntp_server.py
+./ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_entry.py
+./ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_qos_custom_policy.py
+./ansible_collections/cisco/aci/plugins/modules/aci_qos_dot1p_class.py
+./ansible_collections/cisco/aci/plugins/modules/aci_qos_dscp_class.py
./ansible_collections/cisco/aci/plugins/modules/aci_rest.py
./ansible_collections/cisco/aci/plugins/modules/aci_route_control_context.py
./ansible_collections/cisco/aci/plugins/modules/aci_route_control_profile.py
@@ -1733,6 +1796,7 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_snmp_user.py
./ansible_collections/cisco/aci/plugins/modules/aci_static_binding_to_epg.py
./ansible_collections/cisco/aci/plugins/modules/aci_static_node_mgmt_address.py
+./ansible_collections/cisco/aci/plugins/modules/aci_subject_label.py
./ansible_collections/cisco/aci/plugins/modules/aci_switch_leaf_selector.py
./ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_leaf_profile.py
./ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_vpc_protection_group.py
@@ -1761,6 +1825,7 @@ tags.yaml
./ansible_collections/cisco/aci/plugins/modules/aci_vmm_vswitch_policy.py
./ansible_collections/cisco/aci/plugins/modules/aci_vrf.py
./ansible_collections/cisco/aci/plugins/modules/aci_vrf_leak_internal_subnet.py
+./ansible_collections/cisco/aci/plugins/modules/aci_vrf_multicast.py
./ansible_collections/cisco/aci/plugins/modules/aci_vzany_to_contract.py
./ansible_collections/cisco/asa/CHANGELOG.rst
./ansible_collections/cisco/asa/FILES.json
@@ -3365,6 +3430,7 @@ tags.yaml
./ansible_collections/cisco/ise/LICENSE
./ansible_collections/cisco/ise/MANIFEST.json
./ansible_collections/cisco/ise/Makefile
+./ansible_collections/cisco/ise/Pipfile
./ansible_collections/cisco/ise/README.md
./ansible_collections/cisco/ise/requirements.txt
./ansible_collections/cisco/ise/changelogs/changelog.yaml
@@ -3429,7 +3495,6 @@ tags.yaml
./ansible_collections/cisco/ise/playbooks/trustsec_vn_vlan_mapping.yml
./ansible_collections/cisco/ise/playbooks/group_vars/ise_servers
./ansible_collections/cisco/ise/playbooks/vars/device_administration_time_date_conditions.yml
-./ansible_collections/cisco/ise/plugins/.DS_Store
./ansible_collections/cisco/ise/plugins/action/aci_bindings_info.py
./ansible_collections/cisco/ise/plugins/action/aci_settings.py
./ansible_collections/cisco/ise/plugins/action/aci_settings_info.py
@@ -4287,8 +4352,16 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/README.md
./ansible_collections/cisco/meraki/plugins/__init__.py
./ansible_collections/cisco/meraki/plugins/action/administered_identities_me_info.py
+./ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_entitlements_info.py
+./ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_bind.py
+./ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim.py
+./ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim_key_validate.py
+./ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
+./ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_info.py
./ansible_collections/cisco/meraki/plugins/action/devices.py
./ansible_collections/cisco/meraki/plugins/action/devices_appliance_performance_info.py
+./ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings.py
+./ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_appliance_uplinks_settings.py
./ansible_collections/cisco/meraki/plugins/action/devices_appliance_uplinks_settings_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_appliance_vmx_authentication_token.py
@@ -4313,10 +4386,18 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims.py
./ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_info.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table_info.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping.py
./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device.py
./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_info.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test_info.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan.py
+./ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_lldp_cdp_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_management_interface.py
./ansible_collections/cisco/meraki/plugins/action/devices_management_interface_info.py
@@ -4334,6 +4415,7 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_routes_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_switch_warm_spare.py
./ansible_collections/cisco/meraki/plugins/action/devices_switch_warm_spare_info.py
+./ansible_collections/cisco/meraki/plugins/action/devices_wireless_alternate_management_interface_ipv6.py
./ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings.py
./ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings_info.py
./ansible_collections/cisco/meraki/plugins/action/devices_wireless_connection_stats_info.py
@@ -4373,6 +4455,8 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles.py
+./ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_malware.py
@@ -4394,6 +4478,7 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_bandwidth_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_vpn_exclusions.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans_settings.py
@@ -4481,14 +4566,18 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_device_profiles_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_fields.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_install_apps.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_lock.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_modify_tags.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_move.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_network_adapters_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_performance_history_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_reboot.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_refresh_details.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_security_centers_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_shutdown.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_unenroll.py
+./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_uninstall_apps.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wipe.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wlan_lists_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_sm_profiles_info.py
@@ -4555,6 +4644,10 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/networks_traffic_shaping_application_categories_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_traffic_shaping_dscp_tagging_options_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_unbind.py
+./ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles.py
+./ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_reassign.py
+./ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers.py
./ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_webhooks_payload_templates.py
@@ -4573,6 +4666,10 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/networks_wireless_connection_stats_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_wireless_data_rate_history_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_wireless_devices_connection_stats_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles.py
+./ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_assign.py
+./ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_info.py
+./ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_set_default.py
./ansible_collections/cisco/meraki/plugins/action/networks_wireless_failed_connections_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_wireless_latency_history_info.py
./ansible_collections/cisco/meraki/plugins/action/networks_wireless_latency_stats_info.py
@@ -4627,6 +4724,9 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/organizations_api_requests_overview_response_codes_by_interval_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_security_intrusion.py
./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_security_intrusion_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_statuses_overview_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_usage_by_network_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_vpn_third_party_vpnpeers.py
./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_vpn_third_party_vpnpeers_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_appliance_vpn_vpn_firewall_rules.py
@@ -4635,8 +4735,14 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies_priorities.py
./ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies_priorities_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_areas_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_lines_by_device_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_camera_custom_analytics_artifacts.py
./ansible_collections/cisco/meraki/plugins/action/organizations_camera_custom_analytics_artifacts_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_camera_detections_history_by_boundary_by_interval_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_camera_permissions_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_cellular_gateway_uplink_statuses_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_claim.py
./ansible_collections/cisco/meraki/plugins/action/organizations_clients_bandwidth_usage_history_info.py
@@ -4648,7 +4754,9 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports.py
./ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_change_history_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_devices_boots_history_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_devices_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_devices_power_modules_statuses_by_device_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_devices_provisioning_statuses_info.py
@@ -4698,7 +4806,11 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_sensor_readings_history_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_sensor_readings_latest_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_sm_apns_cert_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments_by_network_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_sm_vpp_accounts_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_snmp.py
./ansible_collections/cisco/meraki/plugins/action/organizations_snmp_info.py
@@ -4707,14 +4819,23 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_clients_manufacturers_by_usage_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_devices_by_usage_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_devices_models_by_usage_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_networks_by_status_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_ssids_by_usage_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_switches_by_energy_usage_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_switch_devices_clone.py
./ansible_collections/cisco/meraki/plugins/action/organizations_switch_ports_by_switch_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_uplinks_statuses_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_users.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_callbacks_statuses_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_logs_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_network_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_ethernet_statuses_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_client_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_network_info.py
./ansible_collections/cisco/meraki/plugins/doc_fragments/__init__.py
./ansible_collections/cisco/meraki/plugins/doc_fragments/meraki.py
./ansible_collections/cisco/meraki/plugins/doc_fragments/module.py
@@ -4724,8 +4845,16 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/module_utils/network/meraki/meraki.py
./ansible_collections/cisco/meraki/plugins/modules/__init__.py
./ansible_collections/cisco/meraki/plugins/modules/administered_identities_me_info.py
+./ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_entitlements_info.py
+./ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_bind.py
+./ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim.py
+./ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim_key_validate.py
+./ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
+./ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices.py
./ansible_collections/cisco/meraki/plugins/modules/devices_appliance_performance_info.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings.py
./ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_appliance_vmx_authentication_token.py
@@ -4750,10 +4879,18 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims.py
./ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_info.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table_info.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping.py
./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device.py
./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_info.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test_info.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_lldp_cdp_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_management_interface.py
./ansible_collections/cisco/meraki/plugins/modules/devices_management_interface_info.py
@@ -4771,6 +4908,7 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare.py
./ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare_info.py
+./ansible_collections/cisco/meraki/plugins/modules/devices_wireless_alternate_management_interface_ipv6.py
./ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings.py
./ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings_info.py
./ansible_collections/cisco/meraki/plugins/modules/devices_wireless_connection_stats_info.py
@@ -4853,6 +4991,8 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware.py
@@ -4874,6 +5014,7 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_vpn_exclusions.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings.py
@@ -4961,14 +5102,18 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_profiles_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_fields.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_install_apps.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_lock.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_modify_tags.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_move.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_network_adapters_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_performance_history_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_reboot.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_refresh_details.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_security_centers_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_shutdown.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_unenroll.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_uninstall_apps.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wipe.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wlan_lists_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_sm_profiles_info.py
@@ -5035,6 +5180,10 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_application_categories_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_unbind.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_reassign.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers.py
./ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates.py
@@ -5053,6 +5202,10 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_connection_stats_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_data_rate_history_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_devices_connection_stats_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_assign.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_info.py
+./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_set_default.py
./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_failed_connections_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_history_info.py
./ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_stats_info.py
@@ -5107,6 +5260,9 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_statuses_overview_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_usage_by_network_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py
@@ -5115,8 +5271,14 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_priorities.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_priorities_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_areas_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_lines_by_device_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_detections_history_by_boundary_by_interval_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_permissions_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_claim.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_clients_bandwidth_usage_history_info.py
@@ -5128,7 +5290,9 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_change_history_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_devices_boots_history_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_devices_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_devices_provisioning_statuses_info.py
@@ -5178,7 +5342,11 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_history_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_latest_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_sm_apns_cert_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments_by_network_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_sm_vpp_accounts_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_snmp.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_snmp_info.py
@@ -5187,14 +5355,23 @@ tags.yaml
./ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_by_usage_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_models_by_usage_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_networks_by_status_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_ssids_by_usage_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_switch_devices_clone.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_switch_ports_by_switch_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_uplinks_statuses_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_users.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_callbacks_statuses_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_logs_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_network_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_client_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_device_info.py
+./ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_network_info.py
./ansible_collections/cisco/meraki/plugins/plugin_utils/__init__.py
./ansible_collections/cisco/meraki/plugins/plugin_utils/exceptions.py
./ansible_collections/cisco/meraki/plugins/plugin_utils/meraki.py
@@ -5244,6 +5421,8 @@ tags.yaml
./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd.py
./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_l3out.py
./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_subnet.py
+./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph.py
+./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph_listener.py
./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg.py
./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg_selector.py
./ansible_collections/cisco/mso/plugins/modules/mso_schema_site_l3out.py
@@ -5919,6 +6098,7 @@ tags.yaml
./ansible_collections/community/aws/plugins/modules/dms_endpoint.py
./ansible_collections/community/aws/plugins/modules/dms_replication_subnet_group.py
./ansible_collections/community/aws/plugins/modules/dynamodb_table.py
+./ansible_collections/community/aws/plugins/modules/dynamodb_table_info.py
./ansible_collections/community/aws/plugins/modules/dynamodb_ttl.py
./ansible_collections/community/aws/plugins/modules/ec2_ami_copy.py
./ansible_collections/community/aws/plugins/modules/ec2_carrier_gateway.py
@@ -6183,6 +6363,7 @@ tags.yaml
./ansible_collections/community/crypto/plugins/modules/openssl_signature.py
./ansible_collections/community/crypto/plugins/modules/openssl_signature_info.py
./ansible_collections/community/crypto/plugins/modules/x509_certificate.py
+./ansible_collections/community/crypto/plugins/modules/x509_certificate_convert.py
./ansible_collections/community/crypto/plugins/modules/x509_certificate_info.py
./ansible_collections/community/crypto/plugins/modules/x509_certificate_pipe.py
./ansible_collections/community/crypto/plugins/modules/x509_crl.py
@@ -6304,8 +6485,11 @@ tags.yaml
./ansible_collections/community/dns/plugins/filter/domain_suffix.py
./ansible_collections/community/dns/plugins/filter/get_public_suffix.yml
./ansible_collections/community/dns/plugins/filter/get_registrable_domain.yml
+./ansible_collections/community/dns/plugins/filter/quote_txt.yml
./ansible_collections/community/dns/plugins/filter/remove_public_suffix.yml
./ansible_collections/community/dns/plugins/filter/remove_registrable_domain.yml
+./ansible_collections/community/dns/plugins/filter/txt.py
+./ansible_collections/community/dns/plugins/filter/unquote_txt.yml
./ansible_collections/community/dns/plugins/inventory/hetzner_dns_records.py
./ansible_collections/community/dns/plugins/inventory/hosttech_dns_records.py
./ansible_collections/community/dns/plugins/lookup/lookup.py
@@ -6358,6 +6542,7 @@ tags.yaml
./ansible_collections/community/dns/plugins/plugin_utils/public_suffix.py
./ansible_collections/community/dns/plugins/plugin_utils/resolver.py
./ansible_collections/community/dns/plugins/plugin_utils/templated_options.py
+./ansible_collections/community/dns/plugins/plugin_utils/unsafe.py
./ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py
./ansible_collections/community/docker/CHANGELOG.md
./ansible_collections/community/docker/CHANGELOG.md.license
@@ -6470,6 +6655,7 @@ tags.yaml
./ansible_collections/community/docker/plugins/plugin_utils/common.py
./ansible_collections/community/docker/plugins/plugin_utils/common_api.py
./ansible_collections/community/docker/plugins/plugin_utils/socket_handler.py
+./ansible_collections/community/docker/plugins/plugin_utils/unsafe.py
./ansible_collections/community/general/CHANGELOG.md
./ansible_collections/community/general/CHANGELOG.md.license
./ansible_collections/community/general/CHANGELOG.rst
@@ -6671,6 +6857,7 @@ tags.yaml
./ansible_collections/community/general/plugins/module_utils/consul.py
./ansible_collections/community/general/plugins/module_utils/csv.py
./ansible_collections/community/general/plugins/module_utils/database.py
+./ansible_collections/community/general/plugins/module_utils/datetime.py
./ansible_collections/community/general/plugins/module_utils/deps.py
./ansible_collections/community/general/plugins/module_utils/dimensiondata.py
./ansible_collections/community/general/plugins/module_utils/gandi_livedns_api.py
@@ -6968,6 +7155,7 @@ tags.yaml
./ansible_collections/community/general/plugins/modules/keycloak_authz_permission_info.py
./ansible_collections/community/general/plugins/modules/keycloak_client.py
./ansible_collections/community/general/plugins/modules/keycloak_client_rolemapping.py
+./ansible_collections/community/general/plugins/modules/keycloak_client_rolescope.py
./ansible_collections/community/general/plugins/modules/keycloak_clientscope.py
./ansible_collections/community/general/plugins/modules/keycloak_clientscope_type.py
./ansible_collections/community/general/plugins/modules/keycloak_clientsecret_info.py
@@ -7346,6 +7534,7 @@ tags.yaml
./ansible_collections/community/general/plugins/modules/zpool_facts.py
./ansible_collections/community/general/plugins/modules/zypper.py
./ansible_collections/community/general/plugins/modules/zypper_repository.py
+./ansible_collections/community/general/plugins/plugin_utils/unsafe.py
./ansible_collections/community/general/plugins/test/a_module.py
./ansible_collections/community/general/plugins/test/fqdn_valid.py
./ansible_collections/community/grafana/CHANGELOG.rst
@@ -7554,6 +7743,9 @@ tags.yaml
./ansible_collections/community/hrobot/plugins/modules/ssh_key.py
./ansible_collections/community/hrobot/plugins/modules/ssh_key_info.py
./ansible_collections/community/hrobot/plugins/modules/v_switch.py
+./ansible_collections/community/hrobot/plugins/plugin_utils/unsafe.py
+./ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md
+./ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md.license
./ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst
./ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst.license
./ansible_collections/community/library_inventory_filtering_v1/COPYING
@@ -8777,6 +8969,7 @@ tags.yaml
./ansible_collections/community/vmware/plugins/modules/vcenter_root_password_expiration.py
./ansible_collections/community/vmware/plugins/modules/vcenter_standard_key_provider.py
./ansible_collections/community/vmware/plugins/modules/vmware_about_info.py
+./ansible_collections/community/vmware/plugins/modules/vmware_all_snapshots_info.py
./ansible_collections/community/vmware/plugins/modules/vmware_category.py
./ansible_collections/community/vmware/plugins/modules/vmware_category_info.py
./ansible_collections/community/vmware/plugins/modules/vmware_cfg_backup.py
@@ -9370,6 +9563,7 @@ tags.yaml
./ansible_collections/containers/podman/plugins/module_utils/podman/common.py
./ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py
./ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py
+./ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py
./ansible_collections/containers/podman/plugins/modules/__init__.py
./ansible_collections/containers/podman/plugins/modules/podman_container.py
./ansible_collections/containers/podman/plugins/modules/podman_container_exec.py
@@ -10638,6 +10832,7 @@ tags.yaml
./ansible_collections/dellemc/powerflex/playbooks/modules/protection_domain.yml
./ansible_collections/dellemc/powerflex/playbooks/modules/replication_consistency_group.yml
./ansible_collections/dellemc/powerflex/playbooks/modules/replication_pair.yml
+./ansible_collections/dellemc/powerflex/playbooks/modules/resource_group.yml
./ansible_collections/dellemc/powerflex/playbooks/modules/sdc.yml
./ansible_collections/dellemc/powerflex/playbooks/modules/sds.yml
./ansible_collections/dellemc/powerflex/playbooks/modules/snapshot.yml
@@ -10666,6 +10861,7 @@ tags.yaml
./ansible_collections/dellemc/powerflex/plugins/modules/protection_domain.py
./ansible_collections/dellemc/powerflex/plugins/modules/replication_consistency_group.py
./ansible_collections/dellemc/powerflex/plugins/modules/replication_pair.py
+./ansible_collections/dellemc/powerflex/plugins/modules/resource_group.py
./ansible_collections/dellemc/powerflex/plugins/modules/sdc.py
./ansible_collections/dellemc/powerflex/plugins/modules/sds.py
./ansible_collections/dellemc/powerflex/plugins/modules/snapshot.py
@@ -12400,8 +12596,10 @@ tags.yaml
./ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_profile.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_configuration_fact.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_credential_store_domain_controller.py
+./ansible_collections/fortinet/fortios/plugins/modules/fortios_diameter_filter_profile.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_data_type.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_dictionary.py
+./ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_exact_data_match.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_filepattern.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_doc_source.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_sensitivity.py
@@ -12817,6 +13015,7 @@ tags.yaml
./ansible_collections/fortinet/fortios/plugins/modules/fortios_system_network_visibility.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_system_np6.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu.py
+./ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu_vlink.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ntp.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_system_object_tagging.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy.py
@@ -12903,6 +13102,7 @@ tags.yaml
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_group.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_domain_controller.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_exchange.py
+./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_external_identity_provider.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fortitoken.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso_polling.py
@@ -12921,6 +13121,7 @@ tags.yaml
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_security_exempt_list.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_setting.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_user_tacacsplus.py
+./ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_keyword.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_profile.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_channel_filter.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_key.py
@@ -12946,6 +13147,7 @@ tags.yaml
./ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_l2tp.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ocvpn.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_pptp.py
+./ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_qkd.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_client.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_settings.py
./ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_host_check_software.py
@@ -13818,6 +14020,7 @@ tags.yaml
./ansible_collections/infinidat/infinibox/plugins/modules/infini_fibre_channel_switch.py
./ansible_collections/infinidat/infinibox/plugins/modules/infini_fs.py
./ansible_collections/infinidat/infinibox/plugins/modules/infini_host.py
+./ansible_collections/infinidat/infinibox/plugins/modules/infini_infinimetrics.py
./ansible_collections/infinidat/infinibox/plugins/modules/infini_map.py
./ansible_collections/infinidat/infinibox/plugins/modules/infini_metadata.py
./ansible_collections/infinidat/infinibox/plugins/modules/infini_network_space.py
@@ -15041,7 +15244,6 @@ tags.yaml
./ansible_collections/netapp/ontap/MANIFEST.json
./ansible_collections/netapp/ontap/README.md
./ansible_collections/netapp/ontap/requirements.txt
-./ansible_collections/netapp/ontap/changelogs/.DS_Store
./ansible_collections/netapp/ontap/changelogs/.plugin-cache.yaml
./ansible_collections/netapp/ontap/changelogs/changelog.yaml
./ansible_collections/netapp/ontap/changelogs/config.yaml
@@ -15511,6 +15713,7 @@ tags.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6330.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6331.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6341.yaml
+./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6356.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6374.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6386.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6389.yaml
@@ -15540,6 +15743,12 @@ tags.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6671.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6680.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6681.yaml
+./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6691.yaml
+./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6715.yaml
+./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6721.yaml
+./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6747.yaml
+./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6807.yaml
+./ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6825.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/GITHUB-174.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/github-110.yaml
./ansible_collections/netapp/ontap/changelogs/fragments/github-56.yaml
@@ -17109,6 +17318,10 @@ tags.yaml
./ansible_collections/purestorage/flashblade/changelogs/fragments/263_fix_multiple_modules_idempotency.yaml
./ansible_collections/purestorage/flashblade/changelogs/fragments/266_bucket_fix.yaml
./ansible_collections/purestorage/flashblade/changelogs/fragments/268_multi-chassis-lag.yaml
+./ansible_collections/purestorage/flashblade/changelogs/fragments/270_add_go.yaml
+./ansible_collections/purestorage/flashblade/changelogs/fragments/271_add_worm.yaml
+./ansible_collections/purestorage/flashblade/changelogs/fragments/273_add_nap.yaml
+./ansible_collections/purestorage/flashblade/changelogs/fragments/274_fan_in.yaml
./ansible_collections/purestorage/flashblade/changelogs/fragments/76_default_fs_size.yaml
./ansible_collections/purestorage/flashblade/changelogs/fragments/77_filesystem_policies_info.yaml
./ansible_collections/purestorage/flashblade/changelogs/fragments/78_update_filesystem_replica_link.yaml
@@ -19059,6 +19272,7 @@ ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/playb
ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/tasks/setup.yml
ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/tasks/tear_down.yml
ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/tasks/test_refresh_inventory.yml
+ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/config.ini.j2
ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory.yml.j2
ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory_with_cache.yml.j2
ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory_with_concatenation.yml.j2
@@ -19412,6 +19626,7 @@ ansible_collections/amazon/aws/tests/unit/module_utils/errors/aws_error_handler/
ansible_collections/amazon/aws/tests/unit/module_utils/exceptions/__init__.py
ansible_collections/amazon/aws/tests/unit/module_utils/exceptions/test_exceptions.py
ansible_collections/amazon/aws/tests/unit/module_utils/iam/test_iam_error_handler.py
+ansible_collections/amazon/aws/tests/unit/module_utils/iam/test_iam_resource_transforms.py
ansible_collections/amazon/aws/tests/unit/module_utils/iam/test_validate_iam_identifiers.py
ansible_collections/amazon/aws/tests/unit/module_utils/modules/__init__.py
ansible_collections/amazon/aws/tests/unit/module_utils/modules/ansible_aws_module/__init__.py
@@ -19431,6 +19646,7 @@ ansible_collections/amazon/aws/tests/unit/module_utils/retries/test_botocore_exc
ansible_collections/amazon/aws/tests/unit/module_utils/retries/test_retry_wrapper.py
ansible_collections/amazon/aws/tests/unit/module_utils/transformation/__init__.py
ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_ansible_dict_to_boto3_filter_list.py
+ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_boto3_resource_to_ansible_dict.py
ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_map_complex_type.py
ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_scrub_none_parameters.py
ansible_collections/amazon/aws/tests/unit/plugin_utils/__init__.py
@@ -23300,16 +23516,21 @@ ansible_collections/cisco/aci/plugins/doc_fragments/__init__.py
ansible_collections/cisco/aci/plugins/doc_fragments/aci.py
ansible_collections/cisco/aci/plugins/doc_fragments/annotation.py
ansible_collections/cisco/aci/plugins/doc_fragments/owner.py
+ansible_collections/cisco/aci/plugins/filter/listify.py
ansible_collections/cisco/aci/plugins/httpapi/aci.py
ansible_collections/cisco/aci/plugins/lookup/__init__.py
ansible_collections/cisco/aci/plugins/lookup/interface_range.py
ansible_collections/cisco/aci/plugins/module_utils/__init__.py
ansible_collections/cisco/aci/plugins/module_utils/aci.py
+ansible_collections/cisco/aci/plugins/module_utils/annotation_unsupported.py
ansible_collections/cisco/aci/plugins/module_utils/constants.py
ansible_collections/cisco/aci/plugins/modules/__init__.py
+ansible_collections/cisco/aci/plugins/modules/aci_aaa_certificate_authority.py
ansible_collections/cisco/aci/plugins/modules/aci_aaa_custom_privilege.py
ansible_collections/cisco/aci/plugins/modules/aci_aaa_domain.py
+ansible_collections/cisco/aci/plugins/modules/aci_aaa_key_ring.py
ansible_collections/cisco/aci/plugins/modules/aci_aaa_role.py
+ansible_collections/cisco/aci/plugins/modules/aci_aaa_security_default_settings.py
ansible_collections/cisco/aci/plugins/modules/aci_aaa_ssh_auth.py
ansible_collections/cisco/aci/plugins/modules/aci_aaa_user.py
ansible_collections/cisco/aci/plugins/modules/aci_aaa_user_certificate.py
@@ -23323,16 +23544,31 @@ ansible_collections/cisco/aci/plugins/modules/aci_access_span_filter_group_entry
ansible_collections/cisco/aci/plugins/modules/aci_access_span_src_group.py
ansible_collections/cisco/aci/plugins/modules/aci_access_span_src_group_src.py
ansible_collections/cisco/aci/plugins/modules/aci_access_span_src_group_src_path.py
+ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile_to_spine_switch_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_selector.py
+ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_selector.py
ansible_collections/cisco/aci/plugins/modules/aci_access_sub_port_block_to_access_port.py
+ansible_collections/cisco/aci/plugins/modules/aci_access_switch_policy_group.py
+ansible_collections/cisco/aci/plugins/modules/aci_action_rule_additional_communities.py
+ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path.py
+ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path_asn.py
ansible_collections/cisco/aci/plugins/modules/aci_aep.py
ansible_collections/cisco/aci/plugins/modules/aci_aep_to_domain.py
ansible_collections/cisco/aci/plugins/modules/aci_aep_to_epg.py
ansible_collections/cisco/aci/plugins/modules/aci_ap.py
ansible_collections/cisco/aci/plugins/modules/aci_bd.py
ansible_collections/cisco/aci/plugins/modules/aci_bd_dhcp_label.py
+ansible_collections/cisco/aci/plugins/modules/aci_bd_rogue_exception_mac.py
ansible_collections/cisco/aci/plugins/modules/aci_bd_subnet.py
ansible_collections/cisco/aci/plugins/modules/aci_bd_to_l3out.py
+ansible_collections/cisco/aci/plugins/modules/aci_bd_to_netflow_monitor_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_bfd_multihop_node_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_bgp_address_family_context_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_bgp_best_path_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_bgp_peer_prefix_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_bgp_route_summarization_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_asn.py
ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_node.py
ansible_collections/cisco/aci/plugins/modules/aci_bgp_timers_policy.py
@@ -23359,6 +23595,8 @@ ansible_collections/cisco/aci/plugins/modules/aci_contract_export.py
ansible_collections/cisco/aci/plugins/modules/aci_contract_subject.py
ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_filter.py
ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_service_graph.py
+ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option.py
+ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay.py
ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay_provider.py
ansible_collections/cisco/aci/plugins/modules/aci_dns_domain.py
@@ -23376,17 +23614,28 @@ ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract.py
ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_interface.py
ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_master.py
ansible_collections/cisco/aci/plugins/modules/aci_epg_to_domain.py
+ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_block_statement.py
+ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_simple_statement.py
ansible_collections/cisco/aci/plugins/modules/aci_esg.py
ansible_collections/cisco/aci/plugins/modules/aci_esg_contract_master.py
ansible_collections/cisco/aci/plugins/modules/aci_esg_epg_selector.py
ansible_collections/cisco/aci/plugins/modules/aci_esg_ip_subnet_selector.py
ansible_collections/cisco/aci/plugins/modules/aci_esg_tag_selector.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_connection_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_routing_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_interface_policy_group.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_switch_assoc.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access_https_cipher.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_node.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_node_control.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_connectivity_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_external_tep.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_policy_group.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_remote_pool.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_selector.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_scheduler.py
ansible_collections/cisco/aci/plugins/modules/aci_fabric_span_dst_group.py
@@ -23410,8 +23659,12 @@ ansible_collections/cisco/aci/plugins/modules/aci_igmp_interface_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_blacklist.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_config.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_description.py
+ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd.py
+ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd_multihop.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_cdp.py
+ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_eigrp.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_fc.py
+ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_hsrp.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_l2.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_breakout_port_group.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_fc_policy_group.py
@@ -23422,11 +23675,15 @@ ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_link_level.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_lldp.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_mcp.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_ospf.py
+ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_pim.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_port_channel.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_port_security.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_spanning_tree.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_spine_policy_group.py
+ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_storm_control.py
ansible_collections/cisco/aci/plugins/modules/aci_interface_selector_to_switch_policy_leaf_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_key_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_keychain_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_l2out.py
ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg.py
ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg_to_contract.py
@@ -23434,11 +23691,22 @@ ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_path.p
ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_node_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_interface_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_multihop_interface_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_peer.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_protocol_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_dhcp_relay_label.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_eigrp_interface_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg_to_contract.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_extsubnet.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path_secondary_ip.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_secondary_ip.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_group.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_interface_profile.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_secondary_vip.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface_secondary_ip.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile.py
@@ -23449,6 +23717,7 @@ ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_route_tag_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes.py
ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes_nexthop.py
+ansible_collections/cisco/aci/plugins/modules/aci_l3out_to_sr_mpls_infra_l3out.py
ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group.py
ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group_node.py
ansible_collections/cisco/aci/plugins/modules/aci_maintenance_policy.py
@@ -23458,9 +23727,19 @@ ansible_collections/cisco/aci/plugins/modules/aci_match_community_regex_term.py
ansible_collections/cisco/aci/plugins/modules/aci_match_community_term.py
ansible_collections/cisco/aci/plugins/modules/aci_match_route_destination.py
ansible_collections/cisco/aci/plugins/modules/aci_match_rule.py
+ansible_collections/cisco/aci/plugins/modules/aci_netflow_exporter_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_to_exporter.py
+ansible_collections/cisco/aci/plugins/modules/aci_netflow_record_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_node_block.py
ansible_collections/cisco/aci/plugins/modules/aci_node_mgmt_epg.py
ansible_collections/cisco/aci/plugins/modules/aci_ntp_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_ntp_server.py
+ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_entry.py
+ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_qos_custom_policy.py
+ansible_collections/cisco/aci/plugins/modules/aci_qos_dot1p_class.py
+ansible_collections/cisco/aci/plugins/modules/aci_qos_dscp_class.py
ansible_collections/cisco/aci/plugins/modules/aci_rest.py
ansible_collections/cisco/aci/plugins/modules/aci_route_control_context.py
ansible_collections/cisco/aci/plugins/modules/aci_route_control_profile.py
@@ -23471,6 +23750,7 @@ ansible_collections/cisco/aci/plugins/modules/aci_snmp_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_snmp_user.py
ansible_collections/cisco/aci/plugins/modules/aci_static_binding_to_epg.py
ansible_collections/cisco/aci/plugins/modules/aci_static_node_mgmt_address.py
+ansible_collections/cisco/aci/plugins/modules/aci_subject_label.py
ansible_collections/cisco/aci/plugins/modules/aci_switch_leaf_selector.py
ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_leaf_profile.py
ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_vpc_protection_group.py
@@ -23499,17 +23779,27 @@ ansible_collections/cisco/aci/plugins/modules/aci_vmm_uplink_container.py
ansible_collections/cisco/aci/plugins/modules/aci_vmm_vswitch_policy.py
ansible_collections/cisco/aci/plugins/modules/aci_vrf.py
ansible_collections/cisco/aci/plugins/modules/aci_vrf_leak_internal_subnet.py
+ansible_collections/cisco/aci/plugins/modules/aci_vrf_multicast.py
ansible_collections/cisco/aci/plugins/modules/aci_vzany_to_contract.py
ansible_collections/cisco/aci/tests/.gitignore
ansible_collections/cisco/aci/tests/integration/inventory.networking
ansible_collections/cisco/aci/tests/integration/network-integration.requirements.txt
ansible_collections/cisco/aci/tests/integration/target-prefixes.network
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/pki/admin.crt
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_custom_privilege/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_custom_privilege/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_domain/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_domain/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.crt
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.key
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_role/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_role/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/pki/sshkey.pub
ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/tasks/main.yml
@@ -23544,8 +23834,26 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_grou
ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src_path/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src_path/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_access_sub_port_block_to_access_port/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_access_sub_port_block_to_access_port/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_aep/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_aep/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_domain/aliases
@@ -23558,12 +23866,24 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_bd/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_bd/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_bd_dhcp_label/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_bd_dhcp_label/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_bd_subnet/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_bd_subnet/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_l3out/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_l3out/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_best_path_policy/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_best_path_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_asn/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_asn/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_node/aliases
@@ -23617,6 +23937,10 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_
ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_filter/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_service_graph/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_service_graph/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay_provider/aliases
@@ -23662,6 +23986,11 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_mast
ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_master/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_domain/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_domain/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/simple_block_levels.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_esg/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_esg/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_esg_contract_master/aliases
@@ -23672,18 +24001,40 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_esg_ip_subnet_select
ansible_collections/cisco/aci/tests/integration/targets/aci_esg_ip_subnet_selector/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_esg_tag_selector/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_esg_tag_selector/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_interface_policy_group/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_interface_policy_group/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_profile/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_profile/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_switch_assoc/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_switch_assoc/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.crt
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.key
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.crt
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.key
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node_control/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node_control/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_policy_group/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_policy_group/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_selector/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_selector/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_scheduler/aliases
@@ -23715,6 +24066,8 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_filter/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_filter/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_filter_entry/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_filter_entry/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group_node/aliases
@@ -23731,10 +24084,18 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_interface_config/ali
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_config/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_description/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_description/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_cdp/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_cdp/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_fc/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_fc/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_l2/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_l2/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_breakout_port_group/aliases
@@ -23755,6 +24116,8 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_mcp
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_mcp/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_ospf/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_ospf/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_channel/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_channel/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_security/aliases
@@ -23763,8 +24126,14 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spa
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spanning_tree/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spine_policy_group/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spine_policy_group/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l2out/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l2out/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg/aliases
@@ -23779,16 +24148,38 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_node_p
ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_node_profile/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_peer/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_peer/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_protocol_profile/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_protocol_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg_to_contract/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg_to_contract/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extsubnet/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extsubnet/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface_secondary_ip/aliases
@@ -23809,6 +24200,8 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes/
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes_nexthop/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes_nexthop/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_lookup_interface_range/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_lookup_interface_range/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group/aliases
@@ -23829,12 +24222,32 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_match_route_destinat
ansible_collections/cisco/aci/tests/integration/targets/aci_match_route_destination/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_match_rule/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_match_rule/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_node_mgmt_epg/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_node_mgmt_epg/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_policy/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_policy/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_server/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_server/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/error_handling.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_inline.yml
@@ -23848,6 +24261,9 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/pki/admin
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/pki/admin.key
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/fail_parse.json
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/fail_parse.xml
+ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tag.xml
+ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml
+ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation_children.xml
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_create.xml
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_delete.xml
ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_negative_update_check.xml
@@ -23870,6 +24286,9 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_static_binding_to_ep
ansible_collections/cisco/aci/tests/integration/targets/aci_static_binding_to_epg/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_static_node_mgmt_address/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_static_node_mgmt_address/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/subject_label.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_switch_leaf_selector/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_switch_leaf_selector/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_leaf_profile/aliases
@@ -23938,6 +24357,8 @@ ansible_collections/cisco/aci/tests/integration/targets/aci_vrf/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_vrf/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_leak_internal_subnet/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_leak_internal_subnet/tasks/main.yml
+ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/aliases
+ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/tasks/main.yml
ansible_collections/cisco/aci/tests/integration/targets/aci_vzany_to_contract/aliases
ansible_collections/cisco/aci/tests/integration/targets/aci_vzany_to_contract/tasks/main.yml
ansible_collections/cisco/aci/tests/sanity/requirements.txt
@@ -24171,6 +24592,7 @@ ansible_collections/cisco/dnac/.github/ISSUE_TEMPLATE/config.yml
ansible_collections/cisco/dnac/.github/ISSUE_TEMPLATE/feature_request.md
ansible_collections/cisco/dnac/.github/workflows/docs.yml
ansible_collections/cisco/dnac/.github/workflows/sanity_tests.yml
+ansible_collections/cisco/dnac/.github/workflows/sanity_tests_devel.yml
ansible_collections/cisco/dnac/changelogs/changelog.yaml
ansible_collections/cisco/dnac/docs/Makefile
ansible_collections/cisco/dnac/docs/conf.py
@@ -27152,12 +27574,12 @@ ansible_collections/cisco/iosxr/tests/unit/modules/network/iosxr/fixtures/clicon
ansible_collections/cisco/iosxr/tests/unit/modules/network/iosxr/fixtures/cliconf/iosxr/show_version__utility_head_-n_20
ansible_collections/cisco/iosxr/tests/unit/modules/network/iosxr/fixtures/cliconf_ncs540/iosxr/show_running-config_hostname
ansible_collections/cisco/iosxr/tests/unit/modules/network/iosxr/fixtures/cliconf_ncs540/iosxr/show_version__utility_head_-n_20
-ansible_collections/cisco/ise/.DS_Store
ansible_collections/cisco/ise/.gitignore
ansible_collections/cisco/ise/FILES.json
ansible_collections/cisco/ise/LICENSE
ansible_collections/cisco/ise/MANIFEST.json
ansible_collections/cisco/ise/Makefile
+ansible_collections/cisco/ise/Pipfile
ansible_collections/cisco/ise/README.md
ansible_collections/cisco/ise/requirements.txt
ansible_collections/cisco/ise/.github/ISSUE_TEMPLATE/bug_report.md
@@ -27165,8 +27587,6 @@ ansible_collections/cisco/ise/.github/ISSUE_TEMPLATE/config.yml
ansible_collections/cisco/ise/.github/ISSUE_TEMPLATE/feature_request.md
ansible_collections/cisco/ise/.github/workflows/docs.yml
ansible_collections/cisco/ise/.github/workflows/sanity_tests.yml
-ansible_collections/cisco/ise/.vscode/launch.json
-ansible_collections/cisco/ise/.vscode/settings.json
ansible_collections/cisco/ise/changelogs/changelog.yaml
ansible_collections/cisco/ise/docs/Makefile
ansible_collections/cisco/ise/docs/conf.py
@@ -27236,7 +27656,6 @@ ansible_collections/cisco/ise/playbooks/trustsec_vn.yml
ansible_collections/cisco/ise/playbooks/trustsec_vn_vlan_mapping.yml
ansible_collections/cisco/ise/playbooks/group_vars/ise_servers
ansible_collections/cisco/ise/playbooks/vars/device_administration_time_date_conditions.yml
-ansible_collections/cisco/ise/plugins/.DS_Store
ansible_collections/cisco/ise/plugins/action/aci_bindings_info.py
ansible_collections/cisco/ise/plugins/action/aci_settings.py
ansible_collections/cisco/ise/plugins/action/aci_settings_info.py
@@ -28043,7 +28462,6 @@ ansible_collections/cisco/meraki/README.md
ansible_collections/cisco/meraki/requirements.txt
ansible_collections/cisco/meraki/.github/workflows/docs.yml
ansible_collections/cisco/meraki/.github/workflows/sanity_tests.yml
-ansible_collections/cisco/meraki/.vscode/settings.json
ansible_collections/cisco/meraki/changelogs/changelog.yaml
ansible_collections/cisco/meraki/changelogs/config.yaml
ansible_collections/cisco/meraki/docs/Makefile
@@ -28110,8 +28528,16 @@ ansible_collections/cisco/meraki/playbooks/files/test.template
ansible_collections/cisco/meraki/plugins/README.md
ansible_collections/cisco/meraki/plugins/__init__.py
ansible_collections/cisco/meraki/plugins/action/administered_identities_me_info.py
+ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_entitlements_info.py
+ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_bind.py
+ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim.py
+ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim_key_validate.py
+ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
+ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_info.py
ansible_collections/cisco/meraki/plugins/action/devices.py
ansible_collections/cisco/meraki/plugins/action/devices_appliance_performance_info.py
+ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings.py
+ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings_info.py
ansible_collections/cisco/meraki/plugins/action/devices_appliance_uplinks_settings.py
ansible_collections/cisco/meraki/plugins/action/devices_appliance_uplinks_settings_info.py
ansible_collections/cisco/meraki/plugins/action/devices_appliance_vmx_authentication_token.py
@@ -28136,10 +28562,18 @@ ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_port_fo
ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims.py
ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims_info.py
ansible_collections/cisco/meraki/plugins/action/devices_info.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table_info.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test_info.py
ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping.py
ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device.py
ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device_info.py
ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_info.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test_info.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan.py
+ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan_info.py
ansible_collections/cisco/meraki/plugins/action/devices_lldp_cdp_info.py
ansible_collections/cisco/meraki/plugins/action/devices_management_interface.py
ansible_collections/cisco/meraki/plugins/action/devices_management_interface_info.py
@@ -28157,6 +28591,7 @@ ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_ro
ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_routes_info.py
ansible_collections/cisco/meraki/plugins/action/devices_switch_warm_spare.py
ansible_collections/cisco/meraki/plugins/action/devices_switch_warm_spare_info.py
+ansible_collections/cisco/meraki/plugins/action/devices_wireless_alternate_management_interface_ipv6.py
ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings.py
ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings_info.py
ansible_collections/cisco/meraki/plugins/action/devices_wireless_connection_stats_info.py
@@ -28196,6 +28631,8 @@ ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports_info.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles.py
+ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles_info.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion_info.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_malware.py
@@ -28217,6 +28654,7 @@ ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shapi
ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_bandwidth_info.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_vpn_exclusions.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans_info.py
ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans_settings.py
@@ -28304,14 +28742,18 @@ ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_device_comma
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_device_profiles_info.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_fields.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_install_apps.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_lock.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_modify_tags.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_move.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_network_adapters_info.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_performance_history_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_reboot.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_refresh_details.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_security_centers_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_shutdown.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_unenroll.py
+ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_uninstall_apps.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wipe.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wlan_lists_info.py
ansible_collections/cisco/meraki/plugins/action/networks_sm_profiles_info.py
@@ -28378,6 +28820,10 @@ ansible_collections/cisco/meraki/plugins/action/networks_traffic_analysis_info.p
ansible_collections/cisco/meraki/plugins/action/networks_traffic_shaping_application_categories_info.py
ansible_collections/cisco/meraki/plugins/action/networks_traffic_shaping_dscp_tagging_options_info.py
ansible_collections/cisco/meraki/plugins/action/networks_unbind.py
+ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles.py
+ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_by_device_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_reassign.py
+ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_info.py
ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers.py
ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers_info.py
ansible_collections/cisco/meraki/plugins/action/networks_webhooks_payload_templates.py
@@ -28396,6 +28842,10 @@ ansible_collections/cisco/meraki/plugins/action/networks_wireless_clients_latenc
ansible_collections/cisco/meraki/plugins/action/networks_wireless_connection_stats_info.py
ansible_collections/cisco/meraki/plugins/action/networks_wireless_data_rate_history_info.py
ansible_collections/cisco/meraki/plugins/action/networks_wireless_devices_connection_stats_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles.py
+ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_assign.py
+ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_info.py
+ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_set_default.py
ansible_collections/cisco/meraki/plugins/action/networks_wireless_failed_connections_info.py
ansible_collections/cisco/meraki/plugins/action/networks_wireless_latency_history_info.py
ansible_collections/cisco/meraki/plugins/action/networks_wireless_latency_stats_info.py
@@ -28450,6 +28900,9 @@ ansible_collections/cisco/meraki/plugins/action/organizations_api_requests_overv
ansible_collections/cisco/meraki/plugins/action/organizations_api_requests_overview_response_codes_by_interval_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_appliance_security_intrusion.py
ansible_collections/cisco/meraki/plugins/action/organizations_appliance_security_intrusion_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_statuses_overview_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_usage_by_network_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_appliance_vpn_third_party_vpnpeers.py
ansible_collections/cisco/meraki/plugins/action/organizations_appliance_vpn_third_party_vpnpeers_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_appliance_vpn_vpn_firewall_rules.py
@@ -28458,8 +28911,14 @@ ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies.
ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies_priorities.py
ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies_priorities_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_areas_by_device_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_lines_by_device_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_camera_custom_analytics_artifacts.py
ansible_collections/cisco/meraki/plugins/action/organizations_camera_custom_analytics_artifacts_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_camera_detections_history_by_boundary_by_interval_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_camera_permissions_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles.py
+ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_cellular_gateway_uplink_statuses_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_claim.py
ansible_collections/cisco/meraki/plugins/action/organizations_clients_bandwidth_usage_history_info.py
@@ -28471,7 +28930,9 @@ ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_i
ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports.py
ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_change_history_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_devices_boots_history_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_devices_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_devices_power_modules_statuses_by_device_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_devices_provisioning_statuses_info.py
@@ -28521,7 +28982,11 @@ ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles.py
ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_sensor_readings_history_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_sensor_readings_latest_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles.py
+ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_sm_apns_cert_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments.py
+ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments_by_network_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_sm_vpp_accounts_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_snmp.py
ansible_collections/cisco/meraki/plugins/action/organizations_snmp_info.py
@@ -28530,14 +28995,23 @@ ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_client
ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_clients_manufacturers_by_usage_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_devices_by_usage_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_devices_models_by_usage_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_networks_by_status_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_ssids_by_usage_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_switches_by_energy_usage_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_switch_devices_clone.py
ansible_collections/cisco/meraki/plugins/action/organizations_switch_ports_by_switch_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_uplinks_statuses_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_users.py
+ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_callbacks_statuses_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_logs_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_device_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_network_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_ethernet_statuses_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_client_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_device_info.py
+ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_network_info.py
ansible_collections/cisco/meraki/plugins/doc_fragments/__init__.py
ansible_collections/cisco/meraki/plugins/doc_fragments/meraki.py
ansible_collections/cisco/meraki/plugins/doc_fragments/module.py
@@ -28547,8 +29021,16 @@ ansible_collections/cisco/meraki/plugins/module_utils/network/meraki/__init__.py
ansible_collections/cisco/meraki/plugins/module_utils/network/meraki/meraki.py
ansible_collections/cisco/meraki/plugins/modules/__init__.py
ansible_collections/cisco/meraki/plugins/modules/administered_identities_me_info.py
+ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_entitlements_info.py
+ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_bind.py
+ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim.py
+ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim_key_validate.py
+ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
+ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_info.py
ansible_collections/cisco/meraki/plugins/modules/devices.py
ansible_collections/cisco/meraki/plugins/modules/devices_appliance_performance_info.py
+ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings.py
+ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings.py
ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_appliance_vmx_authentication_token.py
@@ -28573,10 +29055,18 @@ ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_port_f
ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims.py
ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_info.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table_info.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping.py
ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device.py
ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_info.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test_info.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan.py
+ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_lldp_cdp_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_management_interface.py
ansible_collections/cisco/meraki/plugins/modules/devices_management_interface_info.py
@@ -28594,6 +29084,7 @@ ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_r
ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare.py
ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare_info.py
+ansible_collections/cisco/meraki/plugins/modules/devices_wireless_alternate_management_interface_ipv6.py
ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings.py
ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings_info.py
ansible_collections/cisco/meraki/plugins/modules/devices_wireless_connection_stats_info.py
@@ -28676,6 +29167,8 @@ ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles.py
+ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware.py
@@ -28697,6 +29190,7 @@ ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shap
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_vpn_exclusions.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings.py
@@ -28784,14 +29278,18 @@ ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_comm
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_profiles_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_fields.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_install_apps.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_lock.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_modify_tags.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_move.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_network_adapters_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_performance_history_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_reboot.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_refresh_details.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_security_centers_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_shutdown.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_unenroll.py
+ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_uninstall_apps.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wipe.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wlan_lists_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_sm_profiles_info.py
@@ -28858,6 +29356,10 @@ ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis_info.
ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_application_categories_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_unbind.py
+ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles.py
+ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_by_device_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_reassign.py
+ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers.py
ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates.py
@@ -28876,6 +29378,10 @@ ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_laten
ansible_collections/cisco/meraki/plugins/modules/networks_wireless_connection_stats_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_wireless_data_rate_history_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_wireless_devices_connection_stats_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles.py
+ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_assign.py
+ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_info.py
+ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_set_default.py
ansible_collections/cisco/meraki/plugins/modules/networks_wireless_failed_connections_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_history_info.py
ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_stats_info.py
@@ -28930,6 +29436,9 @@ ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_over
ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion.py
ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_statuses_overview_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_usage_by_network_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py
ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py
@@ -28938,8 +29447,14 @@ ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies
ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_priorities.py
ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_priorities_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_areas_by_device_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_lines_by_device_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts.py
ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_camera_detections_history_by_boundary_by_interval_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_camera_permissions_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_claim.py
ansible_collections/cisco/meraki/plugins/modules/organizations_clients_bandwidth_usage_history_info.py
@@ -28951,7 +29466,9 @@ ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_
ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports.py
ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_change_history_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_devices_boots_history_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_devices_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_devices_provisioning_statuses_info.py
@@ -29001,7 +29518,11 @@ ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles.py
ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_history_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_latest_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_sm_apns_cert_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments_by_network_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_sm_vpp_accounts_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_snmp.py
ansible_collections/cisco/meraki/plugins/modules/organizations_snmp_info.py
@@ -29010,14 +29531,23 @@ ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clien
ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_by_usage_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_models_by_usage_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_networks_by_status_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_ssids_by_usage_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_switch_devices_clone.py
ansible_collections/cisco/meraki/plugins/modules/organizations_switch_ports_by_switch_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_uplinks_statuses_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_users.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_callbacks_statuses_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_logs_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_device_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_network_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_client_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_device_info.py
+ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_network_info.py
ansible_collections/cisco/meraki/plugins/plugin_utils/__init__.py
ansible_collections/cisco/meraki/plugins/plugin_utils/exceptions.py
ansible_collections/cisco/meraki/plugins/plugin_utils/meraki.py
@@ -29139,6 +29669,8 @@ ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_useg_attri
ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd.py
ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_l3out.py
ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_subnet.py
+ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph.py
+ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph_listener.py
ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg.py
ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg_selector.py
ansible_collections/cisco/mso/plugins/modules/mso_schema_site_l3out.py
@@ -29246,6 +29778,13 @@ ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_l3out
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_l3out/tasks/main.yml
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_subnet/aliases
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_subnet/tasks/main.yml
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/aliases
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/l4_l7_devices.yml
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/main.yml
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/aliases
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/l4_l7_devices.yml
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/main.yml
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/pki/admin.crt
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg/aliases
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg/tasks/main.yml
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg_selector/aliases
@@ -29253,6 +29792,7 @@ ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_l3out/aliases
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_l3out/tasks/main.yml
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/aliases
+ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/l4_l7_devices.yml
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/main.yml
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region/aliases
ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region/tasks/main.yml
@@ -31363,6 +31903,7 @@ ansible_collections/community/aws/plugins/modules/directconnect_virtual_interfac
ansible_collections/community/aws/plugins/modules/dms_endpoint.py
ansible_collections/community/aws/plugins/modules/dms_replication_subnet_group.py
ansible_collections/community/aws/plugins/modules/dynamodb_table.py
+ansible_collections/community/aws/plugins/modules/dynamodb_table_info.py
ansible_collections/community/aws/plugins/modules/dynamodb_ttl.py
ansible_collections/community/aws/plugins/modules/ec2_ami_copy.py
ansible_collections/community/aws/plugins/modules/ec2_carrier_gateway.py
@@ -32826,6 +33367,7 @@ ansible_collections/community/crypto/changelogs/changelog.yaml
ansible_collections/community/crypto/changelogs/changelog.yaml.license
ansible_collections/community/crypto/changelogs/config.yaml
ansible_collections/community/crypto/changelogs/fragments/.keep
+ansible_collections/community/crypto/docs/docsite/config.yml
ansible_collections/community/crypto/docs/docsite/extra-docs.yml
ansible_collections/community/crypto/docs/docsite/links.yml
ansible_collections/community/crypto/docs/docsite/rst/guide_ownca.rst
@@ -32928,6 +33470,7 @@ ansible_collections/community/crypto/plugins/modules/openssl_publickey_info.py
ansible_collections/community/crypto/plugins/modules/openssl_signature.py
ansible_collections/community/crypto/plugins/modules/openssl_signature_info.py
ansible_collections/community/crypto/plugins/modules/x509_certificate.py
+ansible_collections/community/crypto/plugins/modules/x509_certificate_convert.py
ansible_collections/community/crypto/plugins/modules/x509_certificate_info.py
ansible_collections/community/crypto/plugins/modules/x509_certificate_pipe.py
ansible_collections/community/crypto/plugins/modules/x509_crl.py
@@ -33218,6 +33761,10 @@ ansible_collections/community/crypto/tests/integration/targets/x509_certificate/
ansible_collections/community/crypto/tests/integration/targets/x509_certificate/tasks/selfsigned.yml
ansible_collections/community/crypto/tests/integration/targets/x509_certificate/tests/validate_ownca.yml
ansible_collections/community/crypto/tests/integration/targets/x509_certificate/tests/validate_selfsigned.yml
+ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/aliases
+ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/meta/main.yml
+ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/impl.yml
+ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/main.yml
ansible_collections/community/crypto/tests/integration/targets/x509_certificate_info/aliases
ansible_collections/community/crypto/tests/integration/targets/x509_certificate_info/files/cert1.pem
ansible_collections/community/crypto/tests/integration/targets/x509_certificate_info/meta/main.yml
@@ -33248,6 +33795,8 @@ ansible_collections/community/crypto/tests/sanity/ignore-2.16.txt
ansible_collections/community/crypto/tests/sanity/ignore-2.16.txt.license
ansible_collections/community/crypto/tests/sanity/ignore-2.17.txt
ansible_collections/community/crypto/tests/sanity/ignore-2.17.txt.license
+ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt
+ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt.license
ansible_collections/community/crypto/tests/sanity/ignore-2.9.txt
ansible_collections/community/crypto/tests/sanity/ignore-2.9.txt.license
ansible_collections/community/crypto/tests/sanity/extra/extra-docs.json
@@ -33552,6 +34101,7 @@ ansible_collections/community/dns/changelogs/changelog.yaml
ansible_collections/community/dns/changelogs/changelog.yaml.license
ansible_collections/community/dns/changelogs/config.yaml
ansible_collections/community/dns/changelogs/fragments/.keep
+ansible_collections/community/dns/docs/docsite/config.yml
ansible_collections/community/dns/docs/docsite/extra-docs.yml
ansible_collections/community/dns/docs/docsite/links.yml
ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst
@@ -33577,8 +34127,11 @@ ansible_collections/community/dns/plugins/doc_fragments/options.py
ansible_collections/community/dns/plugins/filter/domain_suffix.py
ansible_collections/community/dns/plugins/filter/get_public_suffix.yml
ansible_collections/community/dns/plugins/filter/get_registrable_domain.yml
+ansible_collections/community/dns/plugins/filter/quote_txt.yml
ansible_collections/community/dns/plugins/filter/remove_public_suffix.yml
ansible_collections/community/dns/plugins/filter/remove_registrable_domain.yml
+ansible_collections/community/dns/plugins/filter/txt.py
+ansible_collections/community/dns/plugins/filter/unquote_txt.yml
ansible_collections/community/dns/plugins/inventory/hetzner_dns_records.py
ansible_collections/community/dns/plugins/inventory/hosttech_dns_records.py
ansible_collections/community/dns/plugins/lookup/lookup.py
@@ -33631,6 +34184,7 @@ ansible_collections/community/dns/plugins/plugin_utils/ips.py
ansible_collections/community/dns/plugins/plugin_utils/public_suffix.py
ansible_collections/community/dns/plugins/plugin_utils/resolver.py
ansible_collections/community/dns/plugins/plugin_utils/templated_options.py
+ansible_collections/community/dns/plugins/plugin_utils/unsafe.py
ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py
ansible_collections/community/dns/tests/config.yml
ansible_collections/community/dns/tests/ee/all.yml
@@ -33645,6 +34199,8 @@ ansible_collections/community/dns/tests/integration/requirements.txt
ansible_collections/community/dns/tests/integration/requirements.yml
ansible_collections/community/dns/tests/integration/targets/filter_domain_suffix/aliases
ansible_collections/community/dns/tests/integration/targets/filter_domain_suffix/tasks/main.yml
+ansible_collections/community/dns/tests/integration/targets/filter_txt/aliases
+ansible_collections/community/dns/tests/integration/targets/filter_txt/tasks/main.yml
ansible_collections/community/dns/tests/integration/targets/hetzner/aliases
ansible_collections/community/dns/tests/integration/targets/hetzner/tasks/main.yml
ansible_collections/community/dns/tests/integration/targets/hetzner/tasks/record-sets.yml
@@ -33679,6 +34235,8 @@ ansible_collections/community/dns/tests/sanity/ignore-2.16.txt
ansible_collections/community/dns/tests/sanity/ignore-2.16.txt.license
ansible_collections/community/dns/tests/sanity/ignore-2.17.txt
ansible_collections/community/dns/tests/sanity/ignore-2.17.txt.license
+ansible_collections/community/dns/tests/sanity/ignore-2.18.txt
+ansible_collections/community/dns/tests/sanity/ignore-2.18.txt.license
ansible_collections/community/dns/tests/sanity/ignore-2.9.txt
ansible_collections/community/dns/tests/sanity/ignore-2.9.txt.license
ansible_collections/community/dns/tests/sanity/extra/extra-docs.json
@@ -33877,6 +34435,7 @@ ansible_collections/community/docker/plugins/modules/docker_volume_info.py
ansible_collections/community/docker/plugins/plugin_utils/common.py
ansible_collections/community/docker/plugins/plugin_utils/common_api.py
ansible_collections/community/docker/plugins/plugin_utils/socket_handler.py
+ansible_collections/community/docker/plugins/plugin_utils/unsafe.py
ansible_collections/community/docker/tests/config.yml
ansible_collections/community/docker/tests/galaxy-importer.cfg
ansible_collections/community/docker/tests/ee/all.yml
@@ -33919,6 +34478,7 @@ ansible_collections/community/docker/tests/integration/targets/docker_compose_v2
ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/meta/main.yml
ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/main.yml
ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/run-test.yml
+ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml
ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/tests/pull.yml
ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/tests/start-stop.yml
ansible_collections/community/docker/tests/integration/targets/docker_compose_v2_pull/aliases
@@ -34316,6 +34876,8 @@ ansible_collections/community/docker/tests/sanity/ignore-2.16.txt
ansible_collections/community/docker/tests/sanity/ignore-2.16.txt.license
ansible_collections/community/docker/tests/sanity/ignore-2.17.txt
ansible_collections/community/docker/tests/sanity/ignore-2.17.txt.license
+ansible_collections/community/docker/tests/sanity/ignore-2.18.txt
+ansible_collections/community/docker/tests/sanity/ignore-2.18.txt.license
ansible_collections/community/docker/tests/sanity/extra/action-group.json
ansible_collections/community/docker/tests/sanity/extra/action-group.json.license
ansible_collections/community/docker/tests/sanity/extra/action-group.py
@@ -34424,6 +34986,7 @@ ansible_collections/community/general/changelogs/changelog.yaml
ansible_collections/community/general/changelogs/changelog.yaml.license
ansible_collections/community/general/changelogs/config.yaml
ansible_collections/community/general/changelogs/fragments/.keep
+ansible_collections/community/general/docs/docsite/config.yml
ansible_collections/community/general/docs/docsite/extra-docs.yml
ansible_collections/community/general/docs/docsite/links.yml
ansible_collections/community/general/docs/docsite/helper/lists_mergeby/default-common.yml
@@ -34658,6 +35221,7 @@ ansible_collections/community/general/plugins/module_utils/cmd_runner.py
ansible_collections/community/general/plugins/module_utils/consul.py
ansible_collections/community/general/plugins/module_utils/csv.py
ansible_collections/community/general/plugins/module_utils/database.py
+ansible_collections/community/general/plugins/module_utils/datetime.py
ansible_collections/community/general/plugins/module_utils/deps.py
ansible_collections/community/general/plugins/module_utils/dimensiondata.py
ansible_collections/community/general/plugins/module_utils/gandi_livedns_api.py
@@ -34955,6 +35519,7 @@ ansible_collections/community/general/plugins/modules/keycloak_authz_permission.
ansible_collections/community/general/plugins/modules/keycloak_authz_permission_info.py
ansible_collections/community/general/plugins/modules/keycloak_client.py
ansible_collections/community/general/plugins/modules/keycloak_client_rolemapping.py
+ansible_collections/community/general/plugins/modules/keycloak_client_rolescope.py
ansible_collections/community/general/plugins/modules/keycloak_clientscope.py
ansible_collections/community/general/plugins/modules/keycloak_clientscope_type.py
ansible_collections/community/general/plugins/modules/keycloak_clientsecret_info.py
@@ -35333,6 +35898,7 @@ ansible_collections/community/general/plugins/modules/znode.py
ansible_collections/community/general/plugins/modules/zpool_facts.py
ansible_collections/community/general/plugins/modules/zypper.py
ansible_collections/community/general/plugins/modules/zypper_repository.py
+ansible_collections/community/general/plugins/plugin_utils/unsafe.py
ansible_collections/community/general/plugins/test/a_module.py
ansible_collections/community/general/plugins/test/fqdn_valid.py
ansible_collections/community/general/tests/.gitignore
@@ -35761,6 +36327,7 @@ ansible_collections/community/general/tests/integration/targets/ini_file/tasks/t
ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/05-ignore_spaces.yml
ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/06-modify_inactive_option.yml
ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/07-section_name_spaces.yml
+ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/08-section.yml
ansible_collections/community/general/tests/integration/targets/interfaces_file/aliases
ansible_collections/community/general/tests/integration/targets/interfaces_file/files/interfaces_ff
ansible_collections/community/general/tests/integration/targets/interfaces_file/files/interfaces_ff_3841
@@ -35864,6 +36431,10 @@ ansible_collections/community/general/tests/integration/targets/keycloak_authz_p
ansible_collections/community/general/tests/integration/targets/keycloak_client/README.md
ansible_collections/community/general/tests/integration/targets/keycloak_client/tasks/main.yml
ansible_collections/community/general/tests/integration/targets/keycloak_client/vars/main.yml
+ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/README.md
+ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/aliases
+ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/tasks/main.yml
+ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/vars/main.yml
ansible_collections/community/general/tests/integration/targets/keycloak_clientscope_type/README.md
ansible_collections/community/general/tests/integration/targets/keycloak_clientscope_type/docker-compose.yml
ansible_collections/community/general/tests/integration/targets/keycloak_clientscope_type/tasks/main.yml
@@ -36689,6 +37260,8 @@ ansible_collections/community/general/tests/sanity/ignore-2.16.txt
ansible_collections/community/general/tests/sanity/ignore-2.16.txt.license
ansible_collections/community/general/tests/sanity/ignore-2.17.txt
ansible_collections/community/general/tests/sanity/ignore-2.17.txt.license
+ansible_collections/community/general/tests/sanity/ignore-2.18.txt
+ansible_collections/community/general/tests/sanity/ignore-2.18.txt.license
ansible_collections/community/general/tests/sanity/extra/aliases.json
ansible_collections/community/general/tests/sanity/extra/aliases.json.license
ansible_collections/community/general/tests/sanity/extra/aliases.py
@@ -38169,6 +38742,7 @@ ansible_collections/community/hrobot/changelogs/changelog.yaml
ansible_collections/community/hrobot/changelogs/changelog.yaml.license
ansible_collections/community/hrobot/changelogs/config.yaml
ansible_collections/community/hrobot/changelogs/fragments/.keep
+ansible_collections/community/hrobot/docs/docsite/config.yml
ansible_collections/community/hrobot/docs/docsite/links.yml
ansible_collections/community/hrobot/meta/execution-environment.yml
ansible_collections/community/hrobot/meta/runtime.yml
@@ -38189,6 +38763,7 @@ ansible_collections/community/hrobot/plugins/modules/server_info.py
ansible_collections/community/hrobot/plugins/modules/ssh_key.py
ansible_collections/community/hrobot/plugins/modules/ssh_key_info.py
ansible_collections/community/hrobot/plugins/modules/v_switch.py
+ansible_collections/community/hrobot/plugins/plugin_utils/unsafe.py
ansible_collections/community/hrobot/tests/config.yml
ansible_collections/community/hrobot/tests/ee/all.yml
ansible_collections/community/hrobot/tests/ee/roles/smoke/library/smoke_ipaddress.py
@@ -38209,6 +38784,8 @@ ansible_collections/community/hrobot/tests/sanity/ignore-2.16.txt
ansible_collections/community/hrobot/tests/sanity/ignore-2.16.txt.license
ansible_collections/community/hrobot/tests/sanity/ignore-2.17.txt
ansible_collections/community/hrobot/tests/sanity/ignore-2.17.txt.license
+ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt
+ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt.license
ansible_collections/community/hrobot/tests/sanity/ignore-2.9.txt
ansible_collections/community/hrobot/tests/sanity/ignore-2.9.txt.license
ansible_collections/community/hrobot/tests/sanity/extra/extra-docs.json
@@ -38238,6 +38815,8 @@ ansible_collections/community/hrobot/tests/unit/plugins/modules/test_server_info
ansible_collections/community/hrobot/tests/unit/plugins/modules/test_ssh_key.py
ansible_collections/community/hrobot/tests/unit/plugins/modules/test_ssh_key_info.py
ansible_collections/community/hrobot/tests/unit/plugins/modules/test_v_switch.py
+ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md
+ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md.license
ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst
ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst.license
ansible_collections/community/library_inventory_filtering_v1/COPYING
@@ -38247,6 +38826,8 @@ ansible_collections/community/library_inventory_filtering_v1/README.md
ansible_collections/community/library_inventory_filtering_v1/codecov.yml
ansible_collections/community/library_inventory_filtering_v1/.github/dependabot.yml
ansible_collections/community/library_inventory_filtering_v1/.github/workflows/ansible-test.yml
+ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-pr.yml
+ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-push.yml
ansible_collections/community/library_inventory_filtering_v1/.github/workflows/extra-tests.yml
ansible_collections/community/library_inventory_filtering_v1/.github/workflows/import-galaxy.yml
ansible_collections/community/library_inventory_filtering_v1/.github/workflows/reuse.yml
@@ -38256,6 +38837,10 @@ ansible_collections/community/library_inventory_filtering_v1/changelogs/changelo
ansible_collections/community/library_inventory_filtering_v1/changelogs/changelog.yaml.license
ansible_collections/community/library_inventory_filtering_v1/changelogs/config.yaml
ansible_collections/community/library_inventory_filtering_v1/changelogs/fragments/.keep
+ansible_collections/community/library_inventory_filtering_v1/docs/docsite/config.yml
+ansible_collections/community/library_inventory_filtering_v1/docs/docsite/extra-docs.yml
+ansible_collections/community/library_inventory_filtering_v1/docs/docsite/links.yml
+ansible_collections/community/library_inventory_filtering_v1/docs/docsite/rst/usage_guide.rst
ansible_collections/community/library_inventory_filtering_v1/meta/runtime.yml
ansible_collections/community/library_inventory_filtering_v1/plugins/doc_fragments/inventory_filter.py
ansible_collections/community/library_inventory_filtering_v1/plugins/plugin_utils/inventory_filter.py
@@ -40747,6 +41332,7 @@ ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/a
ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/meta/main.yml
ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/main.yml
ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/tests.yml
+ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/tests_api.yml
ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/aliases
ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/meta/main.yml
ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/tasks/main.yml
@@ -40774,14 +41360,12 @@ ansible_collections/community/rabbitmq/tests/integration/targets/setup_tls/files
ansible_collections/community/rabbitmq/tests/integration/targets/setup_tls/files/server_certificate.pem
ansible_collections/community/rabbitmq/tests/integration/targets/setup_tls/files/server_key.pem
ansible_collections/community/rabbitmq/tests/integration/targets/setup_tls/tasks/main.yml
-ansible_collections/community/rabbitmq/tests/sanity/ignore-2.10.txt
-ansible_collections/community/rabbitmq/tests/sanity/ignore-2.11.txt
ansible_collections/community/rabbitmq/tests/sanity/ignore-2.12.txt
ansible_collections/community/rabbitmq/tests/sanity/ignore-2.13.txt
ansible_collections/community/rabbitmq/tests/sanity/ignore-2.14.txt
ansible_collections/community/rabbitmq/tests/sanity/ignore-2.15.txt
-ansible_collections/community/rabbitmq/tests/sanity/ignore-2.9.txt
-ansible_collections/community/rabbitmq/tests/sanity/ignore.txt
+ansible_collections/community/rabbitmq/tests/sanity/ignore-2.16.txt
+ansible_collections/community/rabbitmq/tests/sanity/ignore-2.17.txt
ansible_collections/community/rabbitmq/tests/unit/compat/__init__.py
ansible_collections/community/rabbitmq/tests/unit/compat/builtins.py
ansible_collections/community/rabbitmq/tests/unit/compat/mock.py
@@ -40837,6 +41421,7 @@ ansible_collections/community/routeros/changelogs/changelog.yaml
ansible_collections/community/routeros/changelogs/changelog.yaml.license
ansible_collections/community/routeros/changelogs/config.yaml
ansible_collections/community/routeros/changelogs/fragments/.keep
+ansible_collections/community/routeros/docs/docsite/config.yml
ansible_collections/community/routeros/docs/docsite/extra-docs.yml
ansible_collections/community/routeros/docs/docsite/links.yml
ansible_collections/community/routeros/docs/docsite/rst/api-guide.rst
@@ -40892,6 +41477,8 @@ ansible_collections/community/routeros/tests/sanity/ignore-2.16.txt
ansible_collections/community/routeros/tests/sanity/ignore-2.16.txt.license
ansible_collections/community/routeros/tests/sanity/ignore-2.17.txt
ansible_collections/community/routeros/tests/sanity/ignore-2.17.txt.license
+ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt
+ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt.license
ansible_collections/community/routeros/tests/sanity/ignore-2.9.txt
ansible_collections/community/routeros/tests/sanity/ignore-2.9.txt.license
ansible_collections/community/routeros/tests/sanity/extra/extra-docs.json
@@ -41394,26 +41981,6 @@ ansible_collections/community/vmware/changelogs/changelog.yaml
ansible_collections/community/vmware/changelogs/config.yaml
ansible_collections/community/vmware/docs/docsite/extra-docs.yml
ansible_collections/community/vmware/docs/docsite/rst/dev_guide.rst
-ansible_collections/community/vmware/docs/docsite/rst/scenario_guide.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/faq.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_clone_template.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_find_vm_folder.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_remove_vm.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_rename_vm.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_http.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_tools_connection.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_concepts.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_external_doc_links.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_getting_started.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_intro.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_filters.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_hostnames.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_vm_attributes.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_module_reference.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_requirements.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_scenarios.rst
-ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_troubleshooting.rst
ansible_collections/community/vmware/meta/runtime.yml
ansible_collections/community/vmware/plugins/connection/__init__.py
ansible_collections/community/vmware/plugins/connection/vmware_tools.py
@@ -41440,6 +42007,7 @@ ansible_collections/community/vmware/plugins/modules/vcenter_license.py
ansible_collections/community/vmware/plugins/modules/vcenter_root_password_expiration.py
ansible_collections/community/vmware/plugins/modules/vcenter_standard_key_provider.py
ansible_collections/community/vmware/plugins/modules/vmware_about_info.py
+ansible_collections/community/vmware/plugins/modules/vmware_all_snapshots_info.py
ansible_collections/community/vmware/plugins/modules/vmware_category.py
ansible_collections/community/vmware/plugins/modules/vmware_category_info.py
ansible_collections/community/vmware/plugins/modules/vmware_cfg_backup.py
@@ -42036,6 +42604,7 @@ ansible_collections/community/vmware/tests/integration/targets/vsphere_file/task
ansible_collections/community/vmware/tests/sanity/ignore-2.15.txt
ansible_collections/community/vmware/tests/sanity/ignore-2.16.txt
ansible_collections/community/vmware/tests/sanity/ignore-2.17.txt
+ansible_collections/community/vmware/tests/sanity/ignore-2.18.txt
ansible_collections/community/vmware/tests/unit/__init__.py
ansible_collections/community/vmware/tests/unit/requirements.txt
ansible_collections/community/vmware/tests/unit/mock/__init__.py
@@ -43110,6 +43679,7 @@ ansible_collections/containers/podman/plugins/module_utils/podman/__init__.py
ansible_collections/containers/podman/plugins/module_utils/podman/common.py
ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py
ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py
+ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py
ansible_collections/containers/podman/plugins/modules/__init__.py
ansible_collections/containers/podman/plugins/modules/podman_container.py
ansible_collections/containers/podman/plugins/modules/podman_container_exec.py
@@ -43181,12 +43751,14 @@ ansible_collections/containers/podman/tests/integration/targets/podman_logout/ta
ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml
ansible_collections/containers/podman/tests/integration/targets/podman_network_info/tasks/main.yml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml
+ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/root-play.yml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/Containerfile
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/envdata.yaml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/kube-buil-test.yaml
+ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/play-pod.yaml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/play-root1.yaml
ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/play-root3.yaml
@@ -45221,6 +45793,7 @@ ansible_collections/dellemc/powerflex/docs/modules/mdm_cluster.rst
ansible_collections/dellemc/powerflex/docs/modules/protection_domain.rst
ansible_collections/dellemc/powerflex/docs/modules/replication_consistency_group.rst
ansible_collections/dellemc/powerflex/docs/modules/replication_pair.rst
+ansible_collections/dellemc/powerflex/docs/modules/resource_group.rst
ansible_collections/dellemc/powerflex/docs/modules/sdc.rst
ansible_collections/dellemc/powerflex/docs/modules/sds.rst
ansible_collections/dellemc/powerflex/docs/modules/snapshot.rst
@@ -45236,6 +45809,7 @@ ansible_collections/dellemc/powerflex/playbooks/modules/mdm_cluster.yml
ansible_collections/dellemc/powerflex/playbooks/modules/protection_domain.yml
ansible_collections/dellemc/powerflex/playbooks/modules/replication_consistency_group.yml
ansible_collections/dellemc/powerflex/playbooks/modules/replication_pair.yml
+ansible_collections/dellemc/powerflex/playbooks/modules/resource_group.yml
ansible_collections/dellemc/powerflex/playbooks/modules/sdc.yml
ansible_collections/dellemc/powerflex/playbooks/modules/sds.yml
ansible_collections/dellemc/powerflex/playbooks/modules/snapshot.yml
@@ -45264,6 +45838,7 @@ ansible_collections/dellemc/powerflex/plugins/modules/mdm_cluster.py
ansible_collections/dellemc/powerflex/plugins/modules/protection_domain.py
ansible_collections/dellemc/powerflex/plugins/modules/replication_consistency_group.py
ansible_collections/dellemc/powerflex/plugins/modules/replication_pair.py
+ansible_collections/dellemc/powerflex/plugins/modules/resource_group.py
ansible_collections/dellemc/powerflex/plugins/modules/sdc.py
ansible_collections/dellemc/powerflex/plugins/modules/sds.py
ansible_collections/dellemc/powerflex/plugins/modules/snapshot.py
@@ -45480,6 +46055,7 @@ ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_mdm_c
ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_protection_domain_api.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_replication_consistency_group_api.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_replication_pair_api.py
+ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_resource_group_api.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_sdc_api.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_sdk_response.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_sds_api.py
@@ -45498,6 +46074,7 @@ ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_mdm_cluste
ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_protection_domain.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_replication_consistency_group.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_replication_pair.py
+ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_resource_group.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_sdc.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_sds.py
ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_snapshot_policy.py
@@ -47110,8 +47687,10 @@ ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_domain_control
ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_profile.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_configuration_fact.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_credential_store_domain_controller.py
+ansible_collections/fortinet/fortios/plugins/modules/fortios_diameter_filter_profile.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_data_type.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_dictionary.py
+ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_exact_data_match.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_filepattern.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_doc_source.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_sensitivity.py
@@ -47527,6 +48106,7 @@ ansible_collections/fortinet/fortios/plugins/modules/fortios_system_netflow.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_system_network_visibility.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_system_np6.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu.py
+ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu_vlink.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ntp.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_system_object_tagging.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy.py
@@ -47613,6 +48193,7 @@ ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_categor
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_group.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_domain_controller.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_exchange.py
+ansible_collections/fortinet/fortios/plugins/modules/fortios_user_external_identity_provider.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fortitoken.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso_polling.py
@@ -47631,6 +48212,7 @@ ansible_collections/fortinet/fortios/plugins/modules/fortios_user_saml.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_security_exempt_list.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_setting.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_user_tacacsplus.py
+ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_keyword.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_profile.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_channel_filter.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_key.py
@@ -47656,6 +48238,7 @@ ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_kmip_server.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_l2tp.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ocvpn.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_pptp.py
+ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_qkd.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_client.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_settings.py
ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_host_check_software.py
@@ -49484,6 +50067,7 @@ ansible_collections/infinidat/infinibox/plugins/modules/infini_export_client.py
ansible_collections/infinidat/infinibox/plugins/modules/infini_fibre_channel_switch.py
ansible_collections/infinidat/infinibox/plugins/modules/infini_fs.py
ansible_collections/infinidat/infinibox/plugins/modules/infini_host.py
+ansible_collections/infinidat/infinibox/plugins/modules/infini_infinimetrics.py
ansible_collections/infinidat/infinibox/plugins/modules/infini_map.py
ansible_collections/infinidat/infinibox/plugins/modules/infini_metadata.py
ansible_collections/infinidat/infinibox/plugins/modules/infini_network_space.py
@@ -49513,6 +50097,8 @@ ansible_collections/infinidat/infinibox/tests/hacking/infini_fs_stat.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_host_absent.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_host_present.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_host_stat.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_absent.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_present.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_map_absent.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_map_present.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_map_stat.json
@@ -49523,13 +50109,22 @@ ansible_collections/infinidat/infinibox/tests/hacking/infini_network_space_absen
ansible_collections/infinidat/infinibox/tests/hacking/infini_network_space_present.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_network_space_stat.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_1521.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_vibox.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_1521.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_vibox.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_stat.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_target_absent.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_target_present.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_target_stat.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_absent.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_present.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_stat.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_absent.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_1521.json
+ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_vibox.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_stat.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_user_absent.json
ansible_collections/infinidat/infinibox/tests/hacking/infini_user_ldap_absent.json
@@ -52541,7 +53136,6 @@ ansible_collections/netapp/ontap/.github/ISSUE_TEMPLATE/feature_request.yml
ansible_collections/netapp/ontap/.github/workflows/codeql-analysis.yml
ansible_collections/netapp/ontap/.github/workflows/coverage.yml
ansible_collections/netapp/ontap/.github/workflows/main.yml
-ansible_collections/netapp/ontap/changelogs/.DS_Store
ansible_collections/netapp/ontap/changelogs/.plugin-cache.yaml
ansible_collections/netapp/ontap/changelogs/changelog.yaml
ansible_collections/netapp/ontap/changelogs/config.yaml
@@ -53011,6 +53605,7 @@ ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6320.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6330.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6331.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6341.yaml
+ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6356.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6374.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6386.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6389.yaml
@@ -53040,6 +53635,12 @@ ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6667.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6671.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6680.yaml
ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6681.yaml
+ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6691.yaml
+ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6715.yaml
+ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6721.yaml
+ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6747.yaml
+ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6807.yaml
+ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6825.yaml
ansible_collections/netapp/ontap/changelogs/fragments/GITHUB-174.yaml
ansible_collections/netapp/ontap/changelogs/fragments/github-110.yaml
ansible_collections/netapp/ontap/changelogs/fragments/github-56.yaml
@@ -53503,12 +54104,6 @@ ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_wait_f
ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_wwpn_alias.py
ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_zapit.py
ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_ontap_fdspt.py
-ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/.gitignore
-ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/CACHEDIR.TAG
-ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/README.md
-ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/lastfailed
-ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/nodeids
-ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/stepwise
ansible_collections/netapp/storagegrid/CHANGELOG.rst
ansible_collections/netapp/storagegrid/COPYING
ansible_collections/netapp/storagegrid/FILES.json
@@ -55718,6 +56313,10 @@ ansible_collections/purestorage/flashblade/changelogs/fragments/258_add_public_b
ansible_collections/purestorage/flashblade/changelogs/fragments/263_fix_multiple_modules_idempotency.yaml
ansible_collections/purestorage/flashblade/changelogs/fragments/266_bucket_fix.yaml
ansible_collections/purestorage/flashblade/changelogs/fragments/268_multi-chassis-lag.yaml
+ansible_collections/purestorage/flashblade/changelogs/fragments/270_add_go.yaml
+ansible_collections/purestorage/flashblade/changelogs/fragments/271_add_worm.yaml
+ansible_collections/purestorage/flashblade/changelogs/fragments/273_add_nap.yaml
+ansible_collections/purestorage/flashblade/changelogs/fragments/274_fan_in.yaml
ansible_collections/purestorage/flashblade/changelogs/fragments/76_default_fs_size.yaml
ansible_collections/purestorage/flashblade/changelogs/fragments/77_filesystem_policies_info.yaml
ansible_collections/purestorage/flashblade/changelogs/fragments/78_update_filesystem_replica_link.yaml
diff --git a/ansible.egg-info/requires.txt b/ansible.egg-info/requires.txt
index ff4a01d1f..5d89f30f2 100644
--- a/ansible.egg-info/requires.txt
+++ b/ansible.egg-info/requires.txt
@@ -1 +1 @@
-ansible-core~=2.16.5
+ansible-core~=2.16.6
diff --git a/ansible_collections/amazon/aws/.github/workflows/docs-pr.yml b/ansible_collections/amazon/aws/.github/workflows/docs-pr.yml
index 8cc39d8f5..9158b038f 100644
--- a/ansible_collections/amazon/aws/.github/workflows/docs-pr.yml
+++ b/ansible_collections/amazon/aws/.github/workflows/docs-pr.yml
@@ -21,6 +21,7 @@ jobs:
intersphinx-links: |
community_aws:https://ansible-collections.github.io/community.aws/branch/main/
ansible_devel:https://docs.ansible.com/ansible-core/devel/
+ artifact-name: ${{ github.event.repository.name }}_validate_docs_${{ github.event.pull_request.head.sha }}
build-docs:
diff --git a/ansible_collections/amazon/aws/CHANGELOG.rst b/ansible_collections/amazon/aws/CHANGELOG.rst
index 3e5dc1c2c..219d962b4 100644
--- a/ansible_collections/amazon/aws/CHANGELOG.rst
+++ b/ansible_collections/amazon/aws/CHANGELOG.rst
@@ -4,6 +4,27 @@ amazon.aws Release Notes
.. contents:: Topics
+v7.5.0
+======
+
+Release Summary
+---------------
+
+This release includes a new feature for the ``iam_user_info`` module, bugfixes for the ``cloudwatchlogs_log_group_info`` and ``s3_object`` modules and the inventory plugins, and some internal refactoring of ``module_utils``.
+
+Minor Changes
+-------------
+
+- iam_user_info - Add ``login_profile`` to return info that is get from a user, to know if they can login from AWS console (https://github.com/ansible-collections/amazon.aws/pull/2012).
+- module_utils.iam - refactored normalization functions to use ``boto3_resource_to_ansible_dict()`` and ``boto3_resource_list_to_ansible_dict()`` (https://github.com/ansible-collections/amazon.aws/pull/2006).
+- module_utils.transformations - add ``boto3_resource_to_ansible_dict()`` and ``boto3_resource_list_to_ansible_dict()`` helpers (https://github.com/ansible-collections/amazon.aws/pull/2006).
+
+Bugfixes
+--------
+
+- cloudwatchlogs_log_group_info - Implement exponential backoff when making API calls to prevent throttling exceptions (https://github.com/ansible-collections/amazon.aws/issues/2011).
+- plugin_utils.inventory - Ensure templated options in lookup plugins are converted (https://github.com/ansible-collections/amazon.aws/issues/1955).
+- s3_object - Fix the issue when copying an object with overriding metadata. (https://github.com/ansible-collections/amazon.aws/issues/1991).
v7.4.0
======
@@ -232,7 +253,6 @@ Release Summary
This release is the last planned minor release of ``amazon.aws`` prior to the release of 7.0.0.
It includes documentation fixes as well as minor changes and bug fixes for the ``ec2_ami`` and ``elb_application_lb_info`` modules.
-
Minor Changes
-------------
@@ -564,7 +584,6 @@ Release Summary
This release brings few bugfixes.
-
Bugfixes
--------
@@ -585,7 +604,6 @@ Release Summary
This release contains a number of bugfixes, new features and new modules. This is the last planned minor release prior to the release of version 6.0.0.
-
Minor Changes
-------------
@@ -680,7 +698,6 @@ Release Summary
A minor release containing bugfixes for the ``ec2_eni_info`` module and the ``aws_rds`` inventory plugin, as well as improvements to the ``rds_instance`` module.
-
Minor Changes
-------------
@@ -904,7 +921,6 @@ Release Summary
This release contains a minor bugfix for the ``ec2_vol`` module, some minor work on the ``ec2_key`` module, and various documentation fixes. This is the last planned release of the 4.x series.
-
Minor Changes
-------------
@@ -944,7 +960,6 @@ The amazon.aws 4.3.0 release includes a number of minor bug fixes and improvemen
Following the release of amazon.aws 5.0.0, backports to the 4.x series will be limited to
security issues and bugfixes.
-
Minor Changes
-------------
@@ -1099,7 +1114,6 @@ Release Summary
Following the release of amazon.aws 5.0.0, 3.5.0 is a bugfix release and the final planned release for the 3.x series.
-
Minor Changes
-------------
diff --git a/ansible_collections/amazon/aws/FILES.json b/ansible_collections/amazon/aws/FILES.json
index 1f9947ab7..61352c6b6 100644
--- a/ansible_collections/amazon/aws/FILES.json
+++ b/ansible_collections/amazon/aws/FILES.json
@@ -123,7 +123,7 @@
"name": ".github/workflows/docs-pr.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "befbd2d31f5509f704e57c06b07c42fa7867dd353ab3d24856eb865cf8d44b00",
+ "chksum_sha256": "12f439dd44738a38b1468b670158eaf719539b91f0570d2b9a2f0565ef1de659",
"format": 1
},
{
@@ -221,7 +221,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8484f733ac3da28af9d97a0f85ecc2f3d601009ed6d55d02f8a3cac6dc32eea9",
+ "chksum_sha256": "fab623a9b576e9d450f5285c5ad77eed36f30882a396eeba97046f4b8fdbf3cd",
"format": 1
},
{
@@ -256,7 +256,7 @@
"name": "docs/docsite/rst/CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b3a5af02bc807a9248c3820f9f07c6ce0fbf5f75f22613ae3e79a795d34165fc",
+ "chksum_sha256": "f60899f9e09f217d9c8963676ddad7d070ce9233e0f32c02b96ad1839ec3cd9f",
"format": 1
},
{
@@ -543,7 +543,7 @@
"name": "plugins/module_utils/common.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c2056cf9ef583ee29ac1165aa03e5cf165830ed6d1703c275c4c9d154222f3c3",
+ "chksum_sha256": "cef7b396d560a646961755d2a54c7131e553dfe26fbb26e04be073cce5bb0095",
"format": 1
},
{
@@ -599,7 +599,7 @@
"name": "plugins/module_utils/iam.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8aaa38e784250525c884b936370b2db5ff61b84fcd62a30c239a5e3dc8e20ca3",
+ "chksum_sha256": "1cd5d5532049e4afd2858a35480cd173f72c4ed9174c67bb26186e47fe183ba5",
"format": 1
},
{
@@ -662,7 +662,7 @@
"name": "plugins/module_utils/transformation.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "77e7b561643de0ed96b958af3ec6694edae360c8fb4e51ffa4144dace02063fe",
+ "chksum_sha256": "882308fe4ef2b74fcb41dd09b0e6575d47e2f3d6a3f2164d8dc1706cec213f0c",
"format": 1
},
{
@@ -851,7 +851,7 @@
"name": "plugins/modules/cloudwatchlogs_log_group_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "00a40c6593d6cc582205943f247a33d7621e4ffa49410c9476e6fefc4e800ccd",
+ "chksum_sha256": "03d947455d91f77a833dd705fc05d2882a62786e1e09968f7cc8b668964d56f6",
"format": 1
},
{
@@ -1243,7 +1243,7 @@
"name": "plugins/modules/iam_user_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "92d2d3f21e43a53f4e25ed497c76d2935ed533b8bdbf9aa5af41a4a8c27e2cb7",
+ "chksum_sha256": "11b3a159e2c6542b861c94c5d5f1eae8375f1e0e4ecef7ad413932254f6a3157",
"format": 1
},
{
@@ -1446,7 +1446,7 @@
"name": "plugins/modules/s3_object.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "36bf675910b9b5a9a932fc90c1ceb4f2c54d90a191bf9c2cb8a47cd5ebea032f",
+ "chksum_sha256": "47610c1c778b26def1d5c3aef8c5f6d2089537445ae420d1da5f1afb4a0b8600",
"format": 1
},
{
@@ -1495,7 +1495,7 @@
"name": "plugins/plugin_utils/inventory.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c652b1e2733fe92f7d95ea6f76bed638fbed402e7ffe15753e896328869f4b3",
+ "chksum_sha256": "2bbe05440920c867bd4b8935a0a97963211b74149ca6c83d9990f9b6a5e4e6ae",
"format": 1
},
{
@@ -2531,7 +2531,7 @@
"name": "tests/integration/targets/ec2_ami/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9433c585f807cca76bb83c1cbe0a5d0a85966ead2ca30dde4cefd71be3cf155f",
+ "chksum_sha256": "919ee94ad149f90556ea20402e2393253157946b2d0e32a71957a4f58cfa6018",
"format": 1
},
{
@@ -4302,7 +4302,7 @@
"name": "tests/integration/targets/ec2_security_group/tasks/multi_nested_target.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be781072f2d349ec5c93cbb05e40ef71846d2f4b5884ad297a736d3b0c72e542",
+ "chksum_sha256": "79aa1549464410bff8ff9f0272780d8b408a370d088100617656975024b6fef2",
"format": 1
},
{
@@ -6115,7 +6115,7 @@
"name": "tests/integration/targets/inventory_aws_ec2/playbooks/create_inventory_config.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c031a3d0f6a2c17914bedc3a7b37c475cbd55420cb7ae7fe4c6f24855bb5565d",
+ "chksum_sha256": "44bab5285a394bde857e65e324b15039d248a20c9a05b5eec45eac2ce312550e",
"format": 1
},
{
@@ -6259,6 +6259,13 @@
"format": 1
},
{
+ "name": "tests/integration/targets/inventory_aws_ec2/templates/config.ini.j2",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "777e02f32a471e59d05fc66ef26716aaaa368085f991f179866d8f38a7d44aae",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/inventory_aws_ec2/templates/inventory.yml.j2",
"ftype": "file",
"chksum_type": "sha256",
@@ -6332,7 +6339,7 @@
"name": "tests/integration/targets/inventory_aws_ec2/templates/inventory_with_template.yml.j2",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "156031d22e1ae780ea2012e96afd68679bd27ee0cfe4bec4b03bf556f5477375",
+ "chksum_sha256": "a15b10d8b1dc85d869d6df0054d44d95b68d53d5cda6c9372dc86d72e260a00d",
"format": 1
},
{
@@ -9447,7 +9454,7 @@
"name": "tests/integration/targets/s3_object/tasks/copy_object.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b412470d4ef414efef1f407f84c72f1685f77c6ef2551517cdfa4cd6ab1515d",
+ "chksum_sha256": "a935fc78dc9973eac71decd7308d4e827c27a7f30b29c7c416f9f676163b4ec7",
"format": 1
},
{
@@ -9475,7 +9482,7 @@
"name": "tests/integration/targets/s3_object/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c7568cf168c02a65bef0d921cea02304fd568fa6cd93175395bed359e6a14cf7",
+ "chksum_sha256": "697d66379fe4c4b33f82b1f7ac363f1e25331480201701b23d28494165346043",
"format": 1
},
{
@@ -9503,7 +9510,7 @@
"name": "tests/integration/targets/s3_object/aliases",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "da6542f9ffbf6dfd96214cc7e7c08e8bd4662a5479a21ad1b3f79ad2b163c9ad",
+ "chksum_sha256": "e217807ba499d974106cc2132230a411f7564e6c337b0a731a6301c5a1d69619",
"format": 1
},
{
@@ -10284,6 +10291,13 @@
"format": 1
},
{
+ "name": "tests/unit/module_utils/iam/test_iam_resource_transforms.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9ba95e45f5d2c2502a8ae6ea6dacc35e340f931a4d4d7fde2064ba0f89018ed0",
+ "format": 1
+ },
+ {
"name": "tests/unit/module_utils/iam/test_validate_iam_identifiers.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -10452,6 +10466,13 @@
"format": 1
},
{
+ "name": "tests/unit/module_utils/transformation/test_boto3_resource_to_ansible_dict.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8b27e0ccb712e9bf43897b4226b99318c42e27f344f660326d13699bf1b45c45",
+ "format": 1
+ },
+ {
"name": "tests/unit/module_utils/transformation/test_map_complex_type.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -10630,7 +10651,7 @@
"name": "tests/unit/plugin_utils/inventory/test_inventory_base.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4668d08e6f30a2aae02c0b27174dc759f4ec554d7207bcf33f879e9dee67720e",
+ "chksum_sha256": "ebae64f9db5ec8444c35b5d41127f1a5191ed10cd34acb6c89d0e5de2879b33d",
"format": 1
},
{
@@ -10693,7 +10714,7 @@
"name": "tests/unit/plugins/inventory/test_aws_ec2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cbb0ce6de6b22c4d62588d230353de215a4ccb273838b4870c17da8548ad3f16",
+ "chksum_sha256": "8556d8258e0d0aaeadd02898d1198152c478fa23677ff51990a0e1420f99e482",
"format": 1
},
{
@@ -11659,7 +11680,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b3a5af02bc807a9248c3820f9f07c6ce0fbf5f75f22613ae3e79a795d34165fc",
+ "chksum_sha256": "f60899f9e09f217d9c8963676ddad7d070ce9233e0f32c02b96ad1839ec3cd9f",
"format": 1
},
{
diff --git a/ansible_collections/amazon/aws/MANIFEST.json b/ansible_collections/amazon/aws/MANIFEST.json
index 3eb50b454..cd19577e3 100644
--- a/ansible_collections/amazon/aws/MANIFEST.json
+++ b/ansible_collections/amazon/aws/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "amazon",
"name": "aws",
- "version": "7.4.0",
+ "version": "7.5.0",
"authors": [
"Ansible (https://github.com/ansible)"
],
@@ -25,7 +25,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "524e7534581a787eb78ed1366e0d732b0673fcb3e4b5df5ffae1ca6c92c0ffe5",
+ "chksum_sha256": "34bdeb6686c662a0a524953b80ae953b67d328542ba5d43bc1e4058c45ed4136",
"format": 1
},
"format": 1
diff --git a/ansible_collections/amazon/aws/changelogs/changelog.yaml b/ansible_collections/amazon/aws/changelogs/changelog.yaml
index 24f7b8247..587c55a28 100644
--- a/ansible_collections/amazon/aws/changelogs/changelog.yaml
+++ b/ansible_collections/amazon/aws/changelogs/changelog.yaml
@@ -2692,7 +2692,7 @@ releases:
- iam_user_info - the ``path`` parameter has been renamed ``path_prefix`` for
consistency with other IAM modules, ``path`` remains as an alias. No change
to playbooks is required (https://github.com/ansible-collections/amazon.aws/pull/1933).
- release_summary: This release includes new features and a bugfix.
+ release_summary: This release includes new features and a bugfix.
fragments:
- 1918-ec2_instance-add-support-to-modify-metadata-options.yml
- 20231206-iam_user_path.yml
@@ -2777,3 +2777,28 @@ releases:
- 20240227-iam-refactor.yml
- release_summary.yml
release_date: '2024-03-05'
+ 7.5.0:
+ changes:
+ bugfixes:
+ - cloudwatchlogs_log_group_info - Implement exponential backoff when making
+ API calls to prevent throttling exceptions (https://github.com/ansible-collections/amazon.aws/issues/2011).
+ - plugin_utils.inventory - Ensure templated options in lookup plugins are converted
+ (https://github.com/ansible-collections/amazon.aws/issues/1955).
+ - s3_object - Fix the issue when copying an object with overriding metadata.
+ (https://github.com/ansible-collections/amazon.aws/issues/1991).
+ minor_changes:
+ - iam_user_info - Add ``login_profile`` to return info that is get from a user,
+ to know if they can login from AWS console (https://github.com/ansible-collections/amazon.aws/pull/2012).
+ - module_utils.iam - refactored normalization functions to use ``boto3_resource_to_ansible_dict()``
+ and ``boto3_resource_list_to_ansible_dict()`` (https://github.com/ansible-collections/amazon.aws/pull/2006).
+ - module_utils.transformations - add ``boto3_resource_to_ansible_dict()`` and
+ ``boto3_resource_list_to_ansible_dict()`` helpers (https://github.com/ansible-collections/amazon.aws/pull/2006).
+ release_summary: This release includes a new feature for the ``iam_user_info``
+ module, bugfixes for the ``cloudwatchlogs_log_group_info`` and ``s3_object``
+ modules and the inventory plugins, and some internal refactoring of ``module_utils``.
+ fragments:
+ - 2006-normalize-refactor.yml
+ - 20240314-cloudwatchlogs_log_group_info-fix-throttling-exceptions.yml
+ - 20240314-s3_object-copy-mode-with-metadata.yml
+ - 20240321-iam-user-info.yml
+ release_date: '2024-04-03'
diff --git a/ansible_collections/amazon/aws/docs/docsite/rst/CHANGELOG.rst b/ansible_collections/amazon/aws/docs/docsite/rst/CHANGELOG.rst
index 3e5dc1c2c..219d962b4 100644
--- a/ansible_collections/amazon/aws/docs/docsite/rst/CHANGELOG.rst
+++ b/ansible_collections/amazon/aws/docs/docsite/rst/CHANGELOG.rst
@@ -4,6 +4,27 @@ amazon.aws Release Notes
.. contents:: Topics
+v7.5.0
+======
+
+Release Summary
+---------------
+
+This release includes a new feature for the ``iam_user_info`` module, bugfixes for the ``cloudwatchlogs_log_group_info`` and ``s3_object`` modules and the inventory plugins, and some internal refactoring of ``module_utils``.
+
+Minor Changes
+-------------
+
+- iam_user_info - Add ``login_profile`` to return info that is get from a user, to know if they can login from AWS console (https://github.com/ansible-collections/amazon.aws/pull/2012).
+- module_utils.iam - refactored normalization functions to use ``boto3_resource_to_ansible_dict()`` and ``boto3_resource_list_to_ansible_dict()`` (https://github.com/ansible-collections/amazon.aws/pull/2006).
+- module_utils.transformations - add ``boto3_resource_to_ansible_dict()`` and ``boto3_resource_list_to_ansible_dict()`` helpers (https://github.com/ansible-collections/amazon.aws/pull/2006).
+
+Bugfixes
+--------
+
+- cloudwatchlogs_log_group_info - Implement exponential backoff when making API calls to prevent throttling exceptions (https://github.com/ansible-collections/amazon.aws/issues/2011).
+- plugin_utils.inventory - Ensure templated options in lookup plugins are converted (https://github.com/ansible-collections/amazon.aws/issues/1955).
+- s3_object - Fix the issue when copying an object with overriding metadata. (https://github.com/ansible-collections/amazon.aws/issues/1991).
v7.4.0
======
@@ -232,7 +253,6 @@ Release Summary
This release is the last planned minor release of ``amazon.aws`` prior to the release of 7.0.0.
It includes documentation fixes as well as minor changes and bug fixes for the ``ec2_ami`` and ``elb_application_lb_info`` modules.
-
Minor Changes
-------------
@@ -564,7 +584,6 @@ Release Summary
This release brings few bugfixes.
-
Bugfixes
--------
@@ -585,7 +604,6 @@ Release Summary
This release contains a number of bugfixes, new features and new modules. This is the last planned minor release prior to the release of version 6.0.0.
-
Minor Changes
-------------
@@ -680,7 +698,6 @@ Release Summary
A minor release containing bugfixes for the ``ec2_eni_info`` module and the ``aws_rds`` inventory plugin, as well as improvements to the ``rds_instance`` module.
-
Minor Changes
-------------
@@ -904,7 +921,6 @@ Release Summary
This release contains a minor bugfix for the ``ec2_vol`` module, some minor work on the ``ec2_key`` module, and various documentation fixes. This is the last planned release of the 4.x series.
-
Minor Changes
-------------
@@ -944,7 +960,6 @@ The amazon.aws 4.3.0 release includes a number of minor bug fixes and improvemen
Following the release of amazon.aws 5.0.0, backports to the 4.x series will be limited to
security issues and bugfixes.
-
Minor Changes
-------------
@@ -1099,7 +1114,6 @@ Release Summary
Following the release of amazon.aws 5.0.0, 3.5.0 is a bugfix release and the final planned release for the 3.x series.
-
Minor Changes
-------------
diff --git a/ansible_collections/amazon/aws/plugins/module_utils/common.py b/ansible_collections/amazon/aws/plugins/module_utils/common.py
index 673915725..41ba80231 100644
--- a/ansible_collections/amazon/aws/plugins/module_utils/common.py
+++ b/ansible_collections/amazon/aws/plugins/module_utils/common.py
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
AMAZON_AWS_COLLECTION_NAME = "amazon.aws"
-AMAZON_AWS_COLLECTION_VERSION = "7.4.0"
+AMAZON_AWS_COLLECTION_VERSION = "7.5.0"
_collection_info_context = {
diff --git a/ansible_collections/amazon/aws/plugins/module_utils/iam.py b/ansible_collections/amazon/aws/plugins/module_utils/iam.py
index 430823f3b..56920d53e 100644
--- a/ansible_collections/amazon/aws/plugins/module_utils/iam.py
+++ b/ansible_collections/amazon/aws/plugins/module_utils/iam.py
@@ -4,7 +4,6 @@
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
import re
-from copy import deepcopy
try:
import botocore
@@ -12,17 +11,20 @@ except ImportError:
pass # Modules are responsible for handling this.
from ansible.module_utils._text import to_native
-from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict
from .arn import parse_aws_arn
from .arn import validate_aws_arn
from .botocore import is_boto3_error_code
-from .botocore import normalize_boto3_result
from .errors import AWSErrorHandler
from .exceptions import AnsibleAWSError
from .retries import AWSRetry
from .tagging import ansible_dict_to_boto3_tag_list
-from .tagging import boto3_tag_list_to_ansible_dict
+from .transformation import AnsibleAWSResource
+from .transformation import AnsibleAWSResourceList
+from .transformation import BotoResource
+from .transformation import BotoResourceList
+from .transformation import boto3_resource_list_to_ansible_dict
+from .transformation import boto3_resource_to_ansible_dict
class AnsibleIAMError(AnsibleAWSError):
@@ -198,66 +200,6 @@ def get_iam_managed_policy_version(client, arn, version):
return client.get_policy_version(PolicyArn=arn, VersionId=version)["PolicyVersion"]
-def normalize_iam_mfa_device(device):
- """Converts IAM MFA Device from the CamelCase boto3 format to the snake_case Ansible format"""
- if not device:
- return device
- camel_device = camel_dict_to_snake_dict(device)
- camel_device["tags"] = boto3_tag_list_to_ansible_dict(device.pop("Tags", []))
- return camel_device
-
-
-def normalize_iam_mfa_devices(devices):
- """Converts a list of IAM MFA Devices from the CamelCase boto3 format to the snake_case Ansible format"""
- if not devices:
- return []
- devices = [normalize_iam_mfa_device(d) for d in devices]
- return devices
-
-
-def normalize_iam_user(user):
- """Converts IAM users from the CamelCase boto3 format to the snake_case Ansible format"""
- if not user:
- return user
- camel_user = camel_dict_to_snake_dict(user)
- camel_user["tags"] = boto3_tag_list_to_ansible_dict(user.pop("Tags", []))
- return camel_user
-
-
-def normalize_iam_policy(policy):
- """Converts IAM policies from the CamelCase boto3 format to the snake_case Ansible format"""
- if not policy:
- return policy
- camel_policy = camel_dict_to_snake_dict(policy)
- camel_policy["tags"] = boto3_tag_list_to_ansible_dict(policy.get("Tags", []))
- return camel_policy
-
-
-def normalize_iam_group(group):
- """Converts IAM Groups from the CamelCase boto3 format to the snake_case Ansible format"""
- if not group:
- return group
- camel_group = camel_dict_to_snake_dict(normalize_boto3_result(group))
- return camel_group
-
-
-def normalize_iam_access_key(access_key):
- """Converts IAM access keys from the CamelCase boto3 format to the snake_case Ansible format"""
- if not access_key:
- return access_key
- camel_key = camel_dict_to_snake_dict(normalize_boto3_result(access_key))
- return camel_key
-
-
-def normalize_iam_access_keys(access_keys):
- """Converts a list of IAM access keys from the CamelCase boto3 format to the snake_case Ansible format"""
- if not access_keys:
- return []
- access_keys = [normalize_iam_access_key(k) for k in access_keys]
- sorted_keys = sorted(access_keys, key=lambda d: d.get("create_date", None))
- return sorted_keys
-
-
def convert_managed_policy_names_to_arns(client, policy_names):
if all(validate_aws_arn(policy, service="iam") for policy in policy_names if policy is not None):
return policy_names
@@ -386,47 +328,6 @@ def list_iam_instance_profiles(client, name=None, prefix=None, role=None):
return _list_iam_instance_profiles(client)
-def normalize_iam_instance_profile(profile, _v7_compat=False):
- """
- Converts a boto3 format IAM instance profile into "Ansible" format
-
- _v7_compat is deprecated and will be removed in release after 2025-05-01 DO NOT USE.
- """
-
- new_profile = camel_dict_to_snake_dict(deepcopy(profile))
- if profile.get("Roles"):
- new_profile["roles"] = [normalize_iam_role(role, _v7_compat=_v7_compat) for role in profile.get("Roles")]
- if profile.get("Tags"):
- new_profile["tags"] = boto3_tag_list_to_ansible_dict(profile.get("Tags"))
- else:
- new_profile["tags"] = {}
- new_profile["original"] = profile
- return new_profile
-
-
-def normalize_iam_role(role, _v7_compat=False):
- """
- Converts a boto3 format IAM instance role into "Ansible" format
-
- _v7_compat is deprecated and will be removed in release after 2025-05-01 DO NOT USE.
- """
-
- new_role = camel_dict_to_snake_dict(deepcopy(role))
- if role.get("InstanceProfiles"):
- new_role["instance_profiles"] = [
- normalize_iam_instance_profile(profile, _v7_compat=_v7_compat) for profile in role.get("InstanceProfiles")
- ]
- if role.get("AssumeRolePolicyDocument"):
- if _v7_compat:
- # new_role["assume_role_policy_document"] = role.get("AssumeRolePolicyDocument")
- new_role["assume_role_policy_document_raw"] = role.get("AssumeRolePolicyDocument")
- else:
- new_role["assume_role_policy_document"] = role.get("AssumeRolePolicyDocument")
-
- new_role["tags"] = boto3_tag_list_to_ansible_dict(role.get("Tags", []))
- return new_role
-
-
@IAMErrorHandler.common_error_handler("tag instance profile")
@AWSRetry.jittered_backoff()
def tag_iam_instance_profile(client, name, tags):
@@ -497,3 +398,83 @@ def validate_iam_identifiers(resource_type, name=None, path=None):
return path_problem
return None
+
+
+def normalize_iam_mfa_device(device: BotoResource) -> AnsibleAWSResource:
+ """Converts IAM MFA Device from the CamelCase boto3 format to the snake_case Ansible format"""
+ # MFA Devices don't support Tags (as of 1.34.52)
+ return boto3_resource_to_ansible_dict(device)
+
+
+def normalize_iam_mfa_devices(devices: BotoResourceList) -> AnsibleAWSResourceList:
+ """Converts a list of IAM MFA Devices from the CamelCase boto3 format to the snake_case Ansible format"""
+ # MFA Devices don't support Tags (as of 1.34.52)
+ return boto3_resource_list_to_ansible_dict(devices)
+
+
+def normalize_iam_user(user: BotoResource) -> AnsibleAWSResource:
+ """Converts IAM users from the CamelCase boto3 format to the snake_case Ansible format"""
+ return boto3_resource_to_ansible_dict(user)
+
+
+def normalize_iam_policy(policy: BotoResource) -> AnsibleAWSResource:
+ """Converts IAM policies from the CamelCase boto3 format to the snake_case Ansible format"""
+ return boto3_resource_to_ansible_dict(policy)
+
+
+def normalize_iam_group(group: BotoResource) -> AnsibleAWSResource:
+ """Converts IAM Groups from the CamelCase boto3 format to the snake_case Ansible format"""
+ # Groups don't support Tags (as of 1.34.52)
+ return boto3_resource_to_ansible_dict(group, force_tags=False)
+
+
+def normalize_iam_access_key(access_key: BotoResource) -> AnsibleAWSResource:
+ """Converts IAM access keys from the CamelCase boto3 format to the snake_case Ansible format"""
+ # Access Keys don't support Tags (as of 1.34.52)
+ return boto3_resource_to_ansible_dict(access_key, force_tags=False)
+
+
+def normalize_iam_access_keys(access_keys: BotoResourceList) -> AnsibleAWSResourceList:
+ """Converts a list of IAM access keys from the CamelCase boto3 format to the snake_case Ansible format"""
+ # Access Keys don't support Tags (as of 1.34.52)
+ if not access_keys:
+ return access_keys
+ access_keys = boto3_resource_list_to_ansible_dict(access_keys, force_tags=False)
+ return sorted(access_keys, key=lambda d: d.get("create_date", None))
+
+
+def normalize_iam_instance_profile(profile: BotoResource) -> AnsibleAWSResource:
+ """
+ Converts a boto3 format IAM instance profile into "Ansible" format
+
+ _v7_compat is deprecated and will be removed in release after 2025-05-01 DO NOT USE.
+ """
+ transforms = {"Roles": _normalize_iam_roles}
+ transformed_profile = boto3_resource_to_ansible_dict(profile, nested_transforms=transforms)
+ return transformed_profile
+
+
+def normalize_iam_role(role: BotoResource, _v7_compat: bool = False) -> AnsibleAWSResource:
+ """
+ Converts a boto3 format IAM instance role into "Ansible" format
+
+ _v7_compat is deprecated and will be removed in release after 2025-05-01 DO NOT USE.
+ """
+ transforms = {"InstanceProfiles": _normalize_iam_instance_profiles}
+ ignore_list = [] if _v7_compat else ["AssumeRolePolicyDocument"]
+ transformed_role = boto3_resource_to_ansible_dict(role, nested_transforms=transforms, ignore_list=ignore_list)
+ if _v7_compat and role.get("AssumeRolePolicyDocument"):
+ transformed_role["assume_role_policy_document_raw"] = role["AssumeRolePolicyDocument"]
+ return transformed_role
+
+
+def _normalize_iam_instance_profiles(profiles: BotoResourceList) -> AnsibleAWSResourceList:
+ if not profiles:
+ return profiles
+ return [normalize_iam_instance_profile(p) for p in profiles]
+
+
+def _normalize_iam_roles(roles: BotoResourceList) -> AnsibleAWSResourceList:
+ if not roles:
+ return roles
+ return [normalize_iam_role(r) for r in roles]
diff --git a/ansible_collections/amazon/aws/plugins/module_utils/transformation.py b/ansible_collections/amazon/aws/plugins/module_utils/transformation.py
index 708736fc0..a5bc23607 100644
--- a/ansible_collections/amazon/aws/plugins/module_utils/transformation.py
+++ b/ansible_collections/amazon/aws/plugins/module_utils/transformation.py
@@ -28,9 +28,26 @@
# 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 copy import deepcopy
+from typing import Any
+from typing import Callable
+from typing import Mapping
+from typing import Optional
+from typing import Sequence
+from typing import Union
+
+from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict
from ansible.module_utils.six import integer_types
from ansible.module_utils.six import string_types
+from .botocore import normalize_boto3_result
+from .tagging import boto3_tag_list_to_ansible_dict
+
+BotoResource = Union[None, Mapping[str, Any]]
+BotoResourceList = Union[None, Sequence[Mapping[str, Any]]]
+AnsibleAWSResource = Union[None, Mapping[str, Any]]
+AnsibleAWSResourceList = Union[None, Sequence[Mapping[str, Any]]]
+
def ansible_dict_to_boto3_filter_list(filters_dict):
"""Convert an Ansible dict of filters to list of dicts that boto3 can use
@@ -133,3 +150,82 @@ def scrub_none_parameters(parameters, descend_into_lists=True):
clean_parameters[k] = v
return clean_parameters
+
+
+def _perform_nested_transforms(
+ resource: Mapping[str, Any],
+ nested_transforms: Optional[Mapping[str, Callable]],
+) -> Mapping[str, Any]:
+ if not nested_transforms:
+ return resource
+
+ for k, transform in nested_transforms.items():
+ if k in resource:
+ resource[k] = transform(resource[k])
+
+ return resource
+
+
+def boto3_resource_to_ansible_dict(
+ resource: BotoResource,
+ transform_tags: bool = True,
+ force_tags: bool = True,
+ normalize: bool = True,
+ ignore_list: Optional[Sequence[str]] = None,
+ nested_transforms: Optional[Mapping[str, Callable]] = None,
+) -> AnsibleAWSResource:
+ """
+ Transforms boto3-style (CamelCase) resource to the ansible-style (snake_case).
+
+ :param resource: a dictionary representing the resource
+ :param transform_tags: whether or not to perform "tag list" to "dictionary" conversion on the "Tags" key
+ :param normalize: whether resources should be passed through .botocore.normalize_boto3_result
+ :param ignore_list: a list of keys, the contents of which should not be transformed
+ :param nested_transforms: a mapping of keys to Callable, the Callable will only be passed the value for the key
+ in the resource dictionary
+ :return: dictionary representing the transformed resource
+ """
+ if not resource:
+ return resource
+ ignore_list = ignore_list or []
+ nested_transforms = nested_transforms or {}
+
+ transformed_resource = deepcopy(resource)
+ if normalize:
+ transformed_resource = normalize_boto3_result(transformed_resource)
+ transformed_resource = _perform_nested_transforms(transformed_resource, nested_transforms)
+ ignore_list = [*ignore_list, *nested_transforms]
+ camel_resource = camel_dict_to_snake_dict(transformed_resource, ignore_list=ignore_list)
+ if transform_tags and "Tags" in resource:
+ camel_resource["tags"] = boto3_tag_list_to_ansible_dict(resource["Tags"])
+ if force_tags and "Tags" not in resource:
+ camel_resource["tags"] = {}
+
+ return camel_resource
+
+
+def boto3_resource_list_to_ansible_dict(
+ resource_list: BotoResourceList,
+ transform_tags: bool = True,
+ force_tags: bool = True,
+ normalize: bool = True,
+ ignore_list: Optional[Sequence[str]] = None,
+ nested_transforms: Optional[Mapping[str, Callable]] = None,
+) -> AnsibleAWSResourceList:
+ """
+ Transforms a list of boto3-style (CamelCase) resources to the ansible-style (snake_case).
+
+ :param resource_list: a list of dictionaries representing the resources
+ :param transform_tags: whether or not to perform "tag list" to "dictionary" conversion on the "Tags" key
+ :param normalize: whether resources should be passed through .botocore.normalize_boto3_result()
+ :param ignore_list: a list of keys, the contents of which should not be transformed
+ :param nested_transforms: a mapping of keys to Callable, the Callable will only be passed the value for the key
+ in the resource dictionary
+ :return: list of dictionaries representing the transformed resources
+ """
+ if not resource_list:
+ return resource_list
+ return [
+ boto3_resource_to_ansible_dict(resource, transform_tags, force_tags, normalize, ignore_list, nested_transforms)
+ for resource in resource_list
+ ]
diff --git a/ansible_collections/amazon/aws/plugins/modules/cloudwatchlogs_log_group_info.py b/ansible_collections/amazon/aws/plugins/modules/cloudwatchlogs_log_group_info.py
index 0cfe22e22..453d268d5 100644
--- a/ansible_collections/amazon/aws/plugins/modules/cloudwatchlogs_log_group_info.py
+++ b/ansible_collections/amazon/aws/plugins/modules/cloudwatchlogs_log_group_info.py
@@ -82,6 +82,18 @@ from ansible.module_utils.common.dict_transformations import camel_dict_to_snake
from ansible_collections.amazon.aws.plugins.module_utils.botocore import is_boto3_error_code
from ansible_collections.amazon.aws.plugins.module_utils.modules import AnsibleAWSModule
+from ansible_collections.amazon.aws.plugins.module_utils.retries import AWSRetry
+
+
+@AWSRetry.exponential_backoff()
+def list_tags_log_group_with_backoff(client, log_group_name):
+ return client.list_tags_log_group(logGroupName=log_group_name)
+
+
+@AWSRetry.exponential_backoff()
+def describe_log_groups_with_backoff(client, **kwargs):
+ paginator = client.get_paginator("describe_log_groups")
+ return paginator.paginate(**kwargs).build_full_result()
def describe_log_group(client, log_group_name, module):
@@ -89,15 +101,14 @@ def describe_log_group(client, log_group_name, module):
if log_group_name:
params["logGroupNamePrefix"] = log_group_name
try:
- paginator = client.get_paginator("describe_log_groups")
- desc_log_group = paginator.paginate(**params).build_full_result()
+ desc_log_group = describe_log_groups_with_backoff(client, **params)
except (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError) as e:
module.fail_json_aws(e, msg=f"Unable to describe log group {log_group_name}")
for log_group in desc_log_group["logGroups"]:
log_group_name = log_group["logGroupName"]
try:
- tags = client.list_tags_log_group(logGroupName=log_group_name)
+ tags = list_tags_log_group_with_backoff(client, log_group_name)
except is_boto3_error_code("AccessDeniedException"):
tags = {}
module.warn(f"Permission denied listing tags for log group {log_group_name}")
diff --git a/ansible_collections/amazon/aws/plugins/modules/iam_user_info.py b/ansible_collections/amazon/aws/plugins/modules/iam_user_info.py
index 259d26803..2ddbe1d5a 100644
--- a/ansible_collections/amazon/aws/plugins/modules/iam_user_info.py
+++ b/ansible_collections/amazon/aws/plugins/modules/iam_user_info.py
@@ -103,14 +103,27 @@ iam_users:
type: dict
returned: if user exists
sample: '{"Env": "Prod"}'
+ login_profile:
+ description: Detailed login profile information if the user has access to log in from AWS default console. Returns an empty object {} if no access.
+ returned: always
+ type: dict
+ sample: {"create_date": "2024-03-20T12:50:56+00:00", "password_reset_required": false, "user_name": "i_am_a_user"}
"""
from ansible_collections.amazon.aws.plugins.module_utils.iam import AnsibleIAMError
+from ansible_collections.amazon.aws.plugins.module_utils.iam import IAMErrorHandler
from ansible_collections.amazon.aws.plugins.module_utils.iam import get_iam_group
from ansible_collections.amazon.aws.plugins.module_utils.iam import get_iam_user
from ansible_collections.amazon.aws.plugins.module_utils.iam import list_iam_users
from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_user
from ansible_collections.amazon.aws.plugins.module_utils.modules import AnsibleAWSModule
+from ansible_collections.amazon.aws.plugins.module_utils.retries import AWSRetry
+
+
+@IAMErrorHandler.list_error_handler("get login profile", {})
+@AWSRetry.jittered_backoff()
+def check_console_access(connection, user_name):
+ return connection.get_login_profile(UserName=user_name)["LoginProfile"]
def _list_users(connection, name, group, path):
@@ -136,6 +149,8 @@ def _list_users(connection, name, group, path):
def list_users(connection, name, group, path):
users = _list_users(connection, name, group, path)
users = [u for u in users if u is not None]
+ for user in users:
+ user["LoginProfile"] = check_console_access(connection, user["UserName"])
return [normalize_iam_user(user) for user in users]
@@ -147,7 +162,9 @@ def main():
)
module = AnsibleAWSModule(
- argument_spec=argument_spec, mutually_exclusive=[["group", "path_prefix"]], supports_check_mode=True
+ argument_spec=argument_spec,
+ mutually_exclusive=[["group", "path_prefix"]],
+ supports_check_mode=True,
)
name = module.params.get("name")
diff --git a/ansible_collections/amazon/aws/plugins/modules/s3_object.py b/ansible_collections/amazon/aws/plugins/modules/s3_object.py
index 2c4ebe9c3..2cd897c89 100644
--- a/ansible_collections/amazon/aws/plugins/modules/s3_object.py
+++ b/ansible_collections/amazon/aws/plugins/modules/s3_object.py
@@ -315,7 +315,9 @@ EXAMPLES = r"""
object: /my/desired/key.txt
src: /usr/local/myfile.txt
mode: put
- metadata: 'Content-Encoding=gzip,Cache-Control=no-cache'
+ metadata:
+ Content-Encoding: gzip
+ Cache-Control: no-cache
- name: PUT/upload with custom headers
amazon.aws.s3_object:
@@ -1314,6 +1316,11 @@ def copy_object_to_bucket(module, s3, bucket, obj, encrypt, metadata, validate,
metadata,
)
)
+ if metadata:
+ # 'MetadataDirective' Specifies whether the metadata is copied from the source object or replaced
+ # with metadata that's provided in the request. The default value is 'COPY', therefore when user
+ # specifies a metadata we should set it to 'REPLACE'
+ params.update({"MetadataDirective": "REPLACE"})
s3.copy_object(aws_retry=True, **params)
put_object_acl(module, s3, bucket, obj)
# Tags
diff --git a/ansible_collections/amazon/aws/plugins/plugin_utils/inventory.py b/ansible_collections/amazon/aws/plugins/plugin_utils/inventory.py
index 144f77a7a..b0e47f7ef 100644
--- a/ansible_collections/amazon/aws/plugins/plugin_utils/inventory.py
+++ b/ansible_collections/amazon/aws/plugins/plugin_utils/inventory.py
@@ -33,7 +33,10 @@ class AWSInventoryBase(BaseInventoryPlugin, Constructable, Cacheable, AWSPluginB
"secret_key",
"session_token",
"profile",
- "iam_role_name",
+ "endpoint_url",
+ "assume_role_arn",
+ "region",
+ "regions",
)
def __init__(self, templar, options):
@@ -48,20 +51,21 @@ class AWSInventoryBase(BaseInventoryPlugin, Constructable, Cacheable, AWSPluginB
def get(self, *args):
value = self.original_options.get(*args)
- if not value:
- return value
- if args[0] not in self.TEMPLATABLE_OPTIONS:
- return value
- if not self.templar.is_template(value):
+ if (
+ not value
+ or not self.templar
+ or args[0] not in self.TEMPLATABLE_OPTIONS
+ or not self.templar.is_template(value)
+ ):
return value
return self.templar.template(variable=value, disable_lookups=False)
def get_options(self, *args):
- original_options = super().get_options(*args)
- if not self.templar:
- return original_options
- return self.TemplatedOptions(self.templar, original_options)
+ return self.TemplatedOptions(self.templar, super().get_options(*args))
+
+ def get_option(self, option, hostvars=None):
+ return self.TemplatedOptions(self.templar, {option: super().get_option(option, hostvars)}).get(option)
def __init__(self):
super().__init__()
@@ -109,8 +113,7 @@ class AWSInventoryBase(BaseInventoryPlugin, Constructable, Cacheable, AWSPluginB
}
def _set_frozen_credentials(self):
- options = self.get_options()
- iam_role_arn = options.get("assume_role_arn")
+ iam_role_arn = self.get_option("assume_role_arn")
if iam_role_arn:
self._freeze_iam_role(iam_role_arn)
@@ -136,10 +139,9 @@ class AWSInventoryBase(BaseInventoryPlugin, Constructable, Cacheable, AWSPluginB
return None
def _boto3_regions(self, service):
- options = self.get_options()
-
- if options.get("regions"):
- return options.get("regions")
+ regions = self.get_option("regions")
+ if regions:
+ return regions
# boto3 has hard coded lists of available regions for resources, however this does bit-rot
# As such we try to query the service, and fall back to ec2 for a list of regions
@@ -149,7 +151,7 @@ class AWSInventoryBase(BaseInventoryPlugin, Constructable, Cacheable, AWSPluginB
return regions
# fallback to local list hardcoded in boto3 if still no regions
- session = _boto3_session(options.get("profile"))
+ session = _boto3_session(self.get_option("profile"))
regions = session.get_available_regions(service)
if not regions:
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/ec2_ami/tasks/main.yml b/ansible_collections/amazon/aws/tests/integration/targets/ec2_ami/tasks/main.yml
index a9289b3c1..267e52abb 100644
--- a/ansible_collections/amazon/aws/tests/integration/targets/ec2_ami/tasks/main.yml
+++ b/ansible_collections/amazon/aws/tests/integration/targets/ec2_ami/tasks/main.yml
@@ -708,8 +708,8 @@
tags:
Name: "{{ ec2_ami_name }}_permissions"
launch_permissions:
- org_arns: [arn:aws:organizations::123456789012:organization/o-123ab4cdef]
- org_unit_arns: [arn:aws:organizations::123456789012:ou/o-123example/ou-1234-5exampld]
+ org_arns: ["arn:aws:organizations::123456789012:organization/o-123ab4cdef"]
+ org_unit_arns: ["arn:aws:organizations::123456789012:ou/o-123example/ou-1234-5exampld"]
register: permissions_update_result
- name: Get ami info
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/ec2_security_group/tasks/multi_nested_target.yml b/ansible_collections/amazon/aws/tests/integration/targets/ec2_security_group/tasks/multi_nested_target.yml
index dcb7ac7bb..02057003a 100644
--- a/ansible_collections/amazon/aws/tests/integration/targets/ec2_security_group/tasks/multi_nested_target.yml
+++ b/ansible_collections/amazon/aws/tests/integration/targets/ec2_security_group/tasks/multi_nested_target.yml
@@ -12,7 +12,7 @@
to_port: 8182
cidr_ipv6:
- 64:ff9b::/96
- - [2620::/32]
+ - ["2620::/32"]
- proto: tcp
ports: 5665
cidr_ip:
@@ -38,7 +38,7 @@
to_port: 8182
cidr_ipv6:
- 64:ff9b::/96
- - [2620::/32]
+ - ["2620::/32"]
- proto: tcp
ports: 5665
cidr_ip:
@@ -66,7 +66,7 @@
to_port: 8182
cidr_ipv6:
- 64:ff9b::/96
- - [2620::/32]
+ - ["2620::/32"]
- proto: tcp
ports: 5665
cidr_ip:
@@ -92,7 +92,7 @@
to_port: 8182
cidr_ipv6:
- 64:ff9b::/96
- - [2620::/32]
+ - ["2620::/32"]
- proto: tcp
ports: 5665
cidr_ip:
@@ -117,7 +117,7 @@
to_port: 8182
cidr_ipv6:
- 64:ff9b::/96
- - [2620::/32]
+ - ["2620::/32"]
- proto: tcp
ports: 5665
cidr_ip:
@@ -142,7 +142,7 @@
to_port: 8182
cidr_ipv6:
- 64:ff9b::/96
- - [2620::/32]
+ - ["2620::/32"]
- proto: tcp
ports: 5665
cidr_ip:
@@ -167,7 +167,7 @@
from_port: 8182
to_port: 8182
cidr_ipv6:
- - [2620::/32, 64:ff9b::/96]
+ - ["2620::/32", "64:ff9b::/96"]
- proto: tcp
ports: 5665
cidr_ip:
@@ -190,8 +190,8 @@
from_port: 8182
to_port: 8182
cidr_ipv6:
- - [2620::/32, 64:ff9b::/96]
- - [2001:DB8:A0B:12F0::1/64]
+ - ["2620::/32", "64:ff9b::/96"]
+ - ["2001:DB8:A0B:12F0::1/64"]
- proto: tcp
ports: 5665
cidr_ip:
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/playbooks/create_inventory_config.yml b/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/playbooks/create_inventory_config.yml
index 232911d24..282ca43ee 100644
--- a/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/playbooks/create_inventory_config.yml
+++ b/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/playbooks/create_inventory_config.yml
@@ -9,3 +9,8 @@
ansible.builtin.copy:
dest: ../test.aws_ec2.yml
content: "{{ lookup('template', template_name) }}"
+
+ - name: write ini configuration
+ ansible.builtin.copy:
+ dest: ../config.ini
+ content: "{{ lookup('template', '../templates/config.ini.j2') }}"
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/config.ini.j2 b/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/config.ini.j2
new file mode 100644
index 000000000..f7320a7fb
--- /dev/null
+++ b/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/config.ini.j2
@@ -0,0 +1,3 @@
+[ansible-test]
+
+region = {{ aws_region }} \ No newline at end of file
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory_with_template.yml.j2 b/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory_with_template.yml.j2
index 44a132c1c..dee7422a9 100644
--- a/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory_with_template.yml.j2
+++ b/ansible_collections/amazon/aws/tests/integration/targets/inventory_aws_ec2/templates/inventory_with_template.yml.j2
@@ -5,7 +5,7 @@ secret_key: '{{ aws_secret_key }}'
session_token: '{{ security_token }}'
{% endif %}
regions:
-- '{{ aws_region }}'
+- '{{ '{{ lookup("ansible.builtin.ini", "region", section="ansible-test", file="config.ini") }}' }}'
filters:
tag:Name:
- '{{ resource_prefix }}'
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/s3_object/aliases b/ansible_collections/amazon/aws/tests/integration/targets/s3_object/aliases
index d34fac48d..2a1c5ccb6 100644
--- a/ansible_collections/amazon/aws/tests/integration/targets/s3_object/aliases
+++ b/ansible_collections/amazon/aws/tests/integration/targets/s3_object/aliases
@@ -1,3 +1,4 @@
cloud/aws
aws_s3
s3_object_info
+time=12m
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/copy_object.yml b/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/copy_object.yml
index 9ae36b952..994733d81 100644
--- a/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/copy_object.yml
+++ b/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/copy_object.yml
@@ -1,5 +1,12 @@
---
-- block:
+- vars:
+ withmeta_data:
+ something: exists
+ version: "1.0.2"
+ metacopy_data:
+ name: metacopy
+ version: "1.0.3"
+ block:
- name: define bucket name used for tests
ansible.builtin.set_fact:
copy_bucket:
@@ -142,6 +149,68 @@
- result is not changed
- result.msg == "Key this_key_does_not_exist.txt does not exist in bucket "+copy_bucket.src+"."
+ # Copy with metadata
+ - name: Set fact for bucket name
+ ansible.builtin.set_fact:
+ bucket_name: "{{ copy_bucket.dst }}"
+
+ - name: Create test bucket
+ amazon.aws.s3_bucket:
+ name: "{{ bucket_name }}"
+ state: present
+
+ - name: Create test object
+ amazon.aws.s3_object:
+ bucket: "{{ bucket_name }}"
+ object: nometa
+ mode: put
+ content: "some content"
+
+ - name: Copy and add metadata
+ amazon.aws.s3_object:
+ bucket: "{{ bucket_name }}"
+ object: metacopy
+ mode: copy
+ copy_src:
+ bucket: "{{ bucket_name }}"
+ object: nometa
+ metadata: "{{ metacopy_data }}"
+
+ - name: Create test object with metadata
+ amazon.aws.s3_object:
+ bucket: "{{ bucket_name }}"
+ object: withmeta
+ mode: put
+ content: "another content"
+ metadata: "{{ withmeta_data }}"
+
+ - name: Copy and preserve metadata
+ amazon.aws.s3_object:
+ bucket: "{{ bucket_name }}"
+ object: copywithmeta
+ mode: copy
+ copy_src:
+ bucket: "{{ bucket_name }}"
+ object: withmeta
+
+ - name: Get objects info
+ amazon.aws.s3_object_info:
+ bucket_name: "{{ bucket_name }}"
+ object_name: "{{ item }}"
+ loop:
+ - nometa
+ - metacopy
+ - withmeta
+ - copywithmeta
+ register: obj_info
+
+ - assert:
+ that:
+ - obj_info.results | selectattr('item', 'equalto', 'nometa') | map(attribute='object_info.0.object_data.metadata') | first == {}
+ - obj_info.results | selectattr('item', 'equalto', 'withmeta') | map(attribute='object_info.0.object_data.metadata') | first == withmeta_data
+ - obj_info.results | selectattr('item', 'equalto', 'metacopy') | map(attribute='object_info.0.object_data.metadata') | first == metacopy_data
+ - obj_info.results | selectattr('item', 'equalto', 'copywithmeta') | map(attribute='object_info.0.object_data.metadata') | first == withmeta_data
+
always:
- ansible.builtin.include_tasks: delete_bucket.yml
with_items:
diff --git a/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/main.yml b/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/main.yml
index ed65fe31f..7a8a585de 100644
--- a/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/main.yml
+++ b/ansible_collections/amazon/aws/tests/integration/targets/s3_object/tasks/main.yml
@@ -837,8 +837,6 @@
that:
- binary_files.results[0].stat.checksum == binary_files.results[1].stat.checksum
- - ansible.builtin.include_tasks: copy_object.yml
- - ansible.builtin.include_tasks: copy_object_acl_disabled_bucket.yml
- name: Run tagging tests
block:
# ============================================================
@@ -1074,6 +1072,8 @@
- (result.tags | length) == 0
- ansible.builtin.include_tasks: copy_recursively.yml
+ - ansible.builtin.include_tasks: copy_object.yml
+ - ansible.builtin.include_tasks: copy_object_acl_disabled_bucket.yml
always:
- name: delete temporary files
file:
diff --git a/ansible_collections/amazon/aws/tests/unit/module_utils/iam/test_iam_resource_transforms.py b/ansible_collections/amazon/aws/tests/unit/module_utils/iam/test_iam_resource_transforms.py
new file mode 100644
index 000000000..28090f993
--- /dev/null
+++ b/ansible_collections/amazon/aws/tests/unit/module_utils/iam/test_iam_resource_transforms.py
@@ -0,0 +1,583 @@
+# -*- coding: utf-8 -*-
+
+# Copyright: Contributors to the Ansible project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+
+import dateutil
+
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_access_key
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_access_keys
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_group
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_instance_profile
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_mfa_device
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_mfa_devices
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_policy
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_role
+from ansible_collections.amazon.aws.plugins.module_utils.iam import normalize_iam_user
+
+# The various normalize_ functions are based upon ..transformation.boto3_resource_to_ansible_dict
+# As such these tests will be relatively light touch.
+
+example_date1_txt = "2020-12-30T00:00:00.000Z"
+example_date2_txt = "2021-04-26T01:23:58.000Z"
+example_date1_iso = "2020-12-30T00:00:00+00:00"
+example_date2_iso = "2021-04-26T01:23:58+00:00"
+example_date1 = dateutil.parser.parse(example_date1_txt)
+example_date2 = dateutil.parser.parse(example_date2_txt)
+
+
+class TestIamResourceToAnsibleDict:
+ def setup_method(self):
+ pass
+
+ def test_normalize_iam_mfa_device(self):
+ INPUT = {
+ "UserName": "ExampleUser",
+ "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleUser",
+ "EnableDate": example_date1,
+ }
+ OUTPUT = {
+ "user_name": "ExampleUser",
+ "serial_number": "arn:aws:iam::123456789012:mfa/ExampleUser",
+ "enable_date": example_date1_iso,
+ "tags": {},
+ }
+
+ assert OUTPUT == normalize_iam_mfa_device(INPUT)
+
+ def test_normalize_iam_mfa_devices(self):
+ INPUT = [
+ {
+ "UserName": "ExampleUser",
+ "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleUser",
+ "EnableDate": example_date1,
+ }
+ ]
+ OUTPUT = [
+ {
+ "user_name": "ExampleUser",
+ "serial_number": "arn:aws:iam::123456789012:mfa/ExampleUser",
+ "enable_date": example_date1_iso,
+ "tags": {},
+ }
+ ]
+
+ assert OUTPUT == normalize_iam_mfa_devices(INPUT)
+
+ def test_normalize_iam_user(self):
+ INPUT = {
+ "Path": "/MyPath/",
+ "UserName": "ExampleUser",
+ "UserId": "AIDU12345EXAMPLE12345",
+ "Arn": "arn:aws:iam::123456789012:user/MyPath/ExampleUser",
+ "CreateDate": example_date1,
+ "PasswordLastUsed": example_date2,
+ "PermissionsBoundary": {
+ "PermissionsBoundaryType": "PermissionsBoundaryPolicy",
+ "PermissionsBoundaryArn": "arn:aws:iam::123456789012:policy/ExamplePolicy",
+ },
+ "Tags": [
+ {"Key": "MyKey", "Value": "Example Value"},
+ ],
+ }
+
+ OUTPUT = {
+ "path": "/MyPath/",
+ "user_name": "ExampleUser",
+ "user_id": "AIDU12345EXAMPLE12345",
+ "arn": "arn:aws:iam::123456789012:user/MyPath/ExampleUser",
+ "create_date": example_date1_iso,
+ "password_last_used": example_date2_iso,
+ "permissions_boundary": {
+ "permissions_boundary_type": "PermissionsBoundaryPolicy",
+ "permissions_boundary_arn": "arn:aws:iam::123456789012:policy/ExamplePolicy",
+ },
+ "tags": {"MyKey": "Example Value"},
+ }
+
+ assert OUTPUT == normalize_iam_user(INPUT)
+
+ def test_normalize_iam_policy(self):
+ INPUT = {
+ "PolicyName": "AnsibleIntegratation-CI-ApplicationServices",
+ "PolicyId": "ANPA12345EXAMPLE12345",
+ "Arn": "arn:aws:iam::123456789012:policy/AnsibleIntegratation-CI-ApplicationServices",
+ "Path": "/examples/",
+ "DefaultVersionId": "v6",
+ "AttachmentCount": 2,
+ "PermissionsBoundaryUsageCount": 0,
+ "IsAttachable": True,
+ "CreateDate": example_date1,
+ "UpdateDate": example_date2,
+ "Tags": [
+ {"Key": "MyKey", "Value": "Example Value"},
+ ],
+ }
+
+ OUTPUT = {
+ "policy_name": "AnsibleIntegratation-CI-ApplicationServices",
+ "policy_id": "ANPA12345EXAMPLE12345",
+ "arn": "arn:aws:iam::123456789012:policy/AnsibleIntegratation-CI-ApplicationServices",
+ "path": "/examples/",
+ "default_version_id": "v6",
+ "attachment_count": 2,
+ "permissions_boundary_usage_count": 0,
+ "is_attachable": True,
+ "create_date": example_date1_iso,
+ "update_date": example_date2_iso,
+ "tags": {"MyKey": "Example Value"},
+ }
+
+ assert OUTPUT == normalize_iam_policy(INPUT)
+
+ def test_normalize_iam_group(self):
+ INPUT = {
+ "Users": [
+ {
+ "Path": "/",
+ "UserName": "ansible_test",
+ "UserId": "AIDA12345EXAMPLE12345",
+ "Arn": "arn:aws:iam::123456789012:user/ansible_test",
+ "CreateDate": example_date1,
+ "PasswordLastUsed": example_date2,
+ }
+ ],
+ "Group": {
+ "Path": "/",
+ "GroupName": "ansible-integration-ci",
+ "GroupId": "AGPA01234EXAMPLE01234",
+ "Arn": "arn:aws:iam::123456789012:group/ansible-integration-ci",
+ "CreateDate": example_date1,
+ },
+ "AttachedPolicies": [
+ {
+ "PolicyName": "AnsibleIntegratation-CI-Paas",
+ "PolicyArn": "arn:aws:iam::123456789012:policy/AnsibleIntegratation-CI-Paas",
+ },
+ {
+ "PolicyName": "AnsibleIntegratation-CI-ApplicationServices",
+ "PolicyArn": "arn:aws:iam::123456789012:policy/AnsibleIntegratation-CI-ApplicationServices",
+ },
+ ],
+ }
+
+ OUTPUT = {
+ "users": [
+ {
+ "path": "/",
+ "user_name": "ansible_test",
+ "user_id": "AIDA12345EXAMPLE12345",
+ "arn": "arn:aws:iam::123456789012:user/ansible_test",
+ "create_date": example_date1_iso,
+ "password_last_used": example_date2_iso,
+ }
+ ],
+ "group": {
+ "path": "/",
+ "group_name": "ansible-integration-ci",
+ "group_id": "AGPA01234EXAMPLE01234",
+ "arn": "arn:aws:iam::123456789012:group/ansible-integration-ci",
+ "create_date": example_date1_iso,
+ },
+ "attached_policies": [
+ {
+ "policy_name": "AnsibleIntegratation-CI-Paas",
+ "policy_arn": "arn:aws:iam::123456789012:policy/AnsibleIntegratation-CI-Paas",
+ },
+ {
+ "policy_name": "AnsibleIntegratation-CI-ApplicationServices",
+ "policy_arn": "arn:aws:iam::123456789012:policy/AnsibleIntegratation-CI-ApplicationServices",
+ },
+ ],
+ }
+
+ assert OUTPUT == normalize_iam_group(INPUT)
+
+ def test_normalize_access_key(self):
+ INPUT = {
+ "UserName": "ansible_test",
+ "AccessKeyId": "AKIA12345EXAMPLE1234",
+ "Status": "Active",
+ "CreateDate": example_date1,
+ }
+
+ OUTPUT = {
+ "user_name": "ansible_test",
+ "access_key_id": "AKIA12345EXAMPLE1234",
+ "status": "Active",
+ "create_date": example_date1_iso,
+ }
+
+ assert OUTPUT == normalize_iam_access_key(INPUT)
+
+ def test_normalize_access_keys(self):
+ INPUT = [
+ {
+ "UserName": "ansible_test",
+ "AccessKeyId": "AKIA12345EXAMPLE1234",
+ "Status": "Active",
+ "CreateDate": example_date1,
+ },
+ {
+ "UserName": "ansible_test",
+ "AccessKeyId": "AKIA01234EXAMPLE4321",
+ "Status": "Active",
+ "CreateDate": example_date2,
+ },
+ ]
+
+ OUTPUT = [
+ {
+ "access_key_id": "AKIA12345EXAMPLE1234",
+ "create_date": example_date1_iso,
+ "status": "Active",
+ "user_name": "ansible_test",
+ },
+ {
+ "access_key_id": "AKIA01234EXAMPLE4321",
+ "create_date": example_date2_iso,
+ "status": "Active",
+ "user_name": "ansible_test",
+ },
+ ]
+
+ assert OUTPUT == normalize_iam_access_keys(INPUT)
+
+ # Switch order to test that they're sorted by Creation Date
+ INPUT = [
+ {
+ "UserName": "ansible_test",
+ "AccessKeyId": "AKIA12345EXAMPLE1234",
+ "Status": "Active",
+ "CreateDate": example_date2,
+ },
+ {
+ "UserName": "ansible_test",
+ "AccessKeyId": "AKIA01234EXAMPLE4321",
+ "Status": "Active",
+ "CreateDate": example_date1,
+ },
+ ]
+
+ OUTPUT = [
+ {
+ "access_key_id": "AKIA01234EXAMPLE4321",
+ "create_date": example_date1_iso,
+ "status": "Active",
+ "user_name": "ansible_test",
+ },
+ {
+ "access_key_id": "AKIA12345EXAMPLE1234",
+ "create_date": example_date2_iso,
+ "status": "Active",
+ "user_name": "ansible_test",
+ },
+ ]
+
+ assert OUTPUT == normalize_iam_access_keys(INPUT)
+
+ def test_normalize_role(self):
+ INPUT = {
+ "Arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "AssumeRolePolicyDocument": {
+ "Statement": [
+ {"Action": "sts:AssumeRole", "Effect": "Deny", "Principal": {"Service": "ec2.amazonaws.com"}}
+ ],
+ "Version": "2012-10-17",
+ },
+ "CreateDate": example_date1,
+ "Description": "Ansible Test Role (updated) ansible-test-76640355",
+ "InlinePolicies": ["inline-policy-a", "inline-policy-b"],
+ "InstanceProfiles": [
+ {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/ansible-test-76640355",
+ "CreateDate": example_date2,
+ "InstanceProfileId": "AIPA12345EXAMPLE12345",
+ "InstanceProfileName": "ansible-test-76640355",
+ "Path": "/",
+ "Roles": [
+ {
+ "Arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "AssumeRolePolicyDocument": {
+ "Statement": [
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Deny",
+ "Principal": {"Service": "ec2.amazonaws.com"},
+ }
+ ],
+ "Version": "2012-10-17",
+ },
+ "CreateDate": example_date1,
+ "Path": "/",
+ "RoleId": "AROA12345EXAMPLE12345",
+ "RoleName": "ansible-test-76640355",
+ # XXX Bug in iam_role_info - Tags should have been in here.
+ "Tags": [{"Key": "TagB", "Value": "ValueB"}],
+ }
+ ],
+ "Tags": [{"Key": "TagA", "Value": "Value A"}],
+ }
+ ],
+ "ManagedPolicies": [
+ {
+ "PolicyArn": "arn:aws:iam::123456789012:policy/ansible-test-76640355",
+ "PolicyName": "ansible-test-76640355",
+ }
+ ],
+ "MaxSessionDuration": 43200,
+ "Path": "/",
+ "RoleId": "AROA12345EXAMPLE12345",
+ "RoleLastUsed": {},
+ "RoleName": "ansible-test-76640355",
+ "Tags": [{"Key": "TagB", "Value": "ValueB"}],
+ }
+
+ OUTPUT = {
+ "arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "assume_role_policy_document": {
+ "Statement": [
+ {"Action": "sts:AssumeRole", "Effect": "Deny", "Principal": {"Service": "ec2.amazonaws.com"}}
+ ],
+ "Version": "2012-10-17",
+ },
+ "create_date": example_date1_iso,
+ "description": "Ansible Test Role (updated) ansible-test-76640355",
+ "inline_policies": ["inline-policy-a", "inline-policy-b"],
+ "instance_profiles": [
+ {
+ "arn": "arn:aws:iam::123456789012:instance-profile/ansible-test-76640355",
+ "create_date": example_date2_iso,
+ "instance_profile_id": "AIPA12345EXAMPLE12345",
+ "instance_profile_name": "ansible-test-76640355",
+ "path": "/",
+ "roles": [
+ {
+ "arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "assume_role_policy_document": {
+ "Statement": [
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Deny",
+ "Principal": {"Service": "ec2.amazonaws.com"},
+ }
+ ],
+ "Version": "2012-10-17",
+ },
+ "create_date": example_date1_iso,
+ "path": "/",
+ "role_id": "AROA12345EXAMPLE12345",
+ "role_name": "ansible-test-76640355",
+ "tags": {"TagB": "ValueB"},
+ }
+ ],
+ "tags": {"TagA": "Value A"},
+ }
+ ],
+ "managed_policies": [
+ {
+ "policy_arn": "arn:aws:iam::123456789012:policy/ansible-test-76640355",
+ "policy_name": "ansible-test-76640355",
+ }
+ ],
+ "max_session_duration": 43200,
+ "path": "/",
+ "role_id": "AROA12345EXAMPLE12345",
+ "role_last_used": {},
+ "role_name": "ansible-test-76640355",
+ "tags": {"TagB": "ValueB"},
+ }
+
+ assert OUTPUT == normalize_iam_role(INPUT)
+
+ def test_normalize_role_compat(self):
+ INPUT = {
+ "Arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "AssumeRolePolicyDocument": {
+ "Statement": [
+ {"Action": "sts:AssumeRole", "Effect": "Deny", "Principal": {"Service": "ec2.amazonaws.com"}}
+ ],
+ "Version": "2012-10-17",
+ },
+ "CreateDate": example_date1,
+ "Description": "Ansible Test Role (updated) ansible-test-76640355",
+ "InlinePolicies": ["inline-policy-a", "inline-policy-b"],
+ "InstanceProfiles": [
+ {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/ansible-test-76640355",
+ "CreateDate": example_date2,
+ "InstanceProfileId": "AIPA12345EXAMPLE12345",
+ "InstanceProfileName": "ansible-test-76640355",
+ "Path": "/",
+ "Roles": [
+ {
+ "Arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "AssumeRolePolicyDocument": {
+ "Statement": [
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Deny",
+ "Principal": {"Service": "ec2.amazonaws.com"},
+ }
+ ],
+ "Version": "2012-10-17",
+ },
+ "CreateDate": example_date1,
+ "Path": "/",
+ "RoleId": "AROA12345EXAMPLE12345",
+ "RoleName": "ansible-test-76640355",
+ # XXX Bug in iam_role_info - Tags should have been in here.
+ "Tags": [{"Key": "TagB", "Value": "ValueB"}],
+ }
+ ],
+ "Tags": [{"Key": "TagA", "Value": "Value A"}],
+ }
+ ],
+ "ManagedPolicies": [
+ {
+ "PolicyArn": "arn:aws:iam::123456789012:policy/ansible-test-76640355",
+ "PolicyName": "ansible-test-76640355",
+ }
+ ],
+ "MaxSessionDuration": 43200,
+ "Path": "/",
+ "RoleId": "AROA12345EXAMPLE12345",
+ "RoleLastUsed": {},
+ "RoleName": "ansible-test-76640355",
+ "Tags": [{"Key": "TagB", "Value": "ValueB"}],
+ }
+
+ OUTPUT = {
+ "arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "assume_role_policy_document": {
+ "statement": [
+ {"action": "sts:AssumeRole", "effect": "Deny", "principal": {"service": "ec2.amazonaws.com"}}
+ ],
+ "version": "2012-10-17",
+ },
+ "assume_role_policy_document_raw": {
+ "Statement": [
+ {"Action": "sts:AssumeRole", "Effect": "Deny", "Principal": {"Service": "ec2.amazonaws.com"}}
+ ],
+ "Version": "2012-10-17",
+ },
+ "create_date": example_date1_iso,
+ "description": "Ansible Test Role (updated) ansible-test-76640355",
+ "inline_policies": ["inline-policy-a", "inline-policy-b"],
+ "instance_profiles": [
+ {
+ "arn": "arn:aws:iam::123456789012:instance-profile/ansible-test-76640355",
+ "create_date": example_date2_iso,
+ "instance_profile_id": "AIPA12345EXAMPLE12345",
+ "instance_profile_name": "ansible-test-76640355",
+ "path": "/",
+ "roles": [
+ {
+ "arn": "arn:aws:iam::123456789012:role/ansible-test-76640355",
+ "assume_role_policy_document": {
+ "Statement": [
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Deny",
+ "Principal": {"Service": "ec2.amazonaws.com"},
+ }
+ ],
+ "Version": "2012-10-17",
+ },
+ "create_date": example_date1_iso,
+ "path": "/",
+ "role_id": "AROA12345EXAMPLE12345",
+ "role_name": "ansible-test-76640355",
+ "tags": {"TagB": "ValueB"},
+ }
+ ],
+ "tags": {"TagA": "Value A"},
+ }
+ ],
+ "managed_policies": [
+ {
+ "policy_arn": "arn:aws:iam::123456789012:policy/ansible-test-76640355",
+ "policy_name": "ansible-test-76640355",
+ }
+ ],
+ "max_session_duration": 43200,
+ "path": "/",
+ "role_id": "AROA12345EXAMPLE12345",
+ "role_last_used": {},
+ "role_name": "ansible-test-76640355",
+ "tags": {"TagB": "ValueB"},
+ }
+
+ assert OUTPUT == normalize_iam_role(INPUT, _v7_compat=True)
+
+ def test_normalize_instance_profile(self):
+ INPUT = {
+ "Arn": "arn:aws:iam::123456789012:instance-profile/ansible-test-40050922/ansible-test-40050922",
+ "CreateDate": example_date1,
+ "InstanceProfileId": "AIPA12345EXAMPLE12345",
+ "InstanceProfileName": "ansible-test-40050922",
+ "Path": "/ansible-test-40050922/",
+ "Roles": [
+ {
+ "Arn": "arn:aws:iam::123456789012:role/ansible-test-40050922/ansible-test-40050922",
+ "AssumeRolePolicyDocument": {
+ "Statement": [
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Deny",
+ "Principal": {"Service": "ec2.amazonaws.com"},
+ }
+ ],
+ "Version": "2012-10-17",
+ },
+ "CreateDate": example_date2,
+ "Path": "/ansible-test-40050922/",
+ "RoleId": "AROA12345EXAMPLE12345",
+ "RoleName": "ansible-test-40050922",
+ "Tags": [{"Key": "TagC", "Value": "ValueC"}],
+ }
+ ],
+ "Tags": [
+ {"Key": "Key with Spaces", "Value": "Value with spaces"},
+ {"Key": "snake_case_key", "Value": "snake_case_value"},
+ {"Key": "CamelCaseKey", "Value": "CamelCaseValue"},
+ {"Key": "pascalCaseKey", "Value": "pascalCaseValue"},
+ ],
+ }
+
+ OUTPUT = {
+ "arn": "arn:aws:iam::123456789012:instance-profile/ansible-test-40050922/ansible-test-40050922",
+ "create_date": "2020-12-30T00:00:00+00:00",
+ "instance_profile_id": "AIPA12345EXAMPLE12345",
+ "instance_profile_name": "ansible-test-40050922",
+ "path": "/ansible-test-40050922/",
+ "roles": [
+ {
+ "arn": "arn:aws:iam::123456789012:role/ansible-test-40050922/ansible-test-40050922",
+ "assume_role_policy_document": {
+ "Statement": [
+ {
+ "Action": "sts:AssumeRole",
+ "Effect": "Deny",
+ "Principal": {"Service": "ec2.amazonaws.com"},
+ }
+ ],
+ "Version": "2012-10-17",
+ },
+ "create_date": "2021-04-26T01:23:58+00:00",
+ "path": "/ansible-test-40050922/",
+ "role_id": "AROA12345EXAMPLE12345",
+ "role_name": "ansible-test-40050922",
+ "tags": {"TagC": "ValueC"},
+ }
+ ],
+ "tags": {
+ "CamelCaseKey": "CamelCaseValue",
+ "Key with Spaces": "Value with spaces",
+ "pascalCaseKey": "pascalCaseValue",
+ "snake_case_key": "snake_case_value",
+ },
+ }
+
+ assert OUTPUT == normalize_iam_instance_profile(INPUT)
diff --git a/ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_boto3_resource_to_ansible_dict.py b/ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_boto3_resource_to_ansible_dict.py
new file mode 100644
index 000000000..89a0a837c
--- /dev/null
+++ b/ansible_collections/amazon/aws/tests/unit/module_utils/transformation/test_boto3_resource_to_ansible_dict.py
@@ -0,0 +1,140 @@
+# (c) 2017 Red Hat Inc.
+#
+# This file is part of Ansible
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from copy import deepcopy
+from unittest.mock import sentinel
+
+import dateutil
+import pytest
+
+from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict
+
+from ansible_collections.amazon.aws.plugins.module_utils.transformation import boto3_resource_to_ansible_dict
+
+example_date_txt = "2020-12-30T00:00:00.000Z"
+example_date_iso = "2020-12-30T00:00:00+00:00"
+example_date = dateutil.parser.parse(example_date_txt)
+
+EXAMPLE_BOTO3 = [
+ None,
+ {},
+ {"ExampleDate": example_date},
+ {"ExampleTxtDate": example_date_txt},
+ {"Tags": [{"Key": "MyKey", "Value": "MyValue"}, {"Key": "Normal case", "Value": "Normal Value"}]},
+ {
+ "Name": "ExampleResource",
+ "ExampleDate": example_date,
+ "Tags": [{"Key": "MyKey", "Value": "MyValue"}, {"Key": "Normal case", "Value": "Normal Value"}],
+ },
+ {"ExampleNested": {"ExampleKey": "Example Value"}},
+]
+
+EXAMPLE_DICT = [
+ None,
+ {},
+ {"example_date": example_date_iso, "tags": {}},
+ {"example_txt_date": example_date_txt, "tags": {}},
+ {"tags": {"MyKey": "MyValue", "Normal case": "Normal Value"}},
+ {
+ "name": "ExampleResource",
+ "example_date": example_date_iso,
+ "tags": {"MyKey": "MyValue", "Normal case": "Normal Value"},
+ },
+ {"example_nested": {"example_key": "Example Value"}, "tags": {}},
+]
+
+TEST_DATA = zip(EXAMPLE_BOTO3, EXAMPLE_DICT)
+
+NESTED_DATA = {"sentinal": sentinel.MY_VALUE}
+
+
+def do_transform_nested(resource):
+ return {"sentinal": sentinel.MY_VALUE}
+
+
+class TestBoto3ResourceToAnsibleDict:
+ def setup_method(self):
+ pass
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_default_conversion(self, input_params, output_params):
+ # Test default behaviour
+ assert boto3_resource_to_ansible_dict(input_params) == output_params
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_normalize(self, input_params, output_params):
+ # Test with normalize explicitly enabled
+ assert boto3_resource_to_ansible_dict(input_params, normalize=True) == output_params
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_no_normalize(self, input_params, output_params):
+ # Test with normalize explicitly disabled
+ expected_value = deepcopy(output_params)
+ if input_params and "ExampleDate" in input_params:
+ expected_value["example_date"] = example_date
+ assert expected_value == boto3_resource_to_ansible_dict(input_params, normalize=False)
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_no_skip(self, input_params, output_params):
+ # Test with ignore_list explicitly set to []
+ assert boto3_resource_to_ansible_dict(input_params, ignore_list=[]) == output_params
+ assert boto3_resource_to_ansible_dict(input_params, ignore_list=["NotUsed"]) == output_params
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_skip(self, input_params, output_params):
+ # Test with ignore_list explicitly set
+ expected_value = deepcopy(output_params)
+ if input_params and "ExampleNested" in input_params:
+ expected_value["example_nested"] = input_params["ExampleNested"]
+ assert expected_value == boto3_resource_to_ansible_dict(input_params, ignore_list=["ExampleNested"])
+ assert expected_value == boto3_resource_to_ansible_dict(input_params, ignore_list=["NotUsed", "ExampleNested"])
+ assert expected_value == boto3_resource_to_ansible_dict(input_params, ignore_list=["ExampleNested", "NotUsed"])
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_tags(self, input_params, output_params):
+ # Test with transform_tags explicitly enabled
+ assert boto3_resource_to_ansible_dict(input_params, transform_tags=True) == output_params
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_no_tags(self, input_params, output_params):
+ # Test with transform_tags explicitly disabled
+ expected_value = deepcopy(output_params)
+ if input_params and "Tags" in input_params:
+ camel_tags = camel_dict_to_snake_dict({"tags": input_params["Tags"]})
+ expected_value.update(camel_tags)
+ assert expected_value == boto3_resource_to_ansible_dict(input_params, transform_tags=False)
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_no_nested(self, input_params, output_params):
+ # Test with transform_nested explicitly set to an empty dictionary
+ assert boto3_resource_to_ansible_dict(input_params, nested_transforms={}) == output_params
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_nested(self, input_params, output_params):
+ # Test with a custom transformation of nested resources
+ transform_map = {"ExampleNested": do_transform_nested}
+ expected_value = deepcopy(output_params)
+
+ actual_value = boto3_resource_to_ansible_dict(input_params, nested_transforms=transform_map)
+
+ if input_params and "ExampleNested" in input_params:
+ assert actual_value["example_nested"] == NESTED_DATA
+ del actual_value["example_nested"]
+ del expected_value["example_nested"]
+
+ assert expected_value == actual_value
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_force_tags(self, input_params, output_params):
+ # Test with force_tags explicitly enabled
+ assert boto3_resource_to_ansible_dict(input_params, force_tags=True) == output_params
+
+ @pytest.mark.parametrize("input_params, output_params", deepcopy(TEST_DATA))
+ def test_no_force_tags(self, input_params, output_params):
+ # Test with force_tags explicitly enabled
+ expected_value = deepcopy(output_params)
+ if input_params and "Tags" not in input_params:
+ del expected_value["tags"]
+ assert boto3_resource_to_ansible_dict(input_params, force_tags=False) == expected_value
diff --git a/ansible_collections/amazon/aws/tests/unit/plugin_utils/inventory/test_inventory_base.py b/ansible_collections/amazon/aws/tests/unit/plugin_utils/inventory/test_inventory_base.py
index 32eb3f7ab..4da5792a8 100644
--- a/ansible_collections/amazon/aws/tests/unit/plugin_utils/inventory/test_inventory_base.py
+++ b/ansible_collections/amazon/aws/tests/unit/plugin_utils/inventory/test_inventory_base.py
@@ -3,6 +3,7 @@
# This file is part of Ansible
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+import re
from unittest.mock import MagicMock
from unittest.mock import call
from unittest.mock import patch
@@ -11,6 +12,8 @@ from unittest.mock import sentinel
import pytest
import ansible.plugins.inventory as base_inventory
+from ansible.errors import AnsibleError
+from ansible.module_utils.six import string_types
import ansible_collections.amazon.aws.plugins.plugin_utils.inventory as utils_inventory
@@ -65,3 +68,131 @@ def test_inventory_verify_file(monkeypatch, filename, result):
assert inventory_plugin.verify_file(filename) is result
base_verify.return_value = False
assert inventory_plugin.verify_file(filename) is False
+
+
+class AwsUnitTestTemplar:
+ def __init__(self, config):
+ self.config = config
+
+ def is_template_string(self, key):
+ m = re.findall("{{([ ]*[a-zA-Z0-9_]*[ ]*)}}", key)
+ return bool(m)
+
+ def is_template(self, data):
+ if isinstance(data, string_types):
+ return self.is_template_string(data)
+ elif isinstance(data, (list, tuple)):
+ for v in data:
+ if self.is_template(v):
+ return True
+ elif isinstance(data, dict):
+ for k in data:
+ if self.is_template(k) or self.is_template(data[k]):
+ return True
+ return False
+
+ def template(self, variable, disable_lookups):
+ for k, v in self.config.items():
+ variable = re.sub("{{([ ]*%s[ ]*)}}" % k, v, variable)
+ if self.is_template_string(variable):
+ m = re.findall("{{([ ]*[a-zA-Z0-9_]*[ ]*)}}", variable)
+ raise AnsibleError(f"Missing variables: {','.join([k.replace(' ', '') for k in m])}")
+ return variable
+
+
+@pytest.fixture
+def aws_inventory_base():
+ inventory = utils_inventory.AWSInventoryBase()
+ inventory._options = {}
+ inventory.templar = None
+ return inventory
+
+
+@pytest.mark.parametrize(
+ "option,value",
+ [
+ ("access_key", "amazon_ansible_access_key_001"),
+ ("secret_key", "amazon_ansible_secret_key_890"),
+ ("session_token", None),
+ ("use_ssm_inventory", False),
+ ("This_field_is_undefined", None),
+ ("assume_role_arn", "arn:aws:iam::123456789012:role/ansible-test-inventory"),
+ ("region", "us-east-2"),
+ ],
+)
+def test_inventory_get_options_without_templar(aws_inventory_base, mocker, option, value):
+ inventory_options = {
+ "access_key": "amazon_ansible_access_key_001",
+ "secret_key": "amazon_ansible_secret_key_890",
+ "endpoint": "http//ansible.amazon.com",
+ "assume_role_arn": "arn:aws:iam::123456789012:role/ansible-test-inventory",
+ "region": "us-east-2",
+ "use_ssm_inventory": False,
+ }
+ aws_inventory_base._options = inventory_options
+
+ super_get_options_patch = mocker.patch(
+ "ansible_collections.amazon.aws.plugins.plugin_utils.inventory.BaseInventoryPlugin.get_options"
+ )
+ super_get_options_patch.return_value = aws_inventory_base._options
+
+ options = aws_inventory_base.get_options()
+ assert value == options.get(option)
+
+
+@pytest.mark.parametrize(
+ "option,value,error",
+ [
+ ("access_key", "amazon_ansible_access_key_001", None),
+ ("session_token", None, None),
+ ("use_ssm_inventory", "{{ aws_inventory_use_ssm }}", None),
+ ("This_field_is_undefined", None, None),
+ ("region", "us-east-1", None),
+ ("profile", None, "Missing variables: ansible_version"),
+ ],
+)
+def test_inventory_get_options_with_templar(aws_inventory_base, mocker, option, value, error):
+ inventory_options = {
+ "access_key": "amazon_ansible_access_key_001",
+ "profile": "ansbile_{{ ansible_os }}_{{ ansible_version }}",
+ "endpoint": "{{ aws_endpoint }}",
+ "region": "{{ aws_region_country }}-east-{{ aws_region_id }}",
+ "use_ssm_inventory": "{{ aws_inventory_use_ssm }}",
+ }
+ aws_inventory_base._options = inventory_options
+ templar_config = {
+ "ansible_os": "RedHat",
+ "aws_region_country": "us",
+ "aws_region_id": "1",
+ "aws_endpoint": "http//ansible.amazon.com",
+ }
+ aws_inventory_base.templar = AwsUnitTestTemplar(templar_config)
+
+ super_get_options_patch = mocker.patch(
+ "ansible_collections.amazon.aws.plugins.plugin_utils.inventory.BaseInventoryPlugin.get_options"
+ )
+ super_get_options_patch.return_value = aws_inventory_base._options
+
+ super_get_option_patch = mocker.patch(
+ "ansible_collections.amazon.aws.plugins.plugin_utils.inventory.BaseInventoryPlugin.get_option"
+ )
+ super_get_option_patch.side_effect = lambda x, hostvars=None: aws_inventory_base._options.get(x)
+
+ if error:
+ # test using get_options()
+ with pytest.raises(AnsibleError) as exc:
+ options = aws_inventory_base.get_options()
+ options.get(option)
+ assert error == str(exc.value)
+
+ # test using get_option()
+ with pytest.raises(AnsibleError) as exc:
+ aws_inventory_base.get_option(option)
+ assert error == str(exc.value)
+ else:
+ # test using get_options()
+ options = aws_inventory_base.get_options()
+ assert value == options.get(option)
+
+ # test using get_option()
+ assert value == aws_inventory_base.get_option(option)
diff --git a/ansible_collections/amazon/aws/tests/unit/plugins/inventory/test_aws_ec2.py b/ansible_collections/amazon/aws/tests/unit/plugins/inventory/test_aws_ec2.py
index 8cced1662..e33b78c51 100644
--- a/ansible_collections/amazon/aws/tests/unit/plugins/inventory/test_aws_ec2.py
+++ b/ansible_collections/amazon/aws/tests/unit/plugins/inventory/test_aws_ec2.py
@@ -240,6 +240,7 @@ def test_get_tag_hostname(preference, instance, expected):
)
def test_inventory_build_include_filters(inventory, _options, expected):
inventory._options = _options
+ inventory.templar = None
assert inventory.build_include_filters() == expected
diff --git a/ansible_collections/ansible_community.py b/ansible_collections/ansible_community.py
index a6826bc1e..c0f531dea 100644
--- a/ansible_collections/ansible_community.py
+++ b/ansible_collections/ansible_community.py
@@ -15,7 +15,7 @@ def main():
parser.add_argument(
'--version',
action='version',
- version='Ansible community version 9.4.0',
+ version='Ansible community version 9.5.1',
help="show the version of the Ansible community package",
)
parser.parse_args()
diff --git a/ansible_collections/ansible_release.py b/ansible_collections/ansible_release.py
index a9e9253ba..5802122ab 100644
--- a/ansible_collections/ansible_release.py
+++ b/ansible_collections/ansible_release.py
@@ -3,4 +3,4 @@
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
-ansible_version = '9.4.0' \ No newline at end of file
+ansible_version = '9.5.1' \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/.github/workflows/ansible-test.yml b/ansible_collections/cisco/aci/.github/workflows/ansible-test.yml
index 53799a4ab..91bb1f3dd 100644
--- a/ansible_collections/cisco/aci/.github/workflows/ansible-test.yml
+++ b/ansible_collections/cisco/aci/.github/workflows/ansible-test.yml
@@ -7,7 +7,7 @@ on:
# * is a special character in YAML so you have to quote this string
- cron: '0 8 * * *'
env:
- python_version: 3.9
+ python_version: '3.10'
jobs:
build:
name: Build collection
@@ -15,7 +15,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- ansible: [v2.9.27, v2.10.17, v2.11.12, v2.12.10, stable-2.13, stable-2.14]
+ ansible: [v2.14.13, v2.15.8, v2.16.2, stable-2.16]
steps:
- name: Check out code
uses: actions/checkout@v3
@@ -65,8 +65,8 @@ jobs:
with:
python-version: ${{ env.python_version }}
- - name: Install ansible-base (stable-2.14)
- run: pip install https://github.com/ansible/ansible/archive/stable-2.14.tar.gz --disable-pip-version-check
+ - name: Install ansible-base (v2.15.8)
+ run: pip install https://github.com/ansible/ansible/archive/v2.15.8.tar.gz --disable-pip-version-check
- name: Download migrated collection artifacts
uses: actions/download-artifact@v3
@@ -107,7 +107,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- ansible: [v2.9.27, v2.10.17, v2.11.12, v2.12.10, stable-2.13, stable-2.14]
+ ansible: [v2.14.13, v2.15.8, v2.16.2, stable-2.16]
steps:
- name: Set up Python ${{ env.python_version }}
uses: actions/setup-python@v4
@@ -149,11 +149,8 @@ jobs:
strategy:
fail-fast: false
matrix:
- ansible: [v2.10.17, v2.11.12, v2.12.10, stable-2.13, stable-2.14]
- python-version: [3.9]
- include:
- - ansible: v2.9.27
- python-version: 3.8
+ ansible: [v2.14.13, v2.15.8, v2.16.2, stable-2.16]
+ python-version: ['3.10']
steps:
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
@@ -198,8 +195,8 @@ jobs:
with:
python-version: ${{ env.python_version }}
- - name: Install ansible-base (stable-2.13)
- run: pip install https://github.com/ansible/ansible/archive/stable-2.13.tar.gz --disable-pip-version-check
+ - name: Install ansible-base (v2.15.8)
+ run: pip install https://github.com/ansible/ansible/archive/v2.15.8.tar.gz --disable-pip-version-check
- name: Install coverage (v4.5.4)
run: pip install coverage==4.5.4
diff --git a/ansible_collections/cisco/aci/.github/workflows/galaxy-importer.cfg b/ansible_collections/cisco/aci/.github/workflows/galaxy-importer.cfg
index 631359cf4..7208e7c1e 100644
--- a/ansible_collections/cisco/aci/.github/workflows/galaxy-importer.cfg
+++ b/ansible_collections/cisco/aci/.github/workflows/galaxy-importer.cfg
@@ -1,6 +1,6 @@
[galaxy-importer]
LOG_LEVEL_MAIN = INFO
-RUN_FLAKE8 = True
+RUN_FLAKE8 = False
RUN_ANSIBLE_DOC = True
RUN_ANSIBLE_LINT = True
RUN_ANSIBLE_TEST = False
diff --git a/ansible_collections/cisco/aci/CHANGELOG.rst b/ansible_collections/cisco/aci/CHANGELOG.rst
index 4f4887bb5..17b77334e 100644
--- a/ansible_collections/cisco/aci/CHANGELOG.rst
+++ b/ansible_collections/cisco/aci/CHANGELOG.rst
@@ -5,6 +5,84 @@ Cisco ACI Ansible Collection Release Notes
.. contents:: Topics
+v2.9.0
+======
+
+Release Summary
+---------------
+
+Release v2.9.0 of the ``ansible-aci`` collection on 2024-04-06.
+This changelog describes all changes made to the modules and plugins included in this collection since v2.8.0.
+
+
+Minor Changes
+-------------
+
+- Add Authentification option for EIGRP interface profile.
+- Add L3out Floating SVI modules (aci_l3out_floating_svi, aci_l3out_floating_svi_path, aci_l3out_floating_svi_path_secondary_ip and aci_l3out_floating_svi_secondary_ip) (#478)
+- Add No-verification flag option to reduce the number of API calls. If true, a verifying GET will not be sent after a POST update to APIC
+- Add access spine interface selector and port block binding in aci_access_port_block_to_access_port
+- Add aci_access_spine_interface_selector module
+- Add aci_action_rule_additional_communities module
+- Add aci_action_rule_set_as_path and aci_action_rule_set_as_path_asn modules
+- Add aci_bgp_peer_prefix_policy, aci_bgp_route_summarization_policy and aci_bgp_address_family_context_policy modules
+- Add aci_fabric_pod, aci_fabric_pod_external_tep, aci_fabric_pod_profile, aci_fabric_pod_remote_pool modules (#558)
+- Add aci_hsrp_interface_policy, aci_l3out_hsrp_group, aci_l3out_hsrp_interface_profile and aci_l3out_hsrp_secondary_vip modules (#505)
+- Add aci_interface_policy_eigrp (class:eigrpIfPol) module
+- Add aci_interface_policy_pim module
+- Add aci_interface_policy_storm_control module
+- Add aci_keychain_policy and aci_key_policy modules
+- Add aci_l3out_bfd_multihop_interface_profile, aci_l3out_bfd_interface_profile, aci_interface_policy_bfd_multihop, aci_interface_policy_bfd and aci_bfd_multihop_node_policy modules (#492)
+- Add aci_l3out_dhcp_relay_label, aci_dhcp_option_policy and aci_dhcp_option modules
+- Add aci_l3out_eigrp_interface_profile module
+- Add aci_listify filter plugin to flattens nested dictionaries
+- Add aci_netflow_exporter_policy module
+- Add aci_netflow_monitor_policy and aci_netflow_record_policy modules
+- Add aci_netflow_monitor_to_exporter module
+- Add aci_node_block module
+- Add aci_pim_route_map_policy and aci_pim_route_map_entry modules
+- Add aci_qos_custom_policy and aci_qos_dscp_class modules
+- Add aci_qos_dot1p_class module
+- Add action rules attributes to aci_tenant_action_rule_profile.
+- Add auto to speed attribute options in aci_interface_policy_link_level module (#577)
+- Add missing options to aci_bd module
+- Add modules aci_bd_to_netflow_monitor_policy and aci_bd_rogue_exception_mac (#600)
+- Add modules for Fabric External Connection Policies and its childs
+- Add option to set delimiter to _ in aci_epg_to_domain module
+- Add qos_custom_policy, pim_interface_policy and igmp_interface_policy as new child_classes for aci_l3out_logical_interface_profile.
+- Add support for annotation in aci_rest module (#437)
+- Add support for block statements in useg attributes with the aci_epg_useg_attribute_block_statement module
+- Add support for configuration of access switch policy groups with aci_access_switch_policy_group module
+- Add support for configuration of certificate authorities in aci_aaa_certificate_authority
+- Add support for configuration of fabric management access policies in aci_fabric_management_access
+- Add support for configuration of vrf multicast with aci_vrf_multicast module
+- Add support for configuring Azure cloud subnets using the aci_cloud_subnet module
+- Add support for encap scope in aci_l3out_interface
+- Add support for https ssl cipher configuration in aci_fabric_management_access_https_cipher
+- Add support for infra l3out nodes bgp-evpn loopback, mpls transport loopback and segment id in aci_l3out_logical_node
+- Add support for infra sr mpls micro bfd in aci_l3out_interface
+- Add support for intra epg, taboo, and contract interface in aci_epg_to_contract
+- Add support for key ring configuration in aci_aaa_key_ring
+- Add support for mac and description in aci_l3out_interface
+- Add support for mpls custom qos policy for infra sr mpls l3outs node profiles in aci_l3out_logical_node_profile
+- Add support for security default settings configuration in aci_aaa_security_default_settings
+- Add support for simple statements in useg attributes with the aci_epg_useg_attribute_simple_statement module
+- Add support for sr-mpls bgpInfraPeerP and bgp_password in aci_l3out_bgp_peer module (#543)
+- Add support for sr-mpls in aci_l3out module
+- Add support for sr-mpls l3out to infra l3out in aci_l3out_to_sr_mpls_infra_l3out
+- Add support for subject labels for EPG, EPG Contract, ESG, Contract Subject, L2Out External EPG, L3out External EPG, and L3out External EPG Contract with the aci_subject_label module
+- Add support for taboo contract, contract interface and intra_epg contract in aci_l3out_extepg_to_contract
+- Add support for useg default block statement configuration for useg epg in aci_epg
+- Modify child class node block conditions to be optional in aci_switch_leaf_selector
+
+Bugfixes
+--------
+
+- Fix auto logout issue in aci connection plugin to keep connection active between tasks
+- Fix idempotency for l3out configuration when l3protocol is used in aci_l3out
+- Fix issues with new attributes in aci_interface_policy_leaf_policy_group module by adding conditions to include attributes in the payload only when they are specified by the user (#578)
+- Fix query in aci_vmm_controller
+
v2.8.0
======
diff --git a/ansible_collections/cisco/aci/FILES.json b/ansible_collections/cisco/aci/FILES.json
index 5f5760ef8..f244e0907 100644
--- a/ansible_collections/cisco/aci/FILES.json
+++ b/ansible_collections/cisco/aci/FILES.json
@@ -130,7 +130,7 @@
"name": "plugins/doc_fragments/aci.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "631f5585bf747ab5c3fb044c2c877f21b459c06d7abdf3b3364c4be1b5d5e83d",
+ "chksum_sha256": "7b65fca7c78413da742eff21b6ae0c3b68cc4b87057705c4e66b49a843e5380a",
"format": 1
},
{
@@ -165,7 +165,7 @@
"name": "plugins/httpapi/aci.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "264746072bfde8e36623c5e266ad846c13d665f35d9180368a258c85c7899741",
+ "chksum_sha256": "1e7977fde068fe5c2a02f10b4b1ec65b783e4dddff0a63de46f6e8908fb6713f",
"format": 1
},
{
@@ -176,10 +176,17 @@
"format": 1
},
{
+ "name": "plugins/module_utils/annotation_unsupported.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9284dfbf49459f5d06caddcd36e4417889946f8dab9a45d03b79ed4081614e45",
+ "format": 1
+ },
+ {
"name": "plugins/module_utils/constants.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e15db3f08848a793cc4590cc19d160890d363b3f396d3e438b874e00e1ed9112",
+ "chksum_sha256": "cdfba5e66f41f3167b5a03a18d1aab7a4f90291b8e103ba344ce87c7dc62ea14",
"format": 1
},
{
@@ -193,7 +200,21 @@
"name": "plugins/module_utils/aci.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1abc88c0d889479a346251e722ef7ad4e823d4eab9d326247fcc3af2865bf120",
+ "chksum_sha256": "3282cee20f7833d7a889920f9cbe8454f73f1128912d516131636560d09426e5",
+ "format": 1
+ },
+ {
+ "name": "plugins/filter",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "plugins/filter/listify.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7e17ad420086b785f6b4d724fdea3af70321e67f635fc96a3725c7da72b5c074",
"format": 1
},
{
@@ -218,24 +239,52 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_l3out_floating_svi.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0d35bd74046ae4e8b42a854062c74a6ab18314ddee2590b7325d8af72fc1020e",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_l3out_bgp_peer.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc162cb93c76cb70063f916bc48f46326b3ee70aa444ef0f8c9a2fcfc8198532",
+ "chksum_sha256": "6230184c4b121cc5455fc641ce1275f128c63ac878c4b713cb4191622a7c264c",
"format": 1
},
{
"name": "plugins/modules/aci_bgp_timers_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a449b3f6278ea5215c75674923e2c68e3219824866190a39e6af667e683f3c6",
+ "chksum_sha256": "015d871aab7f67a100475162beb125a51ef33054dee99591cfadbd4606c6c61b",
"format": 1
},
{
"name": "plugins/modules/aci_l2out.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "958ad0c1a52592bb969f139943c7d14b632ebfef8ce978f94a62418b01b9c476",
+ "chksum_sha256": "77bf806f40d6130a5218bfc4166d0c8cc4d09b0ca7e4a1272de9ae65f4416188",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_l3out_hsrp_group.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ca8bd82ccb564caba50c8ab1e6993d410fb2859ebd058d73de2357fd6142e707",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_subject_label.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8cec5a5f0fc0a7b3f22243b2aa7880094f7199830cccd9f65a7db1403699bdfd",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_interface_policy_bfd.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "495f87cb4347a01889f6e3693731bd5b439f7f629282a785ff9a27b053d2bd6f",
"format": 1
},
{
@@ -277,21 +326,35 @@
"name": "plugins/modules/aci_vmm_vswitch_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2d6511c279fa09dd8e02de99fa09f2dc41dce4acd4a0729fc31f46fa1947365b",
+ "chksum_sha256": "60c932093daeaa29b19fb47f61e06f6e74e3a120376c6c43695d2d86fa95bcc3",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_access_spine_interface_profile_to_spine_switch_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "59585865eaf69e60bfabe97a3be44abe2b7662ff2d4fec127a578876a453bb3b",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_fabric_pod.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "60fa6ec9851b3196c47ec816de2ec9fe22733e966d5f23365b03342aef0d5eef",
"format": 1
},
{
"name": "plugins/modules/aci_fabric_switch_policy_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f79ac032e25a85fc776be22cf03db453f83a6c130d11bd04bc5825e51b7fe00",
+ "chksum_sha256": "29ad2f038abd5b4f1c25bf7bbc9c040130224d9e55de8bc165aeec6b88b590ec",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_logical_interface_profile_ospf_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "22e305b0ab4190723cef3630013cacb40e10041143b10314be506b281f1601ee",
+ "chksum_sha256": "19d3ebf9e11120465f1ed070d7bef6cb1dd12112c6755ce98252299f9c007350",
"format": 1
},
{
@@ -316,31 +379,52 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_l3out_hsrp_interface_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "54b3b4e078f04024a8151020a2c83df600631c05d958e8af76154f39e7a0213a",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_l3out_extsubnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "288b72fe6846b240950a7e41207ca0f8873bde6fdde7389fd43590904ee1123a",
+ "chksum_sha256": "536d3512e9e86a3cefb778fbe5d16134431aefb31433c9d1a264ccfb8c88fd6f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_key_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5331c810eb3de36be04afd7d0e3430a3b219c151fc306dba7b36e313845554c1",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_logical_interface_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "49e176ad8ece44f6c3d1e76e3ca82edfd005de6921d51171290262af06414aed",
+ "chksum_sha256": "d7397ff1210b6a004f8593ec42c5869e08734e7088991f62026e304e095768df",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_static_routes.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a75ad5dbd6e8eedce392adc2ccce2d2777d1aa60558f6ffc2a713840dde492bc",
+ "chksum_sha256": "4ab8c960de06bcd0202b6b84b7ea868cd4c88db2dfc5d6c2dcf66feaf24c1aeb",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_interface_policy_pim.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "52e89ba2b37afd4018ea79621c07859625de0a69e24c05487ee061812bad8383",
"format": 1
},
{
"name": "plugins/modules/aci_epg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "781272f3b994f159af0db9270b8a025ad8fc0aa626a137c5efe08ae8b2a85528",
+ "chksum_sha256": "ad8710ddf7761e66c3e72ce15269f95cc32697043de0df9eb349d3d301088197",
"format": 1
},
{
@@ -361,7 +445,7 @@
"name": "plugins/modules/aci_cloud_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8d0025ef8ff2ceed859856f5eda8b3d1c9f15dd2d9d03e9c8787d2170133df88",
+ "chksum_sha256": "82263cfcf517105743790db9b882f8af315bcb380365aee9b321baef5575b155",
"format": 1
},
{
@@ -372,6 +456,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_aaa_security_default_settings.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d25c37a12f38c242709ae3bd0a21f8b6ee08bb688ced8ad118e68164bc9ab66b",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_cloud_bgp_asn.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -386,6 +477,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_fabric_pod_remote_pool.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e0603a1de36f21cb899768bef43bc8bc1ea9c639bc31fb1ed99e76077212e3db",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_config_export_policy.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -393,6 +491,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_netflow_record_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f3617ef80418f9ec2dfe73b6516f283db4ac42c96cfaa522a1ce48dee9200c2d",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_firmware_group_node.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -410,7 +515,7 @@
"name": "plugins/modules/aci_fabric_switch_block.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e89b14e86fe4503938daf4afa708f59283bd2c16fa7c2479d37c27daefcea30b",
+ "chksum_sha256": "e17bcc09f6cf73ed433035cb598c371dd42f0e4f264db8072c70a9fe86baba30",
"format": 1
},
{
@@ -424,14 +529,14 @@
"name": "plugins/modules/aci_aep_to_epg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a4fde4781f4ecfba7cecddf11cd1a84f5962076214e0fe4869891c6ed030e803",
+ "chksum_sha256": "aece66c7de89a624b930ba13f68a17d7f0bc04427e06731bd2222a30b9e048d1",
"format": 1
},
{
"name": "plugins/modules/aci_config_snapshot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d73660d7443d035f9af9602b69fa9d68bb650f9a746879c79d0f152cd8b49726",
+ "chksum_sha256": "09f9c15833f527017def13d8ed456740dc4faa58c34f6a7966adf1578e08d5d4",
"format": 1
},
{
@@ -449,6 +554,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_fabric_management_access_https_cipher.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3df7b6bc4f3bc25152578626e5340f963d437f039cc3a5d0ae01d395552691b5",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_interface_policy_lldp.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -463,6 +575,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_access_spine_switch_selector.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4ea8c998b34d2cf76fab5b08a6b8b7e9ad4281f5371cd136bbc4874f69b38cf9",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_vmm_uplink_container.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -487,7 +606,7 @@
"name": "plugins/modules/aci_vmm_controller.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf296cd7457a775c3ac07f5a1c902b2f498a85eb4c50193289dedc42eea12d93",
+ "chksum_sha256": "9775c2e58de346c098000bee99bd4bc0e9c8d06a4fb9978dc774a069bec4f0b2",
"format": 1
},
{
@@ -498,6 +617,20 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_netflow_monitor_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "eb45e05e3709d7b4b8992e7c50e2be654ea12726fcbf57294cc381e34a269a8b",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_pim_route_map_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f1834c534a4e766e6d764624062eee4bfae8001ea4186ab98ee13680501e6ed2",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_static_binding_to_epg.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -512,6 +645,20 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_bfd_multihop_node_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a839a695a5cc5ed226cfb1e2fc4c0bafb61dfee0fed1a6511009f772982120a3",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_access_spine_interface_selector.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "424c59598ca97012cca166facb8c2fb92640cdfff53efc4270f128025833b640",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_match_community_factor.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -522,14 +669,42 @@
"name": "plugins/modules/aci_fabric_interface_policy_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f991680f4f3b96c2f1256317a457adfe5b736fb245e6b312f6faa1ee2de81d1f",
+ "chksum_sha256": "a6a8b078f9e928ee90d5e581e71b4b95baae1474664b9862af21e9c9dcd3d1ae",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_aaa_key_ring.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "eb2f41677668c1867218aad70a0067041771343e49c2d24d46642ac212cb9f9f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_l3out_floating_svi_path_secondary_ip.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "af11de2dd6e1db6a25b6e88f0d9c88040838ec9f82523cd23725752ddcb6cccd",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_interface_secondary_ip.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4143a680247b3bd6f7a924b053464fc3d456e5ffb1ef4e2b0d21164b2132b7c8",
+ "chksum_sha256": "b73391a4d77efc3fe3715d6f75bdaab2cb8aa43164121c14f90a5d910208eb2f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_interface_policy_hsrp.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "343f4f001a77cf8cd7097e68c287fe7359b701168805b63e54e3e5e57c1e1e35",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_qos_custom_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9c2c544a1e8094ac3475730d422eed1c262ed68aabd59a10b41cc7a812e32c83",
"format": 1
},
{
@@ -550,7 +725,7 @@
"name": "plugins/modules/aci_syslog_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d6d6fcb23b4e3878c90a9498e6dc0ca0784e9115bc7003530d7e5b9b340e714d",
+ "chksum_sha256": "62fac942a3cf0956bf262280a23e48f7b55bd251e5eb8974cde8d443358ec848",
"format": 1
},
{
@@ -585,7 +760,7 @@
"name": "plugins/modules/aci_l3out.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7671c4aa2a641a1f9c2a3020d9577b876edcee0533dd44da8b6e14177f48aa0c",
+ "chksum_sha256": "b569169142b8ad83fd6181123bd2d3f1822b16dc78771c506b6ea3417ef904c5",
"format": 1
},
{
@@ -596,17 +771,24 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_fabric_external_connection_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "abf23c7cdf2c2c6960bc445393a5331a1d4cde0b7f74608fe6d23762f177cb9a",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_interface_policy_link_level.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "278b8caecae9575eefe1304bdf7fc1f70d3d28106394d4b4a20b678380e3eff6",
+ "chksum_sha256": "1919445dcc2c225f2b47ba8393f4d35a97b609e8880a2e757a6b29ea1d26aea7",
"format": 1
},
{
"name": "plugins/modules/aci_switch_policy_vpc_protection_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a3885f31f00ae77d15576acee774d806d9910a11e5428483bb505cf44a98d4f0",
+ "chksum_sha256": "3c5aa5e987f844c0c229be29cb0072b31a7bd9f93a35556db5eb02a89d5468b5",
"format": 1
},
{
@@ -620,7 +802,28 @@
"name": "plugins/modules/aci_tenant_action_rule_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d37d41527ebd97ddf17cf2dac2579f3354a66a0be88132906533d21903873bce",
+ "chksum_sha256": "19bc6a49ef84a301e2b8b2fbd74542123d9cc5b37dbfa949e16aa2f29d49989a",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_keychain_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f5f5fb5e5c92120f68b0eb323cee3af0552c398b870bff35ea1e96ee8b7babee",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_netflow_monitor_to_exporter.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f4376283e5cb6a4319e97aa383e392e97a8d424a0f8183d1231ad6695f7f1ee7",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_fabric_pod_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "126aa5e445d1210b0982cd31702c87272132816fcf62da28f80aa0b20b45eb3b",
"format": 1
},
{
@@ -631,6 +834,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_fabric_management_access.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f5646061904b187169fdc2103a53cdb784830f6a146a27623d2a3099db9e28ee",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_interface_policy_mcp.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -645,6 +855,20 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_interface_policy_storm_control.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "883a2e6cb3a57acf3a588d2db08ca27804bb7a9236462564cbf279fe0cf8edd4",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_l3out_hsrp_secondary_vip.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e1f9bb7b762c822152b26dd8731a9a2feca5246484373c0af18158b9fafc1410",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_maintenance_policy.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -652,10 +876,31 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_action_rule_set_as_path.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8481d6f2c98dbd7307632bf1827c98899a0e4815adc90c6ad3d0ebc8889503e5",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_l3out_floating_svi_secondary_ip.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b7ea4286b273b5ed12d10a64deb906e6ee8a1a21cb2f1d38aa85a09a77012178",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_netflow_exporter_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ed6829e37facedf366e30bb62e6445828d1e059da1a9397c31d36814c6f91961",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_interface_policy_leaf_fc_policy_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "25f72bb8b07c4ce0caf364f5b8413e43bfe6b773c54414fa4de8f64c329dd0d9",
+ "chksum_sha256": "584358125ebaca48bcd0b12518dacd2d240ec1733b47e09eb8fa8fd6f8459f4f",
"format": 1
},
{
@@ -708,6 +953,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_interface_policy_bfd_multihop.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ee8a3a4553759ae8b7aff848da1a545640e5864598fd08f55f72eaf0ae4af036",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_match_community_regex_term.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -722,6 +974,20 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_epg_useg_attribute_simple_statement.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "13086f90a8cd3289cf4a12411df900a2dd0c71c91e5edd23058477bc18c2abbf",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_l3out_to_sr_mpls_infra_l3out.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4a2b7bdabfd0f619a81db44a371d8fd5598b7edce8897093a49ec6a11f9bcd83",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_access_span_src_group_src.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -764,10 +1030,31 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_interface_policy_eigrp.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8cb76d40339c358a157f9597e58018d5bb31d609c7e43ba89faac5eb9120b75e",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_dhcp_option_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "131c02cd148c86d322dc1db79eff8d86f20ac3288524e7203d082b065008b8fe",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_access_spine_switch_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a4c972ac6d6648f531a6a8b815519d629dda2cacf1cd505e4cf96063b8fa8ce9",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_epg_to_contract_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fb50ec097036f21192f0aa2bb0a16bede660d27ca942fa1862d2dbd98c7e0152",
+ "chksum_sha256": "c5913cdc2dcad978148a85a9029efb3234cedf328597399f0d90ac6d549eaf38",
"format": 1
},
{
@@ -795,7 +1082,14 @@
"name": "plugins/modules/aci_bgp_rr_asn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "59522a6145c69f4e8f4d09c8fd4ee18a486d00f9cf4a6d5ccbc3b2a4133566f0",
+ "chksum_sha256": "8f37a10fa7519a267905ab216b4c6e8c76c14534829980dd3fecf2f3bc1bbf4b",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_bgp_route_summarization_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6c642df7ecae79f991df54171c93fa2fac3357aaabd126b268772bd59748089c",
"format": 1
},
{
@@ -809,28 +1103,28 @@
"name": "plugins/modules/aci_dns_provider.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "22da1c0c3345aee698ec847a3c5c7ba274cacc611aea019236146ac20e279710",
+ "chksum_sha256": "b8a0867a23eb8bcb678ea49155f778865827a2e7fa3419fd43eea5ed9ffa1451",
"format": 1
},
{
"name": "plugins/modules/aci_snmp_user.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "90dd375a7441d6b293b0d889310f157a97d186ca8504cc3245da41a5eef8853a",
+ "chksum_sha256": "2b155074d3a4afd46c985baab1896080a95ed8c90f08821deaab2caa1ed41e3c",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_static_routes_nexthop.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f889ee4b222b52f2dff2baaa761ca75389be7726ce6a29e792c12ad681118877",
+ "chksum_sha256": "5a878a58f8a8edb7aa866014b592011a8321f7a12683e6a8fc2052731e80cc07",
"format": 1
},
{
"name": "plugins/modules/aci_epg_to_contract.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76904fec70dbd9f81804ee9e56c9a0b868df226e924a586b5aec05950e3b9632",
+ "chksum_sha256": "050d9470762d02ce29a822a5d1ad5d9ab67cba1cc48e8ecf3de9de79d8dd4688",
"format": 1
},
{
@@ -844,7 +1138,14 @@
"name": "plugins/modules/aci_node_mgmt_epg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f17f5d0fd7d030d1d9edeac7e9748b3a27b137ad388850b8de847dad9c2458e0",
+ "chksum_sha256": "70dffdfd3c91be40c1b0840295f00203a74fa50e1cee529a3482c8d53f008e7a",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_vrf_multicast.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "581d3cffb9571e14fb789d4c916d111d28a04e27a0c5cc288da7db4b295efb5a",
"format": 1
},
{
@@ -865,7 +1166,7 @@
"name": "plugins/modules/aci_encap_pool_range.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0faeb5ce1485c0d0ef993c58de5eb8c7056b5c6964ee9765b9e4ee45049e905e",
+ "chksum_sha256": "0de6a9ab1a4839f6d85a92697985a764983bd27ef54b7fd1f5d90cf5aba54961",
"format": 1
},
{
@@ -879,14 +1180,14 @@
"name": "plugins/modules/aci_dns_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "294401dde010dd3af324f0e4073db27b96c4e557b83ff801d41ff62ed47a32f5",
+ "chksum_sha256": "240fc467c21956eb1554d0e1fbb8367e4134321044cdc5e141a455511eb8b970",
"format": 1
},
{
"name": "plugins/modules/aci_vzany_to_contract.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8d0beb41985eea0fbb07c65f97a79d19ad6f1a526ae9e0a2fbc024371a63a93",
+ "chksum_sha256": "77e5d6cc4c8be1908de624deaa8b809447c2f01be6ea51e1a61d38d8c4cbc014",
"format": 1
},
{
@@ -900,14 +1201,14 @@
"name": "plugins/modules/aci_contract_subject_to_service_graph.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "68a1fe769d6506da41abc49090fc2d091d54601350f4cfbc371e01813f52619b",
+ "chksum_sha256": "765b3cedfcacdc7aeda746fce702297a7dc394fcf1fb40f9e05d58101a6a5237",
"format": 1
},
{
"name": "plugins/modules/aci_syslog_remote_dest.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "905f5f4286c4f4d306e9e174c838e71dd8027f751873d765bcf2671659a0ee30",
+ "chksum_sha256": "7c47bc88dddb0ab6a92f15ec802f499f0c6b11d86de09ef8b6477b3e91c39c56",
"format": 1
},
{
@@ -921,7 +1222,7 @@
"name": "plugins/modules/aci_system.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc0bdacedabcc2ac5372c22b7f4afcd58c2f1644c5843100d6d0331c022b79ad",
+ "chksum_sha256": "1ed52493e2d498a3a9827b273ef243188b2f6bdafe543caf5a93d33820924a54",
"format": 1
},
{
@@ -932,17 +1233,24 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_pim_route_map_entry.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a97b14e38a6d547f8872a7048d3a8d1bd80efe1eb71538e99bf3b3b0f34a8aba",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_l3out_logical_node_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e2104cbc94406fc36b5ce27f76c924f18c8199db79c4efdfcdc6ffb8ab07f94",
+ "chksum_sha256": "5510c4c25e12b0686cf30d60b5a0142999311a7c197b5e753d08ba55b3d5cabf",
"format": 1
},
{
"name": "plugins/modules/aci_maintenance_group_node.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "50b579ec246dd92a298d9438d1a127ec616c08a702cd744f3eebb5af12c5d352",
+ "chksum_sha256": "37669228be6271810e4ac87fdaf3287f4306e4a20f2e7fed7e54388d7b357f13",
"format": 1
},
{
@@ -963,7 +1271,14 @@
"name": "plugins/modules/aci_snmp_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "302dd819fc6a454d2f9ec5cd124ed0edf6ca7e56de79dd8f5a6302bff7217c85",
+ "chksum_sha256": "1c72b7b6ca528952b96c103086545f8d1d66315ee68a77f190fc903d2413c494",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_l3out_floating_svi_path.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ad30f623b290629e4e9dc40c02dad2bc6af381afb653e60b3e2bdc7b1538608a",
"format": 1
},
{
@@ -974,6 +1289,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_action_rule_additional_communities.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "62042dd3a37e6fba520ca06511070f6788d1de04f1ba63c68414c38a4cc541bc",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_maintenance_group.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -991,14 +1313,14 @@
"name": "plugins/modules/aci_tag.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7cef96d7872d8c72eec261ae88fb365d3357556d78192922f9e31bac6eddc2e8",
+ "chksum_sha256": "73904792f99df2cf754f07483f4c1975e9edbd54855d7abb759018c96d6c48ce",
"format": 1
},
{
"name": "plugins/modules/aci_fabric_leaf_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e7c47a9ae33f2601c3ebb18fe7a91c1428cf2b1e532bfe41989676e9dc5fd1ab",
+ "chksum_sha256": "4de73c2a8019fe586fb5bfa3f615626e863ee1719aa792e71a431d9bc83c33a8",
"format": 1
},
{
@@ -1012,14 +1334,14 @@
"name": "plugins/modules/aci_access_sub_port_block_to_access_port.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "68cd3d4199900db287946625f5caf7a661a1d8ec3dfaa6fb40028b637b3621df",
+ "chksum_sha256": "cd1610b19bb027fe8c6091fe9522637cec9e34a0cb00150de563d4c483548785",
"format": 1
},
{
"name": "plugins/modules/aci_match_route_destination.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e07f2b93fbad18f038cb0a3c9b417f02b1b21993885387d696ddeb9f99dba6d",
+ "chksum_sha256": "a64cb8eb6a3919778589c1b81104e00878921ad1f5c68acff25b78b6e25ae57b",
"format": 1
},
{
@@ -1030,6 +1352,20 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_aaa_certificate_authority.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "175f89268110ca497db26e93c771fa89bde956fe9cf992469d7f935116ebd552",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_bd_to_netflow_monitor_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "dbb43bf7a2049326223bc2a9f63584d7a923f35686b57a287bde8525cae2c151",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_bd_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1037,6 +1373,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_l3out_bfd_multihop_interface_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9ec885be4029b15e68d843ab5942a6b502bb2371142a31f8e3508239a293c37c",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_cloud_zone.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1047,14 +1390,21 @@
"name": "plugins/modules/aci_encap_pool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df4e00a21d863e612eec8ed91475e7431b8dabe150ee2d5b45ff1ce3ec7a3dc6",
+ "chksum_sha256": "3b5ed6ee619ff7f0308055d73e0d553919e6a298e75e93a219e9a2139509e0c3",
"format": 1
},
{
"name": "plugins/modules/aci_bgp_rr_node.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b09067780ee01cf7ebe73e2ec29f9a66a01d72e330f10ed7c9a6591e7f0bdcdd",
+ "chksum_sha256": "aa5946d37e2f660a5a28221a5e99df03f37f41c740bff72543bcc18406af128b",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_fabric_pod_connectivity_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "53481b562d99a323f056474293d7dd9f25189bca7d897018f0b96eafbcd2ee7c",
"format": 1
},
{
@@ -1068,14 +1418,14 @@
"name": "plugins/modules/aci_dns_domain.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b134b414207d3eeb255ff7bf016bdc75e169a0a3d137cb2e84cc319c3fea462a",
+ "chksum_sha256": "2dabb5042cdd2b96f643866f8a638c2dc5d8f3eda1acbdb94f1f88c5aa0d2abb",
"format": 1
},
{
"name": "plugins/modules/aci_fabric_wide_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "14ae98b14724769b9dc68d8ba82a05a4822638373908bd35ac22124d4190aa76",
+ "chksum_sha256": "2ac4257982f31954248f2cb3d1b6946fbe39db07ce606b5eb17449bd6ee1e05b",
"format": 1
},
{
@@ -1086,10 +1436,17 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_action_rule_set_as_path_asn.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f4ae65464969acb1fb93e75d47f0b044349f9fa62e9cb3fed0b762f0318ba2d4",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_domain.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82ec99a3dcfd6d626929e943b62a60fc60d5dcb2f686d4b9fdb5e00d5c9f959d",
+ "chksum_sha256": "43c2b0fbc8ca6096e52d35657922fae229ab88228b1ed6f482f7821a66426d05",
"format": 1
},
{
@@ -1103,21 +1460,21 @@
"name": "plugins/modules/aci_access_port_to_interface_policy_leaf_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc69261f8fa08ba96021350c055a15a24c9b5f4d1ebdc5cd1811c35667c5005e",
+ "chksum_sha256": "3734300218e78b60c54f26197a5ef5b3c63f42e6a5f7d63d3dd8d7fc6c48e207",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf8af029c86fec511b9786c649cb44d4e91a3a10886cd224f04df5b589fe74a1",
+ "chksum_sha256": "8289da6e31326a2e57ee57f0f3e491b104535144767a6418b193d2b60757da4a",
"format": 1
},
{
"name": "plugins/modules/aci_fabric_spine_switch_assoc.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c487540b110788907432a425b89e2c6fd58fc1da3f3bee9fe1097ac466e1e5fa",
+ "chksum_sha256": "de20dfa79cee8adb14d7f14a2cf96cf84c8ddb91914adab0d934e4c11441d975",
"format": 1
},
{
@@ -1131,7 +1488,7 @@
"name": "plugins/modules/aci_l3out_extepg_to_contract.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cd9f2e1c4feb2932e7266c6a15164ab478c781d48345a062b825d7cc84613d66",
+ "chksum_sha256": "7dde1c1843012dd6090ef6c404e319bb2a1f341970be266df1f711c5bcc3320f",
"format": 1
},
{
@@ -1152,7 +1509,7 @@
"name": "plugins/modules/aci_snmp_client_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c2afd339ea34f7668be627fb2e602a2fb7a4e642c3cc71420538121a5e554543",
+ "chksum_sha256": "b5ddf25075717b014b7e11aac5add45dde17b597d1ad36c7248ad8af882bfb3b",
"format": 1
},
{
@@ -1163,6 +1520,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_access_spine_interface_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d1c73e641df78bfec90dbd312ab869d1d187baa079212ddb0e792a3ad393747c",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_aaa_domain.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1173,14 +1537,14 @@
"name": "plugins/modules/aci_access_port_block_to_access_port.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd2a7549ccfde9bc363e236629f64fa1bdf3ce402ae58ad7d2793beabb87673b",
+ "chksum_sha256": "bd80caf580b0e53bbaf6a8d0f6d3349c95e3c6d92f6b17e45cd0ec60af2d98bb",
"format": 1
},
{
"name": "plugins/modules/aci_ntp_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eebd5403f803ebda15e9e15837f2e18afc66d6ebc0be58c44ed59520c87d9c52",
+ "chksum_sha256": "bdc611ccd63d213752849eef2a4f6403dd06f70d1ad811f6633ce3426324221c",
"format": 1
},
{
@@ -1191,31 +1555,45 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_bgp_address_family_context_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0ca03c2c9610ca1ecd91c13d7c42275498a2bb6bbd5a32052e34aed11ee1c863",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_rest.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a3e4869643545856630c76bab8af0c1e8a71ca3b4af7ef29a79b88c1ed2464f2",
+ "chksum_sha256": "ff743d38c1cff2c95843d9c22440630cc820d68f1345b598929820d02ac87d77",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_access_switch_policy_group.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9097a019442b974bfa9b66f9a9b52d900707021c5fa6fd404554d4908399acdf",
"format": 1
},
{
"name": "plugins/modules/aci_fabric_pod_selector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fead1bdf7c39203eb394f8fd96f7a454ed89de4d40206e3c735d6b5e870ec58d",
+ "chksum_sha256": "2c37c8c8724cbf21fced9e5ccd61696f40a3987056a64c06060f1c8ffec09b9b",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_logical_interface_vpc_member.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "11a04697b9f93535d17b035bbe07954b47cad7c37673b8e9a5f0d8a1caf9bc31",
+ "chksum_sha256": "773e5486d8340dfa66ac727526218fec9cabce021a4dbb55eff26051c3b9ee2c",
"format": 1
},
{
"name": "plugins/modules/aci_snmp_community_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e29a26e77c7937e97e5661668e6cbdcb023334deced1d1767a5cfb90fb922fa7",
+ "chksum_sha256": "bf4b1bee0f6a15876bb7758d4c8f5b1bfbfa6d9625102e79bd19417d31b051d4",
"format": 1
},
{
@@ -1229,7 +1607,21 @@
"name": "plugins/modules/aci_snmp_client.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "320ed5765b8ea502dcf17a88651195079919eb5be623bb2332f926137fd989fc",
+ "chksum_sha256": "512a2ff7cdc3d295258eeeac297170e947a2b33729361e610114cf2432417da6",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_qos_dot1p_class.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d5054b5fbc6ae9dae9376d9d593eb41b0e3d6581e33ac2030ef474b69d4eede8",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_epg_useg_attribute_block_statement.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "42aba45c6d80cc81da6b648f580fbf76be12a05e9c87acaeb755bd48a6c1717f",
"format": 1
},
{
@@ -1240,24 +1632,31 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_qos_dscp_class.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ccf605015cb3e075584197ce8e25b5db1b423cbac2849ef11849d5de753b75e0",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_l2out_extepg_to_contract.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9f2f4735ce7eeb926b98b1f4f0ad67a091e361e6a6eec007bd81e14659f2e527",
+ "chksum_sha256": "e88b27fe70d104e83209fb1077c32c25f7a8e791f189c3569ee6c03c9f4d5ae0",
"format": 1
},
{
"name": "plugins/modules/aci_l2out_logical_interface_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ef3ac4c31c8b128b7fc206f13e6a268a8e43e0b17bee5a073d9d9b2349a2d5b3",
+ "chksum_sha256": "2e46597067c3945e05d3cfa7f725d3873a476ceae0212b0ada6cca8b57f586d7",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_logical_node.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "762ecc6681dab6e00794b8567a1cbadd5bd42ecdc6ab7af60f9b151d89e4a908",
+ "chksum_sha256": "6f665530114856a27ec52757da35b756bca96a5e8ed557bc26914783f145c88e",
"format": 1
},
{
@@ -1268,10 +1667,17 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_l3out_eigrp_interface_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "382374fda6f15ff1ff50447cf256f9c68678e45870246d95d6b36a5438841aa6",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_interface_policy_leaf_policy_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "606a16df31e90d074ff9c9c4e2b1cff46c7a2da68f43cc356a26aed1c4d2ee49",
+ "chksum_sha256": "8144a7e12b9ec8de017cdb71878219e53afed451faa1ee7e66f0f39379986db1",
"format": 1
},
{
@@ -1285,7 +1691,7 @@
"name": "plugins/modules/aci_ntp_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "93beb84bcc3d2e9de66ebe55e076a3b0f5e2fb5a16b80d81d39f214d09b53924",
+ "chksum_sha256": "1d75cb4af507406070bd26eff775f7099c6037fabed8ce4bd6880aa614a27184",
"format": 1
},
{
@@ -1299,21 +1705,28 @@
"name": "plugins/modules/aci_aep.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a9b1d886d17fc8bfd05b4f324b6aa8fd6f6afd8496a9d5170077e30b6b7627f",
+ "chksum_sha256": "7ce0cce80492d93272720502499552464f587d76367a981619c268211bdc6990",
"format": 1
},
{
"name": "plugins/modules/aci_l3out_extepg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bcfd941ee89b3956e4f76b203ab20bdbe40c4af72e1c363e300447ac4ba81209",
+ "chksum_sha256": "e5add6a6372db4115a3e5d6d9c7433ecff48ed7cc802ea428176829bf87e437f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_fabric_external_routing_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "82e146d037e0dcff8100d789ad1fffc8c2a624ec3a180c0d8b0f6cda4fc706df",
"format": 1
},
{
"name": "plugins/modules/aci_bgp_best_path_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "866b0ec86a66ff6e2671e3127a60b11807d3fea75825576a5ebb72ac4cc4fd11",
+ "chksum_sha256": "2510955f815b08674acd4e7978f137f80358f5ebe7e8af98923fa7e0e1589e14",
"format": 1
},
{
@@ -1331,6 +1744,13 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_bgp_peer_prefix_policy.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ab1a7aaaab66a46f3e6ac4ac12eb605ee07a829a45f7e327e98aaa9a36e5909a",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_cloud_external_epg_selector.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1341,7 +1761,14 @@
"name": "plugins/modules/aci_fabric_spine_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04b2937317e9cb6e30a2c835cce415d2056a851241e25421bb07b30ea766309d",
+ "chksum_sha256": "05d3ecd4a6829756cd205a2b4ef03f36ce0a6551a7ac2039d15ba0e74d615bb3",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_node_block.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d068826d6cca43d36f3dc6bec7971167bf4a17b5313ae3f2d698d4d6785c1952",
"format": 1
},
{
@@ -1362,14 +1789,21 @@
"name": "plugins/modules/aci_dhcp_relay.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb3bd3dc51d09790c499266a64790bfc40b6c0c87a9d4d9849f73aead09f6e96",
+ "chksum_sha256": "63c43d13b7b052976cd059fa82d377029ea865bd7b44ab856aa017231f35ceb4",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_l3out_dhcp_relay_label.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8ddb3cff30dd4c4dfb48ac703bb3dbaac4ae192b1fe17ce82cc0e592ebbfa3f1",
"format": 1
},
{
"name": "plugins/modules/aci_aaa_ssh_auth.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1a11939efc42e5eef17de294c3f269363bd5ca2c33948169790960f56d1f66d0",
+ "chksum_sha256": "a0174a594fdb221bbeb72c669a93645e9fb1c64e3dba5b851053704b86be2f12",
"format": 1
},
{
@@ -1397,14 +1831,14 @@
"name": "plugins/modules/aci_l2out_extepg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4df3b9d894f1018992859d33ef04371677097ba439e477fa667281a11d8e013c",
+ "chksum_sha256": "474d1f24e39732788fb6552b079ec267d96f93e3b859af1db951cb55c2bbe868",
"format": 1
},
{
"name": "plugins/modules/aci_interface_description.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "66af31a14a88ae595203b8423c60ce0e0c5f6a6e227b77934e858b3f6ff8b8d3",
+ "chksum_sha256": "8443f8928c0acf67bd199a42bbb62783f72fa2d840687d0d16e88440a1752cc3",
"format": 1
},
{
@@ -1418,7 +1852,7 @@
"name": "plugins/modules/aci_epg_to_domain.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7a6d853dfcaa26e3b875f37a5d6ac6f93985194fe049542915da491ad0a1898a",
+ "chksum_sha256": "5cca1da914e70dcb6ddd2492330fce8ce00356e38ebec79d6c03002ba4a0f7e7",
"format": 1
},
{
@@ -1439,7 +1873,7 @@
"name": "plugins/modules/aci_l2out_logical_node_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2231736fe506b60286c5656a2030da7f9be1910f15da672abaefbe0b1d4caa6",
+ "chksum_sha256": "0fad05ff02df088faef3e5724349116f237bbf4c00f00fde28483ddd994cc339",
"format": 1
},
{
@@ -1453,7 +1887,7 @@
"name": "plugins/modules/aci_static_node_mgmt_address.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38643b5e89186388f3e1e3f31b3f1cefd24c209c7317f8994ce8044a43bfc0b5",
+ "chksum_sha256": "9b099b5a0ed706ce351ca1515aca2892b97114cf29af4b83aa12325676f57b64",
"format": 1
},
{
@@ -1464,17 +1898,31 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_fabric_pod_external_tep.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "390ad103958c088923973117925962b884914d0a9a886953bb545383f517dc21",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/aci_dhcp_option.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f35467794ee204ccfd1f8e602c66e76c016b096588a3d8ed0eac0e33a0bbbf8b",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_dhcp_relay_provider.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c656312b9b7372480f95e1b2b1ee2d1c06981a91847415b602de675241f38783",
+ "chksum_sha256": "6d11d7f2bf3c8a58f93cbb10e7059db50827ae9f90412689f6363a62d3e4f3d7",
"format": 1
},
{
"name": "plugins/modules/aci_bd.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6f2d9e6e6c7f50cc7139fe425d498503580cd701bf959f93747867ae6e89dcb",
+ "chksum_sha256": "f34256d98e574710544ea3b5cd7edfba0c2b544de3a9a7453385191c674fb114",
"format": 1
},
{
@@ -1488,14 +1936,14 @@
"name": "plugins/modules/aci_esg_ip_subnet_selector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1cccaa749da04355d2c8ffeee3f37e2a7cf6e2965f3527da631caf77c0fa3c4f",
+ "chksum_sha256": "b5753aee69b9c0b956fef638a487badab47e2575faaad5896383a815c17308ca",
"format": 1
},
{
"name": "plugins/modules/aci_syslog_source.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "33378f1e3da1418b7b7bf2bf3c2b56e22d6017489b9cbb8480e160f7658b1638",
+ "chksum_sha256": "6ca6ec85ce969d27fb0c6e13f37896e91e2f9bafe784a7e59c79cfc2860c1875",
"format": 1
},
{
@@ -1509,7 +1957,7 @@
"name": "plugins/modules/aci_igmp_interface_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dcab75238e50636cf711e31dc06f39549c8f0349c1f842641e53be890feddc37",
+ "chksum_sha256": "4a669e24ee48f9feea05e59d298fb1fbb75c8c5eea90f7e10ff4697a6d0f9b0d",
"format": 1
},
{
@@ -1523,7 +1971,7 @@
"name": "plugins/modules/aci_interface_blacklist.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "354033a3d04dba5c2099f32453690b181528bfca52e1ae54b462f9ef4411fba5",
+ "chksum_sha256": "5f4b0ab0f9be0e662f875d3692614f6bcc86e403851515f888f09ebcaa09425c",
"format": 1
},
{
@@ -1541,10 +1989,17 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_l3out_bfd_interface_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7b78b47c3f637dbad1f12fb5601e09f6532d920bf5032d97e1ed70ea615fa92e",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_l2out_logical_interface_path.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4b7326f21b04df50bdc8a36660e66d5b7c98ffb5c4dfd8b085014a8720bbf442",
+ "chksum_sha256": "8884fbb1ecec52a84f8e9704b7cd73c9452d2d518d458d18d08ff64f64d3e490",
"format": 1
},
{
@@ -1555,10 +2010,17 @@
"format": 1
},
{
+ "name": "plugins/modules/aci_bd_rogue_exception_mac.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c0ddc4a83798ffe29926e16ee9226ec55e2bbc7d8467285e5ff0a6c92c9b87ec",
+ "format": 1
+ },
+ {
"name": "plugins/modules/aci_switch_leaf_selector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1488618f3ab559384294ebb1459508c73469e8cdc2d609d33c662f614687e542",
+ "chksum_sha256": "2f72810a858ac96408ee58971e9f580674451e40530c54913787564a1f121336",
"format": 1
},
{
@@ -1593,7 +2055,7 @@
"name": "tests/unit/compat/builtins.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba13a350ade8ef804336f888d5883b8e54f8bddfb9d0fadc10277a8ca6540f4e",
+ "chksum_sha256": "3ab3c581035d277195322ffc42e41315d7c1f502a9c04227608836be1748ef49",
"format": 1
},
{
@@ -1649,7 +2111,7 @@
"name": "tests/unit/mock/loader.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "536cab78d0d94beced4f11fec254173e9d1e8309b3ea47a4caa9a77e1e5b65a0",
+ "chksum_sha256": "e1893e25a6ea2ca88ca0fc5b5dfe230d7fe97e634fa6f930e093b619290b6f12",
"format": 1
},
{
@@ -1761,7 +2223,7 @@
"name": "tests/unit/module_utils/test_aci.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8480f1ff37482f4f260f5df3d1428585530c0fc9c0a3c0c388696a7109fd951f",
+ "chksum_sha256": "2ac6a68e874d272853c5f179993791a7ad66ea586c3297ef3d86d3dae6df9d5f",
"format": 1
},
{
@@ -1817,7 +2279,7 @@
"name": "tests/integration/targets/aci_l3out_static_routes_nexthop/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd0f30d3d16fa72bbd1b9893fcfc3b0d5fa0d022e1441701ae8428f741056967",
+ "chksum_sha256": "6a353dbc99717ed8177c119dff25131364efe1a53d1cd475818ac262b389e5b2",
"format": 1
},
{
@@ -1828,6 +2290,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_interface_policy_bfd_multihop",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_bfd_multihop/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_bfd_multihop/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "13685e99580f38026105872fd095aefaf2ad3072a73d5d07caee1184ff619ab9",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_bfd_multihop/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bd_rogue_exception_mac",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bd_rogue_exception_mac/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bd_rogue_exception_mac/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "55b888d0fe8243a6398c041b0db8b151b6141d1046b5ff8afb6759125c5ec07a",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bd_rogue_exception_mac/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_bulk_static_binding_to_epg",
"ftype": "dir",
"chksum_type": null,
@@ -1845,7 +2363,7 @@
"name": "tests/integration/targets/aci_bulk_static_binding_to_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "84e94677beff76de0840bf516a363281e8d41b2a554137af618f7e8c6263565a",
+ "chksum_sha256": "cf36d796d11e1be1d26ee74dd9c1be0313d9bdbe7a01e43d1c6ea6d52ee1a0c3",
"format": 1
},
{
@@ -1873,7 +2391,7 @@
"name": "tests/integration/targets/aci_maintenance_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b844b65db6cdf1934a6533e89a7591f20bc6dd2304acfe5706fe7dd1e1fb7426",
+ "chksum_sha256": "6b13d9e01f2962b086bc0b12da836dcc8d519d337576c6891b584f700ae10ec8",
"format": 1
},
{
@@ -1901,7 +2419,7 @@
"name": "tests/integration/targets/aci_tenant_span_src_group_src/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6c33688aae7482df41385b622a6d728446eabff9a7cb45a9c4a4ca51dc71bba7",
+ "chksum_sha256": "7139efd1e06fd2c557e9a85d95dc8651ca591abb6c4fbeb2aee894f32e659318",
"format": 1
},
{
@@ -1912,6 +2430,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_interface_policy_hsrp",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_hsrp/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_hsrp/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "724f468049beb27adba5873b65d3a200a257d150e56cb97853a347dcbf7a5ead",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_hsrp/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_interface_policy_leaf_fc_policy_group",
"ftype": "dir",
"chksum_type": null,
@@ -1929,7 +2475,7 @@
"name": "tests/integration/targets/aci_interface_policy_leaf_fc_policy_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fe1b3e59b230ed7f25bdf7c813f197dfa66e1ed964995b17dff7768416ddbe45",
+ "chksum_sha256": "620c371219707b5ba9ffb3c48b07c390a2f4af7c54b534e3a9102af89e670a9d",
"format": 1
},
{
@@ -1957,7 +2503,7 @@
"name": "tests/integration/targets/aci_firmware_source/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ef4e251bc843d4ceafc9ea063dc76b6c03e8db36b2287a197f58aa80bcc768f7",
+ "chksum_sha256": "0520dbc50b4c79c2d60b38da8781dcfdc287f22c3db3e262257c5533e605e669",
"format": 1
},
{
@@ -1968,6 +2514,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_fabric_pod",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "fc1722266ff691d548e29d744fd1c9d37751b754ae88cdd66fcaa86442ba7c57",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_access_port_block_to_access_port",
"ftype": "dir",
"chksum_type": null,
@@ -1985,7 +2559,7 @@
"name": "tests/integration/targets/aci_access_port_block_to_access_port/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1828323aa38b65382a6861d3940dd3e18c5811e8884a0c9a498b1c20474fd17d",
+ "chksum_sha256": "2ea0d9197777664d16d11dae2a33cfea35346472a092eda6748ceb0eb445d1d1",
"format": 1
},
{
@@ -2013,7 +2587,7 @@
"name": "tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b55c642e8532b93e41194dc38d6cc027358149c993e391ec8f4cb2f648609900",
+ "chksum_sha256": "78d89115835ad9d3ef9534e0a1d408b71c1a3207fb20f0a5250f14aafb72283a",
"format": 1
},
{
@@ -2041,7 +2615,7 @@
"name": "tests/integration/targets/aci_filter_entry/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e61460bafe4da68c7fde6ba4f048add6429fe9019de9ed587a21cf24c5f1272f",
+ "chksum_sha256": "3f32421512afce6c2ed052d4af39f0baa18c51356e9095cb4916b848a63a389e",
"format": 1
},
{
@@ -2052,6 +2626,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_hsrp_group",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_group/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_group/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0fbdf79f543ac0ae48c297878fcdc6aa3dc752afa61fc7be1997a39cb6f3067b",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_group/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_interface_config",
"ftype": "dir",
"chksum_type": null,
@@ -2069,7 +2671,7 @@
"name": "tests/integration/targets/aci_interface_config/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "949614da80caa4cd9533e7063e8a4d6dfc08e3ae6da70672209b7df2d1b60346",
+ "chksum_sha256": "bdd483a3e9175b7e37640176f4e41bd2cfe3cde64ca27da979e28ac8b6468bcb",
"format": 1
},
{
@@ -2097,7 +2699,7 @@
"name": "tests/integration/targets/aci_vlan_pool_encap_block/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c27de4117ad90e8466f98e511ff516843648ee8da6fe25645a9f8ae87b25768d",
+ "chksum_sha256": "d03d3b2b81b15d6fa8735ef96833fdbecde52f5eadfd84df553832dd2447da9c",
"format": 1
},
{
@@ -2108,6 +2710,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_dhcp_option_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_dhcp_option_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_dhcp_option_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7d51eff57f9862977b125ef675a893b9cb4c8c067c808a84f965927c92b4a244",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_dhcp_option_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6c15f6cf851cd65ac515fbe2681160fd34b056634ae78e1ac1b28d5793417f2e",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_vmm_uplink_container",
"ftype": "dir",
"chksum_type": null,
@@ -2125,7 +2783,7 @@
"name": "tests/integration/targets/aci_vmm_uplink_container/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "16a798f367b375064bf56f5113576979bd3e867d689d1696301dcd1c5b4fb283",
+ "chksum_sha256": "cda2b2dcf9fc277d187ddc01c25fb43bb6685e248ec5eb65098d34b6a84853f1",
"format": 1
},
{
@@ -2153,21 +2811,21 @@
"name": "tests/integration/targets/aci_vlan_pool/tasks/dynamic.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cb73f26a0209ab1499cd932c8b01114d50ea77426c3405114e1d7c57e8edafa3",
+ "chksum_sha256": "91bc67bd296c556bf94eebf42fc939c98eb5adfbe92e87191beff06f7168f6e5",
"format": 1
},
{
"name": "tests/integration/targets/aci_vlan_pool/tasks/static.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "391806200ff6ffcf6ecfda748cff3a28825c1092401cad52f1e6afcfeeb83237",
+ "chksum_sha256": "2dd127083ff68df0a3dbf696db8d8a40a79d047f4a293c3c403699627c6e60e2",
"format": 1
},
{
"name": "tests/integration/targets/aci_vlan_pool/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f16539e51468e18e77f6105b1a4ba847f1e6a28a08d652e17fa40144606db4f4",
+ "chksum_sha256": "4433286af63fcd50848bc5106316ba8688e2225d955a458bc98def951922b3c1",
"format": 1
},
{
@@ -2195,7 +2853,7 @@
"name": "tests/integration/targets/aci_cloud_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "082ad8f9777a3cb4cf019ed7b3a750e0eaa4ecea0e67d63c17230ab77a184b79",
+ "chksum_sha256": "ed75fbb318aef76412f7528ffa101f5a74a831bf17e1291b14069f42d0171a76",
"format": 1
},
{
@@ -2206,6 +2864,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_netflow_monitor_to_exporter",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_monitor_to_exporter/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_monitor_to_exporter/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ada8730c4ef724c2092ded8a260928e5640f2c4808b87629eb881e6b25c5301d",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_monitor_to_exporter/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_cloud_external_epg_selector",
"ftype": "dir",
"chksum_type": null,
@@ -2223,7 +2909,7 @@
"name": "tests/integration/targets/aci_cloud_external_epg_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cba2fe77659c826449cd65ed0443e521f7b9179ee1fe78d2b4e67cc3c8785e86",
+ "chksum_sha256": "2b0932f5ada60334771a611b14a4a5816f740aad0da9ab6b831056fe4c359bce",
"format": 1
},
{
@@ -2251,7 +2937,7 @@
"name": "tests/integration/targets/aci_cloud_aws_provider/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "30e2c31b5ad7f73e6b909478f13fa19357504a1e3bd9c27f27869f29df0bf874",
+ "chksum_sha256": "6efafcee986c6011fa8411217eba7a81d6a026421ec055cbe2cf92c731c7a098",
"format": 1
},
{
@@ -2272,7 +2958,7 @@
"name": "tests/integration/targets/aci_domain_to_encap_pool/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e1408a04b604992172d9ee514d16d3b1c83f089191656bd4e20516d1c39e16fd",
+ "chksum_sha256": "63db0c5f71279ef78cce75034fc4561bdcf605172cff877d7d8a2a3fec12e98c",
"format": 1
},
{
@@ -2300,7 +2986,7 @@
"name": "tests/integration/targets/aci_interface_policy_mcp/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "deef48fee05f5fb8bc48390e26b4cff4871bcdcfb06d94fba77a01bcdae94bb6",
+ "chksum_sha256": "329f5419253eab113bd4faa25f4a99af32251af723460d8e707c4d8db32f2aca",
"format": 1
},
{
@@ -2328,7 +3014,7 @@
"name": "tests/integration/targets/aci_match_rule/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e5084a752a4704a990bb9d8ca629d47d0447209e5cbc8dac92439a9048f96758",
+ "chksum_sha256": "ea173a9f9c9f72d041027ffffbfb2112baf709dbf032674b3cc258489d4f8cbc",
"format": 1
},
{
@@ -2356,7 +3042,7 @@
"name": "tests/integration/targets/aci_ntp_server/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5e745be684046cdde7cd23c7da4d4a96be89ee0b538f65f0047178393194c1c0",
+ "chksum_sha256": "951b435ff39db19906bbaf323b9bee3b807a2d581e8665dc0361e719f6478ac7",
"format": 1
},
{
@@ -2384,7 +3070,7 @@
"name": "tests/integration/targets/aci_l3out_logical_interface_vpc_member/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e76de28c039ecd85e495e2077a838631707c5d7b1547ec8e0cc892a0637cb62a",
+ "chksum_sha256": "315a59b0363d15adf5c69ed52b58f1ff42f2b1d07e298c6cf841f1fab4bd17cf",
"format": 1
},
{
@@ -2412,7 +3098,7 @@
"name": "tests/integration/targets/aci_snmp_client_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fcca2775acfaa05479b5b5e430c68be81f2c3aa7e6bd7494c820ee2d19c23eed",
+ "chksum_sha256": "26b1f825dfd08e37204f64729e2abbcb7c0e300e2cfaa45cba0ded048db4db34",
"format": 1
},
{
@@ -2440,7 +3126,7 @@
"name": "tests/integration/targets/aci_interface_description/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dab564ccaffb75fb23e7ebe92e423733dd8db80e0907f2cbb2c7ab63ef9b53f7",
+ "chksum_sha256": "541b55bf33113e77644761cde93b2d85dd0fcfa7312d3cc79c4e9f647fd579c1",
"format": 1
},
{
@@ -2451,6 +3137,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_bgp_route_summarization_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_route_summarization_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_route_summarization_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5942305ac9e0bb1d890ef8526e12637256e9f4ddffb2f9594d745d1e9273cd4f",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_route_summarization_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_dhcp_relay_label",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_dhcp_relay_label/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_dhcp_relay_label/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2c58052c4366f9fc07db66e74f2e1a3f40a591029c9667fe8a6f7c3ed3885892",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_dhcp_relay_label/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_dns_provider",
"ftype": "dir",
"chksum_type": null,
@@ -2468,7 +3210,7 @@
"name": "tests/integration/targets/aci_dns_provider/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8deb0048459357964c22ea4ceeddc9581317b58e9bb61d833430069f67d63368",
+ "chksum_sha256": "75a48c8e2feb076b93f0ce76fcee1bf7029b7189021cb88262a734a1a013606f",
"format": 1
},
{
@@ -2496,7 +3238,7 @@
"name": "tests/integration/targets/aci_fabric_wide_settings/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "148d337c86ab59cfab9434d4d23959de9a7fc4f2cac867d7af9f9e4e52d02e9b",
+ "chksum_sha256": "647a1cc95af3bbe86822436a1dc0db0cb0e3093ab4f80fb21cb0da08906144f4",
"format": 1
},
{
@@ -2524,7 +3266,7 @@
"name": "tests/integration/targets/aci_esg_contract_master/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "510fa4b0b76ac202ef3b090ae4fc78e5f3b8875e58ceeada92412884b53be1a1",
+ "chksum_sha256": "a67a0f25727f1bd1d90a50924b7767d9a26b3b4d06df8d099a039c5e5b5d2dd8",
"format": 1
},
{
@@ -2552,7 +3294,7 @@
"name": "tests/integration/targets/aci_access_port_to_interface_policy_leaf_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d3ed26b1f2e6331c513718899de4606dadb3f837d724946a54b2347e2bea6684",
+ "chksum_sha256": "b4a134d633ad0572114d5e0184929adb9b33612c543b99899c7fc9d88f13d3e1",
"format": 1
},
{
@@ -2580,7 +3322,7 @@
"name": "tests/integration/targets/aci_cloud_vpn_gateway/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bbd695fc212060f340e99ae563176ae49654bbefa01bb6e093789633e899e090",
+ "chksum_sha256": "10acde1e59189c19db818fa973107ba1dcb5723f327a224441e701eb52415c45",
"format": 1
},
{
@@ -2591,6 +3333,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_aaa_security_default_settings",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_security_default_settings/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_security_default_settings/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7c8afd97006fcf68327261fb0f59141dce9ee8f24b9865b7c5fbd1d4004490e0",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_security_default_settings/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d5789ff7ae5e73b5e920cd7c0ff63889a6865dae9d5c5d52b39080a268a0e1cf",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_interface_policy_fc",
"ftype": "dir",
"chksum_type": null,
@@ -2608,7 +3406,7 @@
"name": "tests/integration/targets/aci_interface_policy_fc/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b2d68e0c3e83127354a824682dc77c62a7a8f7aff69dae9f125c6b068265358f",
+ "chksum_sha256": "2a0710b51cc7591636bcfbcf98523e8c90c7d6471d2d4a34614bca90df7dc9b5",
"format": 1
},
{
@@ -2636,7 +3434,7 @@
"name": "tests/integration/targets/aci_bd/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "348510483344aa212bc086073b923408e66d0487d42869dab01039ef52dddc0f",
+ "chksum_sha256": "b688f78a537ecbe5c93b7137442c2648250bb083e35ff3200ad74e8805bed8f1",
"format": 1
},
{
@@ -2664,7 +3462,7 @@
"name": "tests/integration/targets/aci_snmp_community_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1f55bd655ca008656898bca31cb24e3c3fb8c4c9857ac5e4344a9cfcbc173f5b",
+ "chksum_sha256": "b0a52e2028b3b6a122141571a294359f4ae704805d26c68e2810a6c2e28d25c8",
"format": 1
},
{
@@ -2692,7 +3490,7 @@
"name": "tests/integration/targets/aci_access_span_dst_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de5e15422dbac4ba028abd5422c3f9fe32fb5bf2cbdbd11658a3be4f44b3160e",
+ "chksum_sha256": "ba4a2a1bc6f8b8fcd6fb658c770e22a84302cf1128d04d0e7a4bd3eaf48b4a09",
"format": 1
},
{
@@ -2703,6 +3501,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_node_block",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_node_block/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_node_block/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9b674a47283e025b415b1517afa141a7a2cb47989f8dc4428801a9dcfceee21e",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_node_block/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_external_connection_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_external_connection_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_external_connection_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "75f507b1660e5210c8087024f86683df8970405cac3e9588881761cc35bd4b2e",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_external_connection_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_config_snapshot",
"ftype": "dir",
"chksum_type": null,
@@ -2720,7 +3574,7 @@
"name": "tests/integration/targets/aci_config_snapshot/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0a799646b1dbd9af66d8df8679820cf8605a7cb64de234e8c88d3d4eaf7f0502",
+ "chksum_sha256": "ffaf6e7f0074f0cc2c13d5de9c6ba0694d99bb7b99be2ca416cc479c4fd41ce3",
"format": 1
},
{
@@ -2769,7 +3623,7 @@
"name": "tests/integration/targets/aci_access_span_src_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb9a24d78c38d7e0bff38cdcf51520f0deb18fa0679bc58856121caa71564413",
+ "chksum_sha256": "44d4f6f7286395d4b69df747e208f1d70a52a04b68572920c740fdf92faf8d81",
"format": 1
},
{
@@ -2797,7 +3651,7 @@
"name": "tests/integration/targets/aci_interface_policy_leaf_breakout_port_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2a419d08da733f8a710fcce36d358c3a792435145c4da5ea9f359ec3126c9509",
+ "chksum_sha256": "ab95d13dd9a4034c23cbafb5a903a342482cce5002617efc9bae7d96676cb7a0",
"format": 1
},
{
@@ -2825,7 +3679,7 @@
"name": "tests/integration/targets/aci_fabric_switch_policy_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9c2e6fd65a9f000cb521b0321fef521255c8b9374f987213d23836db32ae3b7b",
+ "chksum_sha256": "0563dc17cad8b553217c1a11c55df9d481539c9f7c76b0a012d21f9e45508320",
"format": 1
},
{
@@ -2836,6 +3690,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_action_rule_additional_communities",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_additional_communities/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_additional_communities/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "50dc2f6089cf26d9dae4ae3858760d006dee474d8772e3aa8b99c6f005a293bd",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_additional_communities/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_selector",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_selector/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_selector/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b0bcd1f6790dbbfc417b4d06bc77bdecd380b2278065e2bac73a115ec8c92d17",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_selector/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_ap",
"ftype": "dir",
"chksum_type": null,
@@ -2853,7 +3763,7 @@
"name": "tests/integration/targets/aci_ap/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "180f2222d7fab150d26b1f94088d5edb070178d1bdf4bc198c0d24588d32b331",
+ "chksum_sha256": "075ea0bef5ce28a4ba9132f3faca6f08d54c4d519820e8acdb7eb29078f4e9ef",
"format": 1
},
{
@@ -2881,7 +3791,7 @@
"name": "tests/integration/targets/aci_interface_policy_lldp/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c2094fbab84d87ce85c8e69e2b7c5b37f906d95eb36578b4c39ade77eb46e35",
+ "chksum_sha256": "4fc7ace04cc0c032fe5d143344bbd1efe79e4383dae59962e0fe265a28ecd04d",
"format": 1
},
{
@@ -2909,7 +3819,7 @@
"name": "tests/integration/targets/aci_access_span_src_group_src_path/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a01cd09447143359ef684d14444f762e33d2c56d9afb6cad3263989678be66bd",
+ "chksum_sha256": "65adaca0033acf98b08766fdc5743e33aa947639f324dcf7ac2bad8ef4f6c6b0",
"format": 1
},
{
@@ -2920,6 +3830,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_netflow_monitor_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_monitor_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_monitor_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "812cecdf3a9c2d60c7f12e79df107e590d0be6ad4900c932dd2d3bd8bd1b5bf7",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_monitor_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_interface_policy_l2",
"ftype": "dir",
"chksum_type": null,
@@ -2937,7 +3875,7 @@
"name": "tests/integration/targets/aci_interface_policy_l2/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9ca36be150a08cbb8940d974c1a6ee059739fd0728b539ffcee805426964bfe8",
+ "chksum_sha256": "1b93975510336d9fe01777e4d386dda4f9e2a5e65d812fde144039577ed6d030",
"format": 1
},
{
@@ -2965,7 +3903,7 @@
"name": "tests/integration/targets/aci_l3out_route_tag_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c1e76ca9add4ba716db7e406f1d4cfca1487881d5264dbc4a0057c9a3a26502",
+ "chksum_sha256": "6e154f6c8fb59f20af72b610e90d2c4b624c3ec72b0c5db14b31850325abaa70",
"format": 1
},
{
@@ -2993,7 +3931,7 @@
"name": "tests/integration/targets/aci_esg_ip_subnet_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1cf6174d2cf27cf9488644f407736c4139424cf52efdbf951713b7b511ca3ad",
+ "chksum_sha256": "784db6c69ed7752334eeba70e235637730f04f76649d8dee8802dc2265a68036",
"format": 1
},
{
@@ -3004,6 +3942,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_access_switch_policy_group",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_switch_policy_group/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_switch_policy_group/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a96c613da3cfcb8d4877a515c47a85c5611941611aa6f6d5b5b8acd383bd1048",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_switch_policy_group/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_eigrp",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_eigrp/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_eigrp/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "21ef50711ac13abe3fe324cb574e510d8552751d4745af7dc4704a5e740f56bb",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_eigrp/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_fabric_span_src_group_src_node",
"ftype": "dir",
"chksum_type": null,
@@ -3021,7 +4015,7 @@
"name": "tests/integration/targets/aci_fabric_span_src_group_src_node/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8ef543f2ea69f83824459c15f967cee7dc2d8b553a613d42ba58c794cbc71f9c",
+ "chksum_sha256": "740872eb37c6af94636ad16b317b0ff68d99c18975f41c2cf09b83ac4999cdb7",
"format": 1
},
{
@@ -3049,7 +4043,7 @@
"name": "tests/integration/targets/aci_fabric_pod_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "142a54f5ea8d61ca6a19bd8caf6a851799de963b6d41d427acb6205bf00fe0ab",
+ "chksum_sha256": "acf9ceb102cdf9dd068fe5fb2d251b723c1800d1878f9a9232a49a25e1533b08",
"format": 1
},
{
@@ -3077,7 +4071,7 @@
"name": "tests/integration/targets/aci_bd_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "860384656ad549aa29df90bc8684d04ba250a9bdcbd50625c4db12a8da6c5b7a",
+ "chksum_sha256": "c85f1df14defc8594e85dab41d012f478841a580c2b4bbd63584d0fc52517897",
"format": 1
},
{
@@ -3105,7 +4099,7 @@
"name": "tests/integration/targets/aci_access_span_src_group_src/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9dc18d120ffb94f5d068e0d153497a8cf5be32366a8b698b62f0d59bfa40fa6c",
+ "chksum_sha256": "5cafc8dd677930fd24fe7c90eaa2506bf9e169b3c5642d708ebe9ab6b3833197",
"format": 1
},
{
@@ -3133,7 +4127,7 @@
"name": "tests/integration/targets/aci_aaa_ssh_auth/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "68ea72c2bead2faabb228d2fb91146165c519371bc46ad550c6a5fcb573588cf",
+ "chksum_sha256": "272463007e5206c3bb50044a00296247d115f393bdd411ca8486a7f2b58d8cec",
"format": 1
},
{
@@ -3158,6 +4152,41 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_epg_useg_attribute_simple_statement",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/simple_block_levels.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "edf2582d6c826c327514d6dc3ca831527542282cc6558396cf9dad006d930508",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "854587afcd7496318201bffe566e135734afe00993dbe3800f5b86935ef9a428",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_epg_useg_attribute_simple_statement/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_system_banner",
"ftype": "dir",
"chksum_type": null,
@@ -3175,7 +4204,7 @@
"name": "tests/integration/targets/aci_system_banner/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6055791dda8f2b3c4fa18573d3b704229cda2a6b817f3b8984fd46475d97652f",
+ "chksum_sha256": "c3dfe182aa2cc04090da103aec29a93790275b8cbd966453c688f70adf95887e",
"format": 1
},
{
@@ -3203,7 +4232,7 @@
"name": "tests/integration/targets/aci_interface_blacklist/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4d3c6bde54b9a5c3b7c01058b41a3cb7e055425062699463733b0d2bbd0efca4",
+ "chksum_sha256": "7e86f9f41542e3e6c9a14533ee6eaad79e234ecb97450ed72c8af934930ec2b9",
"format": 1
},
{
@@ -3231,7 +4260,7 @@
"name": "tests/integration/targets/aci_interface_policy_leaf_profile_fex_policy_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e9f5cff01edb38af15d9db2e2b6a19fb889e6a911dd1c079ddbd2355eea58784",
+ "chksum_sha256": "14bd6dbb8fbe95f5005695ef99617f07f339fb400d4cb0c58a3f95b406b24980",
"format": 1
},
{
@@ -3259,7 +4288,7 @@
"name": "tests/integration/targets/aci_syslog_remote_dest/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8cdde3499fe651dad5bd9afc73a318d9b2ccbe1ba1bed3d7e3e2829268484373",
+ "chksum_sha256": "329bb76f7ef5d3580e95ed6b3b97ac3b9a608b5a6535d8897ea48a6d1ef8f9d4",
"format": 1
},
{
@@ -3287,7 +4316,7 @@
"name": "tests/integration/targets/aci_vzany_to_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "184e773934f91f4af9a47fe4cc619c0db3f569e95c2b4af41f50e0712c4f056c",
+ "chksum_sha256": "393485c2f5a01f6af10d1304437784bcfa89f1b000aa39275bb25b3f137c288e",
"format": 1
},
{
@@ -3315,7 +4344,7 @@
"name": "tests/integration/targets/aci_fabric_leaf_switch_assoc/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "52a606163c2d5b8fde2b7e6024867432468613edb00589d077468cffd51582c2",
+ "chksum_sha256": "6a2fb0ef7a000a6222909878c191e8abfba89b6b049f6ab1fca1765dbdb70435",
"format": 1
},
{
@@ -3343,7 +4372,7 @@
"name": "tests/integration/targets/aci_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1d8de08f6d94f24732d428571352d0729799c4060c1ec71ffb98dddafc30ee7e",
+ "chksum_sha256": "6c3d695d9cc94bfb6edb9c98da462c4129f2ba7a72d57f3ccbb7fc2e993d2cbe",
"format": 1
},
{
@@ -3371,7 +4400,7 @@
"name": "tests/integration/targets/aci_node_mgmt_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6cc139d0048870bfc25135df76cc9e9489214e42af5ff369491469ecedc7d1ac",
+ "chksum_sha256": "fc7475fc26e0422513ff3607cc7d961f22351dd5feab56321731796a812341f2",
"format": 1
},
{
@@ -3382,6 +4411,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_bfd_multihop_interface_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7478cb13ebcf26986773947a04936f91cb724ad1d780e8061eb8664e7bc9d42c",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_pim_route_map_entry",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_pim_route_map_entry/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_pim_route_map_entry/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f5d9d462368cb9b72d836aca6dfda0ba5fa4d4845a74e4475ffe2f2cd6d36eb5",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_pim_route_map_entry/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_l3out_logical_node_profile",
"ftype": "dir",
"chksum_type": null,
@@ -3399,7 +4484,7 @@
"name": "tests/integration/targets/aci_l3out_logical_node_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5ec5e65d1465e02637d52d5bb09fdbe4fda23bd1531dd1c7bcf63a3e6daf69d2",
+ "chksum_sha256": "e01c83bb926d73f2696b0c80aa32ef57ada9421d70edcfa28fabf2d28c1a88cc",
"format": 1
},
{
@@ -3427,7 +4512,7 @@
"name": "tests/integration/targets/aci_l3out/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c085a58785b7e4539654e0254479dd8585f5ed9d94005772e2cff7b02db13e50",
+ "chksum_sha256": "f2f3db1f45a197eb63ee2abf69d3846e003169bc8a005a7f4d8d8f2ceaafb6c8",
"format": 1
},
{
@@ -3455,7 +4540,7 @@
"name": "tests/integration/targets/aci_epg_monitoring_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cd7cb391b571c4b8294030393cd288334b14eee8c1f88bf678776f8cc60e7440",
+ "chksum_sha256": "24b071e6239b75d757f3e3f4f781d02ac2cb5c8e115c6c1ceda273d0cc1fdd58",
"format": 1
},
{
@@ -3483,7 +4568,7 @@
"name": "tests/integration/targets/aci_interface_policy_leaf_policy_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8821f0cf43e9a9d1f5d8965fc4b38f78a75d62d1b599a74a4dff8546e9866919",
+ "chksum_sha256": "dd96b5ca42b731af07e3ea81b610077b65049ffdb61b0410c595939c626394f8",
"format": 1
},
{
@@ -3494,6 +4579,55 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_fabric_management_access_https_cipher",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access_https_cipher/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access_https_cipher/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "354499d076d51762359bc6754bf7a3419a8adcf808c5a531e7a3ed5d3bdb8576",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access_https_cipher/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access_https_cipher/pki",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.crt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f97928b2cd1ce43cfe9ae9bbf47a40b858a749c4c3f25a7ec02898611f4fee90",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.key",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "947c1b5a6c419641d4b2c8492b91f2d71588958666aeceeffb1f878460b1d256",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_match_route_destination",
"ftype": "dir",
"chksum_type": null,
@@ -3511,7 +4645,7 @@
"name": "tests/integration/targets/aci_match_route_destination/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "85f354ddd29b16e87aaa87111e966a120a6c6003d9a20426900be897c2920a87",
+ "chksum_sha256": "2f4b74df3f41c9c953b17a5507582414ef917228a975b2cdfea50f9f1bfe0a60",
"format": 1
},
{
@@ -3522,6 +4656,69 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b3df535e49bc0be8388c197c5b0bf033531b251ed9d006b54680657fb9b44617",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_subject_label",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_subject_label/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_subject_label/tasks/subject_label.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b0142be114c5b41e92d0606b6773f88956d6364426921d61a9d8c3917593e95c",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_subject_label/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b6766924ad4faf3897216406eebf0db680a19b16eacabd23b54aec4e1930c7b9",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_subject_label/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_lookup_interface_range",
"ftype": "dir",
"chksum_type": null,
@@ -3539,7 +4736,7 @@
"name": "tests/integration/targets/aci_lookup_interface_range/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2dcf9c4f3ee3490c49c1231b11d66fc565c936109235e174d452d072b4b02dcc",
+ "chksum_sha256": "221de56e6663fa2dceb813ad609f945c98710d6fbcadcae7c5a33e4a7b6e9051",
"format": 1
},
{
@@ -3550,6 +4747,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_action_rule_set_as_path",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_set_as_path/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_set_as_path/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "68ce66ae1b1a1475fbbc7f7ec356c4d869ae309edd1ef84d29db395d95c4b8cb",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_set_as_path/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_interface_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_interface_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_interface_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "70a846f11cd8a5d33689ccdb3c4bd8175e71775ea26a44479448bb4dc56fc51f",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_interface_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_vmm_controller",
"ftype": "dir",
"chksum_type": null,
@@ -3567,7 +4820,7 @@
"name": "tests/integration/targets/aci_vmm_controller/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b4854c79b639f404cb9aa8636019081e6bb5c8084848e5d81757537d28f3c5f",
+ "chksum_sha256": "5a3cd55149d7f96da70469e19735ab3c66f1035b7c16c408e012d9abf0e8585c",
"format": 1
},
{
@@ -3595,7 +4848,7 @@
"name": "tests/integration/targets/aci_match_community_factor/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "85b19ffcc7f1722664426544bc85648f722f8cda85876e702b651174a6d6c251",
+ "chksum_sha256": "88bfb2ad054c03baaa0deb48b1ca92378c2861e268f405f01eeb24367ea803ba",
"format": 1
},
{
@@ -3606,6 +4859,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_netflow_exporter_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_exporter_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_exporter_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d5db92b4f7d533301c0d74cd6e43168f20f9e958fbb1df411243429fe31b14bb",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_exporter_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_interface_policy_spine_policy_group",
"ftype": "dir",
"chksum_type": null,
@@ -3623,7 +4904,7 @@
"name": "tests/integration/targets/aci_interface_policy_spine_policy_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "70e00aa9a7355ec778b136a583b71ac3211f5cd0a37e4574b5b9f421f99ab6ea",
+ "chksum_sha256": "f549bb6df8c4bb50f2b90e7396eb1821f6bcdc1b73692e7086e84918fd4a71fd",
"format": 1
},
{
@@ -3651,7 +4932,7 @@
"name": "tests/integration/targets/aci_contract_subject_to_service_graph/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "715f1489683ba74fed4c3301e483f8ceeec58119bcbf765eab406b134d7954c6",
+ "chksum_sha256": "adc631affae75b956ad1706c342768534435020288b484e5b9206e15f577723a",
"format": 1
},
{
@@ -3679,7 +4960,7 @@
"name": "tests/integration/targets/aci_l3out_extepg_to_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "89289a10d688f0af43ab79066c1bf433d8117b54cc8d3cf02bda857edd507699",
+ "chksum_sha256": "c4235e10fba80f4cfa51414d789fc641b110a586ce680758fc473008c16679d4",
"format": 1
},
{
@@ -3707,7 +4988,7 @@
"name": "tests/integration/targets/aci_esg_tag_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19d6518c1375739ee95c6016e97bfa1aab3da1e6db19429ce9d89006c5236d63",
+ "chksum_sha256": "e8737e49c607fc4ea8d3e1be17786d980145bac3a8a47b37e342852dbd35b19e",
"format": 1
},
{
@@ -3718,6 +4999,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_fabric_pod_remote_pool",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_remote_pool/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_remote_pool/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "211d91283dcb13d28868f7b3b688878b26bfa80f28b6b5fdc34219908a7d457b",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_remote_pool/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_taboo_contract",
"ftype": "dir",
"chksum_type": null,
@@ -3735,7 +5044,7 @@
"name": "tests/integration/targets/aci_taboo_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8108b12b09f191cd13cbf4c5fc15132979a8a64fc070ccdd1f3053b4fcc05180",
+ "chksum_sha256": "cccae803763b432f0e46dd690c1246c7890f0c15d43afb738aed1f5e7aec2f4f",
"format": 1
},
{
@@ -3763,7 +5072,7 @@
"name": "tests/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7f14fc189439710b1e57a89af9ba53d34850b8b289c59207b9239d73cd0edabd",
+ "chksum_sha256": "1be874b2846aa8cc3262e2fd72f54e4be879ed8cf182f3455dbdfb821ea3fd52",
"format": 1
},
{
@@ -3774,6 +5083,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_interface_policy_bfd",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_bfd/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_bfd/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d8e3ac7fb7082101ca2357634854a1ff6d4c55985a2b0678e41255c2a616518c",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_bfd/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_secondary_vip",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_secondary_vip/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_secondary_vip/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "315756f685e0511637fe2aa9059d2ead8bfecfd8757d44118e1df482552fd54d",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_hsrp_secondary_vip/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_epg_to_domain",
"ftype": "dir",
"chksum_type": null,
@@ -3791,7 +5156,7 @@
"name": "tests/integration/targets/aci_epg_to_domain/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2aa9a7c427ad9d6d2aeb1c9454537ec1df404ca85a1c0a2da43412816fe0d2ff",
+ "chksum_sha256": "e532d3cb3ba4bfd61a9743796bee3e77a7f8dba5432ca556eee75acd28e7d259",
"format": 1
},
{
@@ -3819,7 +5184,7 @@
"name": "tests/integration/targets/aci_dhcp_relay_provider/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3bcac5486e000d2c50ae9d748e6ac6870227c67671d6d43603f272f198adb317",
+ "chksum_sha256": "8ce53bdb5cb776c76480212771310300dfc3914a788b5f4e5dce7c1422c6be0b",
"format": 1
},
{
@@ -3847,7 +5212,7 @@
"name": "tests/integration/targets/aci_fabric_node_control/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be5b110f64ea6906839446cb0d79b30222fda3a9f4afb9da7cbb10bc75944898",
+ "chksum_sha256": "c59e43442f0f1a1ee20a22249c7719a051efb76b4cf8475aa6038021089d613d",
"format": 1
},
{
@@ -3875,7 +5240,7 @@
"name": "tests/integration/targets/aci_interface_policy_cdp/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4392aea7e298d85716756da20857a58467bbda2b4f92d1d711ed1b6fd368325c",
+ "chksum_sha256": "151d65b7a851eecaa7b3d3e57a8b3cb04900087f5104825a83d63a104d775a6a",
"format": 1
},
{
@@ -3903,7 +5268,7 @@
"name": "tests/integration/targets/aci_fabric_switch_block/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "423c915493cf75de78c63b152093ddf0066dfd04327a79384c753ddaf3c99ca6",
+ "chksum_sha256": "875c4f67b25a7e8f915926dd63b1ffc62c8b60e6a68245e9e3b4a44a4115854f",
"format": 1
},
{
@@ -3931,14 +5296,14 @@
"name": "tests/integration/targets/aci_tenant/tasks/httpapi_connection.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "af2e683ad88998f1ff8062ded1c66873ce24f38165afca72d36356e435e295b5",
+ "chksum_sha256": "374084c2e47bb24fb55ccd963f962ca99de7504897e53b6cfeb68ba75710f5b1",
"format": 1
},
{
"name": "tests/integration/targets/aci_tenant/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6a0620f26d77dee85bcf88b1bdc61aaadc57fd04daafaa6bd91cc8a0898ac507",
+ "chksum_sha256": "768148a4cfb5ac46096dae214c9301edbd62409cb29273417f1d7de9e4a9e79a",
"format": 1
},
{
@@ -4036,7 +5401,7 @@
"name": "tests/integration/targets/aci_maintenance_group_node/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b342a36b963e0b3001e11800be162c1faf958dc1bdfa552f32b928c516a532ed",
+ "chksum_sha256": "6c2130d1314c7e5258b0c06ae27a187d652eb0aa01a363ed46bb88180ce981d0",
"format": 1
},
{
@@ -4047,6 +5412,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_floating_svi_secondary_ip",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_secondary_ip/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_secondary_ip/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "073b1706685542287c18a0c471677deaf3b9e3dfccfec7904e09dfdce33fafe2",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_secondary_ip/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_syslog_group",
"ftype": "dir",
"chksum_type": null,
@@ -4064,7 +5457,7 @@
"name": "tests/integration/targets/aci_syslog_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b19762539379f2b450c6fa4619679431461b7820a2fd498c76164f476241726b",
+ "chksum_sha256": "6c8d18b7d1b934e886e32960bab072793cb8c9fb411a974b322940bdb47ec526",
"format": 1
},
{
@@ -4075,6 +5468,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_vrf_multicast",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_vrf_multicast/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_vrf_multicast/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c258a4ad5bac870a51363670ef44d922f17e3bc8f88571356799581a4b449bd6",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_vrf_multicast/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_route_control_profile",
"ftype": "dir",
"chksum_type": null,
@@ -4092,7 +5513,7 @@
"name": "tests/integration/targets/aci_route_control_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f5c0118b53e4cab847d81acd60edfba3e5f58a263aa32f980ccce6c9240a2f09",
+ "chksum_sha256": "4a9deefee3a9c978912c3fed74ab40f13a922f5b409c7ffc5c8cdca6468a488f",
"format": 1
},
{
@@ -4120,7 +5541,7 @@
"name": "tests/integration/targets/aci_snmp_client/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6aeebb21b6c1e350325f298e3cd1d98615dc2a5d12916783b06c259fccd0357",
+ "chksum_sha256": "8319763fc884a440954ec4ccebe9ee9250e6273ea234f8fb664d8886cc2b74e7",
"format": 1
},
{
@@ -4148,7 +5569,7 @@
"name": "tests/integration/targets/aci_aep/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e77d10440880f6638ea10d90eb11baf49ad2c213760740ae224fb7582ce5410f",
+ "chksum_sha256": "2b7837cc64a41aee8dc2ec18b18dee00bca0a01508cc459c420554f4351744a6",
"format": 1
},
{
@@ -4176,7 +5597,7 @@
"name": "tests/integration/targets/aci_l3out_logical_interface_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5a87867498dd6a864410a35eb31e8d8db264675bf15a3935f583efa16f563b56",
+ "chksum_sha256": "2a25546b4e0f4e0d6fd51a29e2f410c19503f531263681cfcd2e00f72bedca4a",
"format": 1
},
{
@@ -4187,6 +5608,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_qos_dscp_class",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_dscp_class/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_dscp_class/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3cfe7421f7078e9e86be3cddeb6208d86143879fac9600252cfd2046ab643df3",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_dscp_class/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_key_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_key_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_key_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c33960701dd547ddb2b87f3e29c441eb080f99cbf1b4594a8631c06b24f0cab5",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_key_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_interface_policy_link_level",
"ftype": "dir",
"chksum_type": null,
@@ -4204,7 +5681,7 @@
"name": "tests/integration/targets/aci_interface_policy_link_level/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "760f5c21dc389db02d3e809c5761fa869934dfd6867fbbcdf11fcbe511a9c931",
+ "chksum_sha256": "2e4dfc8c97a7056dd048fe03ac4f32e085b6660d1cfe5a6d8c02a72742824a84",
"format": 1
},
{
@@ -4215,6 +5692,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_interface_policy_storm_control",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_storm_control/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_storm_control/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d8ba82d7c2ebfc91a4d467faf3e26e54f15bea00a562fe91216b0cea1b12804f",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_storm_control/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_l3out_extsubnet",
"ftype": "dir",
"chksum_type": null,
@@ -4232,7 +5737,7 @@
"name": "tests/integration/targets/aci_l3out_extsubnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff51702c2b61e04d0852925417f2632ca2ad77476c87fbc3e3bf26e841fb9b40",
+ "chksum_sha256": "23e36fefcac51193152a60816eef04e25f51414c89ee8e0a777e5021b8811295",
"format": 1
},
{
@@ -4260,7 +5765,7 @@
"name": "tests/integration/targets/aci_l2out/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ac1d2a1e71906e0bcf422d680dd720508431daae4c1717c57834105e79a3aef4",
+ "chksum_sha256": "a5b42d2c95354d21b03b1c93d0ca9ae8420ab88925e83fa5e41de036bdc42360",
"format": 1
},
{
@@ -4271,6 +5776,83 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_access_spine_switch_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_switch_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_switch_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "190c8a814cf28931d1fa51f1a522a54ff25768311f41e344ff9fee69594f1261",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_switch_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c6c6776f7831d40b5522ac88a481d61c38c7f5a323d9f80f762847f0601c729e",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access/pki",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access/pki/admin.crt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f97928b2cd1ce43cfe9ae9bbf47a40b858a749c4c3f25a7ec02898611f4fee90",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_management_access/pki/admin.key",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "947c1b5a6c419641d4b2c8492b91f2d71588958666aeceeffb1f878460b1d256",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_interface_policy_port_channel",
"ftype": "dir",
"chksum_type": null,
@@ -4288,7 +5870,7 @@
"name": "tests/integration/targets/aci_interface_policy_port_channel/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dd6ca5c9bc1c622ad186c3081434eb5d82f61d82e756e9a7731fbe39a85a1c26",
+ "chksum_sha256": "5d15555a235b9bce54b5a236b904fd2abc03d7c77a5676a78b133701747294a3",
"format": 1
},
{
@@ -4316,7 +5898,7 @@
"name": "tests/integration/targets/aci_match_community_regex_term/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a317a7798696e01a0bbcea910360a73b59f03c9fcf0946a8f0e1566daaa222cb",
+ "chksum_sha256": "816f883819fca9605b5d08fbec656564a659d6dae12519f744a1f38e1733ab1f",
"format": 1
},
{
@@ -4344,7 +5926,7 @@
"name": "tests/integration/targets/aci_snmp_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "14124ae8544f77657abd5db831e7226aaf9b752363d4751ba05943ca8fc9c1ec",
+ "chksum_sha256": "924e49b0662472fe0e67ab72404819c5e00523f51b37715f28a805cce6b2a850",
"format": 1
},
{
@@ -4372,7 +5954,7 @@
"name": "tests/integration/targets/aci_fabric_pod_policy_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb70c203bf4447030ac385ca1f63408f7cb2bba098a457badaa46ad73907101d",
+ "chksum_sha256": "a34f5d541f3fa84f488c3fae897cffd7e1352728a4807fa86557cd326e4d8a7f",
"format": 1
},
{
@@ -4400,7 +5982,7 @@
"name": "tests/integration/targets/aci_ntp_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7c1c21fd27b102bebe4468763f63901b5c66ba04ebbd3dd1fc4f030ab2a46d8",
+ "chksum_sha256": "f120f96885c5c81468280e9eb51a4d2b03ece33638eb1f42519861aba2218383",
"format": 1
},
{
@@ -4428,42 +6010,42 @@
"name": "tests/integration/targets/aci_domain/tasks/vmm-vmware.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "068ef4d1d8671df9f8ba54f51483cb29a08a42adcd5227ae345b0c87bce5e5b8",
+ "chksum_sha256": "6aabcd7a0fa4ef86f4b4c5c68364d8a30e707f34a42e97ead2a2de68d10beb45",
"format": 1
},
{
"name": "tests/integration/targets/aci_domain/tasks/l2dom.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04dbec0678323daf3a87d3170ff98a41a8d38a5db26e8772f7d36e406a9d4483",
+ "chksum_sha256": "29ec89ad1eba9d7ffafe36e5488d2a4533ad529cfa813093416fedd3826dd06a",
"format": 1
},
{
"name": "tests/integration/targets/aci_domain/tasks/fc.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c04c71cae5fcd512f2e5203c57129582bf1f0b55c74a9dcd4c57dcdc8856fc7a",
+ "chksum_sha256": "e8c8bc20d452d9b3209ac08186558f5dece49357afe9a609734aebae7f2e1fe7",
"format": 1
},
{
"name": "tests/integration/targets/aci_domain/tasks/phys.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "36fae3df4197ffba49ff83256a05c2c952247e974a052c94d3882dc693cdc80a",
+ "chksum_sha256": "adf84c74f9c21856cf21f498b7c905652911b00c7016733b2b49f4a13ff93a15",
"format": 1
},
{
"name": "tests/integration/targets/aci_domain/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8094a133d927bf97b43ccdc714c7b8b962af676a11e616f205f21e605f27f1e9",
+ "chksum_sha256": "38a72f6c96f2b5bd47da5764a219da47054b0814d0944001539679311a9d3758",
"format": 1
},
{
"name": "tests/integration/targets/aci_domain/tasks/l3dom.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28068851b310e83f51c3d025c5cddf8fb4acc6466ed5873cfa47279140d655d5",
+ "chksum_sha256": "567c158639220dfb536539f8f2175fd0c2af80036285c5e9bd31a9c6ad2530e9",
"format": 1
},
{
@@ -4474,6 +6056,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5b0ae646f216ff9c163d4fad30f2c4fef221738b8f9b12946dda962ae7b8d44f",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_l2out_logical_interface_path",
"ftype": "dir",
"chksum_type": null,
@@ -4491,7 +6101,7 @@
"name": "tests/integration/targets/aci_l2out_logical_interface_path/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1165e2174890eb8cb16b1404bb45f4e8f5d8ef28cf70e482ef1ff2406644a38c",
+ "chksum_sha256": "d6c73e292a940421447e8428d9f80684516667ea75a511d3f1556487cd266fb6",
"format": 1
},
{
@@ -4519,7 +6129,7 @@
"name": "tests/integration/targets/aci_l2out_logical_interface_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b14eacd51921ac498aaff06bce4e881310cbcdbd8498f3b89a493ce4c9a198e1",
+ "chksum_sha256": "2cc00f299f8ea22792ca39143101fd8e7bed11cb289d6fc0efdd352100872b8b",
"format": 1
},
{
@@ -4547,7 +6157,7 @@
"name": "tests/integration/targets/aci_l3out_extepg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e3cc46789ecac2e9636478d437fac86b9006cc9f2ed504961fe2f0e110e1c69d",
+ "chksum_sha256": "c836365750e7a249888a36db8674bb739727dc37aec16cdfd25f55d0a90e916e",
"format": 1
},
{
@@ -4575,7 +6185,7 @@
"name": "tests/integration/targets/aci_aaa_custom_privilege/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "87e9446b4626d0ef82702c19eae28f33bac7ec595b4bea916317b7938ef1964f",
+ "chksum_sha256": "9baf4665c6e36079e351b72403afb38fd7cd55b82d6a8d421be615bfbcede9e1",
"format": 1
},
{
@@ -4603,7 +6213,7 @@
"name": "tests/integration/targets/aci_fabric_scheduler/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "704b7c6e84833030f155e856359f86d7166319df9f4595a463c2662ad048218d",
+ "chksum_sha256": "dbb8e5f043a9f5dee464af5ac5dabab28801bf0b87845d2923b988925dbea1fd",
"format": 1
},
{
@@ -4631,7 +6241,7 @@
"name": "tests/integration/targets/aci_fabric_span_src_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8b252a0ada511e83d47a0b183a5aa1bb06a30296081f84cb99af94e26077d70e",
+ "chksum_sha256": "1349d691b2fe6da11dd0a944676e957265253af30d5c87af537934ed86b5a770",
"format": 1
},
{
@@ -4659,7 +6269,7 @@
"name": "tests/integration/targets/aci_firmware_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f2fd0c9c021e33ae4d4fec5ce9ffce4128b16c2d8ca1b67595954a50f59694db",
+ "chksum_sha256": "baff773fe422ff7682c90ffc9464dcab4d4cbd96fc264934a9b9fac31efaa425",
"format": 1
},
{
@@ -4687,7 +6297,7 @@
"name": "tests/integration/targets/aci_epg_to_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6938a58d3e50e6dd47797f38b2d79024e680245d4fd40872b9732813c123b7d6",
+ "chksum_sha256": "b4c20198391e11c0ea0b8bdea508d71f9f947ed99bb6c920b29aa8eb1e99a07d",
"format": 1
},
{
@@ -4715,7 +6325,7 @@
"name": "tests/integration/targets/aci_interface_policy_leaf_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b6457997e6b2e8e018cfa0bebfe2028134acfd44522c7e222a3ffb7910219e3",
+ "chksum_sha256": "fffdbacbdff26e734a2a5e76421e7190bc469d5d30e4fa5faacf788dd51647f7",
"format": 1
},
{
@@ -4743,7 +6353,7 @@
"name": "tests/integration/targets/aci_bd_to_l3out/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ae0c2f1524cebfd9d304242f67006adfcf029fe89ba8376ad1f27e53305d37de",
+ "chksum_sha256": "5ec695e014db0f6c557988a54ce858da4e8bf30cbce5b8bafe3888ff3046fe4f",
"format": 1
},
{
@@ -4754,6 +6364,55 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_aaa_key_ring",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_key_ring/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_key_ring/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "96483c17928f4da918cea3324f23ecb083eaf820af2d4c0748e334ed42340c93",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_key_ring/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_key_ring/pki",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_key_ring/pki/admin.crt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f97928b2cd1ce43cfe9ae9bbf47a40b858a749c4c3f25a7ec02898611f4fee90",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_key_ring/pki/admin.key",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "947c1b5a6c419641d4b2c8492b91f2d71588958666aeceeffb1f878460b1d256",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_fabric_span_dst_group",
"ftype": "dir",
"chksum_type": null,
@@ -4771,7 +6430,7 @@
"name": "tests/integration/targets/aci_fabric_span_dst_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "89f09f54b34b4070853e81358c3bfc5afcac772fec7c242cb6f4712960118340",
+ "chksum_sha256": "01015ad80e8bffebdc43dbbe5c3d7dea2a8d3e72a443f1b40b322048d1640608",
"format": 1
},
{
@@ -4799,7 +6458,7 @@
"name": "tests/integration/targets/aci_bgp_best_path_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd01f327bd89e5f470bd0b9fc80e2a0246c42a9fd91de72285f6bca6aee14b85",
+ "chksum_sha256": "4869d34c6a9ec2f31b1a9e2992fd0c7ff2db1b05fe820e47be8a7f51bb3e574c",
"format": 1
},
{
@@ -4827,7 +6486,7 @@
"name": "tests/integration/targets/aci_fabric_node/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "11155626d26d8df736b01f6b694e7724cfb3edf8a1690474e77deda7bdbc0c1f",
+ "chksum_sha256": "312722a6556b1633da341e02bb311cda8fdd4774085b2bb886dc7ed892cd80fc",
"format": 1
},
{
@@ -4838,6 +6497,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_epg_useg_attribute_block_statement",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_epg_useg_attribute_block_statement/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_epg_useg_attribute_block_statement/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1b3e8a671dda2ec261dbc4084d65ff05654f61c79970a944fdf2f4760a312860",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_epg_useg_attribute_block_statement/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_aep_to_domain",
"ftype": "dir",
"chksum_type": null,
@@ -4855,7 +6542,7 @@
"name": "tests/integration/targets/aci_aep_to_domain/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "52a218b485aa23a4981d67fbbf2c7e7dd9c344f16e5fc19904f839f1f2d22dc2",
+ "chksum_sha256": "ef617648cf3b092fa334cb5b9a1cab0ed9b086b86598304306e33ec576ac0664",
"format": 1
},
{
@@ -4883,7 +6570,7 @@
"name": "tests/integration/targets/aci_dns_domain/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5942d788bbbef1eacb07ff15c38c50de8c3f2f7dc6e80edd5efebcc193c1e1c4",
+ "chksum_sha256": "d7d7eab519cd4192a61605b934bb4c813872671117802804effd3732fd11531a",
"format": 1
},
{
@@ -4918,7 +6605,7 @@
"name": "tests/integration/targets/aci_encap_pool_range/tasks/vlan.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "345dbde8c63f84017b7eb34c35f034e9743ca0f185eddd3f7949671295488150",
+ "chksum_sha256": "194dffc2cabbf408c5039de01f0f01f0b5419538e6fde4b3d3e564d42ec8e5dd",
"format": 1
},
{
@@ -4932,7 +6619,7 @@
"name": "tests/integration/targets/aci_encap_pool_range/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cade19307a5a902a3c840480d82e00ffd71173f3ca0ba5ba59d5c74cd8864085",
+ "chksum_sha256": "0018ba019fdc1fbff1df694d0a1e190b58b73682a8c63c93ac5143d0e2018f48",
"format": 1
},
{
@@ -4960,7 +6647,7 @@
"name": "tests/integration/targets/aci_aep_to_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a1e627a67befe9cc0f6faa1de4d1379e5ebde380bc124e285d153a7b5e7cae74",
+ "chksum_sha256": "da9bc3dc1d400e410025b424cd743b07e0cb4626de5372b2d495ddc702e1631d",
"format": 1
},
{
@@ -4988,7 +6675,7 @@
"name": "tests/integration/targets/aci_contract_export/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "194beab695bfb110bce199c3815786ae800384b41469a8dcb64bb724a5d34596",
+ "chksum_sha256": "9218e7b208662c098c4ebae5c850aa48872bb16daeed28d1d18895c8df68049f",
"format": 1
},
{
@@ -4999,6 +6686,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_dhcp_option",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_dhcp_option/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_dhcp_option/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "58c3b602a17925f8950bcda6c8244d12af1a72ddce3dd5f61b83ae32c4093994",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_dhcp_option/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_tenant_ep_retention_policy",
"ftype": "dir",
"chksum_type": null,
@@ -5016,7 +6731,7 @@
"name": "tests/integration/targets/aci_tenant_ep_retention_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "843240370cdf77e385f381e5046df7655f88a4eb9843237c37b1d2b7339fd25e",
+ "chksum_sha256": "0e296f21257f52e78b0a77f0b832de6ebf7dadcaadc78c66d7ca322e146b286d",
"format": 1
},
{
@@ -5044,7 +6759,7 @@
"name": "tests/integration/targets/aci_interface_policy_ospf/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b9ba9779d76f78bb5e11c9486b65c3153fecae854844ff74734ffff8233002b",
+ "chksum_sha256": "27505847c69378b6d211c17fdee3a50f1057277c4eff07938949b3a264eadac3",
"format": 1
},
{
@@ -5055,6 +6770,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_fabric_pod_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "23809735df7d7fe9bba12a715c73f150afca71eb6ed0f0eb7de21d90734eef1f",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_tenant_span_src_group_to_dst_group",
"ftype": "dir",
"chksum_type": null,
@@ -5072,7 +6815,7 @@
"name": "tests/integration/targets/aci_tenant_span_src_group_to_dst_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74533cc1bb596adff756c3a691a9445e1f5c96655e6544426cd0e02e524207ac",
+ "chksum_sha256": "0f3e66721b1b44eec6526d09c3b4eac25012d866b3b91876d96c8bdf17314e38",
"format": 1
},
{
@@ -5083,6 +6826,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_qos_dot1p_class",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_dot1p_class/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_dot1p_class/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d0c72b681c2d1e8907202f51dab724b455d84cf449fe3ddf8a06b12668650c9f",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_dot1p_class/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_fabric_leaf_profile",
"ftype": "dir",
"chksum_type": null,
@@ -5100,7 +6871,7 @@
"name": "tests/integration/targets/aci_fabric_leaf_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f41af177548f2ec1a66e496a62bc8fbe1e48098e48a20efd6f4fd27572722298",
+ "chksum_sha256": "0f6034365b07c13b284182fc8630c472055da2610e1d2b45959f4da55315acd0",
"format": 1
},
{
@@ -5128,7 +6899,7 @@
"name": "tests/integration/targets/aci_dhcp_relay/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "773df8a3cfbfbaf68a2c5de6619e9bf1ce6026d7f45b2e45c0025c4dd9ad6d1f",
+ "chksum_sha256": "ef953d743a99f4d89d3f095aa890c946aabc18555658b6c58dc29ebe19e8598a",
"format": 1
},
{
@@ -5156,7 +6927,7 @@
"name": "tests/integration/targets/aci_esg_epg_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "37aaf2c1c23852f9bcf49957b45617ba513ed8218a3a7be31ee5f425bfd4cec6",
+ "chksum_sha256": "e983ab11ab93391be56423cb95cc3dd5a5f15af14d643c2f5444b63d8c038a61",
"format": 1
},
{
@@ -5184,7 +6955,7 @@
"name": "tests/integration/targets/aci_cloud_provider/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1b78c7fd6417e2c36752f6971e733888d0ac8386a10333ea1070bae55695fd2",
+ "chksum_sha256": "2f68d8433cc59f8a13c5d3ac288654986ee1f988b7266667aa9d1e5166cd462b",
"format": 1
},
{
@@ -5212,7 +6983,7 @@
"name": "tests/integration/targets/aci_l3out_bgp_peer/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b58713b299f63cbc303b82df604713e8c1cf2702ed61b5b178461fad4c36e190",
+ "chksum_sha256": "59fe840ce233545a7a3565066949c258e4bab20372ccf9d6ccf0afc6a859c5fd",
"format": 1
},
{
@@ -5240,7 +7011,7 @@
"name": "tests/integration/targets/aci_esg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1caf56ec2b7f2e62fe63f79d6e2d0245b7013c18435a4614e88755423a16567e",
+ "chksum_sha256": "fe8d3096f7c246f57362d15eca011da984636a020c2078c2f11e78233797fdf2",
"format": 1
},
{
@@ -5268,7 +7039,7 @@
"name": "tests/integration/targets/aci_bgp_rr_node/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ca6e2261d1df22ddd407932d30f07f324d995264a5f5b198a11a4f5dff9b9c63",
+ "chksum_sha256": "67668eb013645c8804596c2e49b7da0475b0ef8387afe3fc3892b42d3694c947",
"format": 1
},
{
@@ -5296,7 +7067,7 @@
"name": "tests/integration/targets/aci_aaa_domain/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f70ba67fedbe15cdcd8d967d90ff9a188436898f610fb427a9ef312c5460c0f5",
+ "chksum_sha256": "6957a06dbf27ff890df7e769895f53ab731eabe43b4d70f59d299db3be09391b",
"format": 1
},
{
@@ -5307,6 +7078,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_eigrp_interface_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_eigrp_interface_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_eigrp_interface_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "cfa446df78e06fa818f43f0e123b395d90c91dfca4b5d2953a98273ce21a9954",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_eigrp_interface_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_file_remote_path",
"ftype": "dir",
"chksum_type": null,
@@ -5324,7 +7123,7 @@
"name": "tests/integration/targets/aci_file_remote_path/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be86a485a2200db58a988ec0095acb483fbc9d7710ff026c96d9ef780cb2fc5b",
+ "chksum_sha256": "fd5329b2fe47a12cd6b500a0275628e0fa48efacddf8a7fe0b61b4ef9bf58efc",
"format": 1
},
{
@@ -5366,7 +7165,7 @@
"name": "tests/integration/targets/aci_aaa_user/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0a27716e570cda199712f2864aa28f6845cda283992a047be6e435d739c30ce0",
+ "chksum_sha256": "e5e0db5d28a70fb4d52e137fe34fa991f737c2c12c575591544c4ecdbfb4dc04",
"format": 1
},
{
@@ -5394,7 +7193,7 @@
"name": "tests/integration/targets/aci_epg_to_contract_master/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6072b9a2c06b9f3dada60cf3b523afec718985b00c2df0279f4e05d4ecc5432e",
+ "chksum_sha256": "08fb777a7d079af0d1c0eb643663d7665c95306d1446e6d78363707ac3a91113",
"format": 1
},
{
@@ -5422,7 +7221,7 @@
"name": "tests/integration/targets/aci_cloud_external_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc04416ef5a6af8c60f0aac74936413174b083df60b44b9a0fd9791d687c24e5",
+ "chksum_sha256": "da9bd98cd5fea7a9d6a76f97d9ae25672e99b41ce724772f1416c76e9d4dab82",
"format": 1
},
{
@@ -5433,6 +7232,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_keychain_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_keychain_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_keychain_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1b29eb0c2070e1985696d8d10e54ca601f191c9bd13e4a11f78763adf88307fb",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_keychain_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_firmware_policy",
"ftype": "dir",
"chksum_type": null,
@@ -5450,7 +7277,7 @@
"name": "tests/integration/targets/aci_firmware_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cffeb0a042ff0bba5cceabcf4ddbf8a233ebba5620ae52ed5ea38bb392532cda",
+ "chksum_sha256": "97ffa299416e48106e1431b8a80ebbea3eeed0686cd575325904e166968ca291",
"format": 1
},
{
@@ -5478,7 +7305,7 @@
"name": "tests/integration/targets/aci_cloud_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a8f69aafc42231d6fcbb8e12c3e233c4d5f197b36133a53e8044cb4e80544111",
+ "chksum_sha256": "f6533302e08342b9dad6391562828ecc98b02e63ee29d65b1f0e3481a74db713",
"format": 1
},
{
@@ -5506,7 +7333,7 @@
"name": "tests/integration/targets/aci_vrf/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8e835d03f2b31ef9aab370d7fca0b89b821069d50d7917aac1ab757d19acb09",
+ "chksum_sha256": "440e5baec2b38bc0940223c14b5e9fe8d42d391263f235b2e7df366c7ad0cac2",
"format": 1
},
{
@@ -5534,7 +7361,7 @@
"name": "tests/integration/targets/aci_filter/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b390892db7b692a7a98a480bc46de220a682a0f929ec268d1861a63cc11e870",
+ "chksum_sha256": "b1325b621500ac3780cc4932d57525ad50ebdabd8021eb82b2bc794a009f5fe8",
"format": 1
},
{
@@ -5562,7 +7389,7 @@
"name": "tests/integration/targets/aci_l3out_interface/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d4d9c101d09159d2b36a82c35f8fbccbdc87a4f40651964eaa2b38e37696ee05",
+ "chksum_sha256": "a1f06a4e765dd38a0c5200098f40dc8822e1017ec9522674be2cae300a4ce746",
"format": 1
},
{
@@ -5590,7 +7417,7 @@
"name": "tests/integration/targets/aci_tenant_span_dst_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff4eb055593d4fff6ee7b8a530e750ec83e6bef96f7e30b01debdfc10a45a11b",
+ "chksum_sha256": "813febdbdf77a5cf80cae3cd76dc7ffd52b549a94870d439398c002a61d5c98e",
"format": 1
},
{
@@ -5618,7 +7445,7 @@
"name": "tests/integration/targets/aci_l3out_logical_interface_profile_ospf_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "32b2fb5e9f361fc21865ef39c0ce3e989de8cad67c902bbe9f776e041f743f17",
+ "chksum_sha256": "9ed24f55a9eab4d00c8ac950a45c0fe36425fcaa041f346087f91565c787b7d4",
"format": 1
},
{
@@ -5646,7 +7473,7 @@
"name": "tests/integration/targets/aci_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67a517482b4a33dcab9d8bd8e4554e267418005c62a16f769382b58322395f25",
+ "chksum_sha256": "7090d0c8c60de535e912349131843b0b242409ea8ddf02306e9ada7517bbd190",
"format": 1
},
{
@@ -5674,7 +7501,7 @@
"name": "tests/integration/targets/aci_cloud_bgp_asn/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8cca30820ec8be49ca48b9dc4ce95ed9de8e963abe364b9e5c7a6efa3e1ecc23",
+ "chksum_sha256": "ef83e2ea2fc6e2f8b16098634b11aaa0f6584ffe2e580e51063eafabf767b792",
"format": 1
},
{
@@ -5685,6 +7512,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_fabric_external_routing_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_external_routing_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_external_routing_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "773ccf7db7e09cbaf3c76e92ae057c969ecb48e332510c4f7e6d169c970b27d7",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_external_routing_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_fabric_span_src_group_src_path",
"ftype": "dir",
"chksum_type": null,
@@ -5702,7 +7557,7 @@
"name": "tests/integration/targets/aci_fabric_span_src_group_src_path/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "36d0fe1f44db748661297e8588d6311dded74f304e8c43e1575ae67e31309031",
+ "chksum_sha256": "c45de6f0f5ba988c452296375b81d51d2b2afc549b3af9fd8fe201e984d204bd",
"format": 1
},
{
@@ -5730,7 +7585,7 @@
"name": "tests/integration/targets/aci_fabric_span_src_group_src/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7376aad0adce8582bb048f45bb6999bef5e4c0bd92b879ca9818b3a34af60596",
+ "chksum_sha256": "11d0d775fa82a716293db5881ef1a37c57f6e2a964dfeb687af2679560e4bade",
"format": 1
},
{
@@ -5758,7 +7613,7 @@
"name": "tests/integration/targets/aci_tenant_span_src_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "50933aa768540483691d9a20c4c1a15aa1d8af1f46513544d747f73abb84bcca",
+ "chksum_sha256": "7867b37ef567e6e844044a69229948b32007f26f9764787e8e8c5d36db630ce7",
"format": 1
},
{
@@ -5786,7 +7641,7 @@
"name": "tests/integration/targets/aci_config_export_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aa4ba50ca5446ff9d640b396c474dde2f5e0feb65eecb9e91db4aeb4d1eadd38",
+ "chksum_sha256": "c6d87fc399a3e571a7bf452696d3070b88b7020f08b3bd95e923bfae4009f38b",
"format": 1
},
{
@@ -5814,7 +7669,7 @@
"name": "tests/integration/targets/aci_cloud_epg_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8b04b64f325492a0dd9e7c31568ffe2214b81f289ce9a96557d7ec4272fb592",
+ "chksum_sha256": "8d57d82be914fa88e07bc41d7bb244e02734ed6aac76a92bfc10977d5e69c33c",
"format": 1
},
{
@@ -5842,7 +7697,7 @@
"name": "tests/integration/targets/aci_epg_to_contract_interface/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "05e64f0bd49cf86a4f884c5816b2061d3bc79734d4c5549c084200777ce08579",
+ "chksum_sha256": "1c312538c0a8394a8aeb46f742e8d42a78f7e21eb7eb45baac278ea65357dea1",
"format": 1
},
{
@@ -5870,7 +7725,7 @@
"name": "tests/integration/targets/aci_system_endpoint_controls/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d38cac5f1adb2065455a24ba14eeb63e9798c2d7beb71ec609b7aa2c24a57ed6",
+ "chksum_sha256": "5607830b2d7127241067d32fde8ad7074d75750f37b8fdd49ace1d8647d791e5",
"format": 1
},
{
@@ -5898,7 +7753,7 @@
"name": "tests/integration/targets/aci_l3out_interface_secondary_ip/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f0f185cc60c0b1d032084324e53847b3c3dddd21b4a3cb03db5883490a764e0c",
+ "chksum_sha256": "2afa0e99471843228a5cf1a7459c2fc764b647318621416d6af001e72f31eb20",
"format": 1
},
{
@@ -5926,7 +7781,7 @@
"name": "tests/integration/targets/aci_static_binding_to_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c12648b939c15bfbd8a35c6483db89011dbccd407961c4d41215ca270a71971",
+ "chksum_sha256": "48503f32dc4d09af6a416cb2697c5d1e50e86df3ef869cdabd889efb91d80444",
"format": 1
},
{
@@ -5937,6 +7792,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e939e6263c6afc549ceaba38d1c3885bebd2e13f3fc6e82cc524dcab8848fc72",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi_path/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_vmm_uplink",
"ftype": "dir",
"chksum_type": null,
@@ -5954,7 +7837,7 @@
"name": "tests/integration/targets/aci_vmm_uplink/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "35981a27594dc20c90e735f385654aff3bd3be4a968645356b9edc96a24bfa19",
+ "chksum_sha256": "e68d4a1637bd4faec127d03539b84dcf8df2cd4f04f4d2ee54a8e6ee3f79e486",
"format": 1
},
{
@@ -5982,7 +7865,7 @@
"name": "tests/integration/targets/aci_firmware_group_node/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c3e4f4978c8f104052bd17ebd014e836998899f4f807661656accefbf40e19fc",
+ "chksum_sha256": "91e40267ec7fcf8abd83cccda6005ac1cd79563ad8294a7a3424ada8cd4d1de7",
"format": 1
},
{
@@ -6010,7 +7893,7 @@
"name": "tests/integration/targets/aci_bgp_timers_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e1e28cfb914f228702667f03f8a265f9b869f13e6766c767a90e8edb0166762b",
+ "chksum_sha256": "6f414d5bdd980d5bc0683477eccf0068024b2840faa09cd22756ae6ffef09866",
"format": 1
},
{
@@ -6038,7 +7921,7 @@
"name": "tests/integration/targets/aci_access_span_filter_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f670f47ac966f70d906c6b18d446b8e45984dd6e504d3b64bd480b5b28fccda9",
+ "chksum_sha256": "6dd4fd944b408971bfdb832ca9ddca613c84215afd429a31fc0f6a3942b67e8c",
"format": 1
},
{
@@ -6066,7 +7949,7 @@
"name": "tests/integration/targets/aci_l2out_extepg_to_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "298360f809920f82f95eee117e53bfb6046d844d36f443e1d4e666cde742fbde",
+ "chksum_sha256": "8412f7fab3416a00fde4db461cfef7664d415505f3f5226ba65b6b6b2a0e2830",
"format": 1
},
{
@@ -6094,7 +7977,7 @@
"name": "tests/integration/targets/aci_system_global_aes_passphrase_encryption/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ae783a7828434afa0de8e616e3e9ecfe84317763a28203beeba2aff1b63bcd55",
+ "chksum_sha256": "899d51d6e65dade49ddda996d828b8c246c4aa847400460253c7ee240a912f94",
"format": 1
},
{
@@ -6122,7 +8005,7 @@
"name": "tests/integration/targets/aci_aaa_user_certificate/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de23c78bd0da077a2e5259699d1c861ca6c9ed0b161398c068c74fc95e31d59c",
+ "chksum_sha256": "199c9a55602b3f78f352c659379e413b9c4578ee27e82fc8b61bc1f870c2b6d5",
"format": 1
},
{
@@ -6206,7 +8089,7 @@
"name": "tests/integration/targets/aci_cloud_ctx_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c3244f45def81cbee17c3643e20b46e448c6740ff821bf0d37d2e8877d464c8a",
+ "chksum_sha256": "30aa6efad91c5732bce45da24f742a50dfc29ed56c7354dcd1dd3eac347c3784",
"format": 1
},
{
@@ -6234,7 +8117,7 @@
"name": "tests/integration/targets/aci_tenant_action_rule_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a81f5e051113d70e75f90145d1d81cd6444922e3d38b0131d1e6601f7816dbd",
+ "chksum_sha256": "d404d98736d155e056fe35c47c91e155e160324994e69a6f555ec8705f34e2d1",
"format": 1
},
{
@@ -6262,7 +8145,7 @@
"name": "tests/integration/targets/aci_aaa_user_role/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "56d48ff0dec763a6c52d2d1f7e8c1fbf495e366ca4979d29b9c1178d3d135735",
+ "chksum_sha256": "3a5db07a207f6b1d4dea828953eccffde4a61d9c02064af4db569867b918f553",
"format": 1
},
{
@@ -6273,6 +8156,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_bfd_multihop_node_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bfd_multihop_node_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bfd_multihop_node_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d008e5ceb983a17bb32d6788349c2e915a973edd2d4eb87e4cbb9f7da2b13aed",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bfd_multihop_node_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_bgp_rr_asn",
"ftype": "dir",
"chksum_type": null,
@@ -6290,7 +8201,7 @@
"name": "tests/integration/targets/aci_bgp_rr_asn/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d91c2f2511cc599bfec0aad23925038f00045fe03ce492af6ab1b2bec2bed73f",
+ "chksum_sha256": "664c54c3392957c332451d9a1183860fa2e606c9892beb918d65f9e195dbb612",
"format": 1
},
{
@@ -6318,7 +8229,7 @@
"name": "tests/integration/targets/aci_contract_subject/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f545c12b34c65b8f84356ddf1ac88a8038a6b9010d32567eef65976c86001096",
+ "chksum_sha256": "b2e2ef790915f6b82210707684804b4b87ea0a7231906446fed594e5539763d3",
"format": 1
},
{
@@ -6346,7 +8257,7 @@
"name": "tests/integration/targets/aci_l2out_extepg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5132135607c61b28d1b345e749441939fc7673970a1fe788692840bedd383a66",
+ "chksum_sha256": "9a64487a93a84b5d75b09d109eb24358a1b36ac88ead16a2dd9d083c7ea932a6",
"format": 1
},
{
@@ -6357,6 +8268,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_bgp_address_family_context_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_address_family_context_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_address_family_context_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ec5d52ebe05821de9002324ce8868d780c2d8e67f1a364439113771225d44120",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_address_family_context_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_l3out_static_routes",
"ftype": "dir",
"chksum_type": null,
@@ -6374,7 +8313,7 @@
"name": "tests/integration/targets/aci_l3out_static_routes/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4b42b52c3a3a19c551fc82081e676952c8a08e778a9c3fdd3e4dc4a508e458c1",
+ "chksum_sha256": "cb6d8cf3197e1a320d278c77ee62e6e273a89d3cec7f1c4492dc46bc13952ff0",
"format": 1
},
{
@@ -6402,7 +8341,7 @@
"name": "tests/integration/targets/aci_cloud_zone/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b06e53f5f18332fe1f6c2e00cb62c1d78ae10851aea950be32a945e28cad72a4",
+ "chksum_sha256": "6c157a960cbb53511ca4b65c8c15c8ba14a9ac55dfe374195e4216ff24a91d44",
"format": 1
},
{
@@ -6430,7 +8369,7 @@
"name": "tests/integration/targets/aci_switch_leaf_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "522658a23ac16892e9e82fc69f7b4afd930e26dfc02ad82b3e93c95d0181461a",
+ "chksum_sha256": "2d806125c2e70e3fdd5cb182de4560a4dfb097aacd506d2de6c7337069672ab0",
"format": 1
},
{
@@ -6458,7 +8397,7 @@
"name": "tests/integration/targets/aci_aaa_user_domain/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2ab7a16b4d545e99c973b926d28fb765c480cd3e21587a129d29ba18a9c1255",
+ "chksum_sha256": "ae53b1118c33169250cd58a3414485bf90bcbce33fd322a93e91a63dd8a36205",
"format": 1
},
{
@@ -6469,6 +8408,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_bfd_interface_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_bfd_interface_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_bfd_interface_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "fcaba6dbbd06bc810cf1a384017a895c0b4182cf60d20dfde9dc9fcab27859ac",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_bfd_interface_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_fabric_spine_profile",
"ftype": "dir",
"chksum_type": null,
@@ -6486,7 +8453,7 @@
"name": "tests/integration/targets/aci_fabric_spine_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8c7831e91043717924a30d223bdf42efd52198261270595dc1cd0e3b3a4d4d5f",
+ "chksum_sha256": "c6f9c12ac6b7d9eb27202617560fa2c7f6de2b246e3e5bf0d2afa3d20af23ff4",
"format": 1
},
{
@@ -6497,6 +8464,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_fabric_pod_connectivity_profile",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_connectivity_profile/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_connectivity_profile/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "91495c491ee2f353f10948002561caa645366aa118d0a3c4bd8fed1855287b91",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_connectivity_profile/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_l3out_logical_node",
"ftype": "dir",
"chksum_type": null,
@@ -6514,7 +8509,7 @@
"name": "tests/integration/targets/aci_l3out_logical_node/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4607bdbef2f2b481fe393e457c18ba02c78af0b6d16f1d53c84e69c0057d30d0",
+ "chksum_sha256": "914550f2ff9cdabdce76de3706f87f5a13f48b223742d5fbba78728f21d3b1ee",
"format": 1
},
{
@@ -6525,6 +8520,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_action_rule_set_as_path_asn",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_set_as_path_asn/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_set_as_path_asn/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7ae345cd77046a57a7f8e630459ab04b6252c60104548db9854fd3963fdcbd1d",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_action_rule_set_as_path_asn/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_filter_listify",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_filter_listify/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_filter_listify/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4ebd342b364c0bcd4d7458cabd4cbcf98eda3188fedc289375cbee648d18c45e",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_filter_listify/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_cloud_region",
"ftype": "dir",
"chksum_type": null,
@@ -6542,7 +8593,7 @@
"name": "tests/integration/targets/aci_cloud_region/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "07c218a26eba7b984743300e0c8292dc9dbda9000d4cb22a3216a3abb1dc18ed",
+ "chksum_sha256": "d03c2da42e15fc3b0c84a0b1b69bdac0c21fd13d7f640f9b28bd1a10449e5d5b",
"format": 1
},
{
@@ -6553,6 +8604,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_access_spine_switch_selector",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_switch_selector/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_switch_selector/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "03c68b11627cec5057b89e00004d3f15f458e014ef267c78626d27f8ca7e6488",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_access_spine_switch_selector/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_route_control_context",
"ftype": "dir",
"chksum_type": null,
@@ -6570,7 +8649,7 @@
"name": "tests/integration/targets/aci_route_control_context/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "54fcba37e0a385af9767ffaa2740fd81458fc3cee008e017ec702f8162f18e70",
+ "chksum_sha256": "c06ebb912f21867917c48d6200c05a5a9c193aacd430899bd63c35e5f6685bca",
"format": 1
},
{
@@ -6598,7 +8677,7 @@
"name": "tests/integration/targets/aci_switch_policy_leaf_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71c9bc35fe283b8c8ca37f65c12ac529328987b60b799c48c2ded27832452f35",
+ "chksum_sha256": "6e48f8298d81dadd34c82e6f4909b4e8502eeeabd9e37debe57bb7538d2a8180",
"format": 1
},
{
@@ -6626,7 +8705,7 @@
"name": "tests/integration/targets/aci_vmm_vswitch_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "097f845417dd0d363abacdf65fc8915762f05b878e6b628d3be3504f4edef7c6",
+ "chksum_sha256": "913426c8878960f24280848e6ceda7c2193f6576dbe043b956be207cb23b24aa",
"format": 1
},
{
@@ -6654,7 +8733,7 @@
"name": "tests/integration/targets/aci_syslog_source/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "201852b3cc6e35b2452031b52492754e0824fc6b6beefbf1afa676b7a4c4edb9",
+ "chksum_sha256": "1aa926ceea4e53ecff3632cc8251c721993d96bd323dc4160543b24bb7f7671b",
"format": 1
},
{
@@ -6682,14 +8761,14 @@
"name": "tests/integration/targets/aci_vmm_credential/tasks/vmware.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "68f594ddc8d654e2e02c8283a476b9bd5d66299f56bf71081b741b6f4c38efe4",
+ "chksum_sha256": "e4b4bf1a18cb208a79c4e698474729cad83c54ab24130553de53ddd95262080b",
"format": 1
},
{
"name": "tests/integration/targets/aci_vmm_credential/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3160edcdbd1b730523e2239ca29b9ce2050d22d65028504573171f59b2a62e82",
+ "chksum_sha256": "e56710bf76207c9a80e3fcb62d230acd20b749db044ed8c6080744cd7fdea667",
"format": 1
},
{
@@ -6745,7 +8824,7 @@
"name": "tests/integration/targets/aci_switch_policy_vpc_protection_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "094faa7b08d4d132f470f233ab465a9ee16a6d37d7a5ac76d352cdef966533ea",
+ "chksum_sha256": "d36cb34648ae0539a22d1e5195610d2f2b51a905607af531fbea0309f1513216",
"format": 1
},
{
@@ -6756,6 +8835,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_netflow_record_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_record_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_record_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "329bae5d9ca559cd2a7a964cb692775a6f9fda68d3ecb1fa9c759ad9c42cc800",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_netflow_record_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_igmp_interface_policy",
"ftype": "dir",
"chksum_type": null,
@@ -6773,7 +8880,7 @@
"name": "tests/integration/targets/aci_igmp_interface_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4494f102e844ea6ff5c82c65daecef0b968b1e7f1b6109e55b015240e579fd16",
+ "chksum_sha256": "427b44e1d879dc625fff8fe46745130443253f461e918f614ebe9c943fdca45d",
"format": 1
},
{
@@ -6801,7 +8908,7 @@
"name": "tests/integration/targets/aci_aaa_role/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "421a7230dbd68e1e8a0ae78052502bcacc51e4873bfe24bd138004b4f340e60b",
+ "chksum_sha256": "f31f4e475199f346f8e3b5ef4da7fc19661e7af0a57701849ed9af132a5cb614",
"format": 1
},
{
@@ -6829,7 +8936,7 @@
"name": "tests/integration/targets/aci_static_node_mgmt_address/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76354f4a25f3daeb76b8f8929c15c97d6822ed0c5cda61a2a5b6a4ca9932da52",
+ "chksum_sha256": "e8a5c433aef22455527758f03430c2e87aad859904f2c804b9f0ae735fc6f4f4",
"format": 1
},
{
@@ -6857,7 +8964,7 @@
"name": "tests/integration/targets/aci_config_rollback/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6d4937bb22c5f4a4a7fe5771ba24fabaa8f0961137cf6811726fb2e07f02f9f5",
+ "chksum_sha256": "472c0fb98c3cf9edb626192d2481c896d11d1184503d873353ff8d7e4813223d",
"format": 1
},
{
@@ -6885,7 +8992,7 @@
"name": "tests/integration/targets/aci_interface_policy_port_security/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b4022adb62fa72c4942d6104977f94bc734486be02f53ddb5cae1ceffc61371",
+ "chksum_sha256": "f8c9744d1187e4d9f67cf1215af9f540d6cd1e7be7839a1c437d2a8392cc07e8",
"format": 1
},
{
@@ -6896,6 +9003,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_l3out_floating_svi",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f03579a734119e7e928a7155c37e13075d716b45b5a4457074bfe1b8012f1e4a",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_l3out_floating_svi/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_access_span_filter_group_entry",
"ftype": "dir",
"chksum_type": null,
@@ -6913,7 +9048,7 @@
"name": "tests/integration/targets/aci_access_span_filter_group_entry/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2bb778f87e5538a417e3629d1545ea4995df371213a705e81956e0497b86f9a7",
+ "chksum_sha256": "b2f5e1a7ae93be81c9a06807167c50ed2c19388765d2345be14b97ea28ba4c7d",
"format": 1
},
{
@@ -6941,7 +9076,7 @@
"name": "tests/integration/targets/aci_system/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38c9cb66642f19daee872411bd6dc8df26d1ab38edad0c521397557003124ac4",
+ "chksum_sha256": "76e7fd03254cda8d4cadea91be613f9b77ec590c14a09d13e322b4264ff0651e",
"format": 1
},
{
@@ -6952,6 +9087,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_pim_route_map_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_pim_route_map_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_pim_route_map_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "acae8cf67565eb38722387ce99c02bb793670d98086b73830596f6031661379c",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_pim_route_map_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_epg_subnet",
"ftype": "dir",
"chksum_type": null,
@@ -6969,7 +9132,7 @@
"name": "tests/integration/targets/aci_epg_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "88b56f6acb0c44928cab5e4b92aaf89a13a592bc7d1e0b88f70515743e29e624",
+ "chksum_sha256": "cebd3d119809c5f2ec21749d192c2ada5934a0f1e26d3d5f5ca08e6cae6fe946",
"format": 1
},
{
@@ -6997,7 +9160,7 @@
"name": "tests/integration/targets/aci_interface_policy_spanning_tree/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04a8da39c4907965a8fcde343dd74c02f1dc4963d9ba8ed98d08ec90a95340e8",
+ "chksum_sha256": "bf5f4904bc4ce5d96a7af20f61d8b3f107cd89aa83ca310c94c4aa2978cf358e",
"format": 1
},
{
@@ -7008,6 +9171,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_bd_to_netflow_monitor_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bd_to_netflow_monitor_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bd_to_netflow_monitor_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "082dfca281ac7354249b0bc7e8695278ca69428044f37989c5a3ea482460372c",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bd_to_netflow_monitor_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_fabric_interface_policy_group",
"ftype": "dir",
"chksum_type": null,
@@ -7025,7 +9216,7 @@
"name": "tests/integration/targets/aci_fabric_interface_policy_group/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "827c31fe1653a6a1609f63e81ff2387defe400094845091b89f9b22ae5f536b8",
+ "chksum_sha256": "e49d3ab8dc00b23ced354238f15530310af0f86643a79d3d7264aba9fb3f8600",
"format": 1
},
{
@@ -7036,6 +9227,48 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_aaa_certificate_authority",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_certificate_authority/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_certificate_authority/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a28a838e0ac37e529e9b2d07a23aa641181eec92493e7ae1f20ff6e8f007829d",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_certificate_authority/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_certificate_authority/pki",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_aaa_certificate_authority/pki/admin.crt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f97928b2cd1ce43cfe9ae9bbf47a40b858a749c4c3f25a7ec02898611f4fee90",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_match_as_path_regex_term",
"ftype": "dir",
"chksum_type": null,
@@ -7053,7 +9286,7 @@
"name": "tests/integration/targets/aci_match_as_path_regex_term/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c80e4ffc685fcdc906015246d0d97a767f81e3e76531b08571ed9033f0791dbb",
+ "chksum_sha256": "3e2a11094eae846a760da9b46d13d900c6cb4c74d5d120ae6ad81ad1cf3fccc2",
"format": 1
},
{
@@ -7064,6 +9297,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_fabric_pod_external_tep",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_external_tep/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_external_tep/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d7eaf53338446482dd5fa4fe5140cc31e54b3601bc8453db94dccbde15690cbc",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_fabric_pod_external_tep/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_bd_dhcp_label",
"ftype": "dir",
"chksum_type": null,
@@ -7081,7 +9342,7 @@
"name": "tests/integration/targets/aci_bd_dhcp_label/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e3479a63f7af0ecb0d46bbf2052d4dc3591acaac7ed031c599b4041766f3e34d",
+ "chksum_sha256": "30093f02b96084749a02daa955a8b2a71a3086d069340a0d885a8c48e16b54bb",
"format": 1
},
{
@@ -7092,6 +9353,62 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_qos_custom_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_custom_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_custom_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "13b956ae3c20c1479e51191caf501a84bb8749ce2fe6116ba1f1d693b6252ce7",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_qos_custom_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_peer_prefix_policy",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_peer_prefix_policy/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_peer_prefix_policy/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "beda6e7ae2ba6b0f606bbf28ac41e5f08cdcc0d758ce0232579799a79910682f",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_bgp_peer_prefix_policy/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_dns_profile",
"ftype": "dir",
"chksum_type": null,
@@ -7109,7 +9426,7 @@
"name": "tests/integration/targets/aci_dns_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7710ef1928ec6670a9c427f5ecbaf920cfceab9998ceb45f88c007388e057124",
+ "chksum_sha256": "c8f059c2c339e427920a26eb766b5792a91a770f26b8ae2ad5160c14d77b7e63",
"format": 1
},
{
@@ -7137,7 +9454,7 @@
"name": "tests/integration/targets/aci_l3out_bgp_protocol_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4c9776bba48af35f22f3ac068ec7c2fa8ebd63127faababdbfff602bedca5452",
+ "chksum_sha256": "198c5b9ccd95bda9d4931575ca2714b0d88ddf86b11d8ffa21b85f796950adca",
"format": 1
},
{
@@ -7165,7 +9482,7 @@
"name": "tests/integration/targets/aci_l2out_logical_node_profile/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "78a938d1fd71466218d1a89cd69ba640ed575842f4665e018198f5a2d9b7f627",
+ "chksum_sha256": "5cbba841fa4aebaf26a55019f4116fa1cdc3d0396985f40237af47821d2fdd50",
"format": 1
},
{
@@ -7193,7 +9510,7 @@
"name": "tests/integration/targets/aci_cloud_ap/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a3a8ba85c62882aa47375c7e9877ada0fcd25ceb5e7bc1938b5048553ed0352e",
+ "chksum_sha256": "6bc7926291ab1290f45c80070ef68096e893db7e23e159b9b988955589267cfb",
"format": 1
},
{
@@ -7221,7 +9538,7 @@
"name": "tests/integration/targets/aci_fabric_spine_switch_assoc/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e2971f15de4547047270593a21abab181456009320ef73e072fd24bf4c1db51b",
+ "chksum_sha256": "fa98c42f0c0d87f0c3522290313cc5a788c1ba2a17bb590ba1fc32080ff6a3ab",
"format": 1
},
{
@@ -7256,21 +9573,21 @@
"name": "tests/integration/targets/aci_encap_pool/tasks/vlan.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "224201f12daddafc57289377385550b04202dec31060f9cf6599b05ec7016c54",
+ "chksum_sha256": "20cb0a9ba6b321d2ac5f2a4634e40a1490aba30b4c2267090ecc9e44f9486288",
"format": 1
},
{
"name": "tests/integration/targets/aci_encap_pool/tasks/vxlan.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad7cdd676df819a942211e1ce2ed6cc4b5f0e187035ca0b30c1197179c0ea24a",
+ "chksum_sha256": "33f714e802c7e5b5cd2cf544ea467938afdda7b0316be4e7a7812a6bd0934173",
"format": 1
},
{
"name": "tests/integration/targets/aci_encap_pool/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "83fcd807207de6f0e46bafbf20f7c8754cb1f94440e85602cbc8aeea53a67404",
+ "chksum_sha256": "e43f5aed967a030170540532416573092347695e1eb1f65615e9e97a16bf3c00",
"format": 1
},
{
@@ -7330,6 +9647,27 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_rest/tasks/xml_files/tag.xml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1d3f6bdeccd46f8336ce26ddb03789dc48cba17146ce0a00a823c16c29615a2a",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation_children.xml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2c29bf62b5be93bcf156d3b8ce35c9436149f9c757b284a1cab663a382d4df16",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "aba1435ee60db759fd78cd5965c8be68d409021d5ef569330227b24badb05084",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_update.xml",
"ftype": "file",
"chksum_type": "sha256",
@@ -7347,56 +9685,56 @@
"name": "tests/integration/targets/aci_rest/tasks/json_inline.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e927a5abc052195e3e728d73c5c66557b87ae3bbd976a8c8b7f6611b0c6c16d0",
+ "chksum_sha256": "891a6726743b1acc2f05b500bf832ae3ab02647a4f355344cc7b4f81748dff56",
"format": 1
},
{
"name": "tests/integration/targets/aci_rest/tasks/json_string.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3da19544e0a9300231d8b96368c1eea2f0e818d0279cece4198e3ba5f89535e",
+ "chksum_sha256": "59ac5789bef4ea7ec604c2d1a8fa31ca631a81fb646fdb0d1f8b402cfc056199",
"format": 1
},
{
"name": "tests/integration/targets/aci_rest/tasks/yaml_inline.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5703d0de444ddbe609527833236735e85bd605f60e50b81ac7f003f53cc37f9c",
+ "chksum_sha256": "aa1cff215a621eac4aad114ca61de35e74d4263ae4ca99166bf2af5895e3b67c",
"format": 1
},
{
"name": "tests/integration/targets/aci_rest/tasks/xml_file.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "940d954f67332ff5ff2a853dc92968a7017fab3d4346b0c1703f38ba43993451",
+ "chksum_sha256": "973a375b620782177e8fcc0795bcd3bc552ca01de5c10e200c8bab4db23f986f",
"format": 1
},
{
"name": "tests/integration/targets/aci_rest/tasks/xml_string.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0f0aa8fde34bbb16b8ddfc80dd8a80f596004a8f5b0242d5e0403ac820e1b3d4",
+ "chksum_sha256": "e2068bc8abb044a6fb8e61131f57cf54b750a448e4ca0cfe152c08512840b0e1",
"format": 1
},
{
"name": "tests/integration/targets/aci_rest/tasks/yaml_string.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3616adeb0651848fca25ffd6a229d10f1093581059463d24c783aa9775380dd4",
+ "chksum_sha256": "d8f45953cd9360d74067a65d045d5f1fa47fed7e0bf28fbc0b30ba61db1bb97d",
"format": 1
},
{
"name": "tests/integration/targets/aci_rest/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "83f24d55d45b7d9dabfb4f332f208eabee34d9dd97e56bcc555ad83bc1f81c5a",
+ "chksum_sha256": "654d542ee3a83ed5c83d5256be4e7d79d7b31603284f5333cbd84f0183e6d85e",
"format": 1
},
{
"name": "tests/integration/targets/aci_rest/tasks/error_handling.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4b5de110ac6eb32bf731bea15cc3c88b19571e0d39a1c9e85c9131c822bfa242",
+ "chksum_sha256": "62999920c1d70b945a8ceb759fdfe54999882d8b62d8acb1de17547a42511e56",
"format": 1
},
{
@@ -7428,6 +9766,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/aci_interface_policy_pim",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_pim/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_pim/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8d9b42c2b3624aa7ae1bf269bf711f5f7403e59309aa9c3f60a3a6cdfca742e5",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/aci_interface_policy_pim/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "616f27a9a7bb49e561ef3782330e18d1a8cea3840e3166e798796684dd546a69",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/aci_match_community_term",
"ftype": "dir",
"chksum_type": null,
@@ -7445,7 +9811,7 @@
"name": "tests/integration/targets/aci_match_community_term/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5be84110acb7260a79bb832aa116b5cd301a6455705e9091bc963ee35ba0fe7",
+ "chksum_sha256": "d096df2878c4e9a46d0c1291f06a4af8c154d9fb8153fee6ed10e3610942e80a",
"format": 1
},
{
@@ -7473,7 +9839,7 @@
"name": "tests/integration/targets/aci_contract_subject_to_filter/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "32b77df5bb1d7d8a17718eee2daef2bc17af9e26c0cced27a70e5ea23ccf3e10",
+ "chksum_sha256": "d943c5183480a1f6d7883c7c86e1470fc780796c8fcff1e10ddf93bdbe02842c",
"format": 1
},
{
@@ -7501,7 +9867,7 @@
"name": "tests/integration/targets/aci_tag/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cff28fccf6e21336295bd82d9f68362b37ad95c7ada235ad3fb4a1cbf7d4960e",
+ "chksum_sha256": "2f61a62d362e61daab4037c313920173d9ed917413863bfa336da68550c1447b",
"format": 1
},
{
@@ -7529,7 +9895,7 @@
"name": "tests/integration/targets/aci_access_sub_port_block_to_access_port/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "db3e4e59ab75655579f9f793573f3d20b66c50b9d7592ea5b20ed0923e51b593",
+ "chksum_sha256": "5c6d9c565eb54740091677f27faa6c143f6d637e108f4e59ac724d0e84c96c63",
"format": 1
},
{
@@ -7557,7 +9923,7 @@
"name": "tests/integration/targets/aci_vrf_leak_internal_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2109f9cc263e3a385afdc3517ddc75c744865636b0dff13915aeecff9e0adb0",
+ "chksum_sha256": "ac7d1e3e65b11f8a28aaa575ca9a35faed3e8769f692ce165ca530e23c4e1793",
"format": 1
},
{
@@ -7585,7 +9951,7 @@
"name": "tests/integration/targets/aci_cloud_cidr/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba0cb3b0e88b985e8f7ea8f954549e0ca8588a64296c1ac7583a2eda37f0aaa5",
+ "chksum_sha256": "4a34ccc33268446297b8e7b32ec1cd0069737d00bebe3a4fc436e15d173d21d3",
"format": 1
},
{
@@ -7613,7 +9979,7 @@
"name": "tests/integration/targets/aci_maintenance_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e19c89dc5c8b6d6d369ffd128946262764e40ba0a31d63cdd9ecb6a9ef2c8534",
+ "chksum_sha256": "ee748ee2fb13791df016d81aa90ba0a5eb76c797a90640f773a82e3970d1da65",
"format": 1
},
{
@@ -7641,7 +10007,7 @@
"name": "tests/integration/inventory.networking",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad3de59540f46afab94288be8016738381fb364db4a1cce0f7b26f9e63ac521a",
+ "chksum_sha256": "066dd1d6fdad5e035f5f03d4c4936694df0725c866ff07b97cb0b890b5cdba0a",
"format": 1
},
{
@@ -7676,7 +10042,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f46a8922200bc41ffe0f26b3be9ef551b64046819d574471631f87913ac8d0b2",
+ "chksum_sha256": "823478f3e3fece3c5f21468fc12dc2bdf2a7acc90b67ac8c0e585aed4a7b2b5b",
"format": 1
},
{
@@ -7732,21 +10098,21 @@
"name": "changelogs/.plugin-cache.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8760c5fd8ac292f4cb5d1e38be9d92e149e5c38f6575d75e62afaf606fb56d4a",
+ "chksum_sha256": "226a81b01ab9166e26e1b50e58c1062e9d9794cba1ee29aa0291f364c9b2400e",
"format": 1
},
{
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b5b4f364b875b398bfc855bf601a4acf3199406aaeba2d3191cf0e18bd670db",
+ "chksum_sha256": "6c1cd0d336c59576dd14c2e88a25cdf9e8f3c21a943b16408c69fe513127d7eb",
"format": 1
},
{
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9a92f358d773d20208cf3d33bc9b0c297ee9e097ecf04369b558c9fa0a3ae5b8",
+ "chksum_sha256": "b4cc7dd84bc559d59d2ea5069c4d2cb4036514b0b79809e9370fc642dbd73f02",
"format": 1
},
{
@@ -7774,7 +10140,7 @@
"name": ".github/workflows/galaxy-importer.cfg",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "edc6f2746e7b8c7b94dea479036ba246953cf69234974b89c069c10d614dcaad",
+ "chksum_sha256": "495797aee3d8a36d013c51e137187e94b639b998c59e84b64574584c826846a8",
"format": 1
},
{
@@ -7788,7 +10154,7 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ecb3d932b0557681e1d6713dffa67bf02bab7dca0184cbebe82dac9242c7411a",
+ "chksum_sha256": "9d19ebb16e37d1dcbde16ceb2dea03b469473f09f22a657f9e5d8f622acfbe89",
"format": 1
},
{
@@ -7830,7 +10196,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "803f408887301e778901174e6ac06a58a26ce84267e24936b3aa58d4441bd333",
+ "chksum_sha256": "172713983098b06ee2c985e3f0fa30bc70b7fb0fd1113a60efd4e0d6a4bcd1a0",
"format": 1
},
{
diff --git a/ansible_collections/cisco/aci/MANIFEST.json b/ansible_collections/cisco/aci/MANIFEST.json
index f326a92fb..2678c4881 100644
--- a/ansible_collections/cisco/aci/MANIFEST.json
+++ b/ansible_collections/cisco/aci/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "cisco",
"name": "aci",
- "version": "2.8.0",
+ "version": "2.9.0",
"authors": [
"Dag Wieers (@dagwieers) <dag@wieers.com>",
"Swetha Chunduri (@schunduri)",
@@ -40,7 +40,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0c3eb373bfc6269787c650369f02ac533918bab3cdc51c3bf65c4e6de2114714",
+ "chksum_sha256": "eed2d47ee4bc72dd865fa06f0d1de3c613afb2c01741dd8ebc66706ddc89f62e",
"format": 1
},
"format": 1
diff --git a/ansible_collections/cisco/aci/README.md b/ansible_collections/cisco/aci/README.md
index 4e5cdf6af..7ff6e85ea 100644
--- a/ansible_collections/cisco/aci/README.md
+++ b/ansible_collections/cisco/aci/README.md
@@ -8,7 +8,7 @@ Modules supporting new features introduced in ACI API in specific ACI versions m
*Note: This collection is not compatible with versions of Ansible before v2.8.*
## Requirements
-Ansible v2.9 or newer
+Ansible v2.14 or newer
## Install
Ansible must be installed
diff --git a/ansible_collections/cisco/aci/changelogs/.plugin-cache.yaml b/ansible_collections/cisco/aci/changelogs/.plugin-cache.yaml
index 18556ea00..d7425ab9d 100644
--- a/ansible_collections/cisco/aci/changelogs/.plugin-cache.yaml
+++ b/ansible_collections/cisco/aci/changelogs/.plugin-cache.yaml
@@ -6,7 +6,11 @@ plugins:
callback: {}
cliconf: {}
connection: {}
- filter: {}
+ filter:
+ aci_listify:
+ description: Flattens the nested dictionaries representing the ACI model data.
+ name: aci_listify
+ version_added: null
httpapi:
aci:
description: Ansible ACI HTTPAPI Plugin.
@@ -19,6 +23,11 @@ plugins:
name: interface_range
version_added: null
module:
+ aci_aaa_certificate_authority:
+ description: Manage AAA Certificate Authorities (pki:TP)
+ name: aci_aaa_certificate_authority
+ namespace: ''
+ version_added: null
aci_aaa_custom_privilege:
description: Manage AAA RBAC Custom Privileges (aaa:RbacClassPriv)
name: aci_aaa_custom_privilege
@@ -29,13 +38,23 @@ plugins:
name: aci_aaa_domain
namespace: ''
version_added: null
+ aci_aaa_key_ring:
+ description: Manage AAA Key Rings (pki:KeyRing)
+ name: aci_aaa_key_ring
+ namespace: ''
+ version_added: null
aci_aaa_role:
description: Manage AAA roles (aaa:Role)
name: aci_aaa_role
namespace: ''
version_added: null
+ aci_aaa_security_default_settings:
+ description: Manage AAA Key Rings (pki:Ep)
+ name: aci_aaa_security_default_settings
+ namespace: ''
+ version_added: null
aci_aaa_ssh_auth:
- description: Manage AAA SSH auth (aaaSshAuth) objects.
+ description: Manage AAA SSH auth objects (aaa:SshAuth)
name: aci_aaa_ssh_auth
namespace: ''
version_added: null
@@ -60,14 +79,14 @@ plugins:
namespace: ''
version_added: null
aci_access_port_block_to_access_port:
- description: Manage port blocks of Fabric interface policy leaf profile interface
- selectors (infra:HPortS, infra:PortBlk)
+ description: Manage Port blocks of Fabric Access Leaf/Spine Interface Port Selectors
+ (infra:PortBlk)
name: aci_access_port_block_to_access_port
namespace: ''
version_added: null
aci_access_port_to_interface_policy_leaf_profile:
description: Manage Fabric interface policy leaf profile interface selectors
- (infra:HPortS, infra:RsAccBaseGrp, infra:PortBlk)
+ (infra:HPortS, infra:RsAccBaseGrp, and infra:PortBlk)
name: aci_access_port_to_interface_policy_leaf_profile
namespace: ''
version_added: null
@@ -101,15 +120,61 @@ plugins:
name: aci_access_span_src_group_src_path
namespace: ''
version_added: null
+ aci_access_spine_interface_profile:
+ description: Manage fabric interface policy spine profiles (infra:SpAccPortP)
+ name: aci_access_spine_interface_profile
+ namespace: ''
+ version_added: null
+ aci_access_spine_interface_profile_to_spine_switch_profile:
+ description: Bind Fabric Access Spine Interface Profiles to Fabric Acces Spine
+ Switch Profiles (infra:RsSpAccPortP)
+ name: aci_access_spine_interface_profile_to_spine_switch_profile
+ namespace: ''
+ version_added: null
+ aci_access_spine_interface_selector:
+ description: Manage Fabric Access Policy Spine Interface Port Selectors (infra:SHPortS)
+ name: aci_access_spine_interface_selector
+ namespace: ''
+ version_added: null
+ aci_access_spine_switch_profile:
+ description: Manage Fabric Access Spine Switch Profiles (infra:SpineP)
+ name: aci_access_spine_switch_profile
+ namespace: ''
+ version_added: null
+ aci_access_spine_switch_selector:
+ description: Manage Fabric Access Policy Spine Switch Port Selectors (infra:SpineS)
+ name: aci_access_spine_switch_selector
+ namespace: ''
+ version_added: null
aci_access_sub_port_block_to_access_port:
description: Manage sub port blocks of Fabric interface policy leaf profile
- interface selectors (infra:HPortS, infra:SubPortBlk)
+ interface selectors (infra:HPortS and infra:SubPortBlk)
name: aci_access_sub_port_block_to_access_port
namespace: ''
version_added: null
+ aci_access_switch_policy_group:
+ description: Manage Access Switch Policy Groups (infra:AccNodePGrp and infra:SpineAccNodePGrp).
+ name: aci_access_switch_policy_group
+ namespace: ''
+ version_added: null
+ aci_action_rule_additional_communities:
+ description: Manage Action Rules based on Additional Communities (rtctrl:SetAddComm)
+ name: aci_action_rule_additional_communities
+ namespace: ''
+ version_added: null
+ aci_action_rule_set_as_path:
+ description: Manage the AS Path action rules (rtctrl:SetASPath)
+ name: aci_action_rule_set_as_path
+ namespace: ''
+ version_added: null
+ aci_action_rule_set_as_path_asn:
+ description: Manage the AS Path ASN (rtctrl:SetASPathASN)
+ name: aci_action_rule_set_as_path_asn
+ namespace: ''
+ version_added: null
aci_aep:
- description: Manage attachable Access Entity Profile (AEP) objects (infra:AttEntityP,
- infra:ProvAcc)
+ description: Manage attachable Access Entity Profile (AEP) objects (infra:AttEntityP
+ and infra:ProvAcc)
name: aci_aep
namespace: ''
version_added: null
@@ -119,7 +184,7 @@ plugins:
namespace: ''
version_added: null
aci_aep_to_epg:
- description: Bind EPG to AEP (infra:RsFuncToEpg).
+ description: Bind EPG to AEP (infra:RsFuncToEpg)
name: aci_aep_to_epg
namespace: ''
version_added: null
@@ -138,6 +203,11 @@ plugins:
name: aci_bd_dhcp_label
namespace: ''
version_added: null
+ aci_bd_rogue_exception_mac:
+ description: Manage Rogue Exception MAC (fv:RogueExceptionMac)
+ name: aci_bd_rogue_exception_mac
+ namespace: ''
+ version_added: null
aci_bd_subnet:
description: Manage Subnets (fv:Subnet)
name: aci_bd_subnet
@@ -148,18 +218,43 @@ plugins:
name: aci_bd_to_l3out
namespace: ''
version_added: null
+ aci_bd_to_netflow_monitor_policy:
+ description: Bind Bridge Domain to Netflow Monitor Policy (fv:RsBDToNetflowMonitorPol)
+ name: aci_bd_to_netflow_monitor_policy
+ namespace: ''
+ version_added: null
+ aci_bfd_multihop_node_policy:
+ description: Manage BFD Multihop Node policies (bfd:MhNodePol)
+ name: aci_bfd_multihop_node_policy
+ namespace: ''
+ version_added: null
+ aci_bgp_address_family_context_policy:
+ description: Manage BGP address family context policy (bgp:CtxAfPol)
+ name: aci_bgp_address_family_context_policy
+ namespace: ''
+ version_added: null
aci_bgp_best_path_policy:
description: Manage BGP Best Path policy (bgp:BestPathCtrlPol)
name: aci_bgp_best_path_policy
namespace: ''
version_added: null
+ aci_bgp_peer_prefix_policy:
+ description: Manage BGP peer prefix policy (bgp:PeerPfxPol)
+ name: aci_bgp_peer_prefix_policy
+ namespace: ''
+ version_added: null
+ aci_bgp_route_summarization_policy:
+ description: Manage BGP route summarization policy (bgp:RtSummPol)
+ name: aci_bgp_route_summarization_policy
+ namespace: ''
+ version_added: null
aci_bgp_rr_asn:
- description: Manage BGP Route Reflector ASN.
+ description: Manage BGP Route Reflector ASN (bgp:AsP)
name: aci_bgp_rr_asn
namespace: ''
version_added: null
aci_bgp_rr_node:
- description: Manage BGP Route Reflector objects.
+ description: Manage BGP Route Reflector objects (bgp:RRNodePEp)
name: aci_bgp_rr_node
namespace: ''
version_added: null
@@ -254,7 +349,7 @@ plugins:
namespace: ''
version_added: null
aci_config_snapshot:
- description: Manage Config Snapshots (config:Snapshot, config:ExportP)
+ description: Manage Config Snapshots (config:Snapshot and config:ExportP)
name: aci_config_snapshot
namespace: ''
version_added: null
@@ -279,38 +374,48 @@ plugins:
namespace: ''
version_added: null
aci_contract_subject_to_service_graph:
- description: Bind contract subject to service graph (vz:RsSubjGraphAtt).
+ description: Bind contract subject to service graph (vz:RsSubjGraphAtt)
name: aci_contract_subject_to_service_graph
namespace: ''
version_added: null
+ aci_dhcp_option:
+ description: Manage DHCP Option (dhcp:Option)
+ name: aci_dhcp_option
+ namespace: ''
+ version_added: null
+ aci_dhcp_option_policy:
+ description: Manage DHCP Option Policy (dhcp:OptionPol)
+ name: aci_dhcp_option_policy
+ namespace: ''
+ version_added: null
aci_dhcp_relay:
- description: Manage DHCP relay policies.
+ description: Manage DHCP relay policies (dhcp:RelayP)
name: aci_dhcp_relay
namespace: ''
version_added: null
aci_dhcp_relay_provider:
- description: Manage DHCP relay policy providers.
+ description: Manage DHCP relay policy providers (dhcp:RsProv)
name: aci_dhcp_relay_provider
namespace: ''
version_added: null
aci_dns_domain:
- description: Manage DNS Provider (dnsDomain) objects.
+ description: Manage DNS Provider objects (dns:Domain)
name: aci_dns_domain
namespace: ''
version_added: null
aci_dns_profile:
- description: Manage DNS Profile (dnsProfile) objects.
+ description: Manage DNS Profile objects (dns:Profile)
name: aci_dns_profile
namespace: ''
version_added: null
aci_dns_provider:
- description: Manage DNS Provider (dnsProv) objects.
+ description: Manage DNS Provider objects (dns:Prov)
name: aci_dns_provider
namespace: ''
version_added: null
aci_domain:
description: Manage physical, virtual, bridged, routed or FC domain profiles
- (phys:DomP, vmm:DomP, l2ext:DomP, l3ext:DomP, fc:DomP)
+ (phys:DomP, vmm:DomP, l2ext:DomP, l3ext:DomP, and fc:DomP)
name: aci_domain
namespace: ''
version_added: null
@@ -325,12 +430,12 @@ plugins:
namespace: ''
version_added: null
aci_encap_pool:
- description: Manage encap pools (fvns:VlanInstP, fvns:VxlanInstP, fvns:VsanInstP)
+ description: Manage encap pools (fvns:VlanInstP, fvns:VxlanInstP, and fvns:VsanInstP)
name: aci_encap_pool
namespace: ''
version_added: null
aci_encap_pool_range:
- description: Manage encap ranges assigned to pools (fvns:EncapBlk, fvns:VsanEncapBlk)
+ description: Manage encap ranges assigned to pools (fvns:EncapBlk and fvns:VsanEncapBlk)
name: aci_encap_pool_range
namespace: ''
version_added: null
@@ -350,12 +455,13 @@ plugins:
namespace: ''
version_added: null
aci_epg_to_contract:
- description: Bind EPGs to Contracts (fv:RsCons, fv:RsProv)
+ description: Bind EPGs to Contracts (fv:RsCons, fv:RsProv, fv:RsProtBy, fv:RsConsIf,
+ and fv:RsIntraEpg)
name: aci_epg_to_contract
namespace: ''
version_added: null
aci_epg_to_contract_interface:
- description: Bind EPGs to Consumed Contracts Interface (fv:RsConsIf).
+ description: Bind EPGs to Consumed Contracts Interface (fv:RsConsIf)
name: aci_epg_to_contract_interface
namespace: ''
version_added: null
@@ -369,6 +475,17 @@ plugins:
name: aci_epg_to_domain
namespace: ''
version_added: null
+ aci_epg_useg_attribute_block_statement:
+ description: Manage EPG useg Attributes Block Statements (fv:SCrtrn)
+ name: aci_epg_useg_attribute_block_statement
+ namespace: ''
+ version_added: null
+ aci_epg_useg_attribute_simple_statement:
+ description: Manage EPG useg Attributes Simple Statements (fv:DnsAttr, fv:IdGroupAttr,
+ fv:IpAttr, fv:MacAttr, and fv:VmAttr)
+ name: aci_epg_useg_attribute_simple_statement
+ namespace: ''
+ version_added: null
aci_esg:
description: Manage Endpoint Security Groups (ESGs) objects (fv:ESg)
name: aci_esg
@@ -385,7 +502,7 @@ plugins:
namespace: ''
version_added: null
aci_esg_ip_subnet_selector:
- description: Manage ESG IP Subnet selector(fv:EPSelector)
+ description: Manage ESG IP Subnet selector (fv:EPSelector)
name: aci_esg_ip_subnet_selector
namespace: ''
version_added: null
@@ -394,13 +511,23 @@ plugins:
name: aci_esg_tag_selector
namespace: ''
version_added: null
+ aci_fabric_external_connection_profile:
+ description: Manage Fabric External Connection Profiles (fv:FabricExtConnP).
+ name: aci_fabric_external_connection_profile
+ namespace: ''
+ version_added: null
+ aci_fabric_external_routing_profile:
+ description: Manage Fabric External Routing Profiles (l3ext:FabricExtRoutingP)
+ name: aci_fabric_external_routing_profile
+ namespace: ''
+ version_added: null
aci_fabric_interface_policy_group:
- description: Manage Fabric Interface Policy Groups (fabric:LePortPGrp, fabric:SpPortPGrp)
+ description: Manage Fabric Interface Policy Groups (fabric:LePortPGrp and fabric:SpPortPGrp)
name: aci_fabric_interface_policy_group
namespace: ''
version_added: null
aci_fabric_leaf_profile:
- description: Manage fabric leaf profiles (fabric:LeafP).
+ description: Manage fabric leaf profiles (fabric:LeafP)
name: aci_fabric_leaf_profile
namespace: ''
version_added: null
@@ -410,6 +537,17 @@ plugins:
name: aci_fabric_leaf_switch_assoc
namespace: ''
version_added: null
+ aci_fabric_management_access:
+ description: Manage Fabric Management Access (comm:Pol)
+ name: aci_fabric_management_access
+ namespace: ''
+ version_added: null
+ aci_fabric_management_access_https_cipher:
+ description: Manage Fabric Management Access HTTPS SSL Cipher Configuration
+ (comm:Cipher)
+ name: aci_fabric_management_access_https_cipher
+ namespace: ''
+ version_added: null
aci_fabric_node:
description: Manage Fabric Node Members (fabric:NodeIdentP)
name: aci_fabric_node
@@ -420,11 +558,36 @@ plugins:
name: aci_fabric_node_control
namespace: ''
version_added: null
+ aci_fabric_pod:
+ description: Manage Fabric Pod Setup Policy (fabric:SetupP)
+ name: aci_fabric_pod
+ namespace: ''
+ version_added: null
+ aci_fabric_pod_connectivity_profile:
+ description: Manage Fabric External Pod Connectivity Profiles (fv:PodConnP)
+ name: aci_fabric_pod_connectivity_profile
+ namespace: ''
+ version_added: null
+ aci_fabric_pod_external_tep:
+ description: Manage Fabric Pod External TEP (fabric:ExtRoutablePodSubnet)
+ name: aci_fabric_pod_external_tep
+ namespace: ''
+ version_added: null
aci_fabric_pod_policy_group:
description: Manage Fabric Pod Policy Groups (fabric:PodPGrp)
name: aci_fabric_pod_policy_group
namespace: ''
version_added: null
+ aci_fabric_pod_profile:
+ description: Manage Fabric Pod Profile (fabric:PodP)
+ name: aci_fabric_pod_profile
+ namespace: ''
+ version_added: null
+ aci_fabric_pod_remote_pool:
+ description: Manage Fabric Pod Remote Pool (fabric:ExtSetupP)
+ name: aci_fabric_pod_remote_pool
+ namespace: ''
+ version_added: null
aci_fabric_pod_selector:
description: Manage Fabric Pod Selectors (fabric:PodS)
name: aci_fabric_pod_selector
@@ -461,23 +624,24 @@ plugins:
namespace: ''
version_added: null
aci_fabric_spine_profile:
- description: Manage fabric spine profiles (fabric:SpineP).
+ description: Manage fabric spine profiles (fabric:SpineP)
name: aci_fabric_spine_profile
namespace: ''
version_added: null
aci_fabric_spine_switch_assoc:
description: Manage spine switch bindings to profiles and policy groups (fabric:SpineS
- and fabric:RsSpNodePGrp).
+ and fabric:RsSpNodePGrp)
name: aci_fabric_spine_switch_assoc
namespace: ''
version_added: null
aci_fabric_switch_block:
- description: Manage switch blocks (fabric:NodeBlk).
+ description: Manage switch blocks (fabric:NodeBlk)
name: aci_fabric_switch_block
namespace: ''
version_added: null
aci_fabric_switch_policy_group:
- description: Manage Fabric Switch Policy Group objects.
+ description: Manage Fabric Switch Policy Group objects (fabric:LeNodePGrp and
+ fabric:SpNodePGrp)
name: aci_fabric_switch_policy_group
namespace: ''
version_added: null
@@ -527,7 +691,7 @@ plugins:
namespace: ''
version_added: null
aci_interface_blacklist:
- description: Enabling or Disabling physical interfaces.
+ description: Enabling or Disabling physical interfaces (fabric:RsOosPath)
name: aci_interface_blacklist
namespace: ''
version_added: null
@@ -538,20 +702,41 @@ plugins:
namespace: ''
version_added: null
aci_interface_description:
- description: Setting and removing description on physical interfaces.
+ description: Setting and removing description on physical interfaces (infra:HPathS,
+ infra:RsHPathAtt, infra:SHPathS, and infra:RsSHPathAtt)
name: aci_interface_description
namespace: ''
version_added: null
+ aci_interface_policy_bfd:
+ description: Manage BFD Interface policies (bfd:IfPol)
+ name: aci_interface_policy_bfd
+ namespace: ''
+ version_added: null
+ aci_interface_policy_bfd_multihop:
+ description: Manage BFD Multihop Interface policies (bfd:MhIfPol)
+ name: aci_interface_policy_bfd_multihop
+ namespace: ''
+ version_added: null
aci_interface_policy_cdp:
description: Manage CDP interface policies (cdp:IfPol)
name: aci_interface_policy_cdp
namespace: ''
version_added: null
+ aci_interface_policy_eigrp:
+ description: Manage EIGRP interface policies (eigrp:IfPol)
+ name: aci_interface_policy_eigrp
+ namespace: ''
+ version_added: null
aci_interface_policy_fc:
description: Manage Fibre Channel interface policies (fc:IfPol)
name: aci_interface_policy_fc
namespace: ''
version_added: null
+ aci_interface_policy_hsrp:
+ description: Manage HSRP interface policies (hsrp:IfPol)
+ name: aci_interface_policy_hsrp
+ namespace: ''
+ version_added: null
aci_interface_policy_l2:
description: Manage Layer 2 interface policies (l2:IfPol)
name: aci_interface_policy_l2
@@ -563,14 +748,14 @@ plugins:
namespace: ''
version_added: null
aci_interface_policy_leaf_fc_policy_group:
- description: Manage Fibre Channel (FC) interface policy groups (infra:FcAccBndlGrp,
- infra:FcAccPortGrp)
+ description: Manage Fibre Channel (FC) interface policy groups (infra:FcAccBndlGrp
+ and infra:FcAccPortGrp)
name: aci_interface_policy_leaf_fc_policy_group
namespace: ''
version_added: null
aci_interface_policy_leaf_policy_group:
- description: Manage fabric interface policy leaf policy groups (infra:AccBndlGrp,
- infra:AccPortGrp)
+ description: Manage fabric interface policy leaf policy groups (infra:AccBndlGrp
+ and infra:AccPortGrp)
name: aci_interface_policy_leaf_policy_group
namespace: ''
version_added: null
@@ -604,6 +789,12 @@ plugins:
name: aci_interface_policy_ospf
namespace: ''
version_added: null
+ aci_interface_policy_pim:
+ description: Manage Protocol-Independent Multicast (PIM) interface policies
+ (pim:IfPol)
+ name: aci_interface_policy_pim
+ namespace: ''
+ version_added: null
aci_interface_policy_port_channel:
description: Manage port channel interface policies (lacp:LagPol)
name: aci_interface_policy_port_channel
@@ -624,29 +815,45 @@ plugins:
name: aci_interface_policy_spine_policy_group
namespace: ''
version_added: null
+ aci_interface_policy_storm_control:
+ description: Manage Storm Control interface policies (stormctrl:IfPol)
+ name: aci_interface_policy_storm_control
+ namespace: ''
+ version_added: null
aci_interface_selector_to_switch_policy_leaf_profile:
description: Bind interface selector profiles to switch policy leaf profiles
(infra:RsAccPortP)
name: aci_interface_selector_to_switch_policy_leaf_profile
namespace: ''
version_added: null
+ aci_key_policy:
+ description: Manage Key Policy (fv:KeyPol)
+ name: aci_key_policy
+ namespace: ''
+ version_added: null
+ aci_keychain_policy:
+ description: Manage KeyChain Policy (fv:KeyChainPol)
+ name: aci_keychain_policy
+ namespace: ''
+ version_added: null
aci_l2out:
- description: Manage Layer2 Out (L2Out) objects.
+ description: Manage Layer2 Out (L2Out) objects (l2ext:Out)
name: aci_l2out
namespace: ''
version_added: null
aci_l2out_extepg:
- description: Manage External Network Instance (L2Out External EPG) objects (l2extInstP).
+ description: Manage External Network Instance (L2Out External EPG) objects (l2ext:InstP).
name: aci_l2out_extepg
namespace: ''
version_added: null
aci_l2out_extepg_to_contract:
- description: Bind Contracts to L2 External End Point Groups (EPGs)
+ description: Bind Contracts to L2 External End Point Groups (EPGs) (fv:RsCons
+ and fv:RsProv)
name: aci_l2out_extepg_to_contract
namespace: ''
version_added: null
aci_l2out_logical_interface_path:
- description: Manage Layer 2 Outside (L2Out) logical interface path (l2extRsPathL2OutAtt)
+ description: Manage Layer 2 Outside (L2Out) logical interface path (l2ext:RsPathL2OutAtt)
name: aci_l2out_logical_interface_path
namespace: ''
version_added: null
@@ -665,8 +872,18 @@ plugins:
name: aci_l3out
namespace: ''
version_added: null
+ aci_l3out_bfd_interface_profile:
+ description: Manage L3Out BFD Interface profiles (bfd:IfP)
+ name: aci_l3out_bfd_interface_profile
+ namespace: ''
+ version_added: null
+ aci_l3out_bfd_multihop_interface_profile:
+ description: Manage BFD Multihop Interface profiles (bfd:MhIfP)
+ name: aci_l3out_bfd_multihop_interface_profile
+ namespace: ''
+ version_added: null
aci_l3out_bgp_peer:
- description: Manage Layer 3 Outside (L3Out) BGP Peers (bgp:PeerP)
+ description: Manage Layer 3 Outside (L3Out) BGP Peers (bgp:PeerP and bgp:InfraPeerP)
name: aci_l3out_bgp_peer
namespace: ''
version_added: null
@@ -675,21 +892,69 @@ plugins:
name: aci_l3out_bgp_protocol_profile
namespace: ''
version_added: null
+ aci_l3out_dhcp_relay_label:
+ description: Manage Layer 3 Outside (L3Out) DHCP Relay Label (dhcp:Lbl)
+ name: aci_l3out_dhcp_relay_label
+ namespace: ''
+ version_added: null
+ aci_l3out_eigrp_interface_profile:
+ description: Manage Layer 3 Outside (L3Out) EIGRP interface profile (eigrp:IfP)
+ name: aci_l3out_eigrp_interface_profile
+ namespace: ''
+ version_added: null
aci_l3out_extepg:
description: Manage External Network Instance Profile (ExtEpg) objects (l3extInstP:instP)
name: aci_l3out_extepg
namespace: ''
version_added: null
aci_l3out_extepg_to_contract:
- description: Bind Contracts to External End Point Groups (EPGs)
+ description: Bind Contracts to External End Point Groups (EPGs) (fv:RsCons,
+ fv:RsProv, fv:RsProtBy, fv:RsConsIf, and fv:RsIntraEpg)
name: aci_l3out_extepg_to_contract
namespace: ''
version_added: null
aci_l3out_extsubnet:
- description: Manage External Subnet objects (l3extSubnet:extsubnet)
+ description: Manage External Subnet objects (l3ext:Subnet)
name: aci_l3out_extsubnet
namespace: ''
version_added: null
+ aci_l3out_floating_svi:
+ description: Manage Layer 3 Outside (L3Out) interfaces (l3ext:VirtualLIfP)
+ name: aci_l3out_floating_svi
+ namespace: ''
+ version_added: null
+ aci_l3out_floating_svi_path:
+ description: Manage Layer 3 Outside (L3Out) Floating SVI Path Attributes (l3ext:RsDynPathAtt)
+ name: aci_l3out_floating_svi_path
+ namespace: ''
+ version_added: null
+ aci_l3out_floating_svi_path_secondary_ip:
+ description: Manages Layer 3 Outside (L3Out) Floating SVI Path Attribute's Secondary
+ IP addresses (l3ext:Ip)
+ name: aci_l3out_floating_svi_path_secondary_ip
+ namespace: ''
+ version_added: null
+ aci_l3out_floating_svi_secondary_ip:
+ description: Manages Layer 3 Outside (L3Out) Floating SVI Secondary IP addresses
+ (l3ext:Ip)
+ name: aci_l3out_floating_svi_secondary_ip
+ namespace: ''
+ version_added: null
+ aci_l3out_hsrp_group:
+ description: Manage HSRP group (hsrp:GroupP) of the HSRP interface profile (hsrp:IfP)
+ name: aci_l3out_hsrp_group
+ namespace: ''
+ version_added: null
+ aci_l3out_hsrp_interface_profile:
+ description: Manages Layer 3 Outside (L3Out) HSRP interface profile (hsrp:IfP)
+ name: aci_l3out_hsrp_interface_profile
+ namespace: ''
+ version_added: null
+ aci_l3out_hsrp_secondary_vip:
+ description: Manage HSRP Secondary Virtual IP of a HSRP group (hsrp:SecVip)
+ name: aci_l3out_hsrp_secondary_vip
+ namespace: ''
+ version_added: null
aci_l3out_interface:
description: Manage Layer 3 Outside (L3Out) interfaces (l3ext:RsPathL3OutAtt)
name: aci_l3out_interface
@@ -697,7 +962,7 @@ plugins:
version_added: null
aci_l3out_interface_secondary_ip:
description: Manage Layer 3 Outside (L3Out) interface secondary IP addresses
- (l3ext:Ip).
+ (l3ext:Ip)
name: aci_l3out_interface_secondary_ip
namespace: ''
version_added: null
@@ -707,8 +972,7 @@ plugins:
namespace: ''
version_added: null
aci_l3out_logical_interface_profile_ospf_policy:
- description: Manage Layer 3 Outside (L3Out) logical interface profile (l3ext:LIfP)
- OSPF policy (ospfIfP)
+ description: Manage Layer 3 Outside (L3Out) OSPF interface profile (ospf:IfP)
name: aci_l3out_logical_interface_profile_ospf_policy
namespace: ''
version_added: null
@@ -742,6 +1006,12 @@ plugins:
name: aci_l3out_static_routes_nexthop
namespace: ''
version_added: null
+ aci_l3out_to_sr_mpls_infra_l3out:
+ description: Manage Layer 3 Outside (L3Out) to SR-MPLS Infra L3Outs objects
+ (l3ext:ConsLbl)
+ name: aci_l3out_to_sr_mpls_infra_l3out
+ namespace: ''
+ version_added: null
aci_maintenance_group:
description: This creates an ACI maintenance group (maint:MaintGrp)
name: aci_maintenance_group
@@ -778,7 +1048,7 @@ plugins:
namespace: ''
version_added: null
aci_match_route_destination:
- description: Manage Match action rule term based on the Route Destination. (rtctrl:MatchRtDest)
+ description: Manage Match action rule term based on the Route Destination (rtctrl:MatchRtDest)
name: aci_match_route_destination
namespace: ''
version_added: null
@@ -787,21 +1057,71 @@ plugins:
name: aci_match_rule
namespace: ''
version_added: null
+ aci_netflow_exporter_policy:
+ description: Manage Netflow Exporter Policy (netflow:ExporterPol)
+ name: aci_netflow_exporter_policy
+ namespace: ''
+ version_added: null
+ aci_netflow_monitor_policy:
+ description: Manage Netflow Monitor Policy (netflow:MonitorPol)
+ name: aci_netflow_monitor_policy
+ namespace: ''
+ version_added: null
+ aci_netflow_monitor_to_exporter:
+ description: Manage Netflow Monitor to Exporter (netflow:RsMonitorToExporter)
+ name: aci_netflow_monitor_to_exporter
+ namespace: ''
+ version_added: null
+ aci_netflow_record_policy:
+ description: Manage Netflow Record Policy (netflow:RecordPol)
+ name: aci_netflow_record_policy
+ namespace: ''
+ version_added: null
+ aci_node_block:
+ description: Manage Node Block (infra:NodeBlk)
+ name: aci_node_block
+ namespace: ''
+ version_added: null
aci_node_mgmt_epg:
- description: In band or Out of band management EPGs
+ description: In band or Out of band management EPGs (mgmt:OoB and mgmt:InB)
name: aci_node_mgmt_epg
namespace: ''
version_added: null
aci_ntp_policy:
- description: Manage NTP policies.
+ description: Manage NTP policies (datetime:Pol)
name: aci_ntp_policy
namespace: ''
version_added: null
aci_ntp_server:
- description: Manage NTP servers.
+ description: Manage NTP servers (datetime:NtpProv)
name: aci_ntp_server
namespace: ''
version_added: null
+ aci_pim_route_map_entry:
+ description: Manage Protocol-Independent Multicast (PIM) Route Map Entry (pim:RouteMapEntry)
+ name: aci_pim_route_map_entry
+ namespace: ''
+ version_added: null
+ aci_pim_route_map_policy:
+ description: Manage Protocol-Independent Multicast (PIM) Route Map Policy (pim:RouteMapPol)
+ name: aci_pim_route_map_policy
+ namespace: ''
+ version_added: null
+ aci_qos_custom_policy:
+ description: Manage QoS Custom Policy (qos:CustomPol)
+ name: aci_qos_custom_policy
+ namespace: ''
+ version_added: null
+ aci_qos_dot1p_class:
+ description: Manage QoS Dot1P Class (qos:Dot1PClass)
+ name: aci_qos_dot1p_class
+ namespace: ''
+ version_added: null
+ aci_qos_dscp_class:
+ description: Manage QoS DSCP Class (qos:DscpClass)
+ name: aci_qos_dscp_class
+ namespace: ''
+ version_added: null
aci_rest:
description: Direct access to the Cisco APIC REST API
name: aci_rest
@@ -818,27 +1138,27 @@ plugins:
namespace: ''
version_added: null
aci_snmp_client:
- description: Manage SNMP clients (snmp:ClientP).
+ description: Manage SNMP clients (snmp:ClientP)
name: aci_snmp_client
namespace: ''
version_added: null
aci_snmp_client_group:
- description: Manage SNMP client groups (snmp:ClientGrpP).
+ description: Manage SNMP client groups (snmp:ClientGrpP)
name: aci_snmp_client_group
namespace: ''
version_added: null
aci_snmp_community_policy:
- description: Manage SNMP community policies (snmp:CommunityP).
+ description: Manage SNMP community policies (snmp:CommunityP)
name: aci_snmp_community_policy
namespace: ''
version_added: null
aci_snmp_policy:
- description: Manage Syslog groups (snmp:Pol).
+ description: Manage Syslog groups (snmp:Pol)
name: aci_snmp_policy
namespace: ''
version_added: null
aci_snmp_user:
- description: Manage SNMP v3 Users (snmp:UserP).
+ description: Manage SNMP v3 Users (snmp:UserP)
name: aci_snmp_user
namespace: ''
version_added: null
@@ -848,13 +1168,19 @@ plugins:
namespace: ''
version_added: null
aci_static_node_mgmt_address:
- description: In band or Out of band management IP address
+ description: In band or Out of band management IP address (mgmt:RsOoBStNode
+ and mgmt:RsInBStNode)
name: aci_static_node_mgmt_address
namespace: ''
version_added: null
+ aci_subject_label:
+ description: Manage Subject Labels (vz:ConsSubjLbl and vz:ProvSubjLbl)
+ name: aci_subject_label
+ namespace: ''
+ version_added: null
aci_switch_leaf_selector:
description: Bind leaf selectors to switch policy leaf profiles (infra:LeafS,
- infra:NodeBlk, infra:RsAccNodePGrep)
+ infra:NodeBlk, and infra:RsAccNodePGrep)
name: aci_switch_leaf_selector
namespace: ''
version_added: null
@@ -864,19 +1190,19 @@ plugins:
namespace: ''
version_added: null
aci_switch_policy_vpc_protection_group:
- description: Manage switch policy explicit vPC protection groups (fabric:ExplicitGEp,
- fabric:NodePEp).
+ description: Manage switch policy explicit vPC protection groups (fabric:ExplicitGEp
+ and fabric:NodePEp).
name: aci_switch_policy_vpc_protection_group
namespace: ''
version_added: null
aci_syslog_group:
description: Manage Syslog groups (syslog:Group, syslog:Console, syslog:File
- and syslog:Prof).
+ and syslog:Prof)
name: aci_syslog_group
namespace: ''
version_added: null
aci_syslog_remote_dest:
- description: Manage Syslog Remote Destinations (syslog:RemoteDest).
+ description: Manage Syslog Remote Destinations (syslog:RemoteDest)
name: aci_syslog_remote_dest
namespace: ''
version_added: null
@@ -912,7 +1238,7 @@ plugins:
namespace: ''
version_added: null
aci_tag:
- description: Tagging of ACI objects
+ description: Tagging of ACI objects (tag:Annotation, tag:Inst, and tag:Tag)
name: aci_tag
namespace: ''
version_added: null
@@ -982,7 +1308,7 @@ plugins:
namespace: ''
version_added: null
aci_vmm_vswitch_policy:
- description: Manage vSwitch policy for VMware virtual domains profiles (vmm:DomP)
+ description: Manage vSwitch policy for VMware virtual domains profiles (vmm:VSwitchPolicyCont)
name: aci_vmm_vswitch_policy
namespace: ''
version_added: null
@@ -996,8 +1322,14 @@ plugins:
name: aci_vrf_leak_internal_subnet
namespace: ''
version_added: null
+ aci_vrf_multicast:
+ description: Manage VRF Multicast objects (pim:CtxP)
+ name: aci_vrf_multicast
+ namespace: ''
+ version_added: null
aci_vzany_to_contract:
- description: Attach contracts to vzAny (vz:RsAnyToProv, vz:RsAnyToCons, vz:RsAnyToConsIf)
+ description: Attach contracts to vzAny (vz:RsAnyToProv, vz:RsAnyToCons, and
+ vz:RsAnyToConsIf)
name: aci_vzany_to_contract
namespace: ''
version_added: null
@@ -1006,4 +1338,4 @@ plugins:
strategy: {}
test: {}
vars: {}
-version: 2.8.0
+version: 2.9.0
diff --git a/ansible_collections/cisco/aci/changelogs/changelog.yaml b/ansible_collections/cisco/aci/changelogs/changelog.yaml
index ae1c6a3f5..9070ec916 100644
--- a/ansible_collections/cisco/aci/changelogs/changelog.yaml
+++ b/ansible_collections/cisco/aci/changelogs/changelog.yaml
@@ -459,3 +459,101 @@ releases:
"
release_date: "2023-11-04"
+ 2.9.0:
+ changes:
+ bugfixes:
+ - Fix auto logout issue in aci connection plugin to keep connection active between
+ tasks
+ - Fix idempotency for l3out configuration when l3protocol is used in aci_l3out
+ - Fix issues with new attributes in aci_interface_policy_leaf_policy_group module
+ by adding conditions to include attributes in the payload only when they are
+ specified by the user (#578)
+ - Fix query in aci_vmm_controller
+ minor_changes:
+ - Add Authentification option for EIGRP interface profile.
+ - Add L3out Floating SVI modules (aci_l3out_floating_svi, aci_l3out_floating_svi_path,
+ aci_l3out_floating_svi_path_secondary_ip and aci_l3out_floating_svi_secondary_ip)
+ (#478)
+ - Add No-verification flag option to reduce the number of API calls. If true,
+ a verifying GET will not be sent after a POST update to APIC
+ - Add access spine interface selector and port block binding in aci_access_port_block_to_access_port
+ - Add aci_access_spine_interface_selector module
+ - Add aci_action_rule_additional_communities module
+ - Add aci_action_rule_set_as_path and aci_action_rule_set_as_path_asn modules
+ - Add aci_bgp_peer_prefix_policy, aci_bgp_route_summarization_policy and aci_bgp_address_family_context_policy
+ modules
+ - Add aci_fabric_pod, aci_fabric_pod_external_tep, aci_fabric_pod_profile, aci_fabric_pod_remote_pool
+ modules (#558)
+ - Add aci_hsrp_interface_policy, aci_l3out_hsrp_group, aci_l3out_hsrp_interface_profile
+ and aci_l3out_hsrp_secondary_vip modules (#505)
+ - Add aci_interface_policy_eigrp (class:eigrpIfPol) module
+ - Add aci_interface_policy_pim module
+ - Add aci_interface_policy_storm_control module
+ - Add aci_keychain_policy and aci_key_policy modules
+ - Add aci_l3out_bfd_multihop_interface_profile, aci_l3out_bfd_interface_profile,
+ aci_interface_policy_bfd_multihop, aci_interface_policy_bfd and aci_bfd_multihop_node_policy
+ modules (#492)
+ - Add aci_l3out_dhcp_relay_label, aci_dhcp_option_policy and aci_dhcp_option
+ modules
+ - Add aci_l3out_eigrp_interface_profile module
+ - Add aci_listify filter plugin to flattens nested dictionaries
+ - Add aci_netflow_exporter_policy module
+ - Add aci_netflow_monitor_policy and aci_netflow_record_policy modules
+ - Add aci_netflow_monitor_to_exporter module
+ - Add aci_node_block module
+ - Add aci_pim_route_map_policy and aci_pim_route_map_entry modules
+ - Add aci_qos_custom_policy and aci_qos_dscp_class modules
+ - Add aci_qos_dot1p_class module
+ - Add action rules attributes to aci_tenant_action_rule_profile.
+ - Add auto to speed attribute options in aci_interface_policy_link_level module
+ (#577)
+ - Add missing options to aci_bd module
+ - Add modules aci_bd_to_netflow_monitor_policy and aci_bd_rogue_exception_mac
+ (#600)
+ - Add modules for Fabric External Connection Policies and its childs
+ - Add option to set delimiter to _ in aci_epg_to_domain module
+ - Add qos_custom_policy, pim_interface_policy and igmp_interface_policy as new
+ child_classes for aci_l3out_logical_interface_profile.
+ - Add support for annotation in aci_rest module (#437)
+ - Add support for block statements in useg attributes with the aci_epg_useg_attribute_block_statement
+ module
+ - Add support for configuration of access switch policy groups with aci_access_switch_policy_group
+ module
+ - Add support for configuration of certificate authorities in aci_aaa_certificate_authority
+ - Add support for configuration of fabric management access policies in aci_fabric_management_access
+ - Add support for configuration of vrf multicast with aci_vrf_multicast module
+ - Add support for configuring Azure cloud subnets using the aci_cloud_subnet
+ module
+ - Add support for encap scope in aci_l3out_interface
+ - Add support for https ssl cipher configuration in aci_fabric_management_access_https_cipher
+ - Add support for infra l3out nodes bgp-evpn loopback, mpls transport loopback
+ and segment id in aci_l3out_logical_node
+ - Add support for infra sr mpls micro bfd in aci_l3out_interface
+ - Add support for intra epg, taboo, and contract interface in aci_epg_to_contract
+ - Add support for key ring configuration in aci_aaa_key_ring
+ - Add support for mac and description in aci_l3out_interface
+ - Add support for mpls custom qos policy for infra sr mpls l3outs node profiles
+ in aci_l3out_logical_node_profile
+ - Add support for security default settings configuration in aci_aaa_security_default_settings
+ - Add support for simple statements in useg attributes with the aci_epg_useg_attribute_simple_statement
+ module
+ - Add support for sr-mpls bgpInfraPeerP and bgp_password in aci_l3out_bgp_peer
+ module (#543)
+ - Add support for sr-mpls in aci_l3out module
+ - Add support for sr-mpls l3out to infra l3out in aci_l3out_to_sr_mpls_infra_l3out
+ - Add support for subject labels for EPG, EPG Contract, ESG, Contract Subject,
+ L2Out External EPG, L3out External EPG, and L3out External EPG Contract with
+ the aci_subject_label module
+ - Add support for taboo contract, contract interface and intra_epg contract
+ in aci_l3out_extepg_to_contract
+ - Add support for useg default block statement configuration for useg epg in
+ aci_epg
+ - Modify child class node block conditions to be optional in aci_switch_leaf_selector
+ release_summary:
+ "Release v2.9.0 of the ``ansible-aci`` collection on 2024-04-06.
+
+ This changelog describes all changes made to the modules and plugins included
+ in this collection since v2.8.0.
+
+ "
+ release_date: "2024-04-06"
diff --git a/ansible_collections/cisco/aci/meta/runtime.yml b/ansible_collections/cisco/aci/meta/runtime.yml
index 9dcf11ce2..945315643 100644
--- a/ansible_collections/cisco/aci/meta/runtime.yml
+++ b/ansible_collections/cisco/aci/meta/runtime.yml
@@ -1,10 +1,13 @@
---
-requires_ansible: '>=2.9.10'
+requires_ansible: '>=2.14.0'
action_groups:
all:
+ - aci_aaa_certificate_authority
- aci_aaa_custom_privilege
- aci_aaa_domain
+ - aci_aaa_key_ring
- aci_aaa_role
+ - aci_aaa_security_default_settings
- aci_aaa_ssh_auth
- aci_aaa_user
- aci_aaa_user_certificate
@@ -18,16 +21,31 @@ action_groups:
- aci_access_span_src_group
- aci_access_span_src_group_src
- aci_access_span_src_group_src_path
+ - aci_access_spine_interface_profile
+ - aci_access_spine_interface_profile_to_spine_switch_profile
+ - aci_access_spine_interface_selector
+ - aci_access_spine_switch_profile
+ - aci_access_spine_switch_selector
- aci_access_sub_port_block_to_access_port
+ - aci_access_switch_policy_group
+ - aci_action_rule_additional_communities
+ - aci_action_rule_set_as_path
+ - aci_action_rule_set_as_path_asn
- aci_aep
- aci_aep_to_domain
- aci_aep_to_epg
- aci_ap
- aci_bd
- aci_bd_dhcp_label
+ - aci_bd_rogue_exception_mac
- aci_bd_subnet
- aci_bd_to_l3out
+ - aci_bd_to_netflow_monitor_policy
+ - aci_bfd_multihop_node_policy
+ - aci_bgp_address_family_context_policy
- aci_bgp_best_path_policy
+ - aci_bgp_peer_prefix_policy
+ - aci_bgp_route_summarization_policy
- aci_bgp_rr_asn
- aci_bgp_rr_node
- aci_bgp_timers_policy
@@ -54,6 +72,8 @@ action_groups:
- aci_contract_subject
- aci_contract_subject_to_filter
- aci_contract_subject_to_service_graph
+ - aci_dhcp_option
+ - aci_dhcp_option_policy
- aci_dhcp_relay
- aci_dhcp_relay_provider
- aci_dns_domain
@@ -71,17 +91,28 @@ action_groups:
- aci_epg_to_contract_interface
- aci_epg_to_contract_master
- aci_epg_to_domain
+ - aci_epg_useg_attribute_block_statement
+ - aci_epg_useg_attribute_simple_statement
- aci_esg
- aci_esg_contract_master
- aci_esg_epg_selector
- aci_esg_ip_subnet_selector
- aci_esg_tag_selector
+ - aci_fabric_external_connection_profile
+ - aci_fabric_external_routing_profile
- aci_fabric_interface_policy_group
- aci_fabric_leaf_profile
- aci_fabric_leaf_switch_assoc
+ - aci_fabric_management_access
+ - aci_fabric_management_access_https_cipher
- aci_fabric_node
- aci_fabric_node_control
+ - aci_fabric_pod
+ - aci_fabric_pod_connectivity_profile
+ - aci_fabric_pod_external_tep
- aci_fabric_pod_policy_group
+ - aci_fabric_pod_profile
+ - aci_fabric_pod_remote_pool
- aci_fabric_pod_selector
- aci_fabric_scheduler
- aci_fabric_span_dst_group
@@ -105,8 +136,12 @@ action_groups:
- aci_interface_blacklist
- aci_interface_config
- aci_interface_description
+ - aci_interface_policy_bfd
+ - aci_interface_policy_bfd_multihop
- aci_interface_policy_cdp
+ - aci_interface_policy_eigrp
- aci_interface_policy_fc
+ - aci_interface_policy_hsrp
- aci_interface_policy_l2
- aci_interface_policy_leaf_breakout_port_group
- aci_interface_policy_leaf_fc_policy_group
@@ -117,11 +152,15 @@ action_groups:
- aci_interface_policy_lldp
- aci_interface_policy_mcp
- aci_interface_policy_ospf
+ - aci_interface_policy_pim
- aci_interface_policy_port_channel
- aci_interface_policy_port_security
- aci_interface_policy_spanning_tree
- aci_interface_policy_spine_policy_group
+ - aci_interface_policy_storm_control
- aci_interface_selector_to_switch_policy_leaf_profile
+ - aci_key_policy
+ - aci_keychain_policy
- aci_l2out
- aci_l2out_extepg
- aci_l2out_extepg_to_contract
@@ -129,11 +168,22 @@ action_groups:
- aci_l2out_logical_interface_profile
- aci_l2out_logical_node_profile
- aci_l3out
+ - aci_l3out_bfd_interface_profile
+ - aci_l3out_bfd_multihop_interface_profile
- aci_l3out_bgp_peer
- aci_l3out_bgp_protocol_profile
+ - aci_l3out_dhcp_relay_label
+ - aci_l3out_eigrp_interface_profile
- aci_l3out_extepg
- aci_l3out_extepg_to_contract
- aci_l3out_extsubnet
+ - aci_l3out_floating_svi
+ - aci_l3out_floating_svi_path
+ - aci_l3out_floating_svi_path_secondary_ip
+ - aci_l3out_floating_svi_secondary_ip
+ - aci_l3out_hsrp_group
+ - aci_l3out_hsrp_interface_profile
+ - aci_l3out_hsrp_secondary_vip
- aci_l3out_interface
- aci_l3out_interface_secondary_ip
- aci_l3out_logical_interface_profile
@@ -144,6 +194,7 @@ action_groups:
- aci_l3out_route_tag_policy
- aci_l3out_static_routes
- aci_l3out_static_routes_nexthop
+ - aci_l3out_to_sr_mpls_infra_l3out
- aci_maintenance_group
- aci_maintenance_group_node
- aci_maintenance_policy
@@ -153,9 +204,19 @@ action_groups:
- aci_match_community_term
- aci_match_route_destination
- aci_match_rule
+ - aci_netflow_exporter_policy
+ - aci_netflow_monitor_policy
+ - aci_netflow_monitor_to_exporter
+ - aci_netflow_record_policy
+ - aci_node_block
- aci_node_mgmt_epg
- aci_ntp_policy
- aci_ntp_server
+ - aci_pim_route_map_entry
+ - aci_pim_route_map_policy
+ - aci_qos_custom_policy
+ - aci_qos_dot1p_class
+ - aci_qos_dscp_class
- aci_rest
- aci_route_control_context
- aci_route_control_profile
@@ -166,6 +227,7 @@ action_groups:
- aci_snmp_user
- aci_static_binding_to_epg
- aci_static_node_mgmt_address
+ - aci_subject_label
- aci_switch_leaf_selector
- aci_switch_policy_leaf_profile
- aci_switch_policy_vpc_protection_group
@@ -194,4 +256,5 @@ action_groups:
- aci_vmm_vswitch_policy
- aci_vrf
- aci_vrf_leak_internal_subnet
+ - aci_vrf_multicast
- aci_vzany_to_contract
diff --git a/ansible_collections/cisco/aci/plugins/doc_fragments/aci.py b/ansible_collections/cisco/aci/plugins/doc_fragments/aci.py
index e6b18a289..aaedff669 100644
--- a/ansible_collections/cisco/aci/plugins/doc_fragments/aci.py
+++ b/ansible_collections/cisco/aci/plugins/doc_fragments/aci.py
@@ -2,6 +2,7 @@
# Copyright: (c) 2017, Dag Wieers (@dagwieers) <dag@wieers.com>
# Copyright: (c) 2017, Swetha Chunduri (@schunduri)
+# Copyright: (c) 2024, Samita Bhattacharjee (@samiib) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -94,6 +95,15 @@ options:
- Path to a file that will be used to dump the ACI JSON configuration objects generated by the module.
- If the value is not specified in the task, the value of environment variable C(ACI_OUTPUT_PATH) will be used instead.
type: str
+ suppress_verification:
+ description:
+ - If C(true), a verifying GET will not be sent after a POST update to APIC.
+ - If the value is not specified in the task, the value of environment variable C(ACI_NO_VERIFICATION) will be used instead.
+ - The default value is C(false).
+ - WARNING - This causes the current return value to be set to the proposed value.
+ - The current object including default values will be unverifiable in a single task.
+ type: bool
+ aliases: [ no_verification, no_verify, suppress_verify ]
seealso:
- ref: aci_guide
description: Detailed information on how to manage your ACI infrastructure using Ansible.
diff --git a/ansible_collections/cisco/aci/plugins/filter/listify.py b/ansible_collections/cisco/aci/plugins/filter/listify.py
new file mode 100644
index 000000000..2bb090b25
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/filter/listify.py
@@ -0,0 +1,295 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2017, Ramses Smeyers <rsmeyers@cisco.com>
+# Copyright: (c) 2023, Shreyas Srish <ssrish@cisco.com>
+# Copyright: (c) 2024, Akini Ross <akinross@cisco.com>
+# 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
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+ name: aci_listify
+ short_description: Flattens the nested dictionaries representing the ACI model data.
+ description:
+ - This filter flattens and transforms the input data into a list.
+ - See the Examples section below.
+ options:
+ data:
+ description: This option represents the ACI model data which is a list of dictionaries or a dictionary with any level of nesting data.
+ type: raw
+ required: True
+ keys:
+ description: Comma separated keys of type string denoting the ACI objects.
+ required: True
+"""
+
+EXAMPLES = r"""
+- name: Set vars
+ ansible.builtin.set_fact:
+ data:
+ tenant:
+ - name: ansible_test
+ description: Created using listify
+ app:
+ - name: app_test
+ epg:
+ - name: web
+ bd: web_bd
+ - name: app
+ bd: app_bd
+ bd:
+ - name: bd_test
+ subnet:
+ - name: 10.10.10.1
+ mask: 24
+ scope:
+ - public
+ - shared
+ vrf: vrf_test
+ - name: bd_test2
+ subnet:
+ - name: 20.20.20.1
+ mask: 24
+ scope: public
+ vrf: vrf_test
+ vrf:
+ - name: vrf_test
+ policies:
+ protocol:
+ bfd:
+ - name: BFD-ON
+ description: Enable BFD
+ admin_state: enabled
+ detection_multiplier: 3
+ min_tx_interval: 50
+ min_rx_interval: 50
+ echo_rx_interval: 50
+ echo_admin_state: enabled
+ sub_interface_optimization_state: enabled
+ ospf:
+ interface:
+ - name: OSPF-P2P-IntPol
+ network_type: p2p
+ priority: 1
+ - name: OSPF-Broadcast-IntPol
+ network_type: bcast
+ priority: 1
+
+- name: Create tenants
+ cisco.aci.aci_tenant:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: '{{ item.tenant_name }}'
+ description: '{{ item.tenant_description }}'
+ with_items: '{{ data|cisco.aci.aci_listify("tenant") }}'
+
+- name: Create VRFs
+ cisco.aci.aci_vrf:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: '{{ item.tenant_name }}'
+ vrf_name: '{{ item.tenant_vrf_name }}'
+ with_items: '{{ data|cisco.aci.aci_listify("tenant","vrf") }}'
+
+- name: Create BDs
+ cisco.aci.aci_bd:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: '{{ item.tenant_name }}'
+ vrf: '{{ item.tenant_bd_vrf }}'
+ bd: '{{ item.tenant_bd_name }}'
+ enable_routing: yes
+ with_items: '{{ data|cisco.aci.aci_listify("tenant","bd") }}'
+
+- name: Create BD subnets
+ cisco.aci.aci_bd_subnet:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: '{{ item.tenant_name }}'
+ bd: '{{ item.tenant_bd_name }}'
+ gateway: '{{ item.tenant_bd_subnet_name }}'
+ mask: '{{ item.tenant_bd_subnet_mask }}'
+ scope: '{{ item.tenant_bd_subnet_scope }}'
+ with_items: '{{ data|cisco.aci.aci_listify("tenant","bd","subnet") }}'
+
+- name: Create APs
+ cisco.aci.aci_ap:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: '{{ item.tenant_name }}'
+ app_profile: '{{ item.tenant_app_name }}'
+ with_items: '{{ data|cisco.aci.aci_listify("tenant","app") }}'
+
+- name: Create EPGs
+ cisco.aci.aci_epg:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: '{{ item.tenant_name }}'
+ app_profile: '{{ item.tenant_app_name }}'
+ epg: '{{ item.tenant_app_epg_name }}'
+ bd: '{{ item.tenant_app_epg_bd }}'
+ with_items: '{{ data|cisco.aci.aci_listify("tenant","app","epg") }}'
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+# This function takes a dictionary and a series of keys,
+# and returns a list of dictionaries using recursive helper function 'listify_worker'
+def listify(d, *keys):
+ return list(listify_worker(d, keys, 0, {}, ""))
+
+
+# This function walks through a dictionary 'd', depth-first,
+# using the keys provided, and generates a new dictionary for each key:value pair encountered
+def listify_worker(d, keys, depth, cache, prefix):
+ # The prefix in the code is used to store the path of keys traversed in the nested dictionary,
+ # which helps to generate unique keys for each value when flattening the dictionary.
+ prefix += keys[depth] + "_"
+
+ if keys[depth] in d:
+ for item in d[keys[depth]]:
+ cache_work = cache.copy()
+ if isinstance(item, dict):
+ for k, v in item.items():
+ if isinstance(v, list) and all(isinstance(x, (str, int, float, bool, bytes)) for x in v) or not isinstance(v, (dict, list)):
+ # The cache in this code is a temporary storage that holds key-value pairs as the function navigates through the nested dictionary.
+ # It helps to generate the final output by remembering the traversed path in each recursive call.
+ cache_key = prefix + k
+ cache_value = v
+ cache_work[cache_key] = cache_value
+ # If we're at the deepest level of keys
+ if len(keys) - 1 == depth:
+ yield cache_work
+ else:
+ for k, v in item.items():
+ if k == keys[depth + 1] and isinstance(v, (dict, list)):
+ for result in listify_worker({k: v}, keys, depth + 1, cache_work, prefix):
+ yield result
+ # Conditional to support nested dictionaries which are detected by item is string
+ elif isinstance(item, str) and isinstance(d[keys[depth]], dict):
+ for result in listify_worker({item: d[keys[depth]][item]}, keys, depth + 1, cache_work, prefix):
+ yield result
+
+
+class FilterModule(object):
+ """Ansible core jinja2 filters"""
+
+ def filters(self):
+ return {
+ "aci_listify": listify,
+ }
diff --git a/ansible_collections/cisco/aci/plugins/httpapi/aci.py b/ansible_collections/cisco/aci/plugins/httpapi/aci.py
index a0474576a..dfab2c14e 100644
--- a/ansible_collections/cisco/aci/plugins/httpapi/aci.py
+++ b/ansible_collections/cisco/aci/plugins/httpapi/aci.py
@@ -102,19 +102,6 @@ class HttpApi(HttpApiBase):
exc_login.path = path
raise
- def logout(self):
- method = "POST"
- path = "/api/aaaLogout.json"
- payload = {"aaaUser": {"attributes": {"name": self.connection.get_option("remote_user")}}}
- data = json.dumps(payload)
- try:
- response, response_data = self.connection.send(path, data, method=method)
- except Exception as exc_logout:
- msg = "Error on attempt to logout from APIC. {0}".format(exc_logout)
- raise ConnectionError(self._return_info("", method, path, msg))
- self.connection._auth = None
- self._verify_response(response, method, path, response_data)
-
def set_parameters(self):
connection_parameters = {}
for key in CONNECTION_KEYS:
diff --git a/ansible_collections/cisco/aci/plugins/module_utils/aci.py b/ansible_collections/cisco/aci/plugins/module_utils/aci.py
index 9c6e2db2d..88b49cd6e 100644
--- a/ansible_collections/cisco/aci/plugins/module_utils/aci.py
+++ b/ansible_collections/cisco/aci/plugins/module_utils/aci.py
@@ -15,6 +15,8 @@
# Copyright: (c) 2020, Anvitha Jain (@anvitha-jain) <anvjain@cisco.com>
# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# Copyright: (c) 2023, Shreyas Srish (@shrsr) <ssrish@cisco.com>
+# Copyright: (c) 2023, Tim Cragg (@timcragg) <tcragg@cisco.com>
+# Copyright: (c) 2024, Samita Bhattacharjee (@samiib) <samitab@cisco.com>
# All rights reserved.
# Redistribution and use in source and binary forms, with or without modification,
@@ -134,6 +136,7 @@ def aci_argument_spec():
use_ssl=dict(type="bool", fallback=(env_fallback, ["ACI_USE_SSL"])),
validate_certs=dict(type="bool", fallback=(env_fallback, ["ACI_VALIDATE_CERTS"])),
output_path=dict(type="str", fallback=(env_fallback, ["ACI_OUTPUT_PATH"])),
+ suppress_verification=dict(type="bool", aliases=["no_verification", "no_verify", "suppress_verify"], fallback=(env_fallback, ["ACI_NO_VERIFICATION"])),
)
@@ -320,6 +323,64 @@ def integrate_url(httpapi_url, local_path):
return {"protocol": parse_url.scheme, "host": parse_url.netloc, "path": local_path}
+def action_rule_set_comm_spec():
+ return dict(
+ community=dict(type="str"),
+ criteria=dict(type="str", choices=["append", "none", "replace"]),
+ )
+
+
+def action_rule_set_dampening_spec():
+ return dict(
+ half_life=dict(type="int"),
+ max_suppress_time=dict(type="int"),
+ reuse=dict(type="int"),
+ suppress=dict(type="int"),
+ )
+
+
+def associated_netflow_exporter_epg_spec():
+ return dict(
+ tenant=dict(type="str"),
+ ap=dict(type="str"),
+ epg=dict(type="str"),
+ )
+
+
+def associated_netflow_exporter_extepg_spec():
+ return dict(
+ tenant=dict(type="str"),
+ l3out=dict(type="str"),
+ extepg=dict(type="str"),
+ )
+
+
+def associated_netflow_exporter_vrf_spec():
+ return dict(
+ tenant=dict(type="str"),
+ vrf=dict(type="str"),
+ )
+
+
+def pim_interface_profile_spec():
+ return dict(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ pim=dict(type="str", aliases=["pim_interface_policy", "name"]),
+ )
+
+
+def igmp_interface_profile_spec():
+ return dict(tenant=dict(type="str", aliases=["tenant_name"]), igmp=dict(type="str", aliases=["igmp_interface_policy", "name"]))
+
+
+def storm_control_policy_rate_spec():
+ return dict(
+ rate=dict(type="str"),
+ burst_rate=dict(type="str"),
+ rate_type=dict(type="str", choices=["percentage", "pps"], required=True),
+ )
+
+
class ACIModule(object):
def __init__(self, module):
self.module = module
@@ -356,6 +417,9 @@ class ACIModule(object):
self.imdata = None
self.totalCount = None
+ # get no verify flag
+ self.suppress_verification = self.params.get("suppress_verification")
+
# Ensure protocol is set
self.define_protocol()
@@ -779,8 +843,10 @@ class ACIModule(object):
subclass_3=None,
subclass_4=None,
subclass_5=None,
+ subclass_6=None,
child_classes=None,
config_only=True,
+ rsp_subtree="full",
):
"""
This method is used to retrieve the appropriate URL path and filter_string to make the request to the APIC.
@@ -796,6 +862,7 @@ class ACIModule(object):
:type subclass_3: dict
:type subclass_4: dict
:type subclass_5: dict
+ :type subclass_6: dict
:type child_classes: list
:return: The path and filter_string needed to build the full URL.
"""
@@ -806,7 +873,9 @@ class ACIModule(object):
else:
self.child_classes = set(child_classes)
- if subclass_5 is not None:
+ if subclass_6 is not None:
+ self._construct_url_7(root_class, subclass_1, subclass_2, subclass_3, subclass_4, subclass_5, subclass_6, config_only)
+ elif subclass_5 is not None:
self._construct_url_6(root_class, subclass_1, subclass_2, subclass_3, subclass_4, subclass_5, config_only)
elif subclass_4 is not None:
self._construct_url_5(root_class, subclass_1, subclass_2, subclass_3, subclass_4, config_only)
@@ -828,10 +897,12 @@ class ACIModule(object):
# Append child_classes to filter_string if filter string is empty
self.update_qs(
{
- "rsp-subtree": "full",
+ "rsp-subtree": rsp_subtree,
"rsp-subtree-class": ",".join(sorted(self.child_classes)),
}
)
+ elif rsp_subtree == "children":
+ self.update_qs({"rsp-subtree": rsp_subtree})
def _construct_url_1(self, obj, config_only=True):
"""
@@ -1077,7 +1148,7 @@ class ACIModule(object):
def _construct_url_6(self, root, quad, ter, sec, parent, obj, config_only=True):
"""
- This method is used by construct_url when the object is the fourth-level class.
+ This method is used by construct_url when the object is the fifth-level class.
"""
root_rn = root.get("aci_rn")
root_obj = root.get("module_object")
@@ -1145,6 +1216,85 @@ class ACIModule(object):
# Query for a specific object of the module's class
self.path = "api/mo/uni/{0}/{1}/{2}/{3}/{4}/{5}.json".format(root_rn, quad_rn, ter_rn, sec_rn, parent_rn, obj_rn)
+ def _construct_url_7(self, root, quin, quad, ter, sec, parent, obj, config_only=True):
+ """
+ This method is used by construct_url when the object is the sixth-level class.
+ """
+ root_rn = root.get("aci_rn")
+ root_obj = root.get("module_object")
+ quin_rn = quin.get("aci_rn")
+ quin_obj = quin.get("module_object")
+ quad_rn = quad.get("aci_rn")
+ quad_obj = quad.get("module_object")
+ ter_rn = ter.get("aci_rn")
+ ter_obj = ter.get("module_object")
+ sec_rn = sec.get("aci_rn")
+ sec_obj = sec.get("module_object")
+ parent_rn = parent.get("aci_rn")
+ parent_obj = parent.get("module_object")
+ obj_class = obj.get("aci_class")
+ obj_rn = obj.get("aci_rn")
+ obj_filter = obj.get("target_filter")
+ mo = obj.get("module_object")
+
+ if self.child_classes is None:
+ self.child_classes = [obj_class]
+
+ if self.module.params.get("state") in ("absent", "present"):
+ # State is absent or present
+ self.path = "api/mo/uni/{0}/{1}/{2}/{3}/{4}/{5}/{6}.json".format(root_rn, quin_rn, quad_rn, ter_rn, sec_rn, parent_rn, obj_rn)
+ if config_only:
+ self.update_qs({"rsp-prop-include": "config-only"})
+ self.obj_filter = obj_filter
+ # TODO: Add all missing cases
+ elif root_obj is None:
+ self.child_classes.add(obj_class)
+ self.path = "api/class/{0}.json".format(obj_class)
+ self.update_qs({"query-target-filter": self.build_filter(obj_class, obj_filter)})
+ elif quin_obj is None:
+ self.child_classes.add(obj_class)
+ self.path = "api/mo/uni/{0}.json".format(root_rn)
+ # NOTE: No need to select by root_filter
+ # self.update_qs({'query-target-filter': self.build_filter(root_class, root_filter)})
+ # TODO: Filter by quin_filter, parent and obj_filter
+ self.update_qs({"rsp-subtree-filter": self.build_filter(obj_class, obj_filter)})
+ elif quad_obj is None:
+ self.child_classes.add(obj_class)
+ self.path = "api/mo/uni/{0}/{1}.json".format(root_rn, quin_rn)
+ # NOTE: No need to select by root_filter
+ # self.update_qs({'query-target-filter': self.build_filter(root_class, root_filter)})
+ # TODO: Filter by quin_filter, parent and obj_filter
+ self.update_qs({"rsp-subtree-filter": self.build_filter(obj_class, obj_filter)})
+ elif ter_obj is None:
+ self.child_classes.add(obj_class)
+ self.path = "api/mo/uni/{0}/{1}/{2}.json".format(root_rn, quin_rn, quad_rn)
+ # NOTE: No need to select by quad_filter
+ # self.update_qs({'query-target-filter': self.build_filter(quin_class, quin_filter)})
+ # TODO: Filter by ter_filter, parent and obj_filter
+ self.update_qs({"rsp-subtree-filter": self.build_filter(obj_class, obj_filter)})
+ elif sec_obj is None:
+ self.child_classes.add(obj_class)
+ self.path = "api/mo/uni/{0}/{1}/{2}/{3}.json".format(root_rn, quin_rn, quad_rn, ter_rn)
+ # NOTE: No need to select by ter_filter
+ # self.update_qs({'query-target-filter': self.build_filter(ter_class, ter_filter)})
+ # TODO: Filter by sec_filter, parent and obj_filter
+ self.update_qs({"rsp-subtree-filter": self.build_filter(obj_class, obj_filter)})
+ elif parent_obj is None:
+ self.child_classes.add(obj_class)
+ self.path = "api/mo/uni/{0}/{1}/{2}/{3}/{4}.json".format(root_rn, quin_rn, quad_rn, ter_rn, sec_rn)
+ # NOTE: No need to select by sec_filter
+ # self.update_qs({'query-target-filter': self.build_filter(sec_class, sec_filter)})
+ # TODO: Filter by parent_filter and obj_filter
+ self.update_qs({"rsp-subtree-filter": self.build_filter(obj_class, obj_filter)})
+ elif mo is None:
+ self.child_classes.add(obj_class)
+ self.path = "api/mo/uni/{0}/{1}/{2}/{3}/{4}/{5}.json".format(root_rn, quin_rn, quad_rn, ter_rn, sec_rn, parent_rn)
+ # NOTE: No need to select by parent_filter
+ # self.update_qs({'query-target-filter': self.build_filter(parent_class, parent_filter)})
+ else:
+ # Query for a specific object of the module's class
+ self.path = "api/mo/uni/{0}/{1}/{2}/{3}/{4}/{5}/{6}.json".format(root_rn, quin_rn, quad_rn, ter_rn, sec_rn, parent_rn, obj_rn)
+
def delete_config(self):
"""
This method is used to handle the logic when the modules state is equal to absent. The method only pushes a change if
@@ -1161,7 +1311,7 @@ class ACIModule(object):
self.result["changed"] = True
self.method = "DELETE"
- def get_diff(self, aci_class):
+ def get_diff(self, aci_class, required_properties=None):
"""
This method is used to get the difference between the proposed and existing configurations. Each module
should call the get_existing method before this method, and add the proposed config to the module results
@@ -1183,6 +1333,8 @@ class ACIModule(object):
# add name back to config only if the configs do not match
if config:
# TODO: If URLs are built with the object's name, then we should be able to leave off adding the name back
+ if required_properties and isinstance(required_properties, dict):
+ config.update(required_properties)
config = {aci_class: {"attributes": config}}
# check for updates to child configs and update new config dictionary
@@ -1369,23 +1521,30 @@ class ACIModule(object):
# add child objects to proposed
if child_configs:
- children = []
- for child in child_configs:
- child_copy = deepcopy(child)
- has_value = False
- for root_key in child_copy.keys():
- for final_keys, values in child_copy[root_key]["attributes"].items():
- if values is None:
- child[root_key]["attributes"].pop(final_keys)
- else:
- child[root_key]["attributes"][final_keys] = str(values)
- has_value = True
- if has_value:
- children.append(child)
+ children = self.handle_child_configs(child_configs)
if children:
self.proposed[aci_class].update(dict(children=children))
+ def handle_child_configs(self, child_configs):
+ children = []
+ for child in child_configs:
+ child_copy = deepcopy(child)
+ has_value = False
+ for class_name in child_copy.keys():
+ for attribute, value in child_copy[class_name]["attributes"].items():
+ if value is None:
+ child[class_name]["attributes"].pop(attribute)
+ else:
+ child[class_name]["attributes"][attribute] = str(value)
+ has_value = True
+ if child_copy[class_name].get("children") is not None:
+ has_value = True
+ child[class_name]["children"] = self.handle_child_configs(child_copy[class_name]["children"])
+ if has_value:
+ children.append(child)
+ return children
+
def post_config(self, parent_class=None):
"""
This method is used to handle the logic when the modules state is equal to present. The method only pushes a change if
@@ -1438,7 +1597,15 @@ class ACIModule(object):
if "state" in self.params:
self.original = self.existing
if self.params.get("state") in ("absent", "present"):
- self.get_existing()
+ if self.suppress_verification:
+ if self.result["changed"]:
+ self.result["current_verified"] = False
+ self.existing = [self.proposed]
+ else:
+ self.result["current_verified"] = True
+ # exisiting already equals the previous
+ else:
+ self.get_existing()
# if self.module._diff and self.original != self.existing:
# self.result['diff'] = dict(
diff --git a/ansible_collections/cisco/aci/plugins/module_utils/annotation_unsupported.py b/ansible_collections/cisco/aci/plugins/module_utils/annotation_unsupported.py
new file mode 100644
index 000000000..6e34889fb
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/module_utils/annotation_unsupported.py
@@ -0,0 +1,853 @@
+# Code generated by release_script GitHub action; DO NOT EDIT MANUALLY.
+ANNOTATION_UNSUPPORTED = [
+ "topRoot",
+ "monPol",
+ "monATarget",
+ "monTarget",
+ "moTopProps",
+ "moModifiable",
+ "moOwnable",
+ "moResolvable",
+ "moASubj",
+ "actionACont",
+ "taskExec",
+ "namingNamedObject",
+ "namingNamedIdentifiedObject",
+ "conditionInfo",
+ "conditionRetP",
+ "conditionRecord",
+ "conditionLoggable",
+ "faultInfo",
+ "relnInst",
+ "relnTo",
+ "relnFrom",
+ "statsItem",
+ "statsAColl",
+ "statsAThrP",
+ "relnTaskRef",
+ "hvsNode",
+ "qosACong",
+ "qosAQueue",
+ "qosABuffer",
+ "qosASched",
+ "qosClassification",
+ "qosADscpClass",
+ "qosADot1PClass",
+ "lacpALagPol",
+ "pconsRef",
+ "eventARetP",
+ "faultAThrValue",
+ "faultARetP",
+ "configABackupP",
+ "dnsAProfile",
+ "dnsAProv",
+ "dnsADomain",
+ "dnsALbl",
+ "sysdebugRepository",
+ "sysdebugFile",
+ "sysdebugLogBehavior",
+ "firmwareSource",
+ "firmwareAFwStatusCont",
+ "firmwareARunning",
+ "firmwareAFwP",
+ "maintAMaintP",
+ "maintUserNotif",
+ "fabricComp",
+ "fabricANode",
+ "fabricALink",
+ "ruleDefinition",
+ "ruleItem",
+ "ruleRequirement",
+ "ruleSizeRequirement",
+ "stpAIfPol",
+ "haHaTest",
+ "rtctrlAMatchRule",
+ "rtctrlAMatchIpRule",
+ "rtctrlAMatchRtType",
+ "rtctrlASubnet",
+ "rtctrlAAttrP",
+ "rtctrlASetRule",
+ "rtctrlASetTag",
+ "rtctrlASetComm",
+ "rtctrlASetRtMetric",
+ "rtctrlASetPref",
+ "rtctrlASetNh",
+ "rtctrlASetOspfFwdAddr",
+ "rtctrlASetOspfNssa",
+ "bgpAAsP",
+ "bgpACtxPol",
+ "bgpAPeerPfxPol",
+ "bgpAPeerP",
+ "bgpAExtP",
+ "cdpAIfPol",
+ "fabricProtoIfPol",
+ "fabricL2IfPol",
+ "fabricL3IfPol",
+ "lldpAIfPol",
+ "fabricProtoPol",
+ "fabricProtoComp",
+ "fabricL2ProtoPol",
+ "fabricL3ProtoPol",
+ "fabricL2ProtoComp",
+ "fabricL3ProtoComp",
+ "fabricProtoInstPol",
+ "fabricUtilInstPol",
+ "fabricL2InstPol",
+ "fabricL3InstPol",
+ "fabricProtoDomPol",
+ "fabricL2DomPol",
+ "fabricL3DomPol",
+ "fabricL3CtxPol",
+ "l2AInstPol",
+ "fabricMaintPol",
+ "fabricNodeGrp",
+ "fabricAPodBlk",
+ "fabricANodeBlk",
+ "fabricAPortBlk",
+ "fabricSelector",
+ "fabricANodeS",
+ "fabricNodeS",
+ "fabricACardS",
+ "fabricCardS",
+ "fabricAPortS",
+ "fabricPortS",
+ "fabricIntfPol",
+ "fabricAProfile",
+ "fabricProfile",
+ "fabricPolGrp",
+ "fabricNodeP",
+ "fabricCardP",
+ "fabricPortP",
+ "fabricAPortPGrp",
+ "fabricANodePGrp",
+ "fabricACardPGrp",
+ "fabricSpAPortPGrp",
+ "fabricLeAPortPGrp",
+ "fabricAProtPol",
+ "fabricANodePEp",
+ "fabricPol",
+ "fabricInfrP",
+ "fabricInfrExP",
+ "fabricDom",
+ "fabricDef",
+ "fabricAPolGrp",
+ "vsvcAProvLbl",
+ "vsvcAConsLbl",
+ "compASvcVM",
+ "compNic",
+ "compPNic",
+ "compEntity",
+ "compElement",
+ "compContE",
+ "compObj",
+ "compCont",
+ "compProvP",
+ "compDomP",
+ "compCtrlrP",
+ "compAccessP",
+ "compUsrAccP",
+ "compHost",
+ "compPHost",
+ "vzACollection",
+ "vzACtrct",
+ "vzABrCP",
+ "vzAIf",
+ "vzAFilterable",
+ "vzAFilterableUnit",
+ "vzASubj",
+ "vzATerm",
+ "vzASTerm",
+ "vzALbl",
+ "vzACompLbl",
+ "vzAnyToCollection",
+ "vzAFilter",
+ "vzAFiltEntry",
+ "ospfACtxPol",
+ "ospfAIfP",
+ "ospfAExtP",
+ "dhcpARelayP",
+ "dhcpALbl",
+ "dhcpAInfraProvP",
+ "poolElement",
+ "poolPoolable",
+ "poolPoolMember",
+ "poolPool",
+ "pkiItem",
+ "aaaDefinition",
+ "commDefinition",
+ "pkiDefinition",
+ "aaaSystemUser",
+ "aaaBanner",
+ "aaaUserAction",
+ "aaaARetP",
+ "commComp",
+ "commWeb",
+ "commShell",
+ "aaaRealm",
+ "aaaConfig",
+ "aaaAuthMethod",
+ "aaaEp",
+ "aaaAProvider",
+ "aaaProviderGroup",
+ "adcomATsInfoUnit",
+ "adcomARwi",
+ "healthARetP",
+ "healthAInst",
+ "igmpASnoopPol",
+ "sysfileEp",
+ "sysfileRepository",
+ "sysfileInstance",
+ "fileARemoteHost",
+ "fileARemotePath",
+ "monProtoP",
+ "monSecAuthP",
+ "monGroup",
+ "monSubj",
+ "monSrc",
+ "conditionCondP",
+ "ctrlrDom",
+ "l2extADomP",
+ "l2extALNodeP",
+ "l2extAIfP",
+ "l2extAInstPSubnet",
+ "extnwEPg",
+ "extnwOut",
+ "extnwDomP",
+ "extnwAInstPSubnet",
+ "extnwALNodeP",
+ "extnwALIfP",
+ "l3extADomP",
+ "l3extALNodeP",
+ "l3extAIfP",
+ "l3extAMember",
+ "l3extAInstPSubnet",
+ "trigSchedWindowP",
+ "trigInst",
+ "trigWindow",
+ "trigSchedWindow",
+ "trigExecutable",
+ "trigTriggerable",
+ "trigSingleTriggerable",
+ "fvACont",
+ "fvADeplCont",
+ "fvL2Dom",
+ "fvABD",
+ "fvABDPol",
+ "fvAEpRetPol",
+ "fvComp",
+ "fvATg",
+ "fvEPgToCollection",
+ "fvADomP",
+ "fvEPg",
+ "fvCEPg",
+ "fvAREpPCtrct",
+ "fvDom",
+ "fvL3Dom",
+ "fvACtx",
+ "fvNwEp",
+ "fvATp",
+ "fvEp",
+ "fvPEp",
+ "fvAEpDef",
+ "fvTo",
+ "fvFrom",
+ "mgmtAZone",
+ "mgmtAInstPSubnet",
+ "eqptdiagpTestSet",
+ "eqptdiagpTestSetBoot",
+ "eqptdiagpTestSetHealth",
+ "eqptdiagpTestSetOd",
+ "eqptdiagpPortTestSetOd",
+ "eqptdiagpPortTestSetBt",
+ "eqptdiagpPortTestSetHl",
+ "eqptdiagpLpTsOd",
+ "eqptdiagpFpTsOd",
+ "eqptdiagpCardTestSetOd",
+ "eqptdiagpSupCTsOd",
+ "eqptdiagpSysCTsOd",
+ "eqptdiagpFcTsOd",
+ "eqptdiagpLcTsOd",
+ "eqptdiagpExtChCardTsOd",
+ "eqptdiagpPol",
+ "eqptdiagpHealthPol",
+ "eqptdiagpASynthObj",
+ "oamExec",
+ "pingAExec",
+ "tracerouteAExec",
+ "bgpAf",
+ "dhcpAddr",
+ "dhcpNode",
+ "dhcpResp",
+ "eqptALPort",
+ "dbgACRulePCommon",
+ "dbgacTenantSpaceCmn",
+ "dbgacEpgCmn",
+ "dbgacFromEpgCmn",
+ "dbgacToEpgCmn",
+ "dbgacFromEpCmn",
+ "dbgacToEpCmn",
+ "dbgexpExportP",
+ "dbgexpNodeStatus",
+ "spanASrcGrp",
+ "spanASrc",
+ "spanASpanLbl",
+ "spanADest",
+ "spanAVSrc",
+ "spanAVSrcGrp",
+ "spanAVDestGrp",
+ "spanAVDest",
+ "svccorePol",
+ "svccoreACore",
+ "traceroutepTrP",
+ "syntheticObject",
+ "syntheticAContext",
+ "syntheticATestObj",
+ "syntheticTLTestObj",
+ "syntheticCTestObj",
+ "monExportP",
+ "ipARouteP",
+ "ipANexthopP",
+ "infraFexBlk",
+ "infraANodeS",
+ "infraNodeGrp",
+ "infraPortS",
+ "infraEPg",
+ "infraACEPg",
+ "infraAPEPg",
+ "infraANode",
+ "infraAIpP",
+ "infraProfile",
+ "infraPolGrp",
+ "infraAccBaseGrp",
+ "infraFexGrp",
+ "infraAccGrp",
+ "infraLbl",
+ "infraAPEp",
+ "infraACEp",
+ "infraAFunc",
+ "infraGeNode",
+ "infraADomP",
+ "infraDomP",
+ "infraExP",
+ "datetimeAPol",
+ "datetimeANtpAuthKey",
+ "datetimeANtpProv",
+ "fvnsAAddrBlk",
+ "fvnsAEncapBlk",
+ "fvnsAInstP",
+ "fvnsAVxlanInstP",
+ "fvnsAAddrInstP",
+ "polAttTgt",
+ "snmpAPol",
+ "snmpACommunityP",
+ "snmpAUserP",
+ "snmpAClientGrpP",
+ "snmpAClientP",
+ "snmpACtxP",
+ "fvDef",
+ "fvNp",
+ "fvUp",
+ "polNToRef",
+ "polNFromRef",
+ "polObj",
+ "polDef",
+ "polDefRoot",
+ "polComp",
+ "polInstr",
+ "polCont",
+ "polDom",
+ "polCtrlr",
+ "polCompl",
+ "polComplElem",
+ "polConsElem",
+ "polLbl",
+ "polProvLbl",
+ "polConsLbl",
+ "polIf",
+ "polProvIf",
+ "polConsIf",
+ "polRelnHolder",
+ "polNs",
+ "polAConfIssues",
+ "vnsAGraph",
+ "vnsANode",
+ "vnsAFuncNode",
+ "vnsAFolder",
+ "vnsACCfgRel",
+ "vnsAParam",
+ "vnsATerm",
+ "vnsATermNode",
+ "vnsAbsTermNode",
+ "vnsALDevCtx",
+ "vnsALIfCtx",
+ "vnsAConn",
+ "vnsAFuncConn",
+ "vnsATermConn",
+ "vnsAConnection",
+ "vnsAL4L7ServiceFault",
+ "vnsACCfg",
+ "vnsALDevIf",
+ "vnsALDev",
+ "vnsALIf",
+ "vnsALDevLIf",
+ "vnsDevItem",
+ "fabricAPathIssues",
+ "conditionSevAsnP",
+ "fvAStCEp",
+ "fabricNodeToPolicy",
+ "aaaADomainRef",
+ "fvAEpTaskAggr",
+ "vzToRFltP",
+ "fvAToBD",
+ "frmwrkARelDelCont",
+ "infraDomainToNs",
+ "infraToAInstP",
+ "aaaARbacRule",
+ "statsDebugItem",
+ "vzInterfaceToCollection",
+ "spanAToCEp",
+ "fabricAOOSReln",
+ "l4AVxlanInstPol",
+ "fabricVxlanInstPol",
+ "fabricL1IfPol",
+ "frmwrkARelDelControl",
+ "spanACEpDef",
+ "eptrkEpRslt",
+ "mcpAIfPol",
+ "ipmcsnoopRtrIf",
+ "bfdAf",
+ "bgpALocalAsnP",
+ "bgpACtxAfPol",
+ "l3extADefaultRouteLeakP",
+ "fvAStIp",
+ "rtctrlASetRtMetricType",
+ "vnsAEPpInfo",
+ "ndAIfPol",
+ "ndAPfxPol",
+ "eigrpACtxAfPol",
+ "eigrpAStubP",
+ "eigrpAIfP",
+ "eigrpAExtP",
+ "l3extAIp",
+ "fabricProtoConsFrom",
+ "fabricProtoConsTo",
+ "fabricAPathS",
+ "infraAAccBndlGrp",
+ "fabricNodeToPathOverridePolicy",
+ "adcomARwiAdvanced",
+ "fvAClassifier",
+ "fvACrtrn",
+ "fvAttr",
+ "fvAVmAttr",
+ "fvAIpAttr",
+ "fvAMacAttr",
+ "fvAProtoAttr",
+ "polADependentOn",
+ "vnsAVRoutingNetworks",
+ "l3extARouteTagPol",
+ "nwsAFwPol",
+ "fabricL4IfPol",
+ "fvAVip",
+ "fvAAREpPUpdate",
+ "conditionSummary",
+ "polAPrToPol",
+ "polAObjToPolReln",
+ "fvACrRule",
+ "fvASCrtrn",
+ "fvnsAVlanInstP",
+ "vzAnyToInterface",
+ "fvEPgToInterface",
+ "fabricPodGrp",
+ "fabricAPodS",
+ "infraPodGrp",
+ "vnsAMgmt",
+ "fabricPolicyGrpToMonitoring",
+ "plannerIPs",
+ "plannerAObject",
+ "plannerAEpg",
+ "compAPltfmP",
+ "compAVmmPltfmP",
+ "compAVmmSecP",
+ "bgpARRP",
+ "bgpARtTargetP",
+ "bgpARtTarget",
+ "l3extAFabricExtRoutingP",
+ "fvAFabricExtConnP",
+ "fvAPodConnP",
+ "fvAPeeringP",
+ "fvANode",
+ "plannerATmpl",
+ "nwsASrc",
+ "nwsASyslogSrc",
+ "throttlerASub",
+ "qosADscpTrans",
+ "fvARsToRemote",
+ "vnsOrchReq",
+ "vnsOrchResp",
+ "fcprARs",
+ "dbgexpTechSupOnDBase",
+ "infraGeSnNode",
+ "l3extAConsLbl",
+ "l3extAProvLbl",
+ "trigATriggeredWindow",
+ "qosADppPol",
+ "bfdAInstPol",
+ "bfdAIfPol",
+ "bfdAIfP",
+ "plannerADomainTmpl",
+ "plannerAEpgDomain",
+ "vmmACapObj",
+ "vmmACapInfo",
+ "fvARsToRemoteFC",
+ "rtctrlAMatchCommFactor",
+ "rtctrlAMatchCommTerm",
+ "rtctrlAMatchCommRegexTerm",
+ "rtctrlASetDamp",
+ "rtctrlASetWeight",
+ "hvsContE",
+ "hvsUsegContE",
+ "compAPvlanP",
+ "usegAUsegEPg",
+ "fvAStAttr",
+ "fvADyAttr",
+ "mgmtAIp",
+ "faultARsToRemote",
+ "analyticsACfgSrv",
+ "infraAAccGrp",
+ "infraSpAccGrp",
+ "infraANodeP",
+ "infraPortP",
+ "infraAPathS",
+ "ipmcsnoopMcSrc",
+ "ipmcsnoopTgtIf",
+ "analyticsACluster",
+ "rtdmcAIfPol",
+ "rtdmcARtMapPol",
+ "rtdmcAExtP",
+ "rtdmcACtxPol",
+ "rtdmcARPPol",
+ "rtdmcAAutoRPPol",
+ "rtdmcABSRPPol",
+ "rtdmcAStaticRPPol",
+ "rtdmcAStaticRPEntry",
+ "rtdmcARPGrpRangePol",
+ "rtdmcARegTrPol",
+ "rtdmcAResPol",
+ "rtdmcAPatPol",
+ "rtdmcAASMPatPol",
+ "rtdmcASGRangeExpPol",
+ "rtdmcASharedRangePol",
+ "rtdmcASSMPatPol",
+ "rtdmcASSMRangePol",
+ "rtdmcABidirPatPol",
+ "pimAIfP",
+ "rtdmcARtMapEntry",
+ "rtdmcAJPFilterPol",
+ "rtdmcANbrFilterPol",
+ "rtdmcAMAFilter",
+ "rtdmcABSRFilter",
+ "rtdmcAFilterPol",
+ "fvAEPgPathAtt",
+ "fvnsAVsanInstP",
+ "ipmcAIfPol",
+ "ipmcAStRepPol",
+ "ipmcAStateLPol",
+ "ipmcARepPol",
+ "ipmcACtxPol",
+ "ipmcASSMXlateP",
+ "igmpAIfP",
+ "vmmEpgAggr",
+ "apPluginName",
+ "rtdmcAIfPolCont",
+ "fabricL2PortSecurityPol",
+ "fcAPinningP",
+ "fcAPinningLbl",
+ "fabricAONodeS",
+ "infraAONodeS",
+ "analyticsRemoteNode",
+ "analyticsTarget",
+ "fabricASubPortBlk",
+ "bgpARtTargetInstrP",
+ "hsrpAIfPol",
+ "hsrpAGroupPol",
+ "hsrpAGroupP",
+ "hsrpASecVip",
+ "hsrpAIfP",
+ "netflowARecordPol",
+ "netflowAExporterPol",
+ "netflowARsInterfaceToMonitor",
+ "netflowARsMonitorToRecord",
+ "netflowARsMonitorToExporter",
+ "netflowAMonitorPol",
+ "igmpASnoopStaticGroup",
+ "igmpASnoopAccessGroup",
+ "netflowAFabExporterPol",
+ "fabricQinqIfPol",
+ "orchsEntity",
+ "orchsElement",
+ "vnsNATReq",
+ "vnsLBReq",
+ "aclACL",
+ "aclL3ACE",
+ "apDockerName",
+ "hostprotASubj",
+ "macsecAAIfPol",
+ "macsecAIfPol",
+ "macsecAAParamPol",
+ "macsecAParamPol",
+ "macsecAAKeyChainPol",
+ "macsecAAKeyPol",
+ "macsecAKeyChainPol",
+ "macsecAKeyPol",
+ "fvAIntersiteConnP",
+ "fvAIntersiteConnPDef",
+ "fvASiteConnP",
+ "coppAProfile",
+ "coppACustomValues",
+ "infraNodeS",
+ "rtctrlASetASPath",
+ "rtctrlASetASPathASN",
+ "fvADnsAttr",
+ "dnsepgFault",
+ "dnsepgASvrGrp",
+ "dnsepgAMgmt",
+ "dnsepgASvr",
+ "dnsepgADomain",
+ "ipANexthopEpP",
+ "vmmInjectedObject",
+ "poeAIfPol",
+ "iaclAProfile",
+ "telemetryAServer",
+ "snmpATrapFwdServerP",
+ "dwdmAOptChnlIfPol",
+ "vzARuleOwner",
+ "telemetryAServerPol",
+ "telemetryARemoteServer",
+ "telemetryAFlowServers",
+ "telemetryAServerP",
+ "plannerAEpgFilter",
+ "callhomeASrc",
+ "callhomeADest",
+ "callhomeAGroup",
+ "fvAEpAnycast",
+ "tagTag",
+ "tagAnnotation",
+ "tagASelector",
+ "infraFcAccGrp",
+ "infraAFcAccBndlGrp",
+ "vsanARsVsanPathAtt",
+ "vsanARtVsanPathAtt",
+ "vzSubjectToFilter",
+ "telemetryAStreamEnable",
+ "cloudsecASaKeyP",
+ "rtdmcAInterVRFPol",
+ "rtdmcAInterVRFEntry",
+ "cloudsecAControl",
+ "adepgAResElement",
+ "adepgAElement",
+ "adepgACont",
+ "adepgAOrgUnit",
+ "adepgEntity",
+ "adepgContE",
+ "fvAIdAttr",
+ "edmObj",
+ "edmCont",
+ "edmGroupP",
+ "edmMgrP",
+ "edmEntity",
+ "edmElement",
+ "edmContE",
+ "authASvrGroup",
+ "authASvr",
+ "authBaseUsrAccP",
+ "cloudsecASaKeyPLocal",
+ "cloudsecASaKeyPRemote",
+ "cloudsecASaKeyStatus",
+ "cloudsecASaKeyStatusLocal",
+ "cloudsecASaKeyStatusRemote",
+ "cloudsecASpKeySt",
+ "cloudsecACapability",
+ "aaaRbacAnnotation",
+ "lacpAEnhancedLagPol",
+ "compAHvHealth",
+ "mldASnoopPol",
+ "fvAExtRoutes",
+ "fvAExtRoutableRemoteSitePodSubnet",
+ "fvAEpNlb",
+ "extdevSDWanASlaPol",
+ "eigrpAAuthIfP",
+ "fvAAKeyChainPol",
+ "fvAAKeyPol",
+ "fvAKeyChainPol",
+ "fvAKeyPol",
+ "fvSyntheticIp",
+ "edmACapFlags",
+ "cloudABgpPeerP",
+ "cloudABgpAsP",
+ "cloudARouterP",
+ "cloudAIntNetworkP",
+ "cloudAExtNetworkP",
+ "cloudAHostRouterPol",
+ "cloudAHostBootstrapPol",
+ "cloudAVpnGwPol",
+ "cloudAHostIfP",
+ "cloudALoopbackIfP",
+ "cloudAL3IfP",
+ "cloudAIpv4AddrP",
+ "cloudAL3TunnelIfP",
+ "cloudAIpSecTunnelIfP",
+ "cloudAOspfIfP",
+ "cloudAOspfAreaP",
+ "cloudACtxProfile",
+ "cloudACidr",
+ "cloudASubnet",
+ "cloudAAwsLogGroup",
+ "cloudAAwsFlowLogPol",
+ "cloudAProvider",
+ "cloudAAwsProvider",
+ "cloudAAEPg",
+ "cloudAEPSelector",
+ "cloudAEPSelectorDef",
+ "cloudADomP",
+ "genericsARule",
+ "ipsecAIsakmpPhase1Pol",
+ "ipsecAIsakmpPhase2Pol",
+ "resolutionARsToRemote",
+ "cloudtemplateASubnetPool",
+ "fvAACrtrn",
+ "fvAUsegAssocBD",
+ "cloudALDev",
+ "cloudAListener",
+ "cloudAPool",
+ "cloudAListenerRule",
+ "cloudARuleCondition",
+ "cloudARuleAction",
+ "cloudACertStore",
+ "cloudACertificate",
+ "arpAIfPol",
+ "compNameIdentEntity",
+ "edmAOperCont",
+ "edmAStatsCont",
+ "cloudASvcPol",
+ "hcloudATgStats",
+ "statsANWStatsObj",
+ "statsATunnel",
+ "cloudAController",
+ "cloudAApicSubnet",
+ "cloudAApicSubnetPool",
+ "cloudABaseEPg",
+ "cloudASvcEPg",
+ "statsAALbStats",
+ "mldASnoopStaticGroup",
+ "mldASnoopAccessGroup",
+ "datetimeANtpIFFKey",
+ "hcloudRouterStateOper",
+ "vmmAUplinkP",
+ "vmmAUplinkPCont",
+ "cloudAAFilter",
+ "fvASDWanPrefixTaskAggr",
+ "cloudAProvResP",
+ "bfdAMhInstPol",
+ "bfdAMhIfPol",
+ "fvAEPSelector",
+ "ptpAACfg",
+ "ptpACfg",
+ "fabricL2BDPol",
+ "rtdmcABDPol",
+ "rtdmcABDFilter",
+ "ptpAProfile",
+ "mdpADomP",
+ "mdpADomainPeeringPol",
+ "mdpAPeeringDomain",
+ "mdpANodeP",
+ "mdpAClassId",
+ "mdpATenant",
+ "mplsAExtP",
+ "mplsAIfP",
+ "mplsALabelPol",
+ "mplsANodeSidP",
+ "qosAMplsIngressRule",
+ "qosMplsMarking",
+ "qosAMplsEgressRule",
+ "cloudAGatewayRouterP",
+ "cloudATransitHubGwPol",
+ "cloudAL3IntTunnelIfP",
+ "cloudABdiId",
+ "mplsASrgbLabelPol",
+ "bfdAMhNodePol",
+ "bfdANodeP",
+ "leakASubnet",
+ "rtctrlASetNhUnchanged",
+ "mdpAService",
+ "cloudALIf",
+ "cloudAParamPol",
+ "cloudAComputePol",
+ "cloudAMgmtPol",
+ "cloudANWParams",
+ "fvRtScopeFrom",
+ "cloudACtxUnderlayP",
+ "cloudAHealthProbe",
+ "leakARouteCont",
+ "netflowAVmmExporterPol",
+ "cloudABrownfield",
+ "cloudAMapping",
+ "cloudASelectedEP",
+ "statsANlbStats",
+ "mdpAEntity",
+ "dbgANodeInst",
+ "snmpACtrlrInst",
+ "cloudAFrontendIPv4Addr",
+ "qosAUburst",
+ "telemetryAFteEvents",
+ "telemetryAFteEventsTcpFlags",
+ "telemetryAFteEventsExt",
+ "cloudACloudSvcEPg",
+ "hcloudASvcResBase",
+ "bgpADomainIdBase",
+ "fvAEpTag",
+ "bgpASiteOfOriginP",
+ "fvAEPSelectorDef",
+ "vmmCFaultInfo",
+ "synceAAIfPol",
+ "synceAIfPol",
+ "rtctrlASetRedistMultipath",
+ "cloudANextHopIp",
+ "cloudAVrfRouteLeakPol",
+ "hcloudALeakedPfx",
+ "leakAPrefix",
+ "fvARogueExceptionMac",
+ "bfdAMicroBfdP",
+ "hcloudAIntPfx",
+ "hcloudAExtPfx",
+ "cloudAVpnNetworkP",
+ "snmpUser",
+ "cloudAVirtualWanP",
+ "fvAFBRGroup",
+ "fvAFBRoute",
+ "fvAFBRMember",
+ "rtctrlASetPolicyTag",
+ "fvACtxRtSummPol",
+ "fvARtSummSubnet",
+ "fvAIntraVrfFabricImpRtctrlP",
+ "fvAFabricExpRtctrlP",
+ "cloudAVip",
+ "rtctrlAMatchAsPathRegexTerm",
+ "cloudAGcpFlowLogPol",
+ "statsAGcpNWStatsObj",
+ "cloudABfdPol",
+ "cloudABfdP",
+ "bgpACtxAddlPathPol",
+ "xcvrOpticsIfPol",
+ "xcvrOpticsFabIfPol",
+ "hostprotANamespace",
+ "fvARouteDeployP",
+ "rtdmcACSWPol",
+ "rtdmcACSWEntry",
+ "analyticsTo",
+ "analyticsFrom",
+ "dmemotltestAbsObject",
+ "bgpAsnmpBgpTraps",
+ "l3extARogueExceptionMac",
+ "l3extARogueExceptionMacGroup",
+ "vzAFiltPZEntry",
+]
diff --git a/ansible_collections/cisco/aci/plugins/module_utils/constants.py b/ansible_collections/cisco/aci/plugins/module_utils/constants.py
index 165b63431..26818ff64 100644
--- a/ansible_collections/cisco/aci/plugins/module_utils/constants.py
+++ b/ansible_collections/cisco/aci/plugins/module_utils/constants.py
@@ -97,4 +97,340 @@ EP_LOOP_PROTECTION_ACTION_MAPPING = {"bd": "bd-learn-disable", "port": "port-dis
FABRIC_POD_SELECTOR_TYPE_MAPPING = dict(all="ALL", range="range")
-TLS_MAPPING = {"tls_v1.0": "TLSv1", "tls_v1.1": "TLSv1.1", "tls_v1.2": "TLSv1.2"}
+OPFLEX_TLS_MAPPING = {"tls_v1.0": "TLSv1", "tls_v1.1": "TLSv1.1", "tls_v1.2": "TLSv1.2"}
+
+HTTP_TLS_MAPPING = {"tls_v1.0": "TLSv1", "tls_v1.1": "TLSv1.1", "tls_v1.2": "TLSv1.2", "tls_v1.3": "TLSv1.3"}
+
+ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING = dict(
+ spine=dict(
+ class_name="infraSpineAccNodePGrp",
+ rn="infra/funcprof/spaccnodepgrp-{0}",
+ copp_pre_filter_policy=dict(class_name="infraRsIaclSpineProfile", tn_name="tnIaclSpineProfileName"),
+ bfd_ipv4_policy=dict(class_name="infraRsSpineBfdIpv4InstPol", tn_name="tnBfdIpv4InstPolName"),
+ bfd_ipv6_policy=dict(class_name="infraRsSpineBfdIpv6InstPol", tn_name="tnBfdIpv6InstPolName"),
+ copp_policy=dict(class_name="infraRsSpineCoppProfile", tn_name="tnCoppSpineProfileName"),
+ cdp_policy=dict(class_name="infraRsSpinePGrpToCdpIfPol", tn_name="tnCdpIfPolName"),
+ lldp_policy=dict(class_name="infraRsSpinePGrpToLldpIfPol", tn_name="tnLldpIfPolName"),
+ usb_configuration_policy=dict(class_name="infraRsSpineTopoctrlUsbConfigProfilePol", tn_name="tnTopoctrlUsbConfigProfilePolName"),
+ ),
+ leaf=dict(
+ class_name="infraAccNodePGrp",
+ rn="infra/funcprof/accnodepgrp-{0}",
+ copp_pre_filter_policy=dict(class_name="infraRsIaclLeafProfile", tn_name="tnIaclLeafProfileName"),
+ bfd_ipv4_policy=dict(class_name="infraRsBfdIpv4InstPol", tn_name="tnBfdIpv4InstPolName"),
+ bfd_ipv6_policy=dict(class_name="infraRsBfdIpv6InstPol", tn_name="tnBfdIpv6InstPolName"),
+ copp_policy=dict(class_name="infraRsLeafCoppProfile", tn_name="tnCoppLeafProfileName"),
+ cdp_policy=dict(class_name="infraRsLeafPGrpToCdpIfPol", tn_name="tnCdpIfPolName"),
+ lldp_policy=dict(class_name="infraRsLeafPGrpToLldpIfPol", tn_name="tnLldpIfPolName"),
+ usb_configuration_policy=dict(class_name="infraRsLeafTopoctrlUsbConfigProfilePol", tn_name="tnTopoctrlUsbConfigProfilePolName"),
+ ),
+)
+
+PIM_SETTING_CONTROL_STATE_MAPPING = {"fast": "fast-conv", "strict": "strict-rfc-compliant"}
+
+ACI_CLASS_MAPPING = dict(
+ consumer={
+ "class": "fvRsCons",
+ "rn": "rscons-",
+ "name": "tnVzBrCPName",
+ },
+ provider={
+ "class": "fvRsProv",
+ "rn": "rsprov-",
+ "name": "tnVzBrCPName",
+ },
+ taboo={
+ "class": "fvRsProtBy",
+ "rn": "rsprotBy-",
+ "name": "tnVzTabooName",
+ },
+ interface={
+ "class": "fvRsConsIf",
+ "rn": "rsconsIf-",
+ "name": "tnVzCPIfName",
+ },
+ intra_epg={
+ "class": "fvRsIntraEpg",
+ "rn": "rsintraEpg-",
+ "name": "tnVzBrCPName",
+ },
+)
+
+PROVIDER_MATCH_MAPPING = dict(
+ all="All",
+ at_least_one="AtleastOne",
+ at_most_one="AtmostOne",
+ none="None",
+)
+
+CONTRACT_LABEL_MAPPING = dict(
+ consumer="vzConsLbl",
+ provider="vzProvLbl",
+)
+
+SUBJ_LABEL_MAPPING = dict(
+ consumer="vzConsSubjLbl",
+ provider="vzProvSubjLbl",
+)
+
+SUBJ_LABEL_RN = dict(
+ consumer="conssubjlbl-",
+ provider="provsubjlbl-",
+)
+
+MATCH_ACTION_RULE_SET_METRIC_TYPE_MAPPING = {"ospf_type_1": "ospf-type1", "ospf_type_2": "ospf-type2", "": ""}
+
+MATCH_EIGRP_INTERFACE_POLICY_DELAY_UNIT_MAPPING = dict(picoseconds="pico", tens_of_microseconds="tens-of-micro")
+
+MATCH_EIGRP_INTERFACE_POLICY_CONTROL_STATE_MAPPING = dict(bfd="bfd", nexthop_self="nh-self", passive="passive", split_horizon="split-horizon")
+
+MATCH_TARGET_COS_MAPPING = {
+ "background": "0",
+ "best_effort": "1",
+ "excellent_effort": "2",
+ "critical_applications": "3",
+ "video": "4",
+ "voice": "5",
+ "internetwork_control": "6",
+ "network_control": "7",
+ "unspecified": "unspecified",
+}
+
+MATCH_PIM_INTERFACE_POLICY_CONTROL_STATE_MAPPING = dict(multicast_domain_boundary="border", strict_rfc_compliant="strict-rfc-compliant", passive="passive")
+
+MATCH_PIM_INTERFACE_POLICY_AUTHENTICATION_TYPE_MAPPING = dict(none="none", md5_hmac="ah-md5")
+
+MATCH_COLLECT_NETFLOW_RECORD_MAPPING = dict(
+ bytes_counter="count-bytes",
+ pkts_counter="count-pkts",
+ pkt_disposition="pkt-disp",
+ sampler_id="sampler-id",
+ source_interface="src-intf",
+ tcp_flags="tcp-flags",
+ first_pkt_timestamp="ts-first",
+ recent_pkt_timestamp="ts-recent",
+)
+
+MATCH_MATCH_NETFLOW_RECORD_MAPPING = dict(
+ destination_ipv4_v6="dst-ip",
+ destination_ipv4="dst-ipv4",
+ destination_ipv6="dst-ipv6",
+ destination_mac="dst-mac",
+ destination_port="dst-port",
+ ethertype="ethertype",
+ ip_protocol="proto",
+ source_ipv4_v6="src-ip",
+ source_ipv4="src-ipv4",
+ source_ipv6="src-ipv6",
+ source_mac="src-mac",
+ source_port="src-port",
+ ip_tos="tos",
+ unspecified="unspecified",
+ vlan="vlan",
+)
+
+MATCH_SOURCE_IP_TYPE_NETFLOW_EXPORTER_MAPPING = dict(
+ custom_source_ip="custom-src-ip",
+ inband_management_ip="inband-mgmt-ip",
+ out_of_band_management_ip="oob-mgmt-ip",
+ ptep="ptep",
+)
+
+ECC_CURVE = {"P256": "prime256v1", "P384": "secp384r1", "P521": "secp521r1", "none": "none"}
+
+THROTTLE_UNIT = dict(requests_per_second="r/s", requests_per_minute="r/m")
+
+SSH_CIPHERS = dict(
+ aes128_ctr="aes128-ctr",
+ aes192_ctr="aes192-ctr",
+ aes256_ctr="aes256-ctr",
+ aes128_gcm="aes128-gcm@openssh.com",
+ aes256_gcm="aes256-gcm@openssh.com",
+ chacha20="chacha20-poly1305@openssh.com",
+)
+
+SSH_MACS = dict(
+ sha1="hmac-sha1",
+ sha2_256="hmac-sha2-256",
+ sha2_512="hmac-sha2-512",
+ sha2_256_etm="hmac-sha2-256-etm@openssh.com",
+ sha2_512_etm="hmac-sha2-512-etm@openssh.com",
+)
+
+KEX_ALGORITHMS = dict(
+ dh_sha1="diffie-hellman-group14-sha1",
+ dh_sha256="diffie-hellman-group14-sha256",
+ dh_sha512="diffie-hellman-group16-sha512",
+ curve_sha256="curve25519-sha256",
+ curve_sha256_libssh="curve25519-sha256@libssh.org",
+ ecdh_256="ecdh-sha2-nistp256",
+ ecdh_384="ecdh-sha2-nistp384",
+ ecdh_521="ecdh-sha2-nistp521",
+)
+
+USEG_ATTRIBUTE_MAPPING = dict(
+ ip=dict(attribute_type="ip", attribute_class="fvIpAttr", rn_format="ipattr-{0}"),
+ mac=dict(attribute_type="mac", attribute_class="fvMacAttr", rn_format="macattr-{0}"),
+ dns=dict(attribute_type="dns", attribute_class="fvDnsAttr", rn_format="dnsattr-{0}"),
+ ad_group=dict(attribute_type="ad", attribute_class="fvIdGroupAttr", rn_format="idgattr-[{0}]"),
+ vm_custom_attr=dict(attribute_type="custom-label", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_vmm_domain=dict(attribute_type="domain", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_operating_system=dict(attribute_type="guest-os", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_hypervisor_id=dict(attribute_type="hv", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_datacenter=dict(attribute_type="rootContName", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_id=dict(attribute_type="vm", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_name=dict(attribute_type="vm-name", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_folder=dict(attribute_type="vm-folder", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_folder_path=dict(attribute_type="vmfolder-path", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_vnic=dict(attribute_type="vnic", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+ vm_tag=dict(attribute_type="tag", attribute_class="fvVmAttr", rn_format="vmattr-{0}"),
+)
+
+OPERATOR_MAPPING = dict(equals="equals", contains="contains", starts_with="startsWith", ends_with="endsWith")
+
+MATCH_STORM_CONTROL_POLICY_TYPE_MAPPING = dict(all_types="Invalid", unicast_broadcast_multicast="Valid")
+
+POLICY_LABEL_COLORS = [
+ "alice_blue",
+ "antique_white",
+ "aqua",
+ "aquamarine",
+ "azure",
+ "beige",
+ "bisque",
+ "black",
+ "blanched_almond",
+ "blue",
+ "blue_violet",
+ "brown",
+ "burlywood",
+ "cadet_blue",
+ "chartreuse",
+ "chocolate",
+ "coral",
+ "cornflower_blue",
+ "cornsilk",
+ "crimson",
+ "cyan",
+ "dark_blue",
+ "dark_cyan",
+ "dark_goldenrod",
+ "dark_gray",
+ "dark_green",
+ "dark_khaki",
+ "dark_magenta",
+ "dark_olive_green",
+ "dark_orange",
+ "dark_orchid",
+ "dark_red",
+ "dark_salmon",
+ "dark_sea_green",
+ "dark_slate_blue",
+ "dark_slate_gray",
+ "dark_turquoise",
+ "dark_violet",
+ "deep_pink",
+ "deep_sky_blue",
+ "dim_gray",
+ "dodger_blue",
+ "fire_brick",
+ "floral_white",
+ "forest_green",
+ "fuchsia",
+ "gainsboro",
+ "ghost_white",
+ "gold",
+ "goldenrod",
+ "gray",
+ "green",
+ "green_yellow",
+ "honeydew",
+ "hot_pink",
+ "indian_red",
+ "indigo",
+ "ivory",
+ "khaki",
+ "lavender",
+ "lavender_blush",
+ "lawn_green",
+ "lemon_chiffon",
+ "light_blue",
+ "light_coral",
+ "light_cyan",
+ "light_goldenrod_yellow",
+ "light_gray",
+ "light_green",
+ "light_pink",
+ "light_salmon",
+ "light_sea_green",
+ "light_sky_blue",
+ "light_slate_gray",
+ "light_steel_blue",
+ "light_yellow",
+ "lime",
+ "lime_green",
+ "linen",
+ "magenta",
+ "maroon",
+ "medium_aquamarine",
+ "medium_blue",
+ "medium_orchid",
+ "medium_purple",
+ "medium_sea_green",
+ "medium_slate_blue",
+ "medium_spring_green",
+ "medium_turquoise",
+ "medium_violet_red",
+ "midnight_blue",
+ "mint_cream",
+ "misty_rose",
+ "moccasin",
+ "navajo_white",
+ "navy",
+ "old_lace",
+ "olive",
+ "olive_drab",
+ "orange",
+ "orange_red",
+ "orchid",
+ "pale_goldenrod",
+ "pale_green",
+ "pale_turquoise",
+ "pale_violet_red",
+ "papaya_whip",
+ "peachpuff",
+ "peru",
+ "pink",
+ "plum",
+ "powder_blue",
+ "purple",
+ "red",
+ "rosy_brown",
+ "royal_blue",
+ "saddle_brown",
+ "salmon",
+ "sandy_brown",
+ "sea_green",
+ "seashell",
+ "sienna",
+ "silver",
+ "sky_blue",
+ "slate_blue",
+ "slate_gray",
+ "snow",
+ "spring_green",
+ "steel_blue",
+ "tan",
+ "teal",
+ "thistle",
+ "tomato",
+ "turquoise",
+ "violet",
+ "wheat",
+ "white",
+ "white_smoke",
+ "yellow",
+ "yellow_green",
+]
+
+MATCH_ACCESS_POLICIES_SELECTOR_TYPE = dict(range="range", all="ALL")
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_aaa_certificate_authority.py b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_certificate_authority.py
new file mode 100644
index 000000000..673515185
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_certificate_authority.py
@@ -0,0 +1,290 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_aaa_certificate_authority
+short_description: Manage AAA Certificate Authorities (pki:TP)
+description:
+- Manage AAA Certificate Authorities on Cisco ACI fabrics.
+options:
+ name:
+ description:
+ - The name of the Certificate Authority.
+ type: str
+ aliases: [ certificate_authority, cert_authority, cert_authority_name, certificate_authority_name ]
+ cloud_tenant:
+ description:
+ - The name of the cloud tenant.
+ - This attribute is only applicable for Cloud APIC.
+ type: str
+ aliases: [ tenant, tenant_name ]
+ description:
+ description:
+ - The description of the Certificate Authority.
+ type: str
+ aliases: [ descr ]
+ certificate_chain:
+ description:
+ - The PEM-encoded chain of trust from the trustpoint to a trusted root authority.
+ type: str
+ aliases: [ cert_data, certificate_data, cert, certificate ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(cloud_tenant) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) module can be used for this.
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(pki:TP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Create a Certificate Authority
+ cisco.aci.aci_aaa_certificate_authority:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: example_authority
+ certificate_chain: '{{ lookup("file", "pki/example_authority.crt") }}'
+ state: present
+ delegate_to: localhost
+
+- name: Query a Certificate Authority
+ cisco.aci.aci_aaa_certificate_authority:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: example_authority
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Certificate Authorities
+ cisco.aci.aci_aaa_certificate_authority:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a Certificate Authority
+ cisco.aci.aci_aaa_certificate_authority:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: example_authority
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ name=dict(
+ type="str", aliases=["certificate_authority", "cert_authority", "cert_authority_name", "certificate_authority_name"]
+ ), # Not required for querying all objects
+ cloud_tenant=dict(type="str", aliases=["tenant", "tenant_name"]),
+ description=dict(type="str", aliases=["descr"]),
+ certificate_chain=dict(type="str", aliases=["cert_data", "certificate_data", "cert", "certificate"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["name"]],
+ ["state", "present", ["name", "certificate_chain"]],
+ ],
+ )
+
+ name = module.params.get("name")
+ cloud_tenant = module.params.get("cloud_tenant")
+ description = module.params.get("description")
+ certificate_chain = module.params.get("certificate_chain")
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+ aci_class = "pkiTP"
+ parent_class = "cloudCertStore" if cloud_tenant else "pkiEp"
+ parent_rn = "tn-{0}/certstore".format(cloud_tenant) if cloud_tenant else "userext/pkiext"
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class=parent_class,
+ aci_rn=parent_rn,
+ ),
+ subclass_1=dict(
+ aci_class=aci_class,
+ aci_rn="tp-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ )
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class=aci_class,
+ class_config=dict(
+ name=name,
+ descr=description,
+ certChain=certificate_chain,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class=aci_class)
+
+ # Only wrap the payload in parent class if cloud_tenant is set to avoid apic error
+ aci.post_config(parent_class=parent_class if cloud_tenant else None)
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_aaa_key_ring.py b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_key_ring.py
new file mode 100644
index 000000000..2aa2649c7
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_key_ring.py
@@ -0,0 +1,339 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_aaa_key_ring
+short_description: Manage AAA Key Rings (pki:KeyRing)
+description:
+- Manage AAA Key Rings on Cisco ACI fabrics.
+options:
+ name:
+ description:
+ - The name of the Key Ring.
+ type: str
+ aliases: [ key_ring, key_ring_name ]
+ cloud_tenant:
+ description:
+ - The name of the cloud tenant.
+ - This attribute is only applicable for Cloud APIC.
+ type: str
+ aliases: [ tenant, tenant_name ]
+ description:
+ description:
+ - The description of the Key Ring.
+ type: str
+ aliases: [ descr ]
+ certificate:
+ description:
+ - The certificate of the Key Ring.
+ - The certificate contains a public key and signed information for verifying the identity.
+ type: str
+ aliases: [ cert_data, certificate_data, cert ]
+ modulus:
+ description:
+ - The modulus is the length of the key in bits.
+ type: int
+ choices: [ 512, 1024, 1536, 2048 ]
+ certificate_authority:
+ description:
+ - The name of the Certificate Authority.
+ type: str
+ aliases: [ cert_authority, cert_authority_name, certificate_authority_name ]
+ key:
+ description:
+ - The private key for the certificate.
+ type: str
+ key_type:
+ description:
+ - The type of the private key.
+ - This attribute is only configurable in ACI versions 6.0(2h) and above.
+ type: str
+ choices: [ rsa, ecc ]
+ ecc_curve:
+ description:
+ - The curve of the private key.
+ - This attribute requires O(key_type=ecc).
+ - This attribute is only configurable in ACI versions 6.0(2h) and above.
+ type: str
+ choices: [ P256, P384, P521, none ]
+ aliases: [ curve ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(cloud_tenant) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) module can be used for this.
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(pki:KeyRing).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Create a Key Ring
+ cisco.aci.aci_aaa_key_ring:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: example_key_ring
+ certificate: '{{ lookup("file", "pki/example_certificate.crt") }}'
+ modulus: 2048
+ certificate_authority: example_certificate_authority
+ key: '{{ lookup("file", "pki/example_key.key") }}'
+ state: present
+ delegate_to: localhost
+
+- name: Query a Key Ring
+ cisco.aci.aci_aaa_key_ring:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: example_key_ring
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Certificate Authorities
+ cisco.aci.aci_aaa_key_ring:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a Key Ring
+ cisco.aci.aci_aaa_key_ring:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: example_key_ring
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import ECC_CURVE
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ name=dict(type="str", aliases=["key_ring", "key_ring_name"]), # Not required for querying all objects
+ cloud_tenant=dict(type="str", aliases=["tenant_name", "tenant"]),
+ description=dict(type="str", aliases=["descr"]),
+ certificate=dict(type="str", aliases=["cert_data", "certificate_data", "cert"]),
+ modulus=dict(type="int", choices=[512, 1024, 1536, 2048]),
+ certificate_authority=dict(type="str", aliases=["cert_authority", "cert_authority_name", "certificate_authority_name"]),
+ key=dict(type="str", no_log=True),
+ key_type=dict(type="str", choices=["rsa", "ecc"]),
+ ecc_curve=dict(type="str", choices=["P256", "P384", "P521", "none"], aliases=["curve"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["name"]],
+ ["state", "present", ["name"]],
+ ],
+ )
+
+ name = module.params.get("name")
+ cloud_tenant = module.params.get("cloud_tenant")
+ description = module.params.get("description")
+ certificate = module.params.get("certificate")
+ modulus = "mod{0}".format(module.params.get("modulus")) if module.params.get("modulus") else None
+ certificate_authority = module.params.get("certificate_authority")
+ key = module.params.get("key")
+ key_type = module.params.get("key_type")
+ ecc_curve = ECC_CURVE[module.params.get("ecc_curve")] if module.params.get("ecc_curve") else None
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+ aci_class = "pkiKeyRing"
+ parent_class = "cloudCertStore" if cloud_tenant else "pkiEp"
+ parent_rn = "tn-{0}/certstore".format(cloud_tenant) if cloud_tenant else "userext/pkiext"
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class=parent_class,
+ aci_rn=parent_rn,
+ ),
+ subclass_1=dict(
+ aci_class=aci_class,
+ aci_rn="keyring-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ )
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(
+ name=name,
+ descr=description,
+ cert=certificate,
+ modulus=modulus,
+ tp=certificate_authority,
+ nameAlias=name_alias,
+ key=key,
+ )
+
+ if key_type:
+ class_config["keyType"] = key_type.upper()
+
+ if ecc_curve:
+ class_config["eccCurve"] = ecc_curve
+
+ aci.payload(aci_class=aci_class, class_config=class_config)
+
+ aci.get_diff(aci_class=aci_class, required_properties=dict(name=name) if cloud_tenant else None)
+
+ # Only wrap the payload in parent class if cloud_tenant is set to avoid apic error
+ aci.post_config(parent_class=parent_class if cloud_tenant else None)
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_aaa_security_default_settings.py b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_security_default_settings.py
new file mode 100644
index 000000000..4ba18fded
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_security_default_settings.py
@@ -0,0 +1,531 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_aaa_security_default_settings
+short_description: Manage AAA Key Rings (pki:Ep)
+description:
+- Manage AAA Key Rings on Cisco ACI fabrics.
+options:
+ password_strength_check:
+ description:
+ - Enable password strength check.
+ - Use C(true) to enable and C(false) to disable.
+ - The APIC defaults to C(true) when unset during creation.
+ type: bool
+ password_strength_profile:
+ description:
+ - The password strength profile (aaa:PwdStrengthProfile).
+ type: dict
+ suboptions:
+ enable:
+ description:
+ - Enable or disable password strength profile.
+ - Use C(true) to enable and C(false) to disable.
+ type: bool
+ required: true
+ type:
+ description:
+ - The type of the password strength profile.
+ - The APIC defaults to C(any_three) when unset during creation.
+ type: str
+ choices: [ custom, any_three ]
+ min_length:
+ description:
+ - The minimum length of the password.
+ - The APIC defaults to C(8) when unset during creation.
+ type: int
+ aliases: [ minimum_length, min ]
+ max_length:
+ description:
+ - The maximum length of the password.
+ - The APIC defaults to C(64) when unset during creation.
+ type: int
+ aliases: [ maximum_length, max ]
+ class_flags:
+ description:
+ - The class flags of the password strength profile.
+ - At least 3 class flags must be specified.
+ - This attribute is only applicable when type is set to O(password_strength_profile.type=custom).
+ - The APIC defaults to C(digits,lowercase,uppercase) when unset during creation.
+ type: list
+ elements: str
+ choices: [ digits, lowercase, specialchars, uppercase ]
+ aliases: [ flags ]
+ password_change:
+ description:
+ - The password change interval (aaa:PwdProfile).
+ type: dict
+ suboptions:
+ enable:
+ description:
+ - Enforce password change interval.
+ - Use C(true) to enable and C(false) to disable.
+ - The APIC defaults to C(true) when unset during creation.
+ type: bool
+ interval:
+ description:
+ - The password change interval in hours.
+ - The APIC defaults to C(48) when unset during creation.
+ type: int
+ allowed_changes:
+ description:
+ - The number of changes allowed within the change interval.
+ - The APIC defaults to C(2) when unset during creation.
+ type: int
+ minimum_period:
+ description:
+ - The minimum period between password changes in hours.
+ - The APIC defaults to C(24) when unset during creation.
+ type: int
+ aliases: [ minimum_period_between_password_changes, min_period ]
+ history_storage_amount:
+ description:
+ - The number of recent user passwords to store.
+ - The APIC defaults to C(5) when unset during creation.
+ type: int
+ aliases: [ history, amount ]
+ lockout:
+ description:
+ - Lockout behaviour after multiple failed login attempts (aaa:BlockLoginProfile).
+ type: dict
+ suboptions:
+ enable:
+ description:
+ - Enable lockout behaviour.
+ - Use C(true) to enable and C(false) to disable.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ max_attempts:
+ description:
+ - The maximum number of failed attempts before user is locked out.
+ - The APIC defaults to C(5) when unset during creation.
+ type: int
+ aliases: [ max_failed_attempts, failed_attempts, attempts ]
+ window:
+ description:
+ - The time period in which consecutive attempts were failed in minutes.
+ - The APIC defaults to C(5) when unset during creation.
+ type: int
+ aliases: [ max_failed_attempts_window, failed_attempts_window ]
+ duration:
+ description:
+ - The duration of lockout in minutes.
+ - The APIC defaults to C(60) when unset during creation.
+ type: int
+ web_token:
+ description:
+ - The web token related configuration (pki:WebTokenData).
+ type: dict
+ suboptions:
+ timeout:
+ description:
+ - The web token timeout in seconds.
+ - The APIC defaults to C(600) when unset during creation.
+ type: int
+ idle_timeout:
+ description:
+ - The web/console (SSH/Telnet) session idle timeout in seconds.
+ - The APIC defaults to C(1200) when unset during creation.
+ type: int
+ aliases: [ session_idle_timeout ]
+ validity_period:
+ description:
+ - The maximum validity period in hours.
+ - The APIC defaults to C(24) when unset during creation.
+ type: int
+ aliases: [ maximum_validity_period ]
+ refresh:
+ description:
+ - Include refresh in session records.
+ - Use C(true) to include and C(false) to exclude.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(pki:Ep).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Set AAA Security Default Settings
+ cisco.aci.aci_aaa_security_default_settings:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ password_strength_check: true
+ password_strength_profile:
+ enable: true
+ type: custom
+ min_length: 10
+ max_length: 60
+ class_flags:
+ - digits
+ - lowercase
+ - specialchars
+ - uppercase
+ password_change:
+ enable: true
+ interval: 49
+ allowed_changes: 6
+ minimum_period_between_password_changes: 25
+ history_storage_amount: 6
+ lockout:
+ enable: true
+ max_attempts: 6
+ window: 6
+ duration: 61
+ web_token:
+ timeout: 601
+ idle_timeout: 1201
+ validity_period: 23
+ refresh: true
+ state: present
+ delegate_to: localhost
+
+- name: Set AAA Security Default Settings to Default Values
+ cisco.aci.aci_aaa_security_default_settings:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ password_strength_check: true
+ password_strength_profile:
+ enable: false
+ password_change:
+ enable: true
+ interval: 48
+ allowed_changes: 2
+ minimum_period_between_password_changes: 24
+ history_storage_amount: 5
+ lockout:
+ enable: false
+ max_attempts: 5
+ window: 5
+ duration: 60
+ web_token:
+ timeout: 600
+ idle_timeout: 1200
+ validity_period: 24
+ refresh: false
+ state: present
+ delegate_to: localhost
+
+- name: Query AAA Security Default Settings
+ cisco.aci.aci_aaa_security_default_settings:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ password_strength_check=dict(type="bool", no_log=False),
+ password_strength_profile=dict(
+ type="dict",
+ no_log=False,
+ options=dict(
+ enable=dict(type="bool", required=True),
+ type=dict(type="str", choices=["custom", "any_three"]),
+ min_length=dict(type="int", aliases=["minimum_length", "min"]),
+ max_length=dict(type="int", aliases=["maximum_length", "max"]),
+ class_flags=dict(type="list", elements="str", choices=["digits", "lowercase", "specialchars", "uppercase"], aliases=["flags"]),
+ ),
+ ),
+ password_change=dict(
+ type="dict",
+ no_log=False,
+ options=dict(
+ enable=dict(type="bool"),
+ interval=dict(type="int"),
+ allowed_changes=dict(type="int"),
+ minimum_period=dict(type="int", aliases=["minimum_period_between_password_changes", "min_period"]),
+ history_storage_amount=dict(type="int", aliases=["history", "amount"]),
+ ),
+ ),
+ lockout=dict(
+ type="dict",
+ options=dict(
+ enable=dict(type="bool"),
+ max_attempts=dict(type="int", aliases=["max_failed_attempts", "failed_attempts", "attempts"]),
+ window=dict(type="int", aliases=["max_failed_attempts_window", "failed_attempts_window"]),
+ duration=dict(type="int"),
+ ),
+ ),
+ web_token=dict(
+ type="dict",
+ no_log=False,
+ options=dict(
+ timeout=dict(type="int"),
+ idle_timeout=dict(type="int", aliases=["session_idle_timeout"]),
+ validity_period=dict(type="int", aliases=["maximum_validity_period"]),
+ refresh=dict(type="bool"),
+ ),
+ ),
+ state=dict(type="str", default="present", choices=["present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ )
+ aci = ACIModule(module)
+
+ password_strength_check = aci.boolean(module.params.get("password_strength_check"))
+ password_strength_profile = module.params.get("password_strength_profile")
+ password_change = module.params.get("password_change")
+ lockout = module.params.get("lockout")
+ web_token = module.params.get("web_token")
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+
+ aci_class = "aaaUserEp"
+ child_classes = ["aaaPwdStrengthProfile", "aaaPwdProfile", "aaaBlockLoginProfile", "pkiWebTokenData"]
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class=aci_class,
+ aci_rn="userext",
+ ),
+ child_classes=child_classes,
+ )
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+
+ class_config = dict(
+ pwdStrengthCheck=password_strength_check,
+ nameAlias=name_alias,
+ )
+
+ if password_strength_profile:
+ if password_strength_profile.get("enable"):
+ child_configs.append(
+ dict(
+ aaaPwdStrengthProfile=dict(
+ attributes=dict(
+ pwdStrengthTestType=password_strength_profile.get("type"),
+ pwdMinLength=password_strength_profile.get("min_length"),
+ pwdMaxLength=password_strength_profile.get("max_length"),
+ pwdClassFlags=",".join(sorted(password_strength_profile.get("class_flags"))),
+ ),
+ ),
+ ),
+ )
+ # Delete existing aaaPwdStrengthProfile if enable is set to false and it exists
+ # This is done for setting the correct output for changed state
+ elif len(aci.existing) > 0 and len(aci.existing[0].get("aaaUserEp", {}).get("children", {})) > 3:
+ for child in aci.existing[0].get("aaaUserEp", {}).get("children", {}):
+ if "aaaPwdStrengthProfile" in child.keys():
+ child_configs.append(dict(aaaPwdStrengthProfile=dict(attributes=dict(status="deleted"))))
+ break
+
+ if password_change:
+ child_configs.append(
+ dict(
+ aaaPwdProfile=dict(
+ attributes=dict(
+ changeDuringInterval=aci.boolean(password_change.get("enable"), "enable", "disable"),
+ changeInterval=password_change.get("interval"),
+ changeCount=password_change.get("allowed_changes"),
+ noChangeInterval=password_change.get("minimum_period"),
+ historyCount=password_change.get("history_storage_amount"),
+ ),
+ ),
+ ),
+ )
+
+ if lockout:
+ child_configs.append(
+ dict(
+ aaaBlockLoginProfile=dict(
+ attributes=dict(
+ enableLoginBlock=aci.boolean(lockout.get("enable"), "enable", "disable"),
+ maxFailedAttempts=lockout.get("max_attempts"),
+ maxFailedAttemptsWindow=lockout.get("window"),
+ blockDuration=lockout.get("duration"),
+ ),
+ ),
+ ),
+ )
+
+ if web_token:
+ child_configs.append(
+ dict(
+ pkiEp=dict(
+ attributes=dict(descr=""),
+ children=[
+ dict(
+ pkiWebTokenData=dict(
+ attributes=dict(
+ webtokenTimeoutSeconds=web_token.get("timeout"),
+ uiIdleTimeoutSeconds=web_token.get("idle_timeout"),
+ maximumValidityPeriod=web_token.get("validity_period"),
+ sessionRecordFlags="login,logout,refresh" if web_token.get("refresh") else "login,logout",
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ )
+
+ aci.payload(
+ aci_class=aci_class,
+ class_config=class_config,
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class=aci_class)
+
+ aci.post_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_aaa_ssh_auth.py b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_ssh_auth.py
index df4732f28..e1eb4b4d7 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_aaa_ssh_auth.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_aaa_ssh_auth.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_aaa_ssh_auth
-short_description: Manage AAA SSH auth (aaaSshAuth) objects.
+short_description: Manage AAA SSH auth objects (aaa:SshAuth)
description:
- Manage AAA SSH Auth key configuration on Cisco ACI fabrics.
options:
@@ -47,7 +47,7 @@ notes:
The M(cisco.aci.aci_aaa_user) modules can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(aaaSshAuth).
+ description: More information about the internal APIC class B(aaa:SshAuth).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_port_block_to_access_port.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_port_block_to_access_port.py
index 646423290..0067d0463 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_access_port_block_to_access_port.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_port_block_to_access_port.py
@@ -4,6 +4,7 @@
# Copyright: (c) 2018, Simon Metzger <smnmtzgr@gmail.com>
# Copyright: (c) 2020, Shreyas Srish <ssrish@cisco.com>
# Copyright: (c) 2020, Zak Lantz (@manofcolombia) <zakodewald@gmail.com>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -15,55 +16,60 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_access_port_block_to_access_port
-short_description: Manage port blocks of Fabric interface policy leaf profile interface selectors (infra:HPortS, infra:PortBlk)
+short_description: Manage Port blocks of Fabric Access Leaf/Spine Interface Port Selectors (infra:PortBlk)
description:
-- Manage port blocks of Fabric interface policy leaf profile interface selectors on Cisco ACI fabrics.
+- Manage Port blocks of Fabric Access Interface Leaf/Spine Port Selectors on Cisco ACI fabrics.
options:
interface_profile:
description:
- - The name of the Fabric access policy leaf interface profile.
+ - The name of the Fabric access policy leaf/spine interface profile.
type: str
- aliases: [ leaf_interface_profile_name, leaf_interface_profile, interface_profile_name ]
+ aliases:
+ - leaf_interface_profile_name
+ - leaf_interface_profile
+ - interface_profile_name
+ - spine_interface_profile
+ - spine_interface_profile_name
access_port_selector:
description:
- - The name of the Fabric access policy leaf interface profile access port selector.
+ - The name of the Fabric access policy leaf/spine interface port selector.
type: str
aliases: [ name, access_port_selector_name ]
port_blk:
description:
- - The name of the Fabric access policy leaf interface profile access port block.
+ - The name of the Fabric access policy interface port block.
type: str
aliases: [ leaf_port_blk_name, leaf_port_blk ]
port_blk_description:
description:
- - The description to assign to the C(leaf_port_blk).
+ - The description for the port block.
type: str
aliases: [ leaf_port_blk_description ]
from_port:
description:
- - The beginning (from-range) of the port range block for the leaf access port block.
+ - The beginning (from-range) of the port range block for the port block.
type: str
aliases: [ from, fromPort, from_port_range ]
to_port:
description:
- - The end (to-range) of the port range block for the leaf access port block.
+ - The end (to-range) of the port range block for the port block.
type: str
aliases: [ to, toPort, to_port_range ]
from_card:
description:
- - The beginning (from-range) of the card range block for the leaf access port block.
+ - The beginning (from-range) of the card range block for the port block.
type: str
aliases: [ from_card_range ]
to_card:
description:
- - The end (to-range) of the card range block for the leaf access port block.
+ - The end (to-range) of the card range block for the port block.
type: str
aliases: [ to_card_range ]
type:
description:
- - The type of access port block to be created under respective access port.
+ - The type of port block to be created under respective access port.
type: str
- choices: [ fex, leaf ]
+ choices: [ fex, leaf, spine ]
default: leaf
state:
description:
@@ -77,18 +83,27 @@ extends_documentation_fragment:
- cisco.aci.annotation
notes:
-- The C(interface_profile) and C(access_port_selector) must exist before using this module in your playbook.
+- If Adding a port block on an access leaf interface port selector of I(type) C(leaf),
+ The I(interface_profile) and I(access_port_selector) must exist before using this module in your playbook.
The M(cisco.aci.aci_interface_policy_leaf_profile) and M(cisco.aci.aci_access_port_to_interface_policy_leaf_profile) modules can be used for this.
+- If Adding a port block on an access interface port selector of C(type) C(spine),
+ The I(interface_profile) and I(access_port_selector) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_access_spine_interface_profile) and M(cisco.aci.aci_access_spine_interface_selector) modules can be used for this.
seealso:
+- module: cisco.aci.aci_interface_policy_leaf_profile
+- module: cisco.aci.aci_access_port_to_interface_policy_leaf_profile
+- module: cisco.aci.aci_access_spine_interface_profile
+- module: cisco.aci.aci_access_spine_interface_selector
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(infra:HPortS) and B(infra:PortBlk).
+ description: More information about the internal APIC classes B(infra:PortBlk).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Simon Metzger (@smnmtzgr)
+- Gaspard Micol (@gmicol)
"""
EXAMPLES = r"""
-- name: Associate an access port block (single port) to an interface selector
+- name: Associate a Fabric access policy interface port block (single port) to an interface selector
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
@@ -101,7 +116,7 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
-- name: Associate an access port block (port range) to an interface selector
+- name: Associate a Fabric access policy interface port block (port range) to an interface selector
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
@@ -114,7 +129,7 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
-- name: Associate an access port block (single port) to an interface selector of type fex
+- name: Associate a Fabric access policy interface port block (single port) to an interface selector of type fex
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
@@ -128,7 +143,7 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
-- name: Associate an access port block (port range) to an interface selector of type fex
+- name: Associate a Fabric access policy interface port block (port range) to an interface selector of type fex
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
@@ -142,7 +157,7 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
-- name: Remove an access port block from an interface selector
+- name: Query Specific Fabric access policy interface port block under given access port selector
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
@@ -150,12 +165,11 @@ EXAMPLES = r"""
interface_profile: leafintprfname
access_port_selector: accessportselectorname
port_blk: leafportblkname
- from_port: 13
- to_port: 13
- state: absent
+ state: query
delegate_to: localhost
+ register: query_result
-- name: Remove an access port block from an interface selector of type fex
+- name: Query Specific Fabric access policy interface port block under given access port selector of type fex
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
@@ -164,75 +178,76 @@ EXAMPLES = r"""
interface_profile: leafintprfname_fex
access_port_selector: accessportselectorname_fex
port_blk: leafportblkname_fex
- from_port: 13
- to_port: 13
- state: absent
+ state: query
delegate_to: localhost
+ register: query_result
-- name: Query Specific access port block under given access port selector
+- name: Query all Fabric access policy interface port blocks under given leaf interface profile
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
password: SomeSecretPassword
interface_profile: leafintprfname
- access_port_selector: accessportselectorname
- port_blk: leafportblkname
state: query
delegate_to: localhost
register: query_result
-- name: Query Specific access port block under given access port selector of type fex
+- name: Query all Fabric access policy interface port blocks under given leaf interface profile of type fex
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
password: SomeSecretPassword
type: fex
interface_profile: leafintprfname_fex
- access_port_selector: accessportselectorname_fex
- port_blk: leafportblkname_fex
state: query
delegate_to: localhost
register: query_result
-- name: Query all access port blocks under given leaf interface profile
+- name: Query all Fabric access policy interface port blocks in the fabric
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
password: SomeSecretPassword
- interface_profile: leafintprfname
state: query
delegate_to: localhost
register: query_result
-- name: Query all access port blocks under given leaf interface profile of type fex
+- name: Query all Fabric access policy interface port blocks in the fabric of type fex
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
password: SomeSecretPassword
type: fex
- interface_profile: leafintprfname_fex
state: query
delegate_to: localhost
register: query_result
-- name: Query all access port blocks in the fabric
+- name: Remove a Fabric access policy interface port block from an interface selector
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
password: SomeSecretPassword
- state: query
+ interface_profile: leafintprfname
+ access_port_selector: accessportselectorname
+ port_blk: leafportblkname
+ from_port: 13
+ to_port: 13
+ state: absent
delegate_to: localhost
- register: query_result
-- name: Query all access port blocks in the fabric of type fex
+- name: Remove a Fabric access policy interface port block from an interface selector of type fex
cisco.aci.aci_access_port_block_to_access_port:
host: apic
username: admin
password: SomeSecretPassword
type: fex
- state: query
+ interface_profile: leafintprfname_fex
+ access_port_selector: accessportselectorname_fex
+ port_blk: leafportblkname_fex
+ from_port: 13
+ to_port: 13
+ state: absent
delegate_to: localhost
- register: query_result
"""
RETURN = r"""
@@ -348,7 +363,16 @@ def main():
argument_spec = aci_argument_spec()
argument_spec.update(aci_annotation_spec())
argument_spec.update(
- interface_profile=dict(type="str", aliases=["leaf_interface_profile_name", "leaf_interface_profile", "interface_profile_name"]),
+ interface_profile=dict(
+ type="str",
+ aliases=[
+ "leaf_interface_profile_name",
+ "leaf_interface_profile",
+ "interface_profile_name",
+ "spine_interface_profile",
+ "spine_interface_profile_name",
+ ],
+ ),
access_port_selector=dict(type="str", aliases=["name", "access_port_selector_name"]), # Not required for querying all objects
port_blk=dict(type="str", aliases=["leaf_port_blk_name", "leaf_port_blk"]), # Not required for querying all objects
port_blk_description=dict(type="str", aliases=["leaf_port_blk_description"]),
@@ -357,15 +381,15 @@ def main():
from_card=dict(type="str", aliases=["from_card_range"]),
to_card=dict(type="str", aliases=["to_card_range"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
- type=dict(type="str", default="leaf", choices=["fex", "leaf"]), # This parameter is not required for querying all objects
+ type=dict(type="str", default="leaf", choices=["fex", "leaf", "spine"]), # This parameter is not required for querying all objects
)
module = AnsibleModule(
argument_spec=argument_spec,
supports_check_mode=True,
required_if=[
- ["state", "absent", ["access_port_selector", "port_blk", "interface_profile"]],
- ["state", "present", ["access_port_selector", "port_blk", "from_port", "to_port", "interface_profile"]],
+ ["state", "absent", ["interface_profile", "access_port_selector", "port_blk"]],
+ ["state", "present", ["interface_profile", "access_port_selector", "port_blk", "from_port", "to_port"]],
],
)
@@ -381,26 +405,45 @@ def main():
type_port = module.params.get("type")
aci = ACIModule(module)
+
aci_class = "infraAccPortP"
aci_rn = "accportprof"
if type_port == "fex":
aci_class = "infraFexP"
aci_rn = "fexprof"
- aci.construct_url(
- root_class=dict(
- aci_class=aci_class,
- aci_rn="infra/" + aci_rn + "-{0}".format(interface_profile),
+ subclass_1 = dict(
+ aci_class=aci_class,
+ aci_rn="{0}-{1}".format(aci_rn, interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ )
+ subclass_2 = dict(
+ aci_class="infraHPortS",
+ aci_rn="hports-{0}-typ-range".format(access_port_selector),
+ module_object=access_port_selector,
+ target_filter={"name": access_port_selector},
+ )
+ if type_port == "spine":
+ subclass_1 = dict(
+ aci_class="infraSpAccPortP",
+ aci_rn="spaccportprof-{0}".format(interface_profile),
module_object=interface_profile,
target_filter={"name": interface_profile},
- ),
- subclass_1=dict(
- aci_class="infraHPortS",
- # NOTE: normal rn: hports-{name}-typ-{type}, hence here hardcoded to range for purposes of module
- aci_rn="hports-{0}-typ-range".format(access_port_selector),
+ )
+ subclass_2 = dict(
+ aci_class="infraSHPortS",
+ aci_rn="shports-{0}-typ-range".format(access_port_selector),
module_object=access_port_selector,
target_filter={"name": access_port_selector},
+ )
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
),
- subclass_2=dict(
+ subclass_1=subclass_1,
+ subclass_2=subclass_2,
+ subclass_3=dict(
aci_class="infraPortBlk",
aci_rn="portblk-{0}".format(port_blk),
module_object=port_blk,
@@ -420,7 +463,6 @@ def main():
toPort=to_port,
fromCard=from_card,
toCard=to_card,
- # type='range',
),
)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_port_to_interface_policy_leaf_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_port_to_interface_policy_leaf_profile.py
index 7b5c896ad..f2e921394 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_access_port_to_interface_policy_leaf_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_port_to_interface_policy_leaf_profile.py
@@ -14,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_access_port_to_interface_policy_leaf_profile
-short_description: Manage Fabric interface policy leaf profile interface selectors (infra:HPortS, infra:RsAccBaseGrp, infra:PortBlk)
+short_description: Manage Fabric interface policy leaf profile interface selectors (infra:HPortS, infra:RsAccBaseGrp, and infra:PortBlk)
description:
- Manage Fabric interface policy leaf profile interface selectors on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile.py
new file mode 100644
index 000000000..a34f269ae
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile.py
@@ -0,0 +1,279 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "metadata_version": "1.1",
+ "status": ["preview"],
+ "supported_by": "certified",
+}
+
+DOCUMENTATION = r"""
+---
+module: aci_access_spine_interface_profile
+short_description: Manage fabric interface policy spine profiles (infra:SpAccPortP)
+description:
+- Manage fabric interface policy spine profiles on Cisco ACI fabrics.
+options:
+ interface_profile:
+ description:
+ - The name of the Fabric access policy spine interface profile.
+ type: str
+ aliases: [ name, spine_interface_profile_name, spine_interface_profile, interface_profile_name ]
+ description:
+ description:
+ - The description for the Fabric access policy spine interface profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(infra:SpAccPortP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Eric Girard (@netgirard)
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new spine_interface_profile
+ cisco.aci.aci_access_spine_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ interface_profile: spineintprfname
+ description: spineintprfname description
+ state: present
+ delegate_to: localhost
+
+- name: Query a spine_interface_profile
+ cisco.aci.aci_access_spine_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ interface_profile: spineintprfname
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all spine_interface_profiles
+ cisco.aci.aci_access_spine_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Remove a spine_interface_profile
+ cisco.aci.aci_access_spine_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ interface_profile: spineintprfname
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ interface_profile=dict(
+ type="str",
+ aliases=[
+ "name",
+ "spine_interface_profile_name",
+ "spine_interface_profile",
+ "interface_profile_name",
+ ],
+ ),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["interface_profile"]],
+ ["state", "present", ["interface_profile"]],
+ ],
+ )
+
+ interface_profile = module.params.get("interface_profile")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
+ ),
+ subclass_1=dict(
+ aci_class="infraSpAccPortP",
+ aci_rn="spaccportprof-{0}".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="infraSpAccPortP",
+ class_config=dict(
+ name=interface_profile,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="infraSpAccPortP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile_to_spine_switch_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile_to_spine_switch_profile.py
new file mode 100644
index 000000000..17d8517c1
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_profile_to_spine_switch_profile.py
@@ -0,0 +1,292 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "metadata_version": "1.1",
+ "status": ["preview"],
+ "supported_by": "certified",
+}
+
+DOCUMENTATION = r"""
+---
+module: aci_access_spine_interface_profile_to_spine_switch_profile
+short_description: Bind Fabric Access Spine Interface Profiles to Fabric Acces Spine Switch Profiles (infra:RsSpAccPortP)
+description:
+- Bind access spine interface selector profiles to access switch policy spine profiles on Cisco ACI fabrics.
+options:
+ switch_profile:
+ description:
+ - The name of the Fabric Access Spine Switch Profile to which we add a Spine Interface Selector Profile.
+ type: str
+ aliases: [ switch_profile_name, spine_switch_profile, spine_switch_profile_name ]
+ interface_profile:
+ description:
+ - The name of the Fabric Access Spine Interface Profile to be added and associated with the Spine Switch Profile.
+ type: str
+ aliases: [ interface_profile_name, spine_interface_profile, spine_interface_profile_name ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- This module requires an existing I(switch_profile).
+ The module M(cisco.aci.aci_access_spine_switch_profile) can be used for this.
+- The I(interface_profile) accepts non existing spine interface profile names.
+ They appear on APIC GUI with a state of "missing-target".
+ The module M(cisco.aci.aci_access_spine_interface_profile) can be used to create them.
+seealso:
+- module: cisco.aci.aci_access_spine_switch_profile
+- module: cisco.aci.aci_access_spine_interface_profile
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(infra:RsSpAccPortP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Eric Girard (@netgirard)
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Associating an interface selector profile to a switch policy spine profile
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: sw_name
+ interface_profile: interface_profile_name
+ state: present
+ delegate_to: localhost
+
+- name: Query an interface selector profile associated with a switch policy spine profile
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: sw_name
+ interface_profile: interface_profile_name
+ state: query
+ delegate_to: localhost
+
+- name: Query all association of interface selector profiles with a switch policy spine profile
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Remove an interface selector profile associated with a switch policy spine profile
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: sw_name
+ interface_profile: interface_profile_name
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ switch_profile=dict(
+ type="str",
+ aliases=[
+ "switch_profile_name",
+ "spine_switch_profile",
+ "spine_switch_profile_name",
+ ],
+ ), # Not required for querying all objects
+ interface_profile=dict(
+ type="str",
+ aliases=[
+ "interface_profile_name",
+ "spine_interface_profile",
+ "spine_interface_profile_name",
+ ],
+ ), # Not required for querying all objects
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["switch_profile", "interface_profile"]],
+ ["state", "present", ["switch_profile", "interface_profile"]],
+ ],
+ )
+
+ switch_profile = module.params.get("switch_profile")
+ interface_profile = module.params.get("interface_profile")
+ state = module.params.get("state")
+
+ # Defining the interface profile tDn for clarity
+ interface_profile_tDn = "uni/infra/spaccportprof-{0}".format(interface_profile)
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
+ ),
+ subclass_1=dict(
+ aci_class="infraSpineP",
+ aci_rn="spprof-{0}".format(switch_profile),
+ module_object=switch_profile,
+ target_filter={"name": switch_profile},
+ ),
+ subclass_2=dict(
+ aci_class="infraRsSpAccPortP",
+ aci_rn="rsspAccPortP-[{0}]".format(interface_profile_tDn),
+ module_object=interface_profile,
+ target_filter={"tDn": interface_profile_tDn},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="infraRsSpAccPortP",
+ class_config=dict(tDn=interface_profile_tDn),
+ )
+
+ aci.get_diff(aci_class="infraRsSpAccPortP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_selector.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_selector.py
new file mode 100644
index 000000000..373a31e76
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_interface_selector.py
@@ -0,0 +1,326 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_access_spine_interface_selector
+short_description: Manage Fabric Access Policy Spine Interface Port Selectors (infra:SHPortS)
+description:
+- Manage Fabric Access Policy Spine Interface Port Selectors on Cisco ACI fabrics.
+- This selector is used for applying infrastructure policies on selected ports.
+options:
+ spine_interface_profile:
+ description:
+ - The name of the Fabric access policy spine interface profile.
+ type: str
+ aliases: [ spine_interface_profile_name, interface_profile, interface_profile_name ]
+ spine_interface_selector:
+ description:
+ - The name of the Fabric access spine interface port selector.
+ type: str
+ aliases: [ name, spine_interface_selector_name, interface_selector, interface_selector_name, access_port_selector, access_port_selector_name ]
+ description:
+ description:
+ - The description for the spine interface port selector.
+ type: str
+ policy_group:
+ description:
+ - The name of the fabric access policy group to be associated with the spine interface port selector.
+ type: str
+ aliases: [ policy_group_name ]
+ selector_type:
+ description:
+ - The host port selector type.
+ - If using a port block to specify range of interfaces, the type must be set to C(range).
+ type: str
+ choices: [ all, range ]
+ aliases: [ type ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(spine_interface_profile) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_access_spine_interface_profile) module can be used for this.
+- If a I(policy_group) is used, it must exist before using this module in your playbook.
+ The M(cisco.aci.aci_interface_policy_spine_policy_group) module can be used for this.
+seealso:
+- module: cisco.aci.aci_access_port_block_to_access_port
+- module: cisco.aci.aci_interface_policy_spine_policy_group
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes B(infra:SHPortS) and B(infra:RsSpAccGrp).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new access spine interface selector
+ cisco.aci.aci_access_spine_interface_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ spine_interface_profile: my_access_spine_interface_profile
+ spine_interface_selector: my_access_spine_interface_selector
+ selector_type: range
+ policy_group: my_access_spine_interface_policy_group
+ state: present
+ delegate_to: localhost
+
+- name: Query a specific access spine interface selector under given spine_interface_profile
+ cisco.aci.aci_access_spine_interface_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ spine_interface_profile: my_access_spine_interface_profile
+ spine_interface_selector: my_access_spine_interface_selector
+ selector_type: range
+ state: query
+ delegate_to: localhost
+
+- name: Query all access spine interface selectors under given spine_interface_profile
+ cisco.aci.aci_access_spine_interface_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ spine_interface_profile: my_access_spine_interface_profile
+ state: query
+ delegate_to: localhost
+
+- name: Query all access spine interface selectors
+ cisco.aci.aci_access_spine_interface_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Remove an access spine interface selector
+ cisco.aci.aci_access_spine_interface_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ spine_interface_profile: my_access_spine_interface_profile
+ spine_interface_selector: my_access_spine_interface_selector
+ selector_type: range
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_ACCESS_POLICIES_SELECTOR_TYPE
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ spine_interface_profile=dict(type="str", aliases=["spine_interface_profile_name", "interface_profile", "interface_profile_name"]),
+ spine_interface_selector=dict(
+ type="str",
+ aliases=[
+ "name",
+ "spine_interface_selector_name",
+ "interface_selector",
+ "interface_selector_name",
+ "access_port_selector",
+ "access_port_selector_name",
+ ],
+ ), # Not required for querying all objects
+ description=dict(type="str"),
+ policy_group=dict(type="str", aliases=["policy_group_name"]),
+ selector_type=dict(type="str", choices=list(MATCH_ACCESS_POLICIES_SELECTOR_TYPE.keys()), aliases=["type"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["spine_interface_profile", "spine_interface_selector", "selector_type"]],
+ ["state", "present", ["spine_interface_profile", "spine_interface_selector", "selector_type"]],
+ ],
+ )
+
+ spine_interface_profile = module.params.get("spine_interface_profile")
+ spine_interface_selector = module.params.get("spine_interface_selector")
+ description = module.params.get("description")
+ policy_group = module.params.get("policy_group")
+ selector_type = MATCH_ACCESS_POLICIES_SELECTOR_TYPE.get(module.params.get("selector_type"))
+ state = module.params.get("state")
+
+ child_configs = []
+ if policy_group is not None:
+ child_configs.append(dict(infraRsSpAccGrp=dict(attributes=dict(tDn="uni/infra/funcprof/spaccportgrp-{0}".format(policy_group)))))
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
+ ),
+ subclass_1=dict(
+ aci_class="infraSpAccPortP",
+ aci_rn="spaccportprof-{0}".format(spine_interface_profile),
+ module_object=spine_interface_profile,
+ target_filter={"name": spine_interface_profile},
+ ),
+ subclass_2=dict(
+ aci_class="infraSHPortS",
+ aci_rn="shports-{0}-typ-{1}".format(spine_interface_selector, selector_type),
+ module_object=spine_interface_selector,
+ target_filter={"name": spine_interface_selector},
+ ),
+ child_classes=["infraRsSpAccGrp"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="infraSHPortS",
+ class_config=dict(
+ descr=description,
+ name=spine_interface_selector,
+ type=selector_type,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="infraSHPortS")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_profile.py
new file mode 100644
index 000000000..22d4756a7
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_profile.py
@@ -0,0 +1,277 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "metadata_version": "1.1",
+ "status": ["preview"],
+ "supported_by": "certified",
+}
+
+DOCUMENTATION = r"""
+---
+module: aci_access_spine_switch_profile
+short_description: Manage Fabric Access Spine Switch Profiles (infra:SpineP)
+description:
+- Manage Fabric access switch policy spine profiles on Cisco ACI fabrics.
+options:
+ switch_profile:
+ description:
+ - The name of the Fabric Access Spine Switch Profile.
+ type: str
+ aliases: [ switch_profile_name, name, spine_switch_profile, spine_switch_profile_name ]
+ description:
+ description:
+ - The description for the Fabric Access Spine Switch Profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(infra:SpineP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Eric Girard (@netgirard)
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Access Spine Switch Profile
+ cisco.aci.aci_access_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: sw_name
+ description: sw_description
+ state: present
+ delegate_to: localhost
+
+- name: Query an Access Spine Switch Profile
+ cisco.aci.aci_access_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: sw_name
+ state: query
+ delegate_to: localhost
+
+- name: Query all Access Spine Switch Profiles
+ cisco.aci.aci_access_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Remove an Access Spine Switch Profile
+ cisco.aci.aci_access_spine_switch_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: sw_name
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ switch_profile=dict(
+ type="str",
+ aliases=[
+ "name",
+ "switch_profile_name",
+ "spine_switch_profile",
+ "spine_switch_profile_name",
+ ],
+ ), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["switch_profile"]],
+ ["state", "present", ["switch_profile"]],
+ ],
+ )
+
+ switch_profile = module.params.get("switch_profile")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
+ ),
+ subclass_1=dict(
+ aci_class="infraSpineP",
+ aci_rn="spprof-{0}".format(switch_profile),
+ module_object=switch_profile,
+ target_filter={"name": switch_profile},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="infraSpineP",
+ class_config=dict(
+ name=switch_profile,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="infraSpineP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_selector.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_selector.py
new file mode 100644
index 000000000..c7cee4b5e
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_spine_switch_selector.py
@@ -0,0 +1,321 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "metadata_version": "1.1",
+ "status": ["preview"],
+ "supported_by": "certified",
+}
+
+DOCUMENTATION = r"""
+---
+module: aci_access_spine_switch_selector
+short_description: Manage Fabric Access Policy Spine Switch Port Selectors (infra:SpineS)
+description:
+- Manage Fabric Access Policy Spine Switch Port Selectors on Cisco ACI fabrics.
+options:
+ spine_switch_profile:
+ description:
+ - The name of the Fabric access policy spine switch profile.
+ type: str
+ aliases: [ spine_switch_profile_name, switch_profile, switch_profile_name ]
+ spine_switch_selector:
+ description:
+ - The name of the Fabric access spine switch port selector.
+ type: str
+ aliases: [ name, spine_switch_selector_name, switch_selector, switch_selector_name, access_port_selector, access_port_selector_name ]
+ description:
+ description:
+ - The description for the spine switch port selector.
+ type: str
+ policy_group:
+ description:
+ - The name of the fabric access policy group to be associated with the spine switch port selector.
+ type: str
+ aliases: [ policy_group_name ]
+ selector_type:
+ description:
+ - The host port selector type.
+ - If using a port block to specify range of switches, the type must be set to C(range).
+ type: str
+ choices: [ all, range ]
+ aliases: [ type ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(spine_switch_profile) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_access_spine_switch_profile) module can be used for this.
+- If a I(policy_group) is used, it must exist before using this module in your playbook.
+ The M(cisco.aci.aci_switch_policy_group) module can be used for this.
+seealso:
+- module: cisco.aci.aci_access_spine_switch_profile
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes B(infra:SpineS) and B(infra:RsAccNodePGrp).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Eric Girard (@netgirard)
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a switch policy spine profile selector (with policy group)
+ cisco.aci.aci_access_spine_switch_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ spine_switch_profile: sw_name
+ spine_switch_selector: spine_selector_name
+ selector_type: range
+ policy_group: somepolicygroupname
+ state: present
+ delegate_to: localhost
+
+- name: Query a switch policy spine profile selector
+ cisco.aci.aci_access_spine_switch_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ spine_switch_profile: sw_name
+ spine_switch_selector: spine_selector_name
+ selector_type: range
+ state: query
+ delegate_to: localhost
+
+- name: Query all switch policy spine profile selectors
+ cisco.aci.aci_access_spine_switch_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Remove a switch policy spine profile selector
+ cisco.aci.aci_access_spine_switch_selector:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ spine_switch_profile: sw_name
+ spine_switch_selector: spine_selector_name
+ selector_type: range
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_ACCESS_POLICIES_SELECTOR_TYPE
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ spine_switch_profile=dict(type="str", aliases=["spine_switch_profile_name", "switch_profile", "switch_profile_name"]),
+ spine_switch_selector=dict(
+ type="str",
+ aliases=[
+ "name",
+ "spine_switch_selector_name",
+ "switch_selector",
+ "switch_selector_name",
+ "access_port_selector",
+ "access_port_selector_name",
+ ],
+ ), # Not required for querying all objects
+ description=dict(type="str"),
+ policy_group=dict(type="str", aliases=["policy_group_name"]),
+ selector_type=dict(type="str", choices=list(MATCH_ACCESS_POLICIES_SELECTOR_TYPE.keys()), aliases=["type"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["spine_switch_profile", "spine_switch_selector", "selector_type"]],
+ ["state", "present", ["spine_switch_profile", "spine_switch_selector", "selector_type"]],
+ ],
+ )
+
+ spine_switch_profile = module.params.get("spine_switch_profile")
+ spine_switch_selector = module.params.get("spine_switch_selector")
+ description = module.params.get("description")
+ policy_group = module.params.get("policy_group")
+ selector_type = MATCH_ACCESS_POLICIES_SELECTOR_TYPE.get(module.params.get("selector_type"))
+ state = module.params.get("state")
+
+ child_configs = []
+ if policy_group is not None:
+ child_configs.append(dict(infraRsSpineAccNodePGrp=dict(attributes=dict(tDn="uni/infra/funcprof/spaccnodepgrp-{0}".format(policy_group)))))
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
+ ),
+ subclass_1=dict(
+ aci_class="infraSpineP",
+ aci_rn="spprof-{0}".format(spine_switch_profile),
+ module_object=spine_switch_profile,
+ target_filter={"name": spine_switch_profile},
+ ),
+ subclass_2=dict(
+ aci_class="infraSpineS",
+ aci_rn="spines-{0}-typ-{1}".format(spine_switch_selector, selector_type),
+ module_object=spine_switch_selector,
+ target_filter={"name": spine_switch_selector},
+ ),
+ child_classes=["infraRsSpineAccNodePGrp"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="infraSpineS",
+ class_config=dict(
+ descr=description,
+ name=spine_switch_selector,
+ type=selector_type,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="infraSpineS")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_sub_port_block_to_access_port.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_sub_port_block_to_access_port.py
index 8073c6ca2..a3006ad4c 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_access_sub_port_block_to_access_port.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_sub_port_block_to_access_port.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_access_sub_port_block_to_access_port
-short_description: Manage sub port blocks of Fabric interface policy leaf profile interface selectors (infra:HPortS, infra:SubPortBlk)
+short_description: Manage sub port blocks of Fabric interface policy leaf profile interface selectors (infra:HPortS and infra:SubPortBlk)
description:
- Manage sub port blocks of Fabric interface policy leaf profile interface selectors on Cisco ACI fabrics.
seealso:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_access_switch_policy_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_access_switch_policy_group.py
new file mode 100644
index 000000000..d1ed40408
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_access_switch_policy_group.py
@@ -0,0 +1,600 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Tim Cragg (@timcragg)
+# Copyright: (c) 2023, Akini Ross (@akinross)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_access_switch_policy_group
+short_description: Manage Access Switch Policy Groups (infra:AccNodePGrp and infra:SpineAccNodePGrp).
+description:
+- Manage Access Switch Policy Groups on Cisco ACI fabrics.
+options:
+ name:
+ description:
+ - The name of the access switch policy group.
+ aliases: [ policy_group ]
+ type: str
+ description:
+ description:
+ - The description of the access switch policy group.
+ type: str
+ switch_type:
+ description:
+ - Whether this is a leaf or spine policy group
+ type: str
+ choices: [ leaf, spine ]
+ required: true
+ spanning_tree_policy:
+ description:
+ - The spanning tree policy bound to the access switch policy group.
+ - Only available in APIC version 5.2 or later.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ bfd_ipv4_policy:
+ description:
+ - The BFD IPv4 policy bound to the access switch policy group.
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ bfd_ipv6_policy:
+ description:
+ - The BFD IPv6 policy bound to the access switch policy group.
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ bfd_multihop_ipv4_policy:
+ description:
+ - The BFD multihop IPv4 policy bound to the access switch policy group.
+ - Only available in APIC version 5.x or later.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ bfd_multihop_ipv6_policy:
+ description:
+ - The BFD multihop IPv6 policy bound to the access switch policy group.
+ - Only available in APIC version 5.x or later.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ fibre_channel_node_policy:
+ description:
+ - The fibre channel node policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ poe_node_policy:
+ description:
+ - The PoE node policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ fibre_channel_san_policy:
+ description:
+ - The fibre channel SAN policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ monitoring_policy:
+ description:
+ - The monitoring policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ netflow_node_policy:
+ description:
+ - The netflow node policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ copp_policy:
+ description:
+ - The CoPP policy bound to the access switch policy group.
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ forward_scale_profile_policy:
+ description:
+ - The forward scale profile policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ fast_link_failover_policy:
+ description:
+ - The fast link failover policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ node_802_1x_authentication_policy:
+ description:
+ - The 802.1x node authentication policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ copp_pre_filter_policy:
+ description:
+ - The CoPP pre-filter policy bound to the access switch policy group.
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ equipment_flash_policy:
+ description:
+ - The equipment flash policy bound to the access switch policy group.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ cdp_policy:
+ description:
+ - The CDP policy bound to the access switch policy group.
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ lldp_policy:
+ description:
+ - The LLDP policy bound to the access switch policy group.
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ sync_e_node_policy:
+ description:
+ - The SyncE node policy bound to the access switch policy group.
+ - Only available in APIC version 5.x or later.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ ptp_node_policy:
+ description:
+ - The PTP node policy bound to the access switch policy group.
+ - Only available in APIC version 5.2 or later.
+ - Only available when I(switch_type=leaf).
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ usb_configuration_policy:
+ description:
+ - The USB configuration policy bound to the access switch policy group.
+ - Only available in APIC version 5.2 or later.
+ - The APIC defaults to C("") which results in the target DN set to the default policy when unset during creation.
+ type: str
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(infra:AccNodePGrp) and B(infra:SpineAccNodePGrp).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Tim Cragg (@timcragg)
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Create Leaf Access Switch Policy Group
+ cisco.aci.aci_access_switch_policy_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: ansible_pol_grp_spine
+ switch_type: leaf
+ spanning_tree_policy: example_spanning_tree_policy
+ bfd_ipv4_policy: example_bfd_ipv4_policy
+ bfd_ipv6_policy: example_bfd_ipv6_policy
+ fibre_channel_node_policy: example_fibre_channel_node_policy
+ poe_node_policy: example_poe_node_policy
+ fibre_channel_san_policy: example_fibre_channel_san_policy
+ monitoring_policy: example_monitoring_policy
+ copp_policy: example_copp_policy
+ forward_scale_profile_policy: example_forward_scale_profile_policy
+ fast_link_failover_policy: example_fast_link_failover_policy
+ node_802_1x_authentication_policy: example_node_802_1x_authentication_policy
+ copp_pre_filter_policy: example_copp_pre_filter_policy
+ equipment_flash_policy: example_equipment_flash_policy
+ cdp_policy: example_cdp_policy
+ lldp_policy: example_lldp_policy
+ state: present
+ delegate_to: localhost
+
+- name: Create Spine Access Switch Policy Group
+ cisco.aci.aci_access_switch_policy_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: ansible_pol_grp_leaf
+ switch_type: spine
+ bfd_ipv4_policy: example_bfd_ipv4_policy
+ bfd_ipv6_policy: example_bfd_ipv6_policy
+ copp_policy: example_copp_policy
+ copp_pre_filter_policy: example_copp_pre_filter_policy
+ cdp_policy: example_cdp_policy
+ lldp_policy: example_lldp_policy
+ state: present
+ delegate_to: localhost
+
+- name: Delete Leaf Access Switch Policy Group
+ cisco.aci.aci_access_switch_policy_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: ansible_pol_grp_leaf
+ switch_type: leaf
+ state: absent
+ delegate_to: localhost
+
+- name: Query Leaf Access Switch Policy Group
+ cisco.aci.aci_access_switch_policy_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: ansible_pol_grp_leaf
+ switch_type: leaf
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query All Leaf Access Switch Policy Groups
+ cisco.aci.aci_access_switch_policy_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_type: leaf
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+ current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+ raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class "/></imdata>'
+ sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+ previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+ filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+ method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+ response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+ status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+ url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+ """
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ name=dict(type="str", aliases=["policy_group"]),
+ description=dict(type="str"),
+ switch_type=dict(type="str", choices=["leaf", "spine"], required=True),
+ spanning_tree_policy=dict(type="str"),
+ bfd_ipv4_policy=dict(type="str"),
+ bfd_ipv6_policy=dict(type="str"),
+ bfd_multihop_ipv4_policy=dict(type="str"),
+ bfd_multihop_ipv6_policy=dict(type="str"),
+ fibre_channel_node_policy=dict(type="str"),
+ poe_node_policy=dict(type="str"),
+ fibre_channel_san_policy=dict(type="str"),
+ monitoring_policy=dict(type="str"),
+ netflow_node_policy=dict(type="str"),
+ copp_policy=dict(type="str"),
+ forward_scale_profile_policy=dict(type="str"),
+ fast_link_failover_policy=dict(type="str"),
+ node_802_1x_authentication_policy=dict(type="str"),
+ copp_pre_filter_policy=dict(type="str"),
+ equipment_flash_policy=dict(type="str"),
+ cdp_policy=dict(type="str"),
+ lldp_policy=dict(type="str"),
+ sync_e_node_policy=dict(type="str"),
+ ptp_node_policy=dict(type="str"),
+ usb_configuration_policy=dict(type="str"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["name"]],
+ ["state", "present", ["name"]],
+ ],
+ )
+ name = module.params.get("name")
+ description = module.params.get("description")
+ switch_type = module.params.get("switch_type")
+ spanning_tree_policy = module.params.get("spanning_tree_policy")
+ bfd_ipv4_policy = module.params.get("bfd_ipv4_policy")
+ bfd_ipv6_policy = module.params.get("bfd_ipv6_policy")
+ bfd_multihop_ipv4_policy = module.params.get("bfd_multihop_ipv4_policy")
+ bfd_multihop_ipv6_policy = module.params.get("bfd_multihop_ipv6_policy")
+ fibre_channel_node_policy = module.params.get("fibre_channel_node_policy")
+ poe_node_policy = module.params.get("poe_node_policy")
+ fibre_channel_san_policy = module.params.get("fibre_channel_san_policy")
+ monitoring_policy = module.params.get("monitoring_policy")
+ netflow_node_policy = module.params.get("netflow_node_policy")
+ copp_policy = module.params.get("copp_policy")
+ forward_scale_profile_policy = module.params.get("forward_scale_profile_policy")
+ fast_link_failover_policy = module.params.get("fast_link_failover_policy")
+ node_802_1x_authentication_policy = module.params.get("node_802_1x_authentication_policy")
+ copp_pre_filter_policy = module.params.get("copp_pre_filter_policy")
+ equipment_flash_policy = module.params.get("equipment_flash_policy")
+ cdp_policy = module.params.get("cdp_policy")
+ lldp_policy = module.params.get("lldp_policy")
+ sync_e_node_policy = module.params.get("sync_e_node_policy")
+ ptp_node_policy = module.params.get("ptp_node_policy")
+ usb_configuration_policy = module.params.get("usb_configuration_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ if switch_type == "spine" and not all(
+ v is None
+ for v in [
+ spanning_tree_policy,
+ bfd_multihop_ipv4_policy,
+ bfd_multihop_ipv6_policy,
+ fibre_channel_node_policy,
+ poe_node_policy,
+ fibre_channel_san_policy,
+ monitoring_policy,
+ netflow_node_policy,
+ forward_scale_profile_policy,
+ fast_link_failover_policy,
+ node_802_1x_authentication_policy,
+ equipment_flash_policy,
+ sync_e_node_policy,
+ ptp_node_policy,
+ ]
+ ):
+ aci.fail_json(msg="Unsupported policy provided for spine switch type.")
+
+ class_name = ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("class_name")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class=class_name,
+ aci_rn=ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("rn").format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ rsp_subtree="children",
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ if forward_scale_profile_policy is not None:
+ child_configs.append({"infraRsTopoctrlFwdScaleProfPol": {"attributes": {"tnTopoctrlFwdScaleProfilePolName": forward_scale_profile_policy}}})
+ if usb_configuration_policy is not None:
+ child_configs.append(
+ {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("usb_configuration_policy")
+ .get("class_name"): {
+ "attributes": {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("usb_configuration_policy")
+ .get("tn_name"): usb_configuration_policy
+ }
+ }
+ }
+ )
+ if lldp_policy is not None:
+ child_configs.append(
+ {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("lldp_policy")
+ .get("class_name"): {
+ "attributes": {ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("lldp_policy").get("tn_name"): lldp_policy}
+ }
+ }
+ )
+ if cdp_policy is not None:
+ child_configs.append(
+ {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("cdp_policy")
+ .get("class_name"): {
+ "attributes": {ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("cdp_policy").get("tn_name"): cdp_policy}
+ }
+ }
+ )
+ if bfd_ipv4_policy is not None:
+ child_configs.append(
+ {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("bfd_ipv4_policy")
+ .get("class_name"): {
+ "attributes": {ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("bfd_ipv4_policy").get("tn_name"): bfd_ipv4_policy}
+ }
+ }
+ )
+ if bfd_ipv6_policy is not None:
+ child_configs.append(
+ {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("bfd_ipv6_policy")
+ .get("class_name"): {
+ "attributes": {ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("bfd_ipv6_policy").get("tn_name"): bfd_ipv6_policy}
+ }
+ }
+ )
+ if sync_e_node_policy is not None:
+ child_configs.append({"infraRsSynceInstPol": {"attributes": {"tnSynceInstPolName": sync_e_node_policy}}})
+ if poe_node_policy is not None:
+ child_configs.append({"infraRsPoeInstPol": {"attributes": {"tnPoeInstPolName": poe_node_policy}}})
+ if bfd_multihop_ipv4_policy is not None:
+ child_configs.append({"infraRsBfdMhIpv4InstPol": {"attributes": {"tnBfdMhIpv4InstPolName": bfd_multihop_ipv4_policy}}})
+ if bfd_multihop_ipv6_policy is not None:
+ child_configs.append({"infraRsBfdMhIpv6InstPol": {"attributes": {"tnBfdMhIpv6InstPolName": bfd_multihop_ipv6_policy}}})
+ if equipment_flash_policy is not None:
+ child_configs.append({"infraRsEquipmentFlashConfigPol": {"attributes": {"tnEquipmentFlashConfigPolName": equipment_flash_policy}}})
+ if monitoring_policy is not None:
+ child_configs.append({"infraRsMonNodeInfraPol": {"attributes": {"tnMonInfraPolName": monitoring_policy}}})
+ if fibre_channel_node_policy is not None:
+ child_configs.append({"infraRsFcInstPol": {"attributes": {"tnFcInstPolName": fibre_channel_node_policy}}})
+ if fast_link_failover_policy is not None:
+ child_configs.append(
+ {"infraRsTopoctrlFastLinkFailoverInstPol": {"attributes": {"tnTopoctrlFastLinkFailoverInstPolName": fast_link_failover_policy}}}
+ )
+ if spanning_tree_policy is not None:
+ child_configs.append({"infraRsMstInstPol": {"attributes": {"tnStpInstPolName": spanning_tree_policy}}})
+ if fibre_channel_san_policy is not None:
+ child_configs.append({"infraRsFcFabricPol": {"attributes": {"tnFcFabricPolName": fibre_channel_san_policy}}})
+ if copp_policy is not None:
+ child_configs.append(
+ {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("copp_policy")
+ .get("class_name"): {
+ "attributes": {ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("copp_policy").get("tn_name"): copp_policy}
+ }
+ }
+ )
+ if node_802_1x_authentication_policy is not None:
+ child_configs.append({"infraRsL2NodeAuthPol": {"attributes": {"tnL2NodeAuthPolName": node_802_1x_authentication_policy}}})
+ if copp_pre_filter_policy is not None:
+ child_configs.append(
+ {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type)
+ .get("copp_pre_filter_policy")
+ .get("class_name"): {
+ "attributes": {
+ ACI_ACCESS_SWITCH_POLICY_GROUP_CLASS_MAPPING.get(switch_type).get("copp_pre_filter_policy").get("tn_name"): copp_pre_filter_policy
+ }
+ }
+ }
+ )
+ if netflow_node_policy is not None:
+ child_configs.append({"infraRsNetflowNodePol": {"attributes": {"tnNetflowNodePolName": netflow_node_policy}}})
+ if ptp_node_policy is not None:
+ child_configs.append({"infraRsPtpInstPol": {"attributes": {"tnPtpInstPolName": ptp_node_policy}}})
+
+ if child_configs == []:
+ child_configs = None
+
+ aci.payload(
+ aci_class=class_name,
+ class_config=dict(
+ descr=description,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class=class_name)
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_additional_communities.py b/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_additional_communities.py
new file mode 100644
index 000000000..c6bd998d9
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_additional_communities.py
@@ -0,0 +1,304 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_action_rule_additional_communities
+short_description: Manage Action Rules based on Additional Communities (rtctrl:SetAddComm)
+description:
+- Set additional communities for the action rule profiles on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of the tenant.
+ type: str
+ aliases: [ tenant_name ]
+ action_rule:
+ description:
+ - The name of the action rule profile.
+ type: str
+ aliases: [ action_rule_name ]
+ community:
+ description:
+ - The community value.
+ type: str
+ criteria:
+ description:
+ - The community criteria.
+ - The option to append or replace the community value.
+ type: str
+ choices: [ append, replace, none ]
+ description:
+ description:
+ - The description for the action rule profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant) and the C(action_rule) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_tenant_action_rule_profile) modules can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_tenant_action_rule_profile
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(rtctrl:SetAddComm).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Create an additional communities action rule
+ cisco.aci.aci_action_rule_additional_communities:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ community: no-advertise
+ criteria: replace
+ state: present
+ delegate_to: localhost
+
+- name: Delete an additional communities action rule
+ cisco.aci.aci_action_rule_additional_communities:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ community: no-advertise
+ state: absent
+ delegate_to: localhost
+
+- name: Query all additional communities action rules
+ cisco.aci.aci_action_rule_additional_communities:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query an additional communities action rule
+ cisco.aci.aci_action_rule_additional_communities:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ community: no-advertise
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ action_rule=dict(type="str", aliases=["action_rule_name"]), # Not required for querying all objects
+ community=dict(type="str"),
+ criteria=dict(type="str", choices=["append", "replace", "none"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["action_rule", "tenant", "community"]],
+ ["state", "present", ["action_rule", "tenant", "community"]],
+ ],
+ )
+
+ community = module.params.get("community")
+ criteria = module.params.get("criteria")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ action_rule = module.params.get("action_rule")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="rtctrlAttrP",
+ aci_rn="attr-{0}".format(action_rule),
+ module_object=action_rule,
+ target_filter={"name": action_rule},
+ ),
+ subclass_2=dict(
+ aci_class="rtctrlSetAddComm",
+ aci_rn="saddcomm-{0}".format(community),
+ module_object=community,
+ target_filter={"community": community},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="rtctrlSetAddComm",
+ class_config=dict(
+ community=community,
+ setCriteria=criteria,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="rtctrlSetAddComm")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path.py b/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path.py
new file mode 100644
index 000000000..580cc4cff
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path.py
@@ -0,0 +1,304 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_action_rule_set_as_path
+short_description: Manage the AS Path action rules (rtctrl:SetASPath)
+description:
+- Set AS path action rule for the action rule profiles on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of the tenant.
+ type: str
+ aliases: [ tenant_name ]
+ action_rule:
+ description:
+ - The name of the action rule profile.
+ type: str
+ aliases: [ action_rule_name ]
+ last_as:
+ description:
+ - The last AS number value.
+ type: int
+ aliases: [ last_as_number ]
+ criteria:
+ description:
+ - The option to append the specified AS number or to prepend the last AS numbers to the AS Path.
+ type: str
+ choices: [ prepend, prepend-last-as ]
+ description:
+ description:
+ - The description for the action rule profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant) and the C(action_rule) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_tenant_action_rule_profile) modules can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_tenant_action_rule_profile
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(rtctrl:SetASPath).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Create a Set AS path action rule
+ cisco.aci.aci_action_rule_set_as_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ last_as: 0
+ criteria: prepend
+ state: present
+ delegate_to: localhost
+
+- name: Delete a Set AS path action rule
+ cisco.aci.aci_action_rule_set_as_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ criteria: prepend
+ state: absent
+ delegate_to: localhost
+
+- name: Query all Set AS path action rules
+ cisco.aci.aci_action_rule_set_as_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query a Set AS path action rule
+ cisco.aci.aci_action_rule_set_as_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ criteria: prepend
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ action_rule=dict(type="str", aliases=["action_rule_name"]), # Not required for querying all objects
+ last_as=dict(type="int", aliases=["last_as_number"]),
+ criteria=dict(type="str", choices=["prepend", "prepend-last-as"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["action_rule", "tenant", "criteria"]],
+ ["state", "present", ["action_rule", "tenant", "criteria"]],
+ ],
+ )
+
+ last_as = module.params.get("last_as_number")
+ criteria = module.params.get("criteria")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ action_rule = module.params.get("action_rule")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="rtctrlAttrP",
+ aci_rn="attr-{0}".format(action_rule),
+ module_object=action_rule,
+ target_filter={"name": action_rule},
+ ),
+ subclass_2=dict(
+ aci_class="rtctrlSetASPath",
+ aci_rn="saspath-{0}".format(criteria),
+ module_object=criteria,
+ target_filter={"criteria": criteria},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="rtctrlSetASPath",
+ class_config=dict(
+ lastnum=last_as,
+ criteria=criteria,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="rtctrlSetASPath")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path_asn.py b/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path_asn.py
new file mode 100644
index 000000000..fdc675ddb
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_action_rule_set_as_path_asn.py
@@ -0,0 +1,312 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_action_rule_set_as_path_asn
+short_description: Manage the AS Path ASN (rtctrl:SetASPathASN)
+description:
+- Set the ASN for the AS Path action rules on Cisco ACI fabrics.
+- Only used if the AS Path action rule is set to C(prepend).
+options:
+ tenant:
+ description:
+ - The name of the tenant.
+ type: str
+ aliases: [ tenant_name ]
+ action_rule:
+ description:
+ - The name of the action rule profile.
+ type: str
+ aliases: [ action_rule_name ]
+ asn:
+ description:
+ - The ASN number.
+ type: int
+ order:
+ description:
+ - The ASN order.
+ type: int
+ description:
+ description:
+ - The description for the action rule profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant) and the C(action_rule) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_tenant_action_rule_profile) modules can be used for this.
+- A Set AS Path action rule with criteria set to C(prepend) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_action_rule_set_as_path) modules can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_tenant_action_rule_profile
+- module: cisco.aci.aci_action_rule_set_as_path
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(rtctrl:SetASPathASN).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Create a Set AS Path ASN action rule
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ order: 1
+ asn: 1
+ state: present
+ delegate_to: localhost
+
+- name: Delete a Set AS Path ASN action rule
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ order: 1
+ state: absent
+ delegate_to: localhost
+
+- name: Query all Set AS Path ASN action rules
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query a Set AS Path ASN action rule
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ order: 1
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ action_rule=dict(type="str", aliases=["action_rule_name"]), # Not required for querying all objects
+ asn=dict(type="int"),
+ order=dict(type="int"),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["action_rule", "tenant", "order"]],
+ ["state", "present", ["action_rule", "tenant", "order"]],
+ ],
+ )
+
+ asn = module.params.get("asn")
+ order = module.params.get("order")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ action_rule = module.params.get("action_rule")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="rtctrlAttrP",
+ aci_rn="attr-{0}".format(action_rule),
+ module_object=action_rule,
+ target_filter={"name": action_rule},
+ ),
+ subclass_2=dict(
+ aci_class="rtctrlSetASPath",
+ aci_rn="saspath-prepend",
+ module_object="prepend",
+ target_filter={"criteria": "prepend"},
+ ),
+ subclass_3=dict(
+ aci_class="rtctrlSetASPathASN",
+ aci_rn="asn-{0}".format(order),
+ module_object=order,
+ target_filter={"asn": order},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="rtctrlSetASPathASN",
+ class_config=dict(
+ asn=asn,
+ order=order,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="rtctrlSetASPathASN")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_aep.py b/ansible_collections/cisco/aci/plugins/modules/aci_aep.py
index aa77d8f4f..04ecf58f6 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_aep.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_aep.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_aep
-short_description: Manage attachable Access Entity Profile (AEP) objects (infra:AttEntityP, infra:ProvAcc)
+short_description: Manage attachable Access Entity Profile (AEP) objects (infra:AttEntityP and infra:ProvAcc)
description:
- Connect to external virtual and physical domains by using
attachable Access Entity Profiles (AEP) on Cisco ACI fabrics.
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_aep_to_epg.py b/ansible_collections/cisco/aci/plugins/modules/aci_aep_to_epg.py
index c77417073..2bba28c5b 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_aep_to_epg.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_aep_to_epg.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_aep_to_epg
-short_description: Bind EPG to AEP (infra:RsFuncToEpg).
+short_description: Bind EPG to AEP (infra:RsFuncToEpg)
description:
- Bind EPG to AEP.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bd.py b/ansible_collections/cisco/aci/plugins/modules/aci_bd.py
index 13d9d1938..d01304cb7 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_bd.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bd.py
@@ -1,6 +1,8 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2017, Jacob McGill (@jmcgill298)
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -147,6 +149,103 @@ options:
description:
- The L3 Out that contains the associated Route Profile.
type: str
+ host_based_routing:
+ description:
+ - Enables advertising host routes (/32 prefixes) out of the L3OUT(s) that are associated to this BD.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ aliases: [ advertise_host_routes ]
+ enable_rogue_except_mac:
+ description:
+ - Rogue exception MAC wildcard support for Bridge Domains.
+ - Only available in APIC version 6.0 or later.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ allow_intersite_bum_traffic:
+ description:
+ - Control whether BUM traffic is allowed between sites.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ aliases: [allow_bum_traffic]
+ allow_intersite_l2_stretch:
+ description:
+ - Allow L2 Stretch between sites.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ aliases: [allow_l2_stretch]
+ allow_ipv6_multicast:
+ description:
+ - Flag to indicate if ipv6 multicast is enabled.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ aliases: [ ipv6_multicast, ipv6_mcast, allow_ipv6_mcast]
+ link_local_address:
+ description:
+ - The override of the system generated IPv6 link-local address.
+ type: str
+ aliases: [ ll_addr_ipv6, ll_addr, link_local]
+ multicast_arp_drop:
+ description:
+ - Enable BD rogue multicast ARP packet drop.
+ - Only available in APIC version 6.0 or later.
+ - The APIC defaults to C(true) when unset during creation.
+ type: bool
+ aliases: [ mcast_arp_drop ]
+ vmac:
+ description:
+ - Virtual MAC address of the BD/SVI. This is used when the BD is extended to multiple sites using L2 Outside.
+ type: str
+ optimize_wan_bandwidth:
+ description:
+ - Optimize WAN Bandwidth improves the network application experience at the branch and makes better use of limited network resources.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ aliases: [wan_optimization, opt_bandwidth]
+ mld_snoop_policy:
+ description:
+ - The name of the Multicast Listener Discovery (MLD) Snooping Policy the Bridge Domain should use when overriding the default MLD Snooping Policy.
+ - To delete this attribute, pass an empty string.
+ type: str
+ aliases: [mld_snoop, mld_policy]
+ igmp_policy:
+ description:
+ - The name of the IGMP Interface Policy the Bridge Domain should use when overriding the default IGMP Interface Policy.
+ - To delete this attribute, pass an empty string.
+ type: str
+ aliases: [igmp]
+ vlan:
+ description:
+ - The selected VLAN for bridge domain access port encapsulation.
+ - To delete this attribute, pass an empty string.
+ type: str
+ aliases: [encap]
+ monitoring_policy:
+ description:
+ - The name of the Monitoring Policy to apply to the Bridge Domain.
+ - To delete this attribute, pass an empty string.
+ type: str
+ aliases: [mon_pol, monitoring_pol]
+ first_hop_security_policy:
+ description:
+ - The name of the First Hop Security Policy to apply to the Bridge Domain.
+ - To delete this attribute, pass an empty string.
+ type: str
+ aliases: [fhsp, fhs_pol, fhsp_name]
+ pim_source_filter:
+ description:
+ - The name of the PIM Source Filter to apply to the Bridge Domain.
+ - To delete this attribute, pass an empty string.
+ - Only available in APIC version 5.2 or later.
+ type: str
+ aliases: [pim_source]
+ pim_destination_filter:
+ description:
+ - The name of the PIM Destination Filter to apply to the Bridge Domain.
+ - To delete this attribute, pass an empty string.
+ - Only available in APIC version 5.2 or later.
+ type: str
+ aliases: [pim_dest, pim_destination]
+
extends_documentation_fragment:
- cisco.aci.aci
- cisco.aci.annotation
@@ -162,6 +261,7 @@ seealso:
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Jacob McGill (@jmcgill298)
+- Samita Bhattacharjee (@samitab)
"""
EXAMPLES = r"""
@@ -175,6 +275,19 @@ EXAMPLES = r"""
bd: web_servers
mac_address: 00:22:BD:F8:19:FE
vrf: prod_vrf
+ host_based_routing: true
+ allow_intersite_bum_traffic: true
+ allow_intersite_l2_stretch: true
+ allow_ipv6_mcast: true
+ ll_addr: "fe80::1322:33ff:fe44:5566"
+ vmac: "00:AA:BB:CC:DD:03"
+ optimize_wan_bandwidth: true
+ vlan: vlan-101
+ igmp_policy: web_servers_igmp_pol
+ monitoring_policy: web_servers_monitoring_pol
+ igmp_snoop_policy: web_servers_igmp_snoop
+ mld_snoop_policy: web_servers_mld_snoop
+ first_hop_security_policy: web_servers_fhs
state: present
delegate_to: localhost
@@ -205,6 +318,21 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
+- name: Modify a Bridge Domain to remove mld_snoop_policy and first_hop_security_policy
+ cisco.aci.aci_bd:
+ host: "{{ inventory_hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: true
+ tenant: prod
+ bd: web_servers
+ arp_flooding: true
+ l2_unknown_unicast: flood
+ mld_snoop_policy: ""
+ first_hop_security_policy: ""
+ state: present
+ delegate_to: localhost
+
- name: Query All Bridge Domains
cisco.aci.aci_bd:
host: "{{ inventory_hostname }}"
@@ -378,6 +506,22 @@ def main():
route_profile=dict(type="str"),
route_profile_l3out=dict(type="str"),
name_alias=dict(type="str"),
+ host_based_routing=dict(type="bool", aliases=["advertise_host_routes"]),
+ enable_rogue_except_mac=dict(type="bool"),
+ allow_intersite_bum_traffic=dict(type="bool", aliases=["allow_bum_traffic"]),
+ allow_intersite_l2_stretch=dict(type="bool", aliases=["allow_l2_stretch"]),
+ allow_ipv6_multicast=dict(type="bool", aliases=["ipv6_multicast", "ipv6_mcast", "allow_ipv6_mcast"]),
+ link_local_address=dict(type="str", aliases=["ll_addr_ipv6", "ll_addr", "link_local"]),
+ multicast_arp_drop=dict(type="bool", aliases=["mcast_arp_drop"]),
+ vmac=dict(type="str"),
+ optimize_wan_bandwidth=dict(type="bool", aliases=["wan_optimization", "opt_bandwidth"]),
+ mld_snoop_policy=dict(type="str", aliases=["mld_snoop", "mld_policy"]),
+ igmp_policy=dict(type="str", aliases=["igmp"]),
+ vlan=dict(type="str", aliases=["encap"]),
+ monitoring_policy=dict(type="str", aliases=["mon_pol", "monitoring_pol"]),
+ first_hop_security_policy=dict(type="str", aliases=["fhsp", "fhs_pol", "fhsp_name"]),
+ pim_source_filter=dict(type="str", aliases=["pim_source"]),
+ pim_destination_filter=dict(type="str", aliases=["pim_dest", "pim_destination"]),
)
module = AnsibleModule(
@@ -422,7 +566,47 @@ def main():
route_profile = module.params.get("route_profile")
route_profile_l3out = module.params.get("route_profile_l3out")
name_alias = module.params.get("name_alias")
+ host_based_routing = aci.boolean(module.params.get("host_based_routing"))
+ enable_rogue_except_mac = aci.boolean(module.params.get("enable_rogue_except_mac"))
+ allow_intersite_bum_traffic = aci.boolean(module.params.get("allow_intersite_bum_traffic"))
+ allow_intersite_l2_stretch = aci.boolean(module.params.get("allow_intersite_l2_stretch"))
+ allow_ipv6_multicast = aci.boolean(module.params.get("allow_ipv6_multicast"))
+ link_local_address = module.params.get("link_local_address")
+ multicast_arp_drop = aci.boolean(module.params.get("multicast_arp_drop"))
+ vmac = module.params.get("vmac")
+ optimize_wan_bandwidth = aci.boolean(module.params.get("optimize_wan_bandwidth"))
+ mld_snoop_policy = module.params.get("mld_snoop_policy")
+ igmp_policy = module.params.get("igmp_policy")
+ vlan = module.params.get("vlan")
+ monitoring_policy = module.params.get("monitoring_policy")
+ first_hop_security_policy = module.params.get("first_hop_security_policy")
+ pim_source_filter = module.params.get("pim_source_filter")
+ pim_destination_filter = module.params.get("pim_destination_filter")
+ child_classes = [
+ "fvRsCtx",
+ "fvRsIgmpsn",
+ "fvRsBDToNdP",
+ "fvRsBdToEpRet",
+ "fvRsBDToProfile",
+ "fvRsMldsn",
+ "igmpIfP",
+ "igmpRsIfPol",
+ "fvAccP",
+ "fvRsABDPolMonPol",
+ "fvRsBDToFhs",
+ ]
+ if pim_source_filter is not None or pim_destination_filter is not None:
+ # Only valid for APIC verion 5.2+
+ child_classes.extend(
+ [
+ "pimBDP",
+ "pimBDFilterPol",
+ "pimBDSrcFilterPol",
+ "pimBDDestFilterPol",
+ "rtdmcRsFilterToRtMapPol",
+ ]
+ )
aci.construct_url(
root_class=dict(
aci_class="fvTenant",
@@ -436,7 +620,7 @@ def main():
module_object=bd,
target_filter={"name": bd},
),
- child_classes=["fvRsCtx", "fvRsIgmpsn", "fvRsBDToNdP", "fvRsBdToEpRet", "fvRsBDToProfile"],
+ child_classes=child_classes,
)
aci.get_existing()
@@ -458,22 +642,52 @@ def main():
unkMacUcastAct=l2_unknown_unicast,
unkMcastAct=l3_unknown_multicast,
nameAlias=name_alias,
+ enableRogueExceptMac=enable_rogue_except_mac,
+ hostBasedRouting=host_based_routing,
+ intersiteBumTrafficAllow=allow_intersite_bum_traffic,
+ intersiteL2Stretch=allow_intersite_l2_stretch,
+ ipv6McastAllow=allow_ipv6_multicast,
+ llAddr=link_local_address,
+ mcastARPDrop=multicast_arp_drop,
+ vmac=vmac,
+ OptimizeWanBandwidth=optimize_wan_bandwidth,
)
if ipv6_l3_unknown_multicast is not None:
class_config["v6unkMcastAct"] = ipv6_l3_unknown_multicast
- aci.payload(
- aci_class="fvBD",
- class_config=class_config,
- child_configs=[
- {"fvRsCtx": {"attributes": {"tnFvCtxName": vrf}}},
- {"fvRsIgmpsn": {"attributes": {"tnIgmpSnoopPolName": igmp_snoop_policy}}},
- {"fvRsBDToNdP": {"attributes": {"tnNdIfPolName": ipv6_nd_policy}}},
- {"fvRsBdToEpRet": {"attributes": {"resolveAct": endpoint_retention_action, "tnFvEpRetPolName": endpoint_retention_policy}}},
- {"fvRsBDToProfile": {"attributes": {"tnL3extOutName": route_profile_l3out, "tnRtctrlProfileName": route_profile}}},
- ],
- )
+ child_configs = [
+ {"fvRsCtx": {"attributes": {"tnFvCtxName": vrf}}},
+ {"fvRsIgmpsn": {"attributes": {"tnIgmpSnoopPolName": igmp_snoop_policy}}},
+ {"fvRsMldsn": {"attributes": {"tnMldSnoopPolName": mld_snoop_policy}}},
+ {"fvRsBDToNdP": {"attributes": {"tnNdIfPolName": ipv6_nd_policy}}},
+ {"fvRsBdToEpRet": {"attributes": {"resolveAct": endpoint_retention_action, "tnFvEpRetPolName": endpoint_retention_policy}}},
+ {"fvRsBDToProfile": {"attributes": {"tnL3extOutName": route_profile_l3out, "tnRtctrlProfileName": route_profile}}},
+ {"fvRsBDToFhs": {"attributes": {"tnFhsBDPolName": first_hop_security_policy}}},
+ {"fvAccP": {"attributes": {"encap": vlan}}},
+ {"fvRsABDPolMonPol": {"attributes": {"tnMonEPGPolName": monitoring_policy}}},
+ ]
+
+ if igmp_policy is not None:
+ igmp_policy_tdn = "" if igmp_policy == "" else "uni/tn-{0}/igmpIfPol-{1}".format(tenant, igmp_policy)
+ child_configs.append({"igmpIfP": {"attributes": {}, "children": [{"igmpRsIfPol": {"attributes": {"tDn": igmp_policy_tdn}}}]}})
+ if pim_source_filter is not None or pim_destination_filter is not None:
+ pim_bd = {"pimBDP": {"attributes": {}, "children": []}}
+ pim_filter_pol = {"pimBDFilterPol": {"attributes": {}, "children": []}}
+ if pim_source_filter is not None:
+ pim_source_filter_tdn = "" if pim_source_filter == "" else "uni/tn-{0}/rtmap-{1}".format(tenant, pim_source_filter)
+ pim_filter_pol["pimBDFilterPol"]["children"].append(
+ {"pimBDSrcFilterPol": {"attributes": {}, "children": [{"rtdmcRsFilterToRtMapPol": {"attributes": {"tDn": pim_source_filter_tdn}}}]}}
+ )
+ if pim_destination_filter is not None:
+ pim_destination_filter_tdn = "" if pim_destination_filter == "" else "uni/tn-{0}/rtmap-{1}".format(tenant, pim_destination_filter)
+ pim_filter_pol["pimBDFilterPol"]["children"].append(
+ {"pimBDDestFilterPol": {"attributes": {}, "children": [{"rtdmcRsFilterToRtMapPol": {"attributes": {"tDn": pim_destination_filter_tdn}}}]}}
+ )
+ pim_bd["pimBDP"]["children"].append(pim_filter_pol)
+ child_configs.append(pim_bd)
+
+ aci.payload(aci_class="fvBD", class_config=class_config, child_configs=child_configs)
aci.get_diff(aci_class="fvBD")
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bd_rogue_exception_mac.py b/ansible_collections/cisco/aci/plugins/modules/aci_bd_rogue_exception_mac.py
new file mode 100644
index 000000000..8174f00db
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bd_rogue_exception_mac.py
@@ -0,0 +1,299 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_bd_rogue_exception_mac
+short_description: Manage Rogue Exception MAC (fv:RogueExceptionMac)
+description:
+- Manage Rogue Exception MACs in BD's on Cisco ACI fabrics.
+- Only available in APIC version 5.2 or later.
+options:
+ bd:
+ description:
+ - The name of the Bridge Domain.
+ type: str
+ aliases: [ bd_name, bridge_domain ]
+ tenant:
+ description:
+ - The name of the Tenant.
+ type: str
+ aliases: [ tenant_name ]
+ mac:
+ description:
+ - MAC address to except from Rogue processing.
+ type: str
+ description:
+ description:
+ - The description for the Rogue Exception MAC.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant) and C(bd) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) module and M(cisco.aci.aci_bd) can be used for these.
+seealso:
+- module: cisco.aci.aci_bd
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fv:RogueExceptionMac).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Create a Rogue Exception MAC
+ cisco.aci.aci_bd_rogue_exception_mac:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ bd: database
+ mac: "AA:BB:CC:DD:EE:11"
+ description: 1st MAC
+ state: present
+ delegate_to: localhost
+
+- name: Get all Rogue Exception MACs
+ cisco.aci.aci_bd_rogue_exception_mac:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Get all Rogue Exception MACs in specified Tenant
+ cisco.aci.aci_bd_rogue_exception_mac:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Get specific Rogue Exception MAC
+ cisco.aci.aci_bd_rogue_exception_mac:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ bd: database
+ mac: "AA:BB:CC:DD:EE:11"
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove a Rogue Exception MAC from a Bridge Domain
+ cisco.aci.aci_bd_rogue_exception_mac:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ bd: database
+ mac: "AA:BB:CC:DD:EE:11"
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ bd=dict(type="str", aliases=["bd_name", "bridge_domain"]), # Not required for querying all objects
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ mac=dict(type="str"), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "present", ["bd", "mac", "tenant"]],
+ ["state", "absent", ["bd", "mac", "tenant"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ description = module.params.get("description")
+ tenant = module.params.get("tenant")
+ bd = module.params.get("bd")
+ mac = module.params.get("mac")
+ state = module.params.get("state")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="fvBD",
+ aci_rn="BD-{0}".format(bd),
+ module_object=bd,
+ target_filter={"name": bd},
+ ),
+ subclass_2=dict(
+ aci_class="fvRogueExceptionMac",
+ aci_rn="rgexpmac-{0}".format(mac),
+ module_object=mac,
+ target_filter={"mac": mac},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="fvRogueExceptionMac",
+ class_config=dict(
+ descr=description,
+ mac=mac,
+ ),
+ )
+
+ aci.get_diff(aci_class="fvRogueExceptionMac")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bd_to_netflow_monitor_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_bd_to_netflow_monitor_policy.py
new file mode 100644
index 000000000..5e79a072c
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bd_to_netflow_monitor_policy.py
@@ -0,0 +1,292 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_bd_to_netflow_monitor_policy
+short_description: Bind Bridge Domain to Netflow Monitor Policy (fv:RsBDToNetflowMonitorPol)
+description:
+- Bind Bridge Domain to Netflow Monitor Policy on Cisco ACI fabrics.
+options:
+ bd:
+ description:
+ - The name of the Bridge Domain.
+ type: str
+ aliases: [ bd_name, bridge_domain ]
+ tenant:
+ description:
+ - The name of the Tenant.
+ type: str
+ aliases: [ tenant_name ]
+ netflow_monitor_policy:
+ description:
+ - The name of the Netflow Monitor Policy.
+ type: str
+ aliases: [ netflow_monitor, netflow_monitor_name, name ]
+ filter_type:
+ description:
+ - Choice of filter type while setting NetFlow Monitor Policies.
+ type: str
+ choices: [ce, ipv4, ipv6, unspecified]
+ aliases: [ filter, type ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(bd) and C(netflow_monitor_policy) parameters should exist before using this module.
+ The M(cisco.aci.aci_bd) and C(aci_netflow_monitor_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_bd
+- module: cisco.aci.aci_netflow_monitor_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fv:RsBDToNetflowMonitorPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Bind Bridge Domain to Netflow Monitor Policy
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ validate_certs: false
+ bd: web_servers
+ netflow_monitor_policy: prod_netflow_monitor_policy
+ tenant: prod
+ filter_type: ipv4
+ state: present
+ delegate_to: localhost
+
+- name: Query all Bridge Domains bound to Netflow Monitor Policy
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ validate_certs: true
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query specific Bridge Domain(s) bound to an Netflow Monitor Policy
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ validate_certs: true
+ bd: web_servers
+ netflow_monitor_policy: prod_netflow_monitor_policy
+ tenant: prod
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Unbind Bridge Domain from Netflow Monitor Policy
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ validate_certs: true
+ bd: web_servers
+ netflow_monitor_policy: prod_netflow_monitor_policy
+ tenant: prod
+ filter_type: ipv4
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ bd=dict(type="str", aliases=["bd_name", "bridge_domain"]), # Not required for querying all objects
+ netflow_monitor_policy=dict(type="str", aliases=["netflow_monitor", "netflow_monitor_name", "name"]), # Not required for querying all objects
+ filter_type=dict(type="str", choices=["ce", "ipv4", "ipv6", "unspecified"], aliases=["filter", "type"]), # Not required for querying all objects
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "present", ["bd", "netflow_monitor_policy", "tenant", "filter_type"]],
+ ["state", "absent", ["bd", "netflow_monitor_policy", "tenant", "filter_type"]],
+ ],
+ )
+
+ bd = module.params.get("bd")
+ netflow_monitor_policy = module.params.get("netflow_monitor_policy")
+ filter_type = module.params.get("filter_type")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="fvBD",
+ aci_rn="BD-{0}".format(bd),
+ module_object=bd,
+ target_filter={"name": bd},
+ ),
+ subclass_2=dict(
+ aci_class="fvRsBDToNetflowMonitorPol",
+ aci_rn="rsBDToNetflowMonitorPol-[{0}]-{1}".format(netflow_monitor_policy, filter_type),
+ module_object=netflow_monitor_policy,
+ target_filter={"tnNetflowMonitorPolName": netflow_monitor_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="fvRsBDToNetflowMonitorPol",
+ class_config=dict(tnNetflowMonitorPolName=netflow_monitor_policy, fltType=filter_type),
+ )
+
+ aci.get_diff(aci_class="fvRsBDToNetflowMonitorPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bfd_multihop_node_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_bfd_multihop_node_policy.py
new file mode 100644
index 000000000..f684ba15d
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bfd_multihop_node_policy.py
@@ -0,0 +1,320 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Anvitha Jain (@anvjain) <anvjain@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_bfd_multihop_node_policy
+short_description: Manage BFD Multihop Node policies (bfd:MhNodePol)
+description:
+- Manage BFD Multihop Node policy configuration on Cisco ACI fabrics.
+- Only available in APIC version 5.2 or later.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant
+ type: str
+ name:
+ description:
+ - Name of the BFD Multihop Node policy
+ type: str
+ aliases: [ bfd_multihop_node_policy ]
+ description:
+ description:
+ - Description of the BFD Multihop Node policy
+ type: str
+ admin_state:
+ description:
+ - Admin state of the BFD Multihop Node policy
+ - APIC sets the default value to enabled
+ type: str
+ choices: [ enabled, disabled ]
+ detection_multiplier:
+ description:
+ - Detection multiplier of the BFD Multihop Node policy
+ - APIC sets the default value to 3
+ - Allowed range is 1-50
+ type: int
+ min_transmit_interval:
+ description:
+ - Minimum transmit (Tx) interval of the BFD Multihop Node policy
+ - APIC sets the default value to 250
+ - Allowed range is 250-999
+ type: int
+ min_receive_interval:
+ description:
+ - Minimum receive (Rx) interval of the BFD Multihop Node policy
+ - APIC sets the default value to 250
+ - Allowed range is 250-999
+ type: int
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing
+ - Use C(query) for listing an object or multiple objects
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant) must exist before using this module in your playbook
+ The M(cisco.aci.aci_tenant) modules can be used for this
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bfd:MhNodePol)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+- module: cisco.aci.aci_tenant
+author:
+- Anvitha Jain (@anvjain)
+"""
+
+EXAMPLES = r"""
+- name: Add a new BFD Multihop Node policy
+ cisco.aci.aci_bfd_multihop_node_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_node_policy
+ description: Ansible BFD Multihop Node Policy
+ state: present
+ delegate_to: localhost
+
+- name: Remove a BFD Multihop Node policy
+ cisco.aci.aci_bfd_multihop_node_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_node_policy
+ state: absent
+ delegate_to: localhost
+
+- name: Query a BFD Multihop Node policy
+ cisco.aci.aci_bfd_multihop_node_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: my_dhcp_relay
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all BFD Multihop Node policies in a specific tenant
+ cisco.aci.aci_bfd_multihop_node_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+ current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+ raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class "/></imdata>'
+ sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+ previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+ filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+ method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+ response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+ status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+ url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+ """
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ name=dict(type="str", aliases=["bfd_multihop_node_policy"]),
+ description=dict(type="str"),
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ detection_multiplier=dict(type="int"),
+ min_transmit_interval=dict(type="int"),
+ min_receive_interval=dict(type="int"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ tenant=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["name", "tenant"]],
+ ["state", "present", ["name", "tenant"]],
+ ],
+ )
+
+ name = module.params.get("name")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ admin_state = module.params.get("admin_state")
+ detection_multiplier = module.params.get("detection_multiplier")
+ min_transmit_interval = module.params.get("min_transmit_interval")
+ min_receive_interval = module.params.get("min_receive_interval")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="bfdMhNodePol",
+ aci_rn="bfdMhNodePol-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(
+ name=name,
+ descr=description,
+ adminSt=admin_state,
+ )
+
+ if detection_multiplier and detection_multiplier not in range(1, 50):
+ aci.fail_json(msg='The "detection_multiplier" must be a value between 1 and 50')
+ else:
+ class_config["detectMult"] = detection_multiplier
+ if min_transmit_interval and min_transmit_interval not in range(250, 999):
+ aci.fail_json(msg='The "min_transmit_interval" must be a value between 250 and 999')
+ else:
+ class_config["minTxIntvl"] = min_transmit_interval
+ if min_receive_interval and min_receive_interval not in range(250, 999):
+ aci.fail_json(msg='The "min_receive_interval" must be a value between 250 and 999')
+ else:
+ class_config["minRxIntvl"] = min_receive_interval
+
+ aci.payload(
+ aci_class="bfdMhNodePol",
+ class_config=class_config,
+ )
+
+ aci.get_diff(aci_class="bfdMhNodePol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_address_family_context_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_address_family_context_policy.py
new file mode 100644
index 000000000..1d69de6f6
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_address_family_context_policy.py
@@ -0,0 +1,382 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_bgp_address_family_context_policy
+short_description: Manage BGP address family context policy (bgp:CtxAfPol)
+description:
+- Manage BGP address family context policies for the Tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ address_family_context_policy:
+ description:
+ - The name of the BGP address family context policy.
+ type: str
+ aliases: [ address_family_context_name, name ]
+ host_route_leak:
+ description:
+ - The control state.
+ - The option to enable/disable host route leak.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ ebgp_distance:
+ description:
+ - The administrative distance of eBGP routes.
+ - The APIC defaults to C(20) when unset during creation.
+ type: int
+ ibgp_distance:
+ description:
+ - The administrative distance of iBGP routes.
+ - The APIC defaults to C(200) when unset during creation.
+ type: int
+ local_distance:
+ description:
+ - The administrative distance of local routes.
+ - The APIC defaults to C(220) when unset during creation.
+ type: int
+ ebgp_max_ecmp:
+ description:
+ - The eBGP max-path.
+ - The APIC defaults to C(16) when unset during creation.
+ type: int
+ ibgp_max_ecmp:
+ description:
+ - The iBGP max-path.
+ - The APIC defaults to C(16) when unset during creation.
+ type: int
+ local_max_ecmp:
+ description:
+ - The maximum number of equal-cost local paths for redist.
+ - The APIC defaults to C(0) when unset during creation.
+ - Can not be configured for APIC version 4.2(7s) and prior.
+ type: int
+ bgp_add_path_capability:
+ description:
+ - The neighbor system capability.
+ - To delete this attribute, pass an empty string.
+ - Can not be configured for APIC version 6.0(2h) and prior.
+ type: str
+ choices: [ receive, send, "" ]
+ description:
+ description:
+ - Description for the BGP protocol profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) module can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bgp:CtxAfPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Create a BGP address family context policy
+ cisco.aci.aci_bgp_address_family_context_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ bgp_address_family_context_policy: my_bgp_address_family_context_policy
+ host_route_leak: true
+ ebgp_distance: 40
+ ibgp_distance: 210
+ local_distance: 215
+ ebgp_max_ecmp: 32
+ ibgp_max_ecmp: 32
+ local_max_ecmp: 1
+ bgp_add_path_capability: receive
+ tenant: production
+ state: present
+ delegate_to: localhost
+
+- name: Delete BGP address family context policy's child
+ cisco.aci.aci_bgp_address_family_context_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ bgp_address_family_context_policy: my_bgp_address_family_context_policy
+ bgp_add_path_capability: ""
+ tenant: production
+ state: absent
+ delegate_to: localhost
+
+- name: Delete a BGP address family context policy
+ cisco.aci.aci_bgp_address_family_context_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ bgp_address_family_context_policy: my_bgp_address_family_context_policy
+ tenant: production
+ state: absent
+ delegate_to: localhost
+
+- name: Query all BGP address family context policies
+ cisco.aci.aci_bgp_address_family_context_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query a specific BGP address family context policy
+ cisco.aci.aci_bgp_address_family_context_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ bgp_address_family_context_policy: my_bgp_address_family_context_policy
+ tenant: production
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ address_family_context_policy=dict(type="str", aliases=["address_family_context_name", "name"]), # Not required for querying all objects
+ host_route_leak=dict(type="bool"),
+ ebgp_distance=dict(type="int"),
+ ibgp_distance=dict(type="int"),
+ local_distance=dict(type="int"),
+ ebgp_max_ecmp=dict(type="int"),
+ ibgp_max_ecmp=dict(type="int"),
+ local_max_ecmp=dict(type="int"),
+ bgp_add_path_capability=dict(type="str", choices=["receive", "send", ""]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["address_family_context_policy", "tenant"]],
+ ["state", "present", ["address_family_context_policy", "tenant"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ address_family_context_policy = module.params.get("address_family_context_policy")
+ host_route_leak = aci.boolean(module.params.get("host_route_leak"), "host-rt-leak", "")
+ ebgp_distance = module.params.get("ebgp_distance")
+ ibgp_distance = module.params.get("ibgp_distance")
+ local_distance = module.params.get("local_distance")
+ ebgp_max_ecmp = module.params.get("ebgp_max_ecmp")
+ ibgp_max_ecmp = module.params.get("ibgp_max_ecmp")
+ local_max_ecmp = module.params.get("local_max_ecmp")
+ bgp_add_path_capability = module.params.get("bgp_add_path_capability")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ name_alias = module.params.get("name_alias")
+
+ child_classes = []
+ if bgp_add_path_capability is not None:
+ child_classes.append("bgpCtxAddlPathPol")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="bgpCtxAfPol",
+ aci_rn="bgpCtxAfP-{0}".format(address_family_context_policy),
+ module_object=address_family_context_policy,
+ target_filter={"name": address_family_context_policy},
+ ),
+ child_classes=child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ if bgp_add_path_capability is not None:
+ if bgp_add_path_capability == "" and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("bgpCtxAfPol", {}).get("children", {}):
+ if child.get("bgpCtxAddlPathPol"):
+ child_configs.append(dict(bgpCtxAddlPathPol=dict(attributes=dict(status="deleted"))))
+ elif bgp_add_path_capability != "":
+ child_configs.append(dict(bgpCtxAddlPathPol=dict(attributes=dict(capability=bgp_add_path_capability))))
+
+ aci.payload(
+ aci_class="bgpCtxAfPol",
+ class_config=dict(
+ name=address_family_context_policy,
+ ctrl=host_route_leak,
+ eDist=ebgp_distance,
+ iDist=ibgp_distance,
+ localDist=local_distance,
+ maxEcmp=ebgp_max_ecmp,
+ maxEcmpIbgp=ibgp_max_ecmp,
+ maxLocalEcmp=local_max_ecmp,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="bgpCtxAfPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_best_path_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_best_path_policy.py
index a8b5c0a6a..936442aaa 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_best_path_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_best_path_policy.py
@@ -15,7 +15,7 @@ DOCUMENTATION = r"""
module: aci_bgp_best_path_policy
short_description: Manage BGP Best Path policy (bgp:BestPathCtrlPol)
description:
-- Manage BGP Best Path policies for Tenants on Cisco ACI fabrics.
+- Manage BGP Best Path policies for the Tenants on Cisco ACI fabrics.
options:
tenant:
description:
@@ -24,7 +24,7 @@ options:
aliases: [ tenant_name ]
bgp_best_path_policy:
description:
- - The name of the best path policy.
+ - The name of the BGP best path policy.
type: str
aliases: [ bgp_best_path_policy_name, name ]
best_path_control:
@@ -37,7 +37,7 @@ options:
aliases: [as_path_control]
description:
description:
- - Description for the bgp protocol profile.
+ - Description for the BGP best path policy.
type: str
aliases: [ descr ]
state:
@@ -74,7 +74,7 @@ EXAMPLES = r"""
host: apic
username: admin
password: SomeSecretPassword
- bgp_protocol_profile: my_bgp_best_path_policy
+ bgp_best_path_policy: my_bgp_best_path_policy
best_path_control: enable
tenant: production
state: present
@@ -85,7 +85,7 @@ EXAMPLES = r"""
host: apic
username: admin
password: SomeSecretPassword
- bgp_protocol_profile: my_bgp_best_path_policy
+ bgp_best_path_policy: my_bgp_best_path_policy
tenant: production
state: absent
delegate_to: localhost
@@ -104,7 +104,7 @@ EXAMPLES = r"""
host: apic
username: admin
password: SomeSecretPassword
- bgp_protocol_profile: my_bgp_best_path_policy
+ bgp_best_path_policy: my_bgp_best_path_policy
tenant: production
state: query
delegate_to: localhost
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_peer_prefix_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_peer_prefix_policy.py
new file mode 100644
index 000000000..7719fff7a
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_peer_prefix_policy.py
@@ -0,0 +1,322 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_bgp_peer_prefix_policy
+short_description: Manage BGP peer prefix policy (bgp:PeerPfxPol)
+description:
+- Manage BGP peer prefix policies for the Tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ peer_prefix_policy:
+ description:
+ - The name of the BGP peer prefix policy.
+ type: str
+ aliases: [ peer_prefix_policy_name, name ]
+ action:
+ description:
+ - The action to be performed when the maximum prefix limit is reached.
+ - The APIC defaults to C(reject) when unset during creation.
+ type: str
+ choices: [ log, reject, restart, shut ]
+ maximum_number_prefix:
+ description:
+ - The maximum number of prefixes allowed from the peer.
+ - The APIC defaults to C(20000) when unset during creation.
+ type: int
+ aliases: [ max_prefix, max_num_prefix ]
+ restart_time:
+ description:
+ - The period of time in minutes before restarting the peer when the prefix limit is reached.
+ - Used only if C(action) is set to C(restart).
+ - The APIC defaults to C(infinite) when unset during creation.
+ type: str
+ threshold:
+ description:
+ - The threshold percentage of the maximum number of prefixes before a warning is issued.
+ - For example, if the maximum number of prefixes is 10 and the threshold is 70%, a warning is issued when the number of prefixes exceeds 7 (70%).
+ - The APIC defaults to C(75) when unset during creation.
+ type: int
+ aliases: [ thresh ]
+ description:
+ description:
+ - Description for the BGP peer prefix policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) module can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bgp:PeerPfxPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Create a BGP peer prefix policy
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ peer_prefix_policy: my_bgp_peer_prefix_policy
+ action: restart
+ restart_time: 10
+ max_prefix: 10000
+ threshold: 80
+ tenant: production
+ state: present
+ delegate_to: localhost
+
+- name: Delete a BGP peer prefix policy
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ peer_prefix_policy: my_bgp_peer_prefix_policy
+ tenant: production
+ state: absent
+ delegate_to: localhost
+
+- name: Query all BGP peer prefix policies
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query a specific BGP peer prefix policy
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ peer_prefix_policy: my_bgp_peer_prefix_policy
+ tenant: production
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ peer_prefix_policy=dict(type="str", aliases=["peer_prefix_policy_name", "name"]), # Not required for querying all objects
+ action=dict(type="str", choices=["log", "reject", "restart", "shut"]),
+ maximum_number_prefix=dict(type="int", aliases=["max_prefix", "max_num_prefix"]),
+ restart_time=dict(type="str"),
+ threshold=dict(type="int", aliases=["thresh"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["peer_prefix_policy", "tenant"]],
+ ["state", "present", ["peer_prefix_policy", "tenant"]],
+ ],
+ )
+
+ peer_prefix_policy = module.params.get("peer_prefix_policy")
+ action = module.params.get("action")
+ maximum_number_prefix = module.params.get("maximum_number_prefix")
+ restart_time = module.params.get("restart_time")
+ threshold = module.params.get("threshold")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="bgpPeerPfxPol",
+ aci_rn="bgpPfxP-{0}".format(peer_prefix_policy),
+ module_object=peer_prefix_policy,
+ target_filter={"name": peer_prefix_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="bgpPeerPfxPol",
+ class_config=dict(
+ name=peer_prefix_policy,
+ action=action,
+ maxPfx=maximum_number_prefix,
+ restartTime=restart_time,
+ thresh=threshold,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="bgpPeerPfxPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_route_summarization_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_route_summarization_policy.py
new file mode 100644
index 000000000..6e10e92c6
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_route_summarization_policy.py
@@ -0,0 +1,310 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_bgp_route_summarization_policy
+short_description: Manage BGP route summarization policy (bgp:RtSummPol)
+description:
+- Manage BGP route summarization policies for the Tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ route_summarization_policy:
+ description:
+ - The name of the BGP route summarization policy.
+ type: str
+ aliases: [ route_summarization_policy_name, name ]
+ address_type_af_control:
+ description:
+ - The Ucast/Mcast address type AF control.
+ - The APIC defaults to C(af-ucast) when unset during creation.
+ - Can not be configured for APIC version 4.2(7s) or prior.
+ type: list
+ elements: str
+ choices: [ af-label-ucast, af-ucast, af-mcast ]
+ aliases: [ address_type_control ]
+ control_state:
+ description:
+ - The summary control.
+ - The C(summary_only) option can not be configured for APIC version 4.2(7s) or prior.
+ type: list
+ elements: str
+ choices: [ as-set, summary-only ]
+ aliases: [ summary_control, control ]
+ description:
+ description:
+ - Description for the BGP route summarization policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) module can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bgp:RtSummPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Create a BGP route summarization policy
+ cisco.aci.aci_bgp_route_summarization_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ route_summarization_policy: my_route_summarization_policy
+ address_type_af_control: [af-mcast, af-ucast]
+ control_state: [as-set, summary-only]
+ tenant: production
+ state: present
+ delegate_to: localhost
+
+- name: Delete a BGP route summarization policy
+ cisco.aci.aci_bgp_route_summarization_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ route_summarization_policy: my_route_summarization_policy
+ tenant: production
+ state: absent
+ delegate_to: localhost
+
+- name: Query all BGP route summarization policies
+ cisco.aci.aci_bgp_route_summarization_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query a specific BGP route summarization policy
+ cisco.aci.aci_bgp_route_summarization_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ route_summarization_policy: my_route_summarization_policy
+ tenant: production
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ route_summarization_policy=dict(type="str", aliases=["route_summarization_policy_name", "name"]), # Not required for querying all objects
+ address_type_af_control=dict(type="list", elements="str", choices=["af-label-ucast", "af-ucast", "af-mcast"], aliases=["address_type_control"]),
+ control_state=dict(type="list", elements="str", choices=["as-set", "summary-only"], aliases=["summary_control", "control"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["route_summarization_policy", "tenant"]],
+ ["state", "present", ["route_summarization_policy", "tenant"]],
+ ],
+ )
+
+ route_summarization_policy = module.params.get("route_summarization_policy")
+ address_type_af_control = ",".join(module.params.get("address_type_af_control")) if module.params.get("address_type_af_control") else None
+ control_state = ",".join(module.params.get("control_state")) if module.params.get("control_state") else None
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ name_alias = module.params.get("name_alias")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="bgpRtSummPol",
+ aci_rn="bgprtsum-{0}".format(route_summarization_policy),
+ module_object=route_summarization_policy,
+ target_filter={"name": route_summarization_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(
+ name=route_summarization_policy,
+ ctrl=control_state,
+ descr=description,
+ nameAlias=name_alias,
+ )
+
+ if address_type_af_control is not None:
+ class_config.update(dict(addrTCtrl=address_type_af_control))
+
+ aci.payload(
+ aci_class="bgpRtSummPol",
+ class_config=class_config,
+ )
+
+ aci.get_diff(aci_class="bgpRtSummPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_asn.py b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_asn.py
index 4eae25e3d..e728e41b6 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_asn.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_asn.py
@@ -13,9 +13,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_bgp_rr_asn
-short_description: Manage BGP Route Reflector ASN.
+short_description: Manage BGP Route Reflector ASN (bgp:AsP)
description:
-- Manage the BGP Autonomous System Number of the fabric (bgpAsP).
+- Manage the BGP Autonomous System Number of the fabric.
- This module is specifically for fabric BGP, for L3Out BGP use the aci_l3out_bgp_peer module
options:
asn:
@@ -35,7 +35,7 @@ extends_documentation_fragment:
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(bgpAsP).
+ description: More information about the internal APIC class B(bgp:AsP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_node.py b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_node.py
index 1f37b769c..90139b026 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_node.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_rr_node.py
@@ -13,9 +13,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_bgp_rr_node
-short_description: Manage BGP Route Reflector objects.
+short_description: Manage BGP Route Reflector objects (bgp:RRNodePEp)
description:
-- Manage ACI BGP Route Reflector Nodes (bgpRRNodePEp).
+- Manage ACI BGP Route Reflector Nodes.
options:
node_id:
description:
@@ -42,7 +42,7 @@ extends_documentation_fragment:
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(bgpRRNodePEp).
+ description: More information about the internal APIC class B(bgp:RRNodePEp).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_timers_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_timers_policy.py
index c8d6c54b0..9a62a8d4f 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_bgp_timers_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_bgp_timers_policy.py
@@ -15,7 +15,7 @@ DOCUMENTATION = r"""
module: aci_bgp_timers_policy
short_description: Manage BGP timers policy (bgp:CtxPol)
description:
-- Manage BGP timers policies for Tenants on Cisco ACI fabrics.
+- Manage BGP timers policies for the Tenants on Cisco ACI fabrics.
options:
tenant:
description:
@@ -24,7 +24,7 @@ options:
aliases: [ tenant_name ]
bgp_timers_policy:
description:
- - The name of the bgp timers policy.
+ - The name of the BGP timers policy.
type: str
aliases: [ bgp_timers_policy_name, name ]
graceful_restart_controls:
@@ -57,7 +57,7 @@ options:
type: int
description:
description:
- - Description for the bgp protocol profile.
+ - Description for the BGP timers policy.
type: str
aliases: [ descr ]
state:
@@ -94,7 +94,7 @@ EXAMPLES = r"""
host: apic
username: admin
password: SomeSecretPassword
- bgp_protocol_profile: my_bgp_timers_policy
+ bgp_timers_policy: my_bgp_timers_policy
graceful_restart_controls: complete
hold_interval: 360
keepalive_interval: 120
@@ -109,7 +109,7 @@ EXAMPLES = r"""
host: apic
username: admin
password: SomeSecretPassword
- bgp_protocol_profile: my_bgp_timers_policy
+ bgp_timers_policy: my_bgp_timers_policy
tenant: production
state: absent
delegate_to: localhost
@@ -128,7 +128,7 @@ EXAMPLES = r"""
host: apic
username: admin
password: SomeSecretPassword
- bgp_protocol_profile: my_bgp_timers_policy
+ bgp_timers_policy: my_bgp_timers_policy
tenant: production
state: query
delegate_to: localhost
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_cloud_subnet.py b/ansible_collections/cisco/aci/plugins/modules/aci_cloud_subnet.py
index 31845f629..bfdad0a33 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_cloud_subnet.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_cloud_subnet.py
@@ -3,6 +3,7 @@
# Copyright: (c) 2020, nkatarmal-crest <nirav.katarmal@crestdatasys.com>
# Copyright: (c) 2020, Cindy Zhao <cizhao@cisco.com>
+# Copyright: (c) 2024, Samita Bhattacharjee <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -21,6 +22,7 @@ notes:
author:
- Nirav (@nirav)
- Cindy Zhao (@cizhao)
+- Samita Bhattacharjee (@samitab)
options:
name:
description:
@@ -54,17 +56,24 @@ options:
- Address of cloud cidr.
type: str
required: true
- availability_zone:
+ aws_availability_zone:
description:
- The cloud zone which is attached to the given cloud context profile.
- - Only used when it is an aws cloud apic.
+ - Only used when it is an AWS Cloud APIC.
type: str
+ aliases: [availability_zone, av_zone, zone]
vnet_gateway:
description:
- Determine if a vNet Gateway Router will be deployed or not.
- - Only used when it is an azure cloud apic.
+ - Only used when it is an Azure Cloud APIC.
type: bool
default: false
+ azure_region:
+ description:
+ - The Azure cloud region to attach this subnet to.
+ - Only used when it is an Azure Cloud APIC.
+ type: str
+ aliases: [az_region]
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -78,7 +87,7 @@ extends_documentation_fragment:
"""
EXAMPLES = r"""
-- name: Create aci cloud subnet
+- name: Create AWS aci cloud subnet
cisco.aci.aci_cloud_subnet:
host: apic
username: userName
@@ -87,7 +96,21 @@ EXAMPLES = r"""
tenant: anstest
cloud_context_profile: aws_cloudCtxProfile
cidr: '10.10.0.0/16'
- availability_zone: us-west-1a
+ aws_availability_zone: us-west-1a
+ address: 10.10.0.1
+ delegate_to: localhost
+
+- name: Create Azure aci cloud subnet
+ cisco.aci.aci_cloud_subnet:
+ host: apic
+ username: userName
+ password: somePassword
+ validate_certs: false
+ tenant: anstest
+ cloud_context_profile: azure_cloudCtxProfile
+ cidr: '10.10.0.0/16'
+ azure_region: westus2
+ vnet_gateway: true
address: 10.10.0.1
delegate_to: localhost
@@ -239,16 +262,18 @@ def main():
cloud_context_profile=dict(type="str", required=True),
cidr=dict(type="str", required=True),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
- availability_zone=dict(type="str"),
+ aws_availability_zone=dict(type="str", aliases=["availability_zone", "av_zone", "zone"]),
+ azure_region=dict(type="str", aliases=["az_region"]),
)
module = AnsibleModule(
argument_spec=argument_spec,
supports_check_mode=True,
required_if=[
- ["state", "absent", ["address"]],
- ["state", "present", ["address"]],
+ ["state", "absent", ["tenant", "cloud_context_profile", "cidr", "address"]],
+ ["state", "present", ["tenant", "cloud_context_profile", "cidr", "address"]],
],
+ mutually_exclusive=[("aws_availability_zone", "azure_region")],
)
name = module.params.get("name")
@@ -260,7 +285,8 @@ def main():
cloud_context_profile = module.params.get("cloud_context_profile")
cidr = module.params.get("cidr")
state = module.params.get("state")
- availability_zone = module.params.get("availability_zone")
+ aws_availability_zone = module.params.get("aws_availability_zone")
+ azure_region = module.params.get("azure_region")
child_configs = []
aci = ACIModule(module)
@@ -283,11 +309,14 @@ def main():
if state == "present":
# in aws cloud apic
- if availability_zone:
- region = availability_zone[:-1]
- tDn = "uni/clouddomp/provp-aws/region-{0}/zone-{1}".format(region, availability_zone)
+ if aws_availability_zone:
+ region = aws_availability_zone[:-1]
+ tDn = "uni/clouddomp/provp-aws/region-{0}/zone-{1}".format(region, aws_availability_zone)
child_configs.append({"cloudRsZoneAttach": {"attributes": {"tDn": tDn}}})
# in azure cloud apic
+ if azure_region:
+ tDn = "uni/clouddomp/provp-azure/region-{0}/zone-default".format(azure_region)
+ child_configs.append({"cloudRsZoneAttach": {"attributes": {"tDn": tDn}}})
if vnet_gateway:
usage = "gateway"
else:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_config_snapshot.py b/ansible_collections/cisco/aci/plugins/modules/aci_config_snapshot.py
index bc36a5e62..2022c2df9 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_config_snapshot.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_config_snapshot.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_config_snapshot
-short_description: Manage Config Snapshots (config:Snapshot, config:ExportP)
+short_description: Manage Config Snapshots (config:Snapshot and config:ExportP)
description:
- Manage Config Snapshots on Cisco ACI fabrics.
- Creating new Snapshots is done using the configExportP class.
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_service_graph.py b/ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_service_graph.py
index eb8f9fa32..f50790bb3 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_service_graph.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_contract_subject_to_service_graph.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_contract_subject_to_service_graph
-short_description: Bind contract subject to service graph (vz:RsSubjGraphAtt).
+short_description: Bind contract subject to service graph (vz:RsSubjGraphAtt)
description:
- Bind contract subject to service graph.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option.py b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option.py
new file mode 100644
index 000000000..1253f85d6
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option.py
@@ -0,0 +1,306 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_dhcp_option
+short_description: Manage DHCP Option (dhcp:Option)
+description:
+- Manage DHCP Options for DHCP Option Policies on Cisco ACI fabrics.
+- The DHCP option is used to supply DHCP clients with configuration parameters such as a domain, name server, subnet, and network address.
+ DHCP provides a framework for passing configuration information to clients on a TCP/IP network.
+ The configuration parameters, and other control information, are carried in tagged data items that are stored in the options field of a DHCP message.
+ The data items themselves are also called options. You can view, set, unset, and edit DHCP option values.
+ When you set an option value, the DHCP server replaces any existing value or creates a new one as needed for the given option name.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ dhcp_option_policy:
+ description:
+ - The name of an existing DHCP Option Policy.
+ type: str
+ aliases: [ dhcp_option_policy_name ]
+ dhcp_option:
+ description:
+ - The name of the DHCP Option.
+ type: str
+ aliases: [ dhcp_option_name, name ]
+ data:
+ description:
+ - The value of the DHCP Option.
+ type: str
+ id:
+ description:
+ - The DHCP Option ID.
+ type: int
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new DHCP Option
+ cisco.aci.aci_dhcp_option:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ dhcp_option: my_dhcp_option
+ id: 1
+ data: 82
+ state: present
+ delegate_to: localhost
+
+- name: Delete an DHCP Option
+ cisco.aci.aci_dhcp_option:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ dhcp_option: my_dhcp_option
+ state: absent
+ delegate_to: localhost
+
+- name: Query a DHCP Option
+ cisco.aci.aci_dhcp_option:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ dhcp_option: my_dhcp_option
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all DHCP Options in my_dhcp_option_policy
+ cisco.aci.aci_dhcp_option:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ dhcp_option_policy=dict(type="str", aliases=["dhcp_option_policy_name"]),
+ dhcp_option=dict(type="str", aliases=["dhcp_option_name", "name"]),
+ data=dict(type="str"),
+ id=dict(type="int"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "dhcp_option_policy", "dhcp_option"]],
+ ["state", "present", ["tenant", "dhcp_option_policy", "dhcp_option"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ dhcp_option_policy = module.params.get("dhcp_option_policy")
+ dhcp_option = module.params.get("dhcp_option")
+ data = module.params.get("data")
+ id = module.params.get("id")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="dhcpOptionPol",
+ aci_rn="dhcpoptpol-{0}".format(dhcp_option_policy),
+ module_object=dhcp_option_policy,
+ target_filter={"name": dhcp_option_policy},
+ ),
+ subclass_2=dict(
+ aci_class="dhcpOption",
+ aci_rn="opt-{0}".format(dhcp_option),
+ module_object=dhcp_option,
+ target_filter={"name": dhcp_option},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="dhcpOption",
+ class_config=dict(
+ name=dhcp_option,
+ data=data,
+ id=id,
+ ),
+ )
+
+ aci.get_diff(aci_class="dhcpOption")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option_policy.py
new file mode 100644
index 000000000..9e7bd7738
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_option_policy.py
@@ -0,0 +1,276 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_dhcp_option_policy
+short_description: Manage DHCP Option Policy (dhcp:OptionPol)
+description:
+- Manage DHCP Option Policy for tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ dhcp_option_policy:
+ description:
+ - The name of the DHCP Option Policy.
+ type: str
+ aliases: [ dhcp_option_policy_name, name ]
+ description:
+ description:
+ - The description for the DHCP Option Policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new DHCP Option Policy
+ cisco.aci.aci_dhcp_option_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ state: present
+ delegate_to: localhost
+
+- name: Delete an DHCP Option Policy
+ cisco.aci.aci_dhcp_option_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ state: absent
+ delegate_to: localhost
+
+- name: Query a DHCP Option Policy
+ cisco.aci.aci_dhcp_option_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all DHCP Option Policies in my_tenant
+ cisco.aci.aci_dhcp_option_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ dhcp_option_policy=dict(type="str", aliases=["dhcp_option_policy_name", "name"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "dhcp_option_policy"]],
+ ["state", "present", ["tenant", "dhcp_option_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ dhcp_option_policy = module.params.get("dhcp_option_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="dhcpOptionPol",
+ aci_rn="dhcpoptpol-{0}".format(dhcp_option_policy),
+ module_object=dhcp_option_policy,
+ target_filter={"name": dhcp_option_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="dhcpOptionPol",
+ class_config=dict(
+ name=dhcp_option_policy,
+ descr=description,
+ ),
+ )
+
+ aci.get_diff(aci_class="dhcpOptionPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay.py b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay.py
index 9bb8267dd..39351b4aa 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay.py
@@ -14,9 +14,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_dhcp_relay
-short_description: Manage DHCP relay policies.
+short_description: Manage DHCP relay policies (dhcp:RelayP)
description:
-- Manage DHCP relay policy (dhcpRelayP) configuration on Cisco ACI fabrics.
+- Manage DHCP relay policy configuration on Cisco ACI fabrics.
options:
tenant:
description:
@@ -48,7 +48,7 @@ notes:
The M(cisco.aci.aci_tenant) modules can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(dhcpRelayP).
+ description: More information about the internal APIC class B(dhcp:RelayP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay_provider.py b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay_provider.py
index efb9e8e54..2d3dcaf50 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay_provider.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_dhcp_relay_provider.py
@@ -14,9 +14,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_dhcp_relay_provider
-short_description: Manage DHCP relay policy providers.
+short_description: Manage DHCP relay policy providers (dhcp:RsProv)
description:
-- Manage DHCP relay policy providers (dhcpRsProv) configuration on Cisco ACI fabrics.
+- Manage DHCP relay policy providers configuration on Cisco ACI fabrics.
options:
tenant:
description:
@@ -91,7 +91,7 @@ notes:
The M(cisco.aci.aci_tenant) and C(cisco.aci.aci_dhcp_relay) modules can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(dhcpRsProv).
+ description: More information about the internal APIC class B(dhcp:RsProv).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_dns_domain.py b/ansible_collections/cisco/aci/plugins/modules/aci_dns_domain.py
index 4325c7513..11ef520fa 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_dns_domain.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_dns_domain.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_dns_domain
-short_description: Manage DNS Provider (dnsDomain) objects.
+short_description: Manage DNS Provider objects (dns:Domain)
description:
- Manage DNS Domain configuration on Cisco ACI fabrics.
options:
@@ -49,7 +49,7 @@ notes:
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(dnsDomain).
+ description: More information about the internal APIC class B(dns:Domain).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_dns_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_dns_profile.py
index 47efb62c4..a4a535a73 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_dns_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_dns_profile.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_dns_profile
-short_description: Manage DNS Profile (dnsProfile) objects.
+short_description: Manage DNS Profile objects (dns:Profile)
description:
- Manage DNS Profile configuration on Cisco ACI fabrics.
options:
@@ -35,7 +35,7 @@ extends_documentation_fragment:
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(dnsProfile).
+ description: More information about the internal APIC class B(dns:Profile).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_dns_provider.py b/ansible_collections/cisco/aci/plugins/modules/aci_dns_provider.py
index 1fe2c2e60..7b74bd2b6 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_dns_provider.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_dns_provider.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_dns_provider
-short_description: Manage DNS Provider (dnsProv) objects.
+short_description: Manage DNS Provider objects (dns:Prov)
description:
- Manage DNS Provider configuration on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_domain.py b/ansible_collections/cisco/aci/plugins/modules/aci_domain.py
index 75509b0ef..ea65805b8 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_domain.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_domain.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_domain
-short_description: Manage physical, virtual, bridged, routed or FC domain profiles (phys:DomP, vmm:DomP, l2ext:DomP, l3ext:DomP, fc:DomP)
+short_description: Manage physical, virtual, bridged, routed or FC domain profiles (phys:DomP, vmm:DomP, l2ext:DomP, l3ext:DomP, and fc:DomP)
description:
- Manage physical, virtual, bridged, routed or FC domain profiles on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool.py b/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool.py
index 5d5ed7833..360e84c3f 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_encap_pool
-short_description: Manage encap pools (fvns:VlanInstP, fvns:VxlanInstP, fvns:VsanInstP)
+short_description: Manage encap pools (fvns:VlanInstP, fvns:VxlanInstP, and fvns:VsanInstP)
description:
- Manage vlan, vxlan, and vsan pools on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool_range.py b/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool_range.py
index 43d34e78d..29da16a7d 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool_range.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_encap_pool_range.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_encap_pool_range
-short_description: Manage encap ranges assigned to pools (fvns:EncapBlk, fvns:VsanEncapBlk)
+short_description: Manage encap ranges assigned to pools (fvns:EncapBlk and fvns:VsanEncapBlk)
description:
- Manage vlan, vxlan, and vsan ranges that are assigned to pools on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_epg.py b/ansible_collections/cisco/aci/plugins/modules/aci_epg.py
index 9f0eb671a..b9faec64e 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_epg.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_epg.py
@@ -1,6 +1,8 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2023, Christian Kolrep <christian.kolrep@dataport.de>
+# Copyright: (c) 2024, Akini Ross <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -78,6 +80,17 @@ options:
- Use C(yes) to create uSeg EPG and C(no) is used to create Application EPG.
type: str
choices: [ 'yes', 'no' ]
+ match:
+ description:
+ - The match type of the default Block Statement (fv:Crtrn).
+ - The APIC defaults to C(any) when unset during creation.
+ type: str
+ choices: [ any, all ]
+ precedence:
+ description:
+ - The Block Statement(fv:Crtrn) Precedence to resolve equal matches between micro segmented EPGs.
+ - The APIC defaults to C(0) when unset during creation.
+ type: int
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -105,6 +118,8 @@ seealso:
author:
- Swetha Chunduri (@schunduri)
- Shreyas Srish (@shrsr)
+- Christian Kolrep (@Christian-Kolrep)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -123,25 +138,6 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
-- aci_epg:
- host: apic
- username: admin
- password: SomeSecretPassword
- tenant: production
- ap: ticketing
- epg: "{{ item.epg }}"
- description: Ticketing EPG
- bd: "{{ item.bd }}"
- priority: unspecified
- intra_epg_isolation: unenforced
- state: present
- delegate_to: localhost
- with_items:
- - epg: web
- bd: web_bd
- - epg: database
- bd: database_bd
-
- name: Add a new uSeg EPG
cisco.aci.aci_epg:
host: apic
@@ -158,17 +154,22 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
-- name: Remove an EPG
+- name: Add a uSeg EPG with block statement match and precedence
cisco.aci.aci_epg:
host: apic
username: admin
password: SomeSecretPassword
- validate_certs: false
tenant: production
- app_profile: intranet
+ ap: intranet
epg: web_epg
+ description: Web Intranet EPG
+ bd: prod_bd
monitoring_policy: default
- state: absent
+ preferred_group: true
+ useg: 'yes'
+ match: all
+ precedence: 1
+ state: present
delegate_to: localhost
- name: Query an EPG
@@ -213,6 +214,19 @@ EXAMPLES = r"""
state: query
delegate_to: localhost
register: query_result
+
+- name: Remove an EPG
+ cisco.aci.aci_epg:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ validate_certs: false
+ tenant: production
+ app_profile: intranet
+ epg: web_epg
+ monitoring_policy: default
+ state: absent
+ delegate_to: localhost
"""
RETURN = r"""
@@ -342,6 +356,8 @@ def main():
monitoring_policy=dict(type="str"),
custom_qos_policy=dict(type="str"),
useg=dict(type="str", choices=["yes", "no"]),
+ match=dict(type="str", choices=["all", "any"]),
+ precedence=dict(type="int"),
)
module = AnsibleModule(
@@ -369,6 +385,8 @@ def main():
monitoring_policy = module.params.get("monitoring_policy")
custom_qos_policy = module.params.get("custom_qos_policy")
useg = module.params.get("useg")
+ match = module.params.get("match")
+ precedence = module.params.get("precedence")
child_configs = [dict(fvRsBd=dict(attributes=dict(tnFvBDName=bd))), dict(fvRsAEPgMonPol=dict(attributes=dict(tnMonEPGPolName=monitoring_policy)))]
@@ -394,12 +412,17 @@ def main():
module_object=epg,
target_filter={"name": epg},
),
- child_classes=["fvRsBd", "fvRsAEPgMonPol", "fvRsCustQosPol"],
+ child_classes=["fvRsBd", "fvRsAEPgMonPol", "fvRsCustQosPol", "fvCrtrn"],
)
aci.get_existing()
if state == "present":
+ if useg is not None and aci.existing and aci.existing[0]["fvAEPg"]["attributes"]["isAttrBasedEPg"] != useg:
+ module.fail_json(msg="Changing attribute useg on existing EPG is not supported.")
+ if useg == "yes":
+ child_configs.append(dict(fvCrtrn=dict(attributes=dict(name="default", match=match, prec=precedence))))
+
aci.payload(
aci_class="fvAEPg",
class_config=dict(
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract.py b/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract.py
index fe09945a3..9faf882c8 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract.py
@@ -1,6 +1,8 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2017, Jacob McGill (@jmcgill298)
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -12,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_epg_to_contract
-short_description: Bind EPGs to Contracts (fv:RsCons, fv:RsProv)
+short_description: Bind EPGs to Contracts (fv:RsCons, fv:RsProv, fv:RsProtBy, fv:RsConsIf, and fv:RsIntraEpg)
description:
- Bind EPGs to Contracts on Cisco ACI fabrics.
notes:
@@ -26,15 +28,15 @@ options:
aliases: [ app_profile, app_profile_name ]
contract:
description:
- - The name of the contract.
+ - The name of the contract or contract interface.
type: str
- aliases: [ contract_name ]
+ aliases: [ contract_name, contract_interface ]
contract_type:
description:
- - Determines if the EPG should Provide or Consume the Contract.
+ - Determines the type of the Contract.
type: str
required: true
- choices: [ consumer, provider ]
+ choices: [ consumer, provider, taboo, interface, intra_epg ]
epg:
description:
- The name of the end point group.
@@ -81,10 +83,11 @@ seealso:
- module: cisco.aci.aci_epg
- module: cisco.aci.aci_contract
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(fv:RsCons) and B(fv:RsProv).
+ description: More information about the internal APIC classes B(fv:RsCons), B(fv:RsProv), B(fv:RsProtBy), B(fv:RsConsIf), and B(fv:RsIntraEpg).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Jacob McGill (@jmcgill298)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -248,44 +251,17 @@ url:
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
-
-ACI_CLASS_MAPPING = dict(
- consumer={
- "class": "fvRsCons",
- "rn": "rscons-",
- },
- provider={
- "class": "fvRsProv",
- "rn": "rsprov-",
- },
-)
-
-PROVIDER_MATCH_MAPPING = dict(
- all="All",
- at_least_one="AtleastOne",
- at_most_one="AtmostOne",
- none="None",
-)
-
-CONTRACT_LABEL_MAPPING = dict(
- consumer="vzConsLbl",
- provider="vzProvLbl",
-)
-
-SUBJ_LABEL_MAPPING = dict(
- consumer="vzConsSubjLbl",
- provider="vzProvSubjLbl",
-)
+from ansible_collections.cisco.aci.plugins.module_utils.constants import ACI_CLASS_MAPPING, CONTRACT_LABEL_MAPPING, PROVIDER_MATCH_MAPPING, SUBJ_LABEL_MAPPING
def main():
argument_spec = aci_argument_spec()
argument_spec.update(aci_annotation_spec())
argument_spec.update(
- contract_type=dict(type="str", required=True, choices=["consumer", "provider"]),
+ contract_type=dict(type="str", required=True, choices=["consumer", "provider", "taboo", "interface", "intra_epg"]),
ap=dict(type="str", aliases=["app_profile", "app_profile_name"]), # Not required for querying all objects
epg=dict(type="str", aliases=["epg_name"]), # Not required for querying all objects
- contract=dict(type="str", aliases=["contract_name"]), # Not required for querying all objects
+ contract=dict(type="str", aliases=["contract_name", "contract_interface"]), # Not required for querying all objects
priority=dict(type="str", choices=["level1", "level2", "level3", "level4", "level5", "level6", "unspecified"]),
provider_match=dict(type="str", choices=["all", "at_least_one", "at_most_one", "none"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
@@ -318,13 +294,19 @@ def main():
aci_class = ACI_CLASS_MAPPING[contract_type]["class"]
aci_rn = ACI_CLASS_MAPPING[contract_type]["rn"]
- contract_label_class = CONTRACT_LABEL_MAPPING[contract_type]
- subject_label_class = SUBJ_LABEL_MAPPING[contract_type]
+ aci_name = ACI_CLASS_MAPPING[contract_type]["name"]
+ child_classes = []
- if contract_type == "consumer" and provider_match is not None:
+ if contract_type != "provider" and provider_match is not None:
module.fail_json(msg="the 'provider_match' is only configurable for Provided Contracts")
- child_classes = [subject_label_class, contract_label_class]
+ if contract_type in ["taboo", "interface", "intra_epg"] and (contract_label is not None or subject_label is not None):
+ module.fail_json(msg="the 'contract_label' and 'subject_label' are not configurable for {0} contracts".format(contract_type))
+
+ if contract_type not in ["taboo", "interface", "intra_epg"]:
+ contract_label_class = CONTRACT_LABEL_MAPPING.get(contract_type)
+ subject_label_class = SUBJ_LABEL_MAPPING.get(contract_type)
+ child_classes = [subject_label_class, contract_label_class]
aci = ACIModule(module)
aci.construct_url(
@@ -350,7 +332,7 @@ def main():
aci_class=aci_class,
aci_rn="{0}{1}".format(aci_rn, contract),
module_object=contract,
- target_filter={"tnVzBrCPName": contract},
+ target_filter={aci_name: contract},
),
child_classes=child_classes,
)
@@ -359,17 +341,13 @@ def main():
if state == "present":
child_configs = []
- if contract_label:
+ if contract_label is not None:
child_configs.append({contract_label_class: {"attributes": {"name": contract_label}}})
- if subject_label:
+ if subject_label is not None:
child_configs.append({subject_label_class: {"attributes": {"name": subject_label}}})
aci.payload(
aci_class=aci_class,
- class_config=dict(
- matchT=provider_match,
- prio=priority,
- tnVzBrCPName=contract,
- ),
+ class_config={"matchT": provider_match, "prio": priority, aci_name: contract},
child_configs=child_configs,
)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_interface.py b/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_interface.py
index bc0ed04fa..ff3a7908c 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_interface.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_contract_interface.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_epg_to_contract_interface
-short_description: Bind EPGs to Consumed Contracts Interface (fv:RsConsIf).
+short_description: Bind EPGs to Consumed Contracts Interface (fv:RsConsIf)
description:
- Bind EPGs to Consumed Contracts Interface on Cisco ACI fabrics.
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_domain.py b/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_domain.py
index 90f34cc29..1b82f9361 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_domain.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_epg_to_domain.py
@@ -137,7 +137,7 @@ options:
description:
- The delimiter.
type: str
- choices: [ "|", "~", "!", "@", "^", "+", "=" ]
+ choices: [ "|", "~", "!", "@", "^", "+", "=", "_" ]
untagged_vlan:
description:
- The access vlan is untagged.
@@ -384,7 +384,7 @@ def main():
vm_provider=dict(type="str", choices=["cloudfoundry", "kubernetes", "microsoft", "openshift", "openstack", "redhat", "vmware"]),
promiscuous=dict(type="str", default="reject", choices=["accept", "reject"]),
custom_epg_name=dict(type="str"),
- delimiter=dict(type="str", choices=["|", "~", "!", "@", "^", "+", "="]),
+ delimiter=dict(type="str", choices=["|", "~", "!", "@", "^", "+", "=", "_"]),
untagged_vlan=dict(type="bool"),
port_binding=dict(type="str", choices=["dynamic", "ephemeral", "static"]),
port_allocation=dict(type="str", choices=["elastic", "fixed"]),
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_block_statement.py b/ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_block_statement.py
new file mode 100644
index 000000000..9664b4640
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_block_statement.py
@@ -0,0 +1,348 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Akini Ross <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_epg_useg_attribute_block_statement
+short_description: Manage EPG useg Attributes Block Statements (fv:SCrtrn)
+description:
+- Manage EPG useg Attributes Block Statements
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ ap:
+ description:
+ - The name of an existing application network profile.
+ type: str
+ aliases: [ app_profile, app_profile_name ]
+ epg:
+ description:
+ - The name of an existing end point group.
+ type: str
+ aliases: [ epg_name ]
+ parent_block_statements:
+ description:
+ - The list of parent block statements.
+ - The order of the provided list matters, assuming the list ["A", "B"].
+ - The block statement "A" will be the parent of "B"
+ - The block statement "A" will be a child of the default block statement.
+ - The maximum amount of parent block statements is 2.
+ type: list
+ elements: str
+ aliases: [ blocks, parent_blocks ]
+ name:
+ description:
+ - The name of the block statement.
+ type: str
+ aliases: [ block_statement, block_statement_name ]
+ match:
+ description:
+ - The match type of the Block Statement.
+ - The APIC defaults to C(any) when unset during creation.
+ type: str
+ choices: [ any, all ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The I(tenant), I(ap) and I(epg) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_ap) and M(cisco.aci.aci_epg) modules can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_ap
+- module: cisco.aci.aci_epg
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fv:SCrtrn).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Akini Ross (@akinross))
+"""
+
+EXAMPLES = r"""
+- name: Add a new block statement
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ name: block_a
+ state: present
+ delegate_to: localhost
+
+- name: Add a new nested block statement
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ parent_block_statements:
+ - block_a
+ - block_b
+ name: block_c
+ match: any
+ state: present
+ delegate_to: localhost
+
+- name: Query a block statement
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ name: block_a
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all block statements
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove an existing block statement
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ name: block_a
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ ap=dict(type="str", aliases=["app_profile", "app_profile_name"]), # Not required for querying all objects
+ epg=dict(type="str", aliases=["epg_name"]), # Not required for querying all objects
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ parent_block_statements=dict(type="list", elements="str", aliases=["parent_blocks", "blocks"]),
+ name=dict(type="str", aliases=["block_statement", "block_statement_name"]),
+ match=dict(type="str", choices=["any", "all"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["ap", "epg", "tenant", "name"]],
+ ["state", "present", ["ap", "epg", "tenant", "name"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ ap = module.params.get("ap")
+ epg = module.params.get("epg")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ blocks = module.params.get("parent_block_statements")
+ name = module.params.get("name")
+ match = module.params.get("match")
+
+ block_statement_class = "fvSCrtrn"
+
+ if blocks:
+ if len(blocks) > 2:
+ module.fail_json(msg="{0} block statements are provided but the maximum amount of parent_block_statements is 2".format(len(blocks)))
+ parent_blocks_class = block_statement_class
+ parent_blocks_rn = "crtrn/crtrn-{0}".format("/crtrn-".join(blocks))
+ parent_blocks_name = blocks[-1]
+ else:
+ parent_blocks_class = "fvCrtrn"
+ parent_blocks_rn = "crtrn"
+ parent_blocks_name = "default"
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="fvAp",
+ aci_rn="ap-{0}".format(ap),
+ module_object=ap,
+ target_filter={"name": ap},
+ ),
+ subclass_2=dict(
+ aci_class="fvAEPg",
+ aci_rn="epg-{0}".format(epg),
+ module_object=epg,
+ target_filter={"name": epg},
+ ),
+ subclass_3=dict(
+ aci_class=parent_blocks_class,
+ aci_rn=parent_blocks_rn,
+ module_object=parent_blocks_name,
+ target_filter={"name": parent_blocks_name},
+ ),
+ subclass_4=dict(
+ aci_class=block_statement_class,
+ aci_rn="crtrn-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(aci_class=block_statement_class, class_config=dict(name=name, match=match))
+
+ aci.get_diff(aci_class=block_statement_class)
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_simple_statement.py b/ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_simple_statement.py
new file mode 100644
index 000000000..462a7fcaa
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_epg_useg_attribute_simple_statement.py
@@ -0,0 +1,436 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Christian Kolrep <christian.kolrep@dataport.de>
+# Copyright: (c) 2024, Akini Ross <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_epg_useg_attribute_simple_statement
+short_description: Manage EPG useg Attributes Simple Statements (fv:DnsAttr, fv:IdGroupAttr, fv:IpAttr, fv:MacAttr, and fv:VmAttr)
+description:
+- Manage EPG useg Attributes Simple Statements
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ ap:
+ description:
+ - The name of an existing application network profile.
+ type: str
+ aliases: [ app_profile, app_profile_name ]
+ epg:
+ description:
+ - The name of an existing end point group.
+ type: str
+ aliases: [ epg_name ]
+ parent_block_statements:
+ description:
+ - The list of parent block statements.
+ - The order of the provided list matters, assuming the list ["A", "B", "C"].
+ - The block statement "A" will be the parent of "B"
+ - The block statement "A" will be a child of the default block statement.
+ - The maximum amount of parent block statements is 3.
+ type: list
+ elements: str
+ aliases: [ blocks, parent_blocks ]
+ name:
+ description:
+ - The name of the EPG useg attribute.
+ type: str
+ aliases: [ useg_attribute_name ]
+ type:
+ description:
+ - The type of the EPG useg attribute
+ type: str
+ required: true
+ choices:
+ - ip
+ - mac
+ - dns
+ - ad_group
+ - vm_custom_attr
+ - vm_vmm_domain
+ - vm_operating_system
+ - vm_hypervisor_id
+ - vm_datacenter
+ - vm_id
+ - vm_name
+ - vm_folder
+ - vm_folder_path
+ - vm_vnic
+ - vm_tag
+ aliases: [ useg_attribute_type ]
+ operator:
+ description:
+ - The operator of the EPG useg attribute.
+ type: str
+ choices: [ equals, contains, starts_with, ends_with ]
+ category:
+ description:
+ - The name of the vmware tag category or vmware custom attribute.
+ type: str
+ aliases: [ custom_attribute ]
+ use_subnet:
+ description:
+ - Whether to use the EPG subnet definition for ip.
+ type: bool
+ value:
+ description:
+ - The value of the EPG useg attribute.
+ type: str
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The I(tenant), I(ap) and I(epg) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_ap) and M(cisco.aci.aci_epg) modules can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_ap
+- module: cisco.aci.aci_epg
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fv:DnsAttr), B(fv:IdGroupAttr), B(fv:IpAttr), B(fv:MacAttr), and B(fv:VmAttr).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Christian Kolrep (@Christian-Kolrep)
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Add a new vmtag useg attribute in default block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ name: vmtagprod
+ type: vmtag
+ category: Environment
+ operator: equals
+ value: Production
+ state: present
+ delegate_to: localhost
+
+- name: Add a new vmtag useg attribute in nested block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ name: vmtagprod
+ parent_block_statements:
+ - block_a
+ - block_b
+ type: vmtag
+ category: Environment
+ operator: equals
+ value: Production
+ state: present
+ delegate_to: localhost
+
+- name: Query a specific vmtag useg attribute in default block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ name: vmtagprod
+ type: vmtag
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all vmtag useg attributes
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ type: vmtag
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove an existing vmtag useg attribute from default block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: anstest
+ ap: anstest
+ epg: anstest
+ name: vmtagprod
+ type: vmtag
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import USEG_ATTRIBUTE_MAPPING, OPERATOR_MAPPING
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ ap=dict(type="str", aliases=["app_profile", "app_profile_name"]), # Not required for querying all objects
+ epg=dict(type="str", aliases=["epg_name"]), # Not required for querying all objects
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ parent_block_statements=dict(type="list", elements="str", aliases=["parent_blocks", "blocks"]),
+ name=dict(type="str", aliases=["useg_attribute_name"]),
+ type=dict(type="str", required=True, choices=list(USEG_ATTRIBUTE_MAPPING.keys()), aliases=["useg_attribute_type"]),
+ operator=dict(type="str", choices=list(OPERATOR_MAPPING.keys())),
+ category=dict(type="str", aliases=["custom_attribute"]),
+ value=dict(type="str"),
+ use_subnet=dict(type="bool"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["ap", "epg", "tenant", "name"]],
+ ["state", "present", ["ap", "epg", "tenant", "name"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ ap = module.params.get("ap")
+ epg = module.params.get("epg")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ blocks = module.params.get("parent_block_statements")
+ name = module.params.get("name")
+ attribute_type = module.params.get("type")
+ value = module.params.get("value")
+ operator = module.params.get("operator")
+ category = module.params.get("category")
+ use_subnet = aci.boolean(module.params.get("use_subnet"))
+
+ # Excluding below classes from the module:
+ # fvProtoAttr:
+ # Was used in AVS, but it is not longer in use.
+ # fvUsegBDCont:
+ # Was part of a feature that allowed uSeg attributes to be applied at VRF (instead of BD) level.
+ # It has been since deprecated and we no longer allow setting the scope at fvCtrn to scope-vrf.
+ # This type of functionality has been replaced by the ESG feature.
+ attribute_class = USEG_ATTRIBUTE_MAPPING[attribute_type]["attribute_class"]
+ attribute_rn = USEG_ATTRIBUTE_MAPPING[attribute_type]["rn_format"].format(name)
+ attribute_type = USEG_ATTRIBUTE_MAPPING[attribute_type]["attribute_type"]
+
+ if blocks:
+ if len(blocks) > 3:
+ module.fail_json(msg="{0} block statements are provided but the maximum amount of parent_block_statements is 3".format(len(blocks)))
+ parent_blocks_class = "fvSCrtrn"
+ parent_blocks_rn = "crtrn/crtrn-{0}".format("/crtrn-".join(blocks))
+ parent_blocks_name = blocks[-1]
+ else:
+ parent_blocks_class = "fvCrtrn"
+ parent_blocks_rn = "crtrn"
+ parent_blocks_name = "default"
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="fvAp",
+ aci_rn="ap-{0}".format(ap),
+ module_object=ap,
+ target_filter={"name": ap},
+ ),
+ subclass_2=dict(
+ aci_class="fvAEPg",
+ aci_rn="epg-{0}".format(epg),
+ module_object=epg,
+ target_filter={"name": epg},
+ ),
+ subclass_3=dict(
+ aci_class=parent_blocks_class,
+ aci_rn=parent_blocks_rn,
+ module_object=parent_blocks_name,
+ target_filter={"name": parent_blocks_name},
+ ),
+ subclass_4=dict(
+ aci_class=attribute_class,
+ aci_rn=attribute_rn,
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(name=name)
+
+ if attribute_class == "fvVmAttr":
+ class_config.update(type=attribute_type)
+ class_config.update(operator=OPERATOR_MAPPING.get(operator))
+ class_config.update(value=value)
+ if attribute_type == "tag":
+ class_config.update(category=category)
+ elif attribute_type == "custom-label":
+ class_config.update(labelName=category)
+
+ elif attribute_class == "fvIpAttr":
+ class_config.update(usefvSubnet=use_subnet)
+ class_config.update(ip=value)
+
+ elif attribute_class == "fvMacAttr":
+ class_config.update(mac=value.upper())
+
+ elif attribute_class == "fvDnsAttr":
+ class_config.update(filter=value)
+
+ elif attribute_class == "fvIdGroupAttr":
+ class_config.update(selector=value)
+
+ aci.payload(aci_class=attribute_class, class_config=class_config)
+
+ aci.get_diff(aci_class=attribute_class)
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_esg_ip_subnet_selector.py b/ansible_collections/cisco/aci/plugins/modules/aci_esg_ip_subnet_selector.py
index 368f9e6dc..b8632ec6a 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_esg_ip_subnet_selector.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_esg_ip_subnet_selector.py
@@ -14,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_esg_ip_subnet_selector
-short_description: Manage ESG IP Subnet selector(fv:EPSelector)
+short_description: Manage ESG IP Subnet selector (fv:EPSelector)
description:
- Manage Endpoint Security Groups (ESG) IP Subnet selector on Cisco ACI fabrics.
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_connection_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_connection_profile.py
new file mode 100644
index 000000000..efea05338
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_connection_profile.py
@@ -0,0 +1,311 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab.cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_external_connection_profile
+short_description: Manage Fabric External Connection Profiles (fv:FabricExtConnP).
+description:
+- Manage Fabric External Connection Profiles (Intrasite/Intersite profiles) on Cisco ACI fabrics.
+options:
+ description:
+ description:
+ - Specifies a description of the profile definition.
+ type: str
+ aliases: [ descr ]
+ fabric_id:
+ description:
+ - The fabric identifier of the Fabric External Connection Profile.
+ type: int
+ aliases: [ id, fabric ]
+ name:
+ description:
+ - The name of the Fabric External Connection Profile.
+ type: str
+ aliases: [ profile_name ]
+ community:
+ description:
+ - Global EVPN Route Target of the Fabric External Connection Profile.
+ - eg. extended:as2-nn4:5:16
+ type: str
+ aliases: [ rt, route_target ]
+ site_id:
+ description:
+ - The site identifier of the Fabric External Connection Profile.
+ type: int
+ aliases: [ sid, site, s_id ]
+ peering_type:
+ description:
+ - The BGP EVPN Peering Type. Use either C(automatic_with_full_mesh) or C(automatic_with_rr).
+ type: str
+ choices: [ automatic_with_full_mesh, automatic_with_rr ]
+ aliases: [ p_type, peer, peer_t ]
+ peering_password:
+ description:
+ - The BGP EVPN Peering Password. Used for setting automatic peering sessions.
+ type: str
+ aliases: [ peer_password, peer_pwd ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fv:FabricExtConnP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Fabric External Connection Profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ name: ansible_fabric_ext_conn_profile
+ description: Fabric External Connection Profile
+ community: extended:as2-nn4:5:16
+ site_id: 1
+ peering_type: automatic_with_rr
+ peering_password: SomeSecretPeeringPassword
+ state: present
+ delegate_to: localhost
+
+- name: Query a Fabric External Connection Profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Fabric External Connection Profiles
+ cisco.aci.aci_fabric_external_connection_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove a Fabric External Connection Profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ description=dict(type="str", aliases=["descr"]),
+ fabric_id=dict(type="int", aliases=["id", "fabric"]),
+ name=dict(type="str", aliases=["profile_name"]),
+ community=dict(type="str", aliases=["rt", "route_target"]),
+ site_id=dict(type="int", aliases=["sid", "site", "s_id"]),
+ peering_type=dict(type="str", aliases=["p_type", "peer", "peer_t"], choices=["automatic_with_full_mesh", "automatic_with_rr"]),
+ peering_password=dict(type="str", aliases=["peer_password", "peer_pwd"], no_log=True),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["fabric_id"]],
+ ["state", "present", ["fabric_id"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ description = module.params.get("description")
+ fabric_id = module.params.get("fabric_id")
+ name = module.params.get("name")
+ community = module.params.get("community")
+ peering_type = module.params.get("peering_type")
+ peering_password = module.params.get("peering_password")
+ site_id = module.params.get("site_id")
+ state = module.params.get("state")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvFabricExtConnP",
+ aci_rn="tn-infra/fabricExtConnP-{0}".format(fabric_id),
+ module_object=fabric_id,
+ target_filter={"id": fabric_id},
+ ),
+ child_classes=["fvPeeringP"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = None
+ if peering_type is not None or peering_password is not None:
+ peering_p = {"fvPeeringP": {"attributes": {}}}
+ if peering_type is not None:
+ peering_p["fvPeeringP"]["attributes"]["type"] = peering_type
+ if peering_password is not None:
+ peering_p["fvPeeringP"]["attributes"]["password"] = peering_password
+ child_configs = [peering_p]
+
+ aci.payload(
+ aci_class="fvFabricExtConnP",
+ class_config=dict(
+ descr=description,
+ id=fabric_id,
+ name=name,
+ rt=community,
+ siteId=site_id,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="fvFabricExtConnP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_routing_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_routing_profile.py
new file mode 100644
index 000000000..539705def
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_external_routing_profile.py
@@ -0,0 +1,315 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab.cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_external_routing_profile
+short_description: Manage Fabric External Routing Profiles (l3ext:FabricExtRoutingP)
+description:
+- Manage Fabric External Routing Profiles on Cisco ACI fabrics.
+options:
+ name:
+ description:
+ - The name of the Fabric External Routing Profile.
+ type: str
+ aliases: [ routing_profile, profile ]
+ fabric_id:
+ description:
+ - The Fabric ID associated with the Fabric External Routing Profile.
+ type: int
+ aliases: [ fabric, fid]
+ description:
+ description:
+ - The description of the Fabric External Routing Profile.
+ type: str
+ aliases: [ descr ]
+ subnets:
+ description:
+ - The list of external subnet IP addresses.
+ - Duplicate subnet IP addresses are not valid and would be ignored.
+ type: list
+ elements: str
+ aliases: [ ip_addresses, ips ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- This module requires an existing I(fabric_external_connection_profile).
+ The module M(cisco.aci.aci_fabric_external_connection_profile) can be used for this.
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(l3ext:FabricExtRoutingP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+# TODO EXAMPLES
+EXAMPLES = r"""
+- name: Add an External Routing Profile
+ cisco.aci.aci_fabric_external_routing_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: "1"
+ description: "Fabric external routing profile"
+ name: "ansible_fabric_ext_routing_profile"
+ subnets:
+ - 1.2.3.4/24
+ - 5.6.7.8/24
+ state: present
+ delegate_to: localhost
+
+- name: Query an External Routing Profile
+ cisco.aci.aci_fabric_external_routing_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ name: ansible_fabric_ext_routing_profile
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all External Routing Profiles
+ cisco.aci.aci_fabric_external_routing_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove an External Routing Profile
+ cisco.aci.aci_fabric_external_routing_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ name: ansible_fabric_ext_routing_profile
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ name=dict(type="str", aliases=["routing_profile", "profile"]),
+ fabric_id=dict(type="int", aliases=["fabric", "fid"]),
+ description=dict(type="str", aliases=["descr"]),
+ subnets=dict(type="list", elements="str", aliases=["ip_addresses", "ips"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["fabric_id", "name"]],
+ ["state", "present", ["fabric_id", "name"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ name = module.params.get("name")
+ fabric_id = module.params.get("fabric_id")
+ description = module.params.get("description")
+ subnets = module.params.get("subnets")
+ state = module.params.get("state")
+
+ # Remove duplicate subnets
+ if isinstance(subnets, list):
+ subnets = list(dict.fromkeys(subnets))
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvFabricExtConnP",
+ aci_rn="tn-infra/fabricExtConnP-{0}".format(fabric_id),
+ module_object=fabric_id,
+ target_filter={"id": fabric_id},
+ ),
+ subclass_1=dict(
+ aci_class="l3extFabricExtRoutingP",
+ aci_rn="fabricExtRoutingP-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ child_classes=["l3extSubnet"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+
+ # Validate if existing and remove subnet objects when the config does not match the provided config.
+ if isinstance(aci.existing, list) and len(aci.existing) > 0:
+ subnets = [] if subnets is None else subnets
+ for child in aci.existing[0].get("l3extFabricExtRoutingP", {}).get("children", {}):
+ if child.get("l3extSubnet") and child.get("l3extSubnet").get("attributes").get("ip") not in subnets:
+ child_configs.append(
+ {
+ "l3extSubnet": {
+ "attributes": {
+ "ip": child.get("l3extSubnet").get("attributes").get("ip"),
+ "status": "deleted",
+ }
+ }
+ }
+ )
+
+ if subnets is not None:
+ for subnet in subnets:
+ child_configs.append({"l3extSubnet": {"attributes": {"ip": subnet}}})
+
+ aci.payload(
+ aci_class="l3extFabricExtRoutingP",
+ class_config=dict(
+ name=name,
+ descr=description,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="l3extFabricExtRoutingP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_interface_policy_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_interface_policy_group.py
index 4048187db..a6a62b3da 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_interface_policy_group.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_interface_policy_group.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_fabric_interface_policy_group
-short_description: Manage Fabric Interface Policy Groups (fabric:LePortPGrp, fabric:SpPortPGrp)
+short_description: Manage Fabric Interface Policy Groups (fabric:LePortPGrp and fabric:SpPortPGrp)
description:
- Manage Fabric Interface Policy Groups on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_profile.py
index 09c87a387..590fbd7ba 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_leaf_profile.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_fabric_leaf_profile
-short_description: Manage fabric leaf profiles (fabric:LeafP).
+short_description: Manage fabric leaf profiles (fabric:LeafP)
description:
- Manage fabric leaf switch profiles in an ACI fabric.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access.py
new file mode 100644
index 000000000..493de3947
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access.py
@@ -0,0 +1,700 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_management_access
+short_description: Manage Fabric Management Access (comm:Pol)
+description:
+- Manage Fabric Management Access on Cisco ACI fabrics.
+options:
+ name:
+ description:
+ - The name of the Fabric Management Access policy.
+ type: str
+ aliases: [ fabric_management_access_policy_name ]
+ description:
+ description:
+ - The description of the Fabric Management Access policy.
+ type: str
+ aliases: [ descr ]
+ name_alias:
+ description:
+ - The name alias of the Fabric Management Access policy.
+ - This relates to the nameAlias property in ACI.
+ type: str
+ http:
+ description:
+ - Parameters for HTTP configuration (comm:Http).
+ type: dict
+ suboptions:
+ admin_state:
+ description:
+ - The admin state of the HTTP connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ port:
+ description:
+ - The port for the HTTP connection.
+ - The APIC defaults to C(80) when unset during creation.
+ type: int
+ redirect:
+ description:
+ - The state of the HTTP to HTTPS redirect service.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled, tested ]
+ allow_origins:
+ description:
+ - The allowed origins for the HTTP connection.
+ - 'Example format: http://127.0.0.1:8000'
+ type: str
+ allow_credentials:
+ description:
+ - The state of the allow credential for the HTTP connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ throttle:
+ description:
+ - The state of the request throttle for the HTTP connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ throttle_rate:
+ description:
+ - The rate of the request throttle.
+ - The APIC defaults to C(10000) when unset during creation.
+ type: int
+ throttle_unit:
+ description:
+ - The unit of the request throttle rate.
+ - The APIC defaults to C(requests_per_second) when unset during creation.
+ type: str
+ choices: [ requests_per_second, requests_per_minute ]
+ https:
+ description:
+ - Parameters for HTTPS configuration (comm:Https).
+ type: dict
+ suboptions:
+ admin_state:
+ description:
+ - The admin state of the HTTPS connection.
+ - The APIC defaults to C(enabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ port:
+ description:
+ - The port for the HTTPS connection.
+ - The APIC defaults to C(443) when unset during creation.
+ type: int
+ allow_origins:
+ description:
+ - The allowed origins for the HTTPS connection.
+ - 'Example format: http://127.0.0.1:8000'
+ type: str
+ allow_credentials:
+ description:
+ - The state of the allow credential for the HTTPS connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ ssl:
+ description:
+ - The SSL protocol(s) for the HTTPS connection.
+ - The APIC defaults to C(tls_v1.1) and C(tls_v1.2) set when unset during creation.
+ type: list
+ elements: str
+ choices: [ tls_v1.0, tls_v1.1, tls_v1.2, tls_v1.3 ]
+ aliases: [ ssl_protocols ]
+ dh_param:
+ description:
+ - The Diffie-Hellman parameter for the HTTPS connection.
+ - The APIC defaults to C(none) when unset during creation.
+ type: str
+ choices: [ '1024', '2048', '4096', none ]
+ throttle:
+ description:
+ - The state of the request throttle for the HTTPS connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ throttle_rate:
+ description:
+ - The rate of the request throttle.
+ - The APIC defaults to C(10000) when unset during creation.
+ type: int
+ throttle_unit:
+ description:
+ - The unit of the request throttle rate.
+ - The APIC defaults to C(requests_per_second) when unset during creation.
+ type: str
+ choices: [ requests_per_second, requests_per_minute ]
+ admin_key_ring:
+ description:
+ - The admin key ring for the HTTPS connection.
+ - The APIC defaults to C(default) when unset during creation.
+ type: str
+ client_certificate_trustpoint:
+ description:
+ - The client certificate trustpoint for the HTTPS connection.
+ type: str
+ aliases: [ trustpoint ]
+ client_certificate_authentication_state:
+ description:
+ - The client certificate authentication state for the HTTPS connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ - The C(enabled) state requires a C(client_certificate_trustpoint) to be set.
+ type: str
+ choices: [ enabled, disabled ]
+ aliases: [ client_certificate_auth_state, auth_state, authentication_state ]
+ telnet:
+ description:
+ - Parameters for telnet configuration (comm:Telnet).
+ type: dict
+ suboptions:
+ admin_state:
+ description:
+ - The admin state of the telnet connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ port:
+ description:
+ - The port for the telnet connection.
+ - The APIC defaults to C(23) when unset during creation.
+ type: int
+ ssh:
+ description:
+ - Parameters for SSH configuration (comm:Ssh).
+ type: dict
+ suboptions:
+ admin_state:
+ description:
+ - The admin state of the SSH connection.
+ - The APIC defaults to C(enabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ password_auth_state:
+ description:
+ - The password authentication state of the SSH connection.
+ - The APIC defaults to C(enabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ port:
+ description:
+ - The port for the SSH connection.
+ - The APIC defaults to C(22) when unset during creation.
+ type: int
+ ciphers:
+ description:
+ - The ciphers of the SSH connection.
+ - The APIC defaults to all options set when unset during creation.
+ type: list
+ elements: str
+ choices: [ aes128_ctr, aes192_ctr, aes256_ctr, aes128_gcm, aes256_gcm, chacha20 ]
+ kex:
+ description:
+ - The KEX algorithms of the SSH connection.
+ - The APIC defaults to all options set when unset during creation.
+ type: list
+ elements: str
+ choices: [ dh_sha1, dh_sha256, dh_sha512, curve_sha256, curve_sha256_libssh, ecdh_256, ecdh_384, ecdh_521 ]
+ macs:
+ description:
+ - The MACs of the SSH connection.
+ - The APIC defaults to all options set when unset during creation.
+ type: list
+ elements: str
+ choices: [ sha1, sha2_256, sha2_512, sha2_256_etm, sha2_512_etm ]
+ ssh_web:
+ description:
+ - Parameters for SSH access via WEB configuration (comm:Shellinabox).
+ type: dict
+ suboptions:
+ admin_state:
+ description:
+ - The admin state of the SSH access via WEB connection.
+ - The APIC defaults to C(disabled) when unset during creation.
+ type: str
+ choices: [ enabled, disabled ]
+ state:
+ description:
+ - Use C(present) for updating configuration.
+ - Use C(query) for showing current configuration.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(comm:Pol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Create a Fabric Management Access policy
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ description: "This is a example Fabric Management Access policy."
+ state: present
+ delegate_to: localhost
+
+- name: Create a Fabric Management Access policy with telnet enabled
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ description: "This is a example Fabric Management Access policy."
+ telnet:
+ admin_state: enabled
+ state: present
+ delegate_to: localhost
+
+- name: Create a Fabric Management Access policy with SSH access via WEB enabled
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ description: "This is a example Fabric Management Access policy."
+ ssh_web:
+ admin_state: enabled
+ state: present
+ delegate_to: localhost
+
+- name: Create a Fabric Management Access policy with SSH enabled and ciphers set
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ description: "This is a example Fabric Management Access policy."
+ ssh:
+ admin_state: enabled
+ ciphers:
+ - aes128_ctr
+ - aes192_ctr
+ - aes256_ctr
+ state: present
+ delegate_to: localhost
+
+- name: Create a Fabric Management Access policy with HTTP enabled
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ description: "This is a example Fabric Management Access policy."
+ http:
+ admin_state: enabled
+ allow_origins: http://127.0.0.1:8000
+ throttle: enabled
+ throttle_rate: 7500
+ throttle_unit: requests_per_minute
+ state: present
+ delegate_to: localhost
+
+- name: Create a Fabric Management Access policy with HTTPS enabled
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ description: "This is a example Fabric Management Access policy."
+ https:
+ admin_state: enabled
+ port: 445
+ allow_origins: http://127.0.0.1:8000
+ allow_credentials: enabled
+ ssl:
+ - tls_v1.2
+ dh_param: 4096
+ throttle: enabled
+ throttle_rate: 7500
+ throttle_unit: requests_per_minute
+ admin_key_ring: default
+ client_certificate_trustpoint: ansible_trustpoint
+ client_certificate_authentication_state: enabled
+ state: present
+ delegate_to: localhost
+
+- name: Query a Fabric Management Access policy
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Fabric Management Access policies
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a Fabric Management Access policy
+ cisco.aci.aci_fabric_management_access:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: fabric_management_access_policy_1
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import THROTTLE_UNIT, SSH_CIPHERS, KEX_ALGORITHMS, SSH_MACS, HTTP_TLS_MAPPING
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ name=dict(type="str", aliases=["fabric_management_access_policy_name"]), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ name_alias=dict(type="str"),
+ http=dict(
+ type="dict",
+ options=dict(
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ port=dict(type="int"),
+ redirect=dict(type="str", choices=["enabled", "disabled", "tested"]),
+ allow_origins=dict(type="str"),
+ allow_credentials=dict(type="str", choices=["enabled", "disabled"]),
+ throttle=dict(type="str", choices=["enabled", "disabled"]),
+ throttle_rate=dict(type="int"),
+ throttle_unit=dict(type="str", choices=["requests_per_second", "requests_per_minute"]),
+ ),
+ ),
+ https=dict(
+ type="dict",
+ options=dict(
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ port=dict(type="int"),
+ allow_origins=dict(type="str"),
+ allow_credentials=dict(type="str", choices=["enabled", "disabled"]),
+ ssl=dict(
+ type="list",
+ elements="str",
+ choices=list(HTTP_TLS_MAPPING.keys()),
+ aliases=["ssl_protocols"],
+ ),
+ dh_param=dict(type="str", choices=["1024", "2048", "4096", "none"]),
+ throttle=dict(type="str", choices=["enabled", "disabled"]),
+ throttle_rate=dict(type="int"),
+ throttle_unit=dict(type="str", choices=["requests_per_second", "requests_per_minute"]),
+ admin_key_ring=dict(type="str", no_log=False),
+ client_certificate_trustpoint=dict(type="str", aliases=["trustpoint"]),
+ client_certificate_authentication_state=dict(
+ type="str",
+ choices=["enabled", "disabled"],
+ aliases=["client_certificate_auth_state", "auth_state", "authentication_state"],
+ ),
+ ),
+ ),
+ telnet=dict(
+ type="dict",
+ options=dict(
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ port=dict(type="int"),
+ ),
+ ),
+ ssh=dict(
+ type="dict",
+ options=dict(
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ password_auth_state=dict(type="str", choices=["enabled", "disabled"]),
+ port=dict(type="int"),
+ ciphers=dict(type="list", elements="str", choices=list(SSH_CIPHERS.keys())),
+ kex=dict(type="list", elements="str", choices=list(KEX_ALGORITHMS.keys())),
+ macs=dict(type="list", elements="str", choices=list(SSH_MACS.keys())),
+ ),
+ ),
+ ssh_web=dict(
+ type="dict",
+ options=dict(
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ ),
+ ),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "present", ["name"]],
+ ["state", "absent", ["name"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+ aci_class = "commPol"
+ aci_child_classes = ["commSsh", "commHttp", "commHttps", "commTelnet", "commShellinabox"]
+
+ name = module.params.get("name")
+ description = module.params.get("description")
+ name_alias = module.params.get("name_alias")
+ http = module.params.get("http")
+ https = module.params.get("https")
+ telnet = module.params.get("telnet")
+ ssh = module.params.get("ssh")
+ ssh_web = module.params.get("ssh_web")
+ state = module.params.get("state")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class=aci_class,
+ aci_rn="fabric/comm-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ child_classes=aci_child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+
+ if ssh:
+ child_configs.append(
+ dict(
+ commSsh=dict(
+ attributes=dict(
+ adminSt=ssh.get("admin_state"),
+ passwordAuth=ssh.get("password_auth_state"),
+ port=ssh.get("port"),
+ sshCiphers=",".join(sorted(SSH_CIPHERS.get(v) for v in set(ssh.get("ciphers")))) if ssh.get("ciphers") else None,
+ kexAlgos=",".join(sorted(KEX_ALGORITHMS.get(v) for v in set(ssh.get("kex")))) if ssh.get("kex") else None,
+ sshMacs=",".join(sorted(SSH_MACS.get(v) for v in set(ssh.get("macs")))) if ssh.get("macs") else None,
+ )
+ )
+ )
+ )
+
+ if http:
+ child_configs.append(
+ dict(
+ commHttp=dict(
+ attributes=dict(
+ adminSt=http.get("admin_state"),
+ port=http.get("port"),
+ redirectSt=http.get("redirect"),
+ accessControlAllowOrigins=http.get("allow_origins"),
+ accessControlAllowCredential=http.get("allow_credentials"),
+ globalThrottleSt=http.get("throttle"),
+ globalThrottleRate=http.get("throttle_rate"),
+ globalThrottleUnit=THROTTLE_UNIT.get(http.get("throttle_unit")),
+ )
+ )
+ )
+ )
+
+ if https:
+ https_config = dict(
+ commHttps=dict(
+ attributes=dict(
+ adminSt=https.get("admin_state"),
+ port=https.get("port"),
+ accessControlAllowOrigins=https.get("allow_origins"),
+ accessControlAllowCredential=https.get("allow_credentials"),
+ sslProtocols=",".join(sorted(HTTP_TLS_MAPPING.get(v) for v in set(https.get("ssl")))) if https.get("ssl") else None,
+ dhParam=https.get("dh_param"),
+ globalThrottleSt=https.get("throttle"),
+ globalThrottleRate=https.get("throttle_rate"),
+ globalThrottleUnit=THROTTLE_UNIT.get(https.get("throttle_unit")),
+ clientCertAuthState=https.get("client_certificate_authentication_state"),
+ ),
+ children=[],
+ )
+ )
+
+ if https.get("admin_key_ring"):
+ https_config["commHttps"]["children"].append(dict(commRsKeyRing=dict(attributes=dict(tnPkiKeyRingName=https.get("admin_key_ring")))))
+
+ if https.get("client_certificate_trustpoint"):
+ https_config["commHttps"]["children"].append(
+ dict(commRsClientCertCA=dict(attributes=dict(tDn="uni/userext/pkiext/tp-{0}".format(https.get("client_certificate_trustpoint")))))
+ )
+
+ child_configs.append(https_config)
+
+ if telnet:
+ child_configs.append(
+ dict(
+ commTelnet=dict(
+ attributes=dict(
+ adminSt=telnet.get("admin_state"),
+ port=telnet.get("port"),
+ )
+ )
+ )
+ )
+
+ if ssh_web:
+ child_configs.append(
+ dict(
+ commShellinabox=dict(
+ attributes=dict(
+ adminSt=ssh_web.get("admin_state"),
+ )
+ )
+ )
+ )
+
+ aci.payload(
+ aci_class=aci_class,
+ class_config=dict(
+ name=name,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class=aci_class)
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access_https_cipher.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access_https_cipher.py
new file mode 100644
index 000000000..96952f263
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_management_access_https_cipher.py
@@ -0,0 +1,282 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_management_access_https_cipher
+short_description: Manage Fabric Management Access HTTPS SSL Cipher Configuration (comm:Cipher)
+description:
+- Manage Fabric Management Access HTTPS SSL Cipher Configuration on Cisco ACI fabrics.
+options:
+ fabric_management_access_policy_name:
+ description:
+ - The name of the Fabric Management Access policy.
+ type: str
+ aliases: [ name ]
+ id:
+ description:
+ - The ID of the SSL Cipher Configuration.
+ type: str
+ cipher_state:
+ description:
+ - The state of the SSL Cipher Configuration.
+ type: str
+ choices: [ enabled, disabled ]
+ name_alias:
+ description:
+ - The name alias of the Fabric Management Access HTTPS SSL Cipher Configuration.
+ - This relates to the nameAlias property in ACI.
+ type: str
+ state:
+ description:
+ - Use C(present) for updating configuration.
+ - Use C(query) for showing current configuration.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(fabric_management_access_policy_name) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_fabric_management_access) module can be used for this.
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(comm:Cipher).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Create a Fabric Management Access HTTPS SSL Cipher
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_management_access_policy_name: fabric_management_access_policy_1
+ id: DHE-RSA-AES128-SHA
+ cipher_state: enabled
+ state: present
+ delegate_to: localhost
+
+- name: Query a Fabric Management Access HTTPS SSL Cipher
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_management_access_policy_name: fabric_management_access_policy_1
+ id: DHE-RSA-AES128-SHA
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Fabric Management Access policies
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a Fabric Management Access HTTPS SSL Cipher
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_management_access_policy_name: fabric_management_access_policy_1
+ id: DHE-RSA-AES128-SHA
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ fabric_management_access_policy_name=dict(type="str", aliases=["name"]), # Not required for querying all objects
+ id=dict(type="str"),
+ cipher_state=dict(type="str", choices=["enabled", "disabled"]),
+ name_alias=dict(type="str"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "present", ["fabric_management_access_policy_name", "id", "cipher_state"]],
+ ["state", "absent", ["fabric_management_access_policy_name", "id"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+ aci_class = "commCipher"
+
+ fabric_management_access_policy_name = module.params.get("fabric_management_access_policy_name")
+ id_value = module.params.get("id")
+ cipher_state = module.params.get("cipher_state")
+ name_alias = module.params.get("name_alias")
+ state = module.params.get("state")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class=aci_class,
+ aci_rn="fabric/comm-{0}".format(fabric_management_access_policy_name),
+ module_object=fabric_management_access_policy_name,
+ target_filter={"name": fabric_management_access_policy_name},
+ ),
+ subclass_1=dict(
+ aci_class=aci_class,
+ aci_rn="https/cph-{0}".format(id_value),
+ module_object=id_value,
+ target_filter={"id": id_value},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class=aci_class,
+ class_config=dict(
+ id=id_value,
+ state=cipher_state,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class=aci_class)
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod.py
new file mode 100644
index 000000000..b9adc1d27
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod.py
@@ -0,0 +1,292 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_pod
+short_description: Manage Fabric Pod Setup Policy (fabric:SetupP)
+description:
+- Manage Fabric Pod Setup Policy on Cisco ACI fabrics.
+options:
+ pod_id:
+ description:
+ - The Pod ID for the Fabric Pod Setup Policy.
+ - Accepted value range between C(1) and C(254).
+ type: int
+ aliases: [ pod, id ]
+ pod_type:
+ description:
+ - The type of the Pod. Use C(physical) or C(virtual).
+ - The APIC defaults to C(physical) when unset during creation.
+ type: str
+ choices: [ physical, virtual ]
+ aliases: [ type ]
+ tep_pool:
+ description:
+ - The TEP address pool for the Fabric Pod Setup Policy.
+ - Must be valid IPv4 and include the subnet mask.
+ - Example 192.168.1.0/24
+ type: str
+ aliases: [ tep, pool ]
+ description:
+ description:
+ - The description for the Fabric Pod Setup Policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fabric:SetupP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Add a fabric pod setup policy
+ cisco.aci.aci_fabric_pod:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 1
+ tep_pool: 10.0.0.0/16
+ state: present
+ delegate_to: localhost
+
+- name: Query the fabric pod setup policy
+ cisco.aci.aci_fabric_pod:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all fabric pod setup policies
+ cisco.aci.aci_fabric_pod:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove a fabric pod setup policy
+ cisco.aci.aci_fabric_pod:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 1
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+)
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ pod_id=dict(type="int", aliases=["pod", "id"]),
+ pod_type=dict(type="str", choices=["physical", "virtual"], aliases=["type"]),
+ tep_pool=dict(type="str", aliases=["tep", "pool"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["pod_id"]],
+ ["state", "present", ["pod_id"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ name_alias = module.params.get("name_alias")
+ pod_id = module.params.get("pod_id")
+ pod_type = module.params.get("pod_type")
+ tep_pool = module.params.get("tep_pool")
+ description = module.params.get("description")
+ state = module.params.get("state")
+
+ if pod_id is not None and int(pod_id) not in range(1, 254):
+ aci.fail_json(msg="Pod ID: {0} is invalid; it must be in the range of 1 to 254.".format(pod_id))
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fabricSetupP",
+ aci_rn="controller/setuppol/setupp-{0}".format(pod_id),
+ module_object=pod_id,
+ target_filter={"podId": pod_id},
+ ),
+ child_classes=["fabricExtRoutablePodSubnet", "fabricExtSetupP"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="fabricSetupP",
+ class_config=dict(
+ podId=pod_id,
+ podType=pod_type,
+ tepPool=tep_pool,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="fabricSetupP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_connectivity_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_connectivity_profile.py
new file mode 100644
index 000000000..ed601a358
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_connectivity_profile.py
@@ -0,0 +1,336 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab.cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_pod_connectivity_profile
+short_description: Manage Fabric External Pod Connectivity Profiles (fv:PodConnP)
+description:
+- Manage Fabric External Pod Connectivity Profiles on Cisco ACI fabrics.
+options:
+ pod_id:
+ description:
+ - The Pod ID associated with the Pod Connectivity Profile.
+ type: int
+ aliases: [ pod, pid ]
+ fabric_id:
+ description:
+ - The Fabric ID associated with the Pod Connectivity Profile.
+ type: int
+ aliases: [ fabric, fid ]
+ virtual_pod_id:
+ description:
+ - The Pod ID in the main fabric to which this I(pod_id) is associated. This property is valid only if this pod is a virtual pod.
+ type: int
+ aliases: [ vpod, vpod_id ]
+ description:
+ description:
+ - The description of the Pod Connectivity Profile.
+ type: str
+ aliases: [ descr ]
+ data_plane_tep:
+ description:
+ - The Data Plane TEP IPv4 address and prefix.
+ - eg. 10.1.1.1/32
+ type: str
+ aliases: [ dp_tep ]
+ unicast_tep:
+ description:
+ - The Unicast TEP IPv4 address and prefix.
+ - eg. 10.1.1.2/32
+ type: str
+ aliases: [ u_tep ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- This module requires an existing I(fabric_external_connection_profile).
+ The module M(cisco.aci.aci_fabric_external_connection_profile) can be used for this.
+seealso:
+- module: cisco.aci.aci_fabric_external_connection_profile
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fv:PodConnP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Add a Pod Connectivity Profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ pod_id: 1
+ description: First pod connectivity profile
+ data_plane_tep: 10.1.1.1/32
+ unicast_tep: 10.1.1.2/32
+ state: present
+ delegate_to: localhost
+
+- name: Query a Pod Connectivity Profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ pod_id: 1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Pod Connectivity Profiles
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove a Pod Connectivity Profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ fabric_id: 1
+ pod_id: 1
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ pod_id=dict(type="int", aliases=["pod", "pid"]),
+ fabric_id=dict(type="int", aliases=["fabric", "fid"]),
+ virtual_pod_id=dict(type="int", aliases=["vpod", "vpod_id"]),
+ description=dict(type="str", aliases=["descr"]),
+ data_plane_tep=dict(type="str", aliases=["dp_tep"]),
+ unicast_tep=dict(type="str", aliases=["u_tep"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["fabric_id", "pod_id"]],
+ ["state", "present", ["fabric_id", "pod_id"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ pod_id = module.params.get("pod_id")
+ fabric_id = module.params.get("fabric_id")
+ virtual_pod_id = module.params.get("virtual_pod_id")
+ description = module.params.get("description")
+ data_plane_tep = module.params.get("data_plane_tep")
+ unicast_tep = module.params.get("unicast_tep")
+ state = module.params.get("state")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvFabricExtConnP",
+ aci_rn="tn-infra/fabricExtConnP-{0}".format(fabric_id),
+ module_object=fabric_id,
+ target_filter={"id": fabric_id},
+ ),
+ subclass_1=dict(
+ aci_class="fvPodConnP",
+ aci_rn="podConnP-{0}".format(pod_id),
+ module_object=pod_id,
+ target_filter={"id": pod_id},
+ ),
+ child_classes=["fvIp", "fvExtRoutableUcastConnP"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+
+ # Validate if existing and remove child objects when the config does not match the provided config.
+ if isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("fvPodConnP", {}).get("children", {}):
+ if child.get("fvExtRoutableUcastConnP") and child.get("fvExtRoutableUcastConnP").get("attributes").get("addr") != unicast_tep:
+ child_configs.append(
+ {
+ "fvExtRoutableUcastConnP": {
+ "attributes": {
+ "addr": child.get("fvExtRoutableUcastConnP").get("attributes").get("addr"),
+ "status": "deleted",
+ }
+ }
+ }
+ )
+ if child.get("fvIp") and child.get("fvIp").get("attributes").get("addr") != data_plane_tep:
+ child_configs.append(
+ {
+ "fvIp": {
+ "attributes": {
+ "addr": child.get("fvIp").get("attributes").get("addr"),
+ "status": "deleted",
+ }
+ }
+ }
+ )
+
+ if unicast_tep is not None:
+ child_configs.append({"fvExtRoutableUcastConnP": {"attributes": {"addr": unicast_tep}}})
+ if data_plane_tep is not None:
+ child_configs.append({"fvIp": {"attributes": {"addr": data_plane_tep}}})
+
+ aci.payload(
+ aci_class="fvPodConnP",
+ class_config=dict(
+ id=pod_id,
+ assocIntersitePodId=virtual_pod_id,
+ descr=description,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="fvPodConnP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_external_tep.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_external_tep.py
new file mode 100644
index 000000000..511a5aa93
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_external_tep.py
@@ -0,0 +1,321 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_pod_external_tep
+short_description: Manage Fabric Pod External TEP (fabric:ExtRoutablePodSubnet)
+description:
+- Manage Fabric Pod External TEP Subnets.
+options:
+ pod_id:
+ description:
+ - The Pod ID for the External TEP.
+ type: int
+ aliases: [ pod ]
+ description:
+ description:
+ - The description for the External TEP.
+ type: str
+ aliases: [ descr ]
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+ external_tep_pool:
+ description:
+ - The subnet IP address pool for the External TEP.
+ - Must be valid IPv4 and include the subnet mask.
+ - Example 192.168.1.0/24
+ type: str
+ aliases: [ ip, ip_address, tep_pool, pool ]
+ reserve_address_count:
+ description:
+ - Indicates the number of IP addresses that are reserved from the start of the subnet.
+ type: int
+ aliases: [ address_count ]
+ status:
+ description:
+ - State of the External TEP C(active) or C(inactive).
+ - An External TEP can only be deleted when the state is inactive.
+ - The APIC defaults to C(active) when unset during creation.
+ type: str
+ choices: [ active, inactive ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(Fabric Pod Setup Policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_fabric_pod) module can be used for this.
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fabric:ExtRoutablePodSubnet).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Add an External TEP to a fabric pod setup policy
+ cisco.aci.aci_fabric_pod_external_tep:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 2
+ external_tep_pool: 10.6.1.0/24
+ reserve_address_count: 5
+ status: active
+ state: present
+ delegate_to: localhost
+
+- name: Change an External TEP state on a fabric pod setup policy to inactive
+ cisco.aci.aci_fabric_pod_external_tep:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 2
+ external_tep_pool: 10.6.1.0/24
+ status: inactive
+ state: present
+ delegate_to: localhost
+
+- name: Query the External TEP on a fabric pod setup policy
+ cisco.aci.aci_fabric_pod_external_tep:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 2
+ external_tep_pool: 10.6.1.0/24
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query External TEPs on all fabric pod setup policies
+ cisco.aci.aci_fabric_pod_external_tep:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete an External TEP on a fabric pod setup policy
+ cisco.aci.aci_fabric_pod_external_tep:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 2
+ external_tep_pool: 10.6.1.0/24
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+)
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ description=dict(type="str", aliases=["descr"]),
+ name_alias=dict(type="str"),
+ pod_id=dict(type="int", aliases=["pod"]),
+ external_tep_pool=dict(type="str", aliases=["ip", "ip_address", "tep_pool", "pool"]),
+ reserve_address_count=dict(type="int", aliases=["address_count"]),
+ status=dict(type="str", choices=["active", "inactive"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["pod_id", "external_tep_pool"]],
+ ["state", "present", ["pod_id", "external_tep_pool"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ pod_id = module.params.get("pod_id")
+ descr = module.params.get("descr")
+ name_alias = module.params.get("name_alias")
+ external_tep_pool = module.params.get("external_tep_pool")
+ reserve_address_count = module.params.get("reserve_address_count")
+ status = module.params.get("status")
+ state = module.params.get("state")
+
+ if pod_id is not None and int(pod_id) not in range(1, 254):
+ aci.fail_json(msg="Pod ID: {0} is invalid; it must be in the range of 1 to 254.".format(pod_id))
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fabricSetupP",
+ aci_rn="controller/setuppol/setupp-{0}".format(pod_id),
+ module_object=pod_id,
+ target_filter={"podId": pod_id},
+ ),
+ subclass_1=dict(
+ aci_class="fabricExtRoutablePodSubnet",
+ aci_rn="extrtpodsubnet-[{0}]".format(external_tep_pool),
+ module_object=external_tep_pool,
+ target_filter={"pool": external_tep_pool},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="fabricExtRoutablePodSubnet",
+ class_config=dict(
+ descr=descr,
+ nameAlias=name_alias,
+ pool=external_tep_pool,
+ reserveAddressCount=reserve_address_count,
+ state=status,
+ ),
+ )
+
+ aci.get_diff(aci_class="fabricExtRoutablePodSubnet")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_profile.py
new file mode 100644
index 000000000..e77114848
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_profile.py
@@ -0,0 +1,267 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_pod_profile
+short_description: Manage Fabric Pod Profile (fabric:PodP)
+description:
+- Manage Fabric Pod Profile on Cisco ACI fabrics.
+options:
+ name:
+ description:
+ - The name of the Pod Profile.
+ type: str
+ aliases: [ profile, pod_profile ]
+ description:
+ description:
+ - The description for the Fabric Pod Profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fabric:PodP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Add a new pod profile
+ cisco.aci.aci_fabric_pod_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: ans_pod_profile
+ state: present
+ delegate_to: localhost
+
+- name: Query a pod profile
+ cisco.aci.aci_fabric_pod_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: ans_pod_profile
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all pod profiles
+ cisco.aci.aci_fabric_pod_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove a pod profile
+ cisco.aci.aci_fabric_pod_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ name: ans_pod_profile
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+)
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ name=dict(type="str", aliases=["profile", "pod_profile"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["name"]],
+ ["state", "present", ["name"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ name_alias = module.params.get("name_alias")
+ name = module.params.get("name")
+ description = module.params.get("description")
+ state = module.params.get("state")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fabricPodP",
+ aci_rn="fabric/podprof-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ child_classes=["fabricPodS"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="fabricPodP",
+ class_config=dict(
+ name=name,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="fabricPodP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_remote_pool.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_remote_pool.py
new file mode 100644
index 000000000..189a0273d
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_remote_pool.py
@@ -0,0 +1,294 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_fabric_pod_remote_pool
+short_description: Manage Fabric Pod Remote Pool (fabric:ExtSetupP)
+description:
+- Manage Remote Pools on Fabric Pod Subnets.
+options:
+ pod_id:
+ description:
+ - The Pod ID for the Remote Pool.
+ type: int
+ aliases: [ pod ]
+ description:
+ description:
+ - The description for the Remote Pool.
+ type: str
+ aliases: [desc]
+ remote_id:
+ description:
+ - The Identifier for the Remote Pool.
+ type: int
+ aliases: [ id ]
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+ remote_pool:
+ description:
+ - The subnet IP address pool for the Remote Pool.
+ - Must be valid IPv4 and include the subnet mask.
+ - Example 192.168.1.0/24
+ type: str
+ aliases: [ pool ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(Fabric Pod Setup Policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_fabric_pod) module can be used for this.
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fabric:ExtSetupP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Samita Bhattacharjee (@samitab)
+"""
+
+EXAMPLES = r"""
+- name: Add a Remote Pool to a fabric pod setup policy
+ cisco.aci.aci_fabric_pod_remote_pool:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 2
+ remote_id: 1
+ remote_pool: 10.6.2.0/24
+ state: present
+ delegate_to: localhost
+
+- name: Query the Remote Pool on a fabric pod setup policy
+ cisco.aci.aci_fabric_pod_remote_pool:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 2
+ remote_id: 1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query Remote Pools on all fabric pod setup policies
+ cisco.aci.aci_fabric_pod_remote_pool:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a Remote Pool from a fabric pod setup policy
+ cisco.aci.aci_fabric_pod_external_tep:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ pod_id: 2
+ remote_id: 1
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ pod_id=dict(type="int", aliases=["pod"]),
+ description=dict(type="str", aliases=["desc"]),
+ remote_id=dict(type="int", aliases=["id"]),
+ name_alias=dict(type="str"),
+ remote_pool=dict(type="str", aliases=["pool"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["pod_id", "remote_id"]],
+ ["state", "present", ["pod_id", "remote_id"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ pod_id = module.params.get("pod_id")
+ description = module.params.get("description")
+ remote_id = module.params.get("remote_id")
+ name_alias = module.params.get("name_alias")
+ remote_pool = module.params.get("remote_pool")
+ state = module.params.get("state")
+
+ if pod_id is not None and int(pod_id) not in range(1, 254):
+ aci.fail_json(msg="Pod ID: {0} is invalid; it must be in the range of 1 to 254.".format(pod_id))
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fabricSetupP",
+ aci_rn="controller/setuppol/setupp-{0}".format(pod_id),
+ module_object=pod_id,
+ target_filter={"podId": pod_id},
+ ),
+ subclass_1=dict(
+ aci_class="fabricExtSetupP",
+ aci_rn="extsetupp-{0}".format(remote_id),
+ module_object=remote_id,
+ target_filter={"extPoolId": remote_id},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="fabricExtSetupP",
+ class_config=dict(
+ descr=description,
+ extPoolId=remote_id,
+ nameAlias=name_alias,
+ tepPool=remote_pool,
+ ),
+ )
+
+ aci.get_diff(aci_class="fabricExtSetupP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_selector.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_selector.py
index 6c95f32df..28d95eae0 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_selector.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_pod_selector.py
@@ -67,6 +67,7 @@ extends_documentation_fragment:
notes:
- The C(pod_profile) must exist before using this module in your playbook.
+- The M(cisco.aci.aci_fabric_pod_profile) module can be used to create the C(pod_profile).
seealso:
- name: APIC Management Information Model reference
description: More information about the internal APIC class B(fabric:PodS).
@@ -76,9 +77,6 @@ author:
- Akini Ross (@akinross)
"""
-# TODO add to notes section when cisco.aci.aci_pod_profile is implemented:
-# The M(cisco.aci.aci_pod_profile) module can be used for this.
-
EXAMPLES = r"""
- name: Add a new pod selector with type all
cisco.aci.aci_fabric_pod_selector:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_profile.py
index 364b613ff..af80ee415 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_profile.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_fabric_spine_profile
-short_description: Manage fabric spine profiles (fabric:SpineP).
+short_description: Manage fabric spine profiles (fabric:SpineP)
description:
- Manage fabric spine switch profiles in an ACI fabric.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_switch_assoc.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_switch_assoc.py
index ce0a00ce8..5884cd1e1 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_switch_assoc.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_spine_switch_assoc.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_fabric_spine_switch_assoc
-short_description: Manage spine switch bindings to profiles and policy groups (fabric:SpineS and fabric:RsSpNodePGrp).
+short_description: Manage spine switch bindings to profiles and policy groups (fabric:SpineS and fabric:RsSpNodePGrp)
description:
- Manage fabric spine switch associations (fabric:SpineS) to an existing fabric
spine profile (fabric:SpineP) in an ACI fabric, and bind them to a
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_block.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_block.py
index 57bd59874..ded3b56ec 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_block.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_block.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_fabric_switch_block
-short_description: Manage switch blocks (fabric:NodeBlk).
+short_description: Manage switch blocks (fabric:NodeBlk)
description:
- Manage fabric node blocks within switch associations (fabric:SpineS and
fabric:LeafS) contained within fabric switch profiles (fabric:SpineP and fabric:LeafP)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_policy_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_policy_group.py
index 1d766a34e..a3ba0a033 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_policy_group.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_switch_policy_group.py
@@ -13,72 +13,72 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_fabric_switch_policy_group
-short_description: Manage Fabric Switch Policy Group objects.
+short_description: Manage Fabric Switch Policy Group objects (fabric:LeNodePGrp and fabric:SpNodePGrp)
description:
-- Manage Fabric Switch Policy Group (fabricLeNodePGrp and fabricSpNodePGrp) configuration on Cisco ACI fabrics.
+- Manage Fabric Switch Policy Group configuration on Cisco ACI fabrics.
options:
name:
description:
- - The name of the Leaf Policy Group.
+ - The name of the Fabric Switch Policy Group.
type: str
aliases: [ 'policy_group', 'policy_group_name' ]
description:
description:
- - Description for the Leaf Policy Group.
+ - Description for the Fabric Switch Policy Group.
type: str
switch_type:
description:
- - Whether this is a leaf or spine policy group
+ - Whether this is a leaf or spine Fabric Switch Policy Group.
type: str
choices: [ leaf, spine ]
required: true
monitoring_policy:
description:
- - Monitoring Policy to attach to this Policy Group
+ - Monitoring Policy to attach to this Fabric Switch Policy Group.
type: str
aliases: [ 'monitoring', 'fabricRsMonInstFabricPol' ]
tech_support_export_policy:
description:
- - Tech Support Export Policy to attach to this Policy Group
+ - Tech Support Export Policy to attach to this Fabric Switch Policy Group.
type: str
aliases: [ 'tech_support', 'tech_support_export', 'fabricRsNodeTechSupP']
core_export_policy:
description:
- - Core Export Policy to attach to this Policy Group
+ - Core Export Policy to attach to this Fabric Switch Policy Group.
type: str
aliases: [ 'core', 'core_export', 'fabricRsNodeCoreP' ]
inventory_policy:
description:
- - Inventory Policy to attach to this Policy Group
+ - Inventory Policy to attach to this Fabric Switch Policy Group.
type: str
aliases: [ 'inventory', 'fabricRsCallhomeInvPol' ]
power_redundancy_policy:
description:
- - Power Redundancy Policy to atttach to this Policy Group
+ - Power Redundancy Policy to atttach to this Fabric Switch Policy Group.
type: str
aliases: [ 'power_redundancy', 'fabricRsPsuInstPol' ]
twamp_server_policy:
description:
- - TWAMP Server Policy to attach to this Policy Group
+ - TWAMP Server Policy to attach to this Fabric Switch Policy Group.
type: str
aliases: [ 'twamp_server', 'fabricRsTwampServerPol' ]
twamp_responder_policy:
description:
- - TWAMP Responder Policy to attach to this Policy Group
+ - TWAMP Responder Policy to attach to this Fabric Switch Policy Group.
type: str
aliases: [ 'twamp_responder', 'fabricRsTwampResponderPol' ]
node_control_policy:
description:
- - Node Control Policy to attach to this Policy Group
+ - Node Control Policy to attach to this Fabric Switch Policy Group.
type: str
aliases: [ 'node_control', 'fabricRsNodeCtrl' ]
analytics_cluster:
description:
- - Name of the analytics cluster. Requires analytics_name to be present
+ - Name of the analytics cluster. Requires analytics_name to be present.
type: str
analytics_name:
description:
- - Name of the analytics policy. Requires analytics_cluster to be present
+ - Name of the analytics policy. Requires analytics_cluster to be present.
type: str
state:
description:
@@ -93,7 +93,7 @@ extends_documentation_fragment:
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(fabricLeNodePGrp and fabricSpNodePGrp).
+ description: More information about the internal APIC classes B(fabric:LeNodePGrp) and B(fabric:SpNodePGrp).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_wide_settings.py b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_wide_settings.py
index 1bc7c28eb..2f8a879a9 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_fabric_wide_settings.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_fabric_wide_settings.py
@@ -235,7 +235,7 @@ url:
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
-from ansible_collections.cisco.aci.plugins.module_utils.constants import TLS_MAPPING
+from ansible_collections.cisco.aci.plugins.module_utils.constants import OPFLEX_TLS_MAPPING
def main():
@@ -251,7 +251,7 @@ def main():
leaf_opflex_client_auth=dict(type="bool"),
spine_ssl_opflex=dict(type="bool"),
leaf_ssl_opflex=dict(type="bool"),
- opflex_ssl_versions=dict(type="list", choices=list(TLS_MAPPING.keys()), elements="str"),
+ opflex_ssl_versions=dict(type="list", choices=list(OPFLEX_TLS_MAPPING.keys()), elements="str"),
reallocate_gipo=dict(type="bool"),
restrict_infra_vlan_traffic=dict(type="bool"),
state=dict(type="str", default="present", choices=["present", "query"]),
@@ -300,7 +300,7 @@ def main():
restrictInfraVLANTraffic=restrict_infra_vlan_traffic,
)
if opflex_ssl_versions is not None:
- class_config["opflexpSslProtocols"] = ",".join([TLS_MAPPING.get(tls) for tls in sorted(opflex_ssl_versions)])
+ class_config["opflexpSslProtocols"] = ",".join([OPFLEX_TLS_MAPPING.get(tls) for tls in sorted(opflex_ssl_versions)])
aci.payload(
aci_class="infraSetPol",
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_igmp_interface_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_igmp_interface_policy.py
index 7f537871a..78369df89 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_igmp_interface_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_igmp_interface_policy.py
@@ -294,8 +294,8 @@ def main():
argument_spec=argument_spec,
supports_check_mode=True,
required_if=[
- ["state", "present", ["name"]],
- ["state", "absent", ["name"]],
+ ["state", "present", ["name", "tenant"]],
+ ["state", "absent", ["name", "tenant"]],
],
required_together=[
["allow_v3_asm", "fast_leave", "report_link_local_groups"],
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_blacklist.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_blacklist.py
index 61d5ef44d..aeba32988 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_interface_blacklist.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_blacklist.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_interface_blacklist
-short_description: Enabling or Disabling physical interfaces.
+short_description: Enabling or Disabling physical interfaces (fabric:RsOosPath)
description:
- Enables or Disables physical interfaces on Cisco ACI fabrics.
options:
@@ -49,6 +49,10 @@ extends_documentation_fragment:
- cisco.aci.aci
- cisco.aci.annotation
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(fabric:RsOosPath).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Akini Ross (@akinross)
"""
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_description.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_description.py
index c4a204c89..387acd54a 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_interface_description.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_description.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_interface_description
-short_description: Setting and removing description on physical interfaces.
+short_description: Setting and removing description on physical interfaces (infra:HPathS, infra:RsHPathAtt, infra:SHPathS, and infra:RsSHPathAtt)
description:
- Setting and removing description on physical interfaces on Cisco ACI fabrics.
options:
@@ -59,6 +59,10 @@ extends_documentation_fragment:
- cisco.aci.annotation
- cisco.aci.owner
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes B(infra:HPathS), B(infra:RsHPathAtt), B(infra:SHPathS), and B(infra:RsSHPathAtt).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Akini Ross (@akinross)
"""
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd.py
new file mode 100644
index 000000000..ec651f360
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd.py
@@ -0,0 +1,318 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Anvitha Jain (@anvjain) <anvjain@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_interface_policy_bfd
+short_description: Manage BFD Interface policies (bfd:IfPol)
+description:
+- Manage BFD Interface policy configuration on Cisco ACI fabrics
+- Only available in APIC version 5.2 or later
+options:
+ tenant:
+ description:
+ - Name of an existing tenant
+ type: str
+ name:
+ description:
+ - Name of the BFD Interface policy
+ type: str
+ aliases: [ bfd_interface_policy ]
+ description:
+ description:
+ - Description of the BFD Interface policy
+ type: str
+ admin_state:
+ description:
+ - Admin state of the BFD Interface policy
+ - APIC sets the default value to enabled
+ type: str
+ choices: [ enabled, disabled ]
+ detection_multiplier:
+ description:
+ - Detection multiplier of the BFD Interface policy
+ - APIC sets the default value to 3
+ - Allowed range is 1-50
+ type: int
+ min_transmit_interval:
+ description:
+ - Minimum transmit (Tx) interval of the BFD Interface policy
+ - APIC sets the default value to 50
+ - Allowed range is 250-999
+ type: int
+ min_receive_interval:
+ description:
+ - Minimum receive (Rx) interval of the BFD Interface policy
+ - APIC sets the default value to 50
+ - Allowed range is 250-999
+ type: int
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing
+ - Use C(query) for listing an object or multiple objects
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant) must exist before using this module in your playbook
+ The M(cisco.aci.aci_tenant) modules can be used for this
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bfd:IfPol)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+- module: cisco.aci.aci_tenant
+author:
+- Anvitha Jain (@anvjain)
+"""
+
+EXAMPLES = r"""
+- name: Add a new BFD Interface policy
+ cisco.aci.aci_interface_policy_bfd:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ description: Ansible BFD Interface Policy
+ state: present
+ delegate_to: localhost
+
+- name: Remove a BFD Interface policy
+ cisco.aci.aci_interface_policy_bfd:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ state: absent
+ delegate_to: localhost
+
+- name: Query a BFD Interface policy
+ cisco.aci.aci_interface_policy_bfd:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all BFD Interface policies in a specific tenant
+ cisco.aci.aci_interface_policy_bfd:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ state: query
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+ current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+ raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class "/></imdata>'
+ sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+ previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+ filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+ method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+ response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+ status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+ url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+ """
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ name=dict(type="str", aliases=["bfd_interface_policy"]),
+ description=dict(type="str"),
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ detection_multiplier=dict(type="int"),
+ min_transmit_interval=dict(type="int"),
+ min_receive_interval=dict(type="int"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ tenant=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["name", "tenant"]],
+ ["state", "present", ["name", "tenant"]],
+ ],
+ )
+
+ name = module.params.get("name")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ admin_state = module.params.get("admin_state")
+ detection_multiplier = module.params.get("detection_multiplier")
+ min_transmit_interval = module.params.get("min_transmit_interval")
+ min_receive_interval = module.params.get("min_receive_interval")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="bfdIfPol",
+ aci_rn="bfdIfPol-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(
+ name=name,
+ descr=description,
+ adminSt=admin_state,
+ )
+
+ if detection_multiplier and detection_multiplier not in range(1, 50):
+ module.fail_json(msg='The "detection_multiplier" must be a value between 1 and 50')
+ else:
+ class_config["detectMult"] = detection_multiplier
+ if min_transmit_interval and min_transmit_interval not in range(50, 999):
+ module.fail_json(msg='The "min_transmit_interval" must be a value between 50 and 999')
+ else:
+ class_config["minTxIntvl"] = min_transmit_interval
+ if min_receive_interval and min_receive_interval not in range(50, 999):
+ module.fail_json(msg='The "min_receive_interval" must be a value between 50 and 999')
+ else:
+ class_config["minRxIntvl"] = min_receive_interval
+
+ aci.payload(
+ aci_class="bfdIfPol",
+ class_config=class_config,
+ )
+
+ aci.get_diff(aci_class="bfdIfPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd_multihop.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd_multihop.py
new file mode 100644
index 000000000..31cc9321c
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_bfd_multihop.py
@@ -0,0 +1,318 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Anvitha Jain (@anvjain) <anvjain@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_interface_policy_bfd_multihop
+short_description: Manage BFD Multihop Interface policies (bfd:MhIfPol)
+description:
+- Manage BFD Multihop Interface policy configuration on Cisco ACI fabrics
+- Only available in APIC version 5.2 or later
+options:
+ tenant:
+ description:
+ - Name of an existing tenant
+ type: str
+ name:
+ description:
+ - Name of the BFD Multihop Interface policy
+ type: str
+ aliases: [ bfd_multihop_interface_policy ]
+ description:
+ description:
+ - Description of the BFD Multihop Interface policy
+ type: str
+ admin_state:
+ description:
+ - Admin state of the BFD Multihop Interface policy
+ - APIC sets the default value to enabled.
+ type: str
+ choices: [ enabled, disabled ]
+ detection_multiplier:
+ description:
+ - Detection multiplier of the BFD Multihop Interface policy
+ - APIC sets the default value to 3.
+ - Allowed range is 1-50.
+ type: int
+ min_transmit_interval:
+ description:
+ - Minimum transmit (Tx) interval of the BFD Multihop Interface policy
+ - APIC sets the default value to 250
+ - Allowed range is 250-999
+ type: int
+ min_receive_interval:
+ description:
+ - Minimum receive (Rx) interval of the BFD Multihop Interface policy
+ - APIC sets the default value to 250
+ - Allowed range is 250-999
+ type: int
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing
+ - Use C(query) for listing an object or multiple objects
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant) must exist before using this module in your playbook
+ The M(cisco.aci.aci_tenant) modules can be used for this
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bfd:MhIfPol)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+- module: cisco.aci.aci_tenant
+author:
+- Anvitha Jain (@anvjain)
+"""
+
+EXAMPLES = r"""
+- name: Add a new BFD Multihop Interface policy
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ description: Ansible BFD Multihop Interface Policy
+ state: present
+ delegate_to: localhost
+
+- name: Remove a BFD Multihop Interface policy
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ state: absent
+ delegate_to: localhost
+
+- name: Query a BFD Multihop Interface policy
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all BFD Multihop Interface policies in a specific tenant
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ state: query
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+ current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+ raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class "/></imdata>'
+ sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+ previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+ filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+ method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+ response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+ status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+ url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+ """
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ name=dict(type="str", aliases=["bfd_multihop_interface_policy"]),
+ description=dict(type="str"),
+ admin_state=dict(type="str", choices=["enabled", "disabled"]),
+ detection_multiplier=dict(type="int"),
+ min_transmit_interval=dict(type="int"),
+ min_receive_interval=dict(type="int"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ tenant=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["name", "tenant"]],
+ ["state", "present", ["name", "tenant"]],
+ ],
+ )
+
+ name = module.params.get("name")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ tenant = module.params.get("tenant")
+ admin_state = module.params.get("admin_state")
+ detection_multiplier = module.params.get("detection_multiplier")
+ min_transmit_interval = module.params.get("min_transmit_interval")
+ min_receive_interval = module.params.get("min_receive_interval")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="bfdMhIfPol",
+ aci_rn="bfdMhIfPol-{0}".format(name),
+ module_object=name,
+ target_filter={"name": name},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(
+ name=name,
+ descr=description,
+ adminSt=admin_state,
+ )
+
+ if detection_multiplier and detection_multiplier not in range(1, 50):
+ module.fail_json(msg='The "detection_multiplier" must be a value between 1 and 50')
+ else:
+ class_config["detectMult"] = detection_multiplier
+ if min_transmit_interval and min_transmit_interval not in range(250, 999):
+ module.fail_json(msg='The "min_transmit_interval" must be a value between 250 and 999')
+ else:
+ class_config["minTxIntvl"] = min_transmit_interval
+ if min_receive_interval and min_receive_interval not in range(250, 999):
+ module.fail_json(msg='The "min_receive_interval" must be a value between 250 and 999')
+ else:
+ class_config["minRxIntvl"] = min_receive_interval
+
+ aci.payload(
+ aci_class="bfdMhIfPol",
+ class_config=class_config,
+ )
+
+ aci.get_diff(aci_class="bfdMhIfPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_eigrp.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_eigrp.py
new file mode 100644
index 000000000..7e0e64d53
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_eigrp.py
@@ -0,0 +1,371 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2022, Lukas Holub (@lukasholub)
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_interface_policy_eigrp
+short_description: Manage EIGRP interface policies (eigrp:IfPol)
+description:
+- Manage EIGRP interface policies for Tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing Tenant.
+ type: str
+ aliases: [ tenant_name ]
+ eigrp:
+ description:
+ - The EIGRP interface policy name.
+ - Note that you cannot change this name after the object has been created.
+ type: str
+ aliases: [ eigrp_interface, name ]
+ bandwidth:
+ description:
+ - The EIGRP bandwidth in kbps, overrides the bandwidth configured on an interface.
+ - This is used to influence path selection.
+ - Accepted values range between C(0) and C(2560000000).
+ - The APIC defaults to C(0) when unset during creation.
+ type: int
+ control_state:
+ description:
+ - The interface policy control state.
+ - 'This is a list of one or more of the following controls:'
+ - C(bfd) -- Enable Bidirectional Forwarding Detection.
+ - C(nexthop_self) -- Nexthop Self.
+ - C(split_horizon) -- Split Horizon.
+ - C(passive) -- The interface does not participate in the EIGRP protocol and
+ will not establish adjacencies or send routing updates.
+ - The APIC defaults to C([split_horizon, nexthop_self]) when unset during creation.
+ type: list
+ elements: str
+ choices: [ bfd, nexthop_self, passive, split_horizon ]
+ delay:
+ description:
+ - The EIGRP throughput delay, overrides the delay configured on an interface.
+ - This is used to influence path selection.
+ - The APIC defaults to C(0) when unset during creation.
+ type: int
+ delay_unit:
+ description:
+ - The EIGRP delay units, Wide metrics can use picoseconds accuracy for delay.
+ - The APIC defaults to C(tens_of_microseconds) when unset during creation.
+ type: str
+ choices: [ picoseconds, tens_of_microseconds ]
+ hello_interval:
+ description:
+ - The time interval in seconds between hello packets that EIGRP sends on the interface.
+ - The smaller the hello interval, the faster topological changes will be detected, but more routing traffic will ensue.
+ - Accepted values range between C(1) and C(65535).
+ - The APIC defaults to C(5) when unset during creation.
+ type: int
+ hold_interval:
+ description:
+ - The time period of time in seconds before declaring that the neighbor is down.
+ - Accepted values range between C(1) and C(65535).
+ - The APIC defaults to C(15) when unset during creation.
+ type: int
+ description:
+ description:
+ - The description of the EIGRP interface policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) used must exist before using this module in your playbook.
+- The M(cisco.aci.aci_tenant) module can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(eigrp:IfPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+- Lukas Holub (@lukasholub)
+"""
+
+EXAMPLES = r"""
+- name: Create an EIGRP interface policy
+ cisco.aci.aci_interface_policy_eigrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ eigrp: eigrp1
+ bandwidth: 10000
+ control_state: [split-horizon, nh-self]
+ delay: 10
+ delay_unit: tens_of_micro
+ hello_interval: 5
+ hold_interval: 15
+ state: present
+ delegate_to: localhost
+
+- name: Delete EIGRRP interface policy
+ cisco.aci.aci_interface_policy_eigrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ eigrp: eigrp1
+ state: present
+ delegate_to: localhost
+
+- name: Query an EIGRRP interface policy
+ cisco.aci.aci_interface_policy_eigrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ eigrp: eigrp1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all EIGRP interface policies in tenant production
+ cisco.aci.aci_interface_policy_eigrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import (
+ MATCH_EIGRP_INTERFACE_POLICY_DELAY_UNIT_MAPPING,
+ MATCH_EIGRP_INTERFACE_POLICY_CONTROL_STATE_MAPPING,
+)
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ eigrp=dict(type="str", aliases=["eigrp_interface", "name"]), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ bandwidth=dict(type="int"),
+ control_state=dict(type="list", elements="str", choices=["bfd", "nexthop_self", "passive", "split_horizon"]),
+ delay=dict(type="int"),
+ delay_unit=dict(type="str", choices=["picoseconds", "tens_of_microseconds"]),
+ hello_interval=dict(type="int"),
+ hold_interval=dict(type="int"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["eigrp", "tenant"]],
+ ["state", "present", ["eigrp", "tenant"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ tenant = module.params.get("tenant")
+ eigrp = module.params.get("eigrp")
+ delay = module.params.get("delay")
+ delay_unit = MATCH_EIGRP_INTERFACE_POLICY_DELAY_UNIT_MAPPING.get(module.params.get("delay_unit"))
+ description = module.params.get("description")
+ name_alias = module.params.get("name_alias")
+ state = module.params.get("state")
+
+ bandwidth = module.params.get("bandwidth")
+ if bandwidth is not None and bandwidth not in range(2560000001):
+ module.fail_json(msg="Parameter 'bandwidth' is only valid in range between 0 and 2560000000.")
+
+ hello_interval = module.params.get("hello_interval")
+ if hello_interval is not None and hello_interval not in range(1, 65536):
+ module.fail_json(msg="Parameter 'hello_interval' is only valid in range between 1 and 65535.")
+
+ hold_interval = module.params.get("hold_interval")
+ if hold_interval is not None and hold_interval not in range(1, 65536):
+ module.fail_json(msg="Parameter 'hold_interval' is only valid in range between 1 and 65535.")
+
+ if module.params.get("control_state"):
+ control_state = ",".join([MATCH_EIGRP_INTERFACE_POLICY_CONTROL_STATE_MAPPING.get(v) for v in module.params.get("control_state")])
+ else:
+ control_state = None
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="eigrpIfPol",
+ aci_rn="eigrpIfPol-{0}".format(eigrp),
+ module_object=eigrp,
+ target_filter={"name": eigrp},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="eigrpIfPol",
+ class_config=dict(
+ name=eigrp,
+ descr=description,
+ bw=bandwidth,
+ ctrl=control_state,
+ delay=delay,
+ delayUnit=delay_unit,
+ helloIntvl=hello_interval,
+ holdIntvl=hold_interval,
+ nameAlias=name_alias,
+ ),
+ )
+
+ aci.get_diff(aci_class="eigrpIfPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_hsrp.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_hsrp.py
new file mode 100644
index 000000000..c94b5af42
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_hsrp.py
@@ -0,0 +1,310 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish (@shrsr) <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_interface_policy_hsrp
+short_description: Manage HSRP interface policies (hsrp:IfPol)
+description:
+- Manage HSRP interface policies on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of the Tenant the HSRP interface policy should belong to.
+ type: str
+ aliases: [ tenant_name ]
+ hsrp:
+ description:
+ - The HSRP interface policy name.
+ type: str
+ aliases: [ hsrp_interface, name ]
+ description:
+ description:
+ - The description of the HSRP interface.
+ type: str
+ aliases: [ descr ]
+ controls:
+ description:
+ - The interface policy controls.
+ type: list
+ elements: str
+ choices: [ bfd, bia ]
+ delay:
+ description:
+ - The administrative port delay of HSRP interface policy.
+ - This is only valid in range between 1 and 10000.
+ type: int
+ reload_delay:
+ description:
+ - The option for reload delay of HSRP interface policy.
+ - This is only valid in range between 1 and 10000.
+ type: int
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+seealso:
+- module: aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(hsrp:IfPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Add a HSRP interface policy
+ cisco.aci.aci_interface_policy_hsrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ hsrp: hsrp1
+ controls: bfd
+ delay: 50
+ reload_delay: 100
+ state: present
+ delegate_to: localhost
+
+- name: Delete a HSRP interface policy
+ cisco.aci.aci_interface_policy_hsrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ hsrp: hsrp1
+ state: absent
+ delegate_to: localhost
+
+- name: Query a HSRP interface policy
+ cisco.aci.aci_interface_policy_hsrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ hsrp: hsrp1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all HSRP interface policies in tenant production
+ cisco.aci.aci_interface_policy_hsrp:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ hsrp=dict(type="str", aliases=["hsrp_interface", "name"]), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ controls=dict(type="list", elements="str", choices=["bfd", "bia"]),
+ reload_delay=dict(type="int"),
+ delay=dict(type="int"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "hsrp"]],
+ ["state", "present", ["tenant", "hsrp"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ tenant = module.params.get("tenant")
+ hsrp = module.params.get("hsrp")
+ description = module.params.get("description")
+ controls = ",".join(module.params.get("controls")) if module.params.get("controls") else None
+
+ reload_delay = module.params.get("reload_delay")
+ if reload_delay is not None and reload_delay not in range(1, 10000):
+ module.fail_json(msg="Parameter 'reload_delay' is only valid in range between 1 and 10000.")
+
+ delay = module.params.get("delay")
+ if delay is not None and delay not in range(1, 10000):
+ module.fail_json(msg="Parameter 'delay' is only valid in range between 1 and 10000.")
+
+ state = module.params.get("state")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="hsrpIfPol",
+ aci_rn="hsrpIfPol-{0}".format(hsrp),
+ module_object=hsrp,
+ target_filter={"name": hsrp},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="hsrpIfPol",
+ class_config=dict(
+ name=hsrp,
+ descr=description,
+ ctrl=controls,
+ reloadDelay=reload_delay,
+ delay=delay,
+ ),
+ )
+
+ aci.get_diff(aci_class="hsrpIfPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_fc_policy_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_fc_policy_group.py
index 6c3436459..b77eb16fe 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_fc_policy_group.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_fc_policy_group.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_interface_policy_leaf_fc_policy_group
-short_description: Manage Fibre Channel (FC) interface policy groups (infra:FcAccBndlGrp, infra:FcAccPortGrp)
+short_description: Manage Fibre Channel (FC) interface policy groups (infra:FcAccBndlGrp and infra:FcAccPortGrp)
description:
- Manage Fibre Channel (FC) interface policy groups on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_policy_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_policy_group.py
index da2e90adf..d106df250 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_policy_group.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_leaf_policy_group.py
@@ -14,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_interface_policy_leaf_policy_group
-short_description: Manage fabric interface policy leaf policy groups (infra:AccBndlGrp, infra:AccPortGrp)
+short_description: Manage fabric interface policy leaf policy groups (infra:AccBndlGrp and infra:AccPortGrp)
description:
- Manage fabric interface policy leaf policy groups on Cisco ACI fabrics.
options:
@@ -624,34 +624,6 @@ def main():
),
),
),
- dict(
- infraRsLinkFlapPol=dict(
- attributes=dict(
- tnFabricLinkFlapPolName=link_flap_policy,
- ),
- ),
- ),
- dict(
- infraRsQosLlfcIfPol=dict(
- attributes=dict(
- tnQosLlfcIfPolName=link_level_flow_control,
- ),
- ),
- ),
- dict(
- infraRsMacsecIfPol=dict(
- attributes=dict(
- tnMacsecIfPolName=mac_sec_interface_policy,
- ),
- ),
- ),
- dict(
- infraRsCoppIfPol=dict(
- attributes=dict(
- tnCoppIfPolName=copp_policy,
- ),
- ),
- ),
]
child_classes = [
@@ -671,10 +643,6 @@ def main():
"infraRsQosSdIfPol",
"infraRsStormctrlIfPol",
"infraRsStpIfPol",
- "infraRsLinkFlapPol",
- "infraRsQosLlfcIfPol",
- "infraRsMacsecIfPol",
- "infraRsCoppIfPol",
]
# Add infraRsattEntP binding only when aep is defined
@@ -728,6 +696,7 @@ def main():
)
)
child_classes.append("infraRsOpticsIfPol")
+
if dwdm is not None:
child_configs.append(
dict(
@@ -739,6 +708,7 @@ def main():
)
)
child_classes.append("infraRsDwdmIfPol")
+
if port_authentication is not None:
child_configs.append(
dict(
@@ -750,6 +720,7 @@ def main():
)
)
child_classes.append("infraRsL2PortAuthPol")
+
if poe_interface_policy is not None:
child_configs.append(
dict(
@@ -762,6 +733,54 @@ def main():
)
child_classes.append("infraRsPoeIfPol")
+ if link_flap_policy is not None:
+ child_configs.append(
+ dict(
+ infraRsLinkFlapPol=dict(
+ attributes=dict(
+ tnFabricLinkFlapPolName=link_flap_policy,
+ ),
+ ),
+ ),
+ )
+ child_classes.append("infraRsLinkFlapPol")
+
+ if link_level_flow_control is not None:
+ child_configs.append(
+ dict(
+ infraRsQosLlfcIfPol=dict(
+ attributes=dict(
+ tnQosLlfcIfPolName=link_level_flow_control,
+ ),
+ ),
+ ),
+ )
+ child_classes.append("infraRsQosLlfcIfPol")
+
+ if mac_sec_interface_policy is not None:
+ child_configs.append(
+ dict(
+ infraRsMacsecIfPol=dict(
+ attributes=dict(
+ tnMacsecIfPolName=mac_sec_interface_policy,
+ ),
+ ),
+ ),
+ )
+ child_classes.append("infraRsMacsecIfPol")
+
+ if copp_policy is not None:
+ child_configs.append(
+ dict(
+ infraRsCoppIfPol=dict(
+ attributes=dict(
+ tnCoppIfPolName=copp_policy,
+ ),
+ ),
+ ),
+ )
+ child_classes.append("infraRsCoppIfPol")
+
aci.construct_url(
root_class=dict(
aci_class=aci_class_name,
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_link_level.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_link_level.py
index 5c0120d4d..1980721cc 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_link_level.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_link_level.py
@@ -36,9 +36,10 @@ options:
speed:
description:
- Determines the interface policy administrative port speed.
+ - The C(auto) option is only supported in APIC version 5.2 or later.
- The APIC defaults to C(inherit) when unset during creation.
type: str
- choices: [ 100M, 1G, 10G, 25G, 40G, 50G, 100G, 200G, 400G, inherit ]
+ choices: [ 100M, 1G, 10G, 25G, 40G, 50G, 100G, 200G, 400G, auto, inherit ]
default: inherit
link_debounce_interval:
description:
@@ -231,7 +232,7 @@ def main():
link_level_policy=dict(type="str", aliases=["name"]),
description=dict(type="str", aliases=["descr"]),
auto_negotiation=dict(type="bool", default="true"),
- speed=dict(type="str", default="inherit", choices=["100M", "1G", "10G", "25G", "40G", "50G", "100G", "200G", "400G", "inherit"]),
+ speed=dict(type="str", default="inherit", choices=["100M", "1G", "10G", "25G", "40G", "50G", "100G", "200G", "400G", "auto", "inherit"]),
link_debounce_interval=dict(type="int", default="100"),
forwarding_error_correction=dict(
type="str", default="inherit", choices=["inherit", "kp-fec", "cl91-rs-fec", "cl74-fc-fec", "disable-fec", "ieee-rs-fec", "cons16-rs-fec"]
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_pim.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_pim.py
new file mode 100644
index 000000000..ad47fb836
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_pim.py
@@ -0,0 +1,444 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_interface_policy_pim
+short_description: Manage Protocol-Independent Multicast (PIM) interface policies (pim:IfPol)
+description:
+- Manage Protocol Independent Multicast interface policies for Tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing Tenant.
+ type: str
+ aliases: [ tenant_name ]
+ pim:
+ description:
+ - The PIM interface policy name.
+ - The name cannot be changed after the object has been created.
+ type: str
+ aliases: [ pim_interface_policy, name ]
+ authentication_key:
+ description:
+ - The authentication key.
+ type: str
+ aliases: [ auth_key ]
+ authentication_type:
+ description:
+ - The authentication type.
+ type: str
+ choices: [ none, md5_hmac ]
+ aliases: [ auth_type ]
+ control_state:
+ description:
+ - The PIM interface policy control state.
+ - 'This is a list of one or more of the following controls:'
+ - C(multicast_domain_boundary) -- Boundary of Multicast domain.
+ - C(strict_rfc_compliant) -- Only listen to PIM protocol packets.
+ - C(passive) -- Do not send/receive PIM protocol packets.
+ type: list
+ elements: str
+ choices: [ multicast_domain_boundary, strict_rfc_compliant, passive ]
+ designated_router_delay:
+ description:
+ - The PIM designated router delay.
+ - Accepted values range between C(1) and C(65535).
+ - The APIC defaults to C(3) when unset during creation.
+ type: int
+ aliases: [ delay ]
+ designated_router_priority:
+ description:
+ - The PIM designated router priority.
+ - Accepted values range between C(1) and C(4294967295).
+ - The APIC defaults to C(1) when unset during creation.
+ type: int
+ aliases: [ prio ]
+ hello_interval:
+ description:
+ - The time interval in seconds between hello packets that PIM sends on the interface.
+ - The smaller the hello interval, the faster topological changes will be detected, but more routing traffic will ensue.
+ - Accepted values range between C(1) and C(18724286).
+ - The APIC defaults to C(30000) when unset during creation.
+ type: int
+ join_prune_interval:
+ description:
+ - The join prune interval in seconds.
+ - Accepted values range between C(60) and C(65520).
+ - The APIC defaults to C(60) when unset during creation.
+ type: int
+ aliases: [ jp_interval ]
+ inbound_join_prune_filter_policy:
+ description:
+ - The interface-level inbound join/prune filter policy.
+ - The M(cisco.aci.aci_pim_route_map_policy) can be used for this.
+ - To delete it, pass an empty string.
+ type: str
+ aliases: [ inbound_filter ]
+ outbound_join_prune_filter_policy:
+ description:
+ - The interface-level outbound join/prune filter policy.
+ - The M(cisco.aci.aci_pim_route_map_policy) can be used for this.
+ - To delete it, pass an empty string.
+ type: str
+ aliases: [ outbound_filter ]
+ neighbor_filter_policy:
+ description:
+ - The Interface-level neighbor filter policy.
+ - The M(cisco.aci.aci_pim_route_map_policy) can be used for this.
+ - To delete it, pass an empty string.
+ type: str
+ aliases: [ neighbor_filter ]
+ description:
+ description:
+ - The description of the PIM interface policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) used must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) module can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_pim_route_map_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(pim:IfPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Create a PIM interface policy
+ cisco.aci.aci_interface_policy_pim:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ pim: my_pim_policy
+ control_state: [multicast_domain_boundary, strict_rfc_compliant]
+ designated_router_delay: 10
+ designated_router_priority: tens_of_micro
+ hello_interval: 5
+ join_prune_interval: 15
+ inbound_join_prune_filter_policy: my_pim_route_map_policy_1
+ outbound_join_prune_filter_policy: my_pim_route_map_policy_2
+ neighbor_filter_policy: my_pim_route_map_policy_3
+ state: present
+ delegate_to: localhost
+
+- name: Query a PIM interface policy
+ cisco.aci.aci_interface_policy_pim:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ pim: my_pim_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all PIM interface policies in tenant production
+ cisco.aci.aci_interface_policy_pim:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a PIM interface policy
+ cisco.aci.aci_interface_policy_pim:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ pim: my_pim_policy
+ state: present
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import (
+ MATCH_PIM_INTERFACE_POLICY_CONTROL_STATE_MAPPING,
+ MATCH_PIM_INTERFACE_POLICY_AUTHENTICATION_TYPE_MAPPING,
+)
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ pim=dict(type="str", aliases=["pim_interface_policy", "name"]), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ authentication_key=dict(type="str", aliases=["auth_key"], no_log=True),
+ authentication_type=dict(type="str", choices=["none", "md5_hmac"], aliases=["auth_type"]),
+ control_state=dict(type="list", elements="str", choices=["multicast_domain_boundary", "strict_rfc_compliant", "passive"]),
+ designated_router_delay=dict(type="int", aliases=["delay"]),
+ designated_router_priority=dict(type="int", aliases=["prio"]),
+ hello_interval=dict(type="int"),
+ join_prune_interval=dict(type="int", aliases=["jp_interval"]),
+ inbound_join_prune_filter_policy=dict(type="str", aliases=["inbound_filter"]),
+ outbound_join_prune_filter_policy=dict(type="str", aliases=["outbound_filter"]),
+ neighbor_filter_policy=dict(type="str", aliases=["neighbor_filter"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["pim", "tenant"]],
+ ["state", "present", ["pim", "tenant"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ tenant = module.params.get("tenant")
+ pim = module.params.get("pim")
+ authentication_key = module.params.get("authentication_key")
+ authentication_type = MATCH_PIM_INTERFACE_POLICY_AUTHENTICATION_TYPE_MAPPING.get(module.params.get("authentication_type"))
+ description = module.params.get("description")
+ name_alias = module.params.get("name_alias")
+ state = module.params.get("state")
+
+ designated_router_delay = module.params.get("designated_router_delay")
+ if designated_router_delay is not None and designated_router_delay not in range(1, 65536):
+ module.fail_json(msg="Parameter 'designated_router_delay' is only valid in range between 1 and 65535.")
+
+ designated_router_priority = module.params.get("designated_router_priority")
+ if designated_router_priority is not None and designated_router_priority not in range(1, 4294967296):
+ module.fail_json(msg="Parameter 'designated_router_priority' is only valid in range between 1 and 4294967295.")
+
+ hello_interval = module.params.get("hello_interval")
+ if hello_interval is not None and hello_interval not in range(1, 18724287):
+ module.fail_json(msg="Parameter 'hello_interval' is only valid in range between 1 and 18724286.")
+
+ join_prune_interval = module.params.get("join_prune_interval")
+ if join_prune_interval is not None and join_prune_interval not in range(60, 65521):
+ module.fail_json(msg="Parameter 'join_prune_interval' is only valid in range between 60 and 65520.")
+
+ if module.params.get("control_state"):
+ control_state = ",".join([MATCH_PIM_INTERFACE_POLICY_CONTROL_STATE_MAPPING.get(v) for v in module.params.get("control_state")])
+ else:
+ control_state = None
+
+ child_classes = dict(
+ pimJPInbFilterPol=module.params.get("inbound_join_prune_filter_policy"),
+ pimJPOutbFilterPol=module.params.get("outbound_join_prune_filter_policy"),
+ pimNbrFilterPol=module.params.get("neighbor_filter_policy"),
+ )
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="pimIfPol",
+ aci_rn="pimifpol-{0}".format(pim),
+ module_object=pim,
+ target_filter={"name": pim},
+ ),
+ child_classes=list(child_classes.keys()),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ for class_name, class_input in child_classes.items():
+ if class_input is not None:
+ if class_input == "" and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("pimIfPol", {}).get("children", {}):
+ if child.get(class_name):
+ child_configs.append(dict([(class_name, dict(attributes=dict(status="deleted")))]))
+ elif class_input != "":
+ child_configs.append(
+ dict(
+ [
+ (
+ class_name,
+ dict(
+ attributes=dict(),
+ children=[
+ dict(
+ rtdmcRsFilterToRtMapPol=dict(
+ attributes=dict(
+ tDn="uni/tn-{0}/rtmap-{1}".format(tenant, class_input),
+ ),
+ )
+ )
+ ],
+ ),
+ )
+ ]
+ )
+ )
+
+ aci.payload(
+ aci_class="pimIfPol",
+ class_config=dict(
+ name=pim,
+ descr=description,
+ authKey=authentication_key,
+ authT=authentication_type,
+ ctrl=control_state,
+ drDelay=designated_router_delay,
+ drPrio=designated_router_priority,
+ helloItvl=hello_interval,
+ jpInterval=join_prune_interval,
+ nameAlias=name_alias,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="pimIfPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_storm_control.py b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_storm_control.py
new file mode 100644
index 000000000..19b67070d
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_interface_policy_storm_control.py
@@ -0,0 +1,434 @@
+#!/usr/bin/python
+
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_interface_policy_storm_control
+short_description: Manage Storm Control interface policies (stormctrl:IfPol)
+description:
+- Manage Storm Control interface policies on Cisco ACI fabrics.
+options:
+ storm_control_policy:
+ description:
+ - The Storm Control interface policy name.
+ type: str
+ aliases: [ storm_control, storm_control_name, name ]
+ description:
+ description:
+ - The description for the Storm interface policy name.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+ storm_control_action:
+ description:
+ - The storm control action to take when triggered.
+ type: str
+ choices: [drop, shutdown]
+ storm_control_soak_action:
+ description:
+ - The number of instances before triggering shutdown.
+ type: int
+ all_types_configuration:
+ description:
+ - The rates configuration for all packets type.
+ type: dict
+ aliases: [ all_types ]
+ suboptions:
+ rate:
+ description:
+ - The rate for all packet types.
+ type: str
+ burst_rate:
+ description:
+ - The burst rate of all packet types.
+ type: str
+ rate_type:
+ description:
+ - The type of rate of all packet types.
+ - Choice between percentage of the bandiwth C(percentage) or packet per second C(pps)
+ type: str
+ choices: [ percentage, pps ]
+ required: true
+ broadcast_configuration:
+ description:
+ - The rates configuration of broadcast packets.
+ type: dict
+ aliases: [ broadcast ]
+ suboptions:
+ rate:
+ description:
+ - The rate for broadcast packets.
+ type: str
+ burst_rate:
+ description:
+ - The burst rate of broadcast packets.
+ type: str
+ rate_type:
+ description:
+ - The type of rate of all packet types.
+ - Choice between percentage of the bandiwth C(percentage) or packet per second C(pps)
+ type: str
+ choices: [ percentage, pps ]
+ required: true
+ multicast_configuration:
+ description:
+ - The rates configuration of multicast packets.
+ type: dict
+ aliases: [ multicast ]
+ suboptions:
+ rate:
+ description:
+ - The rate for multicast packets.
+ type: str
+ burst_rate:
+ description:
+ - The burst rate of multicast packets.
+ type: str
+ rate_type:
+ description:
+ - The type of rate of all packet types.
+ - Choice between percentage of the bandiwth C(percentage) or packet per second C(pps)
+ type: str
+ choices: [ percentage, pps ]
+ required: true
+ unicast_configuration:
+ description:
+ - The rates configuration of unicast packets.
+ type: dict
+ aliases: [ unicast ]
+ suboptions:
+ rate:
+ description:
+ - The rate for unicast packets.
+ type: str
+ burst_rate:
+ description:
+ - The burst rate of unicast packets.
+ type: str
+ rate_type:
+ description:
+ - The type of rate of all packet types.
+ - Choice between percentage of the bandiwth C(percentage) or packet per second C(pps)
+ type: str
+ choices: [ percentage, pps ]
+ required: true
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(stormctrl:IfPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Eric Girard (@netgirard)
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Storm Control Interface Policy
+ cisco.aci.aci_interface_policy_storm_control:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ storm_control_policy: my_storm_control_policy
+ description: My Storm Control Policy
+ all_types_configuration:
+ rate: 80
+ burst_rate: 100
+ rate_type: percentage
+ storm_control_action: shutdown
+ storm_control_soak_action: 5
+ state: present
+ delegate_to: localhost
+
+- name: Query a Storm Control Interface Policy
+ cisco.aci.aci_interface_policy_storm_control:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ storm_control_policy: my_storm_control_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all Storm Control Interface Policies
+ cisco.aci.aci_interface_policy_storm_control:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a Storm Control Interface Policy
+ cisco.aci.aci_interface_policy_storm_control:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ storm_control_policy: my_storm_control_policy
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "cdpIfPol": {
+ "attributes": {
+ "adminSt": "disabled",
+ "annotation": "",
+ "descr": "Ansible Created CDP Test Policy",
+ "dn": "uni/infra/cdpIfP-Ansible_CDP_Test_Policy",
+ "name": "Ansible_CDP_Test_Policy",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+ storm_control_policy_rate_spec,
+)
+
+
+def get_rates_configuration(module, configuration, percentage, pps, burst_percentage, burst_pps):
+ if configuration is None:
+ return {}
+ rate = configuration.get("rate")
+ burst_rate = configuration.get("burst_rate")
+ rate_type = configuration.get("rate_type")
+
+ if rate_type == "percentage":
+ for rate_name, rate_value in dict(rate=rate, burst_rate=burst_rate).items():
+ if rate_value is None or not (0 <= float(rate_value) <= 100):
+ module.fail_json(
+ msg="If argument rate_type is percentage, the {0} needs to be a value between 0 and 100 inclusive, got {1}".format(
+ rate_name,
+ rate_value,
+ )
+ )
+ return {
+ percentage: "{0:.6f}".format(float(rate)),
+ pps: "unspecified",
+ burst_percentage: "{0:.6f}".format(float(burst_rate)),
+ burst_pps: "unspecified",
+ }
+ elif rate_type == "pps":
+ return {pps: rate, burst_pps: burst_rate}
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ storm_control_policy=dict(
+ type="str", required=False, aliases=["name", "storm_control", "storm_control_name"]
+ ), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ all_types_configuration=dict(type="dict", options=storm_control_policy_rate_spec(), aliases=["all_types"]),
+ broadcast_configuration=dict(type="dict", options=storm_control_policy_rate_spec(), aliases=["broadcast"]),
+ multicast_configuration=dict(type="dict", options=storm_control_policy_rate_spec(), aliases=["multicast"]),
+ unicast_configuration=dict(type="dict", options=storm_control_policy_rate_spec(), aliases=["unicast"]),
+ storm_control_action=dict(type="str", choices=["drop", "shutdown"]),
+ storm_control_soak_action=dict(type="int"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["storm_control_policy"]],
+ ["state", "present", ["storm_control_policy"]],
+ ],
+ mutually_exclusive=[
+ ("all_types_configuration", "broadcast_configuration"),
+ ("all_types_configuration", "multicast_configuration"),
+ ("all_types_configuration", "unicast_configuration"),
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ storm_control_policy = module.params.get("storm_control_policy")
+ description = module.params.get("description")
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+ storm_control_action = module.params.get("storm_control_action")
+ storm_control_soak_action = module.params.get("storm_control_soak_action")
+ all_types_configuration = module.params.get("all_types_configuration")
+ broadcast_configuration = module.params.get("broadcast_configuration")
+ multicast_configuration = module.params.get("multicast_configuration")
+ unicast_configuration = module.params.get("unicast_configuration")
+
+ rates_input = {}
+
+ if all_types_configuration is not None:
+ rates_input.update(get_rates_configuration(module, all_types_configuration, "rate", "ratePps", "burstRate", "burstPps"))
+ storm_control_types = "Invalid"
+ elif any([broadcast_configuration, multicast_configuration, unicast_configuration]):
+ rates_input.update(get_rates_configuration(module, broadcast_configuration, "bcRate", "bcRatePps", "bcBurstRate", "bcBurstPps"))
+ rates_input.update(get_rates_configuration(module, multicast_configuration, "mcRate", "mcRatePps", "mcBurstRate", "mcBurstPps"))
+ rates_input.update(get_rates_configuration(module, unicast_configuration, "uucRate", "uucRatePps", "uucBurstRate", "uucBurstPps"))
+ storm_control_types = "Valid"
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
+ ),
+ subclass_1=dict(
+ aci_class="stormctrlIfPol",
+ aci_rn="stormctrlifp-{0}".format(storm_control_policy),
+ module_object=storm_control_policy,
+ target_filter={"name": storm_control_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(
+ name=storm_control_policy,
+ descr=description,
+ nameAlias=name_alias,
+ isUcMcBcStormPktCfgValid=storm_control_types,
+ stormCtrlAction=storm_control_action,
+ stormCtrlSoakInstCount=storm_control_soak_action,
+ )
+ class_config.update(rates_input)
+ aci.payload(
+ aci_class="stormctrlIfPol",
+ class_config=class_config,
+ )
+
+ aci.get_diff(aci_class="stormctrlIfPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_key_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_key_policy.py
new file mode 100644
index 000000000..27ebe292a
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_key_policy.py
@@ -0,0 +1,325 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_key_policy
+short_description: Manage Key Policy (fv:KeyPol)
+description:
+- Manage Key Policies for KeyChain Policies on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ keychain_policy:
+ description:
+ - The name of an existing keychain policy.
+ type: str
+ aliases: [ keychain_policy_name ]
+ id:
+ description:
+ - The object identifier.
+ type: int
+ start_time:
+ description:
+ - The start time of the key policy.
+ - The APIC defaults to C(now) when unset during creation.
+ - The format is YYYY-MM-DD HH:MM:SS
+ type: str
+ end_time:
+ description:
+ - The end time of the key policy.
+ - The APIC defaults to C(infinite) when unset during creation.
+ - The format is YYYY-MM-DD HH:MM:SS
+ type: str
+ pre_shared_key:
+ description:
+ - The pre-shared authentifcation key.
+ - When using I(pre_shared_key) this module will always show as C(changed) as the module cannot know what the currently configured key is.
+ type: str
+ description:
+ description:
+ - The description for the keychain policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) and C(keychain_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_keychain_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_keychain_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new key policy
+ cisco.aci.aci_key_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ keychain_policy: my_keychain_policy
+ id: 1
+ start_time: now
+ end_time: infinite
+ pre_shared_key: my_password
+ state: present
+ delegate_to: localhost
+
+- name: Delete an key policy
+ cisco.aci.aci_key_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ keychain_policy: my_keychain_policy
+ id: 1
+ state: absent
+ delegate_to: localhost
+
+- name: Query an key policy
+ cisco.aci.aci_key_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ keychain_policy: my_keychain_policy
+ id: 1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all key policies in my_keychain_policy
+ cisco.aci.aci_key_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ keychain_policy: my_keychain_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ keychain_policy=dict(type="str", aliases=["keychain_policy_name"], no_log=False),
+ id=dict(type="int"),
+ start_time=dict(type="str"),
+ end_time=dict(type="str"),
+ pre_shared_key=dict(type="str", no_log=True),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "keychain_policy", "id"]],
+ ["state", "present", ["tenant", "keychain_policy", "id"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ keychain_policy = module.params.get("keychain_policy")
+ id = module.params.get("id")
+ start_time = module.params.get("start_time")
+ end_time = module.params.get("end_time")
+ pre_shared_key = module.params.get("pre_shared_key")
+ description = module.params.get("description")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="fvKeyChainPol",
+ aci_rn="keychainp-{0}".format(keychain_policy),
+ module_object=keychain_policy,
+ target_filter={"name": keychain_policy},
+ ),
+ subclass_2=dict(
+ aci_class="fvKeyPol",
+ aci_rn="keyp-{0}".format(id),
+ module_object=id,
+ target_filter={"id": id},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ class_config = dict(
+ id=id,
+ startTime=start_time,
+ endTime=end_time,
+ descr=description,
+ )
+ if pre_shared_key is not None:
+ class_config.update(preSharedKey=pre_shared_key)
+
+ aci.payload(
+ aci_class="fvKeyPol",
+ class_config=class_config,
+ )
+
+ aci.get_diff(aci_class="fvKeyPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_keychain_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_keychain_policy.py
new file mode 100644
index 000000000..a9776cf59
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_keychain_policy.py
@@ -0,0 +1,276 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_keychain_policy
+short_description: Manage KeyChain Policy (fv:KeyChainPol)
+description:
+- Manage KeyChain Policies for tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ keychain_policy:
+ description:
+ - The name of the keychain policy.
+ type: str
+ aliases: [ keychain_policy_name, name ]
+ description:
+ description:
+ - The description for the keychain policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new keychain policy
+ cisco.aci.aci_keychain_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ keychain_policy: my_keychain_policy
+ state: present
+ delegate_to: localhost
+
+- name: Delete an keychain policy
+ cisco.aci.aci_keychain_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ keychain_policy: my_keychain_policy
+ state: absent
+ delegate_to: localhost
+
+- name: Query an keychain policy
+ cisco.aci.aci_keychain_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ keychain_policy: my_keychain_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query an keychain policy in my_tenant
+ cisco.aci.aci_keychain_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ keychain_policy=dict(type="str", aliases=["keychain_policy_name", "name"], no_log=False),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "keychain_policy"]],
+ ["state", "present", ["tenant", "keychain_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ keychain_policy = module.params.get("keychain_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="fvKeyChainPol",
+ aci_rn="keychainp-{0}".format(keychain_policy),
+ module_object=keychain_policy,
+ target_filter={"name": keychain_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="fvKeyChainPol",
+ class_config=dict(
+ name=keychain_policy,
+ descr=description,
+ ),
+ )
+
+ aci.get_diff(aci_class="fvKeyChainPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l2out.py b/ansible_collections/cisco/aci/plugins/modules/aci_l2out.py
index 974c3c8e9..fdba63ef5 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l2out.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l2out.py
@@ -14,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_l2out
-short_description: Manage Layer2 Out (L2Out) objects.
+short_description: Manage Layer2 Out (L2Out) objects (l2ext:Out)
description:
- Manage Layer2 Out configuration on Cisco ACI fabrics.
options:
@@ -64,7 +64,7 @@ notes:
The M(cisco.aci.aci_tenant) modules can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(fvTenant).
+ description: More information about the internal APIC class B(l2ext:Out).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Sudhakar Shet Kudtarkar (@kudtarkar1)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg.py b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg.py
index 3df19e9da..d633a7aae 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg.py
@@ -15,9 +15,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_l2out_extepg
-short_description: Manage External Network Instance (L2Out External EPG) objects (l2extInstP).
+short_description: Manage External Network Instance (L2Out External EPG) objects (l2ext:InstP).
description:
-- Manage External Network Instance (L2Out External EPG) objects (l2extInstP) on ACI fabrics.
+- Manage External Network Instance (L2Out External EPG) objects on ACI fabrics.
options:
tenant:
description:
@@ -63,7 +63,7 @@ notes:
The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_l2out) modules can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(fvtenant) and B(l2extOut).
+ description: More information about the internal APIC class B(l2ext:InstP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Sudhakar Shet Kudtarkar (@kudtarkar1)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg_to_contract.py b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg_to_contract.py
index 205be3795..0ed57326f 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg_to_contract.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_extepg_to_contract.py
@@ -15,7 +15,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_l2out_extepg_to_contract
-short_description: Bind Contracts to L2 External End Point Groups (EPGs)
+short_description: Bind Contracts to L2 External End Point Groups (EPGs) (fv:RsCons and fv:RsProv)
description:
- Bind Contracts to L2 External End Point Groups (EPGs) on ACI fabrics.
options:
@@ -69,7 +69,7 @@ notes:
The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l2out) and M(cisco.aci.aci_l2out_extepg) modules can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(fvtenant), B(l2extInstP) and B(l2extOut).
+ description: More information about the internal APIC classes B((fv:RsCons) B(fv:RsProv).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Sudhakar Shet Kudtarkar (@kudtarkar1)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_path.py b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_path.py
index 6be588bcd..0d8130139 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_path.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_path.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_l2out_logical_interface_path
-short_description: Manage Layer 2 Outside (L2Out) logical interface path (l2extRsPathL2OutAtt)
+short_description: Manage Layer 2 Outside (L2Out) logical interface path (l2ext:RsPathL2OutAtt)
description:
- Manage interface path entry of L2 outside node (BD extension) on Cisco ACI fabrics.
options:
@@ -79,7 +79,7 @@ seealso:
- module: aci_l2out_logical_interface_profile
- module: aci_l2out_extepg
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes
+ description: More information about the internal APIC class B(l2ext:RsPathL2OutAtt).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Oleksandr Kreshchenko (@alexkross)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_profile.py
index 93e8fd195..c1d0b3d61 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_interface_profile.py
@@ -55,7 +55,7 @@ seealso:
- module: aci_l2out_logical_interface_path
- module: aci_l2out_extepg
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes
+ description: More information about the internal APIC class B(l2ext:LIfP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Oleksandr Kreshchenko (@alexkross)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_node_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_node_profile.py
index 12a1aa6f5..6fa04db01 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_node_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l2out_logical_node_profile.py
@@ -49,7 +49,7 @@ seealso:
- module: aci_l2out_logical_interface_path
- module: aci_l2out_extepg
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes
+ description: More information about the internal APIC class B(l2ext:LNodeP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Oleksandr Kreshchenko (@alexkross)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out.py
index 56f158b3d..73d51fc63 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out.py
@@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -34,6 +35,7 @@ options:
vrf:
description:
- Name of the VRF being associated with the L3Out.
+ - SR-MPLS Infra L3out requires the VRF to be 'overlay-1'.
type: str
aliases: [ vrf_name ]
domain:
@@ -60,6 +62,8 @@ options:
description:
- Indicate whether MPLS (Multi-Protocol Label Switching) is enabled or not.
- The APIC defaults to C(no) when unset during creation.
+ - SR-MPLS is only supported in APIC v5.0 and above.
+ - The child classes C(mplsExtP), C(mplsRsLabelPol) and C(l3extProvLbl) will be displayed in output only when C(yes).
type: str
choices: [ "no", "yes" ]
l3protocol:
@@ -70,6 +74,7 @@ options:
- First example, to add BGP protocol to an l3out with OSPF protocol, the user must enter C([ bgp, ospf ]) even though "ospf" was provided before.
- Second example, to change the protocol from OSPF to EIGRP, the user must simply enter C([ eigrp ]) and the previous OSPF protocol will be deleted.
- To remove all existing protocols, the user must enter C([ static ]).
+ - SR-MPLS Infra L3out requires the l3protocol to be 'bgp'.
type: list
elements: str
choices: [ bgp, eigrp, ospf, pim, static ]
@@ -165,6 +170,7 @@ seealso:
author:
- Rostyslav Davydenko (@rost-d)
- Gaspard Micol (@gmicol)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -444,39 +450,17 @@ def main():
dict(l3extRsL3DomAtt=dict(attributes=dict(tDn="uni/l3dom-{0}".format(domain)))),
dict(l3extRsEctx=dict(attributes=dict(tnFvCtxName=vrf))),
]
- if l3protocol is not None:
- l3protocol_child_configs = dict(
- bgp=dict(bgpExtP=dict(attributes=dict(status="deleted"))),
- eigrp=dict(eigrpExtP=dict(attributes=dict(status="deleted"))),
- ospf=dict(ospfExtP=dict(attributes=dict(status="deleted"))),
- pim=dict(pimExtP=dict(attributes=dict(status="deleted"))),
+
+ if tenant == "infra" and mpls == "yes":
+ if l3protocol != ["bgp"] and state == "present":
+ module.fail_json(msg="The l3protocol parameter must be 'bgp' when tenant is 'infra' and mpls is 'yes'")
+ if vrf != "overlay-1" and state == "present":
+ module.fail_json(msg="The vrf parameter must be 'overlay-1' when tenant is 'infra' and mpls is 'yes'")
+ child_classes += ["mplsExtP", "mplsRsLabelPol", "l3extProvLbl"]
+ child_configs.append(
+ dict(mplsExtP=dict(attributes=dict(), children=[dict(mplsRsLabelPol=dict(attributes=dict(tDn="uni/tn-infra/mplslabelpol-default")))]))
)
- for protocol in l3protocol:
- if protocol == "bgp":
- l3protocol_child_configs["bgp"] = dict(bgpExtP=dict(attributes=dict(descr="")))
- elif protocol == "eigrp":
- l3protocol_child_configs["eigrp"] = dict(eigrpExtP=dict(attributes=dict(asn=asn)))
- elif protocol == "ospf":
- if isinstance(ospf, dict):
- ospf["area_ctrl"] = ",".join(ospf.get("area_ctrl"))
- l3protocol_child_configs["ospf"] = dict(
- ospfExtP=dict(
- attributes=dict(
- areaCost=ospf.get("area_cost"),
- areaCtrl=ospf.get("area_ctrl"),
- areaId=ospf.get("area_id"),
- areaType=ospf.get("area_type"),
- descr=ospf.get("description"),
- multipodInternal=ospf.get("multipod_internal"),
- nameAlias=ospf.get("name_alias"),
- )
- )
- )
- else:
- l3protocol_child_configs["ospf"] = dict(ospfExtP=dict(attributes=dict(descr="")))
- elif protocol == "pim":
- l3protocol_child_configs["pim"] = dict(pimExtP=dict(attributes=dict(descr="")))
- child_configs.extend(list(l3protocol_child_configs.values()))
+ child_configs.append(dict(l3extProvLbl=dict(attributes=dict(name=l3out))))
aci.construct_url(
root_class=dict(
@@ -497,6 +481,46 @@ def main():
aci.get_existing()
if state == "present":
+ if l3protocol is not None:
+ if isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("l3extOut", {}).get("children", {}):
+ if child.get("bgpExtP") and "bgp" not in l3protocol:
+ child_configs.append(dict(bgpExtP=dict(attributes=dict(status="deleted"))))
+ if child.get("eigrpExtP") and "eigrp" not in l3protocol:
+ child_configs.append(dict(eigrpExtP=dict(attributes=dict(status="deleted"))))
+ if child.get("ospfExtP") and "ospf" not in l3protocol:
+ child_configs.append(dict(ospfExtP=dict(attributes=dict(status="deleted"))))
+ if child.get("pimExtP") and "pim" not in l3protocol:
+ child_configs.append(dict(pimExtP=dict(attributes=dict(status="deleted"))))
+
+ for protocol in l3protocol:
+ if protocol == "bgp":
+ child_configs.append(dict(bgpExtP=dict(attributes=dict(descr=""))))
+ elif protocol == "eigrp":
+ child_configs.append(dict(eigrpExtP=dict(attributes=dict(asn=asn))))
+ elif protocol == "ospf":
+ if isinstance(ospf, dict):
+ ospf["area_ctrl"] = ",".join(ospf.get("area_ctrl"))
+ child_configs.append(
+ dict(
+ ospfExtP=dict(
+ attributes=dict(
+ areaCost=ospf.get("area_cost"),
+ areaCtrl=ospf.get("area_ctrl"),
+ areaId=ospf.get("area_id"),
+ areaType=ospf.get("area_type"),
+ descr=ospf.get("description"),
+ multipodInternal=ospf.get("multipod_internal"),
+ nameAlias=ospf.get("name_alias"),
+ )
+ )
+ )
+ )
+ else:
+ child_configs.append(dict(ospfExtP=dict(attributes=dict(descr=""))))
+ elif protocol == "pim":
+ child_configs.append(dict(pimExtP=dict(attributes=dict(descr=""))))
+
aci.payload(
aci_class="l3extOut",
class_config=dict(
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_interface_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_interface_profile.py
new file mode 100644
index 000000000..193ff0c1d
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_interface_profile.py
@@ -0,0 +1,367 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Anvitha Jain (@anvjain) <anvjain@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_bfd_interface_profile
+short_description: Manage L3Out BFD Interface profiles (bfd:IfP)
+description:
+- Manage L3Out BFD Interface profile configuration on Cisco ACI fabrics
+- Only available in APIC version 5.2 or later and for non-cloud APICs
+options:
+ tenant:
+ description:
+ - Name of an existing tenant
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - Name of an existing L3Out
+ type: str
+ aliases: [ l3out_name ]
+ l3out_logical_node_profile:
+ description:
+ - Name of an existing L3Out Logical Node profile
+ type: str
+ aliases: [ logical_node_profile, logical_node_profile_name ]
+ l3out_logical_interface_profile:
+ description:
+ - Name of an existing L3Out Logical Interface profile
+ type: str
+ aliases: [ logical_interface_profile, logical_interface_profile_name ]
+ name:
+ description:
+ - Name of the L3Out BFD Interface profile object
+ type: str
+ aliases: [ bfd_multihop_interface_profile ]
+ name_alias:
+ description:
+ - Name Alias of the L3Out BFD Interface profile object
+ type: str
+ description:
+ description:
+ - Description of the L3Out BFD Interface profile object
+ type: str
+ aliases: [ descr ]
+ authentication_type:
+ description:
+ - Authentication Type of the L3Out BFD Interface profile object
+ - APIC sets the default value to none
+ type: str
+ choices: [ none, sha1 ]
+ key:
+ description:
+ - Authentication Key of the L3Out BFD Interface profile object
+ type: str
+ key_id:
+ description:
+ - Authentication Key ID of the L3Out BFD Interface profile object
+ - APIC sets the default value to 3
+ - Allowed range is 1-255
+ type: int
+ bfd_interface_policy:
+ description:
+ - The name of the Interface policy
+ type: str
+ aliases: [ interface_policy, interface_policy_name ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant), c(l3out), C(l3out_logical_node_profile) and C(l3out_logical_interface_profile) must exist before using this module in your playbook
+ The M(cisco.aci.aci_tenant) modules can be used for this
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bfd:IfP)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_interface_policy_bfd
+author:
+- Anvitha Jain (@anvjain)
+"""
+
+EXAMPLES = r"""
+- name: Add a new L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ state: present
+ delegate_to: localhost
+
+- name: Query a new L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ state: query
+ delegate_to: localhost
+
+- name: Query all L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+ current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+ raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class "/></imdata>'
+ sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+ previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+ filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+ method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+ response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+ status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+ url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+ """
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ l3out_logical_node_profile=dict(type="str", aliases=["logical_node_profile_name", "logical_node_profile"]),
+ l3out_logical_interface_profile=dict(type="str", aliases=["logical_interface_profile_name", "logical_interface_profile"]),
+ name=dict(type="str", aliases=["bfd_multihop_interface_profile"]),
+ name_alias=dict(type="str"),
+ description=dict(type="str", aliases=["descr"]),
+ authentication_type=dict(type="str", choices=["none", "sha1"]),
+ key=dict(type="str", no_log=True),
+ key_id=dict(type="int"),
+ bfd_interface_policy=dict(type="str", aliases=["interface_policy", "interface_policy_name"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "l3out", "l3out_logical_node_profile", "l3out_logical_interface_profile"]],
+ ["state", "present", ["tenant", "l3out", "l3out_logical_node_profile", "l3out_logical_interface_profile", "bfd_interface_policy"]],
+ ["authentication_type", "sha1", ["key"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ l3out_logical_node_profile = module.params.get("l3out_logical_node_profile")
+ l3out_logical_interface_profile = module.params.get("l3out_logical_interface_profile")
+ name = module.params.get("name")
+ name_alias = module.params.get("name_alias")
+ description = module.params.get("description")
+ authentication_type = module.params.get("authentication_type")
+ key = module.params.get("key")
+ key_id = module.params.get("key_id")
+ bfd_interface_policy = module.params.get("bfd_interface_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(l3out_logical_node_profile),
+ module_object=l3out_logical_node_profile,
+ target_filter={"name": l3out_logical_node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-{0}".format(l3out_logical_interface_profile),
+ module_object=l3out_logical_interface_profile,
+ target_filter={"name": l3out_logical_interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="bfdIfP",
+ aci_rn="bfdIfP",
+ module_object="bfdIfP",
+ target_filter={"name": name},
+ ),
+ child_classes=["bfdRsIfPol"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ class_config = dict(
+ name=name,
+ nameAlias=name_alias,
+ descr=description,
+ key=key,
+ type=authentication_type,
+ )
+
+ if key_id and key_id not in range(1, 255):
+ module.fail_json(msg='The "key_id" must be a value between 1 and 255')
+ else:
+ class_config["keyId"] = key_id
+
+ if bfd_interface_policy is not None:
+ child_configs.append(dict(bfdRsIfPol=dict(attributes=dict(tnBfdIfPolName=bfd_interface_policy))))
+
+ aci.payload(
+ aci_class="bfdIfP",
+ class_config=class_config,
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="bfdIfP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_multihop_interface_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_multihop_interface_profile.py
new file mode 100644
index 000000000..f7dd66c3e
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bfd_multihop_interface_profile.py
@@ -0,0 +1,366 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Anvitha Jain (@anvjain) <anvjain@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_bfd_multihop_interface_profile
+short_description: Manage BFD Multihop Interface profiles (bfd:MhIfP)
+description:
+- Manage BFD Multihop Interface profile configuration on Cisco ACI fabrics
+- Only available in APIC version 5.2 or later and for non-cloud APICs
+options:
+ tenant:
+ description:
+ - Name of an existing tenant
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - Name of an existing L3Out
+ type: str
+ aliases: [ l3out_name ]
+ l3out_logical_node_profile:
+ description:
+ - Name of an existing L3Out Logical Node profile
+ type: str
+ aliases: [ logical_node_profile, logical_node_profile_name ]
+ l3out_logical_interface_profile:
+ description:
+ - Name of an existing L3Out Logical Interface profile
+ type: str
+ aliases: [ logical_interface_profile, logical_interface_profile_name ]
+ name:
+ description:
+ - Name of the BFD Multihop Interface Profile object
+ type: str
+ aliases: [ bfd_multihop_interface_profile ]
+ name_alias:
+ description:
+ - Name Alias of the BFD Multihop Interface Profile object
+ type: str
+ description:
+ description:
+ - Description of the BFD Multihop Interface Profile object
+ type: str
+ aliases: [ descr ]
+ authentication_type:
+ description:
+ - Authentication Type of the BFD Multihop Interface Profile object
+ - APIC sets the default value to none.
+ type: str
+ choices: [ none, sha1 ]
+ key:
+ description:
+ - Authentication Key of the BFD Multihop Interface Profile object
+ type: str
+ key_id:
+ description:
+ - Authentication Key ID of the BFD Multihop Interface Profile object
+ - APIC sets the default value to 3
+ - Allowed range is 1-255
+ type: int
+ bfd_multihop_interface_policy:
+ description:
+ - The name of the BFD Multihop Interface policy
+ type: str
+ aliases: [ multihop_interface_policy, multihop_interface_policy_name ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing
+ - Use C(query) for listing an object or multiple objects
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant), c(l3out), C(l3out_logical_node_profile) and C(l3out_logical_interface_profile) must exist before using this module in your playbook
+ The M(cisco.aci.aci_tenant) modules can be used for this
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(bfd:MhIfP)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_interface_policy_bfd_multihop
+author:
+- Anvitha Jain (@anvjain)
+"""
+
+EXAMPLES = r"""
+- name: Add a new L3Out BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ state: present
+ delegate_to: localhost
+
+- name: Query a new L3Out BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ state: query
+ delegate_to: localhost
+
+- name: Query all L3Out BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete L3Out BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+ current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+ raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class "/></imdata>'
+ sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+ previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+ filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+ method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+ response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+ status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+ url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+ """
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ l3out_logical_node_profile=dict(type="str", aliases=["logical_node_profile_name", "logical_node_profile"]),
+ l3out_logical_interface_profile=dict(type="str", aliases=["logical_interface_profile_name", "logical_interface_profile"]),
+ name=dict(type="str", aliases=["bfd_multihop_interface_profile"]),
+ name_alias=dict(type="str"),
+ description=dict(type="str", aliases=["descr"]),
+ authentication_type=dict(type="str", choices=["none", "sha1"]),
+ key=dict(type="str", no_log=True),
+ key_id=dict(type="int"),
+ bfd_multihop_interface_policy=dict(type="str", aliases=["multihop_interface_policy", "multihop_interface_policy_name"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "l3out", "l3out_logical_node_profile", "l3out_logical_interface_profile"]],
+ ["state", "present", ["tenant", "l3out", "l3out_logical_node_profile", "l3out_logical_interface_profile", "bfd_multihop_interface_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ l3out_logical_node_profile = module.params.get("l3out_logical_node_profile")
+ l3out_logical_interface_profile = module.params.get("l3out_logical_interface_profile")
+ name = module.params.get("name")
+ name_alias = module.params.get("name_alias")
+ description = module.params.get("description")
+ authentication_type = module.params.get("authentication_type")
+ key = module.params.get("key")
+ key_id = module.params.get("key_id")
+ bfd_multihop_interface_policy = module.params.get("bfd_multihop_interface_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(l3out_logical_node_profile),
+ module_object=l3out_logical_node_profile,
+ target_filter={"name": l3out_logical_node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-{0}".format(l3out_logical_interface_profile),
+ module_object=l3out_logical_interface_profile,
+ target_filter={"name": l3out_logical_interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="bfdMhIfP",
+ aci_rn="bfdMhIfP",
+ module_object="bfdMhIfP",
+ target_filter={"name": name},
+ ),
+ child_classes=["bfdRsMhIfPol"],
+ )
+
+ aci.get_existing()
+ aci.stdout = str(aci.get_existing())
+ if state == "present":
+ child_configs = []
+ class_config = dict(
+ name=name,
+ nameAlias=name_alias,
+ descr=description,
+ type=authentication_type,
+ key=key,
+ )
+
+ if key_id and key_id not in range(1, 255):
+ module.fail_json(msg='The "key_id" must be a value between 1 and 255')
+ else:
+ class_config["keyId"] = key_id
+
+ if bfd_multihop_interface_policy is not None:
+ child_configs.append(dict(bfdRsMhIfPol=dict(attributes=dict(tnBfdMhIfPolName=bfd_multihop_interface_policy))))
+
+ aci.payload(
+ aci_class="bfdMhIfP",
+ class_config=class_config,
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="bfdMhIfP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_peer.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_peer.py
index 4719c42ca..79776fdb6 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_peer.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_bgp_peer.py
@@ -16,7 +16,7 @@ ANSIBLE_METADATA = {
DOCUMENTATION = r"""
---
module: aci_l3out_bgp_peer
-short_description: Manage Layer 3 Outside (L3Out) BGP Peers (bgp:PeerP)
+short_description: Manage Layer 3 Outside (L3Out) BGP Peers (bgp:PeerP and bgp:InfraPeerP)
description:
- Manage L3Out BGP Peers on Cisco ACI fabrics.
options:
@@ -68,7 +68,7 @@ options:
- BGP Controls
type: list
elements: str
- choices: [ send-com, send-ext-com, allow-self-as, as-override, dis-peer-as-check, nh-self ]
+ choices: [ send-com, send-ext-com, allow-self-as, as-override, dis-peer-as-check, nh-self, send-domain-path ]
peer_controls:
description:
- Peer Controls
@@ -143,6 +143,36 @@ options:
- The APIC defaults to 0 when unset during creation.
type: int
aliases: [ local_as_num ]
+ bgp_password:
+ description:
+ - Password for the BGP Peer.
+ type: str
+ description:
+ description:
+ - Description for the BGP Peer.
+ type: str
+ aliases: [ descr ]
+ transport_data_plane:
+ description:
+ - Transport Data Plane type.
+ type: str
+ choices: [ mpls, sr_mpls ]
+ bgp_peer_prefix_policy:
+ description:
+ - BGP Peer Prefix Policy.
+ - BGP Peer Prefix Policy is only allowed to be configured when I(bgp_infra_peer=true).
+ type: str
+ aliases: [ bgp_peer_prefix_policy_name ]
+ peer_type:
+ description:
+ - BGP Peer type.
+ type: str
+ choices: [ sr_mpls ]
+ bgp_infra_peer:
+ description:
+ - BGP Infra peer (bgp:InfraPeerP).
+ type: bool
+ aliases: [ infra ]
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -158,10 +188,11 @@ seealso:
- module: aci_l3out
- module: aci_l3out_logical_node_profile
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(bgp:peerP)
+ description: More information about the internal APIC classes B(bgp:peerP) and B(bgp:InfraPeerP)
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -215,6 +246,28 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
+- name: Create Infra BGP Peer with password
+ aci_l3out_bgp_peer: &infra_bgp_peer
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: infra
+ l3out: ansible_infra_l3out
+ node_profile: ansible_infra_l3out_node_profile
+ ttl: 2
+ bgp_infra_peer: true
+ bgp_password: ansible_test_password
+ peer_ip: 192.168.50.2
+ remote_asn: 65450
+ local_as_number: 65460
+ peer_type: sr_mpls
+ bgp_controls:
+ - send-domain-path
+ transport_data_plane: sr_mpls
+ bgp_peer_prefix_policy: ansible_peer_prefix_profile
+ state: present
+ delegate_to: localhost
+
- name: Shutdown a BGP peer
cisco.aci.aci_l3out_bgp_peer:
host: apic
@@ -266,6 +319,7 @@ EXAMPLES = r"""
direction: "export"
l3out: "anstest_l3out"
state: present
+ delegate_to: localhost
- name: Query a BGP peer
cisco.aci.aci_l3out_bgp_peer:
@@ -293,6 +347,15 @@ EXAMPLES = r"""
delegate_to: localhost
register: query_all
+- name: Query all BGP infra peer
+ cisco.aci.aci_l3out_bgp_peer:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ bgp_infra_peer: true
+ state: query
+ delegate_to: localhost
+ register: query_all
"""
RETURN = r"""
@@ -416,6 +479,7 @@ def main():
argument_spec.update(
tenant=dict(type="str", aliases=["tenant_name"]),
l3out=dict(type="str", aliases=["l3out_name"]),
+ description=dict(type="str", aliases=["descr"]),
node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"]),
interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
@@ -434,6 +498,7 @@ def main():
"as-override",
"dis-peer-as-check",
"nh-self",
+ "send-domain-path",
],
),
peer_controls=dict(type="list", elements="str", choices=["bfd", "dis-conn-check"]),
@@ -454,6 +519,11 @@ def main():
),
local_as_number_config=dict(type="str", choices=["dual-as", "no-prepend", "none", "replace-as"], aliases=["local_as_num_config"]),
local_as_number=dict(type="int", aliases=["local_as_num"]),
+ bgp_password=dict(type="str", no_log=True),
+ transport_data_plane=dict(type="str", choices=["mpls", "sr_mpls"]),
+ bgp_peer_prefix_policy=dict(type="str", aliases=["bgp_peer_prefix_policy_name"]),
+ peer_type=dict(type="str", choices=["sr_mpls"]),
+ bgp_infra_peer=dict(type="bool", aliases=["infra"]),
)
module = AnsibleModule(
@@ -468,6 +538,7 @@ def main():
tenant = module.params.get("tenant")
l3out = module.params.get("l3out")
+ description = module.params.get("description")
node_profile = module.params.get("node_profile")
interface_profile = module.params.get("interface_profile")
state = module.params.get("state")
@@ -487,6 +558,11 @@ def main():
route_control_profiles = module.params.get("route_control_profiles")
local_as_number_config = module.params.get("local_as_number_config")
local_as_number = module.params.get("local_as_number")
+ bgp_password = module.params.get("bgp_password")
+ transport_data_plane = module.params.get("transport_data_plane")
+ peer_type = module.params.get("peer_type")
+ bgp_infra_peer = module.params.get("bgp_infra_peer")
+ bgp_peer_prefix_policy = module.params.get("bgp_peer_prefix_policy")
aci = ACIModule(module)
if node_id:
@@ -499,24 +575,23 @@ def main():
child_configs = []
child_classes = ["bgpRsPeerPfxPol", "bgpAsP", "bgpLocalAsnP"]
+ aci_class = "bgpInfraPeerP" if bgp_infra_peer else "bgpPeerP"
- if remote_asn:
- child_configs.append(
- dict(
- bgpAsP=dict(
- attributes=dict(asn=remote_asn),
- ),
- )
- )
+ if remote_asn is not None:
+ bgp_as_p = dict(bgpAsP=dict(attributes=dict(asn=remote_asn)))
+ if remote_asn == 0:
+ bgp_as_p["bgpAsP"]["attributes"]["status"] = "deleted"
+ child_configs.append(bgp_as_p)
- if local_as_number_config or local_as_number:
- child_configs.append(
- dict(
- bgpLocalAsnP=dict(
- attributes=dict(asnPropagate=local_as_number_config, localAsn=local_as_number),
- ),
- )
- )
+ if local_as_number_config is not None or local_as_number is not None:
+ bgp_local_asn_p = dict(bgpLocalAsnP=dict(attributes=dict(asnPropagate=local_as_number_config, localAsn=local_as_number)))
+ if local_as_number == 0:
+ bgp_local_asn_p["bgpLocalAsnP"]["attributes"]["status"] = "deleted"
+ child_configs.append(bgp_local_asn_p)
+
+ # BGP Peer Prefix Policy is ony configurable on Infra BGP Peer Profile
+ if bgp_peer_prefix_policy is not None:
+ child_configs.append(dict(bgpRsPeerPfxPol=dict(attributes=dict(tnBgpPeerPfxPolName=bgp_peer_prefix_policy))))
if route_control_profiles:
child_classes.append("bgpRsPeerToProfile")
@@ -541,8 +616,8 @@ def main():
)
bgp_peer_profile_dict = dict(
- aci_class="bgpPeerP",
- aci_rn="peerP-[{0}]".format(peer_ip),
+ aci_class=aci_class,
+ aci_rn="infraPeerP-[{0}]".format(peer_ip) if bgp_infra_peer else "peerP-{0}".format(peer_ip),
module_object=peer_ip,
target_filter={"addr": peer_ip},
)
@@ -594,32 +669,46 @@ def main():
aci.get_existing()
if state == "present":
- ctrl, peerCtrl, addrTCtrl, privateASctrl = None, None, None, None
+ ctrl, ctrl_ext, peerCtrl, addrTCtrl, privateASctrl = None, None, None, None, None
if bgp_controls:
+ if transport_data_plane == "mpls":
+ bgp_controls.append("segment-routing-disable")
+
+ if "send-domain-path" in bgp_controls:
+ ctrl_ext = "send-domain-path"
+ bgp_controls.remove("send-domain-path")
+
ctrl = ",".join(bgp_controls)
+
if peer_controls:
peerCtrl = ",".join(peer_controls)
if address_type_controls:
addrTCtrl = ",".join(address_type_controls)
if private_asn_controls:
privateASctrl = ",".join(private_asn_controls)
- aci.payload(
- aci_class="bgpPeerP",
- class_config=dict(
- addr=peer_ip,
- ctrl=ctrl,
- peerCtrl=peerCtrl,
- addrTCtrl=addrTCtrl,
- privateASctrl=privateASctrl,
- ttl=ttl,
- weight=weight,
- adminSt=admin_state,
- allowedSelfAsCnt=allow_self_as_count,
- ),
- child_configs=child_configs,
+
+ class_config = dict(
+ descr=description,
+ addr=peer_ip,
+ ctrl=ctrl,
+ ctrlExt=ctrl_ext,
+ peerCtrl=peerCtrl,
+ addrTCtrl=addrTCtrl,
+ privateASctrl=privateASctrl,
+ ttl=ttl,
+ weight=weight,
+ adminSt=admin_state,
+ allowedSelfAsCnt=allow_self_as_count,
+ peerT=peer_type.replace("_", "-") if peer_type else None,
)
- aci.get_diff(aci_class="bgpPeerP")
+ # Only add bgp_password if it is set to handle changed status properly because password is not part of existing config
+ if bgp_password:
+ class_config["password"] = bgp_password
+
+ aci.payload(aci_class=aci_class, class_config=class_config, child_configs=child_configs)
+
+ aci.get_diff(aci_class=aci_class)
aci.post_config()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_dhcp_relay_label.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_dhcp_relay_label.py
new file mode 100644
index 000000000..3b9885c23
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_dhcp_relay_label.py
@@ -0,0 +1,354 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_dhcp_relay_label
+short_description: Manage Layer 3 Outside (L3Out) DHCP Relay Label (dhcp:Lbl)
+description:
+- Manage DHCP Relay Labels for L3Out Logical Interface Profiles on Cisco ACI fabrics.
+- A DHCP Relay Label contains the name of an existing DHCP Relay Policy for the label,
+ the scope, and a DHCP Option Policy.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - The name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ node_profile:
+ description:
+ - The name of an existing node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ interface_profile:
+ description:
+ - The name of an existing interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ dhcp_relay_label:
+ description:
+ - The name/label of an existing DHCP Relay Policy.
+ type: str
+ aliases: [ name, relay_policy ]
+ scope:
+ description:
+ - The scope is the owner of the relay server.
+ - The APIC defaults to C(infra) when unset during creation.
+ type: str
+ choices: [ infra, tenant ]
+ aliases: [ owner ]
+ dhcp_option_policy:
+ description:
+ - The name of an existing DHCP Option Policy to be associated with the DCHP Relay Policy.
+ - The DHCP option policy supplies DHCP clients with configuration parameters
+ such as domain, nameserver, and subnet router addresses.
+ - Passing an empty string will delete the current linked DHCP Option Policy.
+ However, this will associate the DHCP Relay Label to the default DHCP Option Policy
+ from the common Tenant.
+ type: str
+ aliases: [ dhcp_option_policy_name ]
+ description:
+ description:
+ - The description of the DHCP Relay Label.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant), C(l3out), C(node_profile), C(interface_profile) and C(relay_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile), M(cisco.aci.aci_l3out_logical_interface_profile)
+ and M(cisco.aci.aci_dhcp_relay) can be used for this.
+- If C(dhcp_option_policy) is used, it must exist before using this module in your playbook.
+ The M(cisco.aci.aci_dhcp_option_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_dhcp_relay
+- module: cisco.aci.aci_dhcp_option_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new L3Out DHCP Relay Label
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ dhcp_relay_label: my_dhcp_relay_label
+ scope: tenant
+ dhcp_option_policy: my_dhcp_option_policy
+ state: present
+ delegate_to: localhost
+
+- name: Delete an L3Out DHCP Relay Label
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ dhcp_relay_label: my_dhcp_relay_label
+ state: absent
+ delegate_to: localhost
+
+- name: Query an L3Out DHCP Relay Label
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ dhcp_relay_label: my_dhcp_relay_label
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"]),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"]),
+ dhcp_relay_label=dict(type="str", aliases=["name", "relay_policy"]),
+ scope=dict(type="str", choices=["infra", "tenant"], aliases=["owner"]),
+ dhcp_option_policy=dict(type="str", aliases=["dhcp_option_policy_name"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "l3out", "node_profile", "interface_profile", "dhcp_relay_label"]],
+ ["state", "present", ["tenant", "l3out", "node_profile", "interface_profile", "dhcp_relay_label"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ dhcp_relay_label = module.params.get("dhcp_relay_label")
+ scope = module.params.get("scope")
+ dhcp_option_policy = module.params.get("dhcp_option_policy")
+ description = module.params.get("description")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ child_classes = ["dhcpRsDhcpOptionPol"]
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-[{0}]".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="dhcpLbl",
+ aci_rn="dhcplbl-[{0}]".format(dhcp_relay_label),
+ module_object=dhcp_relay_label,
+ target_filter={"name": dhcp_relay_label},
+ ),
+ child_classes=child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = [dict(dhcpRsDhcpOptionPol=dict(attributes=dict(tnDhcpOptionPolName=dhcp_option_policy)))]
+
+ aci.payload(
+ aci_class="dhcpLbl",
+ class_config=dict(
+ descr=description,
+ name=dhcp_relay_label,
+ owner=scope,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="dhcpLbl")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_eigrp_interface_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_eigrp_interface_profile.py
new file mode 100644
index 000000000..d1359e500
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_eigrp_interface_profile.py
@@ -0,0 +1,392 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_eigrp_interface_profile
+short_description: Manage Layer 3 Outside (L3Out) EIGRP interface profile (eigrp:IfP)
+description:
+- Manage L3Out logical interface profile EIGRP policies on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - The name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ node_profile:
+ description:
+ - The name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ interface_profile:
+ description:
+ - The name of an existing interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ eigrp_policy:
+ description:
+ - The name of an existing EIGRP interface policy.
+ type: str
+ aliases: [ name, eigrp_policy_name ]
+ eigrp_keychain_policy:
+ description:
+ - The name of an existing EIGRP keychain policy.
+ - Pass an empty string to disable Authentification.
+ type: str
+ aliases: [ keychain_policy, keychain_policy_name ]
+ description:
+ description:
+ - The description of the EIGRP interface profile.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant), C(l3out), C(node_profile), C(interface_profile) and C(eigrp_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile), M(cisco.aci.aci_l3out_logical_interface_profile)
+ and M(cisco.aci.aci_interface_policy_eigrp) can be used for this.
+- if C(eigrp_keychain_policy) is used, it must exist before using this module in your playbook.
+ The M(cisco.aci.aci_keychain_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_interface_policy_eigrp
+- module: cisco.aci.aci_keychain_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new interface profile EIGRP policy
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ eigrp_policy: my_eigrp_interface_policy
+ state: present
+ delegate_to: localhost
+
+- name: Add a new interface profile EIGRP policy with authentication
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ eigrp_policy: my_eigrp_interface_policy
+ eigrp_keychain_policy: my_keychain_policy
+ state: present
+ delegate_to: localhost
+
+- name: Disable authentification from an interface profile EIGRP policy
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ eigrp_policy: my_eigrp_interface_policy
+ eigrp_keychain_policy: ""
+ state: present
+ delegate_to: localhost
+
+- name: Delete an interface profile EIGRP policy
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ eigrp_policy: my_eigrp_interface_policy
+ state: absent
+ delegate_to: localhost
+
+- name: Query an interface profile EIGRP policy
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ eigrp_policy: my_eigrp_interface_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"]),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"]),
+ eigrp_policy=dict(type="str", aliases=["name", "eigrp_policy_name"]),
+ eigrp_keychain_policy=dict(type="str", aliases=["keychain_policy", "keychain_policy_name"], no_log=False),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "l3out", "node_profile", "interface_profile"]],
+ ["state", "present", ["tenant", "l3out", "node_profile", "interface_profile", "eigrp_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ eigrp_policy = module.params.get("eigrp_policy")
+ eigrp_keychain_policy = module.params.get("eigrp_keychain_policy")
+ description = module.params.get("description")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ child_classes = ["eigrpRsIfPol", "eigrpAuthIfP"]
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-[{0}]".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="eigrpIfP",
+ aci_rn="eigrpIfP",
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ child_classes=child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = [dict(eigrpRsIfPol=dict(attributes=dict(tnEigrpIfPolName=eigrp_policy)))]
+
+ if eigrp_keychain_policy is not None:
+ if eigrp_keychain_policy == "" and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("eigrpIfP", {}).get("children", {}):
+ if child.get("eigrpAuthIfP"):
+ child_configs.append(
+ dict(
+ eigrpAuthIfP=dict(
+ attributes=dict(status="deleted"),
+ ),
+ )
+ )
+ elif eigrp_keychain_policy != "":
+ child_configs.append(
+ dict(
+ eigrpAuthIfP=dict(
+ attributes=dict(),
+ children=[
+ dict(
+ eigrpRsKeyChainPol=dict(
+ attributes=dict(
+ tnFvKeyChainPolName=eigrp_keychain_policy,
+ ),
+ )
+ )
+ ],
+ )
+ )
+ )
+
+ aci.payload(
+ aci_class="eigrpIfP",
+ class_config=dict(
+ descr=description,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="eigrpIfP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg.py
index acaa7ea9e..3180e6752 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg.py
@@ -14,7 +14,7 @@ DOCUMENTATION = r"""
module: aci_l3out_extepg
short_description: Manage External Network Instance Profile (ExtEpg) objects (l3extInstP:instP)
description:
-- Manage External Network Instance Profile (ExtEpg) objects (l3extInstP:instP)
+- Manage External Network Instance Profile (ExtEpg) objects.
options:
tenant:
description:
@@ -104,7 +104,7 @@ seealso:
- module: cisco.aci.aci_domain
- module: cisco.aci.aci_vrf
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(l3ext:Out).
+ description: More information about the internal APIC class B(l3extInstP:instP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Rostyslav Davydenko (@rost-d)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg_to_contract.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg_to_contract.py
index ba5df29c5..eb9f6da17 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg_to_contract.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extepg_to_contract.py
@@ -3,6 +3,7 @@
# Copyright: (c) 2020, Sudhakar Shet Kudtarkar (@kudtarkar1)
# Copyright: (c) 2020, Shreyas Srish <ssrish@cisco.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -14,7 +15,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_l3out_extepg_to_contract
-short_description: Bind Contracts to External End Point Groups (EPGs)
+short_description: Bind Contracts to External End Point Groups (EPGs) (fv:RsCons, fv:RsProv, fv:RsProtBy, fv:RsConsIf, and fv:RsIntraEpg)
description:
- Bind Contracts to External End Point Groups (EPGs) on ACI fabrics.
options:
@@ -26,32 +27,43 @@ options:
description:
- Name of the l3out.
type: str
- aliases: ['l3out_name']
+ aliases: [ l3out_name ]
extepg:
description:
- Name of the external end point group.
type: str
- aliases: ['extepg_name', 'external_epg']
+ aliases: [ extepg_name, external_epg]
contract:
description:
- - Name of the contract.
+ - The name of the contract or contract interface.
type: str
+ aliases: [ contract_name, contract_interface ]
contract_type:
description:
- - The type of contract.
+ - Determines the type of the Contract.
type: str
required: true
- choices: ['consumer', 'provider']
+ choices: [ consumer, provider, taboo, interface, intra_epg ]
priority:
description:
- - This has four levels of priority.
+ - QoS class.
+ - The APIC defaults to C(unspecified) when unset during creation.
type: str
- choices: ['level1', 'level2', 'level3', 'unspecified']
+ choices: [ level1, level2, level3, level4, level5, level6, unspecified ]
provider_match:
description:
- - This is configurable for provided contracts.
+ - The matching algorithm for Provided Contracts.
+ - The APIC defaults to C(at_least_one) when unset during creation.
+ type: str
+ choices: [ all, at_least_one, at_most_one, none ]
+ contract_label:
+ description:
+ - Contract label to match.
+ type: str
+ subject_label:
+ description:
+ - Subject label to match.
type: str
- choices: ['all', 'at_least_one', 'at_most_one', 'none']
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -64,15 +76,16 @@ extends_documentation_fragment:
- cisco.aci.annotation
notes:
-- The C(tenant), C(l3out) and C(extepg) must exist before using this module in your playbook.
- The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out) and M(cisco.aci.aci_l3out_extepg) modules can be used for this.
+- The C(tenant), C(l3out), C(extepg), and C(Contract) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_extepg), and M(cisco.aci.aci_contract) modules can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(fvtenant), B(l3extInstP) and B(l3extOut).
+ description: More information about the internal APIC class B(fv:RsCons), B(fv:RsProv), B(fv:RsProtBy, B(fv:RsConsIf, and B(fv:RsIntraEpg).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Sudhakar Shet Kudtarkar (@kudtarkar1)
- Shreyas Srish (@shrsr)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -234,38 +247,23 @@ RETURN = r"""
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
-
-ACI_CLASS_MAPPING = dict(
- consumer={
- "class": "fvRsCons",
- "rn": "rscons-",
- },
- provider={
- "class": "fvRsProv",
- "rn": "rsprov-",
- },
-)
-
-PROVIDER_MATCH_MAPPING = dict(
- all="All",
- at_least_one="AtleastOne",
- at_most_one="tmostOne",
- none="None",
-)
+from ansible_collections.cisco.aci.plugins.module_utils.constants import ACI_CLASS_MAPPING, CONTRACT_LABEL_MAPPING, PROVIDER_MATCH_MAPPING, SUBJ_LABEL_MAPPING
def main():
argument_spec = aci_argument_spec()
argument_spec.update(aci_annotation_spec())
argument_spec.update(
- contract_type=dict(type="str", required=True, choices=["consumer", "provider"]),
+ contract_type=dict(type="str", required=True, choices=["consumer", "provider", "taboo", "interface", "intra_epg"]),
l3out=dict(type="str", aliases=["l3out_name"]),
- contract=dict(type="str"),
- priority=dict(type="str", choices=["level1", "level2", "level3", "unspecified"]),
+ contract=dict(type="str", aliases=["contract_name", "contract_interface"]), # Not required for querying all objects
+ priority=dict(type="str", choices=["level1", "level2", "level3", "level4", "level5", "level6", "unspecified"]),
provider_match=dict(type="str", choices=["all", "at_least_one", "at_most_one", "none"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
tenant=dict(type="str"),
extepg=dict(type="str", aliases=["extepg_name", "external_epg"]),
+ contract_label=dict(type="str"),
+ subject_label=dict(type="str"),
)
module = AnsibleModule(
argument_spec=argument_spec,
@@ -286,13 +284,25 @@ def main():
provider_match = PROVIDER_MATCH_MAPPING.get(provider_match)
state = module.params.get("state")
tenant = module.params.get("tenant")
+ contract_label = module.params.get("contract_label")
+ subject_label = module.params.get("subject_label")
- aci_class = ACI_CLASS_MAPPING.get(contract_type)["class"]
- aci_rn = ACI_CLASS_MAPPING.get(contract_type)["rn"]
+ aci_class = ACI_CLASS_MAPPING[contract_type]["class"]
+ aci_rn = ACI_CLASS_MAPPING[contract_type]["rn"]
+ aci_name = ACI_CLASS_MAPPING[contract_type]["name"]
+ child_classes = []
- if contract_type == "consumer" and provider_match is not None:
+ if contract_type != "provider" and provider_match is not None:
module.fail_json(msg="the 'provider_match' is only configurable for Provided Contracts")
+ if contract_type in ["taboo", "interface", "intra_epg"] and (contract_label is not None or subject_label is not None):
+ module.fail_json(msg="the 'contract_label' and 'subject_label' are not configurable for {0} contracts".format(contract_type))
+
+ if contract_type not in ["taboo", "interface", "intra_epg"]:
+ contract_label_class = CONTRACT_LABEL_MAPPING.get(contract_type)
+ subject_label_class = SUBJ_LABEL_MAPPING.get(contract_type)
+ child_classes = [subject_label_class, contract_label_class]
+
aci = ACIModule(module)
aci.construct_url(
root_class=dict(
@@ -317,20 +327,23 @@ def main():
aci_class=aci_class,
aci_rn="{0}{1}".format(aci_rn, contract),
module_object=contract,
- target_filter={"tnVzBrCPName": contract},
+ target_filter={aci_name: contract},
),
+ child_classes=child_classes,
)
aci.get_existing()
if state == "present":
+ child_configs = []
+ if contract_label is not None:
+ child_configs.append({contract_label_class: {"attributes": {"name": contract_label}}})
+ if subject_label is not None:
+ child_configs.append({subject_label_class: {"attributes": {"name": subject_label}}})
aci.payload(
aci_class=aci_class,
- class_config=dict(
- matchT=provider_match,
- prio=priority,
- tnVzBrCPName=contract,
- ),
+ class_config={"matchT": provider_match, "prio": priority, aci_name: contract},
+ child_configs=child_configs,
)
aci.get_diff(aci_class=aci_class)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extsubnet.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extsubnet.py
index 6ecb3b27c..9d94ee44f 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extsubnet.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_extsubnet.py
@@ -12,9 +12,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_l3out_extsubnet
-short_description: Manage External Subnet objects (l3extSubnet:extsubnet)
+short_description: Manage External Subnet objects (l3ext:Subnet)
description:
-- Manage External Subnet objects (l3extSubnet:extsubnet)
+- Manage External Subnet objects.
options:
tenant:
description:
@@ -99,7 +99,7 @@ seealso:
- module: cisco.aci.aci_domain
- module: cisco.aci.aci_vrf
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(l3ext:Out).
+ description: More information about the internal APIC class B(l3ext:Subnet).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Rostyslav Davydenko (@rost-d)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi.py
new file mode 100644
index 000000000..b0e3ca7e3
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi.py
@@ -0,0 +1,475 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_floating_svi
+short_description: Manage Layer 3 Outside (L3Out) interfaces (l3ext:VirtualLIfP)
+description:
+- Manage L3Out interfaces on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ required: true
+ l3out:
+ description:
+ - Name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ required: true
+ node_profile:
+ description:
+ - Name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ required: true
+ interface_profile:
+ description:
+ - Name of the interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ required: true
+ pod_id:
+ description:
+ - Pod ID to build the interface on.
+ type: str
+ node_id:
+ description:
+ - Node ID to build the interface on for Port-channels and single ports.
+ type: str
+ encap:
+ description:
+ - Encapsulation on the interface (e.g. "vlan-500")
+ type: str
+ encap_scope:
+ description:
+ - Encapsulation scope.
+ choices: [ vrf, local ]
+ type: str
+ address:
+ description:
+ - IP address.
+ type: str
+ aliases: [ addr, ip_address ]
+ mac_address:
+ description:
+ - The MAC address option of the interface.
+ type: str
+ link_local_address:
+ description:
+ - The link local address option of the interface.
+ type: str
+ mtu:
+ description:
+ - Interface MTU.
+ type: str
+ ipv6_dad:
+ description:
+ - IPv6 Duplicate Address Detection (DAD) feature.
+ type: str
+ choices: [ enabled, disabled]
+ mode:
+ description:
+ - The mode option for ext-svi interface.
+ type: str
+ choices: [ regular, native, untagged ]
+ dscp:
+ description:
+ - The target Differentiated Service (DSCP) value.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ choices: [ AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, EF, VA, unspecified ]
+ aliases: [ target_dscp ]
+ external_bridge_group_profile:
+ description:
+ - The external bridge group profile.
+ - Pass "" as the value to remove an existing external bridge group profile (See Examples).
+ - This is only supported in APIC v5.0 and above.
+ type: str
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ auto_state:
+ description:
+ - SVI auto state.
+ type: str
+ choices: [ enabled, disabled ]
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant), C(l3out), C(logical_node_profile) and C(logical_interface_profile) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile), M(cisco.aci.aci_l3out_logical_interface_profile) \
+ modules can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(l3ext:VirtualLIfP)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Create a Floating SVI
+ cisco.aci.aci_l3out_floating_svi:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ address: 23.45.67.90/24
+ external_bridge_group_profile: bridge1
+ state: present
+ delegate_to: localhost
+
+- name: Remove an external bridge group profile
+ cisco.aci.aci_l3out_floating_svi:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ address: 23.45.67.90/24
+ external_bridge_group_profile: ""
+ state: present
+ delegate_to: localhost
+
+- name: Remove a Floating SVI
+ cisco.aci.aci_l3out_floating_svi:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ state: absent
+ delegate_to: localhost
+
+- name: Query a Floating SVI
+ cisco.aci.aci_l3out_floating_svi:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all the Floating SVIs under an interface profile
+ cisco.aci.aci_l3out_floating_svi:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ state: query
+ delegate_to: localhost
+ register: query_results
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_contract_dscp_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"], required=True),
+ l3out=dict(type="str", aliases=["l3out_name"], required=True),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"], required=True),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"], required=True),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ pod_id=dict(type="str"),
+ node_id=dict(type="str"),
+ address=dict(type="str", aliases=["addr", "ip_address"]),
+ link_local_address=dict(type="str"),
+ mac_address=dict(type="str"),
+ mtu=dict(type="str"),
+ ipv6_dad=dict(type="str", choices=["enabled", "disabled"]),
+ mode=dict(type="str", choices=["regular", "native", "untagged"]),
+ encap=dict(type="str"),
+ encap_scope=dict(type="str", choices=["vrf", "local"]),
+ auto_state=dict(type="str", choices=["enabled", "disabled"]),
+ external_bridge_group_profile=dict(type="str"),
+ dscp=aci_contract_dscp_spec(direction="dscp"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "present", ["pod_id", "node_id", "encap", "address"]],
+ ["state", "absent", ["pod_id", "node_id", "encap"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ state = module.params.get("state")
+ pod_id = module.params.get("pod_id")
+ node_id = module.params.get("node_id")
+ address = module.params.get("address")
+ mtu = module.params.get("mtu")
+ ipv6_dad = module.params.get("ipv6_dad")
+ link_local_address = module.params.get("link_local_address")
+ mac_address = module.params.get("mac_address")
+ mode = module.params.get("mode")
+ encap = module.params.get("encap")
+ encap_scope = "ctx" if module.params.get("encap_scope") == "vrf" else module.params.get("encap_scope")
+ auto_state = module.params.get("auto_state")
+ external_bridge_group_profile = module.params.get("external_bridge_group_profile")
+
+ aci = ACIModule(module)
+
+ node_dn = None
+ if pod_id and node_id:
+ node_dn = "topology/pod-{0}/node-{1}".format(pod_id, node_id)
+
+ child_classes = []
+ if external_bridge_group_profile is not None:
+ child_classes.append("l3extBdProfileCont")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-{0}".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="l3extVirtualLIfP", aci_rn="vlifp-[{0}]-[{1}]".format(node_dn, encap), module_object=node_dn, target_filter={"nodeDn": node_dn}
+ ),
+ child_classes=child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ if external_bridge_group_profile is not None:
+ if external_bridge_group_profile == "" and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ if aci.existing[0].get("l3extVirtualLIfP", {}).get("children") is not None:
+ child_configs.append(
+ dict(
+ l3extBdProfileCont=dict(
+ attributes=dict(status="deleted"),
+ ),
+ )
+ )
+ elif external_bridge_group_profile != "":
+ child_configs.append(
+ dict(
+ l3extBdProfileCont=dict(
+ attributes=dict(),
+ children=[
+ dict(
+ l3extRsBdProfile=dict(
+ attributes=dict(
+ tDn="uni/tn-{0}/bdprofile-{1}".format(tenant, external_bridge_group_profile),
+ ),
+ )
+ )
+ ],
+ )
+ )
+ )
+
+ aci.payload(
+ aci_class="l3extVirtualLIfP",
+ class_config=dict(
+ addr=address,
+ ipv6Dad=ipv6_dad,
+ mtu=mtu,
+ ifInstT="ext-svi",
+ mode=mode,
+ encap=encap,
+ encapScope=encap_scope,
+ autostate=auto_state,
+ llAddr=link_local_address,
+ mac=mac_address,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="l3extVirtualLIfP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path.py
new file mode 100644
index 000000000..3d7c45a33
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path.py
@@ -0,0 +1,491 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_floating_svi_path
+short_description: Manage Layer 3 Outside (L3Out) Floating SVI Path Attributes (l3ext:RsDynPathAtt)
+description:
+- Manages L3Out Floating SVI path attributes on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ required: true
+ l3out:
+ description:
+ - Name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ required: true
+ node_profile:
+ description:
+ - Name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ required: true
+ interface_profile:
+ description:
+ - Name of the interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ required: true
+ pod_id:
+ description:
+ - Pod to build the interface on.
+ type: str
+ required: true
+ node_id:
+ description:
+ - Node to build the interface on for Port-channels and single ports.
+ type: str
+ required: true
+ encap:
+ description:
+ - Encapsulation on the interface (e.g. "vlan-500")
+ type: str
+ required: true
+ domain:
+ description:
+ - This option allows virtual machines to send frames with a mac address.
+ type: str
+ domain_type:
+ description:
+ - The domain type of the path.
+ - The physical domain type is only supported in APIC v5.0 and above.
+ type: str
+ choices: [ physical, vmware ]
+ access_encap:
+ description:
+ - The port encapsulation option.
+ type: str
+ floating_ip:
+ description:
+ - The floating IP address.
+ type: str
+ aliases: [ floating_address ]
+ forged_transmit:
+ description:
+ - This option allows virtual machines to send frames with a mac address.
+ - This is only supported in APIC v5.0 and above.
+ type: str
+ choices: [ enabled, disabled ]
+ mac_change:
+ description:
+ - The status of the mac address change support for port groups in an external VMM controller.
+ - This is only supported in APIC v5.0 and above.
+ type: str
+ choices: [ enabled, disabled ]
+ promiscuous_mode:
+ description:
+ - The status of promiscuous mode for port groups in an external VMM controller.
+ - This is only supported in APIC v5.0 and above.
+ type: str
+ choices: [ enabled, disabled ]
+ enhanced_lag_policy:
+ description:
+ - The enhanced lag policy of the path.
+ - Pass "" as the value to remove an existing enhanced lag policy (See Examples).
+ type: str
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant), C(l3out), C(logical_node_profile), C(logical_interface_profile) and C(floating_svi) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile), M(cisco.aci.aci_l3out_logical_interface_profile) and
+ M(cisco.aci.aci_l3out_floating_svi) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_l3out_floating_svi
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(l3ext:RsDynPathAtt))
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Create a Floating SVI path attribute
+ cisco.aci.aci_l3out_floating_svi_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ floating_ip: 23.45.67.90/24
+ domain_type: virtual
+ domain: anstest
+ enhanced_lag_policy: enhanced
+ state: present
+ delegate_to: localhost
+
+- name: Remove enhanced lag policy from the path
+ cisco.aci.aci_l3out_floating_svi_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ floating_ip: 23.45.67.90/24
+ domain_type: virtual
+ domain: anstest
+ enhanced_lag_policy: ""
+ state: present
+ delegate_to: localhost
+
+- name: Remove a Floating SVI path attribute
+ cisco.aci.aci_l3out_floating_svi_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: virtual
+ domain: anstest
+ state: absent
+ delegate_to: localhost
+
+- name: Query a Floating SVI path attribute
+ cisco.aci.aci_l3out_floating_svi_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: virtual
+ domain: anstest
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all the Floating SVI path attributes
+ cisco.aci.aci_l3out_floating_svi_path:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ state: query
+ delegate_to: localhost
+ register: query_results
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"], required=True),
+ l3out=dict(type="str", aliases=["l3out_name"], required=True),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"], required=True),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"], required=True),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ pod_id=dict(type="str", required=True),
+ node_id=dict(type="str", required=True),
+ encap=dict(type="str", required=True),
+ floating_ip=dict(type="str", aliases=["floating_address"]),
+ forged_transmit=dict(type="str", choices=["enabled", "disabled"]),
+ mac_change=dict(type="str", choices=["enabled", "disabled"]),
+ promiscuous_mode=dict(type="str", choices=["enabled", "disabled"]),
+ domain_type=dict(type="str", choices=["physical", "vmware"]),
+ domain=dict(type="str"),
+ enhanced_lag_policy=dict(type="str"),
+ access_encap=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "present", ["domain_type", "domain", "floating_ip"]],
+ ["state", "absent", ["domain_type", "domain"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ state = module.params.get("state")
+ pod_id = module.params.get("pod_id")
+ node_id = module.params.get("node_id")
+ floating_ip = module.params.get("floating_ip")
+ encap = module.params.get("encap")
+ forged_transmit = module.params.get("forged_transmit").capitalize() if module.params.get("forged_transmit") else None
+ mac_change = module.params.get("mac_change").capitalize() if module.params.get("mac_change") else None
+ promiscuous_mode = module.params.get("promiscuous_mode").capitalize() if module.params.get("promiscuous_mode") else None
+ domain_type = module.params.get("domain_type")
+ domain = module.params.get("domain")
+ enhanced_lag_policy = module.params.get("enhanced_lag_policy")
+ access_encap = module.params.get("access_encap")
+
+ aci = ACIModule(module)
+
+ node_dn = "topology/pod-{0}/node-{1}".format(pod_id, node_id)
+
+ tDn = None
+ if domain_type == "physical":
+ tDn = "uni/phys-{0}".format(domain)
+ elif domain_type == "vmware":
+ tDn = "uni/vmmp-VMware/dom-{0}".format(domain)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-{0}".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="l3extVirtualLIfP", aci_rn="vlifp-[{0}]-[{1}]".format(node_dn, encap), module_object=node_dn, target_filter={"nodeDn": node_dn}
+ ),
+ subclass_5=dict(
+ aci_class="l3extRsDynPathAtt",
+ aci_rn="rsdynPathAtt-[{0}]".format(tDn),
+ module_object=tDn,
+ target_filter={"tDn": tDn},
+ ),
+ child_classes=["l3extVirtualLIfPLagPolAtt"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ if enhanced_lag_policy is not None and domain_type == "vmware":
+ existing_enhanced_lag_policy = ""
+ if isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("l3extRsDynPathAtt", {}).get("children", {}):
+ if child.get("l3extVirtualLIfPLagPolAtt"):
+ try:
+ existing_enhanced_lag_policy = child["l3extVirtualLIfPLagPolAtt"]["children"][0]["l3extRsVSwitchEnhancedLagPol"]["attributes"][
+ "tDn"
+ ].split("enlacplagp-")[1]
+ except (AttributeError, IndexError, KeyError):
+ existing_enhanced_lag_policy = ""
+
+ if enhanced_lag_policy == "":
+ child_configs.append(
+ dict(
+ l3extVirtualLIfPLagPolAtt=dict(
+ attributes=dict(status="deleted"),
+ ),
+ )
+ )
+
+ if enhanced_lag_policy != "":
+ child = [
+ dict(
+ l3extRsVSwitchEnhancedLagPol=dict(
+ attributes=dict(tDn="{0}/vswitchpolcont/enlacplagp-{1}".format(tDn, enhanced_lag_policy)),
+ )
+ ),
+ ]
+ if enhanced_lag_policy != existing_enhanced_lag_policy and existing_enhanced_lag_policy != "":
+ child.append(
+ dict(
+ l3extRsVSwitchEnhancedLagPol=dict(
+ attributes=dict(status="deleted", tDn="{0}/vswitchpolcont/enlacplagp-{1}".format(tDn, existing_enhanced_lag_policy)),
+ )
+ )
+ )
+ child_configs.append(dict(l3extVirtualLIfPLagPolAtt=dict(attributes=dict(), children=child)))
+
+ aci.payload(
+ aci_class="l3extRsDynPathAtt",
+ class_config=dict(
+ floatingAddr=floating_ip,
+ forgedTransmit=forged_transmit,
+ macChange=mac_change,
+ promMode=promiscuous_mode,
+ encap=access_encap,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="l3extRsDynPathAtt")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path_secondary_ip.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path_secondary_ip.py
new file mode 100644
index 000000000..b49c18169
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_path_secondary_ip.py
@@ -0,0 +1,398 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "metadata_version": "1.1",
+ "status": ["preview"],
+ "supported_by": "community",
+}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_floating_svi_path_secondary_ip
+short_description: Manages Layer 3 Outside (L3Out) Floating SVI Path Attribute's Secondary IP addresses (l3ext:Ip)
+description:
+- Manages L3Out Floating SVI path attribute's secondary IP addresses on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ required: true
+ l3out:
+ description:
+ - Name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ required: true
+ node_profile:
+ description:
+ - Name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ required: true
+ interface_profile:
+ description:
+ - Name of the interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ required: true
+ pod_id:
+ description:
+ - Pod to build the interface on.
+ type: str
+ required: true
+ node_id:
+ description:
+ - Node to build the interface on for Port-channels and single ports.
+ type: str
+ required: true
+ encap:
+ description:
+ - Encapsulation on the interface (e.g. "vlan-500")
+ type: str
+ required: true
+ domain:
+ description:
+ - This option allows virtual machines to send frames with a mac address.
+ type: str
+ required: true
+ domain_type:
+ description:
+ - The domain type of the path.
+ type: str
+ choices: [ physical, vmware ]
+ required: true
+ secondary_ip:
+ description:
+ - The secondary floating IP address.
+ type: str
+ aliases: [ secondary_floating_address ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant), C(l3out), C(logical_node_profile), C(logical_interface_profile) and C(floating_svi) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile), M(cisco.aci.aci_l3out_logical_interface_profile), \
+ M(cisco.aci.aci_l3out_floating_svi) and M(cisco.aci.aci_l3out_floating_svi_path) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_l3out_floating_svi
+- module: cisco.aci.aci_l3out_floating_svi_path
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(l3ext:Ip)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Create a Floating SVI path attribute secondary IP
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ secondary_ip: 23.45.67.90/24
+ domain_type: virtual
+ domain: anstest
+ state: present
+ delegate_to: localhost
+
+- name: Remove a Floating SVI path attribute secondary IP
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ secondary_ip: 23.45.67.90/24
+ domain_type: virtual
+ domain: anstest
+ state: absent
+ delegate_to: localhost
+
+- name: Query a Floating SVI path attribute secondary IP
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: virtual
+ domain: anstest
+ secondary_ip: 23.45.67.90/24
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all the secondary IPs under a Floating SVI path attribute
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: virtual
+ domain: anstest
+ state: query
+ delegate_to: localhost
+ register: query_results
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+from ansible.module_utils.basic import AnsibleModule
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"], required=True),
+ l3out=dict(type="str", aliases=["l3out_name"], required=True),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"], required=True),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"], required=True),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ pod_id=dict(type="str", required=True),
+ node_id=dict(type="str", required=True),
+ encap=dict(type="str", required=True),
+ domain_type=dict(type="str", choices=["physical", "vmware"], required=True),
+ domain=dict(type="str", required=True),
+ secondary_ip=dict(type="str", aliases=["secondary_floating_address"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["secondary_ip"]],
+ ["state", "present", ["secondary_ip"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ pod_id = module.params.get("pod_id")
+ node_id = module.params.get("node_id")
+ encap = module.params.get("encap")
+ secondary_ip = module.params.get("secondary_ip")
+ domain_type = module.params.get("domain_type")
+ domain = module.params.get("domain")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ node_dn = "topology/pod-{0}/node-{1}".format(pod_id, node_id)
+
+ tDn = None
+ if domain_type == "physical":
+ tDn = "uni/phys-{0}".format(domain)
+ else:
+ tDn = "uni/vmmp-VMware/dom-{0}".format(domain)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-{0}".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="l3extVirtualLIfP", aci_rn="vlifp-[{0}]-[{1}]".format(node_dn, encap), module_object=node_dn, target_filter={"nodeDn": node_dn}
+ ),
+ subclass_5=dict(
+ aci_class="l3extRsDynPathAtt",
+ aci_rn="rsdynPathAtt-[{0}]".format(tDn),
+ module_object=tDn,
+ target_filter={"tDn": tDn},
+ ),
+ subclass_6=dict(
+ aci_class="l3extIp",
+ aci_rn="addr-[{0}]".format(secondary_ip),
+ module_object=secondary_ip,
+ target_filter={"addr": secondary_ip},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(aci_class="l3extIp", class_config=dict(addr=secondary_ip, ipv6Dad="disabled"))
+
+ aci.get_diff(aci_class="l3extIp")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_secondary_ip.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_secondary_ip.py
new file mode 100644
index 000000000..ea71376dd
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_floating_svi_secondary_ip.py
@@ -0,0 +1,362 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "metadata_version": "1.1",
+ "status": ["preview"],
+ "supported_by": "community",
+}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_floating_svi_secondary_ip
+short_description: Manages Layer 3 Outside (L3Out) Floating SVI Secondary IP addresses (l3ext:Ip)
+description:
+- Manages L3Out Floating SVI secondary IP addresses on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ required: true
+ l3out:
+ description:
+ - Name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ required: true
+ node_profile:
+ description:
+ - Name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ required: true
+ interface_profile:
+ description:
+ - Name of the interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ required: true
+ pod_id:
+ description:
+ - Pod to build the interface on.
+ type: str
+ required: true
+ node_id:
+ description:
+ - Node to build the interface on for Port-channels and single ports.
+ type: str
+ required: true
+ encap:
+ description:
+ - Encapsulation on the interface (e.g. "vlan-500")
+ type: str
+ required: true
+ secondary_ip:
+ description:
+ - The secondary floating IP address.
+ type: str
+ aliases: [ secondary_floating_address ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- The C(tenant), C(l3out), C(logical_node_profile), C(logical_interface_profile) and C(floating_svi) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile), M(cisco.aci.aci_l3out_logical_interface_profile) and \
+ M(cisco.aci.aci_l3out_floating_svi) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_l3out_floating_svi
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(l3ext:Ip)
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Create a Floating SVI secondary IP
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ secondary_ip: 23.45.67.90/24
+ state: present
+ delegate_to: localhost
+
+- name: Remove a Floating SVI secondary IP
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ secondary_ip: 23.45.67.90/24
+ state: absent
+ delegate_to: localhost
+
+- name: Query a Floating SVI secondary IP
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ secondary_ip: 23.45.67.90/24
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all the secondary IPs under a Floating SVI
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ state: query
+ delegate_to: localhost
+ register: query_results
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+from ansible.module_utils.basic import AnsibleModule
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"], required=True),
+ l3out=dict(type="str", aliases=["l3out_name"], required=True),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"], required=True),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"], required=True),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ pod_id=dict(type="str", required=True),
+ node_id=dict(type="str", required=True),
+ encap=dict(type="str", required=True),
+ secondary_ip=dict(type="str", aliases=["secondary_floating_address"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["secondary_ip"]],
+ ["state", "present", ["secondary_ip"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ pod_id = module.params.get("pod_id")
+ node_id = module.params.get("node_id")
+ encap = module.params.get("encap")
+ secondary_ip = module.params.get("secondary_ip")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ node_dn = "topology/pod-{0}/node-{1}".format(pod_id, node_id)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-{0}".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="l3extVirtualLIfP", aci_rn="vlifp-[{0}]-[{1}]".format(node_dn, encap), module_object=node_dn, target_filter={"nodeDn": node_dn}
+ ),
+ subclass_5=dict(
+ aci_class="l3extIp",
+ aci_rn="addr-[{0}]".format(secondary_ip),
+ module_object=secondary_ip,
+ target_filter={"addr": secondary_ip},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(aci_class="l3extIp", class_config=dict(addr=secondary_ip, ipv6Dad="enabled"))
+
+ aci.get_diff(aci_class="l3extIp")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_group.py
new file mode 100644
index 000000000..c6f7316b2
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_group.py
@@ -0,0 +1,393 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish (@shrsr) <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_hsrp_group
+short_description: Manage HSRP group (hsrp:GroupP) of the HSRP interface profile (hsrp:IfP)
+description:
+- Manage HSRP group of the HSRP interface profile on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - Name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ node_profile:
+ description:
+ - Name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ interface_profile:
+ description:
+ - Name of an existing interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ hsrp_interface_group:
+ description:
+ - Name of the HSRP interface group.
+ type: str
+ aliases: [ name, hsrp_group ]
+ group_id:
+ description:
+ - The group id of the HSRP interface group.
+ type: int
+ ip:
+ description:
+ - The virtual IP address of the HSRP interface group.
+ type: str
+ mac:
+ description:
+ - The MAC address of the HSRP interface group.
+ type: str
+ group_name:
+ description:
+ - The group name is used to define and manage the specific HSRP interface group, facilitating high availability in the network.
+ type: str
+ description:
+ description:
+ - The description of the HSRP interface group.
+ type: str
+ aliases: [ descr ]
+ group_type:
+ description:
+ - The type of the HSRP interface group.
+ type: str
+ choices: [ ipv4, ipv6 ]
+ ip_obtain_mode:
+ description:
+ - The mode of method used to obtain the IP address.
+ type: str
+ choices: [ admin, auto, learn ]
+ group_policy:
+ description:
+ - The group policy of the HSRP interface group.
+ type: str
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant), C(l3out), C(logical_node_profile), C(logical_interface_profile) and C(hsrp_interface_profile) must exist before using this module in
+ your playbook. The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile),
+ M(cisco.aci.aci_l3out_logical_interface_profile) and M(cisco.aci.aci_l3out_hsrp_interface_profile) can be used for this.
+seealso:
+- module: aci_tenant
+- module: aci_l3out
+- module: aci_l3out_logical_node_profile
+- module: aci_l3out_logical_interface_profile
+- module: aci_l3out_hsrp_interface_profile
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(hsrp:IfP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Add a new HSRP group
+ cisco.aci.aci_l3out_hsrp_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_interface_group: group1
+ ip: 12.34.56.32
+ group_type: ipv4
+ ip_obtain_mode: admin
+ group_policy: default
+ state: present
+ delegate_to: localhost
+
+- name: Delete a HSRP group
+ cisco.aci.aci_l3out_hsrp_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_interface_group: group1
+ ip: 12.34.56.32
+ group_type: ipv4
+ ip_obtain_mode: admin
+ group_policy: default
+ state: absent
+ delegate_to: localhost
+
+- name: Query a HSRP group
+ cisco.aci.aci_l3out_hsrp_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_interface_group: group1
+ ip: 12.34.56.32
+ group_type: ipv4
+ ip_obtain_mode: admin
+ group_policy: default
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all HSRP groups
+ cisco.aci.aci_l3out_hsrp_group:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"]),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"]),
+ hsrp_interface_group=dict(type="str", aliases=["name", "hsrp_group"]),
+ group_id=dict(type="int"),
+ ip=dict(type="str"),
+ mac=dict(type="str"),
+ group_name=dict(type="str"),
+ description=dict(type="str", aliases=["descr"]),
+ group_type=dict(type="str", choices=["ipv4", "ipv6"]),
+ ip_obtain_mode=dict(type="str", choices=["admin", "auto", "learn"]),
+ group_policy=dict(type="str"),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "l3out", "node_profile", "interface_profile", "hsrp_interface_group"]],
+ ["state", "present", ["tenant", "l3out", "node_profile", "interface_profile", "hsrp_interface_group"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ hsrp_interface_group = module.params.get("hsrp_interface_group")
+ group_id = module.params.get("group_id")
+ ip = module.params.get("ip")
+ mac = module.params.get("mac")
+ group_name = module.params.get("group_name")
+ description = module.params.get("description")
+ group_type = module.params.get("group_type")
+ ip_obtain_mode = module.params.get("ip_obtain_mode")
+ group_policy = module.params.get("group_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-[{0}]".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="hsrpIfP",
+ aci_rn="hsrpIfP",
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_5=dict(
+ aci_class="hsrpGroupP",
+ aci_rn="hsrpGroupP-{0}".format(hsrp_interface_group),
+ module_object=hsrp_interface_group,
+ target_filter={"name": hsrp_interface_group},
+ ),
+ child_classes=["hsrpRsGroupPol"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="hsrpGroupP",
+ class_config=dict(groupAf=group_type, groupId=group_id, groupName=group_name, ip=ip, ipObtainMode=ip_obtain_mode, mac=mac, descr=description),
+ child_configs=[dict(hsrpRsGroupPol=dict(attributes=dict(tnHsrpGroupPolName=group_policy)))] if group_policy is not None else [],
+ )
+
+ aci.get_diff(aci_class="hsrpGroupP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_interface_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_interface_profile.py
new file mode 100644
index 000000000..634a7f2f5
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_interface_profile.py
@@ -0,0 +1,320 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish (@shrsr) <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_hsrp_interface_profile
+short_description: Manages Layer 3 Outside (L3Out) HSRP interface profile (hsrp:IfP)
+description:
+- Manages L3Out HSRP interface profile on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - Name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ node_profile:
+ description:
+ - Name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ interface_profile:
+ description:
+ - Name of an existing interface profile.
+ type: str
+ aliases: [ interface_profile_name, logical_interface ]
+ hsrp_policy:
+ description:
+ - Name of an existing HSRP interface policy.
+ type: str
+ aliases: [ name, hsrp_policy_name ]
+ version:
+ description:
+ - The version of the compatibility catalog.
+ type: str
+ choices: [ v1, v2 ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant), C(l3out), C(logical_node_profile) and C(logical_interface_profile) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile) and M(cisco.aci.aci_l3out_logical_interface_profile)
+ can be used for this.
+- If C(hsrp_policy) is used, it must exist before using this module in your playbook.
+ The M(cisco.aci.aci_interface_policy_hsrp) can be used for this.
+seealso:
+- module: aci_tenant
+- module: aci_l3out
+- module: aci_l3out_logical_node_profile
+- module: aci_l3out_logical_interface_profile
+- module: aci_interface_policy_hsrp
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(hsrp:IfP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Add a new HSRP interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_policy: default
+ state: present
+ delegate_to: localhost
+
+- name: Delete a HSRP interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_policy: default
+ state: absent
+ delegate_to: localhost
+
+- name: Query a HSRP interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_policy: default
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"]),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"]),
+ hsrp_policy=dict(type="str", aliases=["name", "hsrp_policy_name"]),
+ version=dict(type="str", choices=["v1", "v2"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "l3out", "node_profile", "interface_profile"]],
+ ["state", "present", ["tenant", "l3out", "node_profile", "interface_profile"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ hsrp_policy = module.params.get("hsrp_policy")
+ version = module.params.get("version")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-[{0}]".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="hsrpIfP",
+ aci_rn="hsrpIfP",
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ child_classes=["hsrpRsIfPol"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ if hsrp_policy is not None:
+ child_configs = [dict(hsrpRsIfPol=dict(attributes=dict(tnHsrpIfPolName=hsrp_policy)))]
+
+ aci.payload(aci_class="hsrpIfP", class_config=dict(version=version), child_configs=child_configs)
+
+ aci.get_diff(aci_class="hsrpIfP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_secondary_vip.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_secondary_vip.py
new file mode 100644
index 000000000..c9902ba76
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_hsrp_secondary_vip.py
@@ -0,0 +1,344 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Shreyas Srish (@shrsr) <ssrish@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_hsrp_secondary_vip
+short_description: Manage HSRP Secondary Virtual IP of a HSRP group (hsrp:SecVip)
+description:
+- Manage HSRP Secondary Virtual IP of a HSRP group on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - Name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - Name of an existing L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ node_profile:
+ description:
+ - Name of the node profile.
+ type: str
+ aliases: [ node_profile_name, logical_node ]
+ interface_profile:
+ description:
+ - Name of an existing interface profile.
+ type: str
+ aliases: [ name, interface_profile_name, logical_interface ]
+ hsrp_interface_group:
+ description:
+ - Name of an existing HSRP group.
+ type: str
+ aliases: [ name, hsrp_group ]
+ secondary_virtual_ip:
+ description:
+ - The version of the compatibility catalog.
+ type: str
+ aliases: [ vip, secondary_vip ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant), C(l3out), C(logical_node_profile), C(logical_interface_profile), C(hsrp_interface_profile) and C(hsrp_group) must exist before using
+ this module in your playbook. The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile),
+ M(cisco.aci.aci_l3out_logical_interface_profile), M(cisco.aci.aci_l3out_hsrp_interface_profile) and M(cisco.aci.aci_l3out_hsrp_group) can be used for
+ this.
+seealso:
+- module: aci_tenant
+- module: aci_l3out
+- module: aci_l3out_logical_node_profile
+- module: aci_l3out_logical_interface_profile
+- module: aci_l3out_hsrp_interface_profile
+- module: aci_l3out_hsrp_group
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(hsrp:SecVip).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Shreyas Srish (@shrsr)
+"""
+
+EXAMPLES = r"""
+- name: Add a HSRP secondary virtual ip
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_group: my_hsrp_group
+ secondary_virtual_ip: 191.1.1.1
+ state: present
+ delegate_to: localhost
+
+- name: Delete a HSRP secondary virtual ip
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_group: my_hsrp_interface_group
+ secondary_virtual_ip: 191.1.1.1
+ state: absent
+ delegate_to: localhost
+
+- name: Query a HSRP secondary virtual ip
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_group: my_hsrp_group
+ secondary_virtual_ip: 191.1.1.1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all HSRP secondary virtual ips
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ hsrp_group: my_hsrp_group
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"]),
+ interface_profile=dict(type="str", aliases=["interface_profile_name", "logical_interface"]),
+ hsrp_interface_group=dict(type="str", aliases=["name", "hsrp_group"]),
+ secondary_virtual_ip=dict(type="str", aliases=["vip", "secondary_vip"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "l3out", "node_profile", "interface_profile", "hsrp_interface_group", "secondary_virtual_ip"]],
+ ["state", "present", ["tenant", "l3out", "node_profile", "interface_profile", "hsrp_interface_group", "secondary_virtual_ip"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ node_profile = module.params.get("node_profile")
+ interface_profile = module.params.get("interface_profile")
+ hsrp_interface_group = module.params.get("hsrp_interface_group")
+ secondary_virtual_ip = module.params.get("secondary_virtual_ip")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extLNodeP",
+ aci_rn="lnodep-{0}".format(node_profile),
+ module_object=node_profile,
+ target_filter={"name": node_profile},
+ ),
+ subclass_3=dict(
+ aci_class="l3extLIfP",
+ aci_rn="lifp-[{0}]".format(interface_profile),
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_4=dict(
+ aci_class="hsrpIfP",
+ aci_rn="hsrpIfP",
+ module_object=interface_profile,
+ target_filter={"name": interface_profile},
+ ),
+ subclass_5=dict(
+ aci_class="hsrpGroupP",
+ aci_rn="hsrpGroupP-{0}".format(hsrp_interface_group),
+ module_object=hsrp_interface_group,
+ target_filter={"name": hsrp_interface_group},
+ ),
+ subclass_6=dict(
+ aci_class="hsrpSecVip",
+ aci_rn="hsrpSecVip-[{0}]".format(secondary_virtual_ip),
+ module_object=secondary_virtual_ip,
+ target_filter={"ip": secondary_virtual_ip},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(aci_class="hsrpSecVip", class_config=dict(ip=secondary_virtual_ip))
+
+ aci.get_diff(aci_class="hsrpSecVip")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface.py
index f9a43b012..1f8b86070 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface.py
@@ -1,6 +1,8 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2021, Tim Cragg (@timcragg)
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -51,14 +53,19 @@ options:
type: str
path_ep:
description:
- - Path to interface
- - Interface Policy Group name for Port-channels and vPCs
- - Port number for single ports (e.g. "eth1/12")
+ - Path to interface.
+ - Interface Policy Group name for Port-channels and vPCs.
+ - Port number for single ports (e.g. "eth1/12").
type: str
encap:
description:
- - encapsulation on the interface (e.g. "vlan-500")
+ - The encapsulation on the interface (e.g. "vlan-500").
type: str
+ encap_scope:
+ description:
+ - The scope of the encapsulation on the interface.
+ type: str
+ choices: [ vrf, local ]
address:
description:
- IP address.
@@ -80,7 +87,7 @@ options:
choices: [ l3-port, sub-interface, ext-svi ]
mode:
description:
- - Interface mode, only used if instance_type is ext-svi
+ - Interface mode, only used if instance_type is ext-svi.
type: str
choices: [ regular, native, untagged ]
state:
@@ -95,19 +102,51 @@ options:
- SVI auto state.
type: str
choices: [ enabled, disabled ]
+ description:
+ description:
+ - The description of the interface.
+ type: str
+ aliases: [ descr]
+ mac:
+ description:
+ - The MAC address of the interface.
+ type: str
+ aliases: [ mac_address ]
+ micro_bfd:
+ description:
+ - Enable micro BFD on the interface.
+ - Micro BFD should only be configured on Infra SR-MPLS L3Outs Direct Port Channel Interfaces.
+ type: bool
+ micro_bfd_destination:
+ description:
+ - The micro BFD destination address of the interface.
+ type: str
+ aliases: [ micro_bfd_address, micro_bfd_destination_address ]
+ micro_bfd_timer:
+ description:
+ - The micro BFD start timer in seconds.
+ - The APIC defaults to C(0) when unset during creation.
+ type: int
+ aliases: [ micro_bfd_start_timer, micro_bfd_start ]
extends_documentation_fragment:
- cisco.aci.aci
- cisco.aci.annotation
+notes:
+- The C(tenant), C(l3out), C(node_profile) and the C(interface_profile) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile) and
+ M(cisco.aci.aci_l3out_logical_interface_profile) can be used for this.
seealso:
+- module: aci_tenant
- module: aci_l3out
- module: aci_l3out_logical_node_profile
+- module: aci_l3out_logical_interface_profile
- name: APIC Management Information Model reference
description: More information about the internal APIC class B(l3ext:RsPathL3OutAtt)
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
-- Marcel Zehnder (@maercu)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -146,6 +185,25 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
+- name: Add direct port channel interface in the infra SR-MPLS l3out interface profile with micro BFD enabled
+ aci_l3out_interface:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: infra
+ l3out: ansible_infra_sr_mpls_l3out
+ interface_profile: ansible_infra_sr_mpls_l3out_interface_profile
+ pod_id: 1
+ node_id: 101
+ path_ep: pc_ansible_test
+ interface_type: l3-port
+ addr: 192.168.90.1/24
+ micro_bfd: true
+ micro_bfd_destination: 192.168.90.2
+ micro_bfd_timer: 75
+ state: present
+ delegate_to: localhost
+
- name: Delete an interface
cisco.aci.aci_l3out_interface:
host: apic
@@ -307,15 +365,28 @@ def main():
interface_type=dict(type="str", choices=["l3-port", "sub-interface", "ext-svi"]),
mode=dict(type="str", choices=["regular", "native", "untagged"]),
encap=dict(type="str"),
+ encap_scope=dict(type="str", choices=["vrf", "local"]),
auto_state=dict(type="str", choices=["enabled", "disabled"]),
+ description=dict(type="str", aliases=["descr"]),
+ mac=dict(type="str", aliases=["mac_address"]),
+ micro_bfd=dict(type="bool"),
+ micro_bfd_destination=dict(type="str", aliases=["micro_bfd_address", "micro_bfd_destination_address"]),
+ micro_bfd_timer=dict(type="int", aliases=["micro_bfd_start_timer", "micro_bfd_start"]),
)
module = AnsibleModule(
argument_spec=argument_spec,
supports_check_mode=True,
- required_if=[["state", "present", ["interface_type", "pod_id", "node_id", "path_ep"]], ["state", "absent", ["pod_id", "node_id", "path_ep"]]],
+ required_if=[
+ ["state", "present", ["interface_type", "pod_id", "node_id", "path_ep"]],
+ ["state", "absent", ["pod_id", "node_id", "path_ep"]],
+ ["micro_bfd", True, ["micro_bfd_destination"]],
+ ],
+ required_by={"micro_bfd_timer": "micro_bfd", "micro_bfd_destination": "micro_bfd"},
)
+ aci = ACIModule(module)
+
tenant = module.params.get("tenant")
l3out = module.params.get("l3out")
node_profile = module.params.get("node_profile")
@@ -330,9 +401,14 @@ def main():
interface_type = module.params.get("interface_type")
mode = module.params.get("mode")
encap = module.params.get("encap")
+ encap_scope = module.params.get("encap_scope")
auto_state = module.params.get("auto_state")
+ description = module.params.get("description")
+ mac = module.params.get("mac")
+ micro_bfd = aci.boolean(module.params.get("micro_bfd"))
+ micro_bfd_destination = module.params.get("micro_bfd_destination")
+ micro_bfd_timer = module.params.get("micro_bfd_timer")
- aci = ACIModule(module)
if node_id and "-" in node_id:
path_type = "protpaths"
else:
@@ -342,6 +418,12 @@ def main():
if pod_id and node_id and path_ep:
path_dn = "topology/pod-{0}/{1}-{2}/pathep-[{3}]".format(pod_id, path_type, node_id, path_ep)
+ child_classes = []
+ child_configs = []
+ if micro_bfd is not None:
+ child_classes.append("bfdMicroBfdP")
+ child_configs.append(dict(bfdMicroBfdP=dict(attributes=dict(adminState=micro_bfd, dst=micro_bfd_destination, stTm=micro_bfd_timer))))
+
aci.construct_url(
root_class=dict(
aci_class="fvTenant",
@@ -367,7 +449,13 @@ def main():
module_object=interface_profile,
target_filter={"name": interface_profile},
),
- subclass_4=dict(aci_class="l3extRsPathL3OutAtt", aci_rn="rspathL3OutAtt-[{0}]".format(path_dn), module_object=path_dn, target_filter={"tDn": path_dn}),
+ subclass_4=dict(
+ aci_class="l3extRsPathL3OutAtt",
+ aci_rn="rspathL3OutAtt-[{0}]".format(path_dn),
+ module_object=path_dn,
+ target_filter={"tDn": path_dn},
+ ),
+ child_classes=child_classes,
)
aci.get_existing()
@@ -375,7 +463,20 @@ def main():
if state == "present":
aci.payload(
aci_class="l3extRsPathL3OutAtt",
- class_config=dict(tDn=path_dn, addr=address, ipv6Dad=ipv6_dad, mtu=mtu, ifInstT=interface_type, mode=mode, encap=encap, autostate=auto_state),
+ class_config=dict(
+ tDn=path_dn,
+ addr=address,
+ ipv6Dad=ipv6_dad,
+ mtu=mtu,
+ ifInstT=interface_type,
+ mode=mode,
+ encap=encap,
+ encapScope="ctx" if encap_scope == "vrf" else encap_scope,
+ autostate=auto_state,
+ descr=description,
+ mac=mac,
+ ),
+ child_configs=child_configs,
)
aci.get_diff(aci_class="l3extRsPathL3OutAtt")
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface_secondary_ip.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface_secondary_ip.py
index d8311dad5..e127e1ff6 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface_secondary_ip.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_interface_secondary_ip.py
@@ -16,9 +16,9 @@ ANSIBLE_METADATA = {
DOCUMENTATION = r"""
---
module: aci_l3out_interface_secondary_ip
-short_description: Manage Layer 3 Outside (L3Out) interface secondary IP addresses (l3ext:Ip).
+short_description: Manage Layer 3 Outside (L3Out) interface secondary IP addresses (l3ext:Ip)
description:
-- Manage Layer 3 Outside (L3Out) interface secondary IP addresses (l3ext:Ip).
+- Manage Layer 3 Outside (L3Out) interface secondary IP addresses.
options:
tenant:
description:
@@ -89,7 +89,7 @@ seealso:
- module: aci_l3out_logical_interface_profile
- module: aci_l3out_logical_interface
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(l3ext:RsPathL3OutAtt)
+ description: More information about the internal APIC class B(l3ext:Ip)
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Marcel Zehnder (@maercu)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile.py
index db5890205..cd32ccb5a 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile.py
@@ -1,6 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -18,39 +19,96 @@ description:
options:
tenant:
description:
- - Name of an existing tenant.
+ - The name of an existing tenant.
type: str
aliases: [ tenant_name ]
l3out:
description:
- - Name of an existing L3Out.
+ - The name of an existing L3Out.
type: str
aliases: [ l3out_name ]
node_profile:
description:
- - Name of the node profile.
+ - The name of the node profile.
type: str
aliases: [ node_profile_name, logical_node ]
interface_profile:
description:
- - Name of the interface profile.
+ - The name of the logical interface profile.
type: str
aliases: [ name, interface_profile_name, logical_interface ]
nd_policy:
description:
- - Name of the neighbor discovery interface policy.
+ - The name of the neighbor discovery interface policy.
type: str
- default: ""
egress_dpp_policy:
description:
- - Name of the egress data plane policing policy.
+ - The name of the egress data plane policing policy.
type: str
- default: ""
ingress_dpp_policy:
description:
- - Name of the ingress data plane policing policy.
+ - The name of the ingress data plane policing policy.
type: str
- default: ""
+ qos_priority:
+ description:
+ - The QoS priority class ID.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ choices: [ level1, level2, level3, level4, level5, level6, unspecified ]
+ aliases: [ priority, prio ]
+ qos_custom_policy:
+ description:
+ - The name of the QoS custom policy.
+ type: str
+ aliases: [ qos_custom_policy_name ]
+ pim_v4_interface_profile:
+ description:
+ - The PIM IPv4 interface profile.
+ type: dict
+ suboptions:
+ tenant:
+ description:
+ - The name of the tenant to which the PIM IPv4 interface policy belongs.
+ type: str
+ aliases: [ tenant_name ]
+ pim:
+ description:
+ - The name of the PIM IPv4 interface policy.
+ type: str
+ aliases: [ pim_interface_policy, name ]
+ aliases: [ pim_v4 ]
+ pim_v6_interface_profile:
+ description:
+ - The PIM IPv6 interface profile.
+ type: dict
+ suboptions:
+ tenant:
+ description:
+ - The name of the tenant to which the PIM IPv6 interface policy belongs.
+ type: str
+ aliases: [ tenant_name ]
+ pim:
+ description:
+ - The name of the PIM IPv6 interface policy.
+ type: str
+ aliases: [ pim_interface_policy, name ]
+ aliases: [ pim_v6 ]
+ igmp_interface_profile:
+ description:
+ - The IGMP interface profile.
+ type: dict
+ suboptions:
+ tenant:
+ description:
+ - The name of the tenant to which the IGMP interface policy belongs.
+ type: str
+ aliases: [ tenant_name ]
+ igmp:
+ description:
+ - The name of the IGMP interface policy.
+ type: str
+ aliases: [ igmp_interface_policy, name ]
+ aliases: [ igmp ]
description:
description:
- The description for the logical interface profile.
@@ -68,14 +126,19 @@ extends_documentation_fragment:
- cisco.aci.annotation
- cisco.aci.owner
+notes:
+- The I(tenant), I(l3out) and I(node_profile) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out) and M(cisco.aci.aci_l3out_logical_node_profile) can be used for this.
seealso:
-- module: aci_l3out
-- module: aci_l3out_logical_node_profile
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes
+ description: More information about the internal APIC class B(l3ext:LIfP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Marcel Zehnder (@maercu)
+- Gaspard Micol (@gmicol)
"""
EXAMPLES = r"""
@@ -91,7 +154,7 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
-- name: Delete an interface profile
+- name: Query an interface profile
cisco.aci.aci_l3out_logical_interface_profile:
host: apic
username: admin
@@ -100,30 +163,30 @@ EXAMPLES = r"""
l3out: my_l3out
node_profile: my_node_profile
interface_profile: my_interface_profile
- state: absent
+ state: query
delegate_to: localhost
+ register: query_result
-- name: Query an interface profile
+- name: Query all interface profiles
cisco.aci.aci_l3out_logical_interface_profile:
host: apic
username: admin
password: SomeSecretPassword
- tenant: my_tenant
- l3out: my_l3out
- node_profile: my_node_profile
- interface_profile: my_interface_profile
state: query
delegate_to: localhost
register: query_result
-- name: Query all interface profiles
+- name: Delete an interface profile
cisco.aci.aci_l3out_logical_interface_profile:
host: apic
username: admin
password: SomeSecretPassword
- state: query
+ tenant: my_tenant
+ l3out: my_l3out
+ node_profile: my_node_profile
+ interface_profile: my_interface_profile
+ state: absent
delegate_to: localhost
- register: query_result
"""
RETURN = r"""
@@ -233,7 +296,14 @@ url:
from ansible.module_utils.basic import AnsibleModule
-from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+ pim_interface_profile_spec,
+ igmp_interface_profile_spec,
+)
def main():
@@ -245,9 +315,14 @@ def main():
l3out=dict(type="str", aliases=["l3out_name"]),
node_profile=dict(type="str", aliases=["node_profile_name", "logical_node"]),
interface_profile=dict(type="str", aliases=["name", "interface_profile_name", "logical_interface"]),
- nd_policy=dict(type="str", default=""),
- egress_dpp_policy=dict(type="str", default=""),
- ingress_dpp_policy=dict(type="str", default=""),
+ nd_policy=dict(type="str"),
+ egress_dpp_policy=dict(type="str"),
+ ingress_dpp_policy=dict(type="str"),
+ qos_priority=dict(type="str", choices=["level1", "level2", "level3", "level4", "level5", "level6", "unspecified"], aliases=["priority", "prio"]),
+ qos_custom_policy=dict(type="str", aliases=["qos_custom_policy_name"]),
+ pim_v4_interface_profile=dict(type="dict", options=pim_interface_profile_spec(), aliases=["pim_v4"]),
+ pim_v6_interface_profile=dict(type="dict", options=pim_interface_profile_spec(), aliases=["pim_v6"]),
+ igmp_interface_profile=dict(type="dict", options=igmp_interface_profile_spec(), aliases=["igmp"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
description=dict(type="str", aliases=["descr"]),
)
@@ -268,11 +343,19 @@ def main():
nd_policy = module.params.get("nd_policy")
egress_dpp_policy = module.params.get("egress_dpp_policy")
ingress_dpp_policy = module.params.get("ingress_dpp_policy")
+ qos_priority = module.params.get("qos_priority")
+ qos_custom_policy = module.params.get("qos_custom_policy")
description = module.params.get("description")
state = module.params.get("state")
aci = ACIModule(module)
+ extra_child_classes = dict(
+ pimIPV6IfP=dict(rs_class="pimRsV6IfPol", attribute_input=module.params.get("pim_v6_interface_profile")),
+ pimIfP=dict(rs_class="pimRsIfPol", attribute_input=module.params.get("pim_v4_interface_profile")),
+ igmpIfP=dict(rs_class="igmpRsIfPol", attribute_input=module.params.get("igmp_interface_profile")),
+ )
+
aci.construct_url(
root_class=dict(
aci_class="fvTenant",
@@ -294,11 +377,11 @@ def main():
),
subclass_3=dict(
aci_class="l3extLIfP",
- aci_rn="lifp-[{0}]".format(interface_profile),
+ aci_rn="lifp-{0}".format(interface_profile),
module_object=interface_profile,
target_filter={"name": interface_profile},
),
- child_classes=["l3extRsNdIfPol", "l3extRsIngressQosDppPol", "l3extRsEgressQosDppPol"],
+ child_classes=list(extra_child_classes.keys()) + ["l3extRsEgressQosDppPol", "l3extRsIngressQosDppPol", "l3extRsLIfPCustQosPol", "l3extRsNdIfPol"],
)
aci.get_existing()
@@ -308,8 +391,67 @@ def main():
dict(l3extRsNdIfPol=dict(attributes=dict(tnNdIfPolName=nd_policy))),
dict(l3extRsIngressQosDppPol=dict(attributes=dict(tnQosDppPolName=ingress_dpp_policy))),
dict(l3extRsEgressQosDppPol=dict(attributes=dict(tnQosDppPolName=egress_dpp_policy))),
+ dict(l3extRsLIfPCustQosPol=dict(attributes=dict(tnQosCustomPolName=qos_custom_policy))),
]
- aci.payload(aci_class="l3extLIfP", class_config=dict(name=interface_profile, descr=description), child_configs=child_configs)
+ for class_name, attribute in extra_child_classes.items():
+ attribute_input = attribute.get("attribute_input")
+ if attribute_input is not None:
+ rs_class = attribute.get("rs_class")
+ if all(value is None for value in attribute_input.values()) and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("l3extLIfP", {}).get("children", {}):
+ if child.get(class_name):
+ child_configs.append(
+ {
+ class_name: dict(
+ attributes=dict(status="deleted"),
+ ),
+ }
+ )
+ elif all(value is not None for value in attribute_input.values()):
+ if rs_class in ["pimRsV6IfPol", "pimRsIfPol"]:
+ child_configs.append(
+ {
+ class_name: dict(
+ attributes={},
+ children=[
+ {
+ rs_class: dict(
+ attributes=dict(
+ tDn="uni/tn-{0}/pimifpol-{1}".format(attribute_input.get("tenant"), attribute_input.get("pim"))
+ )
+ )
+ },
+ ],
+ )
+ }
+ )
+ elif rs_class == "igmpRsIfPol":
+ child_configs.append(
+ {
+ class_name: dict(
+ attributes={},
+ children=[
+ {
+ rs_class: dict(
+ attributes=dict(
+ tDn="uni/tn-{0}/igmpIfPol-{1}".format(attribute_input.get("tenant"), attribute_input.get("igmp"))
+ )
+ )
+ },
+ ],
+ )
+ }
+ )
+
+ aci.payload(
+ aci_class="l3extLIfP",
+ class_config=dict(
+ name=interface_profile,
+ prio=qos_priority,
+ descr=description,
+ ),
+ child_configs=child_configs,
+ )
aci.get_diff(aci_class="l3extLIfP")
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile_ospf_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile_ospf_policy.py
index 798a82111..2d1a407ae 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile_ospf_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_profile_ospf_policy.py
@@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2022, Jason Juenger (@jasonjuenger) <jasonjuenger@gmail.com>
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -13,9 +14,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_l3out_logical_interface_profile_ospf_policy
-short_description: Manage Layer 3 Outside (L3Out) logical interface profile (l3ext:LIfP) OSPF policy (ospfIfP)
+short_description: Manage Layer 3 Outside (L3Out) OSPF interface profile (ospf:IfP)
description:
-- Manage L3Out interface profile OSPF policies on Cisco ACI fabrics.
+- Manage L3Out logical interface profile OSPF policies on Cisco ACI fabrics.
options:
tenant:
description:
@@ -64,14 +65,22 @@ extends_documentation_fragment:
- cisco.aci.annotation
- cisco.aci.owner
+notes:
+- The C(tenant), C(l3out), C(node_profile), C(interface_profile) and C(ospf_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_l3out), M(cisco.aci.aci_l3out_logical_node_profile), M(cisco.aci.aci_l3out_logical_interface_profile)
+ and (cisco.aci.aci_interface_policy_ospf) can be used for this.
seealso:
-- module: aci_l3out
-- module: aci_l3out_logical_node_profile
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_logical_node_profile
+- module: cisco.aci.aci_l3out_logical_interface_profile
+- module: cisco.aci.aci_interface_policy_ospf
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes
+ description: More information about the internal APIC class B(ospf:IfP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Jason Juenger (@jasonjuenger)
+- Gaspard Micol (@gmicol)
"""
EXAMPLES = r"""
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_vpc_member.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_vpc_member.py
index 4ddd32161..822c53af7 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_vpc_member.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_interface_vpc_member.py
@@ -94,7 +94,7 @@ notes:
seealso:
- module: cisco.aci.aci_l3out_logical_interface_profile
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(l3ext:Out).
+ description: More information about the internal APIC class B(l3ext:Member).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Anvitha Jain (@anvitha-jain)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node.py
index 33c8a22a5..7ab756566 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node.py
@@ -1,6 +1,8 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2021, Marcel Zehnder (@maercu)
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -52,9 +54,20 @@ options:
loopback_address:
description:
- The loopback IP address.
+ - The BGP-EVPN loopback IP address for Infra SR-MPLS L3Outs.
- A configured loopback address can be removed by passing an empty string (see Examples).
type: str
aliases: [ loopback ]
+ mpls_transport_loopback_address:
+ description:
+ - The MPLS transport loopback IP address for Infra SR-MPLS L3Outs.
+ type: str
+ aliases: [ mpls_transport_loopback ]
+ sid:
+ description:
+ - The Segment ID (SID) Index for Infra SR-MPLS L3Outs.
+ type: str
+ aliases: [ segment_id ]
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -70,10 +83,11 @@ seealso:
- module: aci_l3out
- module: aci_l3out_logical_node_profile
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(vmm:DomP)
+ description: More information about the internal APIC classes B(l3ext:RsNodeL3OutAtt)
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Marcel Zehnder (@maercu)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -92,6 +106,22 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
+- name: Add a node to a infra SR-MPLS l3out node profile
+ cisco.aci.aci_l3out_logical_node: &aci_infra_node_profile_node
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: infra
+ l3out: ansible_infra_sr_mpls_l3out
+ node_profile: ansible_infra_sr_mpls_l3out_node_profile
+ pod_id: 1
+ node_id: 113
+ router_id_as_loopback: no
+ loopback_address: 50.0.0.1
+ mpls_transport_loopback_address: 51.0.0.1
+ sid: 500
+ delegate_to: localhost
+
- name: Remove a loopback address from a node in node profile
cisco.aci.aci_l3out_logical_node:
host: apic
@@ -264,6 +294,8 @@ def main():
router_id=dict(type="str"),
router_id_as_loopback=dict(type="str", default="yes", choices=["yes", "no"]),
loopback_address=dict(type="str", aliases=["loopback"]),
+ mpls_transport_loopback_address=dict(type="str", aliases=["mpls_transport_loopback"]),
+ sid=dict(type="str", aliases=["segment_id"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
)
@@ -274,6 +306,8 @@ def main():
["state", "absent", ["tenant", "l3out", "node_profile", "pod_id", "node_id"]],
["state", "present", ["tenant", "l3out", "node_profile", "pod_id", "node_id"]],
],
+ required_by={"mpls_transport_loopback_address": "loopback_address"},
+ required_together=[("mpls_transport_loopback_address", "sid")],
)
tenant = module.params.get("tenant")
@@ -284,6 +318,8 @@ def main():
router_id = module.params.get("router_id")
router_id_as_loopback = module.params.get("router_id_as_loopback")
loopback_address = module.params.get("loopback_address")
+ mpls_transport_loopback_address = module.params.get("mpls_transport_loopback_address")
+ sid = module.params.get("sid")
state = module.params.get("state")
tdn = None
@@ -294,6 +330,9 @@ def main():
child_classes = ["l3extLoopBackIfP"]
+ if mpls_transport_loopback_address is not None:
+ child_classes.append("mplsNodeSidP")
+
child_configs = []
aci.construct_url(
@@ -333,7 +372,12 @@ def main():
previous_loopback_address = child.get("l3extLoopBackIfP", {}).get("attributes", {}).get("addr")
child_configs.append(dict(l3extLoopBackIfP=dict(attributes=dict(addr=previous_loopback_address, status="deleted"))))
elif loopback_address:
- child_configs.append(dict(l3extLoopBackIfP=dict(attributes=dict(addr=loopback_address))))
+ loopback_address_config = dict(l3extLoopBackIfP=dict(attributes=dict(addr=loopback_address), children=[]))
+ if mpls_transport_loopback_address:
+ loopback_address_config["l3extLoopBackIfP"]["children"].append(
+ dict(mplsNodeSidP=dict(attributes=dict(loopbackAddr=mpls_transport_loopback_address, sidoffset=sid)))
+ )
+ child_configs.append(loopback_address_config)
aci.payload(
aci_class="l3extRsNodeL3OutAtt",
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node_profile.py
index 10eefd018..ac6b87ebe 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_logical_node_profile.py
@@ -1,6 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -43,6 +44,12 @@ options:
type: str
choices: [ AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, EF, VA, unspecified ]
aliases: [ target_dscp ]
+ mpls_custom_qos_policy:
+ description:
+ - The MPLS custom QoS policy name for the node profile.
+ - This argument should only be used for Infra SR-MPLS L3Outs.
+ aliases: [ mpls_custom_qos_policy_name ]
+ type: str
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -62,10 +69,11 @@ extends_documentation_fragment:
seealso:
- module: aci_l3out
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(vmm:DomP)
+ description: More information about the internal APIC classes B(l3ext:LNodeP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Jason Juenger (@jasonjuenger)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -82,6 +90,18 @@ EXAMPLES = r"""
state: present
delegate_to: localhost
+- name: Add a new node profile with MPLS custom QOS policy to SR-MPLS infra l3out
+ cisco.aci.aci_l3out_logical_node_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: infra
+ l3out: infra_sr_mpls_l3out
+ node_profile: infra_sr_mpls_l3out_node_profile
+ mpls_custom_qos_policy: infra_mpls_custom_qos_policy
+ state: present
+ delegate_to: localhost
+
- name: Delete a node profile
cisco.aci.aci_l3out_logical_node_profile:
host: apic
@@ -264,6 +284,8 @@ def main():
],
aliases=["target_dscp"],
),
+ # alias=dict(type="str"), not implemented because of different (api/alias/mo/uni/) api endpoint
+ mpls_custom_qos_policy=dict(type="str", aliases=["mpls_custom_qos_policy_name"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
name_alias=dict(type="str"),
)
@@ -282,11 +304,16 @@ def main():
l3out = module.params.get("l3out")
description = module.params.get("description")
dscp = module.params.get("dscp")
+ mpls_custom_qos_policy = module.params.get("mpls_custom_qos_policy")
state = module.params.get("state")
name_alias = module.params.get("name_alias")
aci = ACIModule(module)
+ child_classes = []
+ if mpls_custom_qos_policy is not None:
+ child_classes.append("l3extRsLNodePMplsCustQosPol")
+
aci.construct_url(
root_class=dict(
aci_class="fvTenant",
@@ -306,11 +333,21 @@ def main():
module_object=node_profile,
target_filter={"name": node_profile},
),
+ child_classes=child_classes,
)
aci.get_existing()
if state == "present":
+ child_configs = []
+ if mpls_custom_qos_policy is not None:
+ if mpls_custom_qos_policy == "":
+ child_configs.append(dict(l3extRsLNodePMplsCustQosPol=dict(attributes=dict(status="deleted"))))
+ else:
+ child_configs.append(
+ dict(l3extRsLNodePMplsCustQosPol=dict(attributes=dict(tDn="uni/tn-infra/qosmplscustom-{0}".format(mpls_custom_qos_policy))))
+ )
+
aci.payload(
aci_class="l3extLNodeP",
class_config=dict(
@@ -319,6 +356,7 @@ def main():
targetDscp=dscp,
nameAlias=name_alias,
),
+ child_configs=child_configs,
)
aci.get_diff(aci_class="l3extLNodeP")
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes.py
index 039593366..a8c410bb5 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes.py
@@ -15,7 +15,7 @@ DOCUMENTATION = r"""
module: aci_l3out_static_routes
short_description: Manage Static routes object (l3ext:ipRouteP)
description:
-- Manage External Subnet objects (l3ext:ipRouteP)
+- Manage External Subnet objects.
options:
description:
description:
@@ -86,7 +86,7 @@ seealso:
- module: cisco.aci.aci_tenant
- module: cisco.aci.aci_l3out
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(l3ext:Out).
+ description: More information about the internal APIC class B(l3ext:ipRouteP).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Anvitha Jain(@anvitha-jain)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes_nexthop.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes_nexthop.py
index 36c3afa36..b475bba5c 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes_nexthop.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_static_routes_nexthop.py
@@ -65,7 +65,7 @@ seealso:
- module: aci_l3out_logical_node_profile_to_node
- module: aci_l3out_static_routes
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(vmm:DomP)
+ description: More information about the internal APIC classes B(ip:NexthopP)
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Marcel Zehnder (@maercu)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_l3out_to_sr_mpls_infra_l3out.py b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_to_sr_mpls_infra_l3out.py
new file mode 100644
index 000000000..db621d5c8
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_l3out_to_sr_mpls_infra_l3out.py
@@ -0,0 +1,355 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "metadata_version": "1.1",
+ "status": ["preview"],
+ "supported_by": "certified",
+}
+
+DOCUMENTATION = r"""
+---
+module: aci_l3out_to_sr_mpls_infra_l3out
+short_description: Manage Layer 3 Outside (L3Out) to SR-MPLS Infra L3Outs objects (l3ext:ConsLbl)
+description:
+- Manage Layer 3 Outside (L3Out) to SR-MPLS Infra L3Outs objects on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ l3out:
+ description:
+ - The name of an existing SR MPLS VRF L3Out.
+ type: str
+ aliases: [ l3out_name, name ]
+ infra_l3out:
+ description:
+ - The name of an existing SR-MPLS Infra L3Out.
+ type: str
+ aliases: [ infra_l3out_name ]
+ external_epg:
+ description:
+ - The distinguished name (DN) of the external EPG.
+ type: str
+ aliases: [ external_epg_dn ]
+ outbound_route_map:
+ description:
+ - The distinguished name (DN) of the outbound route map.
+ type: str
+ aliases: [ outbound_route_map_dn, outbound ]
+ inbound_route_map:
+ description:
+ - The distinguished name (DN) of the inbound route map.
+ - Use an empty string to remove the inbound route map.
+ type: str
+ aliases: [ inbound_route_map_dn, inbound ]
+ description:
+ description:
+ - Description for the L3Out.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) and C(l3out) used must exist before using this module in your playbook.
+- The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_l3out) modules can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_l3out
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(l3ext:ConsLbl).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Add a new l3out to sr-mpls infra l3out
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ l3out: prod_l3out
+ description: L3Out for Production tenant
+ infra_l3out: infra_l3out_name
+ external_epg: uni/tn-production/out-l3out_name/instP-external_epg_name
+ outbound_route_map: uni/tn-production/prof-outbound_route_map_name
+ inbound_route_map: uni/tn-production/prof-inbound_route_map_name
+ state: present
+ delegate_to: localhost
+
+- name: Delete a l3out to sr-mpls infra l3out
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ l3out: prod_l3out
+ infra_l3out: infra_l3out_name
+ state: absent
+ delegate_to: localhost
+
+- name: Query a l3out to sr-mpls infra l3out
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ l3out: prod_l3out
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all l3out to sr-mpls infra l3outs
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_all_result
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ l3out=dict(type="str", aliases=["l3out_name", "name"]), # Not required for querying all objects
+ description=dict(type="str", aliases=["descr"]),
+ infra_l3out=dict(type="str", aliases=["infra_l3out_name"]),
+ external_epg=dict(type="str", aliases=["external_epg_dn"]),
+ outbound_route_map=dict(type="str", aliases=["outbound_route_map_dn", "outbound"]),
+ inbound_route_map=dict(type="str", aliases=["inbound_route_map_dn", "inbound"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["l3out", "tenant", "infra_l3out"]],
+ ["state", "present", ["l3out", "tenant", "infra_l3out", "external_epg", "outbound_route_map"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ tenant = module.params.get("tenant")
+ l3out = module.params.get("l3out")
+ description = module.params.get("description")
+ infra_l3out = module.params.get("infra_l3out")
+ external_epg = module.params.get("external_epg")
+ outbound_route_map = module.params.get("outbound_route_map")
+ inbound_route_map = module.params.get("inbound_route_map")
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+
+ # l3extRsProvLblDef, bgpDomainIdAllocator are auto-generated classes, added for query output
+ child_classes = ["l3extRsLblToInstP", "l3extRsLblToProfile", "l3extRsProvLblDef", "bgpDomainIdAllocator"]
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ ),
+ subclass_2=dict(
+ aci_class="l3extConsLbl",
+ aci_rn="conslbl-{0}".format(infra_l3out),
+ module_object=infra_l3out,
+ target_filter={"name": infra_l3out},
+ ),
+ child_classes=child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+
+ if aci.existing:
+ children = aci.existing[0].get("l3extConsLbl", {}).get("children", [])
+ for child in children:
+ if child.get("l3extRsLblToProfile"):
+ tdn = child.get("l3extRsLblToProfile").get("attributes").get("tDn")
+ direction = child.get("l3extRsLblToProfile").get("attributes").get("direction")
+ route_map = outbound_route_map if direction == "export" else inbound_route_map
+ # Inbound route-map is removed when input is different or an empty string, otherwise ignored.
+ if route_map is not None and tdn != route_map:
+ child_configs.append(dict(l3extRsLblToProfile=dict(attributes=dict(tDn=tdn, direction=direction, status="deleted"))))
+ elif child.get("l3extRsLblToInstP"):
+ tdn = child.get("l3extRsLblToInstP").get("attributes").get("tDn")
+ if tdn != external_epg:
+ child_configs.append(dict(l3extRsLblToInstP=dict(attributes=dict(tDn=tdn, status="deleted"))))
+
+ child_configs.append(dict(l3extRsLblToProfile=dict(attributes=dict(tDn=outbound_route_map, direction="export"))))
+ child_configs.append(dict(l3extRsLblToInstP=dict(attributes=dict(tDn=external_epg))))
+
+ if inbound_route_map:
+ child_configs.append(dict(l3extRsLblToProfile=dict(attributes=dict(tDn=inbound_route_map, direction="import"))))
+
+ aci.payload(
+ aci_class="l3extConsLbl",
+ class_config=dict(
+ name=infra_l3out,
+ descr=description,
+ nameAlias=name_alias,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="l3extConsLbl")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group_node.py b/ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group_node.py
index be97ede40..30fb14403 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group_node.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_maintenance_group_node.py
@@ -15,7 +15,7 @@ DOCUMENTATION = r"""
module: aci_maintenance_group_node
short_description: Manage maintenance group nodes (fabric:NodeBlk)
description:
-- Manage maintenance group nodes
+- Manage maintenance group nodes.
options:
group:
description:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_match_route_destination.py b/ansible_collections/cisco/aci/plugins/modules/aci_match_route_destination.py
index 973d70561..1ba471c9d 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_match_route_destination.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_match_route_destination.py
@@ -14,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_match_route_destination
-short_description: Manage Match action rule term based on the Route Destination. (rtctrl:MatchRtDest)
+short_description: Manage Match action rule term based on the Route Destination (rtctrl:MatchRtDest)
description:
- Match action rule terms based on the Route Destination for Subject Profiles on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_netflow_exporter_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_exporter_policy.py
new file mode 100644
index 000000000..e45eb6217
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_exporter_policy.py
@@ -0,0 +1,490 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_netflow_exporter_policy
+short_description: Manage Netflow Exporter Policy (netflow:ExporterPol)
+description:
+- Manage Netflow Exporter Policies for tenants on Cisco ACI fabrics.
+- Exporter information for bootstrapping the netflow Collection agent.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ netflow_exporter_policy:
+ description:
+ - The name of the Netflow Exporter Policy.
+ type: str
+ aliases: [ netflow_exporter, netflow_exporter_name, name ]
+ dscp:
+ description:
+ - The IP DSCP value.
+ - The APIC defaults to C(CS2) when unset during creation.
+ It defaults to C(VA) for APIC versions 4.2 or prior.
+ type: str
+ choices: [ AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, EF, VA, unspecified ]
+ destination_address:
+ description:
+ - The remote node destination IP address.
+ type: str
+ destination_port:
+ description:
+ - The remote node destination port.
+ - Accepted values are any valid TCP/UDP port range.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ source_ip_type:
+ description:
+ - The type of Exporter source IP Address.
+ - It can be one of the available management IP Address for a given leaf or a custom IP Address.
+ type: str
+ choices: [ custom_source_ip, inband_management_ip, out_of_band_management_ip, ptep ]
+ custom_source_address:
+ description:
+ - The custom source IP address.
+ - It can only be used if O(source_ip_type=custom_source_ip).
+ type: str
+ associated_epg:
+ description:
+ - The associated EPG.
+ - To remove the current associated EPG, pass an empty dictionary.
+ type: dict
+ aliases: [ epg ]
+ suboptions:
+ tenant:
+ description:
+ - The name of the tenant to which the associated AP/EPG belong.
+ type: str
+ ap:
+ description:
+ - The name of the associated Application Profile to which the associated EPG belongs.
+ type: str
+ epg:
+ description:
+ - The name of the associated EPG.
+ type: str
+ associated_extepg:
+ description:
+ - The associated external EPG.
+ - To remove the current associated external EPG, pass an empty dictionary.
+ type: dict
+ aliases: [ external_epg, associated_external_epg ]
+ suboptions:
+ tenant:
+ description:
+ - The name of the tenant to which the associated L3Out/external EPG belong.
+ type: str
+ l3out:
+ description:
+ - The name of the L3Out to which the associated external EPG belongs.
+ type: str
+ extepg:
+ description:
+ - The name of the associated EPG.
+ type: str
+ associated_vrf:
+ description:
+ - The associated VRF.
+ - To remove the current associated VRF, pass an empty dictionary.
+ type: dict
+ aliases: [ vrf, context, associated_context ]
+ suboptions:
+ tenant:
+ description:
+ - The name of the tenant to which the associated VRF belongs.
+ type: str
+ vrf:
+ description:
+ - The name of the associated VRF.
+ type: str
+ description:
+ description:
+ - The description for the Netflow Exporter Policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+- The I(associated_epg) and I(associated_extepg) are mutually exclusive.
+- If the I(associated_epg) is used, the I(epg), the(tenant) and
+ the I(ap) must exist before using this module in your play book.
+ The M(cisco.aci.aci_epg) and the M(cisco.aci.aci_ap) can be used for this.
+- If the I(associated_extepg) is used, the I(extepg), the(tenant) and
+ the I(l3out) must exist before using this module in your play book.
+ The M(cisco.aci.aci_l3out_extepg) and the M(cisco.aci.aci_l3out) can be used for this.
+- If the I(associated_vrf) is used, the I(vrf) and the I(tenant) must exist
+ before using this module in your play book.
+ The M(cisco.aci.aci_vrf) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_vrf
+- module: cisco.aci.aci_ap
+- module: cisco.aci.aci_epg
+- module: cisco.aci.aci_l3out
+- module: cisco.aci.aci_l3out_extepg
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(netflow:ExporterPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Netflow Exporter Policy
+ cisco.aci.aci_netflow_exporter_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_exporter_policy: my_netflow_exporter_policy
+ dscp: CS2
+ destination_address: 11.11.11.1
+ destination_port: 25
+ source_ip_type: custom_source_ip
+ custom_source_address: 11.11.11.2
+ associated_epg:
+ tenant: my_tenant
+ ap: my_ap
+ epg: my_epg
+ associated_vrf:
+ tenant: my_tenant
+ vrf: my_vrf
+ state: present
+ delegate_to: localhost
+
+- name: Remove associated EPG and VRF from the new Netflow Exporter Policy
+ cisco.aci.aci_netflow_exporter_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_exporter_policy: my_netflow_exporter_policy
+ associated_epg: {}
+ associated_vrf: {}
+ delegate_to: localhost
+
+- name: Query a Netflow Exporter Policy
+ cisco.aci.aci_netflow_exporter_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_exporter_policy: my_netflow_exporter_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Exporter Policies in my_tenant
+ cisco.aci.aci_netflow_exporter_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Exporter Policies
+ cisco.aci.aci_netflow_exporter_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a Netflow Exporter Policy
+ cisco.aci.aci_netflow_exporter_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_exporter_policy: my_netflow_exporter_policy
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+ aci_contract_dscp_spec,
+ associated_netflow_exporter_epg_spec,
+ associated_netflow_exporter_extepg_spec,
+ associated_netflow_exporter_vrf_spec,
+)
+from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_SOURCE_IP_TYPE_NETFLOW_EXPORTER_MAPPING
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ netflow_exporter_policy=dict(type="str", aliases=["netflow_exporter", "netflow_exporter_name", "name"]),
+ dscp=dict((k, aci_contract_dscp_spec()[k]) for k in aci_contract_dscp_spec() if k != "aliases"),
+ destination_address=dict(type="str"),
+ destination_port=dict(type="str"),
+ source_ip_type=dict(type="str", choices=list(MATCH_SOURCE_IP_TYPE_NETFLOW_EXPORTER_MAPPING.keys())),
+ custom_source_address=dict(type="str"),
+ associated_epg=dict(type="dict", aliases=["epg"], options=associated_netflow_exporter_epg_spec()),
+ associated_extepg=dict(type="dict", aliases=["external_epg", "associated_external_epg"], options=associated_netflow_exporter_extepg_spec()),
+ associated_vrf=dict(type="dict", aliases=["vrf", "associated_context", "context"], options=associated_netflow_exporter_vrf_spec()),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "netflow_exporter_policy"]],
+ ["state", "present", ["tenant", "netflow_exporter_policy", "destination_address", "destination_port"]],
+ ],
+ mutually_exclusive=[["associated_epg", "associated_extepg"]],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ netflow_exporter_policy = module.params.get("netflow_exporter_policy")
+ dscp = module.params.get("dscp")
+ destination_address = module.params.get("destination_address")
+ destination_port = module.params.get("destination_port")
+ source_ip_type = MATCH_SOURCE_IP_TYPE_NETFLOW_EXPORTER_MAPPING.get(module.params.get("source_ip_type"))
+ custom_source_address = module.params.get("custom_source_address")
+ associated_epg = module.params.get("associated_epg")
+ associated_extepg = module.params.get("associated_extepg")
+ associated_vrf = module.params.get("associated_vrf")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ child_classes = ["netflowRsExporterToCtx", "netflowRsExporterToEPg"]
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="netflowExporterPol",
+ aci_rn="exporterpol-{0}".format(netflow_exporter_policy),
+ module_object=netflow_exporter_policy,
+ target_filter={"name": netflow_exporter_policy},
+ ),
+ child_classes=child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ if associated_vrf is not None:
+ if all(value is None for value in associated_vrf.values()) and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("netflowExporterPol", {}).get("children", {}):
+ if child.get("netflowRsExporterToCtx"):
+ child_configs.extend([dict(netflowRsExporterToCtx=dict(attributes=dict(status="deleted")))])
+ elif all(value is not None for value in associated_vrf.values()):
+ child_configs.extend(
+ [
+ dict(
+ netflowRsExporterToCtx=dict(
+ attributes=dict(tDn="uni/tn-{0}/ctx-{1}".format(associated_vrf.get("tenant"), associated_vrf.get("vrf")))
+ )
+ ),
+ ]
+ )
+ if associated_epg is not None:
+ if all(value is None for value in associated_epg.values()) and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("netflowExporterPol", {}).get("children", {}):
+ if child.get("netflowRsExporterToEPg"):
+ child_configs.extend([dict(netflowRsExporterToEPg=dict(attributes=dict(status="deleted")))])
+ elif all(value is not None for value in associated_epg.values()):
+ child_configs.extend(
+ [
+ dict(
+ netflowRsExporterToEPg=dict(
+ attributes=dict(
+ tDn="uni/tn-{0}/ap-{1}/epg-{2}".format(associated_epg.get("tenant"), associated_epg.get("ap"), associated_epg.get("epg"))
+ )
+ )
+ ),
+ ]
+ )
+ elif associated_extepg is not None:
+ if all(value is None for value in associated_extepg.values()) and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("netflowExporterPol", {}).get("children", {}):
+ if child.get("netflowRsExporterToEPg"):
+ child_configs.extend([dict(netflowRsExporterToEPg=dict(attributes=dict(status="deleted")))])
+ elif all(value is not None for value in associated_extepg.values()):
+ child_configs.extend(
+ [
+ dict(
+ netflowRsExporterToEPg=dict(
+ attributes=dict(
+ tDn="uni/tn-{0}/out-{1}/instP-{2}".format(
+ associated_extepg.get("tenant"), associated_extepg.get("l3out"), associated_extepg.get("extepg")
+ )
+ )
+ )
+ ),
+ ]
+ )
+ aci.payload(
+ aci_class="netflowExporterPol",
+ class_config=dict(
+ name=netflow_exporter_policy,
+ descr=description,
+ dscp=dscp,
+ dstAddr=destination_address,
+ dstPort=destination_port,
+ sourceIpType=source_ip_type,
+ srcAddr=custom_source_address,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="netflowExporterPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_policy.py
new file mode 100644
index 000000000..462187609
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_policy.py
@@ -0,0 +1,300 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_netflow_monitor_policy
+short_description: Manage Netflow Monitor Policy (netflow:MonitorPol)
+description:
+- Manage Netflow Monitor Policies for tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ netflow_monitor_policy:
+ description:
+ - The name of the Netflow Monitor Policy.
+ type: str
+ aliases: [ netflow_monitor, netflow_monitor_name, name ]
+ netflow_record_policy:
+ description:
+ - The name of the Netflow Record Policy.
+ - To remove the current Netflow Record Policy, pass an empty string.
+ type: str
+ aliases: [ netflow_record, netflow_record_name ]
+ description:
+ description:
+ - The description for the Netflow Monitor Policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+- If the I(netflow_record_policy) is used, it must exist before using this module in your playbook.
+ The M(cisco.aci.aci_netflow_record_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_netflow_record_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(netflow:MonitorPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Netflow Monitor Policy
+ cisco.aci.aci_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_monitor_policy: my_netflow_monitor_policy
+ netflow_record_policy: my_netflow_record_policy
+ state: present
+ delegate_to: localhost
+
+- name: Query a Netflow Monitor Policy
+ cisco.aci.aci_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_monitor_policy: my_netflow_monitor_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Monitor Policies in my_tenant
+ cisco.aci.aci_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Monitor Policies
+ cisco.aci.aci_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a Netflow Monitor Policy
+ cisco.aci.aci_netflow_monitor_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_monitor_policy: my_netflow_monitor_policy
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ netflow_monitor_policy=dict(type="str", aliases=["netflow_monitor", "netflow_monitor_name", "name"]),
+ netflow_record_policy=dict(type="str", aliases=["netflow_record", "netflow_record_name"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "netflow_monitor_policy"]],
+ ["state", "present", ["tenant", "netflow_monitor_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ netflow_monitor_policy = module.params.get("netflow_monitor_policy")
+ netflow_record_policy = module.params.get("netflow_record_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ child_classes = ["netflowRsMonitorToRecord"]
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="netflowMonitorPol",
+ aci_rn="monitorpol-{0}".format(netflow_monitor_policy),
+ module_object=netflow_monitor_policy,
+ target_filter={"name": netflow_monitor_policy},
+ ),
+ child_classes=child_classes,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ child_configs = []
+ child_configs.append(dict(netflowRsMonitorToRecord=dict(attributes=dict(tnNetflowRecordPolName=netflow_record_policy))))
+ aci.payload(
+ aci_class="netflowMonitorPol",
+ class_config=dict(
+ name=netflow_monitor_policy,
+ descr=description,
+ ),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="netflowMonitorPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_to_exporter.py b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_to_exporter.py
new file mode 100644
index 000000000..50e2f2524
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_monitor_to_exporter.py
@@ -0,0 +1,290 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_netflow_monitor_to_exporter
+short_description: Manage Netflow Monitor to Exporter (netflow:RsMonitorToExporter)
+description:
+- Link Netflow Exporter policies to Netflow Monitor policies for tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ netflow_monitor_policy:
+ description:
+ - The name of the Netflow Monitor Policy.
+ type: str
+ aliases: [ netflow_monitor, netflow_monitor_name, name ]
+ netflow_exporter_policy:
+ description:
+ - The name of the Netflow Exporter Policy.
+ type: str
+ aliases: [ netflow_exporter, netflow_exporter_name ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant), I(netflow_monitor_policy) and I(netflow_exporter_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant), M(cisco.aci.aci_netflow_monitor_policy), M(cisco.aci.aci_netflow_exporter_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_netflow_monitor_policy
+- module: cisco.aci.aci_netflow_exporter_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(netflow:RsMonitorToExporter).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Netflow Monitor Policy
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_monitor_policy: my_netflow_monitor_policy
+ netflow_exporter_policy: my_netflow_exporter_policy
+ state: present
+ delegate_to: localhost
+
+- name: Query a Netflow Monitor Policy
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_monitor_policy: my_netflow_monitor_policy
+ netflow_exporter_policy: my_netflow_exporter_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Monitor Policies in my_tenant
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Monitor Policies
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a Netflow Monitor Policy
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_monitor_policy: my_netflow_monitor_policy
+ netflow_exporter_policy: my_netflow_exporter_policy
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ netflow_monitor_policy=dict(type="str", aliases=["netflow_monitor", "netflow_monitor_name", "name"]),
+ netflow_exporter_policy=dict(type="str", aliases=["netflow_exporter", "netflow_exporter_name"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "netflow_monitor_policy", "netflow_exporter_policy"]],
+ ["state", "present", ["tenant", "netflow_monitor_policy", "netflow_exporter_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ netflow_monitor_policy = module.params.get("netflow_monitor_policy")
+ netflow_exporter_policy = module.params.get("netflow_exporter_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="netflowMonitorPol",
+ aci_rn="monitorpol-{0}".format(netflow_monitor_policy),
+ module_object=netflow_monitor_policy,
+ target_filter={"name": netflow_monitor_policy},
+ ),
+ subclass_2=dict(
+ aci_class="netflowRsMonitorToExporter",
+ aci_rn="rsmonitorToExporter-{0}".format(netflow_exporter_policy),
+ module_object=netflow_exporter_policy,
+ target_filter={"tnNetflowExporterPolName": netflow_exporter_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="netflowRsMonitorToExporter",
+ class_config=dict(tnNetflowExporterPolName=netflow_exporter_policy),
+ )
+
+ aci.get_diff(aci_class="netflowRsMonitorToExporter")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_netflow_record_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_record_policy.py
new file mode 100644
index 000000000..e2f04af0c
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_netflow_record_policy.py
@@ -0,0 +1,313 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_netflow_record_policy
+short_description: Manage Netflow Record Policy (netflow:RecordPol)
+description:
+- Manage Netflow Record Policies for tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ netflow_record_policy:
+ description:
+ - The name of the Netflow Record Policy.
+ type: str
+ aliases: [ netflow_record, netflow_record_name, name ]
+ collect:
+ description:
+ - The collect parameters for the flow record.
+ - The APIC defaults to C(source_interface) when unset during creation.
+ type: list
+ elements: str
+ choices: [ bytes_counter, pkts_counter, pkt_disposition, sampler_id, source_interface, tcp_flags, first_pkt_timestamp, recent_pkt_timestamp ]
+ match:
+ description:
+ - The match parameters for the flow record.
+ type: list
+ elements: str
+ choices: [ destination_ipv4_v6, destination_ipv4, destination_ipv6, destination_mac, destination_port, ethertype, ip_protocol, source_ipv4_v6,
+ source_ipv4, source_ipv6, source_mac, source_port, ip_tos, unspecified, vlan ]
+ description:
+ description:
+ - The description for the Netflow Record Policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(netflow:RecordPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Netflow Record Policy
+ cisco.aci.aci_netflow_record_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_record_policy: my_netflow_record_policy
+ collect: [pkts_counter, pkt_disposition]
+ match: [destination_ipv4, source_ipv4]
+ state: present
+ delegate_to: localhost
+
+- name: Query a Netflow Record Policy
+ cisco.aci.aci_netflow_record_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_record_policy: my_netflow_record_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Record Policies in my_tenant
+ cisco.aci.aci_netflow_record_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+
+- name: Query all Netflow Record Policies
+ cisco.aci.aci_netflow_record_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a Netflow Record Policy
+ cisco.aci.aci_netflow_record_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ netflow_record_policy: my_netflow_record_policy
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_COLLECT_NETFLOW_RECORD_MAPPING, MATCH_MATCH_NETFLOW_RECORD_MAPPING
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ netflow_record_policy=dict(type="str", aliases=["netflow_record", "netflow_record_name", "name"]),
+ collect=dict(type="list", elements="str", choices=list(MATCH_COLLECT_NETFLOW_RECORD_MAPPING.keys())),
+ match=dict(type="list", elements="str", choices=list(MATCH_MATCH_NETFLOW_RECORD_MAPPING.keys())),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "netflow_record_policy"]],
+ ["state", "present", ["tenant", "netflow_record_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ netflow_record_policy = module.params.get("netflow_record_policy")
+ state = module.params.get("state")
+
+ if module.params.get("collect") is not None:
+ collect = ",".join(sorted(MATCH_COLLECT_NETFLOW_RECORD_MAPPING.get(v) for v in module.params.get("collect")))
+ else:
+ collect = None
+
+ if module.params.get("match") is not None:
+ match = ",".join(sorted(MATCH_MATCH_NETFLOW_RECORD_MAPPING.get(v) for v in module.params.get("match")))
+ else:
+ match = None
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="netflowRecordPol",
+ aci_rn="recordpol-{0}".format(netflow_record_policy),
+ module_object=netflow_record_policy,
+ target_filter={"name": netflow_record_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="netflowRecordPol",
+ class_config=dict(
+ name=netflow_record_policy,
+ collect=collect,
+ match=match,
+ descr=description,
+ ),
+ )
+
+ aci.get_diff(aci_class="netflowRecordPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_node_block.py b/ansible_collections/cisco/aci/plugins/modules/aci_node_block.py
new file mode 100644
index 000000000..d2f86a275
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_node_block.py
@@ -0,0 +1,390 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_node_block
+short_description: Manage Node Block (infra:NodeBlk)
+description:
+- Manage Node Blocks on Cisco ACI fabrics.
+- A node block is a range of nodes. Each node block begins with the first port and ends with the last port.
+options:
+ switch_profile:
+ description:
+ - The name of the Fabric access policy leaf/spine switch profile.
+ type: str
+ aliases:
+ - leaf_profile_name
+ - leaf_profile
+ - switch_profile_name
+ - spine_switch_profile
+ - spine_switch_profile_name
+ access_port_selector:
+ description:
+ - The name of the Fabric access policy leaf/spine switch port selector.
+ type: str
+ aliases: [ access_port_selector_name, port_selector, port_selector_name ]
+ node_block:
+ description:
+ - The name of the Node Block.
+ type: str
+ aliases: [ node_block_name, name ]
+ description:
+ description:
+ - The description for the Node Block.
+ type: str
+ aliases: [ node_block_description ]
+ from_port:
+ description:
+ - The beginning of the port range block for the Node Block.
+ type: str
+ aliases: [ from, from_port_range ]
+ to_port:
+ description:
+ - The end of the port range block for the Node Block.
+ type: str
+ aliases: [ to, to_port_range ]
+ type_node:
+ description:
+ - The type of Node Block to be created under respective access port.
+ type: str
+ choices: [ leaf, spine ]
+ aliases: [ type ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+
+notes:
+- If Adding a port block on an access leaf switch port selector of I(type) C(leaf),
+ The I(switch_profile) and I(access_port_selector) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_switch_policy_leaf_profile) and M(cisco.aci.aci_switch_leaf_selector) modules can be used for this.
+- If Adding a port block on an access switch port selector of C(type) C(spine),
+ The I(switch_profile) and I(access_port_selector) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_access_spine_switch_profile) and M(cisco.aci.aci_access_spine_switch_selector) modules can be used for this.
+seealso:
+- module: cisco.aci.aci_switch_policy_leaf_profile
+- module: cisco.aci.aci_switch_leaf_selector
+- module: cisco.aci.aci_access_spine_switch_profile
+- module: cisco.aci.aci_access_spine_switch_selector
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes B(infra:NodeBlk).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new Node Block associated to a switch policy leaf profile selector
+ cisco.aci.aci_node_block:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: my_leaf_switch_profile
+ access_port_selector: my_leaf_switch_selector
+ node_block: my_node_block
+ from_port: 1011
+ to_port: 1011
+ type_node: leaf
+ state: present
+ delegate_to: localhost
+
+- name: Add a new Node Block associated to a switch policy spine profile selector
+ cisco.aci.aci_node_block:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: my_spine_switch_profile
+ access_port_selector: my_spine_switch_selector
+ node_block: my_node_block
+ from_port: 1012
+ to_port: 1012
+ type_node: spine
+ state: present
+ delegate_to: localhost
+
+- name: Query a Node Block associated to a switch policy leaf profile selector
+ cisco.aci.aci_node_block:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: my_leaf_switch_profile
+ access_port_selector: my_leaf_switch_selector
+ node_block: my_node_block
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Node Blocks under the switch policy leaf profile selector
+ cisco.aci.aci_node_block:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: my_leaf_switch_profile
+ access_port_selector: my_leaf_switch_selector
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Node Blocks
+ cisco.aci.aci_node_block:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove a Node Block associated to a switch policy leaf profile selector
+ cisco.aci.aci_node_block:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ switch_profile: my_leaf_switch_profile
+ access_port_selector: my_leaf_switch_selector
+ node_block: my_node_block
+ type_node: leaf
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(
+ switch_profile=dict(
+ type="str",
+ aliases=[
+ "leaf_profile_name",
+ "leaf_profile",
+ "switch_profile_name",
+ "spine_switch_profile",
+ "spine_switch_profile_name",
+ ],
+ ), # Not required for querying all objects
+ access_port_selector=dict(
+ type="str",
+ aliases=[
+ "access_port_selector_name",
+ "port_selector",
+ "port_selector_name",
+ ],
+ ), # Not required for querying all objects
+ node_block=dict(type="str", aliases=["node_block_name", "name"]), # Not required for querying all objects
+ description=dict(type="str", aliases=["node_block_description"]),
+ from_port=dict(type="str", aliases=["from", "from_port_range"]),
+ to_port=dict(type="str", aliases=["to", "to_port_range"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ type_node=dict(type="str", choices=["leaf", "spine"], aliases=["type"]), # Not required for querying all objects
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["switch_profile", "access_port_selector", "node_block", "type_node"]],
+ ["state", "present", ["switch_profile", "access_port_selector", "node_block", "type_node"]],
+ ],
+ )
+
+ switch_profile = module.params.get("switch_profile")
+ access_port_selector = module.params.get("access_port_selector")
+ node_block = module.params.get("node_block")
+ description = module.params.get("description")
+ from_port = module.params.get("from_port")
+ to_port = module.params.get("to_port")
+ state = module.params.get("state")
+ type_node = module.params.get("type_node")
+
+ aci = ACIModule(module)
+
+ if type_node == "spine":
+ subclass_1 = dict(
+ aci_class="infraSpineP",
+ aci_rn="spprof-{0}".format(switch_profile),
+ module_object=switch_profile,
+ target_filter={"name": switch_profile},
+ )
+ subclass_2 = dict(
+ aci_class="infraSpineS",
+ aci_rn="spines-{0}-typ-range".format(access_port_selector),
+ module_object=access_port_selector,
+ target_filter={"name": access_port_selector},
+ )
+ else:
+ subclass_1 = dict(
+ aci_class="infraNodeP",
+ aci_rn="nprof-{0}".format(switch_profile),
+ module_object=switch_profile,
+ target_filter={"name": switch_profile},
+ )
+ subclass_2 = dict(
+ aci_class="infraLeafS",
+ aci_rn="leaves-{0}-typ-range".format(access_port_selector),
+ module_object=access_port_selector,
+ target_filter={"name": access_port_selector},
+ )
+ aci.construct_url(
+ root_class=dict(
+ aci_class="infraInfra",
+ aci_rn="infra",
+ ),
+ subclass_1=subclass_1,
+ subclass_2=subclass_2,
+ subclass_3=dict(
+ aci_class="infraNodeBlk",
+ aci_rn="nodeblk-{0}".format(node_block),
+ module_object=node_block,
+ target_filter={"name": node_block},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="infraNodeBlk",
+ class_config=dict(
+ descr=description,
+ name=node_block,
+ from_=from_port,
+ to_=to_port,
+ ),
+ )
+
+ aci.get_diff(aci_class="infraNodeBlk")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_node_mgmt_epg.py b/ansible_collections/cisco/aci/plugins/modules/aci_node_mgmt_epg.py
index be8fe1838..161ce36f3 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_node_mgmt_epg.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_node_mgmt_epg.py
@@ -11,7 +11,7 @@ __metaclass__ = type
DOCUMENTATION = r"""
---
module: aci_node_mgmt_epg
-short_description: In band or Out of band management EPGs
+short_description: In band or Out of band management EPGs (mgmt:OoB and mgmt:InB)
description:
- Cisco ACI Fabric Node EPGs
options:
@@ -45,6 +45,10 @@ extends_documentation_fragment:
- cisco.aci.aci
- cisco.aci.annotation
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes B(mgmt:OoB) and B(mgmt:InB).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Shreyas Srish (@shrsr)
"""
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_ntp_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_ntp_policy.py
index 7fc8abde3..1adb35cc3 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_ntp_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_ntp_policy.py
@@ -17,9 +17,9 @@ ANSIBLE_METADATA = {
DOCUMENTATION = r"""
---
module: aci_ntp_policy
-short_description: Manage NTP policies.
+short_description: Manage NTP policies (datetime:Pol)
description:
-- Manage NTP policy (datetimePol) configuration on Cisco ACI fabrics.
+- Manage NTP policy configuration on Cisco ACI fabrics.
options:
name:
description:
@@ -64,7 +64,7 @@ extends_documentation_fragment:
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(datetimePol).
+ description: More information about the internal APIC class B(datetime:Pol).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_ntp_server.py b/ansible_collections/cisco/aci/plugins/modules/aci_ntp_server.py
index 3e40b652a..e8a94a03b 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_ntp_server.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_ntp_server.py
@@ -17,7 +17,7 @@ ANSIBLE_METADATA = {
DOCUMENTATION = r"""
---
module: aci_ntp_server
-short_description: Manage NTP servers.
+short_description: Manage NTP servers (datetime:NtpProv)
description:
- Manage NTP server (datetimeNtpProv) configuration on Cisco ACI fabrics.
options:
@@ -74,7 +74,7 @@ notes:
The M(cisco.aci.aci_ntp_policy) module can be used for this.
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC class B(datetimeNtpProv).
+ description: More information about the internal APIC class B(datetime:NtpProv).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_entry.py b/ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_entry.py
new file mode 100644
index 000000000..79ad849a7
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_entry.py
@@ -0,0 +1,329 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_pim_route_map_entry
+short_description: Manage Protocol-Independent Multicast (PIM) Route Map Entry (pim:RouteMapEntry)
+description:
+- Manage PIM Route Map Entries for the PIM route Map Policies on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ pim_route_map_policy:
+ description:
+ - The name of the PIM Route Map policy.
+ type: str
+ aliases: [ route_map_policy_name ]
+ order:
+ description:
+ - The PIM Route Map Entry order.
+ type: int
+ source_ip:
+ description:
+ - The Multicast Source IP.
+ type: str
+ group_ip:
+ description:
+ - The Multicast Group IP.
+ type: str
+ rp_ip:
+ description:
+ - The Multicast Rendezvous Point (RP) IP.
+ type: str
+ aliases: [ rendezvous_point_ip ]
+ action:
+ description:
+ - The route action.
+ - The APIC defaults to C(permit) when unset during creation.
+ type: str
+ choices: [ permit, deny ]
+ description:
+ description:
+ - The description for the PIM Route Map entry.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) and the C(pim_route_map_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_pim_route_map_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_pim_route_map_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(pim:RouteMapEntry).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new PIM Route Map Entry
+ cisco.aci.aci_pim_route_map_entry:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ pim_route_map_policy: my_pim_route_map_policy
+ order: 1
+ source_ip: 1.1.1.1/24
+ group_ip: 224.0.0.1/24
+ rp_ip: 1.1.1.2
+ action: permit
+ state: present
+ delegate_to: localhost
+
+- name: Query a PIM Route Map Entry
+ cisco.aci.aci_pim_route_map_entry:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ pim_route_map_policy: my_pim_route_map_policy
+ order: 1
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all PIM Route Map Entries in my_pim_route_map_policy
+ cisco.aci.aci_pim_route_map_entry:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ pim_route_map_policy: my_pim_route_map_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a PIM Route Map Entry
+ cisco.aci.aci_pim_route_map_entry:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ pim_route_map_policy: my_pim_route_map_policy
+ order: 1
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ pim_route_map_policy=dict(type="str", aliases=["route_map_policy_name"]),
+ description=dict(type="str", aliases=["descr"]),
+ order=dict(type="int"),
+ source_ip=dict(type="str"),
+ group_ip=dict(type="str"),
+ rp_ip=dict(type="str", aliases=["rendezvous_point_ip"]),
+ action=dict(type="str", choices=["permit", "deny"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "pim_route_map_policy", "order"]],
+ ["state", "present", ["tenant", "pim_route_map_policy", "order"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ pim_route_map_policy = module.params.get("pim_route_map_policy")
+ order = module.params.get("order")
+ source_ip = module.params.get("source_ip")
+ group_ip = module.params.get("group_ip")
+ rp_ip = module.params.get("rp_ip")
+ action = module.params.get("action")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="pimRouteMapPol",
+ aci_rn="rtmap-{0}".format(pim_route_map_policy),
+ module_object=pim_route_map_policy,
+ target_filter={"name": pim_route_map_policy},
+ ),
+ subclass_2=dict(
+ aci_class="pimRouteMapEntry",
+ aci_rn="rtmapentry-{0}".format(order),
+ module_object=order,
+ target_filter={"order": order},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="pimRouteMapEntry",
+ class_config=dict(
+ name=pim_route_map_policy,
+ descr=description,
+ action=action,
+ grp=group_ip,
+ order=order,
+ rp=rp_ip,
+ src=source_ip,
+ ),
+ )
+
+ aci.get_diff(aci_class="pimRouteMapEntry")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_policy.py
new file mode 100644
index 000000000..06c7c7b29
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_pim_route_map_policy.py
@@ -0,0 +1,276 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_pim_route_map_policy
+short_description: Manage Protocol-Independent Multicast (PIM) Route Map Policy (pim:RouteMapPol)
+description:
+- Manage PIM Route Map Policies for tenants on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ pim_route_map_policy:
+ description:
+ - The name of the PIM Route Map policy.
+ type: str
+ aliases: [ route_map_policy_name, name ]
+ description:
+ description:
+ - The description for the PIM Route Map policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The C(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(pim:RouteMapPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new PIM Route Map policy
+ cisco.aci.aci_pim_route_map_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ pim_route_map_policy: my_pim_route_map_policy
+ state: present
+ delegate_to: localhost
+
+- name: Query a PIM Route Map policy
+ cisco.aci.aci_pim_route_map_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ pim_route_map_policy: my_pim_route_map_policy
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all PIM Route Map policies in my_tenant
+ cisco.aci.aci_pim_route_map_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Delete a PIM Route Map policy
+ cisco.aci.aci_pim_route_map_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ pim_route_map_policy: my_pim_route_map_policy
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ pim_route_map_policy=dict(type="str", aliases=["route_map_policy_name", "name"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "pim_route_map_policy"]],
+ ["state", "present", ["tenant", "pim_route_map_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ pim_route_map_policy = module.params.get("pim_route_map_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="pimRouteMapPol",
+ aci_rn="rtmap-{0}".format(pim_route_map_policy),
+ module_object=pim_route_map_policy,
+ target_filter={"name": pim_route_map_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="pimRouteMapPol",
+ class_config=dict(
+ name=pim_route_map_policy,
+ descr=description,
+ ),
+ )
+
+ aci.get_diff(aci_class="pimRouteMapPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_qos_custom_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_qos_custom_policy.py
new file mode 100644
index 000000000..c5200b0f7
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_qos_custom_policy.py
@@ -0,0 +1,284 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_qos_custom_policy
+short_description: Manage QoS Custom Policy (qos:CustomPol)
+description:
+- Manage QoS Custom Policies for tenants on Cisco ACI fabrics.
+- The custom QoS policy enables different levels of service to be assigned to network traffic,
+ including specifications for the Differentiated Services Code Point (DSCP) value(s), and the 802.1p Dot1p priority.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ qos_custom_policy:
+ description:
+ - The name of the QoS Custom Policy.
+ type: str
+ aliases: [ qos_custom_policy_name, name ]
+ description:
+ description:
+ - The description for the QoS Custom Policy.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(qos:CustomPol).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new QoS Custom Policy
+ cisco.aci.aci_qos_custom_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ state: present
+ delegate_to: localhost
+
+- name: Query a QoS Custom Policy
+ cisco.aci.aci_qos_custom_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all QoS Custom Policies in my_tenant
+ cisco.aci.aci_qos_custom_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ state: query
+ delegate_to: localhost
+
+- name: Query all QoS Custom Policies
+ cisco.aci.aci_qos_custom_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a QoS Custom Policy
+ cisco.aci.aci_qos_custom_policy:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ qos_custom_policy=dict(type="str", aliases=["qos_custom_policy_name", "name"]),
+ description=dict(type="str", aliases=["descr"]),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "qos_custom_policy"]],
+ ["state", "present", ["tenant", "qos_custom_policy"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ description = module.params.get("description")
+ qos_custom_policy = module.params.get("qos_custom_policy")
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="qosCustomPol",
+ aci_rn="qoscustom-{0}".format(qos_custom_policy),
+ module_object=qos_custom_policy,
+ target_filter={"name": qos_custom_policy},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="qosCustomPol",
+ class_config=dict(
+ name=qos_custom_policy,
+ descr=description,
+ ),
+ )
+
+ aci.get_diff(aci_class="qosCustomPol")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_qos_dot1p_class.py b/ansible_collections/cisco/aci/plugins/modules/aci_qos_dot1p_class.py
new file mode 100644
index 000000000..f6939af20
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_qos_dot1p_class.py
@@ -0,0 +1,355 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_qos_dot1p_class
+short_description: Manage QoS Dot1P Class (qos:Dot1PClass)
+description:
+- Manage Dot1P Class levels for QoS Custom Policies on Cisco ACI fabrics.
+- The class level for Dot1P to prioritize the map.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ qos_custom_policy:
+ description:
+ - The name of the QoS Custom Policy.
+ type: str
+ aliases: [ qos_custom_policy_name ]
+ priority:
+ description:
+ - The desired QoS class level to be used.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ choices: [ level1, level2, level3, level4, level5, level6, unspecified ]
+ aliases: [ prio ]
+ dot1p_from:
+ description:
+ - The Dot1P range starting value.
+ type: str
+ choices: [ background, best_effort, excellent_effort, critical_applications, video, voice, internetwork_control, network_control, unspecified ]
+ dot1p_to:
+ description:
+ - The Dot1P range ending value.
+ type: str
+ choices: [ background, best_effort, excellent_effort, critical_applications, video, voice, internetwork_control, network_control, unspecified ]
+ dot1p_target:
+ description:
+ - The Dot1P target value.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ choices: [ AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, EF, VA, unspecified ]
+ aliases: [ target ]
+ target_cos:
+ description:
+ - The target COS to be driven based on the range of input values of Dot1P coming into the fabric.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ choices: [ background, best_effort, excellent_effort, critical_applications, video, voice, internetwork_control, network_control, unspecified ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant) and I(qos_custom_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and the M(cisco.aci.aci_qos_custom_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_qos_custom_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(qos:Dot1PClass).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new QoS dot1P Class
+ cisco.aci.aci_qos_dot1p_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ priority: level3
+ dot1p_from: best_effort
+ dot1p_to: excellent_effort
+ dot1p_target: unspecified
+ target_cos: unspecified
+ state: present
+ delegate_to: localhost
+
+- name: Query a QoS dot1P Class
+ cisco.aci.aci_qos_dot1p_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ dot1p_from: best_effort
+ dot1p_to: excellent_effort
+ state: query
+ delegate_to: localhost
+
+- name: Query all QoS dot1P Classes in my_qos_custom_policy
+ cisco.aci.aci_qos_dot1p_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all QoS dot1P Classes
+ cisco.aci.aci_qos_dot1p_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a QoS dot1P Class
+ cisco.aci.aci_qos_dot1p_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ dot1p_from: best_effort
+ dot1p_to: excellent_effort
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+ aci_contract_dscp_spec,
+)
+from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_TARGET_COS_MAPPING
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ qos_custom_policy=dict(type="str", aliases=["qos_custom_policy_name"]),
+ priority=dict(
+ type="str",
+ choices=[
+ "level1",
+ "level2",
+ "level3",
+ "level4",
+ "level5",
+ "level6",
+ "unspecified",
+ ],
+ aliases=["prio"],
+ ),
+ dot1p_from=dict(type="str", choices=list(MATCH_TARGET_COS_MAPPING.keys())),
+ dot1p_to=dict(type="str", choices=list(MATCH_TARGET_COS_MAPPING.keys())),
+ dot1p_target=aci_contract_dscp_spec(),
+ target_cos=dict(type="str", choices=list(MATCH_TARGET_COS_MAPPING.keys())),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "qos_custom_policy", "dot1p_from", "dot1p_to"]],
+ ["state", "present", ["tenant", "qos_custom_policy", "dot1p_from", "dot1p_to"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ qos_custom_policy = module.params.get("qos_custom_policy")
+ priority = module.params.get("priority")
+ dot1p_from = MATCH_TARGET_COS_MAPPING.get(module.params.get("dot1p_from"))
+ dot1p_to = MATCH_TARGET_COS_MAPPING.get(module.params.get("dot1p_to"))
+ dot1p_target = module.params.get("dot1p_target")
+ target_cos = MATCH_TARGET_COS_MAPPING.get(module.params.get("target_cos"))
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="qosCustomPol",
+ aci_rn="qoscustom-{0}".format(qos_custom_policy),
+ module_object=qos_custom_policy,
+ target_filter={"name": qos_custom_policy},
+ ),
+ subclass_2=dict(
+ aci_class="qosDot1PClass",
+ aci_rn="dot1P-{0}-{1}".format(dot1p_from, dot1p_to),
+ module_object=qos_custom_policy,
+ target_filter={"from": dot1p_from, "to": dot1p_to},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="qosDot1PClass",
+ class_config={
+ "prio": priority,
+ "from": dot1p_from,
+ "to": dot1p_to,
+ "target": dot1p_target,
+ "targetCos": target_cos,
+ },
+ )
+
+ aci.get_diff(aci_class="qosDot1PClass")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_qos_dscp_class.py b/ansible_collections/cisco/aci/plugins/modules/aci_qos_dscp_class.py
new file mode 100644
index 000000000..18219d0c0
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_qos_dscp_class.py
@@ -0,0 +1,356 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_qos_dscp_class
+short_description: Manage QoS DSCP Class (qos:DscpClass)
+description:
+- Manage QoS Custom Differentiated Services Code Point (DSCP) Class levels for QoS Custom Policies on Cisco ACI fabrics.
+- The class level for DSCP to prioritize the map.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ qos_custom_policy:
+ description:
+ - The name of the QoS Custom Policy.
+ type: str
+ aliases: [ qos_custom_policy_name ]
+ priority:
+ description:
+ - The desired QoS class level to be used.
+ - The APIC defaults to C(level3) when unset during creation.
+ type: str
+ choices: [ level1, level2, level3, level4, level5, level6, unspecified ]
+ aliases: [ prio ]
+ dscp_from:
+ description:
+ - The DSCP range starting value.
+ type: str
+ choices: [ AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, EF, VA, unspecified ]
+ dscp_to:
+ description:
+ - The DSCP range ending value.
+ type: str
+ choices: [ AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, EF, VA, unspecified ]
+ dscp_target:
+ description:
+ - The DSCP target value.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ choices: [ AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, EF, VA, unspecified ]
+ aliases: [ target ]
+ target_cos:
+ description:
+ - The target COS to be driven based on the range of input values of DSCP coming into the fabric.
+ - The APIC defaults to C(unspecified) when unset during creation.
+ type: str
+ choices: [ background, best_effort, excellent_effort, critical_applications, video, voice, internetwork_control, network_control, unspecified ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant) and I(qos_custom_policy) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and the M(cisco.aci.aci_qos_custom_policy) can be used for this.
+seealso:
+- module: cisco.aci.aci_tenant
+- module: cisco.aci.aci_qos_custom_policy
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(qos:DscpClass).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Gaspard Micol (@gmicol)
+"""
+
+EXAMPLES = r"""
+- name: Add a new QoS DSCP Class
+ cisco.aci.aci_qos_dscp_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ priority: level3
+ dscp_from: AF11
+ dscp_to: AF21
+ dscp_target: unspecified
+ target_cos: best_effort
+ state: present
+ delegate_to: localhost
+
+- name: Query a QoS DSCP Class
+ cisco.aci.aci_qos_dscp_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ dscp_from: AF11
+ dscp_to: AF21
+ state: query
+ delegate_to: localhost
+
+- name: Query all QoS DSCP Classes in my_qos_custom_policy
+ cisco.aci.aci_qos_dscp_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ state: query
+ delegate_to: localhost
+
+- name: Query all QoS DSCP Classes
+ cisco.aci.aci_qos_dscp_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+
+- name: Delete a QoS DSCP Class
+ cisco.aci.aci_qos_dscp_class:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: my_tenant
+ qos_custom_policy: my_qos_custom_policy
+ dscp_from: AF11
+ dscp_to: AF21
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ aci_owner_spec,
+ aci_contract_dscp_spec,
+)
+from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_TARGET_COS_MAPPING
+
+
+def main():
+ new_dscp_spec = dict((k, aci_contract_dscp_spec()[k]) for k in aci_contract_dscp_spec() if k != "aliases")
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ qos_custom_policy=dict(type="str", aliases=["qos_custom_policy_name"]),
+ priority=dict(
+ type="str",
+ choices=[
+ "level1",
+ "level2",
+ "level3",
+ "level4",
+ "level5",
+ "level6",
+ "unspecified",
+ ],
+ aliases=["prio"],
+ ),
+ dscp_from=new_dscp_spec,
+ dscp_to=new_dscp_spec,
+ dscp_target=aci_contract_dscp_spec(),
+ target_cos=dict(type="str", choices=list(MATCH_TARGET_COS_MAPPING.keys())),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "qos_custom_policy", "dscp_from", "dscp_to"]],
+ ["state", "present", ["tenant", "qos_custom_policy", "dscp_from", "dscp_to"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ qos_custom_policy = module.params.get("qos_custom_policy")
+ priority = module.params.get("priority")
+ dscp_from = module.params.get("dscp_from")
+ dscp_to = module.params.get("dscp_to")
+ dscp_target = module.params.get("dscp_target")
+ target_cos = MATCH_TARGET_COS_MAPPING.get(module.params.get("target_cos"))
+ state = module.params.get("state")
+
+ aci = ACIModule(module)
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="qosCustomPol",
+ aci_rn="qoscustom-{0}".format(qos_custom_policy),
+ module_object=qos_custom_policy,
+ target_filter={"name": qos_custom_policy},
+ ),
+ subclass_2=dict(
+ aci_class="qosDscpClass",
+ aci_rn="dcsp-{0}-{1}".format(dscp_from, dscp_to),
+ module_object=qos_custom_policy,
+ target_filter={"from": dscp_from, "to": dscp_to},
+ ),
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class="qosDscpClass",
+ class_config={
+ "prio": priority,
+ "from": dscp_from,
+ "to": dscp_to,
+ "target": dscp_target,
+ "targetCos": target_cos,
+ },
+ )
+
+ aci.get_diff(aci_class="qosDscpClass")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_rest.py b/ansible_collections/cisco/aci/plugins/modules/aci_rest.py
index ad73cb5bd..43986592a 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_rest.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_rest.py
@@ -3,6 +3,7 @@
# Copyright: (c) 2017, Dag Wieers (@dagwieers) <dag@wieers.com>
# Copyright: (c) 2020, Cindy Zhao (@cizhao) <cizhao@cisco.com>
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -62,6 +63,7 @@ options:
default: false
extends_documentation_fragment:
- cisco.aci.aci
+- cisco.aci.annotation
notes:
- Certain payloads are known not to be idempotent, so be careful when constructing payloads,
@@ -73,6 +75,7 @@ notes:
- XML payloads require the C(lxml) and C(xmljson) python libraries. For JSON payloads nothing special is needed.
- If you do not have any attributes, it may be necessary to add the "attributes" key with an empty dictionnary "{}" for value
as the APIC does expect the entry to precede any children.
+- Annotation set directly in c(src) or C(content) will take precedent over the C(annotation) parameter.
seealso:
- module: cisco.aci.aci_tenant
- name: Cisco APIC REST API Configuration Guide
@@ -81,6 +84,7 @@ seealso:
author:
- Dag Wieers (@dagwieers)
- Cindy Zhao (@cizhao)
+- Samita Bhattacharjee (@samitab)
"""
EXAMPLES = r"""
@@ -284,8 +288,11 @@ except Exception:
HAS_YAML = False
from ansible.module_utils.basic import AnsibleModule
-from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
from ansible.module_utils._text import to_text
+from ansible_collections.cisco.aci.plugins.module_utils.annotation_unsupported import (
+ ANNOTATION_UNSUPPORTED,
+)
def update_qsl(url, params):
@@ -303,6 +310,33 @@ def update_qsl(url, params):
return url + "?" + "&".join(["%s=%s" % (k, v) for k, v in params.items()])
+def add_annotation(annotation, payload):
+ """Add annotation to payload only if it has not already been added"""
+ if annotation and isinstance(payload, dict):
+ for key, val in payload.items():
+ if key in ANNOTATION_UNSUPPORTED:
+ continue
+ att = val.get("attributes", {})
+ if "annotation" not in att.keys():
+ att["annotation"] = annotation
+ # Recursively add annotation to children
+ children = val.get("children", None)
+ if children:
+ for child in children:
+ add_annotation(annotation, child)
+
+
+def add_annotation_xml(annotation, tree):
+ """Add annotation to payload xml only if it has not already been added"""
+ if annotation:
+ for element in tree.iter():
+ if element.tag in ANNOTATION_UNSUPPORTED:
+ continue
+ ann = element.get("annotation")
+ if ann is None:
+ element.set("annotation", annotation)
+
+
class ACIRESTModule(ACIModule):
def changed(self, d):
"""Check ACI response for changes"""
@@ -335,6 +369,7 @@ class ACIRESTModule(ACIModule):
def main():
argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
argument_spec.update(
path=dict(type="str", required=True, aliases=["uri"]),
method=dict(type="str", default="get", choices=["delete", "get", "post"], aliases=["action"]),
@@ -353,6 +388,7 @@ def main():
path = module.params.get("path")
src = module.params.get("src")
rsp_subtree_preserve = module.params.get("rsp_subtree_preserve")
+ annotation = module.params.get("annotation")
# Report missing file
file_exists = False
@@ -388,21 +424,27 @@ def main():
if rest_type == "json":
if content and isinstance(content, dict):
# Validate inline YAML/JSON
+ add_annotation(annotation, payload)
payload = json.dumps(payload)
elif payload and isinstance(payload, str) and HAS_YAML:
try:
# Validate YAML/JSON string
- payload = json.dumps(yaml.safe_load(payload))
+ payload = yaml.safe_load(payload)
+ add_annotation(annotation, payload)
+ payload = json.dumps(payload)
except Exception as e:
module.fail_json(msg="Failed to parse provided JSON/YAML payload: {0}".format(to_text(e)), exception=to_text(e), payload=payload)
elif rest_type == "xml" and HAS_LXML_ETREE:
if content and isinstance(content, dict) and HAS_XMLJSON_COBRA:
# Validate inline YAML/JSON
+ add_annotation(annotation, payload)
payload = etree.tostring(cobra.etree(payload)[0], encoding="unicode")
elif payload and isinstance(payload, str):
try:
# Validate XML string
- payload = etree.tostring(etree.fromstring(payload), encoding="unicode")
+ payload = etree.fromstring(payload)
+ add_annotation_xml(annotation, payload)
+ payload = etree.tostring(payload, encoding="unicode")
except Exception as e:
module.fail_json(msg="Failed to parse provided XML payload: {0}".format(to_text(e)), payload=payload)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client.py b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client.py
index a7c01dc8e..545167377 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_snmp_client
-short_description: Manage SNMP clients (snmp:ClientP).
+short_description: Manage SNMP clients (snmp:ClientP)
description:
- Manage SNMP clients
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client_group.py
index 7f7b12504..b18d4aecc 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client_group.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_client_group.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_snmp_client_group
-short_description: Manage SNMP client groups (snmp:ClientGrpP).
+short_description: Manage SNMP client groups (snmp:ClientGrpP)
description:
- Manage SNMP client groups
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_community_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_community_policy.py
index 446962165..1494a6bbe 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_community_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_community_policy.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_snmp_community_policy
-short_description: Manage SNMP community policies (snmp:CommunityP).
+short_description: Manage SNMP community policies (snmp:CommunityP)
description:
- Manage SNMP community policies
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_policy.py
index c3956db2f..3295453a7 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_policy.py
@@ -12,9 +12,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_snmp_policy
-short_description: Manage Syslog groups (snmp:Pol).
+short_description: Manage Syslog groups (snmp:Pol)
description:
-- Manage syslog policies
+- Manage syslog policies.
options:
admin_state:
description:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_user.py b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_user.py
index 9e9b6d852..23e7c6f3e 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_snmp_user.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_snmp_user.py
@@ -14,9 +14,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_snmp_user
-short_description: Manage SNMP v3 Users (snmp:UserP).
+short_description: Manage SNMP v3 Users (snmp:UserP)
description:
-- Manage SNMP v3 Users
+- Manage SNMP v3 Users.
- Note that all properties within the snmpUserP class are Create-only. To modify any property of an existing user, you must delete and re-create it.
options:
auth_type:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_static_node_mgmt_address.py b/ansible_collections/cisco/aci/plugins/modules/aci_static_node_mgmt_address.py
index 62602487e..bc99969be 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_static_node_mgmt_address.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_static_node_mgmt_address.py
@@ -13,7 +13,7 @@ __metaclass__ = type
DOCUMENTATION = r"""
---
module: aci_static_node_mgmt_address
-short_description: In band or Out of band management IP address
+short_description: In band or Out of band management IP address (mgmt:RsOoBStNode and mgmt:RsInBStNode)
description:
- Cisco ACI Fabric Node IP address
options:
@@ -65,6 +65,10 @@ extends_documentation_fragment:
- cisco.aci.aci
- cisco.aci.annotation
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes B(mgmt:RsOoBStNode) and B(mgmt:RsInBStNode).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Sudhakar Shet Kudtarkar (@kudtarkar1)
- Lionel Hercot (@lhercot)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_subject_label.py b/ansible_collections/cisco/aci/plugins/modules/aci_subject_label.py
new file mode 100644
index 000000000..a68c39d8f
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_subject_label.py
@@ -0,0 +1,746 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2022, Mark Ciecior (@markciecior)
+# Copyright: (c) 2024, Akini Ross <akinross@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "certified"}
+
+DOCUMENTATION = r"""
+---
+module: aci_subject_label
+short_description: Manage Subject Labels (vz:ConsSubjLbl and vz:ProvSubjLbl)
+description:
+- Manage Subject Labels on Cisco ACI fabrics.
+options:
+ tenant:
+ description:
+ - The name of the Tenant.
+ type: str
+ aliases: [ tenant_name ]
+ l2out:
+ description:
+ - The name of the L2Out.
+ type: str
+ aliases: [ l2out_name ]
+ l3out:
+ description:
+ - The name of the L3Out.
+ type: str
+ aliases: [ l3out_name ]
+ external_epg:
+ description:
+ - The name of the External End Point Group.
+ type: str
+ aliases: [ extepg, extepg_name, external_epg_name ]
+ contract:
+ description:
+ - The name of the Contract.
+ type: str
+ aliases: [ contract_name ]
+ subject:
+ description:
+ - The name of the Subject.
+ type: str
+ aliases: [ subject_name ]
+ ap:
+ description:
+ - The name of the Application Profile.
+ type: str
+ aliases: [ app_profile, app_profile_name, application_profile, application_profile_name]
+ epg:
+ description:
+ - The name of the End Point Group.
+ type: str
+ aliases: [ epg_name ]
+ esg:
+ description:
+ - The name of the Endpoint Security Group.
+ type: str
+ aliases: [ esg_name ]
+ subject_label:
+ description:
+ - The name of the Subject Label.
+ type: str
+ aliases: [ subject_label_name, name, label ]
+ subject_label_type:
+ description:
+ - Determines the type of the Subject Label.
+ type: str
+ required: true
+ choices: [ consumer, provider ]
+ aliases: [ type ]
+ complement:
+ description:
+ - Whether complement is enabled on the Subject Label.
+ - The APIC defaults to C(false) when unset during creation.
+ type: bool
+ tag:
+ description:
+ - The color of a policy label of the Subject Label.
+ - The APIC defaults to C(yellow-green) when unset during creation.
+ type: str
+ choices:
+ - alice_blue
+ - antique_white
+ - aqua
+ - aquamarine
+ - azure
+ - beige
+ - bisque
+ - black
+ - blanched_almond
+ - blue
+ - blue_violet
+ - brown
+ - burlywood
+ - cadet_blue
+ - chartreuse
+ - chocolate
+ - coral
+ - cornflower_blue
+ - cornsilk
+ - crimson
+ - cyan
+ - dark_blue
+ - dark_cyan
+ - dark_goldenrod
+ - dark_gray
+ - dark_green
+ - dark_khaki
+ - dark_magenta
+ - dark_olive_green
+ - dark_orange
+ - dark_orchid
+ - dark_red
+ - dark_salmon
+ - dark_sea_green
+ - dark_slate_blue
+ - dark_slate_gray
+ - dark_turquoise
+ - dark_violet
+ - deep_pink
+ - deep_sky_blue
+ - dim_gray
+ - dodger_blue
+ - fire_brick
+ - floral_white
+ - forest_green
+ - fuchsia
+ - gainsboro
+ - ghost_white
+ - gold
+ - goldenrod
+ - gray
+ - green
+ - green_yellow
+ - honeydew
+ - hot_pink
+ - indian_red
+ - indigo
+ - ivory
+ - khaki
+ - lavender
+ - lavender_blush
+ - lawn_green
+ - lemon_chiffon
+ - light_blue
+ - light_coral
+ - light_cyan
+ - light_goldenrod_yellow
+ - light_gray
+ - light_green
+ - light_pink
+ - light_salmon
+ - light_sea_green
+ - light_sky_blue
+ - light_slate_gray
+ - light_steel_blue
+ - light_yellow
+ - lime
+ - lime_green
+ - linen
+ - magenta
+ - maroon
+ - medium_aquamarine
+ - medium_blue
+ - medium_orchid
+ - medium_purple
+ - medium_sea_green
+ - medium_slate_blue
+ - medium_spring_green
+ - medium_turquoise
+ - medium_violet_red
+ - midnight_blue
+ - mint_cream
+ - misty_rose
+ - moccasin
+ - navajo_white
+ - navy
+ - old_lace
+ - olive
+ - olive_drab
+ - orange
+ - orange_red
+ - orchid
+ - pale_goldenrod
+ - pale_green
+ - pale_turquoise
+ - pale_violet_red
+ - papaya_whip
+ - peachpuff
+ - peru
+ - pink
+ - plum
+ - powder_blue
+ - purple
+ - red
+ - rosy_brown
+ - royal_blue
+ - saddle_brown
+ - salmon
+ - sandy_brown
+ - sea_green
+ - seashell
+ - sienna
+ - silver
+ - sky_blue
+ - slate_blue
+ - slate_gray
+ - snow
+ - spring_green
+ - steel_blue
+ - tan
+ - teal
+ - thistle
+ - tomato
+ - turquoise
+ - violet
+ - wheat
+ - white
+ - white_smoke
+ - yellow
+ - yellow_green
+ description:
+ description:
+ - The description for the Subject Label.
+ type: str
+ aliases: [ descr ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+ name_alias:
+ description:
+ - The alias for the current object. This relates to the nameAlias field in ACI.
+ type: str
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(vz:ConsSubjLbl) and (vz:ProvSubjLbl).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Mark Ciecior (@markciecior)
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Add a Subject Label on a Contract Subject
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ contract: web
+ subject: web_subject
+ subject_label: web_subject_label
+ subject_type: consumer
+ state: present
+ delegate_to: localhost
+
+- name: Add a Subject Label on a L2Out External EPG
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ l2out: l2out_name
+ external_epg: external_epg_name
+ subject_label: l2out_subject_label
+ subject_type: consumer
+ state: present
+ delegate_to: localhost
+
+- name: Add a Subject Label on a L3Out External EPG
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ l3out: l3out_name
+ external_epg: external_epg_name
+ subject_label: l3out_subject_label
+ subject_type: consumer
+ state: present
+ delegate_to: localhost
+
+- name: Add a Subject Label on a L3Out External EPG Contract
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ l3out: l3out_name
+ external_epg: external_epg_name
+ contract: web
+ subject_label: l3out_subject_label
+ subject_type: consumer
+ state: present
+ delegate_to: localhost
+
+- name: Add a Subject Label on a ESG
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ ap: app_profile_name
+ esg: esg_name
+ subject_label: esg_subject_label
+ subject_type: consumer
+ state: present
+ delegate_to: localhost
+
+- name: Add a Subject Label on a EPG
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ ap: app_profile_name
+ epg: epg_name
+ subject_label: epg_subject_label
+ subject_type: consumer
+ state: present
+ delegate_to: localhost
+
+- name: Add a Subject Label on a EPG Contract
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ ap: app_profile_name
+ epg: epg_name
+ contract: web
+ subject_label: epg_subject_label
+ subject_type: consumer
+ state: present
+ delegate_to: localhost
+
+- name: Query a Subject Label on a Contract Subject
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ contract: web
+ subject: web_subject
+ subject_label: web_subject_label
+ subject_type: consumer
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query all Subject Labels
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Remove a Subject Label on a Contract Subject
+ cisco.aci.aci_subject_label:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ tenant: production
+ contract: web
+ subject: web_subject
+ subject_label: web_subject_label
+ subject_type: consumer
+ state: absent
+ delegate_to: localhost
+"""
+
+RETURN = r"""
+current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class foo"/></imdata>'
+sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import ACI_CLASS_MAPPING, SUBJ_LABEL_MAPPING, SUBJ_LABEL_RN, POLICY_LABEL_COLORS
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ l2out=dict(type="str", aliases=["l2out_name"]),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ external_epg=dict(type="str", aliases=["extepg", "extepg_name", "external_epg_name"]),
+ contract=dict(type="str", aliases=["contract_name"]),
+ subject=dict(type="str", aliases=["subject_name"]),
+ ap=dict(type="str", aliases=["app_profile", "app_profile_name", "application_profile", "application_profile_name"]),
+ epg=dict(type="str", aliases=["epg_name"]),
+ esg=dict(type="str", aliases=["esg_name"]),
+ complement=dict(type="bool"),
+ description=dict(type="str", aliases=["descr"]),
+ subject_label=dict(type="str", aliases=["subject_label_name", "name", "label"]),
+ subject_label_type=dict(type="str", choices=["consumer", "provider"], aliases=["type"], required=True),
+ tag=dict(type="str", choices=POLICY_LABEL_COLORS),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ name_alias=dict(type="str"),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "present", ["tenant", "subject_label"]],
+ ["state", "present", ["l2out", "l3out", "epg", "esg", "subject"], True],
+ ["state", "absent", ["tenant", "subject_label"]],
+ ["state", "absent", ["l2out", "l3out", "epg", "esg", "subject"], True],
+ ],
+ mutually_exclusive=[
+ ["l2out", "l3out", "epg", "esg", "subject"],
+ ["esg", "contract"],
+ ["l2out", "contract"],
+ ],
+ required_by={
+ "subject": ["contract"],
+ "l2out": ["external_epg"],
+ "l3out": ["external_epg"],
+ "epg": ["ap"],
+ "esg": ["ap"],
+ },
+ )
+
+ aci = ACIModule(module)
+
+ tenant = module.params.get("tenant")
+ l2out = module.params.get("l2out")
+ l3out = module.params.get("l3out")
+ external_epg = module.params.get("external_epg")
+ contract = module.params.get("contract")
+ subject_label_type = module.params.get("subject_label_type")
+ subject = module.params.get("subject")
+ ap = module.params.get("ap")
+ epg = module.params.get("epg")
+ esg = module.params.get("esg")
+ complement = aci.boolean(module.params.get("complement"))
+ description = module.params.get("description")
+ subject_label = module.params.get("subject_label")
+ tag = module.params.get("tag")
+ state = module.params.get("state")
+ name_alias = module.params.get("name_alias")
+
+ aci_class = SUBJ_LABEL_MAPPING.get(subject_label_type)
+ aci_rn = SUBJ_LABEL_RN.get(subject_label_type) + subject_label if subject_label else None
+
+ if contract:
+ contract_rn = ACI_CLASS_MAPPING.get(subject_label_type).get("rn") + contract
+ contract_class = ACI_CLASS_MAPPING.get(subject_label_type).get("class")
+
+ root_class = dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ )
+ subclass_1 = None
+ subclass_2 = None
+ subclass_3 = None
+ subclass_4 = None
+ if esg:
+ subclass_1 = dict(
+ aci_class="fvAp",
+ aci_rn="ap-{0}".format(ap),
+ module_object=ap,
+ target_filter={"name": ap},
+ )
+ subclass_2 = dict(
+ aci_class="fvESg",
+ aci_rn="esg-{0}".format(esg),
+ module_object=esg,
+ target_filter={"name": esg},
+ )
+ subclass_3 = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+ elif l2out:
+ subclass_1 = dict(
+ aci_class="l2extOut",
+ aci_rn="l2out-{0}".format(l2out),
+ module_object=l2out,
+ target_filter={"name": l2out},
+ )
+ subclass_2 = dict(
+ aci_class="l2extInstP",
+ aci_rn="instP-{0}".format(external_epg),
+ module_object=external_epg,
+ target_filter={"name": external_epg},
+ )
+ subclass_3 = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+ elif epg:
+ subclass_1 = dict(
+ aci_class="fvAp",
+ aci_rn="ap-{0}".format(ap),
+ module_object=ap,
+ target_filter={"name": ap},
+ )
+ subclass_2 = dict(
+ aci_class="fvAEPg",
+ aci_rn="epg-{0}".format(epg),
+ module_object=epg,
+ target_filter={"name": epg},
+ )
+ if contract:
+ subclass_3 = dict(
+ aci_class=contract_class,
+ aci_rn=contract_rn,
+ module_object=contract,
+ target_filter={"name": contract},
+ )
+ subclass_4 = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+ else:
+ subclass_3 = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+ elif l3out:
+ subclass_1 = subclass_1 = dict(
+ aci_class="l3extOut",
+ aci_rn="out-{0}".format(l3out),
+ module_object=l3out,
+ target_filter={"name": l3out},
+ )
+ subclass_2 = dict(
+ aci_class="l3extInstP",
+ aci_rn="instP-{0}".format(external_epg),
+ module_object=external_epg,
+ target_filter={"name": external_epg},
+ )
+ if contract:
+ subclass_3 = dict(
+ aci_class=contract_class,
+ aci_rn=contract_rn,
+ module_object=contract,
+ target_filter={"name": contract},
+ )
+ subclass_4 = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+ else:
+ subclass_3 = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+ elif subject:
+ subclass_1 = dict(
+ aci_class="vzBrCP",
+ aci_rn="brc-{0}".format(contract),
+ module_object=contract,
+ target_filter={"name": contract},
+ )
+ subclass_2 = dict(
+ aci_class="vzSubj",
+ aci_rn="subj-{0}".format(subject),
+ module_object=subject,
+ target_filter={"name": subject},
+ )
+ subclass_3 = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+ else: # Query scenario without any filters forcing class query on the subject_label_class
+ root_class = dict(
+ aci_class=aci_class,
+ aci_rn=aci_rn,
+ module_object=subject_label,
+ target_filter={"name": subject_label},
+ )
+
+ aci.construct_url(
+ root_class=root_class,
+ subclass_1=subclass_1,
+ subclass_2=subclass_2,
+ subclass_3=subclass_3,
+ subclass_4=subclass_4,
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ aci.payload(
+ aci_class=aci_class,
+ class_config=dict(
+ name=subject_label,
+ descr=description,
+ nameAlias=name_alias,
+ isComplement=complement,
+ tag=tag.replace("_", "-") if tag else None,
+ ),
+ )
+
+ aci.get_diff(aci_class=aci_class)
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_switch_leaf_selector.py b/ansible_collections/cisco/aci/plugins/modules/aci_switch_leaf_selector.py
index 2b850f1cd..bf081bd57 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_switch_leaf_selector.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_switch_leaf_selector.py
@@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2017, Bruno Calogero <brunocalogero@hotmail.com>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -13,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_switch_leaf_selector
-short_description: Bind leaf selectors to switch policy leaf profiles (infra:LeafS, infra:NodeBlk, infra:RsAccNodePGrep)
+short_description: Bind leaf selectors to switch policy leaf profiles (infra:LeafS, infra:NodeBlk, and infra:RsAccNodePGrep)
description:
- Bind leaf selectors (with node block range and policy group) to switch policy leaf profiles on Cisco ACI fabrics.
options:
@@ -82,6 +83,7 @@ seealso:
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Bruno Calogero (@brunocalogero)
+- Gaspard Micol (@gmicol)
"""
EXAMPLES = r"""
@@ -266,7 +268,7 @@ def main():
module = AnsibleModule(
argument_spec=argument_spec,
supports_check_mode=True,
- required_if=[["state", "absent", ["leaf_profile", "leaf"]], ["state", "present", ["leaf_profile", "leaf", "leaf_node_blk", "from", "to"]]],
+ required_if=[["state", "absent", ["leaf_profile", "leaf"]], ["state", "present", ["leaf_profile", "leaf"]]],
)
description = module.params.get("description")
@@ -280,19 +282,21 @@ def main():
state = module.params.get("state")
name_alias = module.params.get("name_alias")
- # Build child_configs dynamically
- child_configs = [
- dict(
- infraNodeBlk=dict(
- attributes=dict(
- descr=leaf_node_blk_description,
- name=leaf_node_blk,
- from_=from_,
- to_=to_,
+ child_configs = []
+ # Add infraNodeBlk only when leaf_node_blk was defined
+ if leaf_node_blk is not None:
+ child_configs.append(
+ dict(
+ infraNodeBlk=dict(
+ attributes=dict(
+ descr=leaf_node_blk_description,
+ name=leaf_node_blk,
+ from_=from_,
+ to_=to_,
+ ),
),
),
- ),
- ]
+ )
# Add infraRsAccNodePGrp only when policy_group was defined
if policy_group is not None:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_vpc_protection_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_vpc_protection_group.py
index a7994db73..507c84a17 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_vpc_protection_group.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_switch_policy_vpc_protection_group.py
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_switch_policy_vpc_protection_group
-short_description: Manage switch policy explicit vPC protection groups (fabric:ExplicitGEp, fabric:NodePEp).
+short_description: Manage switch policy explicit vPC protection groups (fabric:ExplicitGEp and fabric:NodePEp).
description:
- Manage switch policy explicit vPC protection groups on Cisco ACI fabrics.
options:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_syslog_group.py b/ansible_collections/cisco/aci/plugins/modules/aci_syslog_group.py
index bab3379a1..205c3593b 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_syslog_group.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_syslog_group.py
@@ -12,9 +12,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_syslog_group
-short_description: Manage Syslog groups (syslog:Group, syslog:Console, syslog:File and syslog:Prof).
+short_description: Manage Syslog groups (syslog:Group, syslog:Console, syslog:File and syslog:Prof)
description:
-- Manage syslog groups
+- Manage syslog groups.
options:
admin_state:
description:
@@ -72,7 +72,7 @@ extends_documentation_fragment:
seealso:
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(syslog:Group).
+ description: More information about the internal APIC classes B(syslog:Group), B(syslog:Console), B(syslog:File) and B(syslog:Prof).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Tim Cragg (@timcragg)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_syslog_remote_dest.py b/ansible_collections/cisco/aci/plugins/modules/aci_syslog_remote_dest.py
index b3c1a02b4..43d2e85eb 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_syslog_remote_dest.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_syslog_remote_dest.py
@@ -12,10 +12,9 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_syslog_remote_dest
-short_description: Manage Syslog Remote Destinations (syslog:RemoteDest).
+short_description: Manage Syslog Remote Destinations (syslog:RemoteDest)
description:
-- Manage remote destinations for syslog messages within
- an existing syslog group object
+- Manage remote destinations for syslog messages within an existing syslog group object.
options:
admin_state:
description:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_syslog_source.py b/ansible_collections/cisco/aci/plugins/modules/aci_syslog_source.py
index b0bb61bb5..0e3bc6b78 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_syslog_source.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_syslog_source.py
@@ -15,7 +15,7 @@ DOCUMENTATION = r"""
module: aci_syslog_source
short_description: Manage Syslog Source objects (syslog:Src)
description:
-- Manage Syslog Source objects
+- Manage Syslog Source objects.
options:
name:
description:
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_system.py b/ansible_collections/cisco/aci/plugins/modules/aci_system.py
index 6a3349ec0..53e2b90e8 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_system.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_system.py
@@ -13,7 +13,7 @@ DOCUMENTATION = r"""
module: aci_system
short_description: Query the ACI system information (top:System)
description:
-- Query the ACI system information (top:System) on Cisco ACI.
+- Query the ACI system information on Cisco ACI.
author:
- Lionel Hercot (@lhercot)
options:
@@ -30,10 +30,11 @@ options:
type: str
notes:
-- More information about the internal APIC class B(top:System) from
- L(the APIC Management Information Model reference,https://developer.cisco.com/docs/apic-mim-ref/).
- This module is used to query system information for both cloud and on-premises controllers.
-
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(top:System).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
extends_documentation_fragment:
- cisco.aci.aci
"""
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_tag.py b/ansible_collections/cisco/aci/plugins/modules/aci_tag.py
index 9e56ae068..d005b462b 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_tag.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_tag.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_tag
-short_description: Tagging of ACI objects
+short_description: Tagging of ACI objects (tag:Annotation, tag:Inst, and tag:Tag)
description:
- Tagging a object on Cisco ACI fabric.
options:
@@ -50,7 +50,11 @@ notes:
- CAVEAT - Due to deprecation of the 'tagInst' object, creating a tag with tag_type 'instance' automatically generates a
'annotation' tag_type tag with an empty value. When deleting a tag_type 'instance', the 'tagAnnotation' object will
remain present and needs to be deleted separately.
+
seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC classes B(tag:Annotation), B(tag:Inst), and B(tag:Tag).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
- name: Cisco APIC System Management Configuration Guide
description: More information about the tagging can be found in the Cisco APIC System Management Configuration Guide.
link: https://www.cisco.com/c/en/us/support/cloud-systems-management/application-policy-infrastructure-controller-apic/tsd-products-support-series-home.html
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_tenant_action_rule_profile.py b/ansible_collections/cisco/aci/plugins/modules/aci_tenant_action_rule_profile.py
index 55b76f3d6..f51d28fcd 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_tenant_action_rule_profile.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_tenant_action_rule_profile.py
@@ -1,6 +1,9 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+# Copyright: (c) 2023, Dag Wieers (@dagwieers)
+# Copyright: (c) 2023, Tim Cragg (@timcragg) <tcragg@cisco.com>
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -16,21 +19,105 @@ short_description: Manage action rule profiles (rtctrl:AttrP)
description:
- Manage action rule profiles on Cisco ACI fabrics.
options:
+ tenant:
+ description:
+ - The name of the tenant.
+ type: str
+ aliases: [ tenant_name ]
action_rule:
description:
- The name of the action rule profile.
type: str
- aliases: [ action_rule_name, name ]
+ aliases: [action_rule_name, name ]
+ set_community:
+ description:
+ - The set action rule based on communities.
+ - To delete this attribute, pass an empty dictionary.
+ type: dict
+ suboptions:
+ community:
+ description:
+ - The community value.
+ type: str
+ criteria:
+ description:
+ - The community criteria.
+ - The option to append or replace the community value.
+ type: str
+ choices: [ append, replace, none ]
+ set_dampening:
+ description:
+ - The set action rule based on dampening.
+ - To delete this attribute, pass an empty dictionary.
+ type: dict
+ suboptions:
+ half_life:
+ description:
+ - The half life value (minutes).
+ type: int
+ max_suppress_time:
+ description:
+ - The maximum suppress time value (minutes).
+ type: int
+ reuse:
+ description:
+ - The reuse limit value.
+ type: int
+ suppress:
+ description:
+ - The suppress limit value.
+ type: int
+ set_next_hop:
+ description:
+ - The set action rule based on the next hop address.
+ - To delete this attribute, pass an empty string.
+ type: str
+ next_hop_propagation:
+ description:
+ - The set action rule based on nexthop unchanged configuration.
+ - Can not be configured along with C(set_route_tag).
+ - Can not be configured for APIC version 4.2 and prior.
+ - The APIC defaults to C(false) when unset.
+ type: bool
+ multipath:
+ description:
+ - Set action rule based on set redistribute multipath configuration.
+ - Can not be configured along with C(set_route_tag).
+ - Can not be configured for APIC version 4.2 and prior.
+ - The APIC defaults to C(false) when unset.
+ type: bool
+ set_preference:
+ description:
+ - The set action rule based on preference.
+ - To delete this attribute, pass an empty string.
+ type: str
+ set_metric:
+ description:
+ - The set action rule based on metric.
+ - To delete this attribute, pass an empty string.
+ type: str
+ set_metric_type:
+ description:
+ - The set action rule based on a metric type.
+ - To delete this attribute, pass an empty string.
+ type: str
+ choices: [ ospf_type_1, ospf_type_2, "" ]
+ set_route_tag:
+ description:
+ - The set action rule based on route tag.
+ - Can not be configured along with C(next_hop_propagation) and C(multipath).
+ - To delete this attribute, pass an empty string.
+ type: str
+ set_weight:
+ description:
+ - The set action rule based on weight.
+ - To delete this attribute, pass an empty string.
+ type: str
description:
description:
- The description for the action rule profile.
type: str
aliases: [ descr ]
- tenant:
- description:
- - The name of the tenant.
- type: str
- aliases: [ tenant_name ]
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -56,6 +143,8 @@ seealso:
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Dag Wieers (@dagwieers)
+- Tim Cragg (@timcragg)
+- Gaspard Micol (@gmicol)
"""
EXAMPLES = r"""
@@ -66,6 +155,40 @@ EXAMPLES = r"""
password: SomeSecretPassword
action_rule: my_action_rule
tenant: prod
+ set_preference: 100
+ set_weight: 100
+ set_metric: 100
+ set_metric_type: ospf_type_1
+ set_next_hop: 1.1.1.1
+ next_hop_propagation: true
+ multipath: true
+ set_community:
+ community: no-advertise
+ criteria: replace
+ set_dampening:
+ half_life: 10
+ reuse: 1
+ suppress: 10
+ max_suppress_time: 100
+ state: present
+ delegate_to: localhost
+
+- name: Delete action rule profile's children
+ cisco.aci.aci_tenant_action_rule_profile:
+ host: apic
+ username: admin
+ password: SomeSecretPassword
+ action_rule: my_action_rule
+ tenant: prod
+ set_preference: ""
+ set_weight: ""
+ set_metric: ""
+ set_metric_type: ""
+ set_next_hop: ""
+ next_hop_propagation: false
+ multipath: false
+ set_community: {}
+ set_dampening: {}
state: present
delegate_to: localhost
@@ -206,7 +329,14 @@ url:
"""
from ansible.module_utils.basic import AnsibleModule
-from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec
+from ansible_collections.cisco.aci.plugins.module_utils.aci import (
+ ACIModule,
+ aci_argument_spec,
+ aci_annotation_spec,
+ action_rule_set_comm_spec,
+ action_rule_set_dampening_spec,
+)
+from ansible_collections.cisco.aci.plugins.module_utils.constants import MATCH_ACTION_RULE_SET_METRIC_TYPE_MAPPING
def main():
@@ -215,6 +345,16 @@ def main():
argument_spec.update(
action_rule=dict(type="str", aliases=["action_rule_name", "name"]), # Not required for querying all objects
tenant=dict(type="str", aliases=["tenant_name"]), # Not required for querying all objects
+ set_community=dict(type="dict", options=action_rule_set_comm_spec()),
+ set_dampening=dict(type="dict", options=action_rule_set_dampening_spec()),
+ set_next_hop=dict(type="str"),
+ next_hop_propagation=dict(type="bool"),
+ multipath=dict(type="bool"),
+ set_preference=dict(type="str"),
+ set_metric=dict(type="str"),
+ set_metric_type=dict(type="str", choices=["ospf_type_1", "ospf_type_2", ""]),
+ set_route_tag=dict(type="str"),
+ set_weight=dict(type="str"),
description=dict(type="str", aliases=["descr"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
name_alias=dict(type="str"),
@@ -236,6 +376,31 @@ def main():
name_alias = module.params.get("name_alias")
aci = ACIModule(module)
+
+ # This dict contains the name of the child classes as well as the corresping attribute input (and attribute name if the input is a string)
+ # this dict is deviating from normal child classes list structure in order to determine which child classes should be created, modified, deleted or ignored.
+ child_classes = dict(
+ rtctrlSetComm=dict(attribute_input=module.params.get("set_community")),
+ rtctrlSetDamp=dict(attribute_input=module.params.get("set_dampening")),
+ rtctrlSetNh=dict(attribute_input=module.params.get("set_next_hop"), attribute_name="addr"),
+ rtctrlSetPref=dict(attribute_input=module.params.get("set_preference"), attribute_name="localPref"),
+ rtctrlSetRtMetric=dict(attribute_input=module.params.get("set_metric"), attribute_name="metric"),
+ rtctrlSetRtMetricType=dict(
+ attribute_input=MATCH_ACTION_RULE_SET_METRIC_TYPE_MAPPING.get(module.params.get("set_metric_type")), attribute_name="metricType"
+ ),
+ rtctrlSetTag=dict(attribute_input=module.params.get("set_route_tag"), attribute_name="tag"),
+ rtctrlSetWeight=dict(attribute_input=module.params.get("set_weight"), attribute_name="weight"),
+ )
+
+ # This condition deal with child classes which do not exist in APIC version 4.2 and prior.
+ additional_child_classes = dict(
+ rtctrlSetNhUnchanged=dict(attribute_input=module.params.get("next_hop_propagation")),
+ rtctrlSetRedistMultipath=dict(attribute_input=module.params.get("multipath")),
+ )
+ for class_name, attribute in additional_child_classes.items():
+ if attribute.get("attribute_input") is not None:
+ child_classes[class_name] = attribute
+
aci.construct_url(
root_class=dict(
aci_class="fvTenant",
@@ -249,11 +414,63 @@ def main():
module_object=action_rule,
target_filter={"name": action_rule},
),
+ child_classes=list(child_classes.keys()),
)
aci.get_existing()
if state == "present":
+ child_configs = []
+ for class_name, attribute in child_classes.items():
+ attribute_input = attribute.get("attribute_input")
+ # This condition enables to user to keep its previous configurations if they are not passing anything in the payload.
+ if attribute_input is not None:
+ # This condition checks if the attribute input is a dict and checks if all of its values are None (stored as a boolean in only_none).
+ only_none = False
+ if isinstance(attribute_input, dict):
+ only_none = all(value is None for value in attribute_input.values())
+ # This condition checks if the child object needs to be deleted depending on the type of the corresponding attribute input (bool, str, dict).
+ if (attribute_input == "" or attribute_input is False or only_none) and isinstance(aci.existing, list) and len(aci.existing) > 0:
+ for child in aci.existing[0].get("rtctrlAttrP", {}).get("children", {}):
+ if child.get(class_name):
+ child_configs.append(
+ {
+ class_name: dict(
+ attributes=dict(status="deleted"),
+ ),
+ }
+ )
+ # This condition checks if the child object needs to be modified or created depending on the type of the corresponding attribute input.
+ elif attribute_input != "" or attribute_input is True or attribute_input != {}:
+ if class_name == "rtctrlSetComm" and isinstance(attribute_input, dict):
+ child_configs.append(
+ {
+ class_name: dict(
+ attributes=dict(
+ community=attribute_input.get("community"),
+ setCriteria=attribute_input.get("criteria"),
+ ),
+ )
+ }
+ )
+ elif class_name == "rtctrlSetDamp" and isinstance(attribute_input, dict):
+ child_configs.append(
+ {
+ class_name: dict(
+ attributes=dict(
+ halfLife=attribute_input.get("half_life"),
+ maxSuppressTime=attribute_input.get("max_suppress_time"),
+ reuse=attribute_input.get("reuse"),
+ suppress=attribute_input.get("suppress"),
+ ),
+ )
+ }
+ )
+ elif class_name in ["rtctrlSetNhUnchanged", "rtctrlSetRedistMultipath"]:
+ child_configs.append({class_name: dict(attributes=dict(descr=""))})
+ else:
+ child_configs.append({class_name: dict(attributes={attribute.get("attribute_name"): attribute_input})})
+
aci.payload(
aci_class="rtctrlAttrP",
class_config=dict(
@@ -261,6 +478,7 @@ def main():
descr=description,
nameAlias=name_alias,
),
+ child_configs=child_configs,
)
aci.get_diff(aci_class="rtctrlAttrP")
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_vmm_controller.py b/ansible_collections/cisco/aci/plugins/modules/aci_vmm_controller.py
index f8a51529c..eac547dc1 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_vmm_controller.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_vmm_controller.py
@@ -3,6 +3,7 @@
# Copyright: (c) 2021, Manuel Widmer <mawidmer@cisco.com>
# Copyright: (c) 2021, Anvitha Jain (@anvitha-jain) <anvjain@cisco.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -88,6 +89,8 @@ seealso:
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Manuel Widmer (@lumean)
+- Anvitha Jain (@anvitha-jain)
+- Akini Ross (@akinross)
"""
EXAMPLES = r"""
@@ -132,7 +135,6 @@ EXAMPLES = r"""
host: apic
username: admin
password: SomeSecretPassword
- vm_provider: vmware
state: query
delegate_to: localhost
register: query_result
@@ -310,6 +312,8 @@ def main():
aci = ACIModule(module)
+ child_classes = ["vmmRsMgmtEPg", "vmmRsAcc"]
+
aci.construct_url(
root_class=dict(
aci_class="vmmProvP",
@@ -327,11 +331,23 @@ def main():
aci_class="vmmCtrlrP",
aci_rn="ctrlr-{0}".format(name),
module_object=name,
- target_filter={"name": "name"},
+ target_filter={"name": name},
),
- child_classes=["vmmRsMgmtEPg", "vmmRsAcc"],
+ child_classes=child_classes,
)
+ # vmmProvP is not allowed to execute a query with rsp-subtree set in the filter_string
+ # due to complicated url construction logic which should be refactored creating a temporary fix inside module
+ # TODO refactor url construction logic if more occurences of rsp-subtree not supported problem appear
+ # check if the url is pointing towards the vmmProvP class and rsp-subtree is set in the filter_string
+ if aci.url.split("/")[-1].startswith("vmmp-") and "rsp-subtree" in aci.filter_string:
+ if name:
+ aci.url = "{0}/api/class/vmmCtrlrP.json".format(aci.base_url)
+ aci.filter_string = '?query-target-filter=eq(vmmCtrlrP.name,"{0}")&rsp-subtree=full&rsp-subtree-class={1}'.format(name, ",".join(child_classes))
+ else:
+ aci.url = "{0}/api/mo/uni/vmmp-{1}.json".format(aci.base_url, VM_PROVIDER_MAPPING.get(vm_provider))
+ aci.filter_string = ""
+
aci.get_existing()
if state == "present":
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_vmm_vswitch_policy.py b/ansible_collections/cisco/aci/plugins/modules/aci_vmm_vswitch_policy.py
index 79d8182ff..90525e11c 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_vmm_vswitch_policy.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_vmm_vswitch_policy.py
@@ -14,7 +14,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_vmm_vswitch_policy
-short_description: Manage vSwitch policy for VMware virtual domains profiles (vmm:DomP)
+short_description: Manage vSwitch policy for VMware virtual domains profiles (vmm:VSwitchPolicyCont)
description:
- Manage vSwitch policy for VMware VMM domains on Cisco ACI fabrics.
options:
@@ -139,7 +139,7 @@ extends_documentation_fragment:
seealso:
- module: cisco.aci.aci_domain
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(vmm:DomP)
+ description: More information about the internal APIC classes B(vmm:VSwitchPolicyCont).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Manuel Widmer (@lumean)
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_vrf_multicast.py b/ansible_collections/cisco/aci/plugins/modules/aci_vrf_multicast.py
new file mode 100644
index 000000000..4d3809902
--- /dev/null
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_vrf_multicast.py
@@ -0,0 +1,702 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2023, Tim Cragg (@timcragg)
+# Copyright: (c) 2023, Akini Ross (@akinross)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+DOCUMENTATION = r"""
+---
+module: aci_vrf_multicast
+short_description: Manage VRF Multicast objects (pim:CtxP)
+description:
+- Manage VRF Multicast objects on Cisco ACI fabrics.
+- Creating I(state=present) enables Protocol Independent Multicast (PIM) on a VRF
+- Deleting I(state=absent) disables Protocol Independent Multicast (PIM) on a VRF.
+options:
+ tenant:
+ description:
+ - The name of an existing tenant.
+ type: str
+ aliases: [ tenant_name ]
+ vrf:
+ description:
+ - The name of an existing VRF.
+ type: str
+ aliases: [ vrf_name ]
+ pim_setting:
+ description: Configuration container for Protocol Independent Multicast (PIM) settings.
+ type: dict
+ suboptions:
+ mtu:
+ description:
+ - The MTU size supported for multicast.
+ - The APIC defaults to C(1500) when unset during creation.
+ type: int
+ control_state:
+ description:
+ - The action(s) to take when a loop is detected.
+ - Specify C([]) to remove the control state configuration.
+ type: list
+ elements: str
+ aliases: [ control, ctrl ]
+ choices: [ fast, strict ]
+ resource_policy:
+ description: Configuration container for Protocol Independent Multicast (PIM) resource policy.
+ type: dict
+ suboptions:
+ maximum_limit:
+ description:
+ - The Max Multicast Entries.
+ - The APIC defaults to C(unlimited) when unset during creation.
+ - Specify C(0) to reset to C(unlimited).
+ type: int
+ aliases: [ max ]
+ reserved_multicast_entries:
+ description:
+ - The Reserved Multicast Entries.
+ - The APIC defaults to C(undefined) when unset during creation.
+ - Required when C(reserved_route_map) is provided.
+ type: int
+ aliases: [ rsvd ]
+ reserved_route_map:
+ description:
+ - The DN of the Route Map.
+ - Specify C("") to remove the Route Map configuration.
+ - Required when C(reserved_multicast_entries) is provided.
+ type: str
+ aliases: [ route_map, route_map_dn ]
+ any_source_multicast:
+ description: Configuration container for Protocol Independent Multicast (PIM) Any Source Multicast (ASM) settings.
+ type: dict
+ aliases: [ asm, any_source ]
+ suboptions:
+ shared_range_route_map:
+ description:
+ - The DN of the Route Map.
+ - Specify C("") to remove the Route Map configuration.
+ type: str
+ aliases: [ shared_range_policy ]
+ source_group_expiry_route_map:
+ description:
+ - The DN of the Route Map.
+ - Specify C("") to remove the Route Map configuration.
+ type: str
+ aliases: [ sg_expiry_route_map ]
+ expiry:
+ description:
+ - The expiry time in seconds.
+ - The APIC defaults to C(default-timeout) when unset during creation.
+ - Specify C(0) to reset to C(default-timeout).
+ type: int
+ aliases: [ expiry_seconds ]
+ max_rate:
+ description:
+ - The maximum rate per second.
+ - The APIC defaults to C(65535) when unset during creation.
+ type: int
+ aliases: [ max_rate_per_second ]
+ source_ip:
+ description:
+ - The source IP address.
+ type: str
+ aliases: [ source, source_ip_address ]
+ source_specific_multicast:
+ description: Configuration container for Protocol Independent Multicast (PIM) Source Specific Multicast (SSM) settings.
+ type: dict
+ aliases: [ ssm, specific_source ]
+ suboptions:
+ group_range_route_map:
+ description:
+ - The DN of the Route Map.
+ - Specify C("") to remove the Route Map configuration.
+ type: str
+ aliases: [ group_range_policy ]
+ bootstrap_router:
+ description: Configuration container for Protocol Independent Multicast (PIM) Bootstrap Router (BSR) settings.
+ type: dict
+ aliases: [ bsr, bootstrap ]
+ suboptions:
+ bsr_filter:
+ description:
+ - The DN of the Route Map.
+ - Specify C("") to remove the Route Map configuration.
+ type: str
+ aliases: [ filter, route_map, route_map_dn ]
+ rp_updates:
+ description:
+ - The control state of the Bootstrap Router (BSR) policy.
+ - Specify C([]) to remove the control state configuration.
+ type: list
+ elements: str
+ aliases: [ control, ctrl ]
+ choices: [ forward, listen ]
+ auto_rp:
+ description: Configuration container for Protocol Independent Multicast (PIM) Auto-Rendezvous Point (Auto-RP) settings.
+ type: dict
+ aliases: [ auto ]
+ suboptions:
+ ma_filter:
+ description:
+ - The DN of the Route Map.
+ - Specify C("") to remove the Route Map configuration.
+ type: str
+ aliases: [ filter, route_map, route_map_dn ]
+ rp_updates:
+ description:
+ - The control state of the Auto-Rendezvous Point (Auto-RP) policy.
+ - Specify C([]) to remove the control state configuration.
+ type: list
+ elements: str
+ aliases: [ control, ctrl ]
+ choices: [ forward, listen ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+extends_documentation_fragment:
+- cisco.aci.aci
+- cisco.aci.annotation
+- cisco.aci.owner
+
+notes:
+- The I(tenant) and I(vrf) must exist before using this module in your playbook.
+ The M(cisco.aci.aci_tenant) and M(cisco.aci.aci_vrf) modules can be used for this.
+seealso:
+- name: APIC Management Information Model reference
+ description: More information about the internal APIC class B(pim:CtxP).
+ link: https://developer.cisco.com/docs/apic-mim-ref/
+author:
+- Tim Cragg (@timcragg)
+- Akini Ross (@akinross)
+"""
+
+EXAMPLES = r"""
+- name: Enable Multicast on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ state: present
+ delegate_to: localhost
+
+- name: Change Multicast PIM Settings on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ pim_setting:
+ mtu: 2000
+ control_state: [ fast, strict ]
+ state: present
+ delegate_to: localhost
+
+- name: Change Multicast Resource Policy on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ resource_policy:
+ maximum_limit: 100
+ reserved_multicast_entries: 20
+ reserved_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ state: present
+ delegate_to: localhost
+
+- name: Remove Route-Map from Multicast Resource Policy on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ resource_policy:
+ reserved_route_map: ""
+ state: present
+ delegate_to: localhost
+
+- name: Change Multicast Any Source Multicast (ASM) Settings on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ any_source_multicast:
+ shared_range_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ source_group_expiry_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ expiry: 500
+ max_rate: 64000
+ source_ip: 1.1.1.1
+ state: present
+ delegate_to: localhost
+
+- name: Change Multicast Source Specific Multicast (SSM) Settings on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ source_specific_multicast:
+ group_range_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ state: present
+ delegate_to: localhost
+
+- name: Change Multicast Bootstrap Router (BSR) Settings on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ bootstrap_router:
+ bsr_filter: uni/tn-ansible_test/rtmap-ansible_test
+ rp_updates: [ forward, listen ]
+ state: present
+ delegate_to: localhost
+
+- name: Change Multicast Auto-Rendezvous Point (Auto-RP) Settings on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ auto_rp:
+ ma_filter: uni/tn-ansible_test/rtmap-ansible_test
+ rp_updates: [ forward, listen ]
+ state: present
+ delegate_to: localhost
+
+- name: Disable Multicast on a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ state: absent
+ delegate_to: localhost
+
+- name: Query Multicast Settings for a VRF
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ state: query
+ delegate_to: localhost
+ register: query_result
+
+- name: Query Multicast Settings for all VRFs
+ cisco.aci.aci_vrf_multicast:
+ host: apic
+ username: admin
+ password: SomeSecretePassword
+ state: query
+ delegate_to: localhost
+ register: query_result
+"""
+
+RETURN = r"""
+ current:
+ description: The existing configuration from the APIC after the module has finished
+ returned: success
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ error:
+ description: The error information as returned from the APIC
+ returned: failure
+ type: dict
+ sample:
+ {
+ "code": "122",
+ "text": "unknown managed object class foo"
+ }
+ raw:
+ description: The raw output returned by the APIC REST API (xml or json)
+ returned: parse error
+ type: str
+ sample: '<?xml version="1.0" encoding="UTF-8"?><imdata totalCount="1"><error code="122" text="unknown managed object class "/></imdata>'
+ sent:
+ description: The actual/minimal configuration pushed to the APIC
+ returned: info
+ type: list
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment"
+ }
+ }
+ }
+ previous:
+ description: The original configuration from the APIC before the module has started
+ returned: info
+ type: list
+ sample:
+ [
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production",
+ "dn": "uni/tn-production",
+ "name": "production",
+ "nameAlias": "",
+ "ownerKey": "",
+ "ownerTag": ""
+ }
+ }
+ }
+ ]
+ proposed:
+ description: The assembled configuration from the user-provided parameters
+ returned: info
+ type: dict
+ sample:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Production environment",
+ "name": "production"
+ }
+ }
+ }
+ filter_string:
+ description: The filter string used for the request
+ returned: failure or debug
+ type: str
+ sample: ?rsp-prop-include=config-only
+ method:
+ description: The HTTP method used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: POST
+ response:
+ description: The HTTP response from the APIC
+ returned: failure or debug
+ type: str
+ sample: OK (30 bytes)
+ status:
+ description: The HTTP status from the APIC
+ returned: failure or debug
+ type: int
+ sample: 200
+ url:
+ description: The HTTP url used for the request to the APIC
+ returned: failure or debug
+ type: str
+ sample: https://10.11.12.13/api/mo/uni/tn-production.json
+ """
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.aci.plugins.module_utils.aci import ACIModule, aci_argument_spec, aci_annotation_spec, aci_owner_spec
+from ansible_collections.cisco.aci.plugins.module_utils.constants import PIM_SETTING_CONTROL_STATE_MAPPING
+
+
+def main():
+ argument_spec = aci_argument_spec()
+ argument_spec.update(aci_annotation_spec())
+ argument_spec.update(aci_owner_spec())
+ argument_spec.update(
+ tenant=dict(type="str", aliases=["tenant_name"]),
+ vrf=dict(type="str", aliases=["vrf_name"]),
+ pim_setting=dict(
+ type="dict",
+ options=dict(
+ mtu=dict(type="int"),
+ control_state=dict(type="list", elements="str", choices=["fast", "strict"], aliases=["control", "ctrl"]),
+ ),
+ ),
+ resource_policy=dict(
+ type="dict",
+ options=dict(
+ maximum_limit=dict(type="int", aliases=["max"]),
+ reserved_multicast_entries=dict(type="int", aliases=["rsvd"]),
+ reserved_route_map=dict(type="str", aliases=["route_map", "route_map_dn"]),
+ ),
+ ),
+ any_source_multicast=dict(
+ type="dict",
+ options=dict(
+ shared_range_route_map=dict(type="str", aliases=["shared_range_policy"]),
+ source_group_expiry_route_map=dict(type="str", aliases=["sg_expiry_route_map"]),
+ expiry=(dict(type="int", aliases=["expiry_seconds"])),
+ max_rate=(dict(type="int", aliases=["max_rate_per_second"])),
+ source_ip=(dict(type="str", aliases=["source", "source_ip_address"])),
+ ),
+ aliases=["asm", "any_source"],
+ ),
+ source_specific_multicast=dict(
+ type="dict",
+ options=dict(
+ group_range_route_map=dict(type="str", aliases=["group_range_policy"]),
+ ),
+ aliases=["ssm", "specific_source"],
+ ),
+ bootstrap_router=dict(
+ type="dict",
+ options=dict(
+ bsr_filter=dict(type="str", aliases=["filter", "route_map", "route_map_dn"]),
+ rp_updates=dict(type="list", elements="str", choices=["forward", "listen"], aliases=["control", "ctrl"]),
+ ),
+ aliases=["bsr", "bootstrap"],
+ ),
+ auto_rp=dict(
+ type="dict",
+ options=dict(
+ ma_filter=dict(type="str", aliases=["filter", "route_map", "route_map_dn"]),
+ rp_updates=dict(type="list", elements="str", choices=["forward", "listen"], aliases=["control", "ctrl"]),
+ ),
+ aliases=["auto"],
+ ),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["tenant", "vrf"]],
+ ["state", "present", ["tenant", "vrf"]],
+ ],
+ )
+
+ aci = ACIModule(module)
+
+ tenant = module.params.get("tenant")
+ vrf = module.params.get("vrf")
+ pim_setting = module.params.get("pim_setting")
+ resource_policy = module.params.get("resource_policy")
+ any_source_multicast = module.params.get("any_source_multicast")
+ source_specific_multicast = module.params.get("source_specific_multicast")
+ bootstrap_router = module.params.get("bootstrap_router")
+ auto_rp = module.params.get("auto_rp")
+ state = module.params.get("state")
+
+ if resource_policy and resource_policy.get("reserved_multicast_entries") and resource_policy.get("reserved_route_map") is None:
+ aci.fail_json(msg="parameters are mutually exclusive: reserved_route_map|reserved_multicast_entries")
+ elif resource_policy and resource_policy.get("reserved_route_map") and not resource_policy.get("reserved_multicast_entries"):
+ aci.fail_json(msg="C(reserved_multicast_entries) must be provided and greater than 0 when C(reserved_route_map) is provided")
+
+ aci.construct_url(
+ root_class=dict(
+ aci_class="fvTenant",
+ aci_rn="tn-{0}".format(tenant),
+ module_object=tenant,
+ target_filter={"name": tenant},
+ ),
+ subclass_1=dict(
+ aci_class="fvCtx",
+ aci_rn="ctx-{0}".format(vrf),
+ module_object=vrf,
+ target_filter={"name": vrf},
+ ),
+ subclass_2=dict(
+ aci_class="pimCtxP",
+ aci_rn="pimctxp",
+ target_filter={"name": ""},
+ ),
+ child_classes=["pimResPol", "pimASMPatPol", "pimSSMPatPol", "pimAutoRPPol", "pimBSRPPol"],
+ )
+
+ aci.get_existing()
+
+ if state == "present":
+ existing_config = aci.existing[0] if aci.existing else {}
+ child_configs = []
+
+ resource_policy_config = dict(pimResPol=dict(attributes=dict(name=""), children=[]))
+ if resource_policy:
+ max = "unlimited" if resource_policy.get("maximum_limit") == 0 else resource_policy.get("maximum_limit")
+ if max is not None:
+ resource_policy_config["pimResPol"]["attributes"]["max"] = str(max)
+
+ reserved_route_map = resource_policy.get("reserved_route_map")
+ if reserved_route_map is not None:
+ existing_rrm = get_child_from_existing_config(existing_config, ["pimCtxP", "pimResPol", "rtdmcRsFilterToRtMapPol"])
+ rsvd = resource_policy.get("reserved_multicast_entries")
+
+ if (existing_rrm or reserved_route_map != "") and rsvd:
+ resource_policy_config["pimResPol"]["attributes"]["rsvd"] = str(rsvd)
+ elif existing_rrm and reserved_route_map == "":
+ resource_policy_config["pimResPol"]["attributes"]["rsvd"] = "undefined"
+
+ set_route_map_config(
+ existing_config,
+ resource_policy_config["pimResPol"]["children"],
+ ["pimCtxP", "pimResPol", "rtdmcRsFilterToRtMapPol"],
+ reserved_route_map,
+ )
+
+ child_configs.append(resource_policy_config)
+
+ any_source_multicast_config = dict(
+ pimASMPatPol=dict(
+ attributes=dict(name=""),
+ children=[
+ dict(pimSharedRangePol=dict(attributes=dict(name=""), children=[])),
+ dict(pimSGRangeExpPol=dict(attributes=dict(name=""), children=[])),
+ dict(pimRegTrPol=dict(attributes=dict(name=""), children=[])),
+ ],
+ )
+ )
+ if any_source_multicast:
+ if any_source_multicast.get("shared_range_route_map") is not None:
+ set_route_map_config(
+ existing_config,
+ any_source_multicast_config["pimASMPatPol"]["children"][0]["pimSharedRangePol"]["children"],
+ ["pimCtxP", "pimASMPatPol", "pimSharedRangePol", "rtdmcRsFilterToRtMapPol"],
+ any_source_multicast.get("shared_range_route_map"),
+ )
+
+ if any_source_multicast.get("source_group_expiry_route_map") is not None:
+ set_route_map_config(
+ existing_config,
+ any_source_multicast_config["pimASMPatPol"]["children"][1]["pimSGRangeExpPol"]["children"],
+ ["pimCtxP", "pimASMPatPol", "pimSGRangeExpPol", "rtdmcRsFilterToRtMapPol"],
+ any_source_multicast.get("source_group_expiry_route_map"),
+ )
+
+ expiry = any_source_multicast.get("expiry")
+ if expiry is not None:
+ sg_expiry_config = "default-timeout" if any_source_multicast.get("expiry") == 0 else any_source_multicast.get("expiry")
+ any_source_multicast_config["pimASMPatPol"]["children"][1]["pimSGRangeExpPol"]["attributes"]["sgExpItvl"] = str(sg_expiry_config)
+
+ if any_source_multicast.get("max_rate") is not None:
+ any_source_multicast_config["pimASMPatPol"]["children"][2]["pimRegTrPol"]["attributes"]["maxRate"] = str(any_source_multicast.get("max_rate"))
+
+ if any_source_multicast.get("source_ip") is not None:
+ any_source_multicast_config["pimASMPatPol"]["children"][2]["pimRegTrPol"]["attributes"]["srcIp"] = any_source_multicast.get("source_ip")
+
+ child_configs.append(any_source_multicast_config)
+
+ source_specific_multicast_config = dict(
+ pimSSMPatPol=dict(
+ attributes=dict(name=""),
+ children=[
+ dict(pimSSMRangePol=dict(attributes=dict(name=""), children=[])),
+ ],
+ )
+ )
+ if source_specific_multicast and source_specific_multicast.get("group_range_route_map") is not None:
+ set_route_map_config(
+ existing_config,
+ source_specific_multicast_config["pimSSMPatPol"]["children"][0]["pimSSMRangePol"]["children"],
+ ["pimCtxP", "pimSSMPatPol", "pimSSMRangePol", "rtdmcRsFilterToRtMapPol"],
+ source_specific_multicast.get("group_range_route_map"),
+ )
+
+ child_configs.append(source_specific_multicast_config)
+
+ if bootstrap_router:
+ bsr_config = dict(pimBSRPPol=dict(attributes=dict(name=""), children=[dict(pimBSRFilterPol=dict(attributes=dict(name=""), children=[]))]))
+ if bootstrap_router.get("bsr_filter") is not None:
+ set_route_map_config(
+ existing_config,
+ bsr_config["pimBSRPPol"]["children"][0]["pimBSRFilterPol"]["children"],
+ ["pimCtxP", "pimBSRPPol", "pimBSRFilterPol", "rtdmcRsFilterToRtMapPol"],
+ bootstrap_router.get("bsr_filter"),
+ )
+
+ rp_updates = bootstrap_router.get("rp_updates")
+ if rp_updates is not None:
+ bsr_config["pimBSRPPol"]["attributes"]["ctrl"] = ",".join(sorted(rp_updates))
+
+ child_configs.append(bsr_config)
+
+ if auto_rp:
+ auto_rp_config = dict(pimAutoRPPol=dict(attributes=dict(name=""), children=[dict(pimMAFilterPol=dict(attributes=dict(name=""), children=[]))]))
+
+ if auto_rp.get("ma_filter") is not None:
+ set_route_map_config(
+ existing_config,
+ auto_rp_config["pimAutoRPPol"]["children"][0]["pimMAFilterPol"]["children"],
+ ["pimCtxP", "pimAutoRPPol", "pimMAFilterPol", "rtdmcRsFilterToRtMapPol"],
+ auto_rp.get("ma_filter"),
+ )
+
+ rp_updates = auto_rp.get("rp_updates")
+ if rp_updates is not None:
+ auto_rp_config["pimAutoRPPol"]["attributes"]["ctrl"] = ",".join(sorted(rp_updates))
+
+ child_configs.append(auto_rp_config)
+
+ mtu = None
+ control_state = None
+ if pim_setting:
+ mtu = pim_setting.get("mtu")
+ control_state = (
+ ",".join(sorted([PIM_SETTING_CONTROL_STATE_MAPPING.get(v) for v in pim_setting.get("control_state")]))
+ if pim_setting.get("control_state") is not None
+ else None
+ )
+
+ aci.payload(
+ aci_class="pimCtxP",
+ class_config=dict(mtu=mtu, ctrl=control_state),
+ child_configs=child_configs,
+ )
+
+ aci.get_diff(aci_class="pimCtxP")
+
+ aci.post_config()
+
+ elif state == "absent":
+ aci.delete_config()
+
+ aci.exit_json()
+
+
+def get_child_from_existing_config(config, class_names):
+ parent = class_names[0]
+ class_names.remove(parent)
+
+ for child in config.get(parent, {}).get("children", []):
+ if len(class_names) == 1 and class_names[0] in child.keys():
+ return child
+ elif child.get(class_names[0], {}).get("children"):
+ return get_child_from_existing_config(child, class_names)
+
+
+def set_route_map_config(existing_config, new_config, class_names, route_map):
+ existing_route_map = get_child_from_existing_config(existing_config, class_names)
+ if route_map == "" and existing_route_map:
+ new_config.append(dict(rtdmcRsFilterToRtMapPol=dict(attributes=dict(tDn=route_map, status="deleted"))))
+ elif route_map:
+ new_config.append(dict(rtdmcRsFilterToRtMapPol=dict(attributes=dict(tDn=route_map))))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/aci/plugins/modules/aci_vzany_to_contract.py b/ansible_collections/cisco/aci/plugins/modules/aci_vzany_to_contract.py
index f2632307c..411f63936 100644
--- a/ansible_collections/cisco/aci/plugins/modules/aci_vzany_to_contract.py
+++ b/ansible_collections/cisco/aci/plugins/modules/aci_vzany_to_contract.py
@@ -12,7 +12,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: aci_vzany_to_contract
-short_description: Attach contracts to vzAny (vz:RsAnyToProv, vz:RsAnyToCons, vz:RsAnyToConsIf)
+short_description: Attach contracts to vzAny (vz:RsAnyToProv, vz:RsAnyToCons, and vz:RsAnyToConsIf)
description:
- Bind contracts to vzAny on Cisco ACI fabrics.
options:
@@ -54,7 +54,7 @@ seealso:
- module: cisco.aci.aci_vrf
- module: cisco.aci.aci_contract
- name: APIC Management Information Model reference
- description: More information about the internal APIC classes B(fv:RsCons) and B(fv:RsProv).
+ description: More information about the internal APIC classes B(vz:RsAnyToProv), B(vz:RsAnyToCons), and B(vz:RsAnyToConsIf).
link: https://developer.cisco.com/docs/apic-mim-ref/
author:
- Marcel Zehnder (@maercu)
diff --git a/ansible_collections/cisco/aci/tests/integration/inventory.networking b/ansible_collections/cisco/aci/tests/integration/inventory.networking
index 357f58758..9e17071d0 100644
--- a/ansible_collections/cisco/aci/tests/integration/inventory.networking
+++ b/ansible_collections/cisco/aci/tests/integration/inventory.networking
@@ -1,13 +1,13 @@
[aci]
cn-dmz-apic-m1-02-v42 ansible_host=173.36.219.68 aci_hostname=173.36.219.68
cn-dmz-apic-m1-03-v52 ansible_host=173.36.219.69 aci_hostname=173.36.219.69
-cn-dmz-apic-m1-04-v60 ansible_host=173.36.219.70 aci_hostname=173.36.219.70
-cn-dmz-apic-m1-07-v32 ansible_host=173.36.219.73 aci_hostname=173.36.219.73
+cn-dmz-apic-m1-04-v602h ansible_host=173.36.219.70 aci_hostname=173.36.219.70
aws_cloud ansible_host=52.52.20.121 aci_hostname=52.52.20.121 cloud_type=aws region=us-east-1 region_2=us-west-1 availability_zone=us-west-1a
-azure_cloud ansible_host=20.245.236.136 aci_hostname=20.245.236.136 cloud_type=azure region=westus region_2=westus2 vnet_gateway=true
+azure_cloud ansible_host=20.245.236.136 aci_hostname=20.245.236.136 cloud_type=azure region=westus region_2=westus2 vnet_gateway=true az_region=westus2
[aci:vars]
aci_username=ansible_github_ci
+aci_remote_username="apic:test\\r_ansible_github_ci"
aci_password="sJ94G92#8dq2hx*K4qh"
ansible_network_os=cisco.aci.aci
ansible_connection=local
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/pki/admin.crt b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/pki/admin.crt
new file mode 100644
index 000000000..cfac5531e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/pki/admin.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICODCCAaGgAwIBAgIJAIt8XMntue0VMA0GCSqGSIb3DQEBCwUAMDQxDjAMBgNV
+BAMMBUFkbWluMRUwEwYDVQQKDAxZb3VyIENvbXBhbnkxCzAJBgNVBAYTAlVTMCAX
+DTE4MDEwOTAwNTk0NFoYDzIxMTcxMjE2MDA1OTQ0WjA0MQ4wDAYDVQQDDAVBZG1p
+bjEVMBMGA1UECgwMWW91ciBDb21wYW55MQswCQYDVQQGEwJVUzCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAohG/7axtt7CbSaMP7r+2mhTKbNgh0Ww36C7Ta14i
+v+VmLyKkQHnXinKGhp6uy3Nug+15a+eIu7CrgpBVMQeCiWfsnwRocKcQJWIYDrWl
+XHxGQn31yYKR6mylE7Dcj3rMFybnyhezr5D8GcP85YRPmwG9H2hO/0Y1FUnWu9Iw
+AQkCAwEAAaNQME4wHQYDVR0OBBYEFD0jLXfpkrU/ChzRvfruRs/fy1VXMB8GA1Ud
+IwQYMBaAFD0jLXfpkrU/ChzRvfruRs/fy1VXMAwGA1UdEwQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAOmvre+5tgZ0+F3DgsfxNQqLTrGiBgGCIymPkP/cBXXkNuJyl
+3ac7tArHQc7WEA4U2R2rZbEq8FC3UJJm4nUVtCPvEh3G9OhN2xwYev79yt6pIn/l
+KU0Td2OpVyo0eLqjoX5u2G90IBWzhyjFbo+CcKMrSVKj1YOdG0E3OuiJf00=
+-----END CERTIFICATE-----
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/tasks/main.yml
new file mode 100644
index 000000000..15cdeeb60
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_certificate_authority/tasks/main.yml
@@ -0,0 +1,305 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
+#
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_use_proxy | default("debug") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+# CLEAN ENVIRONMENT
+- name: Clean certificate_authority_1
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_1_absent
+ <<: *aci_info
+ name: certificate_authority_1
+ state: absent
+
+- name: Clean certificate_authority_2
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_2_absent
+ <<: *aci_info
+ name: certificate_authority_2
+ state: absent
+ register: result
+ until: result is not failed
+ delay: 2
+ retries: 4
+
+# CREATE
+- name: Create a certificate authority (check_mode)
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_1_present
+ <<: *certificate_authority_1_absent
+ certificate_chain: "{{ lookup('file', 'pki/admin.crt') }}"
+ state: present
+ check_mode: true
+ register: cm_create_certificate_authority_1
+
+- name: Create a certificate authority
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1_present
+ register: nm_create_certificate_authority_1
+ until: nm_create_certificate_authority_1 is not failed
+ delay: 2
+ retries: 4
+
+- name: Create a certificate authority again
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1_present
+ register: nm_create_certificate_authority_1_again
+ until: nm_create_certificate_authority_1_again is not failed
+ delay: 2
+ retries: 4
+
+- name: Assertions for creating a certificate authority
+ ansible.builtin.assert:
+ that:
+ - cm_create_certificate_authority_1 is changed
+ - cm_create_certificate_authority_1.previous == []
+ - cm_create_certificate_authority_1.current == []
+ - cm_create_certificate_authority_1.proposed.pkiTP.attributes.name == "certificate_authority_1"
+ - nm_create_certificate_authority_1 is changed
+ - nm_create_certificate_authority_1.previous == []
+ - nm_create_certificate_authority_1.current.0.pkiTP.attributes.name == "certificate_authority_1"
+ - nm_create_certificate_authority_1.current.0.pkiTP.attributes.descr == ""
+ - nm_create_certificate_authority_1_again is not changed
+ - nm_create_certificate_authority_1_again.previous.0.pkiTP.attributes.name == "certificate_authority_1"
+ - nm_create_certificate_authority_1_again.previous.0.pkiTP.attributes.descr == ""
+ - nm_create_certificate_authority_1_again.current.0.pkiTP.attributes.name == "certificate_authority_1"
+ - nm_create_certificate_authority_1_again.current.0.pkiTP.attributes.descr == ""
+
+# UPDATE
+- name: Update an existing certificate authority
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1_present
+ description: "This is a changed description."
+ register: nm_update_certificate_authority_1
+ until: nm_update_certificate_authority_1 is not failed
+ delay: 2
+ retries: 4
+
+- name: Assertions for updating a certificate authority
+ ansible.builtin.assert:
+ that:
+ - nm_update_certificate_authority_1 is changed
+ - nm_update_certificate_authority_1.previous.0.pkiTP.attributes.name == "certificate_authority_1"
+ - nm_update_certificate_authority_1.previous.0.pkiTP.attributes.descr == ""
+ - nm_update_certificate_authority_1.current.0.pkiTP.attributes.name == "certificate_authority_1"
+ - nm_update_certificate_authority_1.current.0.pkiTP.attributes.descr == "This is a changed description."
+
+- name: Execute tasks only for cloud sites
+ when: query_cloud.current != [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Delete certificate authority for cloud site tenant
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_cloud_absent
+ <<: *certificate_authority_1_present
+ cloud_tenant: cloud_tenant
+ name: certificate_authority_cloud
+ state: absent
+ register: nm_delete_certificate_authority_1_cloud
+ until: nm_delete_certificate_authority_1_cloud is not failed
+ delay: 2
+ retries: 4
+
+ - name: Create tenant for cloud site
+ cisco.aci.aci_tenant: &cloud_tenant
+ <<: *aci_info
+ name: cloud_tenant
+ register: cloud_tenant
+ until: cloud_tenant is not failed
+ delay: 2
+ retries: 4
+
+ - name: Create certificate authority for cloud site tenant (check_mode)
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_cloud_present
+ <<: *certificate_authority_cloud_absent
+ state: present
+ check_mode: true
+ register: cm_create_certificate_authority_1_cloud
+ until: cm_create_certificate_authority_1_cloud is not failed
+ delay: 2
+ retries: 4
+
+ - name: Create certificate authority for cloud site tenant
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_cloud_present
+ register: nm_create_certificate_authority_1_cloud
+ until: nm_create_certificate_authority_1_cloud is not failed
+ delay: 2
+ retries: 4
+
+ - name: Create certificate authority for cloud site tenant again
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_cloud_present
+ register: nm_create_certificate_authority_1_cloud_again
+ until: nm_create_certificate_authority_1_cloud is not failed
+ delay: 2
+ retries: 4
+
+ - name: Verify certificate authority is created in cloud tenant
+ ansible.builtin.assert:
+ that:
+ - cm_create_certificate_authority_1_cloud is changed
+ - cm_create_certificate_authority_1_cloud.previous == []
+ - cm_create_certificate_authority_1_cloud.current == []
+ - cm_create_certificate_authority_1_cloud.proposed.pkiTP.attributes.name == "certificate_authority_cloud"
+ - '"tn-cloud_tenant/certstore/tp-certificate_authority_cloud" in cm_create_certificate_authority_1_cloud.url'
+ - nm_create_certificate_authority_1_cloud is changed
+ - nm_create_certificate_authority_1_cloud.previous == []
+ - nm_create_certificate_authority_1_cloud.current.0.pkiTP.attributes.name == "certificate_authority_cloud"
+ - nm_create_certificate_authority_1_cloud.current.0.pkiTP.attributes.descr == ""
+ - '"tn-cloud_tenant/certstore/tp-certificate_authority_cloud" in nm_create_certificate_authority_1_cloud.url'
+ - nm_create_certificate_authority_1_cloud_again is not changed
+ - nm_create_certificate_authority_1_cloud_again.previous.0.pkiTP.attributes.name == "certificate_authority_cloud"
+ - nm_create_certificate_authority_1_cloud_again.previous.0.pkiTP.attributes.descr == ""
+ - nm_create_certificate_authority_1_cloud_again.current.0.pkiTP.attributes.name == "certificate_authority_cloud"
+ - nm_create_certificate_authority_1_cloud_again.current.0.pkiTP.attributes.descr == ""
+ - '"tn-cloud_tenant/certstore/tp-certificate_authority_cloud" in nm_create_certificate_authority_1_cloud_again.url'
+
+ - name: Delete certificate authority for cloud site tenant (check_mode)
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_cloud_absent
+ check_mode: true
+ register: cm_delete_certificate_authority_1_cloud
+ until: cm_delete_certificate_authority_1_cloud is not failed
+ delay: 2
+ retries: 4
+
+ - name: Delete certificate authority for cloud site tenant
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_cloud_absent
+ register: nm_delete_certificate_authority_1_cloud
+ until: nm_delete_certificate_authority_1_cloud is not failed
+ delay: 2
+ retries: 4
+
+ - name: Delete certificate authority for cloud site tenant again
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_cloud_absent
+ register: nm_delete_certificate_authority_1_cloud_again
+ until: nm_delete_certificate_authority_1_cloud_again is not failed
+ delay: 2
+ retries: 4
+
+ - name: Verify certificate authority is deleted in cloud tenant
+ ansible.builtin.assert:
+ that:
+ - cm_delete_certificate_authority_1_cloud is changed
+ - cm_delete_certificate_authority_1_cloud.proposed == {}
+ - cm_delete_certificate_authority_1_cloud.previous.0.pkiTP.attributes.name == "certificate_authority_cloud"
+ - cm_delete_certificate_authority_1_cloud.previous.0.pkiTP.attributes.descr == ""
+ - cm_delete_certificate_authority_1_cloud.current.0.pkiTP.attributes.name == "certificate_authority_cloud"
+ - cm_delete_certificate_authority_1_cloud.current.0.pkiTP.attributes.descr == ""
+ - '"tn-cloud_tenant/certstore/tp-certificate_authority_cloud" in cm_delete_certificate_authority_1_cloud.url'
+ - nm_delete_certificate_authority_1_cloud is changed
+ - nm_delete_certificate_authority_1_cloud.previous.0.pkiTP.attributes.name == "certificate_authority_cloud"
+ - nm_delete_certificate_authority_1_cloud.previous.0.pkiTP.attributes.descr == ""
+ - nm_delete_certificate_authority_1_cloud.current == []
+ - '"tn-cloud_tenant/certstore/tp-certificate_authority_cloud" in nm_delete_certificate_authority_1_cloud.url'
+ - nm_delete_certificate_authority_1_cloud_again is not changed
+ - nm_delete_certificate_authority_1_cloud_again.previous == []
+ - nm_delete_certificate_authority_1_cloud_again.current == []
+ - '"tn-cloud_tenant/certstore/tp-certificate_authority_cloud" in nm_delete_certificate_authority_1_cloud_again.url'
+
+ - name: Delete tenant for cloud site
+ cisco.aci.aci_tenant:
+ <<: *cloud_tenant
+ state: absent
+ register: cloud_tenant
+ until: cloud_tenant is not failed
+ delay: 2
+ retries: 4
+
+# QUERY
+- name: Create another certificate authority
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_2_absent
+ certificate_chain: "{{ lookup('file', 'pki/admin.crt') }}"
+ state: present
+ register: nm_create_certificate_authority_2
+ until: nm_create_certificate_authority_2 is not failed
+ delay: 2
+ retries: 4
+
+- name: Query a certificate authority
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1_present
+ state: query
+ register: query_certificate_authority_1
+ until: query_certificate_authority_1 is not failed
+ delay: 2
+ retries: 4
+
+- name: Query all fabric management access policies
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *aci_info
+ state: query
+ register: query_all
+
+- name: Assertions for querying fabric management access policies
+ ansible.builtin.assert:
+ that:
+ - query_certificate_authority_1 is not changed
+ - query_certificate_authority_1.current.0.pkiTP.attributes.name == "certificate_authority_1"
+ - query_certificate_authority_1.current.0.pkiTP.attributes.descr == "This is a changed description."
+ - query_certificate_authority_1.current | length == 1
+ - query_all is not changed
+ - query_all.current | length >= 2
+
+# DELETE
+- name: Delete a certificate authority (check_mode)
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1_absent
+ check_mode: true
+ register: cm_delete_certificate_authority_1
+
+- name: Delete a certificate authority
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1_absent
+ register: nm_delete_certificate_authority_1
+ until: nm_delete_certificate_authority_1 is not failed
+ delay: 2
+ retries: 4
+
+- name: Delete a certificate authority again
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1_absent
+ register: nm_delete_certificate_authority_1_again
+ until: nm_delete_certificate_authority_1_again is not failed
+ delay: 2
+ retries: 4
+
+- name: Assertions for deleting a certificate authority
+ ansible.builtin.assert:
+ that:
+ - cm_delete_certificate_authority_1 is changed
+ - cm_delete_certificate_authority_1.proposed == {}
+ - cm_delete_certificate_authority_1.previous.0.pkiTP.attributes.name == "certificate_authority_1"
+ - cm_delete_certificate_authority_1.previous.0.pkiTP.attributes.descr == "This is a changed description."
+ - cm_delete_certificate_authority_1.current.0.pkiTP.attributes.name == "certificate_authority_1"
+ - cm_delete_certificate_authority_1.current.0.pkiTP.attributes.descr == "This is a changed description."
+ - nm_delete_certificate_authority_1 is changed
+ - nm_delete_certificate_authority_1.previous.0.pkiTP.attributes.name == "certificate_authority_1"
+ - nm_delete_certificate_authority_1.previous.0.pkiTP.attributes.descr == "This is a changed description."
+ - nm_delete_certificate_authority_1.current == []
+ - nm_delete_certificate_authority_1_again is not changed
+ - nm_delete_certificate_authority_1_again.previous == []
+ - nm_delete_certificate_authority_1_again.current == []
+
+# CLEAN ENVIRONMENT
+- name: Delete another certificate authority
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_2_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_custom_privilege/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_custom_privilege/tasks/main.yml
index 04b7070e2..907d21772 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_custom_privilege/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_custom_privilege/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -47,7 +47,7 @@
register: cm_cp_present
- name: Assertions check for add a custom privilege with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_cp_present is changed
- cm_cp_present.current | length == 0
@@ -63,7 +63,7 @@
register: nm_cp_present
- name: Assertions check for add a custom privilege with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_cp_present is changed
- nm_cp_present.current | length == 1
@@ -79,7 +79,7 @@
register: idempotency_cp_present
- name: Idempotency assertions check for add a custom privilege with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_cp_present is not changed
- idempotency_cp_present.current | length == 1
@@ -106,7 +106,7 @@
register: cp_with_none_priv
- name: Assertions check for add a custom privilege with none privileges
- assert:
+ ansible.builtin.assert:
that:
- cp_with_none_priv is changed
- cp_with_none_priv.current | length == 1
@@ -123,7 +123,7 @@
register: update_cp_with_priv
- name: Assertions check for update fv_tenant_present custom privilege with 'custom-privilege-2' privilege
- assert:
+ ansible.builtin.assert:
that:
- update_cp_with_priv is changed
- update_cp_with_priv.current | length == 1
@@ -141,7 +141,7 @@
register: update_cp_w_priv_check
- name: Assertions check for update fv_tenant_present - write_privilege to 'custom-privilege-3' privilege
- assert:
+ ansible.builtin.assert:
that:
- update_cp_w_priv_check is changed
- update_cp_w_priv_check.current | length == 1
@@ -161,7 +161,7 @@
register: query_a_cp_with_name
- name: Assertions check for query a custom privilege with name
- assert:
+ ansible.builtin.assert:
that:
- query_a_cp_with_name is not changed
- query_a_cp_with_name.current | length == 1
@@ -176,7 +176,7 @@
register: query_all_cp
- name: Assertions check for query all custom privileges
- assert:
+ ansible.builtin.assert:
that:
- query_all_cp is not changed
- query_all_cp.current | length >= 2
@@ -190,7 +190,7 @@
register: cm_cp_absent
- name: Assertions check for remove a custom privilege with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_cp_absent is changed
- cm_cp_absent.current | length == 1
@@ -204,7 +204,7 @@
register: nm_cp_absent
- name: Assertions check for remove a custom privilege with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_cp_absent is changed
- nm_cp_absent.current == []
@@ -217,7 +217,7 @@
register: idempotency_cp_absent
- name: Idempotency assertions check for remove a custom privilege with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_cp_absent is not changed
- idempotency_cp_absent.current == []
@@ -231,7 +231,7 @@
register: removed_cp_query_result
- name: Assertions check for Removed custom privilege with name
- assert:
+ ansible.builtin.assert:
that:
- removed_cp_query_result is not changed
- removed_cp_query_result.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_domain/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_domain/tasks/main.yml
index 55eaaff79..06bd25d78 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_domain/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_domain/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -42,7 +42,7 @@
register: cm_sec_domain_present
- name: Assertions check for add anstest_sec_domain security domain with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_sec_domain_present is changed
- cm_sec_domain_present.current | length == 0
@@ -55,7 +55,7 @@
register: nm_sec_domain_present
- name: Assertions check for add anstest_sec_domain security domain with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_sec_domain_present is changed
- nm_sec_domain_present.current | length == 1
@@ -63,7 +63,7 @@
- nm_sec_domain_present.current.0.aaaDomain.attributes.name == 'anstest_sec_domain'
- name: Assertions check for nm_sec_domain_present in v5.0+
- assert:
+ ansible.builtin.assert:
that:
- nm_sec_domain_present.current.0.aaaDomain.attributes.restrictedRbacDomain == 'no'
when: version.current.0.topSystem.attributes.version is version('5', '>=')
@@ -74,7 +74,7 @@
register: idempotency_sec_domain_present
- name: Idempotency assertions check for add anstest_sec_domain security domain with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_sec_domain_present is not changed
- idempotency_sec_domain_present.current | length == 1
@@ -83,7 +83,7 @@
- idempotency_sec_domain_present.previous.0.aaaDomain.attributes.name == 'anstest_sec_domain'
- name: Assertions check for idempotency_sec_domain_present in v5.0+
- assert:
+ ansible.builtin.assert:
that:
- idempotency_sec_domain_present.current.0.aaaDomain.attributes.restrictedRbacDomain == 'no'
- idempotency_sec_domain_present.previous.0.aaaDomain.attributes.restrictedRbacDomain == 'no'
@@ -99,7 +99,7 @@
register: update_sec_domain_present_true
- name: Assertions check for update anstest_sec_domain security domain restricted_rbac_domain state to true
- assert:
+ ansible.builtin.assert:
that:
- update_sec_domain_present_true is changed
- update_sec_domain_present_true.current | length == 1
@@ -116,7 +116,7 @@
register: update_sec_domain_present_false
- name: Assertions check for update anstest_sec_domain security domain restricted_rbac_domain state to false
- assert:
+ ansible.builtin.assert:
that:
- update_sec_domain_present_false is changed
- update_sec_domain_present_false.current | length == 1
@@ -134,7 +134,7 @@
register: query_sec_domain_with_name
- name: Assertions check for query a security domain with name
- assert:
+ ansible.builtin.assert:
that:
- query_sec_domain_with_name is not changed
- query_sec_domain_with_name.current | length == 1
@@ -142,7 +142,7 @@
- query_sec_domain_with_name.current.0.aaaDomain.attributes.descr == 'Anstest Sec Domain Descr'
- name: Assertions check for query_sec_domain_with_name in v5.0+
- assert:
+ ansible.builtin.assert:
that:
- query_sec_domain_with_name.current.0.aaaDomain.attributes.restrictedRbacDomain == 'no'
when: version.current.0.topSystem.attributes.version is version('5', '>=')
@@ -154,7 +154,7 @@
register: query_all_sec_domains
- name: Assertions check for query all security domains
- assert:
+ ansible.builtin.assert:
that:
- query_all_sec_domains is not changed
- query_all_sec_domains.current | length >= 1
@@ -167,7 +167,7 @@
register: cm_sec_domain_absent
- name: Assertions check for remove anstest_sec_domain security domain with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_sec_domain_absent is changed
- cm_sec_domain_absent.current | length == 1
@@ -176,7 +176,7 @@
- cm_sec_domain_absent.previous.0.aaaDomain.attributes.name == 'anstest_sec_domain'
- name: Assertions check for cm_sec_domain_absent in v5.0+
- assert:
+ ansible.builtin.assert:
that:
- cm_sec_domain_absent.current.0.aaaDomain.attributes.restrictedRbacDomain == 'no'
- cm_sec_domain_absent.previous.0.aaaDomain.attributes.restrictedRbacDomain == 'no'
@@ -188,7 +188,7 @@
register: nm_sec_domain_absent
- name: Assertions check for remove anstest_sec_domain security domain with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_sec_domain_absent is changed
- nm_sec_domain_absent.current | length == 0
@@ -196,7 +196,7 @@
- nm_sec_domain_absent.previous.0.aaaDomain.attributes.name == 'anstest_sec_domain'
- name: Assertions check for nm_sec_domain_absent in v5.0+
- assert:
+ ansible.builtin.assert:
that:
- nm_sec_domain_absent.previous.0.aaaDomain.attributes.restrictedRbacDomain == 'no'
when: version.current.0.topSystem.attributes.version is version('5', '>=')
@@ -207,7 +207,7 @@
register: idempotency_sec_domain_absent
- name: Idempotency assertions check for remove anstest_sec_domain security domain with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_sec_domain_absent is not changed
- idempotency_sec_domain_absent.current | length == 0
@@ -221,7 +221,7 @@
register: removed_sec_domain_with_name
- name: Assertions check for query a removed security domain with name
- assert:
+ ansible.builtin.assert:
that:
- removed_sec_domain_with_name is not changed
- removed_sec_domain_with_name.current | length == 0
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.crt b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.crt
new file mode 100644
index 000000000..cfac5531e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICODCCAaGgAwIBAgIJAIt8XMntue0VMA0GCSqGSIb3DQEBCwUAMDQxDjAMBgNV
+BAMMBUFkbWluMRUwEwYDVQQKDAxZb3VyIENvbXBhbnkxCzAJBgNVBAYTAlVTMCAX
+DTE4MDEwOTAwNTk0NFoYDzIxMTcxMjE2MDA1OTQ0WjA0MQ4wDAYDVQQDDAVBZG1p
+bjEVMBMGA1UECgwMWW91ciBDb21wYW55MQswCQYDVQQGEwJVUzCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAohG/7axtt7CbSaMP7r+2mhTKbNgh0Ww36C7Ta14i
+v+VmLyKkQHnXinKGhp6uy3Nug+15a+eIu7CrgpBVMQeCiWfsnwRocKcQJWIYDrWl
+XHxGQn31yYKR6mylE7Dcj3rMFybnyhezr5D8GcP85YRPmwG9H2hO/0Y1FUnWu9Iw
+AQkCAwEAAaNQME4wHQYDVR0OBBYEFD0jLXfpkrU/ChzRvfruRs/fy1VXMB8GA1Ud
+IwQYMBaAFD0jLXfpkrU/ChzRvfruRs/fy1VXMAwGA1UdEwQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAOmvre+5tgZ0+F3DgsfxNQqLTrGiBgGCIymPkP/cBXXkNuJyl
+3ac7tArHQc7WEA4U2R2rZbEq8FC3UJJm4nUVtCPvEh3G9OhN2xwYev79yt6pIn/l
+KU0Td2OpVyo0eLqjoX5u2G90IBWzhyjFbo+CcKMrSVKj1YOdG0E3OuiJf00=
+-----END CERTIFICATE-----
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.key b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.key
new file mode 100644
index 000000000..63bb00cc0
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/pki/admin.key
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKIRv+2sbbewm0mj
+D+6/tpoUymzYIdFsN+gu02teIr/lZi8ipEB514pyhoaerstzboPteWvniLuwq4KQ
+VTEHgoln7J8EaHCnECViGA61pVx8RkJ99cmCkepspROw3I96zBcm58oXs6+Q/BnD
+/OWET5sBvR9oTv9GNRVJ1rvSMAEJAgMBAAECgYByu3QO0qF9h7X3JEu0Ld4cKBnB
+giQ2uJC/et7KxIJ/LOvw9GopBthyt27KwG1ntBkJpkTuAaQHkyNns7vLkNB0S0IR
++owVFEcKYq9VCHTaiQU8TDp24gN+yPTrpRuH8YhDVq5SfVdVuTMgHVQdj4ya4VlF
+Gj+a7+ipxtGiLsVGrQJBAM7p0Fm0xmzi+tBOASUAcVrPLcteFIaTBFwfq16dm/ON
+00Khla8Et5kMBttTbqbukl8mxFjBEEBlhQqb6EdQQ0sCQQDIhHx1a9diG7y/4DQA
+4KvR3FCYwP8PBORlSamegzCo+P1OzxiEo0amX7yQMA5UyiP/kUsZrme2JBZgna8S
+p4R7AkEAr7rMhSOPUnMD6V4WgsJ5g1Jp5kqkzBaYoVUUSms5RASz4+cwJVCwTX91
+Y1jcpVIBZmaaY3a0wrx13ajEAa0dOQJBAIpjnb4wqpsEh7VpmJqOdSdGxb1XXfFQ
+sA0T1OQYqQnFppWwqrxIL+d9pZdiA1ITnNqyvUFBNETqDSOrUHwwb2cCQGArE+vu
+ffPUWQ0j+fiK+covFG8NL7H+26NSGB5+Xsn9uwOGLj7K/YT6CbBtr9hJiuWjM1Al
+0V4ltlTuu2mTMaw=
+-----END PRIVATE KEY-----
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/tasks/main.yml
new file mode 100644
index 000000000..be3a14763
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_key_ring/tasks/main.yml
@@ -0,0 +1,364 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
+#
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_use_proxy | default("info") }}'
+
+- name: Query system information to fetch version
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+# CLEAN ENVIRONMENT
+- name: Ensure certificate_authority_1 exists
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_1
+ <<: *aci_info
+ name: certificate_authority_1
+ certificate_chain: "{{ lookup('file', 'pki/admin.crt') }}"
+ state: present
+
+- name: Delete key_ring_1
+ cisco.aci.aci_aaa_key_ring: &key_ring_1_absent
+ <<: *aci_info
+ name: key_ring_1
+ state: absent
+ register: delete_key_ring_1
+ until: delete_key_ring_1 is not failed
+ delay: 2
+ retries: 4
+
+# CREATE
+- name: Create a key ring (check_mode)
+ cisco.aci.aci_aaa_key_ring: &key_ring_1_present
+ <<: *key_ring_1_absent
+ name: key_ring_1
+ modulus: 1024
+ state: present
+ check_mode: true
+ register: cm_create_key_ring_1
+
+- name: Create a key ring
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1_present
+ register: nm_create_key_ring_1
+
+- name: Create a key ring again
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1_present
+ register: nm_create_key_ring_1_again
+
+- name: Assertions for creating a key ring
+ ansible.builtin.assert:
+ that:
+ - cm_create_key_ring_1 is changed
+ - cm_create_key_ring_1.previous == []
+ - cm_create_key_ring_1.current == []
+ - cm_create_key_ring_1.proposed.pkiKeyRing.attributes.name == "key_ring_1"
+ - cm_create_key_ring_1.proposed.pkiKeyRing.attributes.modulus == "mod1024"
+ - nm_create_key_ring_1 is changed
+ - nm_create_key_ring_1.previous == []
+ - nm_create_key_ring_1.current.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - nm_create_key_ring_1.current.0.pkiKeyRing.attributes.descr == ""
+ - nm_create_key_ring_1.current.0.pkiKeyRing.attributes.modulus == "mod1024"
+ - nm_create_key_ring_1.current.0.pkiKeyRing.attributes.tp == ""
+ - nm_create_key_ring_1_again is not changed
+ - nm_create_key_ring_1_again.previous.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - nm_create_key_ring_1_again.previous.0.pkiKeyRing.attributes.descr == ""
+ - nm_create_key_ring_1_again.previous.0.pkiKeyRing.attributes.modulus == "mod1024"
+ - nm_create_key_ring_1_again.previous.0.pkiKeyRing.attributes.tp == ""
+ - nm_create_key_ring_1_again.current.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - nm_create_key_ring_1_again.current.0.pkiKeyRing.attributes.descr == ""
+ - nm_create_key_ring_1_again.current.0.pkiKeyRing.attributes.modulus == "mod1024"
+ - nm_create_key_ring_1_again.current.0.pkiKeyRing.attributes.tp == ""
+
+# UPDATE
+- name: Update an existing key ring
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1_present
+ description: "This is a changed description."
+ modulus: 2048
+ certificate: "{{ lookup('file', 'pki/admin.crt') }}"
+ certificate_authority: certificate_authority_1
+ key: "{{ lookup('file', 'pki/admin.key') }}"
+ register: nm_update_key_ring_1
+
+- name: Assertions for updating a key ring
+ ansible.builtin.assert:
+ that:
+ - nm_update_key_ring_1 is changed
+ - nm_update_key_ring_1.previous.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - nm_update_key_ring_1.previous.0.pkiKeyRing.attributes.descr == ""
+ - nm_update_key_ring_1.previous.0.pkiKeyRing.attributes.modulus == "mod1024"
+ - nm_update_key_ring_1.current.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - nm_update_key_ring_1.current.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - nm_update_key_ring_1.current.0.pkiKeyRing.attributes.modulus == "mod2048"
+ - nm_update_key_ring_1.current.0.pkiKeyRing.attributes.tp == "certificate_authority_1"
+
+# VERSION SPECIFIC TESTS
+- name: Test updating a key ring with key_type
+ when: version.current.0.topSystem.attributes.version is version('6.0', '>=') and query_cloud.current == []
+ block:
+ - name: Update an existing key ring with key type >= 6.0
+ cisco.aci.aci_aaa_key_ring: &key_ring_2_present
+ <<: *key_ring_1_present
+ name: key_ring_2
+ key_type: ecc
+ ecc_curve: P521
+ register: nm_create_key_ring_2_key_type
+
+ - name: Assertions for updating a key ring with key_type
+ ansible.builtin.assert:
+ that:
+ - nm_update_key_ring_1.current.0.pkiKeyRing.attributes.keyType == "RSA"
+ - nm_update_key_ring_1.current.0.pkiKeyRing.attributes.eccCurve == "none"
+ - nm_create_key_ring_2_key_type is changed
+ - nm_create_key_ring_2_key_type.current.0.pkiKeyRing.attributes.keyType == "ECC"
+ - nm_create_key_ring_2_key_type.current.0.pkiKeyRing.attributes.eccCurve == "secp521r1"
+
+ - name: Delete key_ring_2
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_2_present
+ state: absent
+
+# CLOUD SPECIFIC TESTS
+- name: Execute tasks only for cloud sites
+ when: query_cloud.current != [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+
+ - name: Delete a key ring in cloud with tenant (check_mode)
+ cisco.aci.aci_aaa_key_ring: &key_ring_cloud_tenant_absent
+ <<: *aci_info
+ name: key_ring_cloud_tenant
+ cloud_tenant: cloud_tenant
+ certificate_authority: certificate_authority_cloud
+ state: absent
+
+ - name: Delete certificate authority for cloud site tenant
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_cloud_absent
+ <<: *aci_info
+ cloud_tenant: cloud_tenant
+ name: certificate_authority_cloud
+ certificate_chain: "{{ lookup('file', 'pki/admin.crt') }}"
+ state: absent
+
+ - name: Delete tenant for key ring
+ cisco.aci.aci_tenant: &cloud_tenant_absent
+ <<: *aci_info
+ name: cloud_tenant
+ state: absent
+ register: cloud_tenant
+ until: cloud_tenant is not failed
+ delay: 2
+ retries: 4
+
+ - name: Create tenant for key ring
+ cisco.aci.aci_tenant:
+ <<: *cloud_tenant_absent
+ state: present
+
+ - name: Create certificate authority for cloud site tenant
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_cloud_absent
+ state: present
+
+ - name: Create a key ring in cloud with tenant (check_mode)
+ cisco.aci.aci_aaa_key_ring: &key_ring_cloud_tenant_present
+ <<: *key_ring_cloud_tenant_absent
+ state: present
+ check_mode: true
+ register: cm_create_key_ring_cloud_tenant
+ until: cm_create_key_ring_cloud_tenant is not failed
+ delay: 2
+ retries: 4
+
+ - name: Create a key ring in cloud with tenant
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_cloud_tenant_present
+ register: nm_create_key_ring_cloud_tenant
+
+ - name: Create a key ring in cloud with tenant again
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_cloud_tenant_present
+ register: nm_create_key_ring_cloud_tenant_again
+
+ - name: Assertions for creating a key ring in cloud with tenant
+ ansible.builtin.assert:
+ that:
+ - cm_create_key_ring_cloud_tenant is changed
+ - cm_create_key_ring_cloud_tenant.previous == []
+ - cm_create_key_ring_cloud_tenant.current == []
+ - cm_create_key_ring_cloud_tenant.proposed.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - cm_create_key_ring_cloud_tenant.proposed.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - nm_create_key_ring_cloud_tenant is changed
+ - nm_create_key_ring_cloud_tenant.previous == []
+ - nm_create_key_ring_cloud_tenant.current != []
+ - nm_create_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - nm_create_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - nm_create_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.descr == ""
+ - nm_create_key_ring_cloud_tenant_again is not changed
+ - nm_create_key_ring_cloud_tenant_again.previous.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - nm_create_key_ring_cloud_tenant_again.previous.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - nm_create_key_ring_cloud_tenant_again.previous.0.pkiKeyRing.attributes.descr == ""
+ - nm_create_key_ring_cloud_tenant_again.current.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - nm_create_key_ring_cloud_tenant_again.current.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - nm_create_key_ring_cloud_tenant_again.current.0.pkiKeyRing.attributes.descr == ""
+
+
+ - name: Update an existing key ring in cloud with tenant
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_cloud_tenant_present
+ description: "This is a changed description."
+ certificate: "{{ lookup('file', 'pki/admin.crt') }}"
+ certificate_authority: certificate_authority_cloud
+ key: "{{ lookup('file', 'pki/admin.key') }}"
+ register: nm_update_key_ring_cloud_tenant
+
+ - name: Assertions for updating a key ring in cloud with tenant
+ ansible.builtin.assert:
+ that:
+ - nm_update_key_ring_cloud_tenant is changed
+ - nm_update_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - nm_update_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.descr == ""
+ - nm_update_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - nm_update_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - nm_update_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - nm_update_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+
+ - name: Delete a key ring in cloud with tenant (check_mode)
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_cloud_tenant_absent
+ check_mode: true
+ register: cm_delete_key_ring_cloud_tenant
+
+ - name: Delete a key ring in cloud with tenant
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_cloud_tenant_absent
+ register: nm_delete_key_ring_cloud_tenant
+
+ - name: Delete a key ring in cloud with tenant again
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_cloud_tenant_absent
+ register: nm_delete_key_ring_cloud_tenant_again
+
+ - name: Assertions for deleting a key ring in cloud with tenant
+ ansible.builtin.assert:
+ that:
+ - cm_delete_key_ring_cloud_tenant is changed
+ - cm_delete_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - cm_delete_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - cm_delete_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - cm_delete_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - cm_delete_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - cm_delete_key_ring_cloud_tenant.current.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - cm_delete_key_ring_cloud_tenant.proposed == {}
+ - nm_delete_key_ring_cloud_tenant is changed
+ - nm_delete_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.name == "key_ring_cloud_tenant"
+ - nm_delete_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - nm_delete_key_ring_cloud_tenant.previous.0.pkiKeyRing.attributes.tp == "certificate_authority_cloud"
+ - nm_delete_key_ring_cloud_tenant.current == []
+ - nm_delete_key_ring_cloud_tenant_again is not changed
+ - nm_delete_key_ring_cloud_tenant_again.previous == []
+ - nm_delete_key_ring_cloud_tenant_again.current == []
+
+ - name: Delete certificate authority for cloud site tenant
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_cloud_absent
+
+ - name: Delete tenant for key ring
+ cisco.aci.aci_tenant:
+ <<: *cloud_tenant_absent
+ register: cloud_tenant
+ until: cloud_tenant is not failed
+ delay: 2
+ retries: 4
+
+# QUERY
+- name: Query a key ring
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1_present
+ state: query
+ register: query_key_ring_1
+
+- name: Query all fabric management access policies
+ cisco.aci.aci_aaa_key_ring:
+ <<: *aci_info
+ state: query
+ register: query_all
+
+- name: Assertions for querying fabric management access policies
+ ansible.builtin.assert:
+ that:
+ - query_key_ring_1 is not changed
+ - query_key_ring_1.current.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - query_key_ring_1.current.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - query_key_ring_1.current.0.pkiKeyRing.attributes.modulus == "mod2048"
+ - query_key_ring_1.current.0.pkiKeyRing.attributes.tp == "certificate_authority_1"
+ - query_key_ring_1.current | length == 1
+ - query_all is not changed
+ - query_all.current | length >= 2
+
+# DELETE
+- name: Delete a key ring (check_mode)
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1_absent
+ check_mode: true
+ register: cm_delete_key_ring_1
+
+- name: Delete a key ring
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1_absent
+ register: nm_delete_key_ring_1
+
+- name: Delete a key ring again
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1_absent
+ register: nm_delete_key_ring_1_again
+
+- name: Assertions for deleting a key ring
+ ansible.builtin.assert:
+ that:
+ - cm_delete_key_ring_1 is changed
+ - cm_delete_key_ring_1.proposed == {}
+ - cm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - cm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - cm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.modulus == "mod2048"
+ - cm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.tp == "certificate_authority_1"
+ - cm_delete_key_ring_1.current.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - cm_delete_key_ring_1.current.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - cm_delete_key_ring_1.current.0.pkiKeyRing.attributes.modulus == "mod2048"
+ - cm_delete_key_ring_1.current.0.pkiKeyRing.attributes.tp == "certificate_authority_1"
+ - nm_delete_key_ring_1 is changed
+ - nm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.name == "key_ring_1"
+ - nm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.descr == "This is a changed description."
+ - nm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.modulus == "mod2048"
+ - nm_delete_key_ring_1.previous.0.pkiKeyRing.attributes.tp == "certificate_authority_1"
+ - nm_delete_key_ring_1.current == []
+ - nm_delete_key_ring_1_again is not changed
+ - nm_delete_key_ring_1_again.previous == []
+ - nm_delete_key_ring_1_again.current == []
+
+# CLEAN ENVIRONMENT
+- name: Delete certificate_authority_1
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_role/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_role/tasks/main.yml
index dce0fd4c6..f7735bc11 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_role/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_role/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -42,7 +42,7 @@
register: cm_anstest_role_present
- name: Assertions check for add an anstest_role aaa role with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_anstest_role_present is changed
- cm_anstest_role_present.current | length == 0
@@ -56,7 +56,7 @@
register: nm_anstest_role_present
- name: Assertions check for add an anstest_role aaa role with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_anstest_role_present is changed
- nm_anstest_role_present.current | length == 1
@@ -70,7 +70,7 @@
register: idempotency_anstest_role_present
- name: Idempotency assertions check for add an anstest_role aaa role with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_anstest_role_present is not changed
- idempotency_anstest_role_present.current | length == 1
@@ -87,7 +87,7 @@
register: anstest_role_with_list_priv
- name: Assertions check for update an anstest_role with list of privileges
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_with_list_priv is changed
- anstest_role_with_list_priv.current | length == 1
@@ -97,13 +97,13 @@
- anstest_role_with_list_priv.previous.0.aaaRole.attributes.priv == 'aaa'
- name: Assertions check for anstest_role_with_list_priv on v4.2 or earlier
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_with_list_priv.current.0.aaaRole.attributes.priv == 'aaa,admin'
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Assertions check for anstest_role_with_list_priv on v5+
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_with_list_priv.current.0.aaaRole.attributes.priv == 'aaa,admin,tenant-connectivity'
when: version.current.0.topSystem.attributes.version is version('5', '>=')
@@ -116,7 +116,7 @@
register: anstest_role_with_valid_priv
- name: Assertions check for update an anstest_role with admin privilege
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_with_valid_priv is changed
- anstest_role_with_valid_priv.current | length == 1
@@ -126,13 +126,13 @@
- anstest_role_with_valid_priv.current.0.aaaRole.attributes.priv == 'admin'
- name: Assertions check for anstest_role_with_valid_priv on v4.2 or earlier
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_with_valid_priv.previous.0.aaaRole.attributes.priv == 'aaa,admin'
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Assertions check for anstest_role_with_valid_priv on v5+
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_with_valid_priv.previous.0.aaaRole.attributes.priv == 'aaa,admin,tenant-connectivity'
when: version.current.0.topSystem.attributes.version is version('5', '>=')
@@ -152,7 +152,7 @@
ignore_errors: true
- name: Assertions check for query a aaa role with name
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_with_invalid_list_priv.msg.startswith("value of privileges must be one or more of")
- anstest_role_with_invalid_priv.msg.startswith("value of privileges must be one or more of")
@@ -165,7 +165,7 @@
register: anstest_role_query_result
- name: Assertions check for query a aaa role with name
- assert:
+ ansible.builtin.assert:
that:
- anstest_role_query_result is not changed
- anstest_role_query_result.current | length == 1
@@ -179,7 +179,7 @@
register: query_all_roles
- name: Assertions check for query all aaa roles
- assert:
+ ansible.builtin.assert:
that:
- query_all_roles is not changed
- query_all_roles.current | length >= 1
@@ -192,7 +192,7 @@
register: cm_anstest_role_absent
- name: Assertions check for remove an anstest_role aaa role with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_anstest_role_absent is changed
- cm_anstest_role_absent.current | length == 1
@@ -208,7 +208,7 @@
register: nm_anstest_role_absent
- name: Assertions check for remove an anstest_role aaa role with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_anstest_role_absent is changed
- nm_anstest_role_absent.current | length == 0
@@ -222,7 +222,7 @@
register: idempotency_anstest_role_absent
- name: Idempotency assertions check for remove an anstest_role aaa role with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_anstest_role_absent is not changed
- idempotency_anstest_role_absent.current | length == 0
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/tasks/main.yml
new file mode 100644
index 000000000..24b63693e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_security_default_settings/tasks/main.yml
@@ -0,0 +1,235 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Akini Ross (@akinross)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: aci_hostname, aci_username and aci_password."
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_remote_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: "{{ aci_validate_certs | default(false) }}"
+ use_ssl: "{{ aci_use_ssl | default(true) }}"
+ use_proxy: "{{ aci_use_proxy | default(true) }}"
+ output_level: "{{ aci_output_level | default('info') }}"
+
+- name: Always set aaa_password_update_required to false and security settings back to defaults
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block:
+ # CLEAN
+ - name: Set AAA Security Default Settings to Default Values
+ cisco.aci.aci_aaa_security_default_settings: &security_settings_defaults
+ <<: *aci_info
+ password_strength_check: true
+ password_strength_profile:
+ enable: false
+ password_change:
+ enable: false
+ interval: 48
+ allowed_changes: 2
+ minimum_period_between_password_changes: 24
+ history_storage_amount: 5
+ lockout:
+ enable: false
+ max_attempts: 5
+ window: 5
+ duration: 60
+ web_token:
+ timeout: 600
+ idle_timeout: 1200
+ validity_period: 24
+ refresh: false
+ state: present
+
+ # QUERY
+ - name: Query AAA security default settings
+ cisco.aci.aci_aaa_security_default_settings:
+ <<: *aci_info
+ state: query
+ register: query_security_settings
+
+ - name: Assertions for enabling a AAA security default settings
+ ansible.builtin.assert:
+ that:
+ - query_security_settings is not changed
+ - query_security_settings.current.0.aaaUserEp.attributes.pwdStrengthCheck == "yes"
+ - query_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.blockDuration == "60"
+ - query_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.enableLoginBlock == "disable"
+ - query_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttempts == "5"
+ - query_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttemptsWindow == "5"
+ - query_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.changeCount == "2"
+ - query_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.changeInterval == "48"
+ - query_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.historyCount == "5"
+ - query_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.noChangeInterval == "24"
+ - query_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.maximumValidityPeriod == "24"
+ - query_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.sessionRecordFlags == "login,logout"
+ - query_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.uiIdleTimeoutSeconds == "1200"
+ - query_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.webtokenTimeoutSeconds == "600"
+
+ # UPDATE
+ - name: Update AAA security default settings password_strength_check
+ cisco.aci.aci_aaa_security_default_settings:
+ <<: *aci_info
+ password_strength_check: false
+
+ - name: Update AAA security default settings (check_mode)
+ cisco.aci.aci_aaa_security_default_settings: &security_settings
+ <<: *aci_info
+ password_strength_check: true
+ password_strength_profile:
+ enable: true # do not test with true as it will for for password change and locks out the user
+ type: custom
+ min_length: 9
+ max_length: 25
+ class_flags:
+ - digits
+ - lowercase
+ - uppercase
+ password_change:
+ enable: true # do not test with true as it will for for password change and locks out the user
+ interval: 60
+ allowed_changes: 3
+ minimum_period_between_password_changes: 25
+ history_storage_amount: 6
+ lockout:
+ enable: true
+ max_attempts: 6
+ window: 6
+ duration: 30
+ web_token:
+ timeout: 601
+ idle_timeout: 1201
+ validity_period: 23
+ refresh: true
+ check_mode: true
+ register: cm_update_security_settings
+
+ - name: Update AAA security default settings
+ cisco.aci.aci_aaa_security_default_settings:
+ <<: *security_settings
+ register: nm_update_security_settings
+
+ - name: Update AAA security default settings again
+ cisco.aci.aci_aaa_security_default_settings:
+ <<: *security_settings
+ register: nm_update_security_settings_again
+
+ - name: Assertions for enabling a AAA security default settings
+ ansible.builtin.assert:
+ that:
+ - cm_update_security_settings is changed
+ - cm_update_security_settings.current.0.aaaUserEp.attributes.pwdStrengthCheck == "no"
+ - cm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.blockDuration == "60"
+ - cm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.enableLoginBlock == "disable"
+ - cm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttempts == "5"
+ - cm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttemptsWindow == "5"
+ - cm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.changeCount == "2"
+ - cm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.changeInterval == "48"
+ - cm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.historyCount == "5"
+ - cm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdProfile.attributes.noChangeInterval == "24"
+ - cm_update_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.maximumValidityPeriod == "24"
+ - cm_update_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.sessionRecordFlags == "login,logout"
+ - cm_update_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.uiIdleTimeoutSeconds == "1200"
+ - cm_update_security_settings.current.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.webtokenTimeoutSeconds == "600"
+ - cm_update_security_settings.proposed.aaaUserEp.attributes.pwdStrengthCheck == "yes"
+ - cm_update_security_settings.proposed.aaaUserEp.children.0.aaaPwdStrengthProfile.attributes.pwdClassFlags == "digits,lowercase,uppercase"
+ - cm_update_security_settings.proposed.aaaUserEp.children.0.aaaPwdStrengthProfile.attributes.pwdMaxLength == "25"
+ - cm_update_security_settings.proposed.aaaUserEp.children.0.aaaPwdStrengthProfile.attributes.pwdMinLength == "9"
+ - cm_update_security_settings.proposed.aaaUserEp.children.0.aaaPwdStrengthProfile.attributes.pwdStrengthTestType == "custom"
+ - cm_update_security_settings.proposed.aaaUserEp.children.2.aaaBlockLoginProfile.attributes.blockDuration == "30"
+ - cm_update_security_settings.proposed.aaaUserEp.children.2.aaaBlockLoginProfile.attributes.enableLoginBlock == "enable"
+ - cm_update_security_settings.proposed.aaaUserEp.children.2.aaaBlockLoginProfile.attributes.maxFailedAttempts == "6"
+ - cm_update_security_settings.proposed.aaaUserEp.children.2.aaaBlockLoginProfile.attributes.maxFailedAttemptsWindow == "6"
+ - cm_update_security_settings.proposed.aaaUserEp.children.1.aaaPwdProfile.attributes.changeCount == "3"
+ - cm_update_security_settings.proposed.aaaUserEp.children.1.aaaPwdProfile.attributes.changeInterval == "60"
+ - cm_update_security_settings.proposed.aaaUserEp.children.1.aaaPwdProfile.attributes.historyCount == "6"
+ - cm_update_security_settings.proposed.aaaUserEp.children.1.aaaPwdProfile.attributes.noChangeInterval == "25"
+ - cm_update_security_settings.proposed.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.maximumValidityPeriod == "23"
+ - cm_update_security_settings.proposed.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.sessionRecordFlags == "login,logout,refresh"
+ - cm_update_security_settings.proposed.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.uiIdleTimeoutSeconds == "1201"
+ - cm_update_security_settings.proposed.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.webtokenTimeoutSeconds == "601"
+ - nm_update_security_settings is changed
+ - nm_update_security_settings.previous.0.aaaUserEp.attributes.pwdStrengthCheck == "no"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.blockDuration == "60"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.enableLoginBlock == "disable"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttempts == "5"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttemptsWindow == "5"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.1.aaaPwdProfile.attributes.changeCount == "2"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.1.aaaPwdProfile.attributes.changeInterval == "48"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.1.aaaPwdProfile.attributes.historyCount == "5"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.1.aaaPwdProfile.attributes.noChangeInterval == "24"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.maximumValidityPeriod == "24"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.sessionRecordFlags == "login,logout"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.uiIdleTimeoutSeconds == "1200"
+ - nm_update_security_settings.previous.0.aaaUserEp.children.2.pkiEp.children.0.pkiWebTokenData.attributes.webtokenTimeoutSeconds == "600"
+ - nm_update_security_settings.current.0.aaaUserEp.attributes.pwdStrengthCheck == "yes"
+ - nm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.blockDuration == "30"
+ - nm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.enableLoginBlock == "enable"
+ - nm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttempts == "6"
+ - nm_update_security_settings.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttemptsWindow == "6"
+ - nm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdClassFlags == "digits,lowercase,uppercase"
+ - nm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdMaxLength == "25"
+ - nm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdMinLength == "9"
+ - nm_update_security_settings.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdStrengthTestType == "custom"
+ - nm_update_security_settings.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.changeCount == "3"
+ - nm_update_security_settings.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.changeInterval == "60"
+ - nm_update_security_settings.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.historyCount == "6"
+ - nm_update_security_settings.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.noChangeInterval == "25"
+ - nm_update_security_settings.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.maximumValidityPeriod == "23"
+ - nm_update_security_settings.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.sessionRecordFlags == "login,logout,refresh"
+ - nm_update_security_settings.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.uiIdleTimeoutSeconds == "1201"
+ - nm_update_security_settings.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.webtokenTimeoutSeconds == "601"
+ - nm_update_security_settings_again is not changed
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.blockDuration == "30"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.enableLoginBlock == "enable"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttempts == "6"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttemptsWindow == "6"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdClassFlags == "digits,lowercase,uppercase"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdMaxLength == "25"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdMinLength == "9"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdStrengthTestType == "custom"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.2.aaaPwdProfile.attributes.changeCount == "3"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.2.aaaPwdProfile.attributes.changeInterval == "60"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.2.aaaPwdProfile.attributes.historyCount == "6"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.2.aaaPwdProfile.attributes.noChangeInterval == "25"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.maximumValidityPeriod == "23"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.sessionRecordFlags == "login,logout,refresh"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.uiIdleTimeoutSeconds == "1201"
+ - nm_update_security_settings_again.previous.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.webtokenTimeoutSeconds == "601"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.blockDuration == "30"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.enableLoginBlock == "enable"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttempts == "6"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.0.aaaBlockLoginProfile.attributes.maxFailedAttemptsWindow == "6"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdClassFlags == "digits,lowercase,uppercase"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdMaxLength == "25"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdMinLength == "9"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.1.aaaPwdStrengthProfile.attributes.pwdStrengthTestType == "custom"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.changeCount == "3"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.changeInterval == "60"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.historyCount == "6"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.2.aaaPwdProfile.attributes.noChangeInterval == "25"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.maximumValidityPeriod == "23"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.sessionRecordFlags == "login,logout,refresh"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.uiIdleTimeoutSeconds == "1201"
+ - nm_update_security_settings_again.current.0.aaaUserEp.children.3.pkiEp.children.0.pkiWebTokenData.attributes.webtokenTimeoutSeconds == "601"
+
+ always:
+ - name: Set aaa_password_update_required back to false
+ cisco.aci.aci_aaa_user:
+ <<: *aci_info
+ aaa_user: "{{ aci_username }}"
+ aaa_password_update_required: false
+
+ - name: Set AAA Security Default Settings to Default Values
+ cisco.aci.aci_aaa_security_default_settings:
+ <<: *security_settings_defaults
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/tasks/main.yml
index 46113c0f9..9c2462bb4 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_ssh_auth/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -64,7 +64,7 @@
register: nm_add_ssh_key_again
- name: Verify add SSH key
- assert:
+ ansible.builtin.assert:
that:
- cm_add_ssh_key is changed
- nm_add_ssh_key is changed
@@ -92,7 +92,7 @@
register: nm_query_all_ssh_keys
- name: Verify query_all_ssh_keys
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_ssh_keys is not changed
- nm_query_all_ssh_keys is not changed
@@ -111,7 +111,7 @@
register: nm_query_ssh_key
- name: Verify query_ssh_key
- assert:
+ ansible.builtin.assert:
that:
- cm_query_ssh_key is not changed
- nm_query_ssh_key is not changed
@@ -148,7 +148,7 @@
register: nm_remove_ssh_key_again
- name: Verify remove_user
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_ssh_key is changed
- nm_remove_ssh_key is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user/tasks/main.yml
index 52f3ed0fb..8c25cef4c 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -84,7 +84,7 @@
register: nm_add_user_again
- name: Verify add user
- assert:
+ ansible.builtin.assert:
that:
- cm_add_user is changed
- nm_add_user is changed
@@ -134,7 +134,7 @@
register: nm_modify_user_again
- name: Verify modify user
- assert:
+ ansible.builtin.assert:
that:
- cm_modify_user is changed
- err_modify_user_expiration.msg == "Failed to parse date format 'wrong_expiration', Unknown string format{{":"}} wrong_expiration"
@@ -174,7 +174,7 @@
register: nm_clear_password_history_again
- name: Verify clear password history
- assert:
+ ansible.builtin.assert:
that:
# NOTE: Clearing password history is a changing action, everytime
- cm_clear_password_history is changed
@@ -203,7 +203,7 @@
register: nm_query_all_users
- name: Verify query_all_users
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_users is not changed
- nm_query_all_users is not changed
@@ -224,7 +224,7 @@
register: nm_query_user
- name: Verify query_user
- assert:
+ ansible.builtin.assert:
that:
- cm_query_user is not changed
- nm_query_user is not changed
@@ -257,7 +257,7 @@
register: nm_remove_user_again
- name: Verify remove_user
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_user is changed
- nm_remove_user is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_certificate/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_certificate/tasks/main.yml
index 3140816e0..7d21d5c27 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_certificate/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_certificate/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -82,7 +82,7 @@
register: nm_add_cert_again
- name: Verify add_cert
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cert is changed
- nm_add_cert is change
@@ -127,7 +127,7 @@
register: nm_query_all_certs
- name: Verify query_all_certs
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_certs is not changed
- nm_query_all_certs is not changed
@@ -142,7 +142,7 @@
register: nm_query_all_rsa
- name: Verify nm_query_all_rsa
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_rsa is not changed
- nm_query_all_rsa.current.0.aaaUser.children | length >= 4
@@ -184,7 +184,7 @@
register: nm_query_cert
- name: Verify query_cert
- assert:
+ ansible.builtin.assert:
that:
- cm_query_cert is not changed
- nm_query_cert is not changed
@@ -283,7 +283,7 @@
register: nm_remove_cert_again
- name: Verify remove_cert
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_cert is changed
- nm_remove_cert is changed
@@ -292,7 +292,7 @@
# Checking if changing certification_name to name throws an error. (#82)
- name: Making sure current user has correct cert
- aci_aaa_user_certificate:
+ cisco.aci.aci_aaa_user_certificate:
<<: *aci_info
aaa_user: '{{ aci_username }}'
name: admin
@@ -377,7 +377,7 @@
register: query_test_pk_content
- name: Verify query_test
- assert:
+ ansible.builtin.assert:
that:
- query_test is not changed
- query_test_pk_file is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_domain/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_domain/tasks/main.yml
index ac0d1d0f2..5bc3968bc 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_domain/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_domain/tasks/main.yml
@@ -6,13 +6,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -70,7 +70,7 @@
register: cm_sec_domain_present
- name: Assertions check for add user domain to aaa_user with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_sec_domain_present is changed
- cm_sec_domain_present.current | length == 0
@@ -83,7 +83,7 @@
register: nm_sec_domain_present
- name: Assertions check for add user domain to aaa_user with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_sec_domain_present is changed
- nm_sec_domain_present.current | length == 1
@@ -97,7 +97,7 @@
register: cm_idempotency_sec_domain_present
- name: Idempotency assertions check for add user domain to aaa_user with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_idempotency_sec_domain_present is not changed
- cm_idempotency_sec_domain_present.current | length == 1
@@ -111,7 +111,7 @@
register: idempotency_sec_domain_present
- name: Idempotency assertions check for add user domain to aaa_user with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_sec_domain_present is not changed
- idempotency_sec_domain_present.current | length == 1
@@ -139,7 +139,7 @@
register: query_anstest_sec_domain
- name: Assertions check for query a user domain from a aaa_user
- assert:
+ ansible.builtin.assert:
that:
- query_anstest_sec_domain is not changed
- query_anstest_sec_domain.current | length == 1
@@ -154,7 +154,7 @@
register: query_aaa_user_domains
- name: Assertions check for query all user domains from a aaa_user
- assert:
+ ansible.builtin.assert:
that:
- query_aaa_user_domains is not changed
- query_aaa_user_domains.current | length == 1
@@ -167,7 +167,7 @@
register: query_all_aaa_user_domains
- name: Assertions check for query all user domains
- assert:
+ ansible.builtin.assert:
that:
- query_all_aaa_user_domains is not changed
- query_all_aaa_user_domains.current | length >= 3
@@ -181,7 +181,7 @@
register: cm_sec_domain_absent
- name: Assertions check for removing user domain from a aaa_user with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_sec_domain_absent is changed
- cm_sec_domain_absent.current | length == 1
@@ -196,7 +196,7 @@
register: nm_sec_domain_absent
- name: Assertions check for removing user domain from a aaa_user with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_sec_domain_absent is changed
- nm_sec_domain_absent.current == []
@@ -211,7 +211,7 @@
register: idempotency_sec_domain_absent
- name: Idempotency assertions check for removing user domain
- assert:
+ ansible.builtin.assert:
that:
- idempotency_sec_domain_absent is not changed
- idempotency_sec_domain_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_role/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_role/tasks/main.yml
index 4a4d34017..6aaaafbec 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_role/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aaa_user_role/tasks/main.yml
@@ -6,13 +6,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -87,7 +87,7 @@
register: cm_user_role_present
- name: Assertions check for add user role to "anstest-security-domain" with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_user_role_present is changed
- cm_user_role_present.current | length == 0
@@ -101,7 +101,7 @@
register: nm_user_role_present
- name: Assertions check for add user role to "anstest-security-domain" with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_user_role_present is changed
- nm_user_role_present.current | length == 1
@@ -116,7 +116,7 @@
register: cm_idempotency_user_role_present
- name: Idempotency assertions check for add user role to "anstest-security-domain" check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_idempotency_user_role_present is not changed
- cm_idempotency_user_role_present.previous | length == 1
@@ -132,7 +132,7 @@
register: idempotency_user_role_present
- name: Idempotency assertions check for add user role to "anstest-security-domain"
- assert:
+ ansible.builtin.assert:
that:
- idempotency_user_role_present is not changed
- idempotency_user_role_present.previous | length == 1
@@ -152,7 +152,7 @@
register: user_role_present_sec_domain1
- name: Assertions check for add a user role to "anstest-security-domain-1"
- assert:
+ ansible.builtin.assert:
that:
- user_role_present_sec_domain1 is changed
- user_role_present_sec_domain1.current | length == 1
@@ -169,7 +169,7 @@
register: cm_update_user_role_present
- name: Assertions check for update user role to "anstest-security-domain" with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_update_user_role_present is changed
- cm_update_user_role_present.current | length == 1
@@ -183,7 +183,7 @@
register: update_user_role_present
- name: Assertions check for update user role to "anstest-security-domain" with normal mode
- assert:
+ ansible.builtin.assert:
that:
- update_user_role_present is changed
- update_user_role_present.current | length == 1
@@ -217,7 +217,7 @@
register: query_user_role_from_sec_domain
- name: Assertions check for query a user role from "anstest-security-domain-1" user domain
- assert:
+ ansible.builtin.assert:
that:
- query_user_role_from_sec_domain is not changed
- query_user_role_from_sec_domain.current | length == 1
@@ -235,7 +235,7 @@
register: query_all_user_roles_of_sec_domain
- name: Assertions check for query all user roles from "anstest-security-domain" user domain
- assert:
+ ansible.builtin.assert:
that:
- query_all_user_roles_of_sec_domain is not changed
- query_all_user_roles_of_sec_domain.current | length == 1
@@ -250,7 +250,7 @@
register: query_all_user_roles_from_a_user
- name: Assertions check for query all user roles from a user
- assert:
+ ansible.builtin.assert:
that:
- query_all_user_roles_from_a_user is not changed
- query_all_user_roles_from_a_user.current | length == 1
@@ -264,7 +264,7 @@
register: query_all_user_roles
- name: Assertions check for query all user roles
- assert:
+ ansible.builtin.assert:
that:
- query_all_user_roles is not changed
- query_all_user_roles.current | length >= 6 # count of user roles including common sec domain user role
@@ -281,7 +281,7 @@
register: cm_user_role_absent
- name: Assertions check for removing a user role from "anstest-security-domain-1" with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_user_role_absent is changed
- cm_user_role_absent.current | length == 1
@@ -297,7 +297,7 @@
register: nm_user_role_absent
- name: Assertions check for removing a user role from "anstest-security-domain-1" with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_user_role_absent is changed
- nm_user_role_absent.current == []
@@ -311,7 +311,7 @@
register: idempotency_user_role_absent
- name: Idempotency assertions check for removing a user role from "anstest-security-domain-1"
- assert:
+ ansible.builtin.assert:
that:
- idempotency_user_role_absent is not changed
- idempotency_user_role_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_block_to_access_port/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_block_to_access_port/tasks/main.yml
index 38bda95c8..ad838725f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_block_to_access_port/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_block_to_access_port/tasks/main.yml
@@ -1,39 +1,54 @@
# Test code for the ACI modules
# Copyright: (c) 2020, Shreyas Srish <ssrish@cisco.com>
# Copyright: (c) 2017, Bruno Calogero <brunocalogero@hotmail.com>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
- name: Ensuring Interface Policy Leaf profile does not exist
cisco.aci.aci_interface_policy_leaf_profile: &aci_interface_policy_leaf_profile_absent
- host: "{{ aci_hostname }}"
- username: "{{ aci_username }}"
- password: "{{ aci_password }}"
- validate_certs: '{{ aci_validate_certs | default(false) }}'
- use_ssl: '{{ aci_use_ssl | default(true) }}'
- use_proxy: '{{ aci_use_proxy | default(true) }}'
- output_level: debug
- state: absent
+ <<: *aci_info
leaf_interface_profile: leafintprftest
+ state: absent
register: leaf_profile_present
-
+
- name: Ensuring Interface Policy Leaf profile does not exist on fex
cisco.aci.aci_interface_policy_leaf_profile:
<<: *aci_interface_policy_leaf_profile_absent
type: fex
leaf_interface_profile: leafintprftest_fex
+ - name: Ensuring Interface Policy Spine profile does not exist
+ cisco.aci.aci_access_spine_interface_profile: &aci_interface_policy_spine_profile_absent
+ <<: *aci_info
+ spine_interface_profile: spineintprftest
+ state: absent
+
+ # CREATE PARENT CLASS OBJECT
- name: Ensuring Interface Policy Leaf profile exists for kick off
cisco.aci.aci_interface_policy_leaf_profile:
<<: *aci_interface_policy_leaf_profile_absent
@@ -47,6 +62,11 @@
leaf_interface_profile: leafintprftest_fex
state: present
+ - name: Ensuring Interface Policy Spine profile exists for kick off
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_interface_policy_spine_profile_absent
+ state: present
+
- name: Ensure Interface Access Port Selector exists for kick of
cisco.aci.aci_access_port_to_interface_policy_leaf_profile: &aci_access_port_to_interface_policy_leaf_profile_present
<<: *aci_interface_policy_leaf_profile_absent
@@ -60,14 +80,14 @@
leaf_interface_profile: leafintprftest_fex
access_port_selector: anstest_accessportselector_fex
- # TODO: Ensure that leaf Policy Group Exists (module missing) (infra:AccPortGrp)
- # Ensure block does not exist.
- - name: Bind an Access Port Block to an Interface Access Port Selector - check mode works
- cisco.aci.aci_access_port_block_to_access_port:
- <<: *aci_access_port_to_interface_policy_leaf_profile_present
- leaf_port_blk: anstest_leafportblkname
- state: absent
+ - name: Ensure Spine Interface Access Port Selector exists for kick of
+ cisco.aci.aci_access_spine_interface_selector: &aci_access_spine_interface_selector_present
+ <<: *aci_interface_policy_spine_profile_absent
+ access_port_selector: anstest_spineaccessportselector
+ state: present
+ # CREATION TASKS
+ # LEAF PORT BLOCK CREATION
- name: Bind an Access Port Block to an Interface Access Port Selector - check mode works
cisco.aci.aci_access_port_block_to_access_port: &aci_access_port_block_to_access_port_present
<<: *aci_access_port_to_interface_policy_leaf_profile_present
@@ -103,6 +123,7 @@
toPort: 15
register: accessportblock_to_accessport_update
+ # LEAF FEX PORT BLOCK CREATION
- name: Associate an access port block (single port) to an interface selector on a fex - creation works
cisco.aci.aci_access_port_block_to_access_port:
<<: *aci_access_port_block_to_access_port_present
@@ -152,9 +173,39 @@
toPort: 24
register: accessportblock_to_accessport_present_fex_update
+ # SPINE PORT BLOCK CREATION
+ - name: Bind an access port block to an access spine interface selector -check mode works
+ cisco.aci.aci_access_port_block_to_access_port: &aci_access_port_block_to_spine_access_port_present
+ <<: *aci_access_spine_interface_selector_present
+ port_blk: anstest_spineportblkname
+ port_blk_description: anstest_spineportblkdesc
+ fromPort: 10
+ toPort: 15
+ type: spine
+ state: present
+ check_mode: true
+ register: accessportblock_to_spineaccessport_check_mode_present
+
+ - name: Bind an access port block to an access spine interface selector - creation works
+ cisco.aci.aci_access_port_block_to_access_port:
+ <<: *aci_access_port_block_to_spine_access_port_present
+ register: accessportblock_to_spineaccessport_present
+
+ - name: Bind an access port block to an access spine interface selector - idempotency works
+ cisco.aci.aci_access_port_block_to_access_port:
+ <<: *aci_access_port_block_to_spine_access_port_present
+ register: accessportblock_to_spineaccessport_present_idempotent
+
+ - name: Bind an access port block to an access spine interface selector - update works
+ cisco.aci.aci_access_port_block_to_access_port:
+ <<: *aci_access_port_block_to_spine_access_port_present
+ fromPort: 11
+ toPort: 16
+ register: accessportblock_to_spineaccessport_present_update
+
# TODO: also test for errors
- name: present assertions - create / indempotency / update works
- assert:
+ ansible.builtin.assert:
that:
- accessportblock_to_accessport_check_mode_present is changed
- accessportblock_to_accessport_present is changed
@@ -174,6 +225,31 @@
- accessportblock_to_accessport_present_fex.sent.infraPortBlk.attributes.fromPort == '14'
- accessportblock_to_accessport_present_fex.sent.infraPortBlk.attributes.toPort == '17'
- accessportblock_to_accessport_present_fex_update.sent.infraPortBlk.attributes.toPort == '24'
+ - accessportblock_to_spineaccessport_check_mode_present is changed
+ - accessportblock_to_spineaccessport_check_mode_present.previous == []
+ - accessportblock_to_spineaccessport_check_mode_present.current == []
+ - accessportblock_to_spineaccessport_check_mode_present.proposed.infraPortBlk.attributes.name == "anstest_spineportblkname"
+ - accessportblock_to_spineaccessport_check_mode_present.proposed.infraPortBlk.attributes.descr == "anstest_spineportblkdesc"
+ - accessportblock_to_spineaccessport_check_mode_present.proposed.infraPortBlk.attributes.fromPort == "10"
+ - accessportblock_to_spineaccessport_check_mode_present.proposed.infraPortBlk.attributes.toPort == "15"
+ - accessportblock_to_spineaccessport_present is changed
+ - accessportblock_to_spineaccessport_present.previous == []
+ - accessportblock_to_spineaccessport_present.current.0.infraPortBlk.attributes.name == "anstest_spineportblkname"
+ - accessportblock_to_spineaccessport_present.current.0.infraPortBlk.attributes.descr == "anstest_spineportblkdesc"
+ - accessportblock_to_spineaccessport_present.current.0.infraPortBlk.attributes.fromPort == "10"
+ - accessportblock_to_spineaccessport_present.current.0.infraPortBlk.attributes.toPort == "15"
+ - accessportblock_to_spineaccessport_present_idempotent is not changed
+ - accessportblock_to_spineaccessport_present_idempotent.current == accessportblock_to_spineaccessport_present.current
+ - accessportblock_to_spineaccessport_present_update is changed
+ - accessportblock_to_spineaccessport_present_update.current.0.infraPortBlk.attributes.fromPort == "11"
+ - accessportblock_to_spineaccessport_present_update.current.0.infraPortBlk.attributes.toPort == "16"
+
+ # QUEY TASKS
+ - name: Query all port block and access_port_selector bindings
+ cisco.aci.aci_access_port_block_to_access_port:
+ <<: *aci_info
+ state: query
+ register: binding_query_all
- name: Query Specific port block and access_port_selector binding
cisco.aci.aci_access_port_block_to_access_port:
@@ -191,15 +267,30 @@
state: query
register: binding_query_fex
+ - name: Query Specific port block and access_port_selector binding spine
+ cisco.aci.aci_access_port_block_to_access_port:
+ <<: *aci_access_spine_interface_selector_present
+ type: spine
+ port_blk: anstest_spineportblkname
+ state: query
+ register: binding_query_spine
+
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
+ - binding_query_all is not changed
+ - binding_query_all.current | length >= 3
- binding_query is not changed
- binding_query_fex is not changed
- binding_query_fex.current | length >= 1
- binding_query.current | length >= 1
- - '"api/mo/uni/infra/accportprof-leafintprftest/hports-anstest_accessportselector-typ-range/portblk-anstest_leafportblkname.json" in binding_query.url'
+ - binding_query_spine is not changed
+ - binding_query_spine.current.0.infraPortBlk.attributes.name == "anstest_spineportblkname"
+ - binding_query_spine.current.0.infraPortBlk.attributes.descr == "anstest_spineportblkdesc"
+ - binding_query_spine.current.0.infraPortBlk.attributes.fromPort == "11"
+ - binding_query_spine.current.0.infraPortBlk.attributes.toPort == "16"
+ # DELETE TASKS
- name: Remove binding of Access Port Block and Interface Access Port Selector - check mode
cisco.aci.aci_access_port_block_to_access_port: &aci_access_port_block_to_access_port_absent
<<: *aci_access_port_block_to_access_port_present
@@ -217,7 +308,7 @@
<<: *aci_access_port_block_to_access_port_absent
register: accessportblock_to_accessport_absent_idempotent
- - name: Remove binding of Access Port Block and Interface Access Port Selector - check mode
+ - name: Remove binding of Access Port Block and Interface Access Port Selector - missing parameter
cisco.aci.aci_access_port_block_to_access_port:
<<: *aci_access_port_to_interface_policy_leaf_profile_present
#leaf_port_blk: anstest_leafportblkname
@@ -235,9 +326,14 @@
state: absent
register: accessportblock_to_accessport_absent_fex
+ - name: Remove binding of Access Port Block and Spine Interface Access Port Selector - delete works
+ cisco.aci.aci_access_port_block_to_access_port:
+ <<: *aci_access_port_block_to_spine_access_port_present
+ state: absent
+ register: accessportblock_to_accessport_absent_spine
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- accessportblock_to_accessport_check_mode_absent is changed
- accessportblock_to_accessport_check_mode_absent.previous != []
@@ -248,6 +344,10 @@
- accessportblock_to_accessport_absent_missing_param is failed
- 'accessportblock_to_accessport_absent_missing_param.msg == "state is absent but all of the following are missing: port_blk"'
- accessportblock_to_accessport_absent_fex is changed
+ - accessportblock_to_accessport_absent_spine is changed
+ - accessportblock_to_accessport_absent_spine.previous != []
+ - accessportblock_to_accessport_absent_spine.proposed == {}
+ - accessportblock_to_accessport_absent_spine.current == []
- name: Ensuring Interface Policy Leaf profile does not exist
cisco.aci.aci_interface_policy_leaf_profile:
@@ -258,4 +358,8 @@
cisco.aci.aci_interface_policy_leaf_profile:
<<: *aci_interface_policy_leaf_profile_absent
type: fex
- leaf_interface_profile: leafintprftest_fex \ No newline at end of file
+ leaf_interface_profile: leafintprftest_fex
+
+ - name: Ensuring Interface Policy Spine profile does not exist
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_interface_policy_spine_profile_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_to_interface_policy_leaf_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_to_interface_policy_leaf_profile/tasks/main.yml
index 2244e0b16..a3005fbd7 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_to_interface_policy_leaf_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_port_to_interface_policy_leaf_profile/tasks/main.yml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: "Please define the following variables: aci_hostname, aci_username and aci_password."
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,7 +22,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -80,7 +80,7 @@
register: fexintprftest_policy_group_present
- name: Assertions check for remove fex policy group from the fexintprftest fex profile
- assert:
+ ansible.builtin.assert:
that:
- fexintprftest_policy_group_present is changed
- fexintprftest_policy_group_present.current | length == 1
@@ -141,7 +141,7 @@
# TODO: also test for errors
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- accessport_to_intf_check_mode_present is changed
- accessport_to_intf_present is changed
@@ -180,7 +180,7 @@
register: binding_query_fex
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- binding_query is not changed
- binding_query_fex is not changed
@@ -203,7 +203,7 @@
register: bind_fexintprftest_policy_group
- name: Assertions check for bind anstest_fex_accessportselector with fexintprftest - Fex Profile Policy Group
- assert:
+ ansible.builtin.assert:
that:
- bind_fexintprftest_policy_group is changed
- bind_fexintprftest_policy_group.previous | length == 0
@@ -226,7 +226,7 @@
register: bind_fexintprftest_policy_group_2
- name: Assertions check for bind anstest_fex_accessportselector with fexintprftest - Fex Profile Policy Group
- assert:
+ ansible.builtin.assert:
that:
- bind_fexintprftest_policy_group_2 is changed
- bind_fexintprftest_policy_group_2.previous | length == 0
@@ -241,7 +241,7 @@
register: fexintprftest_policy_group_absent
- name: Assertions check for remove fex policy group from the fexintprftest fex profile
- assert:
+ ansible.builtin.assert:
that:
- fexintprftest_policy_group_absent is changed
- fexintprftest_policy_group_absent.current | length == 0
@@ -275,7 +275,7 @@
register: accessport_to_intf_absent_fex
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- accessport_to_intf_check_mode_absent is changed
- accessport_to_intf_absent_fex is changed
@@ -318,7 +318,7 @@
register: cm_fpc_present
- name: Assertion check for bind anstest_fex_port_channel Access Port Selector with policygroupname_link_fpc Policy Group - check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_fpc_present.current | length == 0
- cm_fpc_present.previous | length == 0
@@ -331,7 +331,7 @@
register: nm_fpc_present
- name: Assertion check for bind anstest_fex_port_channel Access Port Selector with policygroupname_link_fpc Policy Group - normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_fpc_present.current | length == 1
- nm_fpc_present.previous | length == 0
@@ -347,7 +347,7 @@
register: cm_fpc_absent
- name: Assertion check for remove anstest_fex_port_channel Access Port Selector with policygroupname_link_fpc Policy Group - check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_fpc_absent.current | length == 1
- cm_fpc_absent.previous | length == 1
@@ -364,7 +364,7 @@
register: nm_fpc_absent
- name: Assertion check for remove anstest_fex_port_channel Access Port Selector with policygroupname_link_fpc Policy Group - normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_fpc_absent.current | length == 0
- nm_fpc_absent.previous | length == 1
@@ -380,7 +380,7 @@
register: anstest_fex_vpc_present
- name: Assertion check for add anstest_fex_vpc - Interface Policy Leaf Profile with type Fex
- assert:
+ ansible.builtin.assert:
that:
- anstest_fex_vpc_present.current | length == 1
- anstest_fex_vpc_present.current.0.infraFexP.attributes.name == "anstest_fex_vpc"
@@ -397,7 +397,7 @@
register: policygroupname_node_fvpc_present
- name: Assertion check for add policygroupname_node_fvpc - Policy Group with lag type node
- assert:
+ ansible.builtin.assert:
that:
- policygroupname_node_fvpc_present.current | length == 1
- policygroupname_node_fvpc_present.current.0.infraAccBndlGrp.attributes.name == "policygroupname_node_fvpc"
@@ -414,7 +414,7 @@
register: cm_fex_vpc_present
- name: Assertion check for bind anstest_fex_vpc Access Port Selector with policygroupname_node_fvpc Policy Group - check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_fex_vpc_present.current | length == 0
- cm_fex_vpc_present.previous | length == 0
@@ -427,7 +427,7 @@
register: nm_fex_vpc_present
- name: Assertion check for bind anstest_fex_vpc Access Port Selector with policygroupname_node_fvpc Policy Group - normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_fex_vpc_present.current | length == 1
- nm_fex_vpc_present.previous | length == 0
@@ -443,7 +443,7 @@
register: cm_fex_vpc_absent
- name: Assertion check for remove anstest_fex_vpc Access Port Selector with policygroupname_node_fvpc Policy Group - check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_fex_vpc_absent.current | length == 1
- cm_fex_vpc_absent.previous | length == 1
@@ -460,7 +460,7 @@
register: nm_fex_vpc_absent
- name: Assertion check for remove anstest_fex_vpc Access Port Selector with policygroupname_node_fvpc Policy Group - normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_fex_vpc_absent.current | length == 0
- nm_fex_vpc_absent.previous | length == 1
@@ -476,7 +476,7 @@
register: anstest_fex_vpc_absent
- name: Assertion check for remove anstest_fex_vpc - Interface Policy Leaf Profile with type Fex
- assert:
+ ansible.builtin.assert:
that:
- anstest_fex_vpc_absent.current | length == 0
- anstest_fex_vpc_absent.previous | length == 1
@@ -489,7 +489,7 @@
register: anstest_fex_port_channel_absent
- name: Assertion check for remove anstest_fex_port_channel - Interface Policy Leaf Profile with type Fex
- assert:
+ ansible.builtin.assert:
that:
- anstest_fex_port_channel_absent.current | length == 0
- anstest_fex_port_channel_absent.previous | length == 1
@@ -504,7 +504,7 @@
register: anstest_leaf_profile_absent
- name: Assertion check for ensure anstest_leaf_profile interface does not exists
- assert:
+ ansible.builtin.assert:
that:
- anstest_leaf_profile_absent.current | length == 0
@@ -517,7 +517,7 @@
register: anstest_fex_profile_absent
- name: Assertion check for ensure anstest_fex_profile interface does not exists
- assert:
+ ansible.builtin.assert:
that:
- anstest_fex_profile_absent.current | length == 0
@@ -530,7 +530,7 @@
register: temp_anstest_fex_profile_absent
- name: Assertion check for ensure temp_anstest_fex_profile interface does not exists
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_profile_absent.current | length == 0
@@ -541,7 +541,7 @@
register: anstest_leaf_profile_present
- name: Assertion check for add a new anstest_leaf_profile with profile type leaf
- assert:
+ ansible.builtin.assert:
that:
- anstest_leaf_profile_present is changed
- anstest_leaf_profile_present.current | length == 1
@@ -556,7 +556,7 @@
register: anstest_fex_profile_present
- name: Assertion check for add a new anstest_fex_profile with profile type fex
- assert:
+ ansible.builtin.assert:
that:
- anstest_fex_profile_present is changed
- anstest_fex_profile_present.current | length == 1
@@ -571,7 +571,7 @@
register: temp_anstest_fex_profile_present
- name: Assertion check for add a new temp_anstest_fex_profile with profile type fex
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_profile_present is changed
- temp_anstest_fex_profile_present.current | length == 1
@@ -589,7 +589,7 @@
register: temp_anstest_fex_profile_policy_group_present
- name: Assertion check for add a new policy_group with the same name of interface profile - temp_anstest_fex_profile
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_profile_policy_group_present is changed
- temp_anstest_fex_profile_policy_group_present.current | length == 1
@@ -611,7 +611,7 @@
ignore_errors: true
- name: Assertion check for bind temp_anstest_fex_profile with anstest_fex_profile - Fex Profile Policy Group
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_profile_access_port_present.msg == "Invalid Configuration - interface_type fex_profile can not be configured with a profile of type fex"
@@ -621,7 +621,7 @@
register: remove_anstest_fex_profile_absent
- name: Assertion check for remove temp_anstest_fex_profile
- assert:
+ ansible.builtin.assert:
that:
- remove_anstest_fex_profile_absent is changed
- remove_anstest_fex_profile_absent.current | length == 0
@@ -637,7 +637,7 @@
register: anstest_fex_profile_policy_group_present
- name: Assertion check for add a new policy_group with the same name of interface profile - anstest_fex_profile
- assert:
+ ansible.builtin.assert:
that:
- anstest_fex_profile_policy_group_present is changed
- anstest_fex_profile_policy_group_present.current | length == 1
@@ -659,7 +659,7 @@
register: anstest_leaf_profile_access_port_present
- name: Assertion check for bind anstest_leaf_profile with anstest_fex_profile - Fex Profile Policy Group
- assert:
+ ansible.builtin.assert:
that:
- anstest_leaf_profile_access_port_present is changed
- anstest_leaf_profile_access_port_present.current | length == 1
@@ -682,7 +682,7 @@
register: anstest_leaf_profile_access_port_wrong_fex_id
- name: Assertion check for bind anstest_leaf_profile with wrong fex_id
- assert:
+ ansible.builtin.assert:
that:
- anstest_leaf_profile_access_port_wrong_fex_id.msg == "A valid FEX ID is between 101 to 199"
@@ -699,7 +699,7 @@
register: anstest_leaf_profile_access_port_no_fex_id
- name: Assertion check for bind anstest_leaf_profile with no fex_id
- assert:
+ ansible.builtin.assert:
that:
- anstest_leaf_profile_access_port_no_fex_id.msg == "The fex_id must not be None, when interface_type is fex_profile"
@@ -709,7 +709,7 @@
register: anstest_leaf_profile_cleanup
- name: Assertion check for remove anstest_leaf_profile
- assert:
+ ansible.builtin.assert:
that:
- anstest_leaf_profile_cleanup is changed
- anstest_leaf_profile_cleanup.previous | length == 1
@@ -721,7 +721,7 @@
register: anstest_fex_profile_cleanup
- name: Assertion check for remove anstest_fex_profile
- assert:
+ ansible.builtin.assert:
that:
- anstest_fex_profile_cleanup is changed
- anstest_fex_profile_cleanup.previous | length == 1
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_dst_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_dst_group/tasks/main.yml
index 03c2e92c2..1c4329f4b 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_dst_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_dst_group/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group/tasks/main.yml
index c071f747a..4f04e42ed 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when:
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group_entry/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group_entry/tasks/main.yml
index 788658f13..421956534 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group_entry/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_filter_group_entry/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when:
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group/tasks/main.yml
index e2d00e525..b55d5ced0 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
# CLEAN TEST ENVIRONMENT BEFORE TESTS
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src/tasks/main.yml
index a0fe48f08..ce033f911 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
# CLEAN TEST ENVIRONMENT BEFORE TESTS
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src_path/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src_path/tasks/main.yml
index f370b1323..3196e78de 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src_path/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_span_src_group_src_path/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/tasks/main.yml
new file mode 100644
index 000000000..9f43513f0
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile/tasks/main.yml
@@ -0,0 +1,183 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # CLEAN ENVIRONMENT
+ - name: Remove all Access Spine Interface profiles
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_all_absent
+ <<: *aci_info
+ spine_interface_profile: "{{ item }}"
+ state: absent
+ loop:
+ - ansible_access_spine_interface_profile_1
+ - ansible_access_spine_interface_profile_2
+
+ # CREATE ACCESS SPINE INTERFACE PROFILE
+ - name: Add a new Access Spine Interface Profile (check_mode)
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_present
+ <<: *aci_info
+ spine_interface_profile: ansible_access_spine_interface_profile_1
+ description: Access Spine Interface Profile 1
+ state: present
+ check_mode: true
+ register: cm_add_spine_interface_profile
+
+ - name: Add a new Access Spine Interface Profile (normal_mode)
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_present
+ register: nm_add_spine_interface_profile
+
+ - name: Add the first Access Spine Interface Profile again - testing idempotency
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_present
+ register: nm_add_spine_interface_profile_idempotency
+
+ - name: Add a second Access Spine Interface Profile (normal_mode)
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_2_present
+ <<: *aci_info
+ spine_interface_profile: ansible_access_spine_interface_profile_2
+ description: Access Spine Interface Profile 2
+ state: present
+ register: nm_add_spine_interface_profile_2
+
+ - name: Asserts for Access Spine Interface Profile creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_spine_interface_profile is changed
+ - cm_add_spine_interface_profile.previous == []
+ - cm_add_spine_interface_profile.current == []
+ - cm_add_spine_interface_profile.proposed.infraSpAccPortP.attributes.name == "ansible_access_spine_interface_profile_1"
+ - cm_add_spine_interface_profile.proposed.infraSpAccPortP.attributes.descr == "Access Spine Interface Profile 1"
+ - nm_add_spine_interface_profile is changed
+ - nm_add_spine_interface_profile.previous == []
+ - nm_add_spine_interface_profile.current.0.infraSpAccPortP.attributes.name == "ansible_access_spine_interface_profile_1"
+ - nm_add_spine_interface_profile.current.0.infraSpAccPortP.attributes.descr == "Access Spine Interface Profile 1"
+ - nm_add_spine_interface_profile.current.0.infraSpAccPortP.attributes.dn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_1"
+ - nm_add_spine_interface_profile_idempotency is not changed
+ - nm_add_spine_interface_profile_idempotency.current.0.infraSpAccPortP.attributes.name == "ansible_access_spine_interface_profile_1"
+ - nm_add_spine_interface_profile_idempotency.current.0.infraSpAccPortP.attributes.descr == "Access Spine Interface Profile 1"
+ - nm_add_spine_interface_profile_idempotency.current.0.infraSpAccPortP.attributes.dn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_1"
+ - nm_add_spine_interface_profile_2 is changed
+ - nm_add_spine_interface_profile_2.previous == []
+ - nm_add_spine_interface_profile_2.current.0.infraSpAccPortP.attributes.name == "ansible_access_spine_interface_profile_2"
+ - nm_add_spine_interface_profile_2.current.0.infraSpAccPortP.attributes.descr == "Access Spine Interface Profile 2"
+ - nm_add_spine_interface_profile_2.current.0.infraSpAccPortP.attributes.dn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_2"
+
+ # QUERY ACCESS SPINE INTERFACE PROFILE
+ - name: Query all Access Spine Interface Profiles
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_info
+ state: query
+ register: query_all_spine_interface_profile
+
+ - name: Query ansible_access_spine_interface_profile_1
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_present
+ state: query
+ register: query_ansible_access_spine_interface_profile_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_spine_interface_profile is not changed
+ - query_all_spine_interface_profile.current|length >= 2
+ - query_ansible_access_spine_interface_profile_1 is not changed
+ - query_ansible_access_spine_interface_profile_1.current|length == 1
+ - query_ansible_access_spine_interface_profile_1.current.0.infraSpAccPortP.attributes.name == "ansible_access_spine_interface_profile_1"
+ - query_ansible_access_spine_interface_profile_1.current.0.infraSpAccPortP.attributes.descr == "Access Spine Interface Profile 1"
+ - query_ansible_access_spine_interface_profile_1.current.0.infraSpAccPortP.attributes.dn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_1"
+
+ # UPDATE ACCESS SPINE INTERFACE PROFILE
+ - name: Update first Access Spine Interface Profile (check_mode)
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_update
+ <<: *aci_access_spine_interface_profile_present
+ description: Updated description for first ansible Access Spine Interface Profile
+ check_mode: true
+ register: cm_update_spine_interface_profile
+
+ - name: Update first Access Spine Interface Profile (normal_mode)
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_update
+ register: nm_update_spine_interface_profile
+
+ - name: Update first Access Spine Interface Profile again - testing idempotency
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_update
+ register: nm_udpate_spine_interface_profile_idempotency
+
+ - name: Asserts for Access Spine Interface Profile update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_spine_interface_profile is changed
+ - cm_update_spine_interface_profile.previous == cm_update_spine_interface_profile.current
+ - cm_update_spine_interface_profile.proposed.infraSpAccPortP.attributes.descr == "Updated description for first ansible Access Spine Interface Profile"
+ - nm_update_spine_interface_profile is changed
+ - nm_update_spine_interface_profile.current.0.infraSpAccPortP.attributes.name == "ansible_access_spine_interface_profile_1"
+ - nm_update_spine_interface_profile.current.0.infraSpAccPortP.attributes.descr == "Updated description for first ansible Access Spine Interface Profile"
+ - nm_udpate_spine_interface_profile_idempotency is not changed
+ - nm_udpate_spine_interface_profile_idempotency.current.0.infraSpAccPortP.attributes.name == "ansible_access_spine_interface_profile_1"
+ - nm_udpate_spine_interface_profile_idempotency.current.0.infraSpAccPortP.attributes.descr == "Updated description for first ansible Access Spine Interface Profile"
+
+ # DELETE ACCESS SPINE INTERFACE PROFILE
+ - name: Remove Access Spine Interface Profile (check_mode)
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_absent
+ <<: *aci_access_spine_interface_profile_update
+ state: absent
+ check_mode: true
+ register: cm_remove_spine_interface_profile
+
+ - name: Remove Access Spine Interface Profile (normal_mode)
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_absent
+ register: nm_remove_spine_interface_profile
+
+ - name: Remove Access Spine Interface Profile - testing idempotency
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_absent
+ register: nm_remove_spine_interface_profile_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_spine_interface_profile is changed
+ - cm_remove_spine_interface_profile.current == cm_remove_spine_interface_profile.previous
+ - cm_remove_spine_interface_profile.proposed == {}
+ - nm_remove_spine_interface_profile is changed
+ - nm_remove_spine_interface_profile.previous != []
+ - nm_remove_spine_interface_profile.proposed == {}
+ - nm_remove_spine_interface_profile.current == []
+ - nm_remove_spine_interface_profile_idempotency is not changed
+ - nm_remove_spine_interface_profile_idempotency.previous == []
+ - nm_remove_spine_interface_profile_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove all Access Spine Interface profiles - cleanup before ending tests
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_all_absent
+ loop:
+ - ansible_access_spine_interface_profile_1
+ - ansible_access_spine_interface_profile_2
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/tasks/main.yml
new file mode 100644
index 000000000..00f3b48fe
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_profile_to_spine_switch_profile/tasks/main.yml
@@ -0,0 +1,176 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # CLEAN ENVIRONMENT
+ - name: Remove Access Spine Switch profile
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_absent
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile
+ state: absent
+
+ - name: Remove all Access Spine Interface Profiles
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_all_absent
+ <<: *aci_info
+ spine_interface_profile: "{{ item }}"
+ state: absent
+ loop:
+ - ansible_access_spine_interface_profile_1
+ - ansible_access_spine_interface_profile_2
+
+ # CREATE ACCESS SPINE SWITCH AND INTERFACE PROFILES
+ - name: Add Access Spine Switch profile
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_absent
+ state: present
+
+ - name: Add Access Spine Interface Profiles
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_all_absent
+ state: present
+ loop:
+ - ansible_access_spine_interface_profile_1
+ - ansible_access_spine_interface_profile_2
+
+ # CREATE BINDING BETWEEN SPINE INTERFACE AND SWITCH PROFILES
+ - name: Add a new Binding between Spine Interface and Switch Profiles (check_mode)
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile: &aci_access_spine_interface_profile_to_spine_switch_profile_present
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile
+ spine_interface_profile: ansible_access_spine_interface_profile_1
+ state: present
+ check_mode: true
+ register: cm_add_binding_spine_interface_to_switch
+
+ - name: Add a new Binding between Spine Interface and Switch Profiles (normal_mode)
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ <<: *aci_access_spine_interface_profile_to_spine_switch_profile_present
+ register: nm_add_binding_spine_interface_to_switch
+
+ - name: Add the first Binding between Spine Interface and Switch Profiles again - testing idempotency
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ <<: *aci_access_spine_interface_profile_to_spine_switch_profile_present
+ register: nm_add_binding_spine_interface_to_switch_idempotency
+
+ - name: Add a second Binding between Spine Interface and Switch Profiles (normal_mode)
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile: &aci_access_spine_interface_profile_to_spine_switch_profile_2_present
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile
+ spine_interface_profile: ansible_access_spine_interface_profile_2
+ state: present
+ register: nm_add_binding_spine_interface_to_switch_2
+
+ - name: Asserts for Binding between Spine Interface and Switch Profiles creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_binding_spine_interface_to_switch is changed
+ - cm_add_binding_spine_interface_to_switch.previous == []
+ - cm_add_binding_spine_interface_to_switch.current == []
+ - cm_add_binding_spine_interface_to_switch.proposed.infraRsSpAccPortP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile/rsspAccPortP-[uni/infra/spaccportprof-ansible_access_spine_interface_profile_1]"
+ - cm_add_binding_spine_interface_to_switch.proposed.infraRsSpAccPortP.attributes.tDn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_1"
+ - nm_add_binding_spine_interface_to_switch is changed
+ - nm_add_binding_spine_interface_to_switch.previous == []
+ - nm_add_binding_spine_interface_to_switch.current.0.infraRsSpAccPortP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile/rsspAccPortP-[uni/infra/spaccportprof-ansible_access_spine_interface_profile_1]"
+ - nm_add_binding_spine_interface_to_switch.current.0.infraRsSpAccPortP.attributes.tDn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_1"
+ - nm_add_binding_spine_interface_to_switch_idempotency is not changed
+ - nm_add_binding_spine_interface_to_switch_idempotency.current.0.infraRsSpAccPortP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile/rsspAccPortP-[uni/infra/spaccportprof-ansible_access_spine_interface_profile_1]"
+ - nm_add_binding_spine_interface_to_switch_idempotency.current.0.infraRsSpAccPortP.attributes.tDn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_1"
+ - nm_add_binding_spine_interface_to_switch_2 is changed
+ - nm_add_binding_spine_interface_to_switch_2.previous == []
+ - nm_add_binding_spine_interface_to_switch_2.proposed.infraRsSpAccPortP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile/rsspAccPortP-[uni/infra/spaccportprof-ansible_access_spine_interface_profile_2]"
+ - nm_add_binding_spine_interface_to_switch_2.proposed.infraRsSpAccPortP.attributes.tDn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_2"
+ - nm_add_binding_spine_interface_to_switch_2.current.0.infraRsSpAccPortP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile/rsspAccPortP-[uni/infra/spaccportprof-ansible_access_spine_interface_profile_2]"
+ - nm_add_binding_spine_interface_to_switch_2.current.0.infraRsSpAccPortP.attributes.tDn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_2"
+
+ # QUERY BINDING BETWEEN SPINE INTERFACE AND SWITCH PROFILES
+ - name: Query all Binding between Spine Interface Profiles and ansible_access_spine_switch_profile
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile
+ state: query
+ register: query_all_binding_spine_interface_to_switch
+
+ - name: Query Binding ansible_access_spine_interface_profile_1 to ansible_access_spine_switch_profile
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ <<: *aci_access_spine_interface_profile_to_spine_switch_profile_present
+ state: query
+ register: query_binding_spine_interface_to_switch
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_binding_spine_interface_to_switch is not changed
+ - query_all_binding_spine_interface_to_switch.current.0.infraSpineP.children|length >= 2
+ - query_binding_spine_interface_to_switch is not changed
+ - query_binding_spine_interface_to_switch.current.0.infraSpineP.children|length == 1
+ - query_binding_spine_interface_to_switch.current.0.infraSpineP.children.0.infraRsSpAccPortP.attributes.rn == "rsspAccPortP-[uni/infra/spaccportprof-ansible_access_spine_interface_profile_1]"
+ - query_binding_spine_interface_to_switch.current.0.infraSpineP.children.0.infraRsSpAccPortP.attributes.tDn == "uni/infra/spaccportprof-ansible_access_spine_interface_profile_1"
+ - query_binding_spine_interface_to_switch.current.0.infraSpineP.children.0.infraRsSpAccPortP.attributes.state == "formed"
+
+ # DELETE BINDING BETWEEN SPINE INTERFACE AND SWITCH PROFILES
+ - name: Remove Binding between Spine Interface and Switch Profiles (check_mode)
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile: &aci_access_spine_interface_profile_to_spine_switch_profile_absent
+ <<: *aci_access_spine_interface_profile_to_spine_switch_profile_present
+ state: absent
+ check_mode: true
+ register: cm_remove_binding_spine_interface_to_switch
+
+ - name: Remove Binding between Spine Interface and Switch Profiles (normal_mode)
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ <<: *aci_access_spine_interface_profile_to_spine_switch_profile_absent
+ register: nm_remove_binding_spine_interface_to_switch
+
+ - name: Remove Binding between Spine Interface and Switch Profiles - testing idempotency
+ cisco.aci.aci_access_spine_interface_profile_to_spine_switch_profile:
+ <<: *aci_access_spine_interface_profile_to_spine_switch_profile_absent
+ register: nm_remove_binding_spine_interface_to_switch_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_binding_spine_interface_to_switch is changed
+ - cm_remove_binding_spine_interface_to_switch.current == cm_remove_binding_spine_interface_to_switch.previous
+ - cm_remove_binding_spine_interface_to_switch.proposed == {}
+ - nm_remove_binding_spine_interface_to_switch is changed
+ - nm_remove_binding_spine_interface_to_switch.previous != []
+ - nm_remove_binding_spine_interface_to_switch.proposed == {}
+ - nm_remove_binding_spine_interface_to_switch.current == []
+ - nm_remove_binding_spine_interface_to_switch_idempotency is not changed
+ - nm_remove_binding_spine_interface_to_switch_idempotency.previous == []
+ - nm_remove_binding_spine_interface_to_switch_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove Access Spine Switch profile - cleanup before ending tests
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_all_absent
+ loop:
+ - ansible_access_spine_interface_profile_1
+ - ansible_access_spine_interface_profile_2
+
+ - name: Remove all Access Spine Interface Profiles - cleanup before ending tests
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/tasks/main.yml
new file mode 100644
index 000000000..255357168
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_interface_selector/tasks/main.yml
@@ -0,0 +1,204 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_access_spine_interface_profile
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_absent
+ <<: *aci_info
+ spine_interface_profile: ansible_access_spine_interface_profile
+ description: Ansible Access Spine Interface Profile
+ state: absent
+
+ - name: Add a new Access Spine Interface profile
+ cisco.aci.aci_access_spine_interface_profile: &aci_access_spine_interface_profile_present
+ <<: *aci_access_spine_interface_profile_absent
+ state: present
+
+ # CREATE ACCESS SPINE INTERFACE SELECTOR
+ - name: Add a new Access Spine Interface Selector (check_mode)
+ cisco.aci.aci_access_spine_interface_selector: &aci_access_spine_interface_selector_present
+ <<: *aci_info
+ spine_interface_profile: ansible_access_spine_interface_profile
+ spine_interface_selector: ansible_access_spine_interface_selector_1
+ description: Access Spine Interface Selector 1
+ selector_type: range
+ state: present
+ check_mode: true
+ register: cm_add_spine_interface_selector
+
+ - name: Add a new Access Spine Interface Selector (normal_mode)
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *aci_access_spine_interface_selector_present
+ register: nm_add_spine_interface_selector
+
+ - name: Add the first Access Spine Interface Selector again - testing idempotency
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *aci_access_spine_interface_selector_present
+ register: nm_add_spine_interface_selector_idempotency
+
+ - name: Add a second Access Spine Interface Selector (normal_mode)
+ cisco.aci.aci_access_spine_interface_selector: &aci_access_spine_interface_selector_2_present
+ <<: *aci_info
+ spine_interface_profile: ansible_access_spine_interface_profile
+ spine_interface_selector: ansible_access_spine_interface_selector_2
+ description: Access Spine Interface Selector 2
+ selector_type: range
+ state: present
+ register: nm_add_spine_interface_selector_2
+
+ - name: Asserts for Access Spine Interface Selector creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_spine_interface_selector is changed
+ - cm_add_spine_interface_selector.previous == []
+ - cm_add_spine_interface_selector.current == []
+ - cm_add_spine_interface_selector.proposed.infraSHPortS.attributes.name == "ansible_access_spine_interface_selector_1"
+ - cm_add_spine_interface_selector.proposed.infraSHPortS.attributes.descr == "Access Spine Interface Selector 1"
+ - cm_add_spine_interface_selector.proposed.infraSHPortS.attributes.type == "range"
+ - nm_add_spine_interface_selector is changed
+ - nm_add_spine_interface_selector.previous == []
+ - nm_add_spine_interface_selector.current.0.infraSHPortS.attributes.name == "ansible_access_spine_interface_selector_1"
+ - nm_add_spine_interface_selector.current.0.infraSHPortS.attributes.descr == "Access Spine Interface Selector 1"
+ - nm_add_spine_interface_selector.current.0.infraSHPortS.attributes.type == "range"
+ - nm_add_spine_interface_selector_idempotency is not changed
+ - nm_add_spine_interface_selector_idempotency.current.0.infraSHPortS.attributes.name == "ansible_access_spine_interface_selector_1"
+ - nm_add_spine_interface_selector_idempotency.current.0.infraSHPortS.attributes.descr == "Access Spine Interface Selector 1"
+ - nm_add_spine_interface_selector_idempotency.current.0.infraSHPortS.attributes.type == "range"
+ - nm_add_spine_interface_selector_2 is changed
+ - nm_add_spine_interface_selector_2.previous == []
+ - nm_add_spine_interface_selector_2.current.0.infraSHPortS.attributes.name == "ansible_access_spine_interface_selector_2"
+ - nm_add_spine_interface_selector_2.current.0.infraSHPortS.attributes.descr == "Access Spine Interface Selector 2"
+ - nm_add_spine_interface_selector_2.current.0.infraSHPortS.attributes.type == "range"
+
+ # QUERY ACCESS SPINE INTERFACE SELECTOR
+ - name: Query all Access Spine Interface Selectors
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *aci_info
+ state: query
+ register: query_all_spine_interface_selector
+
+ - name: Query ansible_access_spine_interface_selector_1
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *aci_access_spine_interface_selector_present
+ state: query
+ register: query_ansible_access_spine_interface_selector_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_spine_interface_selector is not changed
+ - query_all_spine_interface_selector.current|length >= 2
+ - query_ansible_access_spine_interface_selector_1 is not changed
+ - query_ansible_access_spine_interface_selector_1.current|length == 1
+ - query_ansible_access_spine_interface_selector_1.current.0.infraSpAccPortP.children.0.infraSHPortS.attributes.name == "ansible_access_spine_interface_selector_1"
+ - query_ansible_access_spine_interface_selector_1.current.0.infraSpAccPortP.children.0.infraSHPortS.attributes.descr == "Access Spine Interface Selector 1"
+ - query_ansible_access_spine_interface_selector_1.current.0.infraSpAccPortP.children.0.infraSHPortS.attributes.type == "range"
+
+ # UPDATE ACCESS SPINE INTERFACE SELECTOR
+ - name: Add a new Access Spine Interface policy Group
+ cisco.aci.aci_interface_policy_spine_policy_group: &aci_interface_policy_spine_policy_group_present
+ <<: *aci_info
+ policy_group: ansible_access_spine_interface_policy_group
+ description: Ansible Access Spine Interface Policy Group
+ state: present
+
+ - name: Update first Access Spine Interface Selector by adding a Policy Group (check_mode)
+ cisco.aci.aci_access_spine_interface_selector: &aci_access_spine_interface_selector_update
+ <<: *aci_access_spine_interface_selector_present
+ description: Updated description for first ansible Access Spine Interface Selector
+ policy_group: ansible_access_spine_interface_policy_group
+ check_mode: true
+ register: cm_update_spine_interface_selector
+
+ - name: Update first Access Spine Interface Selector by adding a Policy Group (normal_mode)
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *aci_access_spine_interface_selector_update
+ register: nm_update_spine_interface_selector
+
+ - name: Update first Access Spine Interface Selector by adding a Policy Group again - testing idempotency
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *aci_access_spine_interface_selector_update
+ register: nm_udpate_spine_interface_selector_idempotency
+
+ - name: Asserts for Access Spine Interface Selector update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_spine_interface_selector is changed
+ - cm_update_spine_interface_selector.previous == cm_update_spine_interface_selector.current
+ - cm_update_spine_interface_selector.proposed.infraSHPortS.attributes.descr == "Updated description for first ansible Access Spine Interface Selector"
+ - cm_update_spine_interface_selector.proposed.infraSHPortS.children.0.infraRsSpAccGrp.attributes.tDn == "uni/infra/funcprof/spaccportgrp-ansible_access_spine_interface_policy_group"
+ - nm_update_spine_interface_selector is changed
+ - nm_update_spine_interface_selector.current.0.infraSHPortS.attributes.name == "ansible_access_spine_interface_selector_1"
+ - nm_update_spine_interface_selector.current.0.infraSHPortS.attributes.descr == "Updated description for first ansible Access Spine Interface Selector"
+ - nm_update_spine_interface_selector.current.0.infraSHPortS.children.0.infraRsSpAccGrp.attributes.tDn == "uni/infra/funcprof/spaccportgrp-ansible_access_spine_interface_policy_group"
+ - nm_udpate_spine_interface_selector_idempotency is not changed
+ - nm_udpate_spine_interface_selector_idempotency.current.0.infraSHPortS.attributes.name == "ansible_access_spine_interface_selector_1"
+ - nm_udpate_spine_interface_selector_idempotency.current.0.infraSHPortS.attributes.descr == "Updated description for first ansible Access Spine Interface Selector"
+ - nm_udpate_spine_interface_selector_idempotency.current.0.infraSHPortS.children.0.infraRsSpAccGrp.attributes.tDn == "uni/infra/funcprof/spaccportgrp-ansible_access_spine_interface_policy_group"
+
+ # DELETE ACCESS SPINE INTERFACE SELECTOR
+ - name: Remove Access Spine Interface Selector (check_mode)
+ cisco.aci.aci_access_spine_interface_selector: &spine_interface_selector_absent
+ <<: *aci_access_spine_interface_selector_update
+ state: absent
+ check_mode: true
+ register: cm_remove_spine_interface_selector
+
+ - name: Remove Access Spine Interface Selector (normal_mode)
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *spine_interface_selector_absent
+ register: nm_remove_spine_interface_selector
+
+ - name: Remove Access Spine Interface Selector - testing idempotency
+ cisco.aci.aci_access_spine_interface_selector:
+ <<: *spine_interface_selector_absent
+ register: nm_remove_spine_interface_selector_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_spine_interface_selector is changed
+ - cm_remove_spine_interface_selector.current == cm_remove_spine_interface_selector.previous
+ - cm_remove_spine_interface_selector.proposed == {}
+ - nm_remove_spine_interface_selector is changed
+ - nm_remove_spine_interface_selector.previous != []
+ - nm_remove_spine_interface_selector.proposed == {}
+ - nm_remove_spine_interface_selector.current == []
+ - nm_remove_spine_interface_selector_idempotency is not changed
+ - nm_remove_spine_interface_selector_idempotency.previous == []
+ - nm_remove_spine_interface_selector_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the Access Spine Interface profile - cleanup before ending tests
+ cisco.aci.aci_access_spine_interface_profile:
+ <<: *aci_access_spine_interface_profile_present
+ state: absent
+
+ - name: Remove the Spine Interface policy Group - cleanup before ending tests
+ cisco.aci.aci_interface_policy_spine_policy_group:
+ <<: *aci_interface_policy_spine_policy_group_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/tasks/main.yml
new file mode 100644
index 000000000..cf940fcbb
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_profile/tasks/main.yml
@@ -0,0 +1,183 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # CLEAN ENVIRONMENT
+ - name: Remove all Access Spine Switch profiles
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_all_absent
+ <<: *aci_info
+ spine_switch_profile: "{{ item }}"
+ state: absent
+ loop:
+ - ansible_access_spine_switch_profile_1
+ - ansible_access_spine_switch_profile_2
+
+ # CREATE ACCESS SPINE SWITCH PROFILE
+ - name: Add a new Access Spine Switch Profile (check_mode)
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_present
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile_1
+ description: Access Spine Switch Profile 1
+ state: present
+ check_mode: true
+ register: cm_add_spine_switch_profile
+
+ - name: Add a new Access Spine Switch Profile (normal_mode)
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_present
+ register: nm_add_spine_switch_profile
+
+ - name: Add the first Access Spine Switch Profile again - testing idempotency
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_present
+ register: nm_add_spine_switch_profile_idempotency
+
+ - name: Add a second Access Spine Switch Profile (normal_mode)
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_2_present
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile_2
+ description: Access Spine Switch Profile 2
+ state: present
+ register: nm_add_spine_switch_profile_2
+
+ - name: Asserts for Access Spine Switch Profile creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_spine_switch_profile is changed
+ - cm_add_spine_switch_profile.previous == []
+ - cm_add_spine_switch_profile.current == []
+ - cm_add_spine_switch_profile.proposed.infraSpineP.attributes.name == "ansible_access_spine_switch_profile_1"
+ - cm_add_spine_switch_profile.proposed.infraSpineP.attributes.descr == "Access Spine Switch Profile 1"
+ - nm_add_spine_switch_profile is changed
+ - nm_add_spine_switch_profile.previous == []
+ - nm_add_spine_switch_profile.current.0.infraSpineP.attributes.name == "ansible_access_spine_switch_profile_1"
+ - nm_add_spine_switch_profile.current.0.infraSpineP.attributes.descr == "Access Spine Switch Profile 1"
+ - nm_add_spine_switch_profile.current.0.infraSpineP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile_1"
+ - nm_add_spine_switch_profile_idempotency is not changed
+ - nm_add_spine_switch_profile_idempotency.current.0.infraSpineP.attributes.name == "ansible_access_spine_switch_profile_1"
+ - nm_add_spine_switch_profile_idempotency.current.0.infraSpineP.attributes.descr == "Access Spine Switch Profile 1"
+ - nm_add_spine_switch_profile_idempotency.current.0.infraSpineP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile_1"
+ - nm_add_spine_switch_profile_2 is changed
+ - nm_add_spine_switch_profile_2.previous == []
+ - nm_add_spine_switch_profile_2.current.0.infraSpineP.attributes.name == "ansible_access_spine_switch_profile_2"
+ - nm_add_spine_switch_profile_2.current.0.infraSpineP.attributes.descr == "Access Spine Switch Profile 2"
+ - nm_add_spine_switch_profile_2.current.0.infraSpineP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile_2"
+
+ # QUERY ACCESS SPINE SWITCH PROFILE
+ - name: Query all Access Spine Switch Profiles
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_info
+ state: query
+ register: query_all_spine_switch_profile
+
+ - name: Query ansible_access_spine_switch_profile_1
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_present
+ state: query
+ register: query_ansible_access_spine_switch_profile_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_spine_switch_profile is not changed
+ - query_all_spine_switch_profile.current|length >= 2
+ - query_ansible_access_spine_switch_profile_1 is not changed
+ - query_ansible_access_spine_switch_profile_1.current|length == 1
+ - query_ansible_access_spine_switch_profile_1.current.0.infraSpineP.attributes.name == "ansible_access_spine_switch_profile_1"
+ - query_ansible_access_spine_switch_profile_1.current.0.infraSpineP.attributes.descr == "Access Spine Switch Profile 1"
+ - query_ansible_access_spine_switch_profile_1.current.0.infraSpineP.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile_1"
+
+ # UPDATE ACCESS SPINE SWITCH PROFILE
+ - name: Update first Access Spine Switch Profile (check_mode)
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_update
+ <<: *aci_access_spine_switch_profile_present
+ description: Updated description for first ansible Access Spine Switch Profile
+ check_mode: true
+ register: cm_update_spine_switch_profile
+
+ - name: Update first Access Spine Switch Profile (normal_mode)
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_update
+ register: nm_update_spine_switch_profile
+
+ - name: Update first Access Spine Switch Profile again - testing idempotency
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_update
+ register: nm_udpate_spine_switch_profile_idempotency
+
+ - name: Asserts for Access Spine Switch Profile update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_spine_switch_profile is changed
+ - cm_update_spine_switch_profile.previous == cm_update_spine_switch_profile.current
+ - cm_update_spine_switch_profile.proposed.infraSpineP.attributes.descr == "Updated description for first ansible Access Spine Switch Profile"
+ - nm_update_spine_switch_profile is changed
+ - nm_update_spine_switch_profile.current.0.infraSpineP.attributes.name == "ansible_access_spine_switch_profile_1"
+ - nm_update_spine_switch_profile.current.0.infraSpineP.attributes.descr == "Updated description for first ansible Access Spine Switch Profile"
+ - nm_udpate_spine_switch_profile_idempotency is not changed
+ - nm_udpate_spine_switch_profile_idempotency.current.0.infraSpineP.attributes.name == "ansible_access_spine_switch_profile_1"
+ - nm_udpate_spine_switch_profile_idempotency.current.0.infraSpineP.attributes.descr == "Updated description for first ansible Access Spine Switch Profile"
+
+ # DELETE ACCESS SPINE SWITCH PROFILE
+ - name: Remove Access Spine Switch Profile (check_mode)
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_absent
+ <<: *aci_access_spine_switch_profile_update
+ state: absent
+ check_mode: true
+ register: cm_remove_spine_switch_profile
+
+ - name: Remove Access Spine Switch Profile (normal_mode)
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_absent
+ register: nm_remove_spine_switch_profile
+
+ - name: Remove Access Spine Switch Profile - testing idempotency
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_absent
+ register: nm_remove_spine_switch_profile_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_spine_switch_profile is changed
+ - cm_remove_spine_switch_profile.current == cm_remove_spine_switch_profile.previous
+ - cm_remove_spine_switch_profile.proposed == {}
+ - nm_remove_spine_switch_profile is changed
+ - nm_remove_spine_switch_profile.previous != []
+ - nm_remove_spine_switch_profile.proposed == {}
+ - nm_remove_spine_switch_profile.current == []
+ - nm_remove_spine_switch_profile_idempotency is not changed
+ - nm_remove_spine_switch_profile_idempotency.previous == []
+ - nm_remove_spine_switch_profile_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove all Access Spine Switch profiles - cleanup before ending tests
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_all_absent
+ loop:
+ - ansible_access_spine_switch_profile_1
+ - ansible_access_spine_switch_profile_2
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/tasks/main.yml
new file mode 100644
index 000000000..1d314ec0e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_spine_switch_selector/tasks/main.yml
@@ -0,0 +1,193 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_access_spine_switch_profile
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_absent
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile
+ description: Ansible Access Spine Switch Profile
+ state: absent
+
+ - name: Add a new Access Spine Switch profile
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_present
+ <<: *aci_access_spine_switch_profile_absent
+ state: present
+
+ # CREATE ACCESS SPINE SWITCH SELECTOR
+ - name: Add a new Access Spine Switch Selector (check_mode)
+ cisco.aci.aci_access_spine_switch_selector: &aci_access_spine_switch_selector_present
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile
+ spine_switch_selector: ansible_access_spine_switch_selector_1
+ description: Access Spine Switch Selector 1
+ selector_type: range
+ state: present
+ check_mode: true
+ register: cm_add_spine_switch_selector
+
+ - name: Add a new Access Spine Switch Selector (normal_mode)
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *aci_access_spine_switch_selector_present
+ register: nm_add_spine_switch_selector
+
+ - name: Add the first Access Spine Switch Selector again - testing idempotency
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *aci_access_spine_switch_selector_present
+ register: nm_add_spine_switch_selector_idempotency
+
+ - name: Add a second Access Spine Switch Selector (normal_mode)
+ cisco.aci.aci_access_spine_switch_selector: &aci_access_spine_switch_selector_2_present
+ <<: *aci_info
+ spine_switch_profile: ansible_access_spine_switch_profile
+ spine_switch_selector: ansible_access_spine_switch_selector_2
+ description: Access Spine Switch Selector 2
+ selector_type: range
+ state: present
+ register: nm_add_spine_switch_selector_2
+
+ - name: Asserts for Access Spine Switch Selector creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_spine_switch_selector is changed
+ - cm_add_spine_switch_selector.previous == []
+ - cm_add_spine_switch_selector.current == []
+ - cm_add_spine_switch_selector.proposed.infraSpineS.attributes.name == "ansible_access_spine_switch_selector_1"
+ - cm_add_spine_switch_selector.proposed.infraSpineS.attributes.descr == "Access Spine Switch Selector 1"
+ - cm_add_spine_switch_selector.proposed.infraSpineS.attributes.type == "range"
+ - nm_add_spine_switch_selector is changed
+ - nm_add_spine_switch_selector.previous == []
+ - nm_add_spine_switch_selector.current.0.infraSpineS.attributes.name == "ansible_access_spine_switch_selector_1"
+ - nm_add_spine_switch_selector.current.0.infraSpineS.attributes.descr == "Access Spine Switch Selector 1"
+ - nm_add_spine_switch_selector.current.0.infraSpineS.attributes.type == "range"
+ - nm_add_spine_switch_selector_idempotency is not changed
+ - nm_add_spine_switch_selector_idempotency.current.0.infraSpineS.attributes.name == "ansible_access_spine_switch_selector_1"
+ - nm_add_spine_switch_selector_idempotency.current.0.infraSpineS.attributes.descr == "Access Spine Switch Selector 1"
+ - nm_add_spine_switch_selector_idempotency.current.0.infraSpineS.attributes.type == "range"
+ - nm_add_spine_switch_selector_2 is changed
+ - nm_add_spine_switch_selector_2.previous == []
+ - nm_add_spine_switch_selector_2.current.0.infraSpineS.attributes.name == "ansible_access_spine_switch_selector_2"
+ - nm_add_spine_switch_selector_2.current.0.infraSpineS.attributes.descr == "Access Spine Switch Selector 2"
+ - nm_add_spine_switch_selector_2.current.0.infraSpineS.attributes.type == "range"
+
+ # QUERY ACCESS SPINE SWITCH SELECTOR
+ - name: Query all Access Spine Switch Selectors
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *aci_info
+ state: query
+ register: query_all_spine_switch_selector
+
+ - name: Query ansible_access_spine_switch_selector_1
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *aci_access_spine_switch_selector_present
+ state: query
+ register: query_ansible_access_spine_switch_selector_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_spine_switch_selector is not changed
+ - query_all_spine_switch_selector.current|length >= 2
+ - query_ansible_access_spine_switch_selector_1 is not changed
+ - query_ansible_access_spine_switch_selector_1.current|length == 1
+ - query_ansible_access_spine_switch_selector_1.current.0.infraSpineP.children.0.infraSpineS.attributes.name == "ansible_access_spine_switch_selector_1"
+ - query_ansible_access_spine_switch_selector_1.current.0.infraSpineP.children.0.infraSpineS.attributes.descr == "Access Spine Switch Selector 1"
+ - query_ansible_access_spine_switch_selector_1.current.0.infraSpineP.children.0.infraSpineS.attributes.type == "range"
+
+ # UPDATE ACCESS SPINE SWITCH SELECTOR
+ - name: Update first Access Spine Switch Selector by adding a Policy Group (check_mode)
+ cisco.aci.aci_access_spine_switch_selector: &aci_access_spine_switch_selector_update
+ <<: *aci_access_spine_switch_selector_present
+ description: Updated description for first ansible Access Spine Switch Selector
+ policy_group: ansible_access_spine_switch_policy_group
+ check_mode: true
+ register: cm_update_spine_switch_selector
+
+ - name: Update first Access Spine Switch Selector by adding a Policy Group (normal_mode)
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *aci_access_spine_switch_selector_update
+ register: nm_update_spine_switch_selector
+
+ - name: Update first Access Spine Switch Selector by adding a Policy Group again - testing idempotency
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *aci_access_spine_switch_selector_update
+ register: nm_udpate_spine_switch_selector_idempotency
+
+ - name: Asserts for Access Spine Switch Selector update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_spine_switch_selector is changed
+ - cm_update_spine_switch_selector.previous == cm_update_spine_switch_selector.current
+ - cm_update_spine_switch_selector.proposed.infraSpineS.attributes.descr == "Updated description for first ansible Access Spine Switch Selector"
+ - cm_update_spine_switch_selector.proposed.infraSpineS.children.0.infraRsSpineAccNodePGrp.attributes.tDn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_spine_switch_policy_group"
+ - nm_update_spine_switch_selector is changed
+ - nm_update_spine_switch_selector.current.0.infraSpineS.attributes.name == "ansible_access_spine_switch_selector_1"
+ - nm_update_spine_switch_selector.current.0.infraSpineS.attributes.descr == "Updated description for first ansible Access Spine Switch Selector"
+ - nm_update_spine_switch_selector.current.0.infraSpineS.children.0.infraRsSpineAccNodePGrp.attributes.tDn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_spine_switch_policy_group"
+ - nm_udpate_spine_switch_selector_idempotency is not changed
+ - nm_udpate_spine_switch_selector_idempotency.current.0.infraSpineS.attributes.name == "ansible_access_spine_switch_selector_1"
+ - nm_udpate_spine_switch_selector_idempotency.current.0.infraSpineS.attributes.descr == "Updated description for first ansible Access Spine Switch Selector"
+ - nm_udpate_spine_switch_selector_idempotency.current.0.infraSpineS.children.0.infraRsSpineAccNodePGrp.attributes.tDn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_spine_switch_policy_group"
+
+ # DELETE ACCESS SPINE SWITCH SELECTOR
+ - name: Remove Access Spine Switch Selector (check_mode)
+ cisco.aci.aci_access_spine_switch_selector: &spine_switch_selector_absent
+ <<: *aci_access_spine_switch_selector_update
+ state: absent
+ check_mode: true
+ register: cm_remove_spine_switch_selector
+
+ - name: Remove Access Spine Switch Selector (normal_mode)
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *spine_switch_selector_absent
+ register: nm_remove_spine_switch_selector
+
+ - name: Remove Access Spine Switch Selector - testing idempotency
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *spine_switch_selector_absent
+ register: nm_remove_spine_switch_selector_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_spine_switch_selector is changed
+ - cm_remove_spine_switch_selector.current == cm_remove_spine_switch_selector.previous
+ - cm_remove_spine_switch_selector.proposed == {}
+ - nm_remove_spine_switch_selector is changed
+ - nm_remove_spine_switch_selector.previous != []
+ - nm_remove_spine_switch_selector.proposed == {}
+ - nm_remove_spine_switch_selector.current == []
+ - nm_remove_spine_switch_selector_idempotency is not changed
+ - nm_remove_spine_switch_selector_idempotency.previous == []
+ - nm_remove_spine_switch_selector_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the Access Spine Switch profile - cleanup before ending tests
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_sub_port_block_to_access_port/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_sub_port_block_to_access_port/tasks/main.yml
index b986f5762..69326320a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_sub_port_block_to_access_port/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_sub_port_block_to_access_port/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -64,7 +64,7 @@
# TODO: also test for errors
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- accesssubportblock_to_accessport_check_mode_present is changed
- accesssubportblock_to_accessport_present is changed
@@ -88,7 +88,7 @@
register: binding_query
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- binding_query is not changed
- binding_query.current | length >= 1
@@ -120,7 +120,7 @@
register: accesssubportblock_to_accessport_absent_missing_param
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- accesssubportblock_to_accessport_check_mode_absent is changed
- accesssubportblock_to_accessport_check_mode_absent.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/tasks/main.yml
new file mode 100644
index 000000000..70a144a8e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_access_switch_policy_group/tasks/main.yml
@@ -0,0 +1,1122 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Tim Cragg (@timcragg)
+# Copyright: (c) 2023, Akini Ross (@akinross)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ port: "{{ aci_port | default(omit) }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == []
+ block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible access switch policy groups
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: "{{ item.type }}"
+ name: "{{ item.name }}"
+ state: absent
+ loop:
+ - {name: ansible_access_switch_leaf_pol_grp, type: leaf}
+ - {name: ansible_access_switch_leaf_pol_grp_2, type: leaf}
+ - {name: ansible_access_switch_spine_pol_grp, type: spine}
+ - {name: ansible_access_switch_spine_pol_grp_2, type: spine}
+
+ # ACCESS SWITCH LEAF POLICY GROUP
+ - name: Create the ansible access switch leaf policy group (check mode)
+ cisco.aci.aci_access_switch_policy_group: &aci_create_leaf_policy_group
+ <<: *aci_info
+ switch_type: leaf
+ name: ansible_access_switch_leaf_pol_grp
+ state: present
+ check_mode: yes
+ register: cm_create_leaf_policy_group
+
+ - name: Create the ansible access switch leaf policy group
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group
+ register: nm_create_leaf_policy_group
+
+ - name: Create the ansible access switch leaf policy group again
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group
+ register: nm_create_leaf_policy_group_again
+
+ # TODO investigate simplify test assertion because apic returns order that deviates for each version
+ # Possibly by leveraging https://docs.ansible.com/ansible/latest/collections/community/general/docsite/filter_guide_selecting_json_data.html
+ - name: Verify creation of access switch leaf policy group for version 4.2(7s)
+ ansible.builtin.assert:
+ that:
+ - cm_create_leaf_policy_group is changed
+ - cm_create_leaf_policy_group.previous == []
+ - cm_create_leaf_policy_group.current == []
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.dn == "uni/infra/funcprof/accnodepgrp-ansible_access_switch_leaf_pol_grp"
+ - nm_create_leaf_policy_group is changed
+ - nm_create_leaf_policy_group.previous == []
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.1.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.2.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.3.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.4.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.5.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.6.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.7.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.8.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.9.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.10.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.11.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.12.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.13.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.14.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again is not changed
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.1.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.2.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.3.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.4.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.5.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.6.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.7.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.8.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.9.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.10.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.11.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.12.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.13.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.14.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.1.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.2.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.3.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.4.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.5.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.6.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.7.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.8.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.9.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.10.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.11.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.12.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.13.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.14.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ when: version.current.0.topSystem.attributes.version == "4.2(7s)"
+
+ - name: Verify creation of access switch leaf policy group for version 5.2(5c)
+ ansible.builtin.assert:
+ that:
+ - cm_create_leaf_policy_group is changed
+ - cm_create_leaf_policy_group.previous == []
+ - cm_create_leaf_policy_group.current == []
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.dn == "uni/infra/funcprof/accnodepgrp-ansible_access_switch_leaf_pol_grp"
+ - nm_create_leaf_policy_group is changed
+ - nm_create_leaf_policy_group.previous == []
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again is not changed
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ when: version.current.0.topSystem.attributes.version == "5.2(5c)"
+
+ - name: Verify creation of access switch leaf policy group for version 6.0(2h)
+ ansible.builtin.assert:
+ that:
+ - cm_create_leaf_policy_group is changed
+ - cm_create_leaf_policy_group.previous == []
+ - cm_create_leaf_policy_group.current == []
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.dn == "uni/infra/funcprof/accnodepgrp-ansible_access_switch_leaf_pol_grp"
+ - nm_create_leaf_policy_group is changed
+ - nm_create_leaf_policy_group.previous == []
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.3.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.4.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.5.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.6.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.8.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.9.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.10.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.11.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.12.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.13.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.14.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.15.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.16.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.17.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.18.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again is not changed
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.3.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.4.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.5.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.6.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.8.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.9.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.10.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.11.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.12.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.13.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.14.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.15.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.16.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.17.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.18.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.3.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.4.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.5.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.6.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.8.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.9.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.10.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.11.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.12.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.13.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.14.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.15.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.16.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.17.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.18.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ when: version.current.0.topSystem.attributes.version == "6.0(2h)"
+
+ - name: Verify creation of access switch leaf policy group for 6.0(1g)
+ ansible.builtin.assert:
+ that:
+ - cm_create_leaf_policy_group is changed
+ - cm_create_leaf_policy_group.previous == []
+ - cm_create_leaf_policy_group.current == []
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - cm_create_leaf_policy_group.proposed.infraAccNodePGrp.attributes.dn == "uni/infra/funcprof/accnodepgrp-ansible_access_switch_leaf_pol_grp"
+ - nm_create_leaf_policy_group is changed
+ - nm_create_leaf_policy_group.previous == []
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group.current.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again is not changed
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.current.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_leaf_policy_group_again.previous.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ when: version.current.0.topSystem.attributes.version == "6.0(1g)"
+
+ - name: Change the ansible access switch leaf policy group < 5.0
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group
+ spanning_tree_policy: changed_spanning_tree_policy
+ bfd_ipv4_policy: changed_bfd_ipv4_policy
+ bfd_ipv6_policy: changed_bfd_ipv6_policy
+ fibre_channel_node_policy: changed_fibre_channel_node_policy
+ poe_node_policy: changed_poe_node_policy
+ fibre_channel_san_policy: changed_fibre_channel_san_policy
+ monitoring_policy: changed_monitoring_policy
+ copp_policy: changed_copp_policy
+ forward_scale_profile_policy: changed_forward_scale_profile_policy
+ fast_link_failover_policy: changed_fast_link_failover_policy
+ node_802_1x_authentication_policy: changed_node_802_1x_authentication_policy
+ copp_pre_filter_policy: changed_copp_pre_filter_policy
+ equipment_flash_policy: changed_equipment_flash_policy
+ cdp_policy: changed_cdp_policy
+ lldp_policy: changed_lldp_policy
+ register: nm_change_leaf_policy_group_5_2
+ when: version.current.0.topSystem.attributes.version is version('5.2', '<')
+
+ - name: Change the ansible access switch leaf policy group
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group
+ spanning_tree_policy: changed_spanning_tree_policy
+ bfd_ipv4_policy: changed_bfd_ipv4_policy
+ bfd_ipv6_policy: changed_bfd_ipv6_policy
+ bfd_multihop_ipv4_policy: changed_bfd_multihop_ipv4_policy
+ bfd_multihop_ipv6_policy: changed_bfd_multihop_ipv6_policy
+ fibre_channel_node_policy: changed_fibre_channel_node_policy
+ poe_node_policy: changed_poe_node_policy
+ fibre_channel_san_policy: changed_fibre_channel_san_policy
+ monitoring_policy: changed_monitoring_policy
+ copp_policy: changed_copp_policy
+ forward_scale_profile_policy: changed_forward_scale_profile_policy
+ fast_link_failover_policy: changed_fast_link_failover_policy
+ node_802_1x_authentication_policy: changed_node_802_1x_authentication_policy
+ copp_pre_filter_policy: changed_copp_pre_filter_policy
+ equipment_flash_policy: changed_equipment_flash_policy
+ cdp_policy: changed_cdp_policy
+ lldp_policy: changed_lldp_policy
+ sync_e_node_policy: changed_sync_e_node_policy
+ usb_configuration_policy: changed_usb_configuration_policy
+ register: nm_change_leaf_policy_group
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: Verify change of access switch leaf policy group for version 4.2(7s)
+ ansible.builtin.assert:
+ that:
+ - nm_change_leaf_policy_group_5_2 is changed
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == "changed_forward_scale_profile_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.1.infraRsPoeInstPol.attributes.tnPoeInstPolName == "changed_poe_node_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.2.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == "changed_bfd_ipv6_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.3.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == "changed_equipment_flash_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.4.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == "changed_monitoring_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.5.infraRsFcInstPol.attributes.tnFcInstPolName == "changed_fibre_channel_node_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.6.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == "changed_bfd_ipv4_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.7.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == "changed_node_802_1x_authentication_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.8.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == "changed_fast_link_failover_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.9.infraRsMstInstPol.attributes.tnStpInstPolName == "changed_spanning_tree_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.10.infraRsFcFabricPol.attributes.tnFcFabricPolName == "changed_fibre_channel_san_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.11.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == "changed_copp_pre_filter_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.12.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == "changed_copp_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.13.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == "changed_cdp_policy"
+ - nm_change_leaf_policy_group_5_2.current.0.infraAccNodePGrp.children.14.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == "changed_lldp_policy"
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.1.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.2.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.3.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.4.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.5.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.6.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.7.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.8.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.9.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.10.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.11.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.12.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.13.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_change_leaf_policy_group_5_2.previous.0.infraAccNodePGrp.children.14.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ when: version.current.0.topSystem.attributes.version == "4.2(7s)"
+
+ - name: Verify change of access switch leaf policy group for version 5.2(5c)
+ ansible.builtin.assert:
+ that:
+ - nm_change_leaf_policy_group is changed
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == "changed_forward_scale_profile_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == "changed_usb_configuration_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == "changed_lldp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == "changed_cdp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == "changed_bfd_ipv6_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == "changed_sync_e_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == "changed_poe_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == "changed_bfd_multihop_ipv4_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == "changed_bfd_multihop_ipv6_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == "changed_equipment_flash_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == "changed_monitoring_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == "changed_fibre_channel_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == "changed_fast_link_failover_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == "changed_spanning_tree_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == "changed_fibre_channel_san_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == "changed_copp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == "changed_copp_pre_filter_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == "changed_bfd_ipv4_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == "changed_node_802_1x_authentication_policy"
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ when: version.current.0.topSystem.attributes.version == "5.2(5c)"
+
+ - name: Verify change of access switch leaf policy group for version 6.0(2h)
+ ansible.builtin.assert:
+ that:
+ - nm_change_leaf_policy_group is changed
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == "changed_forward_scale_profile_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == "changed_usb_configuration_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == "changed_lldp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.3.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == "changed_bfd_ipv6_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.4.infraRsSynceInstPol.attributes.tnSynceInstPolName == "changed_sync_e_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.5.infraRsPoeInstPol.attributes.tnPoeInstPolName == "changed_poe_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.6.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == "changed_bfd_multihop_ipv4_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == "changed_bfd_multihop_ipv6_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.8.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == "changed_equipment_flash_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.9.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == "changed_monitoring_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.10.infraRsFcInstPol.attributes.tnFcInstPolName == "changed_fibre_channel_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.11.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == "changed_fast_link_failover_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.12.infraRsMstInstPol.attributes.tnStpInstPolName == "changed_spanning_tree_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.13.infraRsFcFabricPol.attributes.tnFcFabricPolName == "changed_fibre_channel_san_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.14.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == "changed_copp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.15.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == "changed_copp_pre_filter_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.16.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == "changed_bfd_ipv4_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.17.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == "changed_node_802_1x_authentication_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.18.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == "changed_cdp_policy"
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.3.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.4.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.5.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.6.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.8.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.9.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.10.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.11.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.12.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.13.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.14.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.15.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.16.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.17.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.18.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ when: version.current.0.topSystem.attributes.version == "6.0(2h)"
+
+ - name: Verify change of access switch leaf policy group for version 6.0(1g)
+ ansible.builtin.assert:
+ that:
+ - nm_change_leaf_policy_group is changed
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == "changed_forward_scale_profile_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == "changed_usb_configuration_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == "changed_lldp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == "changed_cdp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == "changed_bfd_ipv6_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == "changed_sync_e_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == "changed_poe_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == "changed_bfd_multihop_ipv4_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == "changed_bfd_multihop_ipv6_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == "changed_equipment_flash_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == "changed_monitoring_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == "changed_fibre_channel_node_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == "changed_fast_link_failover_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == "changed_spanning_tree_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == "changed_fibre_channel_san_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == "changed_copp_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == "changed_copp_pre_filter_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == "changed_bfd_ipv4_policy"
+ - nm_change_leaf_policy_group.current.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == "changed_node_802_1x_authentication_policy"
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.0.infraRsTopoctrlFwdScaleProfPol.attributes.tnTopoctrlFwdScaleProfilePolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.1.infraRsLeafTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.2.infraRsLeafPGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.3.infraRsLeafPGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.4.infraRsBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.5.infraRsSynceInstPol.attributes.tnSynceInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.6.infraRsPoeInstPol.attributes.tnPoeInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.7.infraRsBfdMhIpv4InstPol.attributes.tnBfdMhIpv4InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.8.infraRsBfdMhIpv6InstPol.attributes.tnBfdMhIpv6InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.9.infraRsEquipmentFlashConfigPol.attributes.tnEquipmentFlashConfigPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.10.infraRsMonNodeInfraPol.attributes.tnMonInfraPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.11.infraRsFcInstPol.attributes.tnFcInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.12.infraRsTopoctrlFastLinkFailoverInstPol.attributes.tnTopoctrlFastLinkFailoverInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.13.infraRsMstInstPol.attributes.tnStpInstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.14.infraRsFcFabricPol.attributes.tnFcFabricPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.15.infraRsLeafCoppProfile.attributes.tnCoppLeafProfileName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.16.infraRsIaclLeafProfile.attributes.tnIaclLeafProfileName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.17.infraRsBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_change_leaf_policy_group.previous.0.infraAccNodePGrp.children.18.infraRsL2NodeAuthPol.attributes.tnL2NodeAuthPolName == ""
+ when: version.current.0.topSystem.attributes.version == "6.0(1g)"
+
+ - name: Create netflow_node_policy in the ansible access switch leaf policy group 2
+ cisco.aci.aci_access_switch_policy_group: &aci_create_leaf_policy_group_2
+ <<: *aci_create_leaf_policy_group
+ name: ansible_access_switch_leaf_pol_grp_2
+ netflow_node_policy: create_netflow_node_policy
+ register: nm_netflow_create
+
+ - name: Change netflow_node_policy in the ansible access switch leaf policy group 2
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group_2
+ netflow_node_policy: changed_netflow_node_policy
+ register: nm_netflow_change
+
+ - name: Create ptp_node_policy in the ansible access switch leaf policy group 2 for version >= 5.2
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group_2
+ ptp_node_policy: create_ptp_node_policy
+ register: nm_ptp_create
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: Change ptp_node_policy in the ansible access switch leaf policy group 2 for version >= 5.2
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group_2
+ ptp_node_policy: changed_ptp_node_policy
+ register: nm_ptp_change
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: Verify netflow_node_policy leaf policy group for version 4.2(7s)
+ ansible.builtin.assert:
+ that:
+ - nm_netflow_create is changed
+ - nm_netflow_create.current.0.infraAccNodePGrp.children.2.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "create_netflow_node_policy"
+ - nm_netflow_change is changed
+ - nm_netflow_change.current.0.infraAccNodePGrp.children.2.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "changed_netflow_node_policy"
+ when: version.current.0.topSystem.attributes.version == "4.2(7s)"
+
+ - name: Verify netflow_node_policy and ptp_node_policy leaf policy group for version 5.2(5c)
+ ansible.builtin.assert:
+ that:
+ - nm_netflow_create is changed
+ - nm_netflow_create.current.0.infraAccNodePGrp.children.1.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "create_netflow_node_policy"
+ - nm_netflow_change is changed
+ - nm_netflow_change.current.0.infraAccNodePGrp.children.1.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "changed_netflow_node_policy"
+ - nm_ptp_create is changed
+ - nm_ptp_create.current.0.infraAccNodePGrp.children.10.infraRsPtpInstPol.attributes.tnPtpInstPolName == "create_ptp_node_policy"
+ - nm_ptp_change is changed
+ - nm_ptp_change.current.0.infraAccNodePGrp.children.10.infraRsPtpInstPol.attributes.tnPtpInstPolName == "changed_ptp_node_policy"
+ when: version.current.0.topSystem.attributes.version == "5.2(5c)"
+
+ - name: Verify netflow_node_policy and ptp_node_policy leaf policy group for version 6.0(2h)
+ ansible.builtin.assert:
+ that:
+ - nm_netflow_create is changed
+ - nm_netflow_create.current.0.infraAccNodePGrp.children.1.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "create_netflow_node_policy"
+ - nm_netflow_change is changed
+ - nm_netflow_change.current.0.infraAccNodePGrp.children.1.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "changed_netflow_node_policy"
+ - nm_ptp_create is changed
+ - nm_ptp_create.current.0.infraAccNodePGrp.children.9.infraRsPtpInstPol.attributes.tnPtpInstPolName == "create_ptp_node_policy"
+ - nm_ptp_change is changed
+ - nm_ptp_change.current.0.infraAccNodePGrp.children.9.infraRsPtpInstPol.attributes.tnPtpInstPolName == "changed_ptp_node_policy"
+ when: version.current.0.topSystem.attributes.version == "6.0(2h)"
+
+ - name: Verify netflow_node_policy and ptp_node_policy leaf policy group for version 6.0(1g)
+ ansible.builtin.assert:
+ that:
+ - nm_netflow_create is changed
+ - nm_netflow_create.current.0.infraAccNodePGrp.children.1.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "create_netflow_node_policy"
+ - nm_netflow_change is changed
+ - nm_netflow_change.current.0.infraAccNodePGrp.children.1.infraRsNetflowNodePol.attributes.tnNetflowNodePolName == "changed_netflow_node_policy"
+ - nm_ptp_create is changed
+ - nm_ptp_create.current.0.infraAccNodePGrp.children.10.infraRsPtpInstPol.attributes.tnPtpInstPolName == "create_ptp_node_policy"
+ - nm_ptp_change is changed
+ - nm_ptp_change.current.0.infraAccNodePGrp.children.10.infraRsPtpInstPol.attributes.tnPtpInstPolName == "changed_ptp_node_policy"
+ when: version.current.0.topSystem.attributes.version == "6.0(1g)"
+
+ - name: Query the ansible access switch leaf policy group 2
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_leaf_policy_group_2
+ state: query
+ register: query_one
+
+ - name: Query all the ansible access switch leaf policy groups
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: leaf
+ state: query
+ register: query_all
+
+ - name: Verify remove of access switch policy
+ ansible.builtin.assert:
+ that:
+ - query_one is not changed
+ - query_one.current | length == 1
+ - query_all is not changed
+ - query_all.current | length > 1
+
+ - name: Remove the ansible access switch leaf policy group (check mode)
+ cisco.aci.aci_access_switch_policy_group: &aci_remove_leaf_policy_group
+ <<: *aci_info
+ switch_type: leaf
+ name: ansible_access_switch_leaf_pol_grp
+ state: absent
+ check_mode: true
+ register: cm_remove_leaf_policy_group
+
+ - name: Remove the ansible access switch leaf policy group
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_remove_leaf_policy_group
+ register: nm_remove_leaf_policy_group
+
+ - name: Remove the ansible access switch leaf policy group again
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_remove_leaf_policy_group
+ register: nm_remove_leaf_policy_group_again
+
+ - name: Verify remove of access switch leaf policy group
+ ansible.builtin.assert:
+ that:
+ - cm_remove_leaf_policy_group is changed
+ - nm_remove_leaf_policy_group.previous != []
+ - nm_remove_leaf_policy_group.proposed == {}
+ - nm_remove_leaf_policy_group is changed
+ - nm_remove_leaf_policy_group.previous != []
+ - nm_remove_leaf_policy_group.current == []
+ - nm_remove_leaf_policy_group_again is not changed
+ - nm_remove_leaf_policy_group_again.previous == []
+ - nm_remove_leaf_policy_group_again.current == []
+
+ # ACCESS SWITCH SPINE POLICY GROUP
+ - name: Create the ansible access switch spine policy group (check mode)
+ cisco.aci.aci_access_switch_policy_group: &aci_create_spine_policy_group
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_spine_pol_grp
+ state: present
+ check_mode: yes
+ register: cm_create_spine_policy_group
+
+ - name: Create the ansible access switch spine policy group
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_spine_policy_group
+ register: nm_create_spine_policy_group
+
+ - name: Create the ansible access switch spine policy group again
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_spine_policy_group
+ register: nm_create_spine_policy_group_again
+
+ - name: Verify creation of access switch spine policy group for version >= 5.2
+ ansible.builtin.assert:
+ that:
+ - cm_create_spine_policy_group is changed
+ - cm_create_spine_policy_group.proposed.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - cm_create_spine_policy_group.proposed.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - cm_create_spine_policy_group.previous == []
+ - cm_create_spine_policy_group.current == []
+ - nm_create_spine_policy_group is changed
+ - nm_create_spine_policy_group.previous == []
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.0.infraRsSpineTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.2.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.3.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.5.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.6.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ - nm_create_spine_policy_group.previous == []
+ - nm_create_spine_policy_group_again is not changed
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.0.infraRsSpineTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.2.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.3.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.5.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.6.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.0.infraRsSpineTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.2.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.3.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.5.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.6.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: Verify creation of access switch spine policy group for version < "5"
+ ansible.builtin.assert:
+ that:
+ - cm_create_spine_policy_group is changed
+ - cm_create_spine_policy_group.proposed.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - cm_create_spine_policy_group.proposed.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - cm_create_spine_policy_group.previous == []
+ - cm_create_spine_policy_group.current == []
+ - nm_create_spine_policy_group is changed
+ - nm_create_spine_policy_group.previous == []
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.0.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.2.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.3.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_spine_policy_group.current.0.infraSpineAccNodePGrp.children.5.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ - nm_create_spine_policy_group.previous == []
+ - nm_create_spine_policy_group_again is not changed
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.0.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.2.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.3.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_spine_policy_group_again.current.0.infraSpineAccNodePGrp.children.5.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.0.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.2.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.3.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_create_spine_policy_group_again.previous.0.infraSpineAccNodePGrp.children.5.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ when: version.current.0.topSystem.attributes.version is version('5.0', '<')
+
+ - name: Change the ansible access switch spine policy group for version >= 5.2
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_spine_policy_group
+ bfd_ipv4_policy: changed_bfd_ipv4_policy
+ bfd_ipv6_policy: changed_bfd_ipv6_policy
+ copp_policy: changed_copp_policy
+ copp_pre_filter_policy: changed_copp_pre_filter_policy
+ cdp_policy: changed_cdp_policy
+ lldp_policy: changed_lldp_policy
+ usb_configuration_policy: changed_usb_configuration_policy
+ register: nm_change_spine_policy_group
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: Verify change of access switch spine policy group for version >= 5.2
+ ansible.builtin.assert:
+ that:
+ - nm_change_spine_policy_group is changed
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.0.infraRsSpineTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == "changed_usb_configuration_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == "changed_lldp_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.2.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == "changed_cdp_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.3.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == "changed_copp_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == "changed_bfd_ipv6_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.5.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == "changed_bfd_ipv4_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.6.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == "changed_copp_pre_filter_policy"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.0.infraRsSpineTopoctrlUsbConfigProfilePol.attributes.tnTopoctrlUsbConfigProfilePolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.2.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.3.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.5.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.6.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: Change the ansible access switch spine policy group for version < 5.0
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_spine_policy_group
+ bfd_ipv4_policy: changed_bfd_ipv4_policy
+ bfd_ipv6_policy: changed_bfd_ipv6_policy
+ copp_policy: changed_copp_policy
+ copp_pre_filter_policy: changed_copp_pre_filter_policy
+ cdp_policy: changed_cdp_policy
+ lldp_policy: changed_lldp_policy
+ register: nm_change_spine_policy_group
+ when: version.current.0.topSystem.attributes.version is version('5.0', '<')
+
+ - name: Verify change of access switch spine policy group for version < "5"
+ ansible.builtin.assert:
+ that:
+ - nm_change_spine_policy_group is changed
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.0.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == "changed_lldp_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == "changed_cdp_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.2.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == "changed_copp_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.3.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == "changed_bfd_ipv6_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == "changed_bfd_ipv4_policy"
+ - nm_change_spine_policy_group.current.0.infraSpineAccNodePGrp.children.5.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == "changed_copp_pre_filter_policy"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.attributes.annotation == "orchestrator:ansible"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.attributes.dn == "uni/infra/funcprof/spaccnodepgrp-ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.attributes.name == "ansible_access_switch_spine_pol_grp"
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.0.infraRsSpinePGrpToLldpIfPol.attributes.tnLldpIfPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.1.infraRsSpinePGrpToCdpIfPol.attributes.tnCdpIfPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.2.infraRsSpineCoppProfile.attributes.tnCoppSpineProfileName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.3.infraRsSpineBfdIpv6InstPol.attributes.tnBfdIpv6InstPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.4.infraRsSpineBfdIpv4InstPol.attributes.tnBfdIpv4InstPolName == ""
+ - nm_change_spine_policy_group.previous.0.infraSpineAccNodePGrp.children.5.infraRsIaclSpineProfile.attributes.tnIaclSpineProfileName == ""
+ when: version.current.0.topSystem.attributes.version is version('5.0', '<')
+
+ - name: Create another ansible access switch spine policy group 2
+ cisco.aci.aci_access_switch_policy_group: &aci_create_spine_policy_group_2
+ <<: *aci_create_spine_policy_group
+ name: ansible_access_switch_leaf_pol_grp_2
+
+ - name: Query the ansible access switch spine policy group 2
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_create_spine_policy_group_2
+ state: query
+ register: query_one
+
+ - name: Query all the ansible access switch spine policy groups
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ state: query
+ register: query_all
+
+ - name: Verify remove of access switch policy
+ ansible.builtin.assert:
+ that:
+ - query_one is not changed
+ - query_one.current | length == 1
+ - query_all is not changed
+ - query_all.current | length > 1
+
+ - name: Remove the ansible access switch spine policy group (check mode)
+ cisco.aci.aci_access_switch_policy_group: &aci_remove_spine_policy_group
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_spine_pol_grp
+ state: absent
+ check_mode: true
+ register: cm_remove_spine_policy_group
+
+ - name: Remove the ansible access switch spine policy group
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_remove_spine_policy_group
+ register: nm_remove_spine_policy_group
+
+ - name: Remove the ansible access switch spine policy group again
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_remove_spine_policy_group
+ register: nm_remove_spine_policy_group_again
+
+ - name: Verify remove of access switch spine policy group
+ ansible.builtin.assert:
+ that:
+ - cm_remove_spine_policy_group is changed
+ - nm_remove_spine_policy_group.previous != []
+ - nm_remove_spine_policy_group.proposed == {}
+ - nm_remove_spine_policy_group is changed
+ - nm_remove_spine_policy_group.previous != []
+ - nm_remove_spine_policy_group.current == []
+ - nm_remove_spine_policy_group_again is not changed
+ - nm_remove_spine_policy_group_again.previous == []
+ - nm_remove_spine_policy_group_again.current == []
+
+ # WRONG CONFIGURATION FOR SPINE SWITCH TYPE
+ - name: Create the ansible access switch spine policy group with spanning_tree_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ spanning_tree_policy: invalid_spanning_tree_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_spanning_tree_policy
+
+ - name: Create the ansible access switch spine policy group with bfd_multihop_ipv4_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ bfd_multihop_ipv4_policy: invalid_bfd_multihop_ipv4_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_bfd_multihop_ipv4_policy
+
+ - name: Create the ansible access switch spine policy group with bfd_multihop_ipv6_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ bfd_multihop_ipv6_policy: invalid_bfd_multihop_ipv6_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_bfd_multihop_ipv6_policy
+
+ - name: Create the ansible access switch spine policy group with fibre_channel_node_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ fibre_channel_node_policy: invalid_fibre_channel_node_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_fibre_channel_node_policy
+
+ - name: Create the ansible access switch spine policy group with poe_node_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ poe_node_policy: invalid_poe_node_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_poe_node_policy
+
+ - name: Create the ansible access switch spine policy group with fibre_channel_san_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ fibre_channel_san_policy: invalid_fibre_channel_san_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_fibre_channel_san_policy
+
+ - name: Create the ansible access switch spine policy group with monitoring_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ monitoring_policy: invalid_monitoring_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_monitoring_policy
+
+ - name: Create the ansible access switch spine policy group with netflow_node_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ netflow_node_policy: invalid_netflow_node_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_netflow_node_policy
+
+ - name: Create the ansible access switch spine policy group with forward_scale_profile_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ forward_scale_profile_policy: invalid_forward_scale_profile_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_forward_scale_profile_policy
+
+ - name: Create the ansible access switch spine policy group with fast_link_failover_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ fast_link_failover_policy: invalid_fast_link_failover_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_fast_link_failover_policy
+
+ - name: Create the ansible access switch spine policy group with node_802_1x_authentication_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ node_802_1x_authentication_policy: invalid_node_802_1x_authentication_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_node_802_1x_authentication_policy
+
+ - name: Create the ansible access switch spine policy group with equipment_flash_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ equipment_flash_policy: invalid_equipment_flash_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_equipment_flash_policy
+
+ - name: Create the ansible access switch spine policy group with sync_e_node_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ sync_e_node_policy: invalid_sync_e_node_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_sync_e_node_policy
+
+ - name: Create the ansible access switch spine policy group with ptp_node_policy (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ ptp_node_policy: invalid_ptp_node_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_ptp_node_policy
+
+ - name: Create the ansible access switch spine policy group with all (error)
+ cisco.aci.aci_access_switch_policy_group:
+ <<: *aci_info
+ switch_type: spine
+ name: ansible_access_switch_leaf_pol_grp
+ bfd_ipv4_policy: valid_bfd_ipv4_policy
+ bfd_ipv6_policy: valid_bfd_ipv6_policy
+ copp_policy: valid_copp_policy
+ copp_pre_filter_policy: valid_copp_pre_filter_policy
+ cdp_policy: valid_cdp_policy
+ lldp_policy: valid_lldp_policy
+ usb_configuration_policy: valid_usb_configuration_policy
+ spanning_tree_policy: invalid_spanning_tree_policy
+ bfd_multihop_ipv4_policy: invalid_bfd_multihop_ipv4_policy
+ bfd_multihop_ipv6_policy: invalid_bfd_multihop_ipv6_policy
+ fibre_channel_node_policy: invalid_fibre_channel_node_policy
+ poe_node_policy: invalid_poe_node_policy
+ fibre_channel_san_policy: invalid_fibre_channel_san_policy
+ monitoring_policy: invalid_monitoring_policy
+ netflow_node_policy: invalid_netflow_node_policy
+ forward_scale_profile_policy: invalid_forward_scale_profile_policy
+ fast_link_failover_policy: invalid_fast_link_failover_policy
+ node_802_1x_authentication_policy: invalid_node_802_1x_authentication_policy
+ equipment_flash_policy: invalid_equipment_flash_policy
+ sync_e_node_policy: invalid_sync_e_node_policy
+ ptp_node_policy: invalid_ptp_node_policy
+ state: present
+ ignore_errors: true
+ register: err_create_spine_policy_group_with_all
+
+ - name: Verify errors of access switch spine policy group
+ ansible.builtin.assert:
+ that:
+ - err_create_spine_policy_group_with_spanning_tree_policy is failed
+ - err_create_spine_policy_group_with_spanning_tree_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_bfd_multihop_ipv6_policy is failed
+ - err_create_spine_policy_group_with_bfd_multihop_ipv6_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_fibre_channel_node_policy is failed
+ - err_create_spine_policy_group_with_fibre_channel_node_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_poe_node_policy is failed
+ - err_create_spine_policy_group_with_poe_node_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_fibre_channel_san_policy is failed
+ - err_create_spine_policy_group_with_fibre_channel_san_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_monitoring_policy is failed
+ - err_create_spine_policy_group_with_monitoring_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_netflow_node_policy is failed
+ - err_create_spine_policy_group_with_netflow_node_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_forward_scale_profile_policy is failed
+ - err_create_spine_policy_group_with_forward_scale_profile_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_fast_link_failover_policy is failed
+ - err_create_spine_policy_group_with_fast_link_failover_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_node_802_1x_authentication_policy is failed
+ - err_create_spine_policy_group_with_node_802_1x_authentication_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_equipment_flash_policy is failed
+ - err_create_spine_policy_group_with_equipment_flash_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_sync_e_node_policy is failed
+ - err_create_spine_policy_group_with_sync_e_node_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_ptp_node_policy is failed
+ - err_create_spine_policy_group_with_ptp_node_policy.msg == "Unsupported policy provided for spine switch type."
+ - err_create_spine_policy_group_with_all is failed
+ - err_create_spine_policy_group_with_all.msg == "Unsupported policy provided for spine switch type."
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/tasks/main.yml
new file mode 100644
index 000000000..f08bcf5c0
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_additional_communities/tasks/main.yml
@@ -0,0 +1,147 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new action rule profile
+ cisco.aci.aci_tenant_action_rule_profile: &aci_action_rule_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ description: Ansible action rule profile for ansible_tenant tenant
+ state: present
+
+ - name: Add an additional communities action rule (check_mode)
+ cisco.aci.aci_action_rule_additional_communities: &aci_action_rule_additional_communities_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ community: regular:as2-nn2:4:15
+ criteria: append
+ state: present
+ check_mode: true
+ register: cm_add_action_rule_add_comm
+
+ - name: Add an additional communities action rule again (normal_mode)
+ cisco.aci.aci_action_rule_additional_communities:
+ <<: *aci_action_rule_additional_communities_present
+ register: nm_add_action_rule_add_comm
+
+ - name: Add an additional communities action rule again - testing idempotency
+ cisco.aci.aci_action_rule_additional_communities:
+ <<: *aci_action_rule_additional_communities_present
+ register: nm_add_action_rule_add_comm_idempotency
+
+ - name: Add an additional communities action rule
+ cisco.aci.aci_action_rule_additional_communities:
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ community: extended:as4-nn2:5:16
+ state: present
+ register: nm_add_action_rule_add_comm_2
+
+ - name: Asserts for additional communities action rules creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_action_rule_add_comm is changed
+ - cm_add_action_rule_add_comm.previous == []
+ - cm_add_action_rule_add_comm.current == []
+ - nm_add_action_rule_add_comm is changed
+ - nm_add_action_rule_add_comm.current.0.rtctrlSetAddComm.attributes.community == "regular:as2-nn2:4:15"
+ - nm_add_action_rule_add_comm.current.0.rtctrlSetAddComm.attributes.setCriteria == "append"
+ - nm_add_action_rule_add_comm_idempotency is not changed
+ - nm_add_action_rule_add_comm_2 is changed
+ - nm_add_action_rule_add_comm_2.previous == []
+ - nm_add_action_rule_add_comm_2.current.0.rtctrlSetAddComm.attributes.community == "extended:as4-nn2:5:16"
+ - nm_add_action_rule_add_comm_2.current.0.rtctrlSetAddComm.attributes.setCriteria == "append"
+
+ - name: Query all additional communities action rules
+ cisco.aci.aci_action_rule_additional_communities:
+ <<: *aci_info
+ state: query
+ register: query_all_action_rule_add_comm
+
+ - name: Query ansible_action_rule_add_comm additional communities action rule
+ cisco.aci.aci_action_rule_additional_communities:
+ <<: *aci_action_rule_additional_communities_present
+ state: query
+ register: query_action_rule_add_comm
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_action_rule_add_comm is not changed
+ - query_all_action_rule_add_comm.current|length >= 2
+ - query_action_rule_add_comm is not changed
+ - query_action_rule_add_comm.current.0.rtctrlSetAddComm.attributes.community == "regular:as2-nn2:4:15"
+ - query_action_rule_add_comm.current.0.rtctrlSetAddComm.attributes.setCriteria == "append"
+
+ - name: Remove additional communities action rule (check_mode)
+ cisco.aci.aci_action_rule_additional_communities: &aci_action_rule_additional_communities_absent
+ <<: *aci_action_rule_additional_communities_present
+ state: absent
+ check_mode: true
+ register: cm_remove_action_rule_add_comm
+
+ - name: Remove additional communities action rule (normal_mode)
+ cisco.aci.aci_action_rule_additional_communities:
+ <<: *aci_action_rule_additional_communities_absent
+ register: nm_remove_remove_action_rule_add_comm
+
+ - name: Remove additional communities action rule again - testing previous Removal
+ cisco.aci.aci_action_rule_additional_communities:
+ <<: *aci_action_rule_additional_communities_absent
+ register: nm_remove_action_rule_add_comm_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_action_rule_add_comm is changed
+ - cm_remove_action_rule_add_comm.proposed == {}
+ - nm_remove_remove_action_rule_add_comm is changed
+ - nm_remove_remove_action_rule_add_comm.previous != []
+ - nm_remove_remove_action_rule_add_comm.method == "DELETE"
+ - nm_remove_action_rule_add_comm_idempotency is not changed
+ - nm_remove_action_rule_add_comm_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/tasks/main.yml
new file mode 100644
index 000000000..2ce0aadf0
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path/tasks/main.yml
@@ -0,0 +1,148 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new action rule profile
+ cisco.aci.aci_tenant_action_rule_profile: &aci_action_rule_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ description: Ansible action rule profile for ansible_tenant tenant
+ state: present
+
+ - name: Add a set AS path action rule (check_mode)
+ cisco.aci.aci_action_rule_set_as_path: &aci_action_rule_set_as_path_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ last_as_number: 0
+ criteria: prepend
+ state: present
+ check_mode: true
+ register: cm_add_action_rule_set_as_path
+
+ - name: Add a set AS path action rule again (normal_mode)
+ cisco.aci.aci_action_rule_set_as_path:
+ <<: *aci_action_rule_set_as_path_present
+ register: nm_add_action_rule_set_as_path
+
+ - name: Add a set AS path action rule again - testing idempotency
+ cisco.aci.aci_action_rule_set_as_path:
+ <<: *aci_action_rule_set_as_path_present
+ register: nm_add_action_rule_set_as_path_idempotency
+
+ - name: Add a set AS path action rule
+ cisco.aci.aci_action_rule_set_as_path:
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ last_as_number: 2
+ criteria: prepend-last-as
+ state: present
+ register: nm_add_action_rule_set_as_path_2
+
+ - name: Asserts for set AS path action rule creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_action_rule_set_as_path is changed
+ - cm_add_action_rule_set_as_path.previous == []
+ - cm_add_action_rule_set_as_path.current == []
+ - nm_add_action_rule_set_as_path is changed
+ - nm_add_action_rule_set_as_path.current.0.rtctrlSetASPath.attributes.lastnum == "0"
+ - nm_add_action_rule_set_as_path.current.0.rtctrlSetASPath.attributes.criteria == "prepend"
+ - nm_add_action_rule_set_as_path_idempotency is not changed
+ - nm_add_action_rule_set_as_path_2 is changed
+ - nm_add_action_rule_set_as_path_2.previous == []
+ - nm_add_action_rule_set_as_path_2.current.0.rtctrlSetASPath.attributes.lastnum == "2"
+ - nm_add_action_rule_set_as_path_2.current.0.rtctrlSetASPath.attributes.criteria == "prepend-last-as"
+
+ - name: Query all set AS path action rules
+ cisco.aci.aci_action_rule_set_as_path:
+ <<: *aci_info
+ state: query
+ register: query_all_action_rule_set_as_path
+
+ - name: Query ansible_action_rule_set_as_path set AS path action rule
+ cisco.aci.aci_action_rule_set_as_path:
+ <<: *aci_action_rule_set_as_path_present
+ state: query
+ register: query_action_rule_set_as_path
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_action_rule_set_as_path is not changed
+ - query_all_action_rule_set_as_path.current|length >= 2
+ - query_action_rule_set_as_path is not changed
+ - query_action_rule_set_as_path.current.0.rtctrlSetASPath.attributes.lastnum == "0"
+ - query_action_rule_set_as_path.current.0.rtctrlSetASPath.attributes.criteria == "prepend"
+
+ - name: Remove set AS path action rule (check_mode)
+ cisco.aci.aci_action_rule_set_as_path: &aci_action_rule_set_as_path_absent
+ <<: *aci_action_rule_set_as_path_present
+ state: absent
+ check_mode: true
+ register: cm_remove_action_rule_set_as_path
+
+ - name: Remove set AS path action rule (normal_mode)
+ cisco.aci.aci_action_rule_set_as_path:
+ <<: *aci_action_rule_set_as_path_absent
+ register: nm_remove_remove_action_rule_set_as_path
+
+ - name: Remove set AS path action rule again - testing previous Removal
+ cisco.aci.aci_action_rule_set_as_path:
+ <<: *aci_action_rule_set_as_path_absent
+ register: nm_remove_action_rule_set_as_path_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_action_rule_set_as_path is changed
+ - cm_remove_action_rule_set_as_path.proposed == {}
+ - nm_remove_remove_action_rule_set_as_path is changed
+ - nm_remove_remove_action_rule_set_as_path.previous != []
+ - nm_remove_remove_action_rule_set_as_path.method == "DELETE"
+ - nm_remove_action_rule_set_as_path_idempotency is not changed
+ - nm_remove_action_rule_set_as_path_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/tasks/main.yml
new file mode 100644
index 000000000..f17ed2f23
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_action_rule_set_as_path_asn/tasks/main.yml
@@ -0,0 +1,156 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new action rule profile
+ cisco.aci.aci_tenant_action_rule_profile: &aci_action_rule_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ description: Ansible action rule profile for ansible_tenant tenant
+ state: present
+
+ - name: Add a set AS path action rule
+ cisco.aci.aci_action_rule_set_as_path: &aci_action_rule_set_as_path_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ criteria: prepend
+ state: present
+
+ - name: Add a set AS path ASN action rule (check_mode)
+ cisco.aci.aci_action_rule_set_as_path_asn: &aci_action_rule_set_as_path_asn_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ asn: 1
+ order: 1
+ state: present
+ check_mode: true
+ register: cm_add_action_rule_set_as_path_asn
+
+ - name: Add a set AS path ASN action rule again (normal_mode)
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ <<: *aci_action_rule_set_as_path_asn_present
+ register: nm_add_action_rule_set_as_path_asn
+
+ - name: Add a set AS path ASN action rule again - testing idempotency
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ <<: *aci_action_rule_set_as_path_asn_present
+ register: nm_add_action_rule_set_as_path_asn_idempotency
+
+ - name: Add a set AS path ASN action rule
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ <<: *aci_info
+ tenant: ansible_tenant
+ action_rule: ansible_action_rule
+ asn: 2
+ order: 2
+ state: present
+ register: nm_add_action_rule_set_as_path_asn_2
+
+ - name: Asserts for Set AS Path ASN action rule creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_action_rule_set_as_path_asn is changed
+ - cm_add_action_rule_set_as_path_asn.previous == []
+ - cm_add_action_rule_set_as_path_asn.current == []
+ - nm_add_action_rule_set_as_path_asn is changed
+ - nm_add_action_rule_set_as_path_asn.current.0.rtctrlSetASPathASN.attributes.asn == "1"
+ - nm_add_action_rule_set_as_path_asn.current.0.rtctrlSetASPathASN.attributes.order == "1"
+ - nm_add_action_rule_set_as_path_asn_idempotency is not changed
+ - nm_add_action_rule_set_as_path_asn_2 is changed
+ - nm_add_action_rule_set_as_path_asn_2.previous == []
+ - nm_add_action_rule_set_as_path_asn_2.current.0.rtctrlSetASPathASN.attributes.asn == "2"
+ - nm_add_action_rule_set_as_path_asn_2.current.0.rtctrlSetASPathASN.attributes.order == "2"
+
+ - name: Query all set AS path ASN action rules
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ <<: *aci_info
+ state: query
+ register: query_all_action_rule_set_as_path_asn
+
+ - name: Query ansible_action_rule_set_as_path_asn set AS path ASN action rule
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ <<: *aci_action_rule_set_as_path_asn_present
+ state: query
+ register: query_action_rule_set_as_path_asn
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_action_rule_set_as_path_asn is not changed
+ - query_all_action_rule_set_as_path_asn.current|length >= 2
+ - query_action_rule_set_as_path_asn is not changed
+ - query_action_rule_set_as_path_asn.current.0.rtctrlSetASPathASN.attributes.asn == "1"
+ - query_action_rule_set_as_path_asn.current.0.rtctrlSetASPathASN.attributes.order == "1"
+
+ - name: Remove set AS path ASN action rule (check_mode)
+ cisco.aci.aci_action_rule_set_as_path_asn: &aci_action_rule_set_as_path_asn_absent
+ <<: *aci_action_rule_set_as_path_asn_present
+ state: absent
+ check_mode: true
+ register: cm_remove_action_rule_set_as_path_asn
+
+ - name: Remove set AS path ASN action rule (normal_mode)
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ <<: *aci_action_rule_set_as_path_asn_absent
+ register: nm_remove_remove_action_rule_set_as_path_asn
+
+ - name: Remove set AS path ASN action rule again - testing previous Removal
+ cisco.aci.aci_action_rule_set_as_path_asn:
+ <<: *aci_action_rule_set_as_path_asn_absent
+ register: nm_remove_action_rule_set_as_path_asn_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_action_rule_set_as_path_asn is changed
+ - cm_remove_action_rule_set_as_path_asn.proposed == {}
+ - nm_remove_remove_action_rule_set_as_path_asn is changed
+ - nm_remove_remove_action_rule_set_as_path_asn.previous != []
+ - nm_remove_remove_action_rule_set_as_path_asn.method == "DELETE"
+ - nm_remove_action_rule_set_as_path_asn_idempotency is not changed
+ - nm_remove_action_rule_set_as_path_asn_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aep/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aep/tasks/main.yml
index 1a389a9fc..81ff17663 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aep/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aep/tasks/main.yml
@@ -1,15 +1,16 @@
# Test code for the ACI modules
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com>
+# Copyright: (c) 2024, Samita Bhattacharjee (@samiib) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -66,7 +67,7 @@
register: nm_add_aep3
- name: Verify add_aep
- assert:
+ ansible.builtin.assert:
that:
- cm_add_aep is changed
- nm_add_aep is changed
@@ -106,7 +107,7 @@
register: nm_add_aep_again
- name: Verify add_aep_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_aep_again is not changed
- nm_add_aep_again is not changed
@@ -132,7 +133,7 @@
register: nm_add_aep_descr
- name: Verify add_aep_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_aep_descr is changed
- nm_add_aep_descr is changed
@@ -159,7 +160,7 @@
register: nm_add_aep_descr_again
- name: Verify add_aep_descr_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_aep_descr_again is not changed
- nm_add_aep_descr_again is not changed
@@ -182,7 +183,7 @@
register: nm_add_aep_again_no_descr
- name: Verify add_aep_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_aep_again_no_descr is not changed
- nm_add_aep_again_no_descr is not changed
@@ -192,6 +193,75 @@
- cm_add_aep_again_no_descr.previous[0].infraAttEntityP.attributes.dn == nm_add_aep_again_no_descr.previous[0].infraAttEntityP.attributes.dn == cm_add_aep_again_no_descr.current[0].infraAttEntityP.attributes.dn == nm_add_aep_again_no_descr.current[0].infraAttEntityP.attributes.dn == 'uni/infra/attentp-ansible_test'
- cm_add_aep_again_no_descr.previous[0].infraAttEntityP.attributes.name == nm_add_aep_again_no_descr.previous[0].infraAttEntityP.attributes.name == cm_add_aep_again_no_descr.current[0].infraAttEntityP.attributes.name == nm_add_aep_again_no_descr.current[0].infraAttEntityP.attributes.name == 'ansible_test'
+ # TEST NO VERIFICATION
+ - name: Create aep with no verification (check mode)
+ cisco.aci.aci_aep: &aci_aep_no_verify
+ <<: *aep_present
+ aep: anstest-no-verify
+ description: Ansible Test
+ no_verification: true
+ check_mode: true
+ register: aep_present_no_verify_cm
+
+ - name: Create aep with no verification
+ cisco.aci.aci_aep:
+ <<: *aci_aep_no_verify
+ register: aep_present_no_verify
+
+ - name: Create aep with no verification again
+ cisco.aci.aci_aep:
+ <<: *aci_aep_no_verify
+ register: aep_present_no_verify_again
+
+ - name: Update aep with no verification
+ cisco.aci.aci_aep:
+ <<: *aci_aep_no_verify
+ description: Ansible Test No Verify
+ register: update_aep_present_no_verify
+
+ - name: Delete aep with no verification
+ cisco.aci.aci_aep:
+ <<: *aci_aep_no_verify
+ state: absent
+ register: delete_aep_present_no_verify
+
+ - name: Delete aep with no verification again
+ cisco.aci.aci_aep:
+ <<: *aci_aep_no_verify
+ state: absent
+ register: delete_aep_present_no_verify_again
+
+ - name: No verification asserts
+ ansible.builtin.assert:
+ that:
+ - aep_present_no_verify_cm is changed
+ - aep_present_no_verify_cm.current_verified == false
+ - aep_present_no_verify_cm.current.0 == aep_present_no_verify_cm.proposed
+ - aep_present_no_verify is changed
+ - aep_present_no_verify.current_verified == false
+ - aep_present_no_verify.current.0 == aep_present_no_verify.proposed
+ - aep_present_no_verify.previous == []
+ - aep_present_no_verify_again is not changed
+ - aep_present_no_verify_again.current_verified == true
+ - aep_present_no_verify_again.current.0.infraAttEntityP.attributes.name == "anstest-no-verify"
+ - aep_present_no_verify_again.current.0.infraAttEntityP.attributes.descr == "Ansible Test"
+ - aep_present_no_verify_again.previous.0.infraAttEntityP.attributes.name == "anstest-no-verify"
+ - aep_present_no_verify_again.previous.0.infraAttEntityP.attributes.descr == "Ansible Test"
+ - update_aep_present_no_verify is changed
+ - update_aep_present_no_verify.current_verified == false
+ - update_aep_present_no_verify.current.0 == update_aep_present_no_verify.proposed
+ - update_aep_present_no_verify.previous.0.infraAttEntityP.attributes.name == "anstest-no-verify"
+ - update_aep_present_no_verify.previous.0.infraAttEntityP.attributes.descr == "Ansible Test"
+ - delete_aep_present_no_verify is changed
+ - delete_aep_present_no_verify.current_verified == false
+ - delete_aep_present_no_verify.current.0 == delete_aep_present_no_verify.proposed
+ - delete_aep_present_no_verify.previous.0.infraAttEntityP.attributes.name == "anstest-no-verify"
+ - delete_aep_present_no_verify.previous.0.infraAttEntityP.attributes.descr == "Ansible Test No Verify"
+ - delete_aep_present_no_verify_again is not changed
+ - delete_aep_present_no_verify_again.current_verified == true
+ - delete_aep_present_no_verify_again.current == []
+ - delete_aep_present_no_verify_again.previous == []
+ - delete_aep_present_no_verify_again.proposed == {}
# QUERY ALL AEPS
- name: Query all AEPs (check_mode)
@@ -212,7 +282,7 @@
register: nm_query_all_aeps
- name: Verify query_all_aeps
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_aeps is not changed
- nm_query_all_aeps is not changed
@@ -235,7 +305,7 @@
register: nm_query_aep
- name: Verify query_aep
- assert:
+ ansible.builtin.assert:
that:
- cm_query_aep is not changed
- nm_query_aep is not changed
@@ -260,7 +330,7 @@
register: nm_remove_aep
- name: Verify remove_aep
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_aep is changed
- nm_remove_aep is changed
@@ -285,7 +355,7 @@
register: nm_remove_aep_again
- name: Verify remove_aep_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_aep_again is not changed
- nm_remove_aep_again is not changed
@@ -309,7 +379,7 @@
register: nm_query_non_aep
- name: Verify query_non_aep
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_aep is not changed
- nm_query_non_aep is not changed
@@ -332,7 +402,7 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "state is present but all of the following are missing: aep"'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_domain/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_domain/tasks/main.yml
index 2a4f6f23e..2cd820811 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_domain/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_domain/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -21,7 +21,7 @@
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -78,7 +78,7 @@
register: nm_add_binding
- name: Verify add_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_add_binding is changed
- nm_add_binding is changed
@@ -99,7 +99,7 @@
register: nm_add_binding_again
- name: Verify add_binding_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_binding_again is not changed
- nm_add_binding_again is not changed
@@ -148,7 +148,7 @@
register: nm_vmm_type
- name: Verify bindings with domain types
- assert:
+ ansible.builtin.assert:
that:
- err_not_vmm_with_vm_provider is not changed
- err_not_vmm_with_vm_provider.msg == "Domain type 'phys' cannot have a 'vm_provider'"
@@ -174,7 +174,7 @@
register: nm_query_all_bindings
- name: Verify query_all_bindings
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_bindings is not changed
- nm_query_all_bindings is not changed
@@ -201,7 +201,7 @@
register: nm_query_binding
- name: Verify query_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_query_binding is not changed
- nm_query_binding is not changed
@@ -222,7 +222,7 @@
register: nm_remove_binding
- name: Verify remove_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_binding is changed
- nm_remove_binding is changed
@@ -240,7 +240,7 @@
register: nm_remove_binding_again
- name: Verify remove_binding_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_binding_again is not changed
- nm_remove_binding_again is not changed
@@ -265,7 +265,7 @@
register: nm_query_non_binding
- name: Verify query_non_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_binding is not changed
- nm_query_non_binding is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_epg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_epg/tasks/main.yml
index 86ee212bd..6d3430519 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_epg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_aep_to_epg/tasks/main.yml
@@ -4,7 +4,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -15,7 +15,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -84,7 +84,7 @@
register: nm_add_assoc
- name: Verify add_assoc
- assert:
+ ansible.builtin.assert:
that:
- cm_add_assoc is changed
- nm_add_assoc is changed
@@ -106,7 +106,7 @@
register: nm_add_assoc_again
- name: Verify add_assoc_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_assoc_again is not changed
- nm_add_assoc_again is not changed
@@ -126,7 +126,7 @@
register: nm_update_assoc
- name: Verify update_assoc
- assert:
+ ansible.builtin.assert:
that:
- cm_update_assoc is changed
- nm_update_assoc is changed
@@ -149,7 +149,7 @@
register: query_all_assocs
- name: Verify query_all_assocs
- assert:
+ ansible.builtin.assert:
that:
- query_all_assocs is not changed
- query_all_assocs.current|length >= 1
@@ -162,7 +162,7 @@
register: query_spec_assoc
- name: Verify query_spec_assoc
- assert:
+ ansible.builtin.assert:
that:
- query_spec_assoc is not changed
- query_spec_assoc.current|length == 1
@@ -181,7 +181,7 @@
register: nm_remove_spec_assoc
- name: Verify remove_spec_assoc
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_spec_assoc is changed
- nm_remove_spec_assoc is changed
@@ -193,7 +193,7 @@
register: nm_remove_spec_assoc_again
- name: Verify remove_spec_assoc_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_spec_assoc_again is not changed
@@ -206,7 +206,7 @@
register: query_existing_assoc
- name: Verify query_existing_assoc
- assert:
+ ansible.builtin.assert:
that:
- query_existing_assoc is not changed
- query_existing_assoc.current|length == 1
@@ -219,7 +219,7 @@
register: nm_query_non_exist
- name: Verify nm_query_non_exist
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_exist is not changed
- nm_query_non_exist.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_ap/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_ap/tasks/main.yml
index c527a9059..94db7989e 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_ap/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_ap/tasks/main.yml
@@ -1,16 +1,17 @@
# Test code for the ACI modules
# Copyright: (c) 2017, Jacob McGill (@jmcgill298)
# Copyright: (c) 2020, Shreyas Srish (@shrsr)
+# Copyright: (c) 2024, Samita Bhattacharjee (@samiib) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: ensure tenant does not exists
cisco.aci.aci_tenant: &aci_tenant_absent
@@ -88,7 +89,7 @@
register: ap_present_missing_param
- name: present asserts
- assert:
+ ansible.builtin.assert:
that:
- ap_present_check_mode is changed
- ap_present is changed
@@ -106,6 +107,75 @@
- ap_present_missing_param is failed
- 'ap_present_missing_param.msg == "state is present but all of the following are missing: ap"'
+ # TEST NO VERIFICATION
+ - name: create ap with no verification (check mode)
+ cisco.aci.aci_ap: &aci_ap_no_verify
+ <<: *aci_ap_present
+ ap: anstest-no-verify
+ no_verification: true
+ check_mode: true
+ register: ap_present_no_verify_cm
+
+ - name: create ap with no verification
+ cisco.aci.aci_ap:
+ <<: *aci_ap_no_verify
+ register: ap_present_no_verify
+
+ - name: create ap with no verification again
+ cisco.aci.aci_ap:
+ <<: *aci_ap_no_verify
+ register: ap_present_no_verify_again
+
+ - name: update ap with no verification
+ cisco.aci.aci_ap:
+ <<: *aci_ap_no_verify
+ description: Ansible Test No Verify
+ register: update_ap_present_no_verify
+
+ - name: delete ap with no verification
+ cisco.aci.aci_ap:
+ <<: *aci_ap_no_verify
+ state: absent
+ register: delete_ap_present_no_verify
+
+ - name: delete ap with no verification again
+ cisco.aci.aci_ap:
+ <<: *aci_ap_no_verify
+ state: absent
+ register: delete_ap_present_no_verify_again
+
+ - name: no verification asserts
+ ansible.builtin.assert:
+ that:
+ - ap_present_no_verify_cm is changed
+ - ap_present_no_verify_cm.current_verified == false
+ - ap_present_no_verify_cm.current.0 == ap_present_no_verify_cm.proposed
+ - ap_present_no_verify is changed
+ - ap_present_no_verify.current_verified == false
+ - ap_present_no_verify.current.0 == ap_present_no_verify.proposed
+ - ap_present_no_verify.previous == []
+ - ap_present_no_verify_again is not changed
+ - ap_present_no_verify_again.current_verified == true
+ - ap_present_no_verify_again.current.0.fvAp.attributes.name == "anstest-no-verify"
+ - ap_present_no_verify_again.current.0.fvAp.attributes.descr == "Ansible Test"
+ - ap_present_no_verify_again.previous.0.fvAp.attributes.name == "anstest-no-verify"
+ - ap_present_no_verify_again.previous.0.fvAp.attributes.descr == "Ansible Test"
+ - update_ap_present_no_verify is changed
+ - update_ap_present_no_verify.current_verified == false
+ - update_ap_present_no_verify.current.0 == update_ap_present_no_verify.proposed
+ - update_ap_present_no_verify.previous.0.fvAp.attributes.name == "anstest-no-verify"
+ - update_ap_present_no_verify.previous.0.fvAp.attributes.descr == "Ansible Test"
+ - delete_ap_present_no_verify is changed
+ - delete_ap_present_no_verify.current_verified == false
+ - delete_ap_present_no_verify.current.0 == delete_ap_present_no_verify.proposed
+ - delete_ap_present_no_verify.previous.0.fvAp.attributes.name == "anstest-no-verify"
+ - delete_ap_present_no_verify.previous.0.fvAp.attributes.descr == "Ansible Test No Verify"
+ - delete_ap_present_no_verify_again is not changed
+ - delete_ap_present_no_verify_again.current_verified == true
+ - delete_ap_present_no_verify_again.current == []
+ - delete_ap_present_no_verify_again.previous == []
+ - delete_ap_present_no_verify_again.proposed == {}
+
- name: get ap - query specific ap
cisco.aci.aci_ap: &aci_ap_query
<<: *aci_ap_present
@@ -132,7 +202,7 @@
register: query_all
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- query_ap is not changed
- query_ap.current | length == 1
@@ -183,7 +253,7 @@
ap: anstest2
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- ap_delete_check_mode is changed
- ap_delete_check_mode.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd/tasks/main.yml
index 3af05fd0f..4bb951c69 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd/tasks/main.yml
@@ -1,15 +1,16 @@
# Test code for the ACI modules
# Copyright: (c) 2017, Jacob McGill (@jmcgill298)
+# Copyright: (c) 2024, Samita Bhattacharjee (@samiib) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +21,14 @@
output_level: debug
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: ensure tenant does not exists
cisco.aci.aci_tenant: &aci_tenant_absent
@@ -73,11 +74,63 @@
l3protocol: ospf
state: present
+ - name: ensure IGMP Interface Policy exists
+ cisco.aci.aci_igmp_interface_policy: &aci_igmp_policy_present
+ <<: *aci_tenant_present
+ name: ansible_igmp_pol
+ state: present
+
+ - name: ensure Monitoring Policy exists
+ cisco.aci.aci_epg_monitoring_policy: &aci_monitoring_policy_present
+ <<: *aci_tenant_present
+ name: ansible_monitoring_pol
+ state: present
+
+ - name: ensure PIM Route Map Policy exists
+ cisco.aci.aci_pim_route_map_policy: &aci_route_map_policy_present
+ <<: *aci_tenant_present
+ name: ansible_route_map_pol
+ state: present
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: ensure IGMP Snoop Policy exists
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/mo/uni/tn-ansible_test.json
+ method: post
+ content:
+ igmpSnoopPol:
+ attributes:
+ name: ansible_igmp_snoop
+
+ - name: ensure MLD Snoop Policy exists
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/mo/uni/tn-ansible_test.json
+ method: post
+ content:
+ mldSnoopPol:
+ attributes:
+ name: ansible_mld_snoop
+
+ - name: ensure FHS policy exists
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/mo/uni/tn-ansible_test.json
+ method: post
+ content:
+ fhsBDPol:
+ attributes:
+ name: ansible_fhs
+
- name: create bd - check mode works
cisco.aci.aci_bd: &aci_bd_present
<<: *aci_tenant_present
bd: anstest
description: Ansible Test
+ mld_snoop_policy: ansible_mld_snoop
+ first_hop_security_policy: ansible_fhs
+ igmp_policy: ansible_igmp_pol
check_mode: true
register: bd_present_check_mode
@@ -91,6 +144,7 @@
<<: *aci_bd_present
register: bd_present_idempotent
+ # UPDATE BD
- name: update bd - update works
cisco.aci.aci_bd:
<<: *aci_bd_present
@@ -98,6 +152,25 @@
description: Ansible Test Update
register: bd_update
+ - name: Update bd to remove child config (check_mode)
+ cisco.aci.aci_bd: &aci_bd_update
+ <<: *aci_bd_present
+ mld_snoop_policy: ""
+ first_hop_security_policy: ""
+ igmp_policy: ""
+ check_mode: true
+ register: cm_update_bd_2
+
+ - name: Update bd to remove child config (normal_mode)
+ cisco.aci.aci_bd:
+ <<: *aci_bd_update
+ register: nm_update_bd_2
+
+ - name: Update bd again to remove child config (testing idempotency)
+ cisco.aci.aci_bd:
+ <<: *aci_bd_update
+ register: nm_update_bd_2_again
+
- name: create another bd - check more params
cisco.aci.aci_bd:
<<: *aci_bd_present
@@ -115,7 +188,7 @@
register: bd_present_2
when: version.current.0.topSystem.attributes.version is version('4.2', '<')
- - name: create another bd - check more params (>v4.2)
+ - name: create another bd - check more params (>=v4.2 & <6.0)
cisco.aci.aci_bd:
<<: *aci_bd_present
bd: anstest2
@@ -126,12 +199,61 @@
l3_unknown_multicast: opt-flood
ipv6_l3_unknown_multicast: opt-flood
multi_dest: drop
- enable_routing: "no"
+ enable_routing: "yes"
arp_flooding: "yes"
route_profile_l3out: ansible_l3out
route_profile: ansible_l3out_route
+ host_based_routing: true
+ allow_intersite_bum_traffic: true
+ allow_intersite_l2_stretch: true
+ allow_ipv6_mcast: true
+ ll_addr: "fe80::1322:33ff:fe44:5566"
+ vmac: "00:AA:BB:CC:DD:03"
+ optimize_wan_bandwidth: true
+ vlan: vlan-101
+ igmp_policy: ansible_igmp_pol
+ monitoring_policy: ansible_monitoring_pol
+ igmp_snoop_policy: ansible_igmp_snoop
+ mld_snoop_policy: ansible_mld_snoop
+ first_hop_security_policy: ansible_fhs
register: bd_present_2b
- when: version.current.0.topSystem.attributes.version is version('4.2', '>=')
+ when: version.current.0.topSystem.attributes.version is version('4.2', '>=') and
+ version.current.0.topSystem.attributes.version is version('6.0', '<')
+
+ - name: create another bd - check more params (>=v6.0)
+ cisco.aci.aci_bd:
+ <<: *aci_bd_present
+ bd: anstest2
+ bd_type: ethernet
+ endpoint_move_detect: default
+ ip_learning: "no"
+ l2_unknown_unicast: flood
+ l3_unknown_multicast: opt-flood
+ ipv6_l3_unknown_multicast: opt-flood
+ multi_dest: drop
+ enable_routing: "yes"
+ arp_flooding: "yes"
+ route_profile_l3out: ansible_l3out
+ route_profile: ansible_l3out_route
+ host_based_routing: true
+ enable_rogue_except_mac: true
+ allow_intersite_bum_traffic: true
+ allow_intersite_l2_stretch: true
+ allow_ipv6_mcast: true
+ ll_addr: "fe80::1322:33ff:fe44:5566"
+ mcast_arp_drop: true
+ vmac: "00:AA:BB:CC:DD:03"
+ optimize_wan_bandwidth: true
+ vlan: vlan-101
+ igmp_policy: ansible_igmp_pol
+ monitoring_policy: ansible_monitoring_pol
+ igmp_snoop_policy: ansible_igmp_snoop
+ mld_snoop_policy: ansible_mld_snoop
+ pim_source_filter: ansible_route_map_pol
+ pim_destination_filter: ansible_route_map_pol
+ first_hop_security_policy: ansible_fhs
+ register: bd_present_2c
+ when: version.current.0.topSystem.attributes.version is version('6.0', '>=')
- name: create bd without all necessary params - failure message works
cisco.aci.aci_bd:
@@ -140,8 +262,27 @@
ignore_errors: true
register: bd_present_missing_param
+ - name: present asserts for removing children
+ ansible.builtin.assert:
+ that:
+ - cm_update_bd_2 is changed
+ - cm_update_bd_2.previous == cm_update_bd_2.current
+ - cm_update_bd_2.proposed.fvBD.children | length == 3
+ - cm_update_bd_2.proposed.fvBD.children.0.fvRsMldsn.attributes.tnMldSnoopPolName == ''
+ - cm_update_bd_2.proposed.fvBD.children.1.fvRsBDToFhs.attributes.tnFhsBDPolName == ''
+ - cm_update_bd_2.proposed.fvBD.children.2.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == ''
+ - nm_update_bd_2 is changed
+ - nm_update_bd_2.previous.0.fvBD.children.0.fvRsMldsn.attributes.tnMldSnoopPolName == 'ansible_mld_snoop'
+ - nm_update_bd_2.previous.0.fvBD.children.1.fvRsBDToFhs.attributes.tnFhsBDPolName == 'ansible_fhs'
+ - nm_update_bd_2.previous.0.fvBD.children.2.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == 'uni/tn-ansible_test/igmpIfPol-ansible_igmp_pol'
+ - nm_update_bd_2.current.0.fvBD.children.0.fvRsMldsn.attributes.tnMldSnoopPolName == ''
+ - nm_update_bd_2.current.0.fvBD.children.1.fvRsBDToFhs.attributes.tnFhsBDPolName == ''
+ - nm_update_bd_2.current.0.fvBD.children.2.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == ''
+ - nm_update_bd_2_again is not changed
+ - nm_update_bd_2_again.previous == nm_update_bd_2_again.current
+
- name: present asserts (<v4.2)
- assert:
+ ansible.builtin.assert:
that:
- bd_present_check_mode is changed
- bd_present_check_mode.sent.fvBD.attributes.descr == 'Ansible Test'
@@ -172,8 +313,8 @@
- 'bd_present_missing_param.msg == "state is present but all of the following are missing: tenant"'
when: version.current.0.topSystem.attributes.version is version('4.2', '<')
- - name: present asserts (>v4.2)
- assert:
+ - name: present asserts (>=v4.2 & <v6.0)
+ ansible.builtin.assert:
that:
- bd_present_check_mode is changed
- bd_present_check_mode.sent.fvBD.attributes.descr == 'Ansible Test'
@@ -193,16 +334,243 @@
- bd_present_2b.sent.fvBD.attributes.ipLearning == 'no'
- bd_present_2b.sent.fvBD.attributes.multiDstPktAct == 'drop'
- bd_present_2b.sent.fvBD.attributes.name == 'anstest2'
- - bd_present_2b.sent.fvBD.attributes.unicastRoute == 'no'
+ - bd_present_2b.sent.fvBD.attributes.unicastRoute == 'yes'
- bd_present_2b.sent.fvBD.attributes.unkMacUcastAct == 'flood'
- bd_present_2b.sent.fvBD.attributes.unkMcastAct == 'opt-flood'
- bd_present_2b.sent.fvBD.attributes.v6unkMcastAct == 'opt-flood'
- bd_present_2b.sent.fvBD.attributes.type == 'regular'
- - bd_present_2b.sent.fvBD.children.0.fvRsBDToProfile.attributes.tnL3extOutName == 'ansible_l3out'
- - bd_present_2b.sent.fvBD.children.0.fvRsBDToProfile.attributes.tnRtctrlProfileName == 'ansible_l3out_route'
+ - bd_present_2b.sent.fvBD.attributes.hostBasedRouting == 'yes'
+ - bd_present_2b.sent.fvBD.attributes.intersiteBumTrafficAllow == 'yes'
+ - bd_present_2b.sent.fvBD.attributes.intersiteL2Stretch == 'yes'
+ - bd_present_2b.sent.fvBD.attributes.ipv6McastAllow == 'yes'
+ - bd_present_2b.sent.fvBD.attributes.llAddr == 'fe80::1322:33ff:fe44:5566'
+ - bd_present_2b.sent.fvBD.attributes.vmac == '00:AA:BB:CC:DD:03'
+ - bd_present_2b.sent.fvBD.attributes.OptimizeWanBandwidth == 'yes'
+ - bd_present_2b.sent.fvBD.children.0.fvRsIgmpsn.attributes.tnIgmpSnoopPolName == 'ansible_igmp_snoop'
+ - bd_present_2b.sent.fvBD.children.1.fvRsMldsn.attributes.tnMldSnoopPolName == 'ansible_mld_snoop'
+ - bd_present_2b.sent.fvBD.children.2.fvRsBDToProfile.attributes.tnL3extOutName == 'ansible_l3out'
+ - bd_present_2b.sent.fvBD.children.2.fvRsBDToProfile.attributes.tnRtctrlProfileName == 'ansible_l3out_route'
+ - bd_present_2b.sent.fvBD.children.3.fvRsBDToFhs.attributes.tnFhsBDPolName == 'ansible_fhs'
+ - bd_present_2b.sent.fvBD.children.4.fvAccP.attributes.encap == 'vlan-101'
+ - bd_present_2b.sent.fvBD.children.5.fvRsABDPolMonPol.attributes.tnMonEPGPolName == 'ansible_monitoring_pol'
+ - bd_present_2b.sent.fvBD.children.6.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == 'uni/tn-ansible_test/igmpIfPol-ansible_igmp_pol'
- bd_present_missing_param is failed
- 'bd_present_missing_param.msg == "state is present but all of the following are missing: tenant"'
- when: version.current.0.topSystem.attributes.version is version('4.2', '>=')
+ when: version.current.0.topSystem.attributes.version is version('4.2', '>=') and
+ version.current.0.topSystem.attributes.version is version('6.0', '<')
+
+ - name: present asserts (>=v6.0)
+ ansible.builtin.assert:
+ that:
+ - bd_present_check_mode is changed
+ - bd_present_check_mode.sent.fvBD.attributes.descr == 'Ansible Test'
+ - bd_present_check_mode.sent.fvBD.attributes.name == 'anstest'
+ - bd_present is changed
+ - bd_present.sent == bd_present_check_mode.sent
+ - bd_present.previous == []
+ - bd_present_idempotent is not changed
+ - bd_present_idempotent.previous != []
+ - bd_update is changed
+ - bd_update.previous != []
+ - bd_update.sent != bd_update.proposed
+ - bd_update.sent.fvBD.attributes.descr == 'Ansible Test Update'
+ - bd_update.sent.fvBD.children.0.fvRsCtx.attributes.tnFvCtxName == 'anstest'
+ - bd_present_2c.sent.fvBD.attributes.arpFlood == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.descr == 'Ansible Test'
+ - bd_present_2c.sent.fvBD.attributes.ipLearning == 'no'
+ - bd_present_2c.sent.fvBD.attributes.multiDstPktAct == 'drop'
+ - bd_present_2c.sent.fvBD.attributes.name == 'anstest2'
+ - bd_present_2c.sent.fvBD.attributes.unicastRoute == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.unkMacUcastAct == 'flood'
+ - bd_present_2c.sent.fvBD.attributes.unkMcastAct == 'opt-flood'
+ - bd_present_2c.sent.fvBD.attributes.v6unkMcastAct == 'opt-flood'
+ - bd_present_2c.sent.fvBD.attributes.type == 'regular'
+ - bd_present_2c.sent.fvBD.attributes.hostBasedRouting == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.intersiteBumTrafficAllow == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.intersiteL2Stretch == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.ipv6McastAllow == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.llAddr == 'fe80::1322:33ff:fe44:5566'
+ - bd_present_2c.sent.fvBD.attributes.mcastARPDrop == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.enableRogueExceptMac == 'yes'
+ - bd_present_2c.sent.fvBD.attributes.vmac == '00:AA:BB:CC:DD:03'
+ - bd_present_2c.sent.fvBD.attributes.OptimizeWanBandwidth == 'yes'
+ - bd_present_2c.sent.fvBD.children.0.fvRsIgmpsn.attributes.tnIgmpSnoopPolName == 'ansible_igmp_snoop'
+ - bd_present_2c.sent.fvBD.children.1.fvRsMldsn.attributes.tnMldSnoopPolName == 'ansible_mld_snoop'
+ - bd_present_2c.sent.fvBD.children.2.fvRsBDToProfile.attributes.tnRtctrlProfileName == 'ansible_l3out_route'
+ - bd_present_2c.sent.fvBD.children.2.fvRsBDToProfile.attributes.tnL3extOutName == 'ansible_l3out'
+ - bd_present_2c.sent.fvBD.children.3.fvRsBDToFhs.attributes.tnFhsBDPolName == 'ansible_fhs'
+ - bd_present_2c.sent.fvBD.children.4.fvAccP.attributes.encap == 'vlan-101'
+ - bd_present_2c.sent.fvBD.children.5.fvRsABDPolMonPol.attributes.tnMonEPGPolName == 'ansible_monitoring_pol'
+ - bd_present_2c.sent.fvBD.children.6.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == 'uni/tn-ansible_test/igmpIfPol-ansible_igmp_pol'
+ - bd_present_2c.sent.fvBD.children.7.pimBDP.children.0.pimBDFilterPol.children.0.pimBDSrcFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - bd_present_2c.sent.fvBD.children.7.pimBDP.children.0.pimBDFilterPol.children.1.pimBDDestFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - bd_present_missing_param is failed
+ - 'bd_present_missing_param.msg == "state is present but all of the following are missing: tenant"'
+ when: version.current.0.topSystem.attributes.version is version('6.0', '>=')
+
+ - name: execute tasks for pim source filter & pim destination filter (>=v5.2)
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+ block:
+
+ - name: create another bd - check pim source filter (check_mode)
+ cisco.aci.aci_bd: &aci_bd_pim_s
+ <<: *aci_bd_present
+ bd: anstest_pim_s
+ pim_source_filter: ansible_route_map_pol
+ check_mode: true
+ register: cm_bd_pim_s
+
+ - name: create another bd - check pim source filter (normal_mode)
+ cisco.aci.aci_bd:
+ <<: *aci_bd_pim_s
+ register: nm_bd_pim_s
+
+ - name: create another bd - check pim source filter (testing idempotency)
+ cisco.aci.aci_bd:
+ <<: *aci_bd_pim_s
+ register: nm_bd_pim_s_again
+
+ - name: update bd - remove pim source filter
+ cisco.aci.aci_bd:
+ <<: *aci_bd_pim_s
+ pim_source_filter: ""
+ register: nm_bd_pim_s_remove
+
+ - name: create another bd - check pim destination filter (check_mode)
+ cisco.aci.aci_bd: &aci_bd_pim_d
+ <<: *aci_bd_present
+ bd: anstest_pim_d
+ pim_destination_filter: ansible_route_map_pol
+ check_mode: true
+ register: cm_bd_pim_d
+
+ - name: create another bd - check pim destination filter (normal_mode)
+ cisco.aci.aci_bd:
+ <<: *aci_bd_pim_d
+ register: nm_bd_pim_d
+
+ - name: create another bd - check pim destination filter (testing idempotency)
+ cisco.aci.aci_bd:
+ <<: *aci_bd_pim_d
+ register: nm_bd_pim_d_again
+
+ - name: update bd - remove pim destination filter
+ cisco.aci.aci_bd:
+ <<: *aci_bd_pim_d
+ pim_destination_filter: ""
+ register: nm_bd_pim_d_remove
+
+ - name: cleanup pim_s and pim_d BDs
+ cisco.aci.aci_bd:
+ <<: *aci_bd_present
+ bd: "{{ item }}"
+ state: absent
+ loop:
+ - anstest_pim_s
+ - anstest_pim_d
+
+ - name: asserts for pim source filter and pim destination filter
+ ansible.builtin.assert:
+ that:
+ - cm_bd_pim_s is changed
+ - cm_bd_pim_s.current == []
+ - cm_bd_pim_s.previous == []
+ - cm_bd_pim_s.proposed.fvBD.children.3.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - cm_bd_pim_s.proposed.fvBD.children.3.pimBDP.children.0.pimBDFilterPol.children.0.pimBDSrcFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_s is changed
+ - nm_bd_pim_s.previous == []
+ - nm_bd_pim_s.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - nm_bd_pim_s.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDSrcFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_s_again.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - nm_bd_pim_s_again.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDSrcFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_s_again.previous.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - nm_bd_pim_s_again.previous.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDSrcFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_s_remove.previous == nm_bd_pim_s.current
+ - nm_bd_pim_s_remove.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDSrcFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == ''
+ - cm_bd_pim_d is changed
+ - cm_bd_pim_d.current == []
+ - cm_bd_pim_d.previous == []
+ - cm_bd_pim_d.proposed.fvBD.children.3.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - cm_bd_pim_d.proposed.fvBD.children.3.pimBDP.children.0.pimBDFilterPol.children.0.pimBDDestFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_d is changed
+ - nm_bd_pim_d.previous == []
+ - nm_bd_pim_d.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - nm_bd_pim_d.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDDestFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_d_again.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - nm_bd_pim_d_again.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDDestFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_d_again.previous.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children | length == 1
+ - nm_bd_pim_d_again.previous.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDDestFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == 'uni/tn-ansible_test/rtmap-ansible_route_map_pol'
+ - nm_bd_pim_d_remove.previous == nm_bd_pim_d.current
+ - nm_bd_pim_d_remove.current.0.fvBD.children.5.pimBDP.children.0.pimBDFilterPol.children.0.pimBDDestFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == ''
+
+ # TEST NO VERIFICATION
+ - name: create bd with no verification (check mode)
+ cisco.aci.aci_bd: &aci_bd_no_verify
+ <<: *aci_bd_present
+ bd: anstest-no-verify
+ no_verification: true
+ check_mode: true
+ register: bd_present_no_verify_cm
+
+ - name: create bd with no verification
+ cisco.aci.aci_bd:
+ <<: *aci_bd_no_verify
+ register: bd_present_no_verify
+
+ - name: create bd with no verification again
+ cisco.aci.aci_bd:
+ <<: *aci_bd_no_verify
+ register: bd_present_no_verify_again
+
+ - name: update bd with no verification
+ cisco.aci.aci_bd:
+ <<: *aci_bd_no_verify
+ description: Ansible Test No Verify
+ register: update_bd_present_no_verify
+
+ - name: delete bd with no verification
+ cisco.aci.aci_bd:
+ <<: *aci_bd_no_verify
+ state: absent
+ register: delete_bd_present_no_verify
+
+ - name: delete bd with no verification again
+ cisco.aci.aci_bd:
+ <<: *aci_bd_no_verify
+ state: absent
+ register: delete_bd_present_no_verify_again
+
+ - name: no verification asserts
+ ansible.builtin.assert:
+ that:
+ - bd_present_no_verify_cm is changed
+ - bd_present_no_verify_cm.current_verified == false
+ - bd_present_no_verify_cm.current.0 == bd_present_no_verify_cm.proposed
+ - bd_present_no_verify is changed
+ - bd_present_no_verify.current_verified == false
+ - bd_present_no_verify.current.0 == bd_present_no_verify.proposed
+ - bd_present_no_verify.previous == []
+ - bd_present_no_verify_again is not changed
+ - bd_present_no_verify_again.current_verified == true
+ - bd_present_no_verify_again.current.0.fvBD.attributes.name == "anstest-no-verify"
+ - bd_present_no_verify_again.current.0.fvBD.attributes.descr == "Ansible Test"
+ - bd_present_no_verify_again.previous.0.fvBD.attributes.name == "anstest-no-verify"
+ - bd_present_no_verify_again.previous.0.fvBD.attributes.descr == "Ansible Test"
+ - update_bd_present_no_verify is changed
+ - update_bd_present_no_verify.current_verified == false
+ - update_bd_present_no_verify.current.0 == update_bd_present_no_verify.proposed
+ - update_bd_present_no_verify.previous.0.fvBD.attributes.name == "anstest-no-verify"
+ - update_bd_present_no_verify.previous.0.fvBD.attributes.descr == "Ansible Test"
+ - delete_bd_present_no_verify is changed
+ - delete_bd_present_no_verify.current_verified == false
+ - delete_bd_present_no_verify.current.0 == delete_bd_present_no_verify.proposed
+ - delete_bd_present_no_verify.previous.0.fvBD.attributes.name == "anstest-no-verify"
+ - delete_bd_present_no_verify.previous.0.fvBD.attributes.descr == "Ansible Test No Verify"
+ - delete_bd_present_no_verify_again is not changed
+ - delete_bd_present_no_verify_again.current_verified == true
+ - delete_bd_present_no_verify_again.current == []
+ - delete_bd_present_no_verify_again.previous == []
+ - delete_bd_present_no_verify_again.proposed == {}
- name: get all bd
cisco.aci.aci_bd: &aci_query
@@ -230,27 +598,27 @@
register: query_bd
- name: query asserts
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length > 1
- query_all.current.0.fvBD is defined
- - '"rsp-subtree-class=fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn" in query_all.filter_string'
+ - '"rsp-subtree-class=fvAccP,fvRsABDPolMonPol,fvRsBDToFhs,fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn,fvRsMldsn,igmpIfP,igmpRsIfPol" in query_all.filter_string'
- '"class/fvBD.json" in query_all.url'
- query_tenant is not changed
- query_tenant.current | length == 1
- query_tenant.current.0.fvTenant.children | length == 2
- - '"rsp-subtree-class=fvBD,fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn" in query_tenant.filter_string'
+ - '"rsp-subtree-class=fvAccP,fvBD,fvRsABDPolMonPol,fvRsBDToFhs,fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn,fvRsMldsn,igmpIfP,igmpRsIfPol" in query_tenant.filter_string'
- '"tn-ansible_test.json" in query_tenant.url'
- query_bd_bd is not changed
- query_bd_bd.current != []
- '"query-target-filter=eq(fvBD.name,\"anstest\")" in query_bd_bd.filter_string'
- - '"rsp-subtree-class=fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn" in query_bd_bd.filter_string'
+ - '"rsp-subtree-class=fvAccP,fvRsABDPolMonPol,fvRsBDToFhs,fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn,fvRsMldsn,igmpIfP,igmpRsIfPol" in query_bd_bd.filter_string'
- '"class/fvBD.json" in query_bd_bd.url'
- query_bd is not changed
- query_bd.current | length == 1
- query_bd.current.0.fvBD.attributes.name == "anstest"
- - '"rsp-subtree-class=fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn" in query_bd.filter_string'
+ - '"rsp-subtree-class=fvAccP,fvRsABDPolMonPol,fvRsBDToFhs,fvRsBDToNdP,fvRsBDToProfile,fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn,fvRsMldsn,igmpIfP,igmpRsIfPol" in query_bd.filter_string'
- '"tn-ansible_test/BD-anstest.json" in query_bd.url'
- name: delete bd - check mode works
@@ -283,7 +651,7 @@
register: bd_absent_missing_param
- name: asserts for deletion task
- assert:
+ ansible.builtin.assert:
that:
- bd_absent_check_mode is changed
- bd_absent_check_mode.proposed == {}
@@ -294,6 +662,40 @@
- bd_absent_missing_param is failed
- 'bd_absent_missing_param.msg == "state is absent but all of the following are missing: bd"'
+ - name: delete FHS - cleanup before ending tests
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/mo/uni/tn-ansible_test/bdpol-ansible_fhs.json
+ method: delete
+
+ - name: delete IGMP Snoop Policy - cleanup before ending tests
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/mo/uni/tn-ansible_test/snPol-ansible_igmp_snoop.json
+ method: delete
+
+ - name: delete MLD Snoop Policy - cleanup before ending tests
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/mo/uni/tn-ansible_test/mldsnoopPol-ansible_mld_snoop.json
+ method: delete
+
+ - name: delete IGMP Interface Policy - cleanup before ending tests
+ cisco.aci.aci_igmp_interface_policy:
+ <<: *aci_igmp_policy_present
+ state: absent
+
+ - name: delete Monitoring Policy - cleanup before ending tests
+ cisco.aci.aci_epg_monitoring_policy:
+ <<: *aci_monitoring_policy_present
+ state: absent
+
+ - name: delete PIM Route Map Policy - cleanup before ending tests
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_route_map_policy_present
+ state: absent
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
- name: delete vrf - cleanup before ending tests
cisco.aci.aci_vrf:
<<: *aci_vrf_present
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_dhcp_label/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_dhcp_label/tasks/main.yml
index 937ea80a3..c7641b7b0 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_dhcp_label/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_dhcp_label/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: create bd - creation works
- aci_bd:
+ cisco.aci.aci_bd:
<<: *aci_info
tenant: ansible_tenant
bd: database
@@ -48,7 +48,7 @@
#CREATE LABELS
- name: Create a new DHCP Relay Label to a Bridge Domain - check mode
- aci_bd_dhcp_label:
+ cisco.aci.aci_bd_dhcp_label:
<<: *aci_info
tenant: ansible_tenant
bd: database
@@ -59,13 +59,13 @@
register: cm_dhcp_label1
- name: Verify creation of label1 in check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_dhcp_label1 is changed
- cm_dhcp_label1.sent.dhcpLbl.attributes.name == 'label1'
- name: Create a new DHCP Relay Label to a Bridge Domain - normal mode
- aci_bd_dhcp_label:
+ cisco.aci.aci_bd_dhcp_label:
<<: *aci_info
tenant: ansible_tenant
bd: database
@@ -75,7 +75,7 @@
register: nm_dhcp_label1
- name: Verify creation of label1
- assert:
+ ansible.builtin.assert:
that:
- nm_dhcp_label1 is changed
- nm_dhcp_label1.current.0.dhcpLbl.attributes.dn == 'uni/tn-ansible_tenant/BD-database/dhcplbl-label1'
@@ -83,7 +83,7 @@
- nm_dhcp_label1.current.0.dhcpLbl.attributes.annotation == 'orchestrator:ansible'
- name: Create another DHCP Relay Label to a Bridge Domain - normal mode
- aci_bd_dhcp_label:
+ cisco.aci.aci_bd_dhcp_label:
<<: *aci_info
tenant: ansible_tenant
bd: database
@@ -93,7 +93,7 @@
register: nm_dhcp_label2
- name: Verify creation of label2
- assert:
+ ansible.builtin.assert:
that:
- nm_dhcp_label2 is changed
- nm_dhcp_label2.current.0.dhcpLbl.attributes.dn == 'uni/tn-ansible_tenant/BD-database/dhcplbl-label2'
@@ -101,7 +101,7 @@
#QUERY LABELS
- name: Query a DHCP Relay Label of a Bridge Domain
- aci_bd_dhcp_label:
+ cisco.aci.aci_bd_dhcp_label:
<<: *aci_info
tenant: ansible_tenant
bd: database
@@ -111,13 +111,13 @@
register: query_dhcp_label1
- name: Verify query of label
- assert:
+ ansible.builtin.assert:
that:
- query_dhcp_label1 is not changed
- query_dhcp_label1.current.0.dhcpLbl.attributes.dn == 'uni/tn-ansible_tenant/BD-database/dhcplbl-label1'
- name: Query all DHCP Relay Labels of a Bridge Domain
- aci_bd_dhcp_label:
+ cisco.aci.aci_bd_dhcp_label:
<<: *aci_info
tenant: ansible_tenant
bd: database
@@ -125,13 +125,13 @@
register: query_all_labels
- name: Verify query all of labels
- assert:
+ ansible.builtin.assert:
that:
- query_all_labels is not changed
#REMOVE LABELS
- name: Remove a DHCP Relay Label for a Bridge Domain
- aci_bd_dhcp_label:
+ cisco.aci.aci_bd_dhcp_label:
<<: *aci_info
tenant: ansible_tenant
bd: database
@@ -141,14 +141,14 @@
register: delete_dhcp_label
- name: Verify deletion of label
- assert:
+ ansible.builtin.assert:
that:
- delete_dhcp_label is changed
- delete_dhcp_label.current == []
# CLEAN ENVIRONMENT AGAIN
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/tasks/main.yml
new file mode 100644
index 000000000..7aebbb44d
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_rogue_exception_mac/tasks/main.yml
@@ -0,0 +1,186 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ state: absent
+ tenant: ansible_test
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites and APIC version >= 5.2
+ when: query_cloud.current == [] and version.current.0.topSystem.attributes.version is version('5.2', '>=')
+ block:
+ - name: Create tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_tenant_absent
+ state: present
+ register: tenant_present
+
+ - name: Ensure bd exists for tests to kick off
+ cisco.aci.aci_bd: &aci_bd_present
+ <<: *aci_tenant_present
+ bd: anstest
+ register: bd_present
+
+ - name: Ensure rogue exception mac does not exist for tests to kick off
+ cisco.aci.aci_bd_rogue_exception_mac: &aci_rogue_exception_mac_absent
+ <<: *aci_bd_present
+ state: absent
+ mac: "AA:BB:CC:DD:EE:11"
+ description: 1st MAC
+
+ - name: Ensure second rogue exception mac does not exist for tests to kick off
+ cisco.aci.aci_bd_rogue_exception_mac: &aci_rogue_exception_mac_absent_2
+ <<: *aci_rogue_exception_mac_absent
+ mac: "AA-BB-CC-DD-EE-22"
+ description: 2nd MAC
+
+
+ - name: Create first rogue exception mac in bd (check_mode)
+ cisco.aci.aci_bd_rogue_exception_mac: &aci_bd_rogue_exception_mac_present
+ <<: *aci_rogue_exception_mac_absent
+ state: present
+ check_mode: true
+ register: cm_bd_rogue_exception_mac
+
+ - name: Create first rogue exception mac in bd (normal_mode)
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_bd_rogue_exception_mac_present
+ register: nm_bd_rogue_exception_mac
+
+ - name: Create first rogue exception mac in bd again - testing idempotency
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_bd_rogue_exception_mac_present
+ register: bd_rogue_exception_mac_idempotency
+
+ - name: Create second rogue exception mac in bd
+ cisco.aci.aci_bd_rogue_exception_mac: &aci_bd_rogue_exception_mac_present_2
+ <<: *aci_rogue_exception_mac_absent_2
+ state: present
+ register: nm_bd_rogue_exception_mac_2
+
+ - name: Asserts for creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_bd_rogue_exception_mac is changed
+ - cm_bd_rogue_exception_mac.previous == []
+ - cm_bd_rogue_exception_mac.current == []
+ - cm_bd_rogue_exception_mac.proposed.fvRogueExceptionMac.attributes.dn == "uni/tn-ansible_test/BD-anstest/rgexpmac-AA:BB:CC:DD:EE:11"
+ - cm_bd_rogue_exception_mac.proposed.fvRogueExceptionMac.attributes.mac == "AA:BB:CC:DD:EE:11"
+ - cm_bd_rogue_exception_mac.proposed.fvRogueExceptionMac.attributes.descr == "1st MAC"
+ - nm_bd_rogue_exception_mac is changed
+ - nm_bd_rogue_exception_mac.current.0.fvRogueExceptionMac.attributes.dn == "uni/tn-ansible_test/BD-anstest/rgexpmac-AA:BB:CC:DD:EE:11"
+ - nm_bd_rogue_exception_mac.current.0.fvRogueExceptionMac.attributes.mac == "AA:BB:CC:DD:EE:11"
+ - nm_bd_rogue_exception_mac.current.0.fvRogueExceptionMac.attributes.descr == "1st MAC"
+ - bd_rogue_exception_mac_idempotency is not changed
+ - bd_rogue_exception_mac_idempotency.current == bd_rogue_exception_mac_idempotency.previous
+ - bd_rogue_exception_mac_idempotency.sent == {}
+ - nm_bd_rogue_exception_mac_2 is changed
+ - nm_bd_rogue_exception_mac_2.current.0.fvRogueExceptionMac.attributes.dn == "uni/tn-ansible_test/BD-anstest/rgexpmac-AA:BB:CC:DD:EE:22"
+ - nm_bd_rogue_exception_mac_2.current.0.fvRogueExceptionMac.attributes.mac == "AA:BB:CC:DD:EE:22"
+ - nm_bd_rogue_exception_mac_2.current.0.fvRogueExceptionMac.attributes.descr == "2nd MAC"
+
+ - name: Query all bds bound to rogue exception mac
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_tenant_present
+ state: query
+ output_level: debug
+ register: query_all_bd_to_rogue_exception_mac
+
+ - name: Query first bd with first rogue exception mac
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_bd_rogue_exception_mac_present
+ state: query
+ output_level: debug
+ register: query_first_bd_to_rogue_exception_mac
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_bd_to_rogue_exception_mac is not changed
+ - '"fvRogueExceptionMac" in query_all_bd_to_rogue_exception_mac.filter_string'
+ - query_all_bd_to_rogue_exception_mac.current.0.fvTenant.children.0.fvBD.children | length == 2
+ - query_all_bd_to_rogue_exception_mac.current.0.fvTenant.children.0.fvBD.attributes.name == "anstest"
+ - query_all_bd_to_rogue_exception_mac.current.0.fvTenant.children.0.fvBD.children.0.fvRogueExceptionMac.attributes.rn == "rgexpmac-AA:BB:CC:DD:EE:22"
+ - query_all_bd_to_rogue_exception_mac.current.0.fvTenant.children.0.fvBD.children.1.fvRogueExceptionMac.attributes.rn == "rgexpmac-AA:BB:CC:DD:EE:11"
+ - query_first_bd_to_rogue_exception_mac is not changed
+ - '"tn-ansible_test/BD-anstest/rgexpmac-AA:BB:CC:DD:EE:11.json" in query_first_bd_to_rogue_exception_mac.url'
+
+ - name: Delete first rogue exception mac (check_mode)
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_bd_rogue_exception_mac_present
+ state: absent
+ check_mode: true
+ register: cm_unbind_bd_to_rogue_exception_mac
+
+ - name: Delete first rogue exception mac (normal_mode)
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_bd_rogue_exception_mac_present
+ state: absent
+ register: nm_unbind_bd_to_rogue_exception_mac
+
+ - name: Delete first rogue exception mac again - testing idempotency
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_bd_rogue_exception_mac_present
+ state: absent
+ register: unbind_bd_to_rogue_exception_mac_idempotency
+
+ - name: Delete second rogue exception mac
+ cisco.aci.aci_bd_rogue_exception_mac:
+ <<: *aci_bd_rogue_exception_mac_present_2
+ state: absent
+ register: nm_unbind_bd_to_rogue_exception_mac_2
+
+ - name: Asserts for deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_unbind_bd_to_rogue_exception_mac is changed
+ - cm_unbind_bd_to_rogue_exception_mac.current == cm_unbind_bd_to_rogue_exception_mac.previous
+ - cm_unbind_bd_to_rogue_exception_mac.proposed == {}
+ - nm_unbind_bd_to_rogue_exception_mac is changed
+ - nm_unbind_bd_to_rogue_exception_mac.previous != []
+ - nm_unbind_bd_to_rogue_exception_mac.proposed == {}
+ - nm_unbind_bd_to_rogue_exception_mac.current == []
+ - nm_unbind_bd_to_rogue_exception_mac.previous == cm_unbind_bd_to_rogue_exception_mac.current
+ - unbind_bd_to_rogue_exception_mac_idempotency is not changed
+ - unbind_bd_to_rogue_exception_mac_idempotency.previous == []
+ - unbind_bd_to_rogue_exception_mac_idempotency.current == []
+ - unbind_bd_to_rogue_exception_mac_idempotency.previous == []
+ - nm_unbind_bd_to_rogue_exception_mac_2 is changed
+ - nm_unbind_bd_to_rogue_exception_mac_2.previous != []
+ - nm_unbind_bd_to_rogue_exception_mac_2.current == []
+
+ - name: Delete tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
+ when: tenant_present is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_subnet/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_subnet/tasks/main.yml
index 4bc8e26c4..8d05b2e16 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_subnet/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -27,7 +27,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -128,7 +128,7 @@
ignore_errors: true
- name: assert for subnet creation tasks
- assert:
+ ansible.builtin.assert:
that:
- create_check_mode is changed
- create_check_mode.sent.fvSubnet.attributes.descr == create_subnet.sent.fvSubnet.attributes.descr == 'Ansible Test'
@@ -150,7 +150,7 @@
- 'create_incomplete_data.msg == "state is present but all of the following are missing: bd"'
- name: assert for subnet for task with version < 5
- assert:
+ ansible.builtin.assert:
that:
- create_subnet2 is changed
- create_subnet2.sent == create_subnet2.proposed
@@ -160,7 +160,7 @@
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: assert for subnet ip_data_learning for task with version >=5
- assert:
+ ansible.builtin.assert:
that:
- create_subnet.current.0.fvSubnet.attributes.ipDPLearning == 'enabled'
- create_subnet2_5 is changed
@@ -225,7 +225,7 @@
register: get_subnets_gateway
- name: asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- get_all is not changed
- get_all.current | length > 1
@@ -268,7 +268,7 @@
register: error_mask_ipv6
- name: asserts for mask error handling
- assert:
+ ansible.builtin.assert:
that:
- error_mask_ipv4.msg == "Valid Subnet Masks are 0 to 32 for IPv4 Addresses"
- error_mask_ipv6.msg == "Valid Subnet Masks are 0 to 128 for IPv6 Addresses"
@@ -294,7 +294,7 @@
register: delete_idempotency
- name: asserts for deletion task
- assert:
+ ansible.builtin.assert:
that:
- delete_check_mode is changed
- delete_check_mode.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_l3out/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_l3out/tasks/main.yml
index 7d1313fb2..94e7b6db4 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_l3out/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_l3out/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -27,7 +27,7 @@
tenant: ansible_test
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -104,7 +104,7 @@
register: nm_bd_to_l3out_2
- name: asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_bd_to_l3out is changed
- cm_bd_to_l3out.previous == []
@@ -130,7 +130,7 @@
register: query_first_bd_to_l3out
- name: asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_bd_to_l3out is not changed
- '"fvRsBDToOut" in query_all_bd_to_l3out.filter_string'
@@ -168,7 +168,7 @@
register: nm_unbind_bd_to_l3out_2
- name: asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_unbind_bd_to_l3out is changed
- cm_unbind_bd_to_l3out.proposed == {}
@@ -186,11 +186,21 @@
<<: *aci_bd_present
state: absent
+ - name: delete bd_2 - cleanup before ending tests
+ cisco.aci.aci_bd:
+ <<: *aci_bd_present_2
+ state: absent
+
- name: delete l3out - cleanup before ending tests
cisco.aci.aci_l3out:
<<: *aci_l3_out_present
state: absent
+ - name: delete l3out_2 - cleanup before ending tests
+ cisco.aci.aci_l3out:
+ <<: *aci_l3_out_present_2
+ state: absent
+
- name: delete vrf - cleanup before ending tests
cisco.aci.aci_vrf:
<<: *aci_vrf_present
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/tasks/main.yml
new file mode 100644
index 000000000..9a7a44d16
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bd_to_netflow_monitor_policy/tasks/main.yml
@@ -0,0 +1,191 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ state: absent
+ tenant: ansible_test
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Create tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_tenant_absent
+ state: present
+
+ - name: Create first netflow monitor policy
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_tenant_absent
+ netflow_monitor_policy: ansible_netflow_monitor_policy
+ state: present
+
+ - name: Create second netflow monitor policy
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_tenant_absent
+ netflow_monitor_policy: ansible_netflow_monitor_policy_2
+ state: present
+
+ - name: Create first bd
+ cisco.aci.aci_bd: &aci_bd_present
+ <<: *aci_tenant_present
+ bd: anstest
+
+ - name: Create second bd
+ cisco.aci.aci_bd: &aci_bd_present_2
+ <<: *aci_tenant_present
+ bd: anstest_2
+
+ - name: Ensure first binding bd to netflow monitor policy does not exist
+ cisco.aci.aci_bd_to_netflow_monitor_policy: &aci_bd_to_netflow_monitor_policy_absent
+ <<: *aci_bd_present
+ netflow_monitor_policy: ansible_netflow_monitor_policy
+ filter_type: ipv4
+ state: absent
+
+ - name: Ensure second binding bd to netflow monitor policy does not exist
+ cisco.aci.aci_bd_to_netflow_monitor_policy: &aci_bd_to_netflow_monitor_policy_absent_2
+ <<: *aci_bd_present_2
+ netflow_monitor_policy: ansible_netflow_monitor_policy_2
+ filter_type: ipv6
+ state: absent
+
+ - name: Bind bd to netflow monitor policy - first binding (check_mode)
+ cisco.aci.aci_bd_to_netflow_monitor_policy: &aci_bd_to_netflow_monitor_policy_present
+ <<: *aci_bd_to_netflow_monitor_policy_absent
+ state: present
+ check_mode: true
+ register: cm_bd_to_netflow_monitor_policy
+
+ - name: Bind bd to netflow monitor policy - first binding (normal_mode)
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_bd_to_netflow_monitor_policy_present
+ register: nm_bd_to_netflow_monitor_policy
+
+ - name: Bind bd to netflow monitor policy again - testing idempotency
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_bd_to_netflow_monitor_policy_present
+ register: bd_to_netflow_monitor_policy_idempotency
+
+ - name: Bind bd to netflow monitor policy again - second binding
+ cisco.aci.aci_bd_to_netflow_monitor_policy: &aci_bd_to_netflow_monitor_policy_present_2
+ <<: *aci_bd_to_netflow_monitor_policy_absent_2
+ state: present
+ register: nm_bd_to_netflow_monitor_policy_2
+
+ - name: Asserts for creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_bd_to_netflow_monitor_policy is changed
+ - cm_bd_to_netflow_monitor_policy.previous == []
+ - cm_bd_to_netflow_monitor_policy.current == []
+ - cm_bd_to_netflow_monitor_policy.proposed.fvRsBDToNetflowMonitorPol.attributes.dn == "uni/tn-ansible_test/BD-anstest/rsBDToNetflowMonitorPol-[ansible_netflow_monitor_policy]-ipv4"
+ - cm_bd_to_netflow_monitor_policy.proposed.fvRsBDToNetflowMonitorPol.attributes.tnNetflowMonitorPolName == "ansible_netflow_monitor_policy"
+ - nm_bd_to_netflow_monitor_policy is changed
+ - nm_bd_to_netflow_monitor_policy.current.0.fvRsBDToNetflowMonitorPol.attributes.dn == "uni/tn-ansible_test/BD-anstest/rsBDToNetflowMonitorPol-[ansible_netflow_monitor_policy]-ipv4"
+ - nm_bd_to_netflow_monitor_policy.current.0.fvRsBDToNetflowMonitorPol.attributes.tnNetflowMonitorPolName == "ansible_netflow_monitor_policy"
+ - bd_to_netflow_monitor_policy_idempotency is not changed
+ - bd_to_netflow_monitor_policy_idempotency.current == bd_to_netflow_monitor_policy_idempotency.previous
+ - bd_to_netflow_monitor_policy_idempotency.sent == {}
+ - nm_bd_to_netflow_monitor_policy_2 is changed
+ - nm_bd_to_netflow_monitor_policy_2.current.0.fvRsBDToNetflowMonitorPol.attributes.dn == "uni/tn-ansible_test/BD-anstest_2/rsBDToNetflowMonitorPol-[ansible_netflow_monitor_policy_2]-ipv6"
+ - nm_bd_to_netflow_monitor_policy_2.current.0.fvRsBDToNetflowMonitorPol.attributes.tnNetflowMonitorPolName == "ansible_netflow_monitor_policy_2"
+
+ - name: Query all bds bound to netflow monitor policies
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_tenant_present
+ state: query
+ output_level: debug
+ register: query_all_bd_to_netflow_monitor_policy
+
+ - name: Query first bd bound to first netflow monitor policy
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_bd_to_netflow_monitor_policy_present
+ state: query
+ output_level: debug
+ register: query_first_bd_to_netflow_monitor_policy
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_bd_to_netflow_monitor_policy is not changed
+ - '"fvRsBDToNetflowMonitorPol" in query_all_bd_to_netflow_monitor_policy.filter_string'
+ - query_all_bd_to_netflow_monitor_policy.current.0.fvTenant.children | length >= 2
+ - query_all_bd_to_netflow_monitor_policy.current.0.fvTenant.children.0.fvBD.attributes.name == "anstest_2"
+ - query_all_bd_to_netflow_monitor_policy.current.0.fvTenant.children.0.fvBD.children.0.fvRsBDToNetflowMonitorPol.attributes.tRn == "monitorpol-ansible_netflow_monitor_policy_2"
+ - query_all_bd_to_netflow_monitor_policy.current.0.fvTenant.children.1.fvBD.attributes.name == "anstest"
+ - query_all_bd_to_netflow_monitor_policy.current.0.fvTenant.children.1.fvBD.children.0.fvRsBDToNetflowMonitorPol.attributes.tRn == "monitorpol-ansible_netflow_monitor_policy"
+ - query_first_bd_to_netflow_monitor_policy is not changed
+ - '"tn-ansible_test/BD-anstest/rsBDToNetflowMonitorPol-[ansible_netflow_monitor_policy]-ipv4.json" in query_first_bd_to_netflow_monitor_policy.url'
+
+ - name: Unbind bd to netflow monitor policy - first binding (check_mode)
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_bd_to_netflow_monitor_policy_present
+ state: absent
+ check_mode: true
+ register: cm_unbind_bd_to_netflow_monitor_policy
+
+ - name: Unbind bd to netflow_monitor_policy - first binding (normal_mode)
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_bd_to_netflow_monitor_policy_present
+ state: absent
+ register: nm_unbind_bd_to_netflow_monitor_policy
+
+ - name: Unbind bd to netflow_monitor_policy again - testing idempotency
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_bd_to_netflow_monitor_policy_present
+ state: absent
+ register: unbind_bd_to_netflow_monitor_policy_idempotency
+
+ - name: Unbind bd to netflow_monitor_policy - second binding
+ cisco.aci.aci_bd_to_netflow_monitor_policy:
+ <<: *aci_bd_to_netflow_monitor_policy_present_2
+ state: absent
+ register: nm_unbind_bd_to_netflow_monitor_policy_2
+
+ - name: Asserts for deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_unbind_bd_to_netflow_monitor_policy is changed
+ - cm_unbind_bd_to_netflow_monitor_policy.current == cm_unbind_bd_to_netflow_monitor_policy.previous
+ - cm_unbind_bd_to_netflow_monitor_policy.proposed == {}
+ - nm_unbind_bd_to_netflow_monitor_policy is changed
+ - nm_unbind_bd_to_netflow_monitor_policy.previous != []
+ - nm_unbind_bd_to_netflow_monitor_policy.proposed == {}
+ - nm_unbind_bd_to_netflow_monitor_policy.current == []
+ - nm_unbind_bd_to_netflow_monitor_policy.previous == cm_unbind_bd_to_netflow_monitor_policy.current
+ - unbind_bd_to_netflow_monitor_policy_idempotency is not changed
+ - unbind_bd_to_netflow_monitor_policy_idempotency.proposed == {}
+ - unbind_bd_to_netflow_monitor_policy_idempotency.current == []
+ - unbind_bd_to_netflow_monitor_policy_idempotency.previous == []
+ - nm_unbind_bd_to_netflow_monitor_policy_2 is changed
+ - nm_unbind_bd_to_netflow_monitor_policy_2.previous != []
+ - nm_unbind_bd_to_netflow_monitor_policy_2.current == []
+
+ - name: Delete tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/tasks/main.yml
new file mode 100644
index 000000000..99f853680
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bfd_multihop_node_policy/tasks/main.yml
@@ -0,0 +1,245 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Anvitha Jain (@anvjain)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Execute tasks only for non-cloud sites
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=') # This condition will execute only when APIC version >= 5.2
+ block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_tenant
+ aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+ - name: Add a new tenant
+ aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # CREATE BFD Multihop Node policy
+ - name: Add a new BFD Multihop Node policy - check mode
+ cisco.aci.aci_bfd_multihop_node_policy: &add_bfd_multihop_node_pol
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_node_policy
+ description: Ansible BFD Multihop Node Policy
+ state: present
+ check_mode: true
+ register: cm_add_bfd_multihop_node_pol
+
+ - name: Add a new BFD Multihop Node policy - normal mode
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *add_bfd_multihop_node_pol
+ state: present
+ register: nm_add_bfd_multihop_node_pol
+
+ - name: Verify BFD Multihop Node Policy creation
+ assert:
+ that:
+ - cm_add_bfd_multihop_node_pol is changed
+ - nm_add_bfd_multihop_node_pol is changed
+ - cm_add_bfd_multihop_node_pol.previous == nm_add_bfd_multihop_node_pol.previous == []
+ - cm_add_bfd_multihop_node_pol.proposed.bfdMhNodePol.attributes.dn == nm_add_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.dn == "uni/tn-ansible_tenant/bfdMhNodePol-ansible_bfd_multihop_node_policy"
+ - cm_add_bfd_multihop_node_pol.proposed.bfdMhNodePol.attributes.name == nm_add_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.name == "ansible_bfd_multihop_node_policy"
+ - cm_add_bfd_multihop_node_pol.proposed.bfdMhNodePol.attributes.descr == nm_add_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.descr == "Ansible BFD Multihop Node Policy"
+
+ - name: Add a new BFD Multihop Node policy again - idempotency
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *add_bfd_multihop_node_pol
+ state: present
+ register: add_bfd_multihop_node_pol_again
+
+ - name: Verify BFD Multihop Node Policy creation again - idempotency
+ assert:
+ that:
+ - add_bfd_multihop_node_pol_again is not changed
+ - add_bfd_multihop_node_pol_again.previous != []
+ - add_bfd_multihop_node_pol_again.current | length == 1
+ - add_bfd_multihop_node_pol_again.previous | length == 1
+
+ - name: Modify a BFD Multihop Node policy
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *add_bfd_multihop_node_pol
+ admin_state: disabled
+ detection_multiplier: 5
+ min_transmit_interval: 270
+ min_receive_interval: 500
+ state: present
+ register: update_bfd_multihop_node_pol
+
+ - name: Verify modifying BFD Multihop Node Policy
+ assert:
+ that:
+ - update_bfd_multihop_node_pol is changed
+ - update_bfd_multihop_node_pol.previous != update_bfd_multihop_node_pol.current
+ - update_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.dn == "uni/tn-ansible_tenant/bfdMhNodePol-ansible_bfd_multihop_node_policy"
+ - update_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.name == "ansible_bfd_multihop_node_policy"
+ - update_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.descr == "Ansible BFD Multihop Node Policy"
+ - update_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.adminSt == "disabled"
+ - update_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.detectMult == "5"
+ - update_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.minRxIntvl == "500"
+ - update_bfd_multihop_node_pol.current.0.bfdMhNodePol.attributes.minTxIntvl == "270"
+
+ # Added another BFD Multihop Node policy
+ - name: Add a new BFD Multihop Node policy - normal mode
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *add_bfd_multihop_node_pol
+ name: ansible_bfd_multihop_node_policy_2
+ state: present
+ register: add_bfd_multihop_node_pol_2
+
+ - name: Verify BFD Multihop Node Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_node_pol_2 is changed
+ - add_bfd_multihop_node_pol_2.previous == []
+ - add_bfd_multihop_node_pol_2.current.0.bfdMhNodePol.attributes.dn == "uni/tn-ansible_tenant/bfdMhNodePol-ansible_bfd_multihop_node_policy_2"
+ - add_bfd_multihop_node_pol_2.current.0.bfdMhNodePol.attributes.name == "ansible_bfd_multihop_node_policy_2"
+ - add_bfd_multihop_node_pol_2.current.0.bfdMhNodePol.attributes.descr == "Ansible BFD Multihop Node Policy"
+ - add_bfd_multihop_node_pol_2.current.0.bfdMhNodePol.attributes.adminSt == "enabled"
+ - add_bfd_multihop_node_pol_2.current.0.bfdMhNodePol.attributes.detectMult == "3"
+ - add_bfd_multihop_node_pol_2.current.0.bfdMhNodePol.attributes.minRxIntvl == "250"
+ - add_bfd_multihop_node_pol_2.current.0.bfdMhNodePol.attributes.minTxIntvl == "250"
+
+ - name: Query all BFD Multihop Node policies in a specific tenant
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: query
+ register: query_all_result
+
+ - name: Verify querying all BFD Multihop Node Policies
+ assert:
+ that:
+ - query_all_result is not changed
+ - query_all_result.current.0.fvTenant.children | length == 2
+ - query_all_result.current.0.fvTenant.children[0].bfdMhNodePol.attributes.name == "ansible_bfd_multihop_node_policy_2"
+ - query_all_result.current.0.fvTenant.children[1].bfdMhNodePol.attributes.name == "ansible_bfd_multihop_node_policy"
+
+ - name: Query 'ansible_bfd_multihop_node_policy' BFD Multihop Node policies in a specific tenant
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_node_policy
+ state: query
+ register: query_result
+
+ - name: Verify querying'ansible_bfd_multihop_node_policy BFD' Multihop Node Policy
+ assert:
+ that:
+ - query_result is not changed
+ - query_result.current.0.bfdMhNodePol.attributes.dn == "uni/tn-ansible_tenant/bfdMhNodePol-ansible_bfd_multihop_node_policy"
+ - query_result.current.0.bfdMhNodePol.attributes.name == "ansible_bfd_multihop_node_policy"
+
+ - name: Remove a BFD Multihop Node policy - check mode
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_node_policy
+ state: absent
+ check_mode: true
+ register: cm_remove_bfd_multihop_node_pol
+
+ - name: Remove a BFD Multihop Node policy - normal mode
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_node_policy
+ state: absent
+ register: nm_remove_bfd_multihop_node_pol
+
+ - name: Remove a BFD Multihop Node policy again
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_node_policy
+ state: absent
+ register: remove_bfd_multihop_node_pol_again
+
+ - name: Verify removing BFD Multihop Node Policies
+ assert:
+ that:
+ - nm_remove_bfd_multihop_node_pol is changed
+ - cm_remove_bfd_multihop_node_pol is changed
+ - cm_remove_bfd_multihop_node_pol.proposed == {}
+ - nm_remove_bfd_multihop_node_pol.previous != []
+ - remove_bfd_multihop_node_pol_again is not changed
+ - remove_bfd_multihop_node_pol_again.current == nm_remove_bfd_multihop_node_pol.current == []
+
+# Validating out of rage parameters.
+
+# Added BFD Multihop Node policy with out of the range detection_multiplier
+ - name: Add a new BFD Multihop Node policy - out of the range detection_multiplier
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *add_bfd_multihop_node_pol
+ name: ansible_bfd_multihop_node_policy_3
+ detection_multiplier: 256
+ state: present
+ ignore_errors: true
+ register: add_bfd_multihop_node_pol_3
+
+ - name: Verify BFD Multihop Node Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_node_pol_3 is not changed
+ - add_bfd_multihop_node_pol_3.msg == "The \"detection_multiplier\" must be a value between 1 and 50"
+
+# Added BFD Multihop Node policy with out of the range min_transmit_interval
+ - name: Add a new BFD Multihop Node policy - out of the range min_transmit_interval
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *add_bfd_multihop_node_pol
+ name: ansible_bfd_multihop_node_policy_3
+ min_transmit_interval: 50
+ state: present
+ ignore_errors: true
+ register: add_bfd_multihop_node_pol_3
+
+ - name: Verify BFD Multihop Node Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_node_pol_3 is not changed
+ - add_bfd_multihop_node_pol_3.msg == "The \"min_transmit_interval\" must be a value between 250 and 999"
+
+# Added BFD Multihop Node policy with out of the range min_receive_interval
+ - name: Add a new BFD Multihop Node policy - out of the range min_receive_interval
+ cisco.aci.aci_bfd_multihop_node_policy:
+ <<: *add_bfd_multihop_node_pol
+ name: ansible_bfd_multihop_node_policy_3
+ min_receive_interval: 1000
+ state: present
+ ignore_errors: true
+ register: add_bfd_multihop_node_pol_3
+
+ - name: Verify BFD Multihop Node Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_node_pol_3 is not changed
+ - add_bfd_multihop_node_pol_3.msg == "The \"min_receive_interval\" must be a value between 250 and 999"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/tasks/main.yml
new file mode 100644
index 000000000..17164af12
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_address_family_context_policy/tasks/main.yml
@@ -0,0 +1,244 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a BGP address family context policy (check_mode)
+ cisco.aci.aci_bgp_address_family_context_policy: &aci_bgp_address_family_context_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ address_family_context_policy: ansible_bgp_address_family_context_policy_1
+ description: BGP address family context policy 1 for ansible_tenant tenant
+ host_route_leak: true
+ ebgp_distance: 40
+ ibgp_distance: 210
+ local_distance: 215
+ ebgp_max_ecmp: 32
+ ibgp_max_ecmp: 32
+ state: present
+ check_mode: true
+ register: cm_add_bgp_address_family_context_policy
+
+ - name: Add a BGP address family context policy (normal_mode)
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *aci_bgp_address_family_context_policy_present
+ register: nm_add_bgp_address_family_context_policy
+
+ - name: Add the first BGP address family context policy again - testing idempotency
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *aci_bgp_address_family_context_policy_present
+ register: nm_add_bgp_address_family_context_policy_idempotency
+
+ - name: Add Local max ECMP to BGP address family context policy - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5.0', '>=')
+ cisco.aci.aci_bgp_address_family_context_policy: &aci_bgp_address_family_context_policy_present_maxLocalEcmp
+ <<: *aci_bgp_address_family_context_policy_present
+ local_max_ecmp: 1
+ register: nm_add_maxLocalEcmp_bgp_address_family_context_policy
+
+ - name: Add Path Capability to BGP address family context policy - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ cisco.aci.aci_bgp_address_family_context_policy: &aci_bgp_address_family_context_policy_present_bgpCtxAddlPathPol
+ <<: *aci_bgp_address_family_context_policy_present_maxLocalEcmp
+ bgp_add_path_capability: receive
+ register: nm_add_path_capability_bgp_address_family_context_policy
+
+ - name: Add a second BGP address family context policy (normal_mode)
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ address_family_context_policy: ansible_bgp_address_family_context_policy_2
+ description: BGP address family context policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_bgp_address_family_context_policy_2
+
+ - name: Asserts for BGP address family context policys creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_bgp_address_family_context_policy is changed
+ - cm_add_bgp_address_family_context_policy.previous == []
+ - cm_add_bgp_address_family_context_policy.current == []
+ - nm_add_bgp_address_family_context_policy is changed
+ - nm_add_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.name == "ansible_bgp_address_family_context_policy_1"
+ - nm_add_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.eDist == "40"
+ - nm_add_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.iDist == "210"
+ - nm_add_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.localDist == "215"
+ - nm_add_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.maxEcmp == "32"
+ - nm_add_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.maxEcmpIbgp == "32"
+ - nm_add_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.ctrl == "host-rt-leak"
+ - nm_add_bgp_address_family_context_policy_idempotency is not changed
+ - nm_add_bgp_address_family_context_policy_2 is changed
+ - nm_add_bgp_address_family_context_policy_2.previous == []
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.name == "ansible_bgp_address_family_context_policy_2"
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.eDist == "20"
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.iDist == "200"
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.localDist == "220"
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.maxEcmp == "16"
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.maxEcmpIbgp == "16"
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.ctrl == ""
+
+ - name: Asserts adding Local max ECMP for BGP address family context policys creation tasks - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5.0', '>=')
+ ansible.builtin.assert:
+ that:
+ - nm_add_maxLocalEcmp_bgp_address_family_context_policy is changed
+ - nm_add_maxLocalEcmp_bgp_address_family_context_policy.current.0.bgpCtxAfPol.attributes.maxLocalEcmp == "1"
+ - nm_add_bgp_address_family_context_policy_2.current.0.bgpCtxAfPol.attributes.maxLocalEcmp == "0"
+
+ - name: Asserts adding path capability for BGP address family context policys creation tasks - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ ansible.builtin.assert:
+ that:
+ - nm_add_path_capability_bgp_address_family_context_policy is changed
+ - nm_add_path_capability_bgp_address_family_context_policy.current.0.bgpCtxAfPol.children.0.bgpCtxAddlPathPol.attributes.capability == "receive"
+
+ - name: Query all BGP address family context policies
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_bgp_address_family_context_policy
+
+ - name: Query ansible_bgp_address_family_context_policy_1
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *aci_bgp_address_family_context_policy_present
+ state: query
+ register: query_ansible_bgp_address_family_context_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_bgp_address_family_context_policy is not changed
+ - query_all_bgp_address_family_context_policy.current|length >= 2
+ - query_ansible_bgp_address_family_context_policy_1 is not changed
+ - query_ansible_bgp_address_family_context_policy_1.current.0.bgpCtxAfPol.attributes.name == "ansible_bgp_address_family_context_policy_1"
+ - query_ansible_bgp_address_family_context_policy_1.current.0.bgpCtxAfPol.attributes.eDist == "40"
+ - query_ansible_bgp_address_family_context_policy_1.current.0.bgpCtxAfPol.attributes.iDist == "210"
+ - query_ansible_bgp_address_family_context_policy_1.current.0.bgpCtxAfPol.attributes.localDist == "215"
+ - query_ansible_bgp_address_family_context_policy_1.current.0.bgpCtxAfPol.attributes.maxEcmp == "32"
+ - query_ansible_bgp_address_family_context_policy_1.current.0.bgpCtxAfPol.attributes.maxEcmpIbgp == "32"
+ - query_ansible_bgp_address_family_context_policy_1.current.0.bgpCtxAfPol.attributes.ctrl == "host-rt-leak"
+
+ - name: Query ansible_bgp_address_family_context_policy_1 with updated Local Max ECMP - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5.0', '>=')
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *aci_bgp_address_family_context_policy_present_maxLocalEcmp
+ state: query
+ register: query_ansible_bgp_address_family_context_policy_maxLocalEcmp
+
+ - name: Asserts path capability - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5.0', '>=')
+ ansible.builtin.assert:
+ that:
+ - query_ansible_bgp_address_family_context_policy_maxLocalEcmp.current.0.bgpCtxAfPol.attributes.maxLocalEcmp == "1"
+
+ - name: Query ansible_bgp_address_family_context_policy_1 with added path capability - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *aci_bgp_address_family_context_policy_present_bgpCtxAddlPathPol
+ state: query
+ register: query_ansible_bgp_address_family_context_policy_bgpCtxAddlPathPol
+
+ - name: Asserts path capability - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ ansible.builtin.assert:
+ that:
+ - query_ansible_bgp_address_family_context_policy_bgpCtxAddlPathPol.current.0.bgpCtxAfPol.children.0.bgpCtxAddlPathPol.attributes.capability == "receive"
+
+ - name: Remove children from BGP address family context policy (check_mode) - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ cisco.aci.aci_bgp_address_family_context_policy: &bgp_address_family_context_policy_delet_children
+ <<: *aci_bgp_address_family_context_policy_present_bgpCtxAddlPathPol
+ bgp_add_path_capability: ""
+ check_mode: true
+ register: cm_remove_children_bgp_address_family_context_policy
+
+ - name: Remove children from BGP address family context policy (normal_mode) - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *bgp_address_family_context_policy_delet_children
+ register: nm_remove_children_bgp_address_family_context_policy
+
+ - name: Remove children from BGP address family context policy (testing idempotency) - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *bgp_address_family_context_policy_delet_children
+ register: nm_remove_children_bgp_address_family_context_policy_idempotency
+
+ - name: Asserts for children removal tasks for the first address family context policy - APIC version >= 6.0(2h)
+ when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
+ ansible.builtin.assert:
+ that:
+ - cm_remove_children_bgp_address_family_context_policy is changed
+ - cm_remove_children_bgp_address_family_context_policy.current == cm_remove_children_bgp_address_family_context_policy.previous
+ - nm_remove_children_bgp_address_family_context_policy is changed
+ - nm_remove_children_bgp_address_family_context_policy.current.0.bgpCtxAfPol | length == 1
+ - nm_remove_children_bgp_address_family_context_policy_idempotency is not changed
+
+ - name: Remove BGP address family context policy (check_mode)
+ cisco.aci.aci_bgp_address_family_context_policy: &bgp_address_family_context_policy_absent
+ <<: *aci_bgp_address_family_context_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_bgp_address_family_context_policy
+
+ - name: Remove BGP address family context policy (normal_mode)
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *bgp_address_family_context_policy_absent
+ register: nm_remove_bgp_address_family_context_policy
+
+ - name: Remove BGP address family context policy - testing idempotency
+ cisco.aci.aci_bgp_address_family_context_policy:
+ <<: *bgp_address_family_context_policy_absent
+ register: nm_remove_bgp_address_family_context_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_bgp_address_family_context_policy is changed
+ - cm_remove_bgp_address_family_context_policy.proposed == {}
+ - nm_remove_bgp_address_family_context_policy is changed
+ - nm_remove_bgp_address_family_context_policy.previous != []
+ - nm_remove_bgp_address_family_context_policy.method == "DELETE"
+ - nm_remove_bgp_address_family_context_policy_idempotency is not changed
+ - nm_remove_bgp_address_family_context_policy_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_best_path_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_best_path_policy/tasks/main.yml
index d0eae2666..3c9176cd5 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_best_path_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_best_path_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a BGP best path policy (check_mode)
- aci_bgp_best_path_policy: &aci_bgp_best_path_policy_present
+ cisco.aci.aci_bgp_best_path_policy: &aci_bgp_best_path_policy_present
<<: *aci_info
tenant: ansible_tenant
bgp_best_path_policy: ansible_bgp_best_path_policy_1
@@ -51,17 +51,17 @@
register: cm_add_bgp_best_path_policy
- name: Add a BGP best path policy (normal_mode)
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *aci_bgp_best_path_policy_present
register: nm_add_bgp_best_path_policy
- name: Add the first BGP best path policy again - testing idempotency
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *aci_bgp_best_path_policy_present
register: nm_add_bgp_best_path_policy_idempotency
- name: Add a second BGP best path policy (normal_mode)
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *aci_info
tenant: ansible_tenant
bgp_best_path_policy: ansible_bgp_best_path_policy_2
@@ -71,7 +71,7 @@
register: nm_add_bgp_best_path_policy_2
- name: Asserts for BGP best path policys creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_bgp_best_path_policy is changed
- cm_add_bgp_best_path_policy.previous == []
@@ -86,19 +86,19 @@
- nm_add_bgp_best_path_policy_2.current.0.bgpBestPathCtrlPol.attributes.ctrl == ""
- name: Query all BGP best path policies
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *aci_info
state: query
register: query_all_bgp_best_path_policy
- name: Query ansible_bgp_best_path_policy_1
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *aci_bgp_best_path_policy_present
state: query
register: query_ansible_bgp_best_path_policy_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_bgp_best_path_policy is not changed
- query_all_bgp_best_path_policy.current|length >= 2
@@ -107,24 +107,24 @@
- query_ansible_bgp_best_path_policy_1.current.0.bgpBestPathCtrlPol.attributes.ctrl == "asPathMultipathRelax"
- name: Remove BGP best path policy (check_mode)
- aci_bgp_best_path_policy: &bgp_best_path_policy_absent
+ cisco.aci.aci_bgp_best_path_policy: &bgp_best_path_policy_absent
<<: *aci_bgp_best_path_policy_present
state: absent
check_mode: true
register: cm_remove_bgp_best_path_policy
- name: Remove BGP best path policy (normal_mode)
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *bgp_best_path_policy_absent
register: nm_remove_bgp_best_path_policy
- name: Remove BGP best path policy - testing idempotency
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *bgp_best_path_policy_absent
register: nm_remove_bgp_best_path_policy_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_bgp_best_path_policy is changed
- cm_remove_bgp_best_path_policy.proposed == {}
@@ -135,6 +135,6 @@
- nm_remove_bgp_best_path_policy_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/tasks/main.yml
new file mode 100644
index 000000000..a0a3c2b15
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_peer_prefix_policy/tasks/main.yml
@@ -0,0 +1,151 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a BGP peer prefix policy (check_mode)
+ cisco.aci.aci_bgp_peer_prefix_policy: &aci_bgp_peer_prefix_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ peer_prefix_policy: ansible_bgp_peer_prefix_policy_1
+ description: BGP peer prefix policy 1 for ansible_tenant tenant
+ action: restart
+ restart_time: 10
+ max_prefix: 10000
+ threshold: 80
+ state: present
+ check_mode: true
+ register: cm_add_bgp_peer_prefix_policy
+
+ - name: Add a BGP peer prefix policy (normal_mode)
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ <<: *aci_bgp_peer_prefix_policy_present
+ register: nm_add_bgp_peer_prefix_policy
+
+ - name: Add the first BGP peer prefix policy again - testing idempotency
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ <<: *aci_bgp_peer_prefix_policy_present
+ register: nm_add_bgp_peer_prefix_policy_idempotency
+
+ - name: Add a second BGP peer prefix policy (normal_mode)
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ peer_prefix_policy: ansible_bgp_peer_prefix_policy_2
+ description: BGP peer prefix policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_bgp_peer_prefix_policy_2
+
+ - name: Asserts for BGP peer prefix policys creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_bgp_peer_prefix_policy is changed
+ - cm_add_bgp_peer_prefix_policy.previous == []
+ - cm_add_bgp_peer_prefix_policy.current == []
+ - nm_add_bgp_peer_prefix_policy is changed
+ - nm_add_bgp_peer_prefix_policy.current.0.bgpPeerPfxPol.attributes.name == "ansible_bgp_peer_prefix_policy_1"
+ - nm_add_bgp_peer_prefix_policy.current.0.bgpPeerPfxPol.attributes.action == "restart"
+ - nm_add_bgp_peer_prefix_policy.current.0.bgpPeerPfxPol.attributes.maxPfx == "10000"
+ - nm_add_bgp_peer_prefix_policy.current.0.bgpPeerPfxPol.attributes.restartTime == "10"
+ - nm_add_bgp_peer_prefix_policy.current.0.bgpPeerPfxPol.attributes.thresh == "80"
+ - nm_add_bgp_peer_prefix_policy_idempotency is not changed
+ - nm_add_bgp_peer_prefix_policy_2 is changed
+ - nm_add_bgp_peer_prefix_policy_2.previous == []
+ - nm_add_bgp_peer_prefix_policy_2.current.0.bgpPeerPfxPol.attributes.name == "ansible_bgp_peer_prefix_policy_2"
+ - nm_add_bgp_peer_prefix_policy_2.current.0.bgpPeerPfxPol.attributes.action == "reject"
+ - nm_add_bgp_peer_prefix_policy_2.current.0.bgpPeerPfxPol.attributes.maxPfx == "20000"
+ - nm_add_bgp_peer_prefix_policy_2.current.0.bgpPeerPfxPol.attributes.restartTime == "infinite"
+ - nm_add_bgp_peer_prefix_policy_2.current.0.bgpPeerPfxPol.attributes.thresh == "75"
+
+ - name: Query all BGP peer prefix policies
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_bgp_peer_prefix_policy
+
+ - name: Query ansible_bgp_peer_prefix_policy_1
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ <<: *aci_bgp_peer_prefix_policy_present
+ state: query
+ register: query_ansible_bgp_peer_prefix_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_bgp_peer_prefix_policy is not changed
+ - query_all_bgp_peer_prefix_policy.current|length >= 2
+ - query_ansible_bgp_peer_prefix_policy_1 is not changed
+ - query_ansible_bgp_peer_prefix_policy_1.current.0.bgpPeerPfxPol.attributes.name == "ansible_bgp_peer_prefix_policy_1"
+ - query_ansible_bgp_peer_prefix_policy_1.current.0.bgpPeerPfxPol.attributes.action == "restart"
+ - query_ansible_bgp_peer_prefix_policy_1.current.0.bgpPeerPfxPol.attributes.maxPfx == "10000"
+ - query_ansible_bgp_peer_prefix_policy_1.current.0.bgpPeerPfxPol.attributes.restartTime == "10"
+ - query_ansible_bgp_peer_prefix_policy_1.current.0.bgpPeerPfxPol.attributes.thresh == "80"
+
+ - name: Remove BGP peer prefix policy (check_mode)
+ cisco.aci.aci_bgp_peer_prefix_policy: &bgp_peer_prefix_policy_absent
+ <<: *aci_bgp_peer_prefix_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_bgp_peer_prefix_policy
+
+ - name: Remove BGP peer prefix policy (normal_mode)
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ <<: *bgp_peer_prefix_policy_absent
+ register: nm_remove_bgp_peer_prefix_policy
+
+ - name: Remove BGP peer prefix policy - testing idempotency
+ cisco.aci.aci_bgp_peer_prefix_policy:
+ <<: *bgp_peer_prefix_policy_absent
+ register: nm_remove_bgp_peer_prefix_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_bgp_peer_prefix_policy is changed
+ - cm_remove_bgp_peer_prefix_policy.proposed == {}
+ - nm_remove_bgp_peer_prefix_policy is changed
+ - nm_remove_bgp_peer_prefix_policy.previous != []
+ - nm_remove_bgp_peer_prefix_policy.method == "DELETE"
+ - nm_remove_bgp_peer_prefix_policy_idempotency is not changed
+ - nm_remove_bgp_peer_prefix_policy_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/tasks/main.yml
new file mode 100644
index 000000000..b43cc8330
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_route_summarization_policy/tasks/main.yml
@@ -0,0 +1,255 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a BGP route summarization policy (check_mode) - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy: &aci_bgp_route_summarization_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ route_summarization_policy: ansible_bgp_route_summarization_policy_1
+ description: BGP route summarization policy 1 for ansible_tenant tenant
+ address_type_af_control: [af-mcast, af-ucast]
+ control_state: [as-set, summary-only]
+ state: present
+ check_mode: true
+ register: cm_add_bgp_route_summarization_policy
+
+ - name: Add a BGP route summarization policy (normal_mode)- APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_bgp_route_summarization_policy_present
+ register: nm_add_bgp_route_summarization_policy
+
+ - name: Add the first BGP route summarization policy again (testing idempotency) - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_bgp_route_summarization_policy_present
+ register: nm_add_bgp_route_summarization_policy_idempotency
+
+ - name: Add a second BGP route summarization policy (normal_mode) - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ route_summarization_policy: ansible_bgp_route_summarization_policy_2
+ description: BGP route summarization policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_bgp_route_summarization_policy_2
+
+ - name: Asserts for BGP route summarization policys creation tasks - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ ansible.builtin.assert:
+ that:
+ - cm_add_bgp_route_summarization_policy is changed
+ - cm_add_bgp_route_summarization_policy.previous == []
+ - cm_add_bgp_route_summarization_policy.current == []
+ - nm_add_bgp_route_summarization_policy is changed
+ - nm_add_bgp_route_summarization_policy.current.0.bgpRtSummPol.attributes.name == "ansible_bgp_route_summarization_policy_1"
+ - nm_add_bgp_route_summarization_policy.current.0.bgpRtSummPol.attributes.addrTCtrl == "af-mcast,af-ucast"
+ - nm_add_bgp_route_summarization_policy.current.0.bgpRtSummPol.attributes.ctrl == "as-set,summary-only"
+ - nm_add_bgp_route_summarization_policy_idempotency is not changed
+ - nm_add_bgp_route_summarization_policy_2 is changed
+ - nm_add_bgp_route_summarization_policy_2.previous == []
+ - nm_add_bgp_route_summarization_policy_2.current.0.bgpRtSummPol.attributes.name == "ansible_bgp_route_summarization_policy_2"
+ - nm_add_bgp_route_summarization_policy_2.current.0.bgpRtSummPol.attributes.addrTCtrl == "af-ucast"
+ - nm_add_bgp_route_summarization_policy_2.current.0.bgpRtSummPol.attributes.ctrl == ""
+
+ - name: Add a BGP route summarization policy (check_mode) - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy: &aci_bgp_route_summarization_policy_present_prior
+ <<: *aci_info
+ tenant: ansible_tenant
+ route_summarization_policy: ansible_bgp_route_summarization_policy_1
+ description: BGP route summarization policy 1 for ansible_tenant tenant
+ control_state: as-set
+ state: present
+ check_mode: true
+ register: cm_add_bgp_route_summarization_policy_prior
+
+ - name: Add a BGP route summarization policy (normal_mode) - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_bgp_route_summarization_policy_present_prior
+ register: nm_add_bgp_route_summarization_policy_prior
+
+ - name: Add the first BGP route summarization policy again (testing idempotency) - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_bgp_route_summarization_policy_present_prior
+ register: nm_add_bgp_route_summarization_policy_idempotency_prior
+
+ - name: Add a second BGP route summarization policy (normal_mode) - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ route_summarization_policy: ansible_bgp_route_summarization_policy_2
+ description: BGP route summarization policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_bgp_route_summarization_policy_2_prior
+
+ - name: Asserts for BGP route summarization policys creation tasks - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ ansible.builtin.assert:
+ that:
+ - cm_add_bgp_route_summarization_policy_prior is changed
+ - cm_add_bgp_route_summarization_policy_prior.previous == []
+ - cm_add_bgp_route_summarization_policy_prior.current == []
+ - nm_add_bgp_route_summarization_policy_prior is changed
+ - nm_add_bgp_route_summarization_policy_prior.current.0.bgpRtSummPol.attributes.name == "ansible_bgp_route_summarization_policy_1"
+ - nm_add_bgp_route_summarization_policy_prior.current.0.bgpRtSummPol.attributes.ctrl == "as-set"
+ - nm_add_bgp_route_summarization_policy_idempotency_prior is not changed
+ - nm_add_bgp_route_summarization_policy_2_prior is changed
+ - nm_add_bgp_route_summarization_policy_2_prior.previous == []
+ - nm_add_bgp_route_summarization_policy_2_prior.current.0.bgpRtSummPol.attributes.name == "ansible_bgp_route_summarization_policy_2"
+ - nm_add_bgp_route_summarization_policy_2_prior.current.0.bgpRtSummPol.attributes.ctrl == ""
+
+ - name: Query all BGP route summarization policies
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_bgp_route_summarization_policy
+
+ - name: Asserts query all tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_bgp_route_summarization_policy is not changed
+ - query_all_bgp_route_summarization_policy.current|length >= 2
+
+ - name: Query ansible_bgp_route_summarization_policy_1 - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_bgp_route_summarization_policy_present
+ state: query
+ register: query_ansible_bgp_route_summarization_policy_1
+
+ - name: Asserts individual query tasks - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ ansible.builtin.assert:
+ that:
+ - query_ansible_bgp_route_summarization_policy_1 is not changed
+ - query_ansible_bgp_route_summarization_policy_1.current.0.bgpRtSummPol.attributes.name == "ansible_bgp_route_summarization_policy_1"
+ - query_ansible_bgp_route_summarization_policy_1.current.0.bgpRtSummPol.attributes.addrTCtrl == "af-mcast,af-ucast"
+ - query_ansible_bgp_route_summarization_policy_1.current.0.bgpRtSummPol.attributes.ctrl == "as-set,summary-only"
+
+ - name: Query ansible_bgp_route_summarization_policy_1 - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *aci_bgp_route_summarization_policy_present_prior
+ state: query
+ register: query_ansible_bgp_route_summarization_policy_1_prior
+
+ - name: Asserts individual query tasks - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ ansible.builtin.assert:
+ that:
+ - query_ansible_bgp_route_summarization_policy_1_prior is not changed
+ - query_ansible_bgp_route_summarization_policy_1_prior.current.0.bgpRtSummPol.attributes.name == "ansible_bgp_route_summarization_policy_1"
+ - query_ansible_bgp_route_summarization_policy_1_prior.current.0.bgpRtSummPol.attributes.ctrl == "as-set"
+
+ - name: Remove BGP route summarization policy (check_mode) - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy: &bgp_route_summarization_policy_absent
+ <<: *aci_bgp_route_summarization_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_bgp_route_summarization_policy
+
+ - name: Remove BGP route summarization policy (normal_mode) - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *bgp_route_summarization_policy_absent
+ register: nm_remove_bgp_route_summarization_policy
+
+ - name: Remove BGP route summarization policy (testing idempotency) - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *bgp_route_summarization_policy_absent
+ register: nm_remove_bgp_route_summarization_policy_idempotency
+
+ - name: Asserts deletion tasks- APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ ansible.builtin.assert:
+ that:
+ - cm_remove_bgp_route_summarization_policy is changed
+ - cm_remove_bgp_route_summarization_policy.proposed == {}
+ - nm_remove_bgp_route_summarization_policy is changed
+ - nm_remove_bgp_route_summarization_policy.previous != []
+ - nm_remove_bgp_route_summarization_policy.method == "DELETE"
+ - nm_remove_bgp_route_summarization_policy_idempotency is not changed
+ - nm_remove_bgp_route_summarization_policy_idempotency.previous == []
+
+ - name: Remove BGP route summarization policy (check_mode) - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy: &bgp_route_summarization_policy_absent_prior
+ <<: *aci_bgp_route_summarization_policy_present_prior
+ state: absent
+ check_mode: true
+ register: cm_remove_bgp_route_summarization_policy_prior
+
+ - name: Remove BGP route summarization policy (normal_mode) - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *bgp_route_summarization_policy_absent_prior
+ register: nm_remove_bgp_route_summarization_policy_prior
+
+ - name: Remove BGP route summarization policy (testing idempotency) - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_bgp_route_summarization_policy:
+ <<: *bgp_route_summarization_policy_absent_prior
+ register: nm_remove_bgp_route_summarization_policy_idempotency_prior
+
+ - name: Asserts deletion tasks - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ ansible.builtin.assert:
+ that:
+ - cm_remove_bgp_route_summarization_policy_prior is changed
+ - cm_remove_bgp_route_summarization_policy_prior.proposed == {}
+ - nm_remove_bgp_route_summarization_policy_prior is changed
+ - nm_remove_bgp_route_summarization_policy_prior.previous != []
+ - nm_remove_bgp_route_summarization_policy_prior.method == "DELETE"
+ - nm_remove_bgp_route_summarization_policy_idempotency_prior is not changed
+ - nm_remove_bgp_route_summarization_policy_idempotency_prior.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_asn/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_asn/tasks/main.yml
index 3b65520bc..cead2ac6c 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_asn/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_asn/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -35,7 +35,7 @@
register: add_bgp_rr_asn
- name: Verify that BGP route reflector ASN has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_bgp_rr_asn is changed
- add_bgp_rr_asn.current.0.bgpAsP.attributes.annotation == 'orchestrator:ansible'
@@ -51,7 +51,7 @@
register: add_bgp_rr_asn_again
- name: Verify that BGP route reflector ASN idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_bgp_rr_asn_again is not changed
- add_bgp_rr_asn_again.current.0.bgpAsP.attributes.dn == "uni/fabric/bgpInstP-default/as"
@@ -66,7 +66,7 @@
register: update_bgp_rr_asn
- name: Verify that BGP route reflector ASN has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_bgp_rr_asn is changed
- update_bgp_rr_asn.current.0.bgpAsP.attributes.dn == "uni/fabric/bgpInstP-default/as"
@@ -80,7 +80,7 @@
register: query_bgp_rr_asn
- name: Verify BGP route reflector ASN
- assert:
+ ansible.builtin.assert:
that:
- query_bgp_rr_asn is not changed
- query_bgp_rr_asn.current.0.bgpAsP.attributes.dn == "uni/fabric/bgpInstP-default/as"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_node/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_node/tasks/main.yml
index d1ec77a27..609574cf6 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_node/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_rr_node/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -38,7 +38,7 @@
register: add_bgp_rr_node
- name: Verify that BGP route reflector node has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_bgp_rr_node is changed
- add_bgp_rr_node.current.0.bgpRRNodePEp.attributes.annotation == 'orchestrator:ansible'
@@ -58,7 +58,7 @@
register: add_bgp_rr_node_again
- name: Verify that BGP route reflector node has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_bgp_rr_node_again is not changed
- add_bgp_rr_node_again.current.0.bgpRRNodePEp.attributes.dn == "uni/fabric/bgpInstP-default/rr/node-101"
@@ -77,7 +77,7 @@
register: update_bgp_rr_node
- name: Verify that BGP route reflector node has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_bgp_rr_node is changed
- update_bgp_rr_node.current.0.bgpRRNodePEp.attributes.dn == "uni/fabric/bgpInstP-default/rr/node-101"
@@ -94,7 +94,7 @@
register: query_bgp_rr_node
- name: Verify that BGP route reflector node attributes
- assert:
+ ansible.builtin.assert:
that:
- query_bgp_rr_node is not changed
- query_bgp_rr_node.current.0.bgpRRNodePEp.attributes.dn == "uni/fabric/bgpInstP-default/rr/node-101"
@@ -109,7 +109,7 @@
register: query_bgp_rr_node_all
- name: Verify query_bgp_rr_node_all
- assert:
+ ansible.builtin.assert:
that:
- query_bgp_rr_node_all is not changed
@@ -122,7 +122,7 @@
register: remove_bgp_rr_node
- name: Verify BGP route reflector node removal
- assert:
+ ansible.builtin.assert:
that:
- remove_bgp_rr_node is changed
- remove_bgp_rr_node.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_timers_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_timers_policy/tasks/main.yml
index 0c7cdd77d..41a099dab 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_timers_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bgp_timers_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a BGP timers policy (check_mode)
- aci_bgp_timers_policy: &aci_bgp_timers_policy_present
+ cisco.aci.aci_bgp_timers_policy: &aci_bgp_timers_policy_present
<<: *aci_info
tenant: ansible_tenant
bgp_timers_policy: ansible_bgp_timers_policy_1
@@ -55,17 +55,17 @@
register: cm_add_bgp_timers_policy
- name: Add a BGP timers policy (normal_mode)
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *aci_bgp_timers_policy_present
register: nm_add_bgp_timers_policy
- name: Add the first BGP timers policy again - testing idempotency
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *aci_bgp_timers_policy_present
register: nm_add_bgp_timers_policy_idempotency
- name: Add a second BGP timers policy (normal_mode)
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *aci_info
tenant: ansible_tenant
bgp_timers_policy: ansible_bgp_timers_policy_2
@@ -74,7 +74,7 @@
register: nm_add_bgp_timers_policy_2
- name: Asserts for BGP timers policys creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_bgp_timers_policy is changed
- cm_add_bgp_timers_policy.previous == []
@@ -97,19 +97,19 @@
- nm_add_bgp_timers_policy_2.current.0.bgpCtxPol.attributes.staleIntvl == "default"
- name: Query all BGP timers policies
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *aci_info
state: query
register: query_all_bgp_timers_policy
- name: Query ansible_bgp_timers_policy_1
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *aci_bgp_timers_policy_present
state: query
register: query_ansible_bgp_timers_policy_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_bgp_timers_policy is not changed
- query_all_bgp_timers_policy.current|length >= 2
@@ -122,24 +122,24 @@
- query_ansible_bgp_timers_policy_1.current.0.bgpCtxPol.attributes.staleIntvl == "600"
- name: Remove BGP timers policy (check_mode)
- aci_bgp_timers_policy: &bgp_timers_policy_absent
+ cisco.aci.aci_bgp_timers_policy: &bgp_timers_policy_absent
<<: *aci_bgp_timers_policy_present
state: absent
check_mode: true
register: cm_remove_bgp_timers_policy
- name: Remove BGP timers policy (normal_mode)
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *bgp_timers_policy_absent
register: nm_remove_bgp_timers_policy
- name: Remove BGP timers policy - testing idempotency
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *bgp_timers_policy_absent
register: nm_remove_bgp_timers_policy_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_bgp_timers_policy is changed
- cm_remove_bgp_timers_policy.proposed == {}
@@ -150,6 +150,6 @@
- nm_remove_bgp_timers_policy_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_bulk_static_binding_to_epg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_bulk_static_binding_to_epg/tasks/main.yml
index 909cf933c..700c2975c 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_bulk_static_binding_to_epg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_bulk_static_binding_to_epg/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -70,7 +70,7 @@
register: cm_interfaces_present
- name: Assertions check for add list of interfaces with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_interfaces_present is changed
- cm_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -83,7 +83,7 @@
register: nm_interfaces_present
- name: Assertions check for add list of interfaces with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_interfaces_present is changed
- nm_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -97,7 +97,7 @@
register: idempotency_interfaces_present
- name: Idempotency assertions check for add list of interfaces with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_interfaces_present is not changed
- idempotency_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -112,7 +112,7 @@
register: cm_update_interfaces_present
- name: Assertions check for update list of interfaces - description with normal mode
- assert:
+ ansible.builtin.assert:
that:
- cm_update_interfaces_present is changed
- cm_update_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -127,7 +127,7 @@
register: nm_update_interfaces_present
- name: Assertions check for update list of interfaces - description with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_update_interfaces_present is changed
- nm_update_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -142,7 +142,7 @@
register: idempotency_nm_update_interfaces_present
- name: Idempotency assertions check for update list of interfaces - description with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_update_interfaces_present is not changed
- idempotency_nm_update_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -177,7 +177,7 @@
register: cm_path_update_interfaces_present
- name: Assertions check for update list of interfaces description using path level attributes with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_path_update_interfaces_present is changed
- cm_path_update_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -193,7 +193,7 @@
register: nm_path_update_interfaces_present
- name: Assertions check for update list of interfaces description using path level attributes with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_path_update_interfaces_present is changed
- nm_path_update_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -208,7 +208,7 @@
register: idempotency_path_update_interfaces_present
- name: Idempotency assertions check for update list of interfaces description using path level attributes with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_path_update_interfaces_present is not changed
- idempotency_path_update_interfaces_present.current.0.fvAEPg.attributes.name == "anstest"
@@ -226,7 +226,7 @@
register: query_result_of_anstest_epg
- name: Assertions check for query all interfaces of an EPG
- assert:
+ ansible.builtin.assert:
that:
- query_result_of_anstest_epg is not changed
- query_result_of_anstest_epg.current.0.fvAEPg.children | length == 3
@@ -241,7 +241,7 @@
register: query_all_interfaces
- name: Assertions check for query all interfaces # Check covers only EPG level
- assert:
+ ansible.builtin.assert:
that:
- query_all_interfaces is not changed
- query_all_interfaces.current | length >= 1
@@ -254,7 +254,7 @@
register: cm_interfaces_absent
- name: Assertions check for remove list of interfaces with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_interfaces_absent is changed
- cm_interfaces_absent.current.0.fvAEPg.children | length == 3
@@ -269,7 +269,7 @@
register: nm_interfaces_absent
- name: Assertions check for remove list of interfaces with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_interfaces_absent is changed
- "'children' not in nm_interfaces_absent.current.0.fvAEPg"
@@ -285,7 +285,7 @@
register: idempotency_interfaces_absent
- name: Idempotency assertions check for remove list of interfaces with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_interfaces_absent is changed
- "'children' not in idempotency_interfaces_absent.current.0.fvAEPg"
@@ -309,7 +309,7 @@
register: fex_port_channel_present
- name: Assertions check for add fex_port_channel interfaces to anstest epg
- assert:
+ ansible.builtin.assert:
that:
- fex_port_channel_present is changed
- fex_port_channel_present.current.0.fvAEPg.children | length == 1
@@ -325,7 +325,7 @@
register: fex_port_channel_absent
- name: Assertions check for remove fex_port_channel interfaces from anstest epg
- assert:
+ ansible.builtin.assert:
that:
- fex_port_channel_absent is changed
- fex_port_channel_absent.previous.0.fvAEPg.children | length == 1
@@ -354,7 +354,7 @@
register: fex_vpc_present
- name: Assertions check for add fex_vpc interfaces to anstest epg
- assert:
+ ansible.builtin.assert:
that:
- fex_vpc_present is changed
- fex_vpc_present.current.0.fvAEPg.children | length == 1
@@ -370,7 +370,7 @@
register: fex_vpc_absent
- name: Assertions check for remove fex_vpc interfaces from anstest epg
- assert:
+ ansible.builtin.assert:
that:
- fex_vpc_absent is changed
- fex_vpc_absent.previous.0.fvAEPg.children | length == 1
@@ -398,7 +398,7 @@
register: vpc_present
- name: Assertions check for add vpc interfaces to anstest epg
- assert:
+ ansible.builtin.assert:
that:
- vpc_present is changed
- vpc_present.current.0.fvAEPg.children | length == 1
@@ -414,7 +414,7 @@
register: vpc_absent
- name: Assertions check for remove vpc interfaces from anstest epg
- assert:
+ ansible.builtin.assert:
that:
- vpc_absent is changed
- vpc_absent.previous.0.fvAEPg.children | length == 1
@@ -433,7 +433,7 @@
register: query_result
- name: Assertions check for query all interfaces before start module and path level check
- assert:
+ ansible.builtin.assert:
that:
- query_result is not changed
- "'children' not in query_result.current.0.fvAEPg"
@@ -456,7 +456,7 @@
register: module_level_check
- name: Assertions check for add an interface with module level attributes
- assert:
+ ansible.builtin.assert:
that:
- module_level_check is changed
- module_level_check.current.0.fvAEPg.children | length == 1
@@ -474,7 +474,7 @@
register: module_level_check_absent
- name: Assertions check for remove an interface with module level attributes
- assert:
+ ansible.builtin.assert:
that:
- module_level_check_absent is changed
- "'children' not in module_level_check_absent.current.0.fvAEPg"
@@ -501,7 +501,7 @@
register: path_level_check
- name: Assertions check for add an interface with path level attributes
- assert:
+ ansible.builtin.assert:
that:
- path_level_check is changed
- path_level_check.current.0.fvAEPg.children | length == 1
@@ -515,7 +515,7 @@
register: path_level_check_absent
- name: Assertions check for remove an interface with path level attributes
- assert:
+ ansible.builtin.assert:
that:
- path_level_check_absent is changed
- "'children' not in path_level_check_absent.current.0.fvAEPg"
@@ -542,7 +542,7 @@
register: path_and_module_encap_id_present
- name: Assertions check for add an interface encap_id with path and module level attributes
- assert:
+ ansible.builtin.assert:
that:
- path_and_module_encap_id_present is changed
- path_and_module_encap_id_present.current.0.fvAEPg.children | length == 1
@@ -556,7 +556,7 @@
register: path_and_module_encap_id_absent
- name: Assertions check for remove an interface encap_id with path and module level attributes
- assert:
+ ansible.builtin.assert:
that:
- path_and_module_encap_id_absent is changed
- "'children' not in path_and_module_encap_id_absent.current.0.fvAEPg"
@@ -751,7 +751,7 @@
register: switch_port_primary_encap_id_not_unknown
- name: Negative assertions to check error messages
- assert:
+ ansible.builtin.assert:
that:
- switch_port_no_leafs.msg == "missing required arguments{{':'}} leafs found in interface_configs"
- fex_vpc_no_extpaths.msg == "extpaths is required when interface_type is{{':'}} fex_vpc"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ap/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ap/tasks/main.yml
index 08a62f8cc..eb1e51704 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ap/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ap/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -22,7 +22,7 @@
register: tenant_present
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
@@ -68,7 +68,7 @@
register: update_cloud_ap
- name: verify cloud ap creation
- assert:
+ ansible.builtin.assert:
that:
- cm_create_cloud_ap is changed
- nm_create_cloud_ap is changed
@@ -119,7 +119,7 @@
register: query_cloud_ap
- name: verify query
- assert:
+ ansible.builtin.assert:
that:
- query_all_tenant is not changed
- query_all_tenant.current.0.fvTenant.children | length >= 2
@@ -148,7 +148,7 @@
register: rm_cloud_ap_again
- name: verify deletion
- assert:
+ ansible.builtin.assert:
that:
- rm_cloud_ap is changed
- rm_cloud_ap.previous.0.cloudApp.attributes.name == 'anstest'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_aws_provider/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_aws_provider/tasks/main.yml
index 4679bf78d..f5a849d69 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_aws_provider/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_aws_provider/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for aws cloud site
when:
@@ -112,7 +112,7 @@
register: aws_query_all
- name: Verify all
- assert:
+ ansible.builtin.assert:
that:
- aws_present is changed
- aws_present_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_bgp_asn/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_bgp_asn/tasks/main.yml
index 8d442bf14..9fc045ed1 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_bgp_asn/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_bgp_asn/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -17,7 +17,7 @@
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -28,31 +28,31 @@
output_level: '{{ aci_output_level | default("info") }}'
# - name: Verify Cloud and Non-Cloud Sites in use.
-# include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+# ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
# - name: Execute tasks only for cloud sites
# when: query_cloud.current | length > 0 # This condition will execute only cloud sites
# block: # block specifies execution of tasks within, based on conditions
# - name: Ensure cloud BGP ASN doesn't exist
-# aci_cloud_bgp_asn:
+# cisco.aci.aci_cloud_bgp_asn:
# <<: *aci_info
# state: absent
# - name: Create cloud BGP ASN
-# aci_cloud_bgp_asn:
+# cisco.aci.aci_cloud_bgp_asn:
# <<: *aci_info
# state: present
# register: asn_present
# - name: Verify asn_present
-# assert:
+# ansible.builtin.assert:
# that:
# - asn_present is changed
# - asn_present.current.0.cloudBgpAsP.attributes.asn == '0'
# - name: Create cloud BGP ASN
-# aci_cloud_bgp_asn:
+# cisco.aci.aci_cloud_bgp_asn:
# <<: *aci_info
# annotation: 'tag_system'
# asn: 64605
@@ -63,13 +63,13 @@
# register: asn_present_2
# - name: Verify asn_present_2
-# assert:
+# ansible.builtin.assert:
# that:
# - asn_present_2 is changed
# - asn_present_2.current.0.cloudBgpAsP.attributes.asn == '64605'
# - name: Create same cloud BGP ASN again
-# aci_cloud_bgp_asn:
+# cisco.aci.aci_cloud_bgp_asn:
# <<: *aci_info
# annotation: 'tag_system'
# asn: 64605
@@ -80,13 +80,13 @@
# register: asn_present_again
# - name: Verify asn_present_again
-# assert:
+# ansible.builtin.assert:
# that:
# - asn_present_again is not changed
# - asn_present_again.current.0.cloudBgpAsP.attributes.asn == '64605'
# - name: Query particular cloud BGP ASN
-# aci_cloud_bgp_asn:
+# cisco.aci.aci_cloud_bgp_asn:
# <<: *aci_info
# annotation: 'tag_system'
# asn: 64605
@@ -99,25 +99,25 @@
# # Query all will give same result as query
# # There can be only one cloud BGP ASN
# - name: Query all cloud BGP ASN
-# aci_cloud_bgp_asn:
+# cisco.aci.aci_cloud_bgp_asn:
# <<: *aci_info
# state: query
# register: asn_query_all
# - name: Verify query
-# assert:
+# ansible.builtin.assert:
# that:
# - asn_query is not changed
# - asn_query_all is not changed
# - name: Delete cloud BGP ASN
-# aci_cloud_bgp_asn:
+# cisco.aci.aci_cloud_bgp_asn:
# <<: *aci_info
# state: absent
# register: asn_absent
# - name: Verify absent
-# assert:
+# ansible.builtin.assert:
# that:
# - asn_absent is changed
# - asn_absent.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_cidr/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_cidr/tasks/main.yml
index ab61eba83..9c00b67f4 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_cidr/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_cidr/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,27 +21,27 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Ensure tenant doesn't exist
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: absent
tenant: ansible_test
register: tenant_absent
- name: Ensure tenant exists for tests to kick off
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: present
tenant: ansible_test
register: tenant_present
- name: Ensure aci cloud context profile does not exists
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_1
@@ -49,7 +49,7 @@
register: rm_ctx_profile_1
- name: Create aci cloud context profile
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_1
@@ -61,7 +61,7 @@
register: nm_add_aci_ctx_profile
- name: Create non_primary CIDR (check_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.0.0.0/16
@@ -71,7 +71,7 @@
register: cm_non_primary_cidr
- name: Create non_primary CIDR (normal_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.0.0.0/16
@@ -80,7 +80,7 @@
register: nm_non_primary_cidr
- name: Verify cm_non_primary_cidr and nm_non_primary_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_non_primary_cidr is changed
- nm_non_primary_cidr is changed
@@ -95,7 +95,7 @@
- nm_non_primary_cidr.current.0.cloudCidr.attributes.primary == "no"
- name: Create non_primary CIDR again
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.0.0.0/16
@@ -104,7 +104,7 @@
register: nm_non_primary_cidr_again
- name: Verify nm_non_primary_cidr_again
- assert:
+ ansible.builtin.assert:
that:
- nm_non_primary_cidr_again is not changed
- nm_non_primary_cidr_again.previous.0.cloudCidr.attributes.addr == "10.0.0.0/16"
@@ -115,7 +115,7 @@
- nm_non_primary_cidr_again.current.0.cloudCidr.attributes.primary == "no"
- name: Change primary CIDR to non_primary (check_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.11.0.0/16
@@ -125,7 +125,7 @@
register: cm_change_to_non_primary_cidr
- name: Change primary CIDR to non_primary (normal_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.11.0.0/16
@@ -135,14 +135,14 @@
register: nm_change_to_non_primary_cidr
- name: Verify cm_primary_cidr and nm_change_to_non_primary_cidr
- assert:
+ ansible.builtin.assert:
that:
- nm_change_to_non_primary_cidr.msg == "APIC Error 1{{':'}} Invalid Configuration {{':'}} Exactly one Primary CIDR expected for{{':'}} uni/tn-ansible_test/ctxprofile-ctx_profile_1, but found{{':'}} 0"
- cm_change_to_non_primary_cidr.proposed.cloudCidr.attributes.primary == "no"
- cm_change_to_non_primary_cidr.previous.0.cloudCidr.attributes.primary == cm_change_to_non_primary_cidr.current.0.cloudCidr.attributes.primary == "yes"
- name: Remove primary CIDR (check_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.11.0.0/16
@@ -152,7 +152,7 @@
register: cm_remove_primary_cidr
- name: Remove primary CIDR (normal_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.11.0.0/16
@@ -162,14 +162,14 @@
register: nm_remove_primary_cidr
- name: Verify cm_remove_primary_cidr and nm_remove_primary_cidr
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_primary_cidr.msg == "APIC Error 1{{':'}} Invalid Configuration {{':'}} Exactly one Primary CIDR expected for{{':'}} uni/tn-ansible_test/ctxprofile-ctx_profile_1, but found{{':'}} 0"
- cm_remove_primary_cidr.proposed == {}
- cm_remove_primary_cidr.previous.0.cloudCidr.attributes.primary == cm_remove_primary_cidr.current.0.cloudCidr.attributes.primary == "yes"
- name: Create second non_primary CIDR
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.18.0.0/16
@@ -178,7 +178,7 @@
register: nm_add_second_non_primary_cidr
- name: Verify nm_add_second_non_primary_cidr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_second_non_primary_cidr is changed
- nm_add_second_non_primary_cidr.previous == []
@@ -187,7 +187,7 @@
- nm_add_second_non_primary_cidr.current.0.cloudCidr.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.18.0.0/16]"
- name: Change setting of second non_primary CIDR
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
cidr: 10.18.0.0/16
@@ -198,7 +198,7 @@
register: change_non_primary_cidr
- name: Verify change_non_primary_cidr
- assert:
+ ansible.builtin.assert:
that:
- change_non_primary_cidr is changed
- change_non_primary_cidr.current.0.cloudCidr.attributes.addr == "10.18.0.0/16"
@@ -207,7 +207,7 @@
- change_non_primary_cidr.current.0.cloudCidr.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.18.0.0/16]"
- name: Query all CIDRs
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
@@ -215,7 +215,7 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.cloudCtxProfile.attributes.name == "ctx_profile_1"
@@ -228,7 +228,7 @@
- query_all.current.0.cloudCtxProfile.children.2.cloudCidr.attributes.primary == "yes"
- name: Query primary CIDR
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
@@ -237,7 +237,7 @@
register: query_primary
- name: Verify query_primary
- assert:
+ ansible.builtin.assert:
that:
- query_primary is not changed
- query_primary.current.0.cloudCidr.attributes.addr == "10.11.0.0/16"
@@ -245,7 +245,7 @@
- query_primary.current.0.cloudCidr.attributes.primary == "yes"
- name: Query non_primary CIDR
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
@@ -254,7 +254,7 @@
register: query_non_primary
- name: Verify query_non_primary
- assert:
+ ansible.builtin.assert:
that:
- query_non_primary is not changed
- query_non_primary.current.0.cloudCidr.attributes.addr == "10.0.0.0/16"
@@ -262,7 +262,7 @@
- query_non_primary.current.0.cloudCidr.attributes.primary == "no"
- name: Query non_exsisting CIDR
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
@@ -272,12 +272,12 @@
register: query_non_existing
- name: Verify query_non_existing
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing.msg == "APIC Error 104{{':'}} Invalid RN cidr-[non_exsisting]"
- name: Remove non_primary CIDR(check_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.0.0.0/16
@@ -287,7 +287,7 @@
register: cm_remove_non_primary_cidr
- name: Remove non_primary CIDR(normal_mode)
- aci_cloud_cidr:
+ cisco.aci.aci_cloud_cidr:
<<: *aci_info
tenant: ansible_test
address: 10.0.0.0/16
@@ -296,7 +296,7 @@
register: nm_remove_non_primary_cidr
- name: Verify cm_remove_non_primary_cidr and nm_remove_non_primary_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_non_primary_cidr is changed
- nm_remove_non_primary_cidr is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ctx_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ctx_profile/tasks/main.yml
index 981eadea8..fad2a6452 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ctx_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_ctx_profile/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,27 +21,27 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Ensure tenant doesn't exist
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: absent
tenant: ansible_test
register: tenant_absent
- name: Ensure tenant exists for tests to kick off
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: present
tenant: ansible_test
register: tenant_present
- name: Ensure aci cloud context profile does not exists
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_1
@@ -49,12 +49,12 @@
register: rm_ctx_profile_1
- name: Verify rm_ctx_profile_1
- assert:
+ ansible.builtin.assert:
that:
- rm_ctx_profile_1.current == []
- name: Ensure aci cloud context profile 2 does not exists
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_2
@@ -62,12 +62,12 @@
register: rm_ctx_profile_2
- name: Verify rm_ctx_profile_2
- assert:
+ ansible.builtin.assert:
that:
- rm_ctx_profile_2.current == []
- name: Create aci cloud context profile (check mode)
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
cloud: "{{ cloud_type }}"
@@ -80,7 +80,7 @@
register: cm_add_aci_ctx_profile
- name: Create aci cloud context profile (normal mode)
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
cloud: "{{ cloud_type }}"
@@ -92,7 +92,7 @@
register: nm_add_aci_ctx_profile
- name: Verify cm_add_aci_ctx_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_add_aci_ctx_profile is changed
- cm_add_aci_ctx_profile.previous == []
@@ -103,7 +103,7 @@
- cm_add_aci_ctx_profile.proposed.cloudCtxProfile.children[2].cloudCidr.attributes.primary == "yes"
- name: Verify nm_add_aci_ctx_profile
- assert:
+ ansible.builtin.assert:
that:
- nm_add_aci_ctx_profile is changed
- nm_add_aci_ctx_profile.previous == []
@@ -115,7 +115,7 @@
- nm_add_aci_ctx_profile.current[0].cloudCtxProfile.children[0].cloudCidr.attributes.primary == "yes"
- name: Add aci cloud context profile again (check_mode)
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
cloud: "{{ cloud_type }}"
@@ -128,7 +128,7 @@
register: cm_add_aci_ctx_profile_again
- name: Verify cm_add_aci_ctx_profile_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_aci_ctx_profile_again is not changed
- cm_add_aci_ctx_profile_again.previous[0].cloudCtxProfile.attributes.name == "ctx_profile_1"
@@ -139,7 +139,7 @@
- name: Add aci cloud context profile again (normal_mode)
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
cloud: "{{ cloud_type }}"
@@ -151,7 +151,7 @@
register: nm_add_aci_ctx_profile_again
- name: Verify nm_add_aci_ctx_profile_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_aci_ctx_profile_again is not changed
- nm_add_aci_ctx_profile_again.current[0].cloudCtxProfile.attributes.name == "ctx_profile_1"
@@ -161,7 +161,7 @@
- nm_add_aci_ctx_profile_again.current[0].cloudCtxProfile.children[0].cloudCidr.attributes.primary == "yes"
- name: Add another aci cloud context profile (check_mode)
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
cloud: "{{ cloud_type }}"
@@ -175,7 +175,7 @@
register: cm_add_another_aci_ctx_profile
- name: Verify cm_add_another_aci_ctx_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_add_another_aci_ctx_profile is changed
- cm_add_another_aci_ctx_profile.previous == []
@@ -187,7 +187,7 @@
- cm_add_another_aci_ctx_profile.proposed.cloudCtxProfile.attributes.descr == "add ctx_profile_2"
- name: Add another aci cloud context profile (normal_mode)
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
cloud: "{{ cloud_type }}"
@@ -200,7 +200,7 @@
register: nm_add_another_aci_ctx_profile
- name: Verify nm_add_another_aci_ctx_profile
- assert:
+ ansible.builtin.assert:
that:
- nm_add_another_aci_ctx_profile is changed
- nm_add_another_aci_ctx_profile.previous == []
@@ -212,7 +212,7 @@
- nm_add_another_aci_ctx_profile.current[0].cloudCtxProfile.attributes.descr == "add ctx_profile_2"
- name: Query aci cloud context profile ctx_profile_1
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_1
@@ -220,28 +220,28 @@
register: query_aci_cloud_profile_1
- name: Verify query_aci_cloud_profile_1
- assert:
+ ansible.builtin.assert:
that:
- query_aci_cloud_profile_1 is not changed
- query_aci_cloud_profile_1.current[0].cloudCtxProfile.attributes.name == "ctx_profile_1"
- query_aci_cloud_profile_1.current[0].cloudCtxProfile.children | length == 3
- name: Query all aci cloud context profiles
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
state: query
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length == 1
- query_all.current.0.fvTenant.children | length == 2
- name: Remove aci cloud context profile
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_1
@@ -249,7 +249,7 @@
register: rm_ctx_profile
- name: Verify rm_ctx_profile
- assert:
+ ansible.builtin.assert:
that:
- rm_ctx_profile.current == []
- rm_ctx_profile.previous.0.cloudCtxProfile.attributes.name == "ctx_profile_1"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg/tasks/main.yml
index 966b6afc2..b8804bad7 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
@@ -89,7 +89,7 @@
register: nm_another_epg_present
- name: Verify cloud epg creation
- assert:
+ ansible.builtin.assert:
that:
- cm_epg_present is changed
- nm_epg_present is changed
@@ -129,7 +129,7 @@
# register: create_no_vrf
- name: Veirfy update_cloud_epg
- assert:
+ ansible.builtin.assert:
that:
- update_cloud_epg is changed
- update_cloud_epg.current.0.cloudEPg.children.0.cloudRsCloudEPgCtx.attributes.tnFvCtxName == 'anstest_2'
@@ -152,7 +152,7 @@
register: query_all
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- cloud_epg_query is not changed
- cloud_epg_query.current.0.cloudEPg.attributes.name == 'anstest'
@@ -178,7 +178,7 @@
register: cloud_epg_absent_again
- name: Verify deletion
- assert:
+ ansible.builtin.assert:
that:
- cloud_epg_absent is changed
- cloud_epg_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg_selector/tasks/main.yml
index c1261eae7..194a35fea 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg_selector/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_epg_selector/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
@@ -92,7 +92,7 @@
register: selector_present_again
- name: Verify creation of cloud epg selector
- assert:
+ ansible.builtin.assert:
that:
- cm_selector_present is changed
- nm_selector_present is changed
@@ -174,7 +174,7 @@
register: equals_without_value
- name: Verify creation of other selectors
- assert:
+ ansible.builtin.assert:
that:
- sec_selector is changed
- udpate_selector is changed
@@ -204,7 +204,7 @@
register: query_all
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- query_selector.current.0.cloudEPSelector.attributes.name == 'ansible_selector'
- query_all.current.0.cloudEPg.children | length >= 2
@@ -225,7 +225,7 @@
register: rm_selector_2_again
- name: Verify rm_selector_2
- assert:
+ ansible.builtin.assert:
that:
- rm_selector_2 is changed
- rm_selector_2.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg/tasks/main.yml
index b9511e98f..e3676759f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
@@ -92,7 +92,7 @@
register: nm_epg_present_again
- name: Verify cloud external epg creation
- assert:
+ ansible.builtin.assert:
that:
- cm_epg_present is changed
- nm_epg_present is changed
@@ -116,7 +116,7 @@
register: nm_another_epg_present
- name: Verify another cloud external epg creation
- assert:
+ ansible.builtin.assert:
that:
- nm_another_epg_present is changed
- nm_another_epg_present.previous == []
@@ -135,7 +135,7 @@
register: no_vrf
- name: Veirfy update_cloud_ext_epg
- assert:
+ ansible.builtin.assert:
that:
- update_cloud_ext_epg is changed
- update_cloud_ext_epg.current.0.cloudExtEPg.children.0.cloudRsCloudEPgCtx.attributes.tnFvCtxName == 'anstest_2'
@@ -158,7 +158,7 @@
register: query_all
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- cloud_ext_epg_query is not changed
- cloud_ext_epg_query.current.0.cloudExtEPg.attributes.name == 'anstest'
@@ -184,7 +184,7 @@
register: cloud_ext_epg_absent_again
- name: Verify deletion
- assert:
+ ansible.builtin.assert:
that:
- cloud_ext_epg_absent is changed
- cloud_ext_epg_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg_selector/tasks/main.yml
index 21260c054..671638a66 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg_selector/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_external_epg_selector/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
@@ -103,7 +103,7 @@
register: nm_epg_present_again
- name: Verify cloud external epg creation
- assert:
+ ansible.builtin.assert:
that:
- cm_epg_present is changed
- nm_epg_present is changed
@@ -126,7 +126,7 @@
register: nm_another_epg_present
- name: Verify another cloud external epg creation
- assert:
+ ansible.builtin.assert:
that:
- nm_another_epg_present is changed
- nm_another_epg_present.previous == []
@@ -153,7 +153,7 @@
register: query_all
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.cloudExtEPg.children | length >= 2
@@ -175,7 +175,7 @@
register: cloud_ext_epg_absent_again
- name: Verify deletion
- assert:
+ ansible.builtin.assert:
that:
- cloud_ext_epg_absent is changed
- cloud_ext_epg_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_provider/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_provider/tasks/main.yml
index 9cc4c87b7..6b1547a8a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_provider/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_provider/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,7 +21,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
@@ -29,25 +29,25 @@
# QUERY OBJECTS
- name: Query cloud provider object
- aci_cloud_provider:
+ cisco.aci.aci_cloud_provider:
<<: *aci_info
state: query
register: query_cloud
when: version.current.0.topSystem.attributes.version is version('4.1', '>=')
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
query_cloud:
current: []
when: version.current.0.topSystem.attributes.version is version('4.1', '<')
- name: Verify query_cloud for all sites
- assert:
+ ansible.builtin.assert:
that:
- query_cloud is not changed
- name: Verify query_cloud for Cloud Sites
- assert:
+ ansible.builtin.assert:
that:
- query_cloud is not changed
- query_cloud.current.0.cloudProvP.attributes.environment == "public-cloud"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_region/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_region/tasks/main.yml
index f4c19c3f7..ab2384791 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_region/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_region/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,20 +21,20 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Query all regions
- aci_cloud_region:
+ cisco.aci.aci_cloud_region:
<<: *aci_info
cloud: "{{ cloud_type }}"
state: query
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.cloudProvP.attributes.dn == "uni/clouddomp/provp-{{cloud_type}}"
@@ -43,7 +43,7 @@
when: query_all.current != []
- name: Query a specific region
- aci_cloud_region:
+ cisco.aci.aci_cloud_region:
<<: *aci_info
cloud: "{{ cloud_type }}"
region: "{{ region_2 }}"
@@ -51,7 +51,7 @@
register: query_region
- name: Verify query_region
- assert:
+ ansible.builtin.assert:
that:
- query_region is not changed
- query_region.current.0.cloudRegion.attributes.adminSt == "managed"
@@ -60,7 +60,7 @@
when: query_region.current != []
- name: Query non_existing region
- aci_cloud_region:
+ cisco.aci.aci_cloud_region:
<<: *aci_info
cloud: "{{ cloud_type }}"
region: non_existing
@@ -68,7 +68,7 @@
register: query_non_existing_region
- name: Verify query_non_existing_region
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing_region is not changed
- query_non_existing_region.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_subnet/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_subnet/tasks/main.yml
index e438b4144..8e6a9a15a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_subnet/tasks/main.yml
@@ -1,16 +1,17 @@
# Test code for the ACI modules
# Copyright: (c) 2020, Cindy Zhao (@cizhao) <cizhao@cisco.com>
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
-# CLEAN ENVIRONMENT
+# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,177 +22,193 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Ensure tenant doesn't exist
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: absent
tenant: ansible_test
register: tenant_absent
- - name: Ensure tenant exists for tests to kick off
- aci_tenant:
- <<: *aci_info
- state: present
- tenant: ansible_test
- register: tenant_present
+ # CLEAN ENVIRONMENT
- - name: Ensure aci cloud context profile does not exists
- aci_cloud_ctx_profile:
+ - name: Remove aci cloud context profile
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_1
state: absent
- register: rm_ctx_profile_1
-
- - name: Verify rm_ctx_profile_1
- assert:
- that:
- - rm_ctx_profile_1.current == []
- - name: Create aci cloud context profile (normal mode)
- aci_cloud_ctx_profile:
+ - name: Remove ansible_test
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_test
+ state: absent
+
+ - name: Create ansible_test
+ cisco.aci.aci_tenant: &aci_tenant
+ <<: *aci_tenant_absent
+ state: present
+
+ - name: Create aci cloud context profile
+ cisco.aci.aci_cloud_ctx_profile:
+ <<: *aci_tenant
cloud: "{{ cloud_type }}"
name: ctx_profile_1
vrf: ctx_profile_vrf_1
region: "{{ region_2 }}"
primary_cidr: '10.50.0.0/16'
state: present
- register: nm_add_aci_ctx_profile
+
+ # CREATION TASKS
- name: Create aci cloud subnet (check_mode)
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
+ cisco.aci.aci_cloud_subnet: &aci_cloud_subnet
+ <<: *aci_tenant
cloud_context_profile: ctx_profile_1
cidr: '10.50.0.0/16'
availability_zone: "{{ availability_zone | default(omit) }}"
+ azure_region: "{{ az_region | default(omit) }}"
+ vnet_gateway: "{{ vnet_gateway | default(omit) }}"
address: 10.50.0.1
description: test description
check_mode: true
register: cm_add_subnet
- name: Create aci cloud subnet (normal_mode)
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- availability_zone: "{{ availability_zone | default(omit) }}"
- address: 10.50.0.1
- description: test description
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
register: nm_add_subnet
- - name: Verify cm_add_subnet
- assert:
+ - name: Create aci cloud subnet again (normal_mode)
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
+ register: nm_add_subnet_again
+
+ - name: Create aci cloud subnet with invalid zone/region
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
+ availability_zone: us-west-1a
+ azure_region: westus2
+ ignore_errors: true
+ register: nm_invalid_subnet_zone
+
+ - name: Verify create tasks
+ ansible.builtin.assert:
that:
- cm_add_subnet is changed
+ - cm_add_subnet.current == []
- cm_add_subnet.previous == []
- cm_add_subnet.proposed.cloudSubnet.attributes.ip == "10.50.0.1"
- cm_add_subnet.proposed.cloudSubnet.attributes.descr == "test description"
- cm_add_subnet.proposed.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
-
- - name: Create aci cloud subnet again (normal_mode)
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- availability_zone: "{{ availability_zone | default(omit) }}"
- address: 10.50.0.1
- description: test description
- register: nm_add_subnet_again
-
- - name: Verify nm_add_subnet_again
- assert:
- that:
+ - cm_add_subnet.proposed.cloudSubnet.attributes.annotation == "orchestrator:ansible"
+ - cm_add_subnet.proposed.cloudSubnet.attributes.scope == "private"
+ - nm_add_subnet is changed
+ - nm_add_subnet.current.0.cloudSubnet.attributes.ip == "10.50.0.1"
+ - nm_add_subnet.current.0.cloudSubnet.attributes.descr == "test description"
+ - nm_add_subnet.current.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
+ - nm_add_subnet.current.0.cloudSubnet.attributes.annotation == "orchestrator:ansible"
+ - nm_add_subnet.current.0.cloudSubnet.attributes.scope == "private"
+ - nm_add_subnet.previous == []
- nm_add_subnet_again is not changed
+ - nm_add_subnet_again.current.0.cloudSubnet.attributes.ip == "10.50.0.1"
+ - nm_add_subnet_again.current.0.cloudSubnet.attributes.descr == "test description"
+ - nm_add_subnet_again.current.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
+ - nm_add_subnet_again.current.0.cloudSubnet.attributes.annotation == "orchestrator:ansible"
+ - nm_add_subnet_again.current.0.cloudSubnet.attributes.scope == "private"
+ - nm_add_subnet_again.previous.0.cloudSubnet.attributes.ip == "10.50.0.1"
+ - nm_add_subnet_again.previous.0.cloudSubnet.attributes.descr == "test description"
+ - nm_add_subnet_again.previous.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
+ - nm_add_subnet_again.previous.0.cloudSubnet.attributes.annotation == "orchestrator:ansible"
+ - nm_add_subnet_again.previous.0.cloudSubnet.attributes.scope == "private"
+ - nm_invalid_subnet_zone.msg == "parameters are mutually exclusive{{":"}} aws_availability_zone|azure_region"
- - name: Create another cloud subnet (normal_mode)
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- availability_zone: "{{ availability_zone | default(omit) }}"
- address: 10.50.0.2
- description: another subnet
- register: nm_add_another_subnet
+ - name: Verify create tasks for Azure
+ ansible.builtin.assert:
+ that:
+ - cm_add_subnet.proposed.cloudSubnet.attributes.usage == "gateway"
+ - cm_add_subnet.proposed.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-azure/region-westus2/zone-default"
+ - nm_add_subnet.current.0.cloudSubnet.attributes.usage == "gateway"
+ - nm_add_subnet.current.0.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-azure/region-westus2/zone-default"
+ - nm_add_subnet_again.current.0.cloudSubnet.attributes.usage == "gateway"
+ - nm_add_subnet_again.current.0.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-azure/region-westus2/zone-default"
+ - nm_add_subnet_again.previous.0.cloudSubnet.attributes.usage == "gateway"
+ - nm_add_subnet_again.previous.0.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-azure/region-westus2/zone-default"
+ when: az_region is defined and vnet_gateway is defined
- - name: Verify nm_add_another_subnet
- assert:
+ - name: Verify create tasks for AWS
+ ansible.builtin.assert:
that:
- - nm_add_another_subnet is changed
- - nm_add_another_subnet.previous == []
- - nm_add_another_subnet.current.0.cloudSubnet.attributes.annotation == 'orchestrator:ansible'
- - nm_add_another_subnet.current.0.cloudSubnet.attributes.descr == "another subnet"
- - nm_add_another_subnet.current.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.2]"
+ - cm_add_subnet.proposed.cloudSubnet.attributes.usage == "user"
+ - cm_add_subnet.proposed.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-aws/region-us-west-1/zone-a"
+ - nm_add_subnet.current.0.cloudSubnet.attributes.usage == "user"
+ - nm_add_subnet.current.0.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-aws/region-us-west-1/zone-a"
+ - nm_add_subnet_again.current.0.cloudSubnet.attributes.usage == "user"
+ - nm_add_subnet_again.current.0.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-aws/region-us-west-1/zone-a"
+ - nm_add_subnet_again.previous.0.cloudSubnet.attributes.usage == "user"
+ - nm_add_subnet_again.previous.0.cloudSubnet.children.0.cloudRsZoneAttach.attributes.tDn == "uni/clouddomp/provp-aws/region-us-west-1/zone-a"
+ when: availability_zone is defined
- - name: Create cloud subnet 3(normal_mode)
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- availability_zone: "{{ availability_zone | default(omit) }}"
- address: 10.50.0.3
- name: subnet_3
- register: nm_add_subnet_3
+ # UPDATE TASKS
- - name: Specify subnet as VpnGateway enabled
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- availability_zone: "{{ availability_zone | default(omit) }}"
- address: 10.50.0.1
- # name: subnet_1
- description: change subnet 1
- vnet_gateway: "{{ vnet_gateway | default(omit)}}"
- #scope: public
- register: nm_change_subnet_1
+ - name: Update aci cloud subnet
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
+ description: test description 2
+ register: nm_update_subnet
- # Enable vpn_gateway router in cloud ctx profile
- - name: Enable VpnGateway
- aci_cloud_vpn_gateway:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- state: present
+ - name: Verify aci cloud subnet update
+ ansible.builtin.assert:
+ that:
+ - nm_update_subnet is changed
+ - nm_update_subnet.current.0.cloudSubnet.attributes.ip == "10.50.0.1"
+ - nm_update_subnet.current.0.cloudSubnet.attributes.descr == "test description 2"
+ - nm_update_subnet.current.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
+ - nm_update_subnet.current.0.cloudSubnet.attributes.annotation == "orchestrator:ansible"
+ - nm_update_subnet.current.0.cloudSubnet.attributes.scope == "private"
+ - nm_update_subnet.previous.0.cloudSubnet.attributes.ip == "10.50.0.1"
+ - nm_update_subnet.previous.0.cloudSubnet.attributes.descr == "test description"
+ - nm_update_subnet.previous.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
+ - nm_update_subnet.previous.0.cloudSubnet.attributes.annotation == "orchestrator:ansible"
+ - nm_update_subnet.previous.0.cloudSubnet.attributes.scope == "private"
- # Try to disable vpn_gateway router again in cloud ctx profile
- - name: Disable VpnGateway
- aci_cloud_vpn_gateway:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- state: absent
+ # QUERY TASKS
+
+ - name: Create extra subnets for query
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
+ cidr: 10.50.0.0/16
+ vnet_gateway: false
+ address: "{{ item }}"
+ loop:
+ - 10.50.0.2
+ - 10.50.0.3
- name: Query all subnets
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_tenant
cloud_context_profile: ctx_profile_1
cidr: '10.50.0.0/16'
state: query
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.cloudCidr.attributes.addr == "10.50.0.0/16"
- query_all.current.0.cloudCidr.children | length == 3
+ - query_all.current.0.cloudCidr.children.0.cloudSubnet.attributes.ip == "10.50.0.3"
+ - query_all.current.0.cloudCidr.children.1.cloudSubnet.attributes.ip == "10.50.0.2"
+ - query_all.current.0.cloudCidr.children.2.cloudSubnet.attributes.ip == "10.50.0.1"
- name: Query a specific subnet
- aci_cloud_subnet:
+ cisco.aci.aci_cloud_subnet:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
@@ -201,61 +218,50 @@
register: query_subnet_1
- name: Verify query_subnet_1
- assert:
+ ansible.builtin.assert:
that:
- query_subnet_1 is not changed
- query_subnet_1.current.0.cloudSubnet.attributes.ip == "10.50.0.1"
- query_subnet_1.current.0.cloudSubnet.attributes.scope == "private"
- query_subnet_1.current.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
- - name: Remove subnet 3 (check_mode)
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- address: 10.50.0.3
+ # DELETE TASKS
+
+ - name: Remove cloud subnet (check_mode)
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
state: absent
check_mode: true
- register: cm_remove_subnet_3
+ register: cm_remove_subnet
- - name: Verify cm_remove_subnet_3
- assert:
- that:
- - cm_remove_subnet_3 is changed
- - cm_remove_subnet_3.proposed == {}
- - cm_remove_subnet_3.previous.0.cloudSubnet.attributes.ip == "10.50.0.3"
-
- - name: Remove subnet 3 (normal_mode)
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- address: 10.50.0.3
+ - name: Remove cloud subnet (normal_mode)
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
state: absent
- register: nm_remove_subnet_3
-
- - name: Verify nm_remove_subnet_3
- assert:
- that:
- - nm_remove_subnet_3 is changed
- - nm_remove_subnet_3.current == []
- - nm_remove_subnet_3.previous.0.cloudSubnet.attributes.ip == "10.50.0.3"
+ register: nm_remove_subnet
- - name: Remove subnet 3 again
- aci_cloud_subnet:
- <<: *aci_info
- tenant: ansible_test
- cloud_context_profile: ctx_profile_1
- cidr: '10.50.0.0/16'
- address: 10.50.0.3
+ - name: Remove cloud subnet again (normal_mode)
+ cisco.aci.aci_cloud_subnet:
+ <<: *aci_cloud_subnet
state: absent
- register: nm_remove_subnet_3_again
+ register: nm_remove_subnet_again
- - name: Verify nm_remove_subnet_3_again
- assert:
+ - name: Verify remove cloud subnet
+ ansible.builtin.assert:
that:
- - nm_remove_subnet_3_again is not changed
- - nm_remove_subnet_3_again.previous == []
- - nm_remove_subnet_3_again.current == []
+ - cm_remove_subnet is changed
+ - cm_remove_subnet.proposed == {}
+ - cm_remove_subnet.previous.0.cloudSubnet.attributes.ip == "10.50.0.1"
+ - cm_remove_subnet.previous.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
+ - nm_remove_subnet is changed
+ - nm_remove_subnet.current == []
+ - nm_remove_subnet.previous.0.cloudSubnet.attributes.ip == "10.50.0.1"
+ - nm_remove_subnet.previous.0.cloudSubnet.attributes.dn == "uni/tn-ansible_test/ctxprofile-ctx_profile_1/cidr-[10.50.0.0/16]/subnet-[10.50.0.1]"
+ - nm_remove_subnet_again is not changed
+ - nm_remove_subnet_again.previous == []
+ - nm_remove_subnet_again.current == []
+
+ # CLEAN ENVIRONMENT
+ - name: Remove ansible_test
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_vpn_gateway/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_vpn_gateway/tasks/main.yml
index 834331a03..f1b0683fc 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_vpn_gateway/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_vpn_gateway/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,27 +21,27 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Ensure tenant doesn't exist
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: absent
tenant: ansible_test
register: tenant_absent
- name: Ensure tenant exists for tests to kick off
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: present
tenant: ansible_test
register: tenant_present
- name: Ensure aci cloud context profile does not exists
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
name: ctx_profile_1
@@ -49,12 +49,12 @@
register: rm_ctx_profile_1
- name: Verify rm_ctx_profile_1
- assert:
+ ansible.builtin.assert:
that:
- rm_ctx_profile_1.current == []
- name: Create aci cloud context profile (normal mode)
- aci_cloud_ctx_profile:
+ cisco.aci.aci_cloud_ctx_profile:
<<: *aci_info
tenant: ansible_test
cloud: "{{ cloud_type }}"
@@ -66,7 +66,7 @@
register: nm_add_aci_ctx_profile
- name: Create aci cloud subnet with VpnGateway enabled (normal_mode)
- aci_cloud_subnet:
+ cisco.aci.aci_cloud_subnet:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
@@ -79,35 +79,35 @@
register: nm_add_subnet
- name: Enable VpnGateway
- aci_cloud_vpn_gateway:
+ cisco.aci.aci_cloud_vpn_gateway:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
state: present
- name: Disable VpnGateway
- aci_cloud_vpn_gateway:
+ cisco.aci.aci_cloud_vpn_gateway:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
state: absent
- name: Enable VpnGateway again
- aci_cloud_vpn_gateway:
+ cisco.aci.aci_cloud_vpn_gateway:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
state: present
- name: Query VpnGateway
- aci_cloud_vpn_gateway:
+ cisco.aci.aci_cloud_vpn_gateway:
<<: *aci_info
tenant: ansible_test
cloud_context_profile: ctx_profile_1
register: query_vpn_gateway
- name: Verify VpnGateway
- assert:
+ ansible.builtin.assert:
that:
- query_vpn_gateway is not changed
- query_vpn_gateway.current.0.cloudRouterP.children | length == 3
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_zone/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_zone/tasks/main.yml
index 85a2ec087..09a1d18db 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_zone/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_cloud_zone/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,13 +21,13 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for cloud sites
when: query_cloud.current | length > 0 # This condition will execute only cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Query all zones under us-west-1
- aci_cloud_zone:
+ cisco.aci.aci_cloud_zone:
<<: *aci_info
cloud: "{{ cloud_type }}"
region: "{{ region_2 }}"
@@ -35,14 +35,14 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.cloudRegion.attributes.name == "{{region_2}}"
- query_all.current.0.cloudRegion.children | length >= 1
- name: Query a specific zone under region us-west-1
- aci_cloud_zone:
+ cisco.aci.aci_cloud_zone:
<<: *aci_info
cloud: "{{ cloud_type }}"
region: "{{ region_2 }}"
@@ -51,7 +51,7 @@
register: query_zone_1
- name: Query another specific zone under region us-west-1
- aci_cloud_zone:
+ cisco.aci.aci_cloud_zone:
<<: *aci_info
cloud: "{{ cloud_type }}"
region: "{{ region_2 }}"
@@ -60,7 +60,7 @@
register: query_zone_2
- name: Verify query_zone_1 and query_zone_2
- assert:
+ ansible.builtin.assert:
that:
- query_zone_1 is not changed
- query_zone_2 is not changed
@@ -71,7 +71,7 @@
when: query_zone_1.current != [] and query_zone_2.current != []
- name: Query non_existing zone under region us-west-1
- aci_cloud_zone:
+ cisco.aci.aci_cloud_zone:
<<: *aci_info
cloud: "{{ cloud_type }}"
region: "{{ region_2 }}"
@@ -80,7 +80,7 @@
register: query_non_existing_zone
- name: Query zone under non_existing region
- aci_cloud_zone:
+ cisco.aci.aci_cloud_zone:
<<: *aci_info
cloud: "{{ cloud_type }}"
region: non_existing
@@ -89,7 +89,7 @@
register: query_non_existing_region
- name: Verify query_non_existing_zone
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing_zone is not changed
- query_non_existing_zone.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_config_export_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_config_export_policy/tasks/main.yml
index bb290aa5f..ad4389e94 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_config_export_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_config_export_policy/tasks/main.yml
@@ -3,7 +3,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_config_rollback/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_config_rollback/tasks/main.yml
index 9b43c9cfc..c96a2c1e9 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_config_rollback/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_config_rollback/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -21,7 +21,7 @@
tenant: ansible_test
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: create a snapshot
cisco.aci.aci_config_snapshot: &create_snapshot
@@ -43,7 +43,7 @@
register: create_snapshot_annotation_check
- name: waiting for snapshot to be finished before querying
- pause:
+ ansible.builtin.pause:
seconds: 10
- name: get snapshots
@@ -142,7 +142,7 @@
register: rollback_rollback
- name: pause execution to let rollback take effect
- pause:
+ ansible.builtin.pause:
seconds: 15
- name: ensure tenant doesn't exist after rollback
@@ -154,7 +154,7 @@
msg: '{{ rollback_preview_json }}'
- name: rollback assertions
- assert:
+ ansible.builtin.assert:
that:
- rollback_preview_xml is not changed
- '"ansible_test" in rollback_preview_xml.preview'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_config_snapshot/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_config_snapshot/tasks/main.yml
index c9415a86d..fc4f7d906 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_config_snapshot/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_config_snapshot/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -46,7 +46,7 @@
register: missing_param
- name: present assertion tests
- assert:
+ ansible.builtin.assert:
that:
- create is not failed
- create is changed
@@ -72,7 +72,7 @@
register: query_export
- name: generate snapshot name
- set_fact:
+ ansible.builtin.set_fact:
test_snapshot: "{{ query_export.current.0.configSnapshotCont.children.0.configSnapshot.attributes.rn.strip('snapshot-') }}"
- name: query with export_policy and snapshot
@@ -95,7 +95,7 @@
register: query_all
- name: query assertion tests
- assert:
+ ansible.builtin.assert:
that:
- query_export is not failed
- query_export is not changed
@@ -134,7 +134,7 @@
register: delete_missing_param
- name: absent assertion tests
- assert:
+ ansible.builtin.assert:
that:
- delete_snapshot is not failed
- delete_snapshot is changed
@@ -149,7 +149,7 @@
# Create, query and delete snapshot with certificate authentication Ref# 427
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -178,7 +178,7 @@
register: create_private_key
- name: creation assertion tests with private key
- assert:
+ ansible.builtin.assert:
that:
- create_private_key is not failed
- create_private_key is changed
@@ -193,11 +193,11 @@
register: query_private_key
- name: generate snapshot name using query_private_key
- set_fact:
+ ansible.builtin.set_fact:
test_snapshot_private_key: "{{ query_private_key.current.0.configSnapshotCont.children.0.configSnapshot.attributes.rn.strip('snapshot-') }}"
- name: query assertion tests with private key
- assert:
+ ansible.builtin.assert:
that:
- query_private_key is not failed
- query_private_key is not changed
@@ -213,7 +213,7 @@
register: delete_snapshot_private_key
- name: delete assertion tests with the private key
- assert:
+ ansible.builtin.assert:
that:
- delete_snapshot_private_key is not failed
- delete_snapshot_private_key is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract/tasks/main.yml
index 635f2d331..1093c6b8e 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -57,7 +57,7 @@
register: present_missing_param
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- present_check_mode is changed
- present_check_mode.previous == []
@@ -99,7 +99,7 @@
register: query_all
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- query_contract is not changed
- query_contract.current | length == 1
@@ -147,7 +147,7 @@
register: absent_missing_param
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- absent_check_mode is changed
- absent_check_mode.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_export/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_export/tasks/main.yml
index 5a1139947..8bd55efef 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_export/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_export/tasks/main.yml
@@ -3,7 +3,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -62,7 +62,7 @@
register: nm_add_intf
- name: Verify add_intf
- assert:
+ ansible.builtin.assert:
that:
- cm_add_intf is changed
- nm_add_intf is changed
@@ -76,7 +76,7 @@
register: add_intf_again
- name: Verify add_intf_again
- assert:
+ ansible.builtin.assert:
that:
- add_intf_again is not changed
@@ -88,7 +88,7 @@
register: update_intf
- name: Verify update_intf
- assert:
+ ansible.builtin.assert:
that:
- update_intf is changed
- update_intf.previous != []
@@ -108,7 +108,7 @@
register: query_all_intfs
- name: Verify query_all_intfs
- assert:
+ ansible.builtin.assert:
that:
- query_all_intfs is not changed
- query_all_intfs.current|length > 1
@@ -121,7 +121,7 @@
register: query_spec_intf
- name: Verify query_spec_intf
- assert:
+ ansible.builtin.assert:
that:
- query_spec_intf is not changed
- query_spec_intf.current|length == 1
@@ -134,7 +134,7 @@
register: remove_intf
- name: Verify remove_intf
- assert:
+ ansible.builtin.assert:
that:
- remove_intf is changed
- remove_intf.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject/tasks/main.yml
index b7d53844c..5b3600756 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -83,7 +83,7 @@
register: present_missing_param
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- subject_present_check_mode is changed
- subject_present_check_mode.sent.vzSubj.attributes.descr == 'Ansible Test'
@@ -157,7 +157,7 @@
register: query_all
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- query_tenant_contract_subject is not changed
- query_tenant_contract_subject.current | length == 1
@@ -234,7 +234,7 @@
register: absent_missing_param
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- subject_absent_check_mode is changed
- subject_absent_check_mode.previous != []
@@ -289,7 +289,7 @@
register: nm_subject_present_one_way_again
- name: subject assertions
- assert:
+ ansible.builtin.assert:
that:
- cm_subject_present_both_default is changed
- nm_subject_present_both_default is changed
@@ -315,7 +315,7 @@
ignore_errors: true
- name: subject assertions
- assert:
+ ansible.builtin.assert:
that:
- nm_subject_reverse_to_one_way is not changed
- nm_subject_reverse_to_one_way.msg == "Direction is not allowed, valid option is both."
@@ -365,7 +365,7 @@
register: nm_subject_one_way_dscp_change
- name: subject assertions
- assert:
+ ansible.builtin.assert:
that:
- nm_subject_both_qos_dscp is changed
- nm_subject_both_qos_dscp.current.0.vzSubj.attributes.prio == "level1"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_filter/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_filter/tasks/main.yml
index d21571692..39f209789 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_filter/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_filter/tasks/main.yml
@@ -3,15 +3,15 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -98,7 +98,7 @@
register: present_missing_param
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- subject_filter_present_check_mode is changed
- subject_filter_present_check_mode.previous == []
@@ -137,7 +137,7 @@
register: query_binding_non_existing_subject
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length > 1
@@ -176,7 +176,7 @@
state: absent
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- subject_filter_absent_check_mode is changed
- subject_filter_absent_check_mode.proposed == {}
@@ -283,7 +283,7 @@
ignore_errors: true
- name: filter assertions
- assert:
+ ansible.builtin.assert:
that:
- cm_filter1_present_default is changed
- nm_filter1_present_default is changed
@@ -337,7 +337,7 @@
register: filter_present_deny_non_cloud_c2p
- name: filter subject with direction assertions
- assert:
+ ansible.builtin.assert:
that:
- filter_present_deny_non_cloud_both is changed
- filter_present_deny_non_cloud_both.current.0.vzRsSubjFiltAtt.attributes.action == "deny"
@@ -373,7 +373,7 @@
ignore_errors: true
- name: cloud assertions
- assert:
+ ansible.builtin.assert:
that:
- filter_present_deny_cloud.msg.startswith("APIC Error 1: Invalid Configuration CLOUD_ONLY_PERMIT_ACTION_SUPPORTED")
- filter_present_deny_cloud_p2c.msg.startswith("APIC Error 1: Invalid Configuration CLOUD_ONLY_PERMIT_ACTION_SUPPORTED")
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_service_graph/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_service_graph/tasks/main.yml
index c9e41610f..186f93a13 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_service_graph/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_contract_subject_to_service_graph/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -71,7 +71,7 @@
register: present_missing_param
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- subject_service_graph_present_check_mode is changed
- subject_service_graph_present_check_mode.previous == []
@@ -101,7 +101,7 @@
register: query_binding
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length > 0
@@ -134,7 +134,7 @@
register: absent_missing_param
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- subject_service_graph_absent_check_mode is changed
- subject_service_graph_absent_check_mode.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/tasks/main.yml
new file mode 100644
index 000000000..6e0f2e32e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option/tasks/main.yml
@@ -0,0 +1,188 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new DHCP option policy
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ dhcp_option_policy: ansible_dhcp_option_policy_1
+ description: DHCP option policy 1 for ansible_tenant tenant
+ state: present
+
+ # CREATE DHCP OPTION
+ - name: Add a DHCP option (check_mode)
+ cisco.aci.aci_dhcp_option: &aci_dhcp_option_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ dhcp_option_policy: ansible_dhcp_option_policy_1
+ dhcp_option: ansible_dhcp_option_1
+ id: 1
+ data: 82
+ state: present
+ check_mode: true
+ register: cm_add_dhcp_option
+
+ - name: Add a DHCP option (normal_mode)
+ cisco.aci.aci_dhcp_option:
+ <<: *aci_dhcp_option_present
+ register: nm_add_dhcp_option
+
+ - name: Add the first DHCP option again - testing idempotency
+ cisco.aci.aci_dhcp_option:
+ <<: *aci_dhcp_option_present
+ register: nm_add_dhcp_option_idempotency
+
+ - name: Add a second DHCP option (normal_mode)
+ cisco.aci.aci_dhcp_option:
+ <<: *aci_info
+ tenant: ansible_tenant
+ dhcp_option_policy: ansible_dhcp_option_policy_1
+ dhcp_option: ansible_dhcp_option_2
+ id: 2
+ data: 252
+ state: present
+ register: nm_add_dhcp_option_2
+
+ - name: Asserts for DHCP option creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_dhcp_option is changed
+ - cm_add_dhcp_option.previous == []
+ - cm_add_dhcp_option.current == []
+ - nm_add_dhcp_option is changed
+ - nm_add_dhcp_option.current.0.dhcpOption.attributes.name == "ansible_dhcp_option_1"
+ - nm_add_dhcp_option.current.0.dhcpOption.attributes.id == "1"
+ - nm_add_dhcp_option.current.0.dhcpOption.attributes.data == "82"
+ - nm_add_dhcp_option_idempotency is not changed
+ - nm_add_dhcp_option_2 is changed
+ - nm_add_dhcp_option_2.previous == []
+ - nm_add_dhcp_option_2.current.0.dhcpOption.attributes.name == "ansible_dhcp_option_2"
+ - nm_add_dhcp_option_2.current.0.dhcpOption.attributes.id == "2"
+ - nm_add_dhcp_option_2.current.0.dhcpOption.attributes.data == "252"
+
+ # QUERY DHCP OPTION
+ - name: Query all DHCP options
+ cisco.aci.aci_dhcp_option:
+ <<: *aci_info
+ state: query
+ register: query_all_dhcp_option
+
+ - name: Query ansible_dhcp_option_1
+ cisco.aci.aci_dhcp_option:
+ <<: *aci_dhcp_option_present
+ state: query
+ register: query_ansible_dhcp_option_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_dhcp_option is not changed
+ - query_all_dhcp_option.current|length >= 2
+ - query_ansible_dhcp_option_1 is not changed
+ - query_ansible_dhcp_option_1.current.0.dhcpOption.attributes.name == "ansible_dhcp_option_1"
+ - query_ansible_dhcp_option_1.current.0.dhcpOption.attributes.id == "1"
+ - query_ansible_dhcp_option_1.current.0.dhcpOption.attributes.data == "82"
+
+ #UPDATING DHCP OPTION
+ - name: Update first DHCP option (check_mode)
+ cisco.aci.aci_dhcp_option: &aci_dhcp_option_update
+ <<: *aci_dhcp_option_present
+ id: 3
+ data: 255
+ state: present
+ check_mode: true
+ register: cm_update_dhcp_option
+
+ - name: Update first DHCP option (normal_mode)
+ cisco.aci.aci_dhcp_option:
+ <<: *aci_dhcp_option_update
+ register: nm_update_dhcp_option
+
+ - name: Update first DHCP option again - testing idempotency
+ cisco.aci.aci_dhcp_option:
+ <<: *aci_dhcp_option_update
+ register: nm_update_dhcp_option_idempotency
+
+ - name: Asserts for DHCP option update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_dhcp_option is changed
+ - cm_update_dhcp_option.previous == cm_update_dhcp_option.current
+ - nm_update_dhcp_option is changed
+ - nm_update_dhcp_option.current.0.dhcpOption.attributes.name == "ansible_dhcp_option_1"
+ - nm_update_dhcp_option.current.0.dhcpOption.attributes.id == "3"
+ - nm_update_dhcp_option.current.0.dhcpOption.attributes.data == "255"
+ - nm_update_dhcp_option_idempotency is not changed
+
+ # DELETE DHCP OPTION
+ - name: Remove DHCP option (check_mode)
+ cisco.aci.aci_dhcp_option: &dhcp_option_absent
+ <<: *aci_dhcp_option_update
+ state: absent
+ check_mode: true
+ register: cm_remove_dhcp_option
+
+ - name: Remove DHCP option (normal_mode)
+ cisco.aci.aci_dhcp_option:
+ <<: *dhcp_option_absent
+ register: nm_remove_dhcp_option
+
+ - name: Remove DHCP option - testing idempotency
+ cisco.aci.aci_dhcp_option:
+ <<: *dhcp_option_absent
+ register: nm_remove_dhcp_option_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_dhcp_option is changed
+ - cm_remove_dhcp_option.proposed == {}
+ - nm_remove_dhcp_option is changed
+ - nm_remove_dhcp_option.previous != []
+ - nm_remove_dhcp_option.method == "DELETE"
+ - nm_remove_dhcp_option_idempotency is not changed
+ - nm_remove_dhcp_option_idempotency.previous == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/tasks/main.yml
new file mode 100644
index 000000000..48e721254
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_option_policy/tasks/main.yml
@@ -0,0 +1,139 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # CREATE DHCP OPTION POLICY
+ - name: Add a DHCP option policy (check_mode)
+ cisco.aci.aci_dhcp_option_policy: &aci_dhcp_option_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ dhcp_option_policy: ansible_dhcp_option_policy_1
+ description: DHCP option policy 1 for ansible_tenant tenant
+ state: present
+ check_mode: true
+ register: cm_add_dhcp_option_policy
+
+ - name: Add a DHCP option policy (normal_mode)
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *aci_dhcp_option_policy_present
+ register: nm_add_dhcp_option_policy
+
+ - name: Add the first DHCP option policy again - testing idempotency
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *aci_dhcp_option_policy_present
+ register: nm_add_dhcp_option_policy_idempotency
+
+ - name: Add a second DHCP option policy (normal_mode)
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ dhcp_option_policy: ansible_dhcp_option_policy_2
+ description: DHCP option policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_dhcp_option_policy_2
+
+ - name: Asserts for DHCP option policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_dhcp_option_policy is changed
+ - cm_add_dhcp_option_policy.previous == []
+ - cm_add_dhcp_option_policy.current == []
+ - nm_add_dhcp_option_policy is changed
+ - nm_add_dhcp_option_policy.current.0.dhcpOptionPol.attributes.name == "ansible_dhcp_option_policy_1"
+ - nm_add_dhcp_option_policy_idempotency is not changed
+ - nm_add_dhcp_option_policy_2 is changed
+ - nm_add_dhcp_option_policy_2.previous == []
+ - nm_add_dhcp_option_policy_2.current.0.dhcpOptionPol.attributes.name == "ansible_dhcp_option_policy_2"
+
+ # QUERY DHCP OPTION POLICY
+ - name: Query all DHCP option policies
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_dhcp_option_policy
+
+ - name: Query ansible_dhcp_option_policy_1
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *aci_dhcp_option_policy_present
+ state: query
+ register: query_ansible_dhcp_option_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_dhcp_option_policy is not changed
+ - query_all_dhcp_option_policy.current|length >= 2
+ - query_ansible_dhcp_option_policy_1 is not changed
+ - query_ansible_dhcp_option_policy_1.current.0.dhcpOptionPol.attributes.name == "ansible_dhcp_option_policy_1"
+
+ # DELETE DHCP OPTION POLICY
+ - name: Remove DHCP option policy (check_mode)
+ cisco.aci.aci_dhcp_option_policy: &dhcp_option_policy_absent
+ <<: *aci_dhcp_option_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_dhcp_option_policy
+
+ - name: Remove DHCP option policy (normal_mode)
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *dhcp_option_policy_absent
+ register: nm_remove_dhcp_option_policy
+
+ - name: Remove DHCP option policy - testing idempotency
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *dhcp_option_policy_absent
+ register: nm_remove_dhcp_option_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_dhcp_option_policy is changed
+ - cm_remove_dhcp_option_policy.proposed == {}
+ - nm_remove_dhcp_option_policy is changed
+ - nm_remove_dhcp_option_policy.previous != []
+ - nm_remove_dhcp_option_policy.method == "DELETE"
+ - nm_remove_dhcp_option_policy_idempotency is not changed
+ - nm_remove_dhcp_option_policy_idempotency.previous == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay/tasks/main.yml
index da10cc2d8..93048e853 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,7 +22,7 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
@@ -34,7 +34,7 @@
state: absent
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
@@ -51,7 +51,7 @@
register: add_dhcp_relay
- name: Verify DHCP Relay creation
- assert:
+ ansible.builtin.assert:
that:
- add_dhcp_relay is changed
- add_dhcp_relay.current.0.dhcpRelayP.attributes.annotation == 'orchestrator:ansible'
@@ -71,7 +71,7 @@
register: add_dhcp_relay_again
- name: Verify DHCP Relay idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_dhcp_relay_again is not changed
- add_dhcp_relay_again.current.0.dhcpRelayP.attributes.dn == "uni/tn-ansible_tenant/relayp-ansible_dhcp_relay"
@@ -90,7 +90,7 @@
register: update_dhcp_relay
- name: Verify DHCP Relay change
- assert:
+ ansible.builtin.assert:
that:
- update_dhcp_relay is changed
- update_dhcp_relay.current.0.dhcpRelayP.attributes.dn == "uni/tn-ansible_tenant/relayp-ansible_dhcp_relay"
@@ -115,7 +115,7 @@
register: add_global_dhcp_relay
- name: Verify Global DHCP Relay creation
- assert:
+ ansible.builtin.assert:
that:
- add_global_dhcp_relay is changed
- add_global_dhcp_relay.current.0.dhcpRelayP.attributes.annotation == 'orchestrator:ansible'
@@ -134,7 +134,7 @@
register: query_dhcp_relay
- name: Verify DHCP Relay query
- assert:
+ ansible.builtin.assert:
that:
- query_dhcp_relay is not changed
- query_dhcp_relay.current.0.dhcpRelayP.attributes.dn == "uni/tn-ansible_tenant/relayp-ansible_dhcp_relay"
@@ -150,7 +150,7 @@
register: query_dhcp_relay_all
- name: Verify query idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_dhcp_relay_all is not changed
- query_dhcp_relay_all.current.0.fvTenant.children | length >= 2
@@ -164,7 +164,7 @@
register: query_global_dhcp_relay
- name: Verify Global DHCP Relay query
- assert:
+ ansible.builtin.assert:
that:
- query_global_dhcp_relay is not changed
- query_global_dhcp_relay.current.0.dhcpRelayP.attributes.dn == "uni/infra/relayp-ansible_global_dhcp_relay"
@@ -179,7 +179,7 @@
register: query_global_dhcp_relay_all
- name: Verify query idempotence for Global DHCP Relay
- assert:
+ ansible.builtin.assert:
that:
- query_global_dhcp_relay_all is not changed
- query_global_dhcp_relay_all.current | length >= 3
@@ -194,7 +194,7 @@
register: delete_dhcp_relay
- name: Verify DHCP Relay deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_dhcp_relay is changed
- delete_dhcp_relay.current == []
@@ -212,7 +212,7 @@
register: delete_dhcp_relay_again
- name: Verify DHCP Relay deletion idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_dhcp_relay_again is not changed
@@ -225,7 +225,7 @@
register: delete_global_dhcp_relay
- name: Verify Global DHCP Relay deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_global_dhcp_relay is changed
- delete_global_dhcp_relay.current == []
@@ -236,7 +236,7 @@
# CLEAN ENVIRONMENT AGAIN
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay_provider/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay_provider/tasks/main.yml
index c133e23ba..078be3f38 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay_provider/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dhcp_relay_provider/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,11 +21,11 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
@@ -54,7 +54,7 @@
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
@@ -219,7 +219,7 @@
register: add_dn_relay_provider
- name: Confirm DHCP relay provider creation
- assert:
+ ansible.builtin.assert:
that:
- add_epg_relay_provider is changed
- add_epg_relay_provider.current.0.dhcpRsProv.attributes.annotation == 'orchestrator:ansible'
@@ -289,7 +289,7 @@
register: add_dn_relay_provider_again
- name: Confirm DHCP relay provider idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_epg_relay_provider_again is not changed
- add_epg_relay_provider_again.current.0.dhcpRsProv.attributes.dn == "uni/tn-ansible_tenant/relayp-ansible_dhcp_relay/rsprov-[uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg]"
@@ -358,7 +358,7 @@
register: update_dn_relay_provider
- name: Confirm DHCP relay provider update
- assert:
+ ansible.builtin.assert:
that:
- update_epg_relay_provider is changed
- update_epg_relay_provider.current.0.dhcpRsProv.attributes.dn == "uni/tn-ansible_tenant/relayp-ansible_dhcp_relay/rsprov-[uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg]"
@@ -429,7 +429,7 @@
register: query_all_relay_provider
- name: Confirm DHCP relay provider query
- assert:
+ ansible.builtin.assert:
that:
- query_epg_relay_provider is not changed
- query_epg_relay_provider.current.0.dhcpRsProv.attributes.dn == "uni/tn-ansible_tenant/relayp-ansible_dhcp_relay/rsprov-[uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg]"
@@ -510,7 +510,7 @@
register: add_global_dn_relay_provider
- name: Confirm Global DHCP relay provider creation
- assert:
+ ansible.builtin.assert:
that:
- err_global_epg_relay_provider is failed
- err_global_epg_relay_provider.msg == "provider_tenant is required when epg_type is epg"
@@ -582,7 +582,7 @@
register: query_global_all_relay_provider
- name: Confirm DHCP relay provider query
- assert:
+ ansible.builtin.assert:
that:
- query_global_epg_relay_provider is not changed
- query_global_epg_relay_provider.current.0.dhcpRsProv.attributes.dn == "uni/infra/relayp-ansible_global_dhcp_relay/rsprov-[uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg]"
@@ -649,7 +649,7 @@
register: delete_dn_relay_provider
- name: Confirm DHCP relay provider removal
- assert:
+ ansible.builtin.assert:
that:
- delete_epg_relay_provider is changed
- delete_epg_relay_provider.current == []
@@ -717,7 +717,7 @@
register: delete_dn_relay_provider_again
- name: Confirm DHCP relay provider removal
- assert:
+ ansible.builtin.assert:
that:
- delete_epg_relay_provider_again is not changed
- delete_l2_relay_provider_again is not changed
@@ -768,7 +768,7 @@
register: delete_global_dn_relay_provider
- name: Confirm DHCP relay provider removal
- assert:
+ ansible.builtin.assert:
that:
- delete_global_epg_relay_provider is changed
- delete_global_epg_relay_provider.current == []
@@ -792,7 +792,7 @@
# CLEAN ENVIRONMENT AGAIN
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_domain/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_domain/tasks/main.yml
index af9c1026b..d0fe0b29d 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_domain/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_domain/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -45,7 +45,7 @@
register: add_dns_domain
- name: Verify DNS domain creation
- assert:
+ ansible.builtin.assert:
that:
- add_dns_domain is changed
- add_dns_domain.current.0.dnsDomain.attributes.annotation == 'orchestrator:ansible'
@@ -64,7 +64,7 @@
register: add_dns_domain_again
- name: Verify DNS domain creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_dns_domain_again is not changed
- add_dns_domain_again.current.0.dnsDomain.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile/dom-example.com"
@@ -82,7 +82,7 @@
register: update_dns_domain
- name: Verify DNS domain update
- assert:
+ ansible.builtin.assert:
that:
- update_dns_domain is changed
- update_dns_domain.current.0.dnsDomain.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile/dom-example.com"
@@ -99,7 +99,7 @@
register: query_dns_domain
- name: Verify DNS domain attributes
- assert:
+ ansible.builtin.assert:
that:
- query_dns_domain is not changed
- query_dns_domain.current.0.dnsDomain.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile/dom-example.com"
@@ -115,7 +115,7 @@
register: query_dns_domain_all
- name: Verify DNS domain query idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_dns_domain_all is not changed
@@ -129,7 +129,7 @@
register: delete_dns_domain
- name: Verify DNS domain deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_dns_domain is changed
- delete_dns_domain.current == []
@@ -147,7 +147,7 @@
register: delete_dns_domain_again
- name: Verify DNS domain deletion idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_dns_domain_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_profile/tasks/main.yml
index 126bb27a6..027532f63 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_profile/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -29,7 +29,7 @@
register: add_dns_profile
- name: Verify that DNS profile has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_dns_profile is changed
- add_dns_profile.current.0.dnsProfile.attributes.annotation == 'orchestrator:ansible'
@@ -45,7 +45,7 @@
register: add_dns_profile_again
- name: Verify that DNS profile creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_dns_profile_again is not changed
- add_dns_profile_again.current.0.dnsProfile.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile"
@@ -60,7 +60,7 @@
register: query_dns_profile
- name: Verify DNS profile
- assert:
+ ansible.builtin.assert:
that:
- query_dns_profile is not changed
- query_dns_profile.current.0.dnsProfile.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile"
@@ -73,7 +73,7 @@
register: query_dns_profile_all
- name: Verify query idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_dns_profile_all is not changed
@@ -86,7 +86,7 @@
register: remove_dns_profile
- name: Verify DNS profile removal
- assert:
+ ansible.builtin.assert:
that:
- remove_dns_profile is changed
- remove_dns_profile.current == []
@@ -102,6 +102,6 @@
register: remove_dns_profile_again
- name: Verify DNS profile removal idempotence
- assert:
+ ansible.builtin.assert:
that:
- remove_dns_profile_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_provider/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_provider/tasks/main.yml
index 3e31d2b52..7f55e11c7 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_provider/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_dns_provider/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -45,7 +45,7 @@
register: add_dns_provider
- name: Verify DNS provider creation
- assert:
+ ansible.builtin.assert:
that:
- add_dns_provider is changed
- add_dns_provider.current.0.dnsProv.attributes.annotation == 'orchestrator:ansible'
@@ -64,7 +64,7 @@
register: add_dns_provider_again
- name: Verify DNS provider creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_dns_provider_again is not changed
- add_dns_provider_again.current.0.dnsProv.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile/prov-[10.20.30.40]"
@@ -82,7 +82,7 @@
register: update_dns_provider
- name: Verify DNS provider update
- assert:
+ ansible.builtin.assert:
that:
- update_dns_provider is changed
- update_dns_provider.current.0.dnsProv.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile/prov-[10.20.30.40]"
@@ -99,7 +99,7 @@
register: query_dns_provider
- name: Verify DNS provider attributes
- assert:
+ ansible.builtin.assert:
that:
- query_dns_provider is not changed
- query_dns_provider.current.0.dnsProv.attributes.dn == "uni/fabric/dnsp-ansible_dns_profile/prov-[10.20.30.40]"
@@ -115,7 +115,7 @@
register: query_dns_provider_all
- name: Verify DNS provider query idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_dns_provider_all is not changed
@@ -129,7 +129,7 @@
register: delete_dns_provider
- name: Verify DNS provider deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_dns_provider is changed
- delete_dns_provider.current == []
@@ -147,7 +147,7 @@
register: delete_dns_provider_again
- name: Verify DNS provider deletion idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_dns_provider_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/fc.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/fc.yml
index 2e2a8eb0b..ea27d4ba2 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/fc.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/fc.yml
@@ -40,7 +40,7 @@
register: nm_add_domain
- name: Verify FC add_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain is changed
- nm_add_domain is changed
@@ -61,7 +61,7 @@
register: nm_add_domain_again
- name: Verify FC add_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain_again is not changed
- nm_add_domain_again is not changed
@@ -172,7 +172,7 @@
register: nm_incorrect_enable_vm_folder
- name: Verify incorrect parameter
- assert:
+ ansible.builtin.assert:
that:
- cm_incorrect_vm_provider.msg == "Domain type 'fc' cannot have parameter 'vm_provider'"
- nm_incorrect_vm_provider.msg == "Domain type 'fc' cannot have parameter 'vm_provider'"
@@ -209,7 +209,7 @@
register: nm_query_all_domains
- name: Verify FC query_all_domains
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_domains is not changed
- nm_query_all_domains is not changed
@@ -232,7 +232,7 @@
register: nm_query_domain
- name: Verify FC query_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_domain is not changed
- nm_query_domain is not changed
@@ -252,7 +252,7 @@
register: nm_remove_domain
- name: Verify FC remove_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain is changed
- nm_remove_domain is changed
@@ -270,7 +270,7 @@
register: nm_remove_domain_again
- name: Verify FC remove_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain_again is not changed
- nm_remove_domain_again is not changed
@@ -291,7 +291,7 @@
register: nm_query_non_domain
- name: Verify FC query_non_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_domain is not changed
- nm_query_non_domain is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l2dom.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l2dom.yml
index 4f0084174..031944789 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l2dom.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l2dom.yml
@@ -40,7 +40,7 @@
register: nm_add_domain
- name: Verify L2 add_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain is changed
- nm_add_domain is changed
@@ -61,7 +61,7 @@
register: nm_add_domain_again
- name: Verify L2 add_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain_again is not changed
- nm_add_domain_again is not changed
@@ -127,7 +127,7 @@
register: nm_incorrect_vswitch
- name: Verify incorrect parameter
- assert:
+ ansible.builtin.assert:
that:
- cm_incorrect_vm_provider.msg == "Domain type 'l2dom' cannot have parameter 'vm_provider'"
- nm_incorrect_vm_provider.msg == "Domain type 'l2dom' cannot have parameter 'vm_provider'"
@@ -158,7 +158,7 @@
register: nm_query_all_domains
- name: Verify L2 query_all_domains
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_domains is not changed
- nm_query_all_domains is not changed
@@ -181,7 +181,7 @@
register: nm_query_domain
- name: Verify L2 query_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_domain is not changed
- nm_query_domain is not changed
@@ -201,7 +201,7 @@
register: nm_remove_domain
- name: Verify L2 remove_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain is changed
- nm_remove_domain is changed
@@ -219,7 +219,7 @@
register: nm_remove_domain_again
- name: Verify L2 remove_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain_again is not changed
- nm_remove_domain_again is not changed
@@ -240,7 +240,7 @@
register: nm_query_non_domain
- name: Verify L2 query_non_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_domain is not changed
- nm_query_non_domain is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l3dom.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l3dom.yml
index 61677d897..aaa55eae8 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l3dom.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/l3dom.yml
@@ -40,7 +40,7 @@
register: nm_add_domain
- name: Verify L3 add_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain is changed
- nm_add_domain is changed
@@ -61,7 +61,7 @@
register: nm_add_domain_again
- name: Verify L3 add_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain_again is not changed
- nm_add_domain_again is not changed
@@ -127,7 +127,7 @@
register: nm_incorrect_vswitch
- name: Verify incorrect parameter
- assert:
+ ansible.builtin.assert:
that:
- cm_incorrect_vm_provider.msg == "Domain type 'l3dom' cannot have parameter 'vm_provider'"
- nm_incorrect_vm_provider.msg == "Domain type 'l3dom' cannot have parameter 'vm_provider'"
@@ -159,7 +159,7 @@
register: nm_query_all_domains
- name: Verify query_all_domains
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_domains is not changed
- nm_query_all_domains is not changed
@@ -182,7 +182,7 @@
register: nm_query_domain
- name: Verify L3 query_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_domain is not changed
- nm_query_domain is not changed
@@ -202,7 +202,7 @@
register: nm_remove_domain
- name: Verify L3 remove_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain is changed
- nm_remove_domain is changed
@@ -220,7 +220,7 @@
register: nm_remove_domain_again
- name: Verify L3 remove_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain_again is not changed
- nm_remove_domain_again is not changed
@@ -241,7 +241,7 @@
register: nm_query_non_domain
- name: Verify L3 query_non_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_domain is not changed
- nm_query_non_domain is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/main.yml
index be6c9712d..591c01b22 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/phys.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/phys.yml
index 39f87a6f0..c12b09ace 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/phys.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/phys.yml
@@ -40,7 +40,7 @@
register: nm_add_domain
- name: Verify physical add_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain is changed
- nm_add_domain is changed
@@ -61,7 +61,7 @@
register: nm_add_domain_again
- name: Verify physical add_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain_again is not changed
- nm_add_domain_again is not changed
@@ -127,7 +127,7 @@
register: nm_incorrect_vswitch
- name: Verify incorrect parameter
- assert:
+ ansible.builtin.assert:
that:
- cm_incorrect_vm_provider.msg == "Domain type 'phys' cannot have parameter 'vm_provider'"
- nm_incorrect_vm_provider.msg == "Domain type 'phys' cannot have parameter 'vm_provider'"
@@ -158,7 +158,7 @@
register: nm_query_all_domains
- name: Verify physical query_all_domains
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_domains is not changed
- nm_query_all_domains is not changed
@@ -181,7 +181,7 @@
register: nm_query_domain
- name: Verify physical query_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_domain is not changed
- nm_query_domain is not changed
@@ -201,7 +201,7 @@
register: nm_remove_domain
- name: Verify physical remove_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain is changed
- nm_remove_domain is changed
@@ -219,7 +219,7 @@
register: nm_remove_domain_again
- name: Verify physical remove_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain_again is not changed
- nm_remove_domain_again is not changed
@@ -240,7 +240,7 @@
register: nm_query_non_domain
- name: Verify physical query_non_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_domain is not changed
- nm_query_non_domain is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/vmm-vmware.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/vmm-vmware.yml
index 03d82788c..2f0372186 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/vmm-vmware.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain/tasks/vmm-vmware.yml
@@ -19,7 +19,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will skip execution for cloud sites
@@ -48,7 +48,7 @@
register: nm_add_domain
- name: Verify VMM add_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain is changed
- nm_add_domain is changed
@@ -69,7 +69,7 @@
register: nm_add_domain_again
- name: Verify VMM add_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_domain_again is not changed
- nm_add_domain_again is not changed
@@ -92,7 +92,7 @@
when: version.current.0.topSystem.attributes.version is version('4.1', '>=')
- name: Verify update_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_update_domain is changed
- nm_update_domain is changed
@@ -123,7 +123,7 @@
register: nm_query_all_domains
- name: Verify query_all_domains
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_domains is not changed
- nm_query_all_domains is not changed
@@ -148,7 +148,7 @@
register: nm_query_domain
- name: Verify VMM query_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_domain is not changed
- nm_query_domain is not changed
@@ -167,7 +167,7 @@
register: nm_remove_domain
- name: Verify VMM remove_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain is changed
- nm_remove_domain is changed
@@ -186,7 +186,7 @@
register: nm_remove_domain_again
- name: Verify VMM remove_domain_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_domain_again is not changed
- nm_remove_domain_again is not changed
@@ -209,7 +209,7 @@
register: nm_query_non_domain
- name: Verify VMM query_non_domain
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_domain is not changed
- nm_query_non_domain is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_encap_pool/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_encap_pool/tasks/main.yml
index f028e2c56..77c824300 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_encap_pool/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_encap_pool/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,11 +20,11 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
# Clean Environment
- name: Remove domains
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: '{{ item.name }}'
domain_type: '{{ item.type }}'
@@ -36,7 +36,7 @@
- { name: l3_dom, type: l3dom }
- name: Remove domains
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -56,7 +56,7 @@
block: # block specifies execution of tasks within, based on conditions
# Add
- name: Add physical domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: phys_dom
domain_type: phys
@@ -64,7 +64,7 @@
register: phys_domain
- name: Add l2 domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: l2_dom
domain_type: l2dom
@@ -72,7 +72,7 @@
register: l2_domain
- name: Add l3 domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: l3_dom
domain_type: l3dom
@@ -80,7 +80,7 @@
register: l3_domain
- name: Add FC domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: fc_dom
domain_type: fc
@@ -88,7 +88,7 @@
register: fc_domain
- name: Add vmm domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -97,7 +97,7 @@
register: vmm_domain
- name: Add domain to encap pool binding (phys, pool_type=vlan)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: phys_dom
domain_type: phys
@@ -108,7 +108,7 @@
register: phys_vlan
- name: Add domain to encap pool binding (fc, pool_type=vsan)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: fc_dom
domain_type: fc
@@ -119,7 +119,7 @@
register: fc_vsan
- name: Add domain to encap pool binding (domain_type=l2dom)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: l2_dom
domain_type: l2dom
@@ -130,7 +130,7 @@
register: l2dom
- name: Add domain to encap pool binding (domain_type=l3dom)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: l3_dom
domain_type: l3dom
@@ -141,7 +141,7 @@
register: l3dom
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=cloudfoundry)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -153,7 +153,7 @@
register: vmm_cloudfoundry
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=kubernetes)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -165,7 +165,7 @@
register: vmm_kubernetes
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=microsoft)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -177,7 +177,7 @@
register: vmm_microsoft
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=openshift)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -189,7 +189,7 @@
register: vmm_openshift
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=openstack)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -201,7 +201,7 @@
register: vmm_openstack
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=redhat)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -213,7 +213,7 @@
register: vmm_redhat
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=vmware)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -225,7 +225,7 @@
register: vmm_vmware
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=vmware) again
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -237,7 +237,7 @@
register: vmm_vmware_idemp
- name: Add domain to encap pool binding (phys with vm_provider)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: phys_dom
domain_type: phys
@@ -250,7 +250,7 @@
register: phys_vlan_with_vmm
- name: Add domain to encap pool binding (phys, pool_type=vlan, no allocation mode)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: phys_dom
domain_type: phys
@@ -261,7 +261,7 @@
register: phys_vlan_no_alloc
- name: Add domain to encap pool binding (domain_type=vmm, vm_provider=vmware, pool_type=vxlan)
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -274,7 +274,7 @@
register: vmm_vmware_vxlan
- name: Add domain to encap pool binding (phys, pool_type=vlan) missing domain_type
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: phys_dom
pool: test_pool
@@ -285,7 +285,7 @@
register: phys_missing_domain_type
- name: Add domain to encap pool binding (phys, pool_type=vlan) missing pool_type
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: phys_dom
domain_type: phys
@@ -296,7 +296,7 @@
register: phys_missing_pool_type
- name: Verify add operation for All Sites
- assert:
+ ansible.builtin.assert:
that:
- phys_vlan is changed
- fc_vsan is changed
@@ -316,7 +316,7 @@
- phys_missing_domain_type.msg is match("missing required arguments{{':'}} domain_type")
- name: Verify add operation for Non-Cloud Sites
- assert:
+ ansible.builtin.assert:
that:
- vmm_cloudfoundry is changed
- vmm_openshift is changed
@@ -333,7 +333,7 @@
# QUERY
- name: Query all
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: phys
pool_type: vlan
@@ -341,7 +341,7 @@
register: query_all
- name: Query phys
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: phys_dom
domain_type: phys
@@ -350,7 +350,7 @@
register: query_phys
- name: Query fc
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: fc_dom
domain_type: fc
@@ -359,7 +359,7 @@
register: query_fc
- name: Query l2dom
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: l2_dom
domain_type: l2dom
@@ -368,7 +368,7 @@
register: query_l2dom
- name: Query l3dom
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: l3_dom
domain_type: l3dom
@@ -377,7 +377,7 @@
register: query_l3dom
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -387,7 +387,7 @@
register: query_vmm_microsoft
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -397,7 +397,7 @@
register: query_vmm_cloudfoundry
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -407,7 +407,7 @@
register: query_vmm_kubernetes
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -417,7 +417,7 @@
register: query_vmm_openshift
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -427,7 +427,7 @@
register: query_vmm_openstack
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -437,7 +437,7 @@
register: query_vmm_redhat
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -447,7 +447,7 @@
register: query_vmm_vmware
- name: Query vmm
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
@@ -457,7 +457,7 @@
register: query_vmm_vmware
- name: Verify Query for Non-Cloud sites
- assert:
+ ansible.builtin.assert:
that:
- query_all | length >=1
- query_phys.current.0.physDomP.children.0.infraRsVlanNs.attributes.tDn =='uni/infra/vlanns-[test_pool]-dynamic'
@@ -468,7 +468,7 @@
- name: Verify Query for Cloud sites
- assert:
+ ansible.builtin.assert:
that:
- query_vmm_cloudfoundry.current.0.vmmDomP.children.0.infraRsVlanNs.attributes.tDn == 'uni/infra/vlanns-[test_pool]-dynamic'
- query_vmm_microsoft.current.0.vmmDomP.children.0.infraRsVlanNs.attributes.tDn == 'uni/infra/vlanns-[test_pool]-dynamic'
@@ -479,7 +479,7 @@
# REMOVE
- name: Remove phys
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: phys
domain: phys_dom
@@ -490,7 +490,7 @@
register: remove_phys
- name: Remove fc
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: fc
domain: fc_dom
@@ -501,7 +501,7 @@
register: remove_fc
- name: Remove l2dom
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: l2dom
domain: l2_dom
@@ -512,7 +512,7 @@
register: remove_l2dom
- name: Remove l3dom
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: l3dom
domain: l3_dom
@@ -523,7 +523,7 @@
register: remove_l3dom
- name: Remove vmm cloudfoundry
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: vmm
domain: vmm_dom
@@ -535,7 +535,7 @@
register: remove_vmm_cloudfoundry
- name: Remove vmm redhat kubernetes
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: vmm
domain: vmm_dom
@@ -547,7 +547,7 @@
register: remove_vmm_kubernetes
- name: Remove vmm microsoft
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: vmm
domain: vmm_dom
@@ -559,7 +559,7 @@
register: remove_vmm_microsoft
- name: Remove vmm redhat
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: vmm
domain: vmm_dom
@@ -571,7 +571,7 @@
register: remove_vmm_redhat
- name: Remove vmm openstack
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: vmm
domain: vmm_dom
@@ -583,7 +583,7 @@
register: remove_vmm_openstack
- name: Remove vmm openshift
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: vmm
domain: vmm_dom
@@ -595,7 +595,7 @@
register: remove_vmm_openshift
- name: Remove vmm vmware
- aci_domain_to_encap_pool:
+ cisco.aci.aci_domain_to_encap_pool:
<<: *aci_info
domain_type: vmm
domain: vmm_dom
@@ -607,7 +607,7 @@
register: remove_vmm_vmware
- name: Verify Remove for All Sites
- assert:
+ ansible.builtin.assert:
that:
- remove_phys.previous.0.physDomP.children.0.infraRsVlanNs.attributes.tDn =='uni/infra/vlanns-[test_pool]-dynamic'
- remove_fc.previous.0.fcDomP.children.0.fcRsVsanNs.attributes.tDn == 'uni/infra/vsanns-[test_pool]-dynamic'
@@ -616,7 +616,7 @@
- remove_vmm_kubernetes.previous.0.vmmDomP.children.0.infraRsVlanNs.attributes.tDn == 'uni/infra/vlanns-[test_pool]-dynamic'
- name: Verify Remove for Non-Cloud Sites
- assert:
+ ansible.builtin.assert:
that:
- remove_vmm_cloudfoundry.previous.0.vmmDomP.children.0.infraRsVlanNs.attributes.tDn == 'uni/infra/vlanns-[test_pool]-dynamic'
- remove_vmm_microsoft.previous.0.vmmDomP.children.0.infraRsVlanNs.attributes.tDn == 'uni/infra/vlanns-[test_pool]-dynamic'
@@ -627,7 +627,7 @@
# Clean Environment Again
- name: Remove domains
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: '{{ item.name }}'
domain_type: '{{ item.type }}'
@@ -639,7 +639,7 @@
- { name: l3_dom, type: l3dom }
- name: Remove domains
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: vmm_dom
domain_type: vmm
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml
index ab10856a8..e8c14fc55 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_domain_to_vlan_pool/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -81,7 +81,7 @@
register: nm_add_binding
- name: Verify add_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_add_binding is changed
- nm_add_binding is changed
@@ -105,7 +105,7 @@
register: nm_add_binding_again
- name: Verify add_binding_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_binding_again is not changed
- nm_add_binding_again is not changed
@@ -150,7 +150,7 @@
register: nm_vmm_type
- name: Verify bindings with domain types
- assert:
+ ansible.builtin.assert:
that:
- err_not_vmm_with_vm_provider is not changed
- err_not_vmm_with_vm_provider.msg == "Domain type 'phys' cannot have a 'vm_provider'"
@@ -182,7 +182,7 @@
register: nm_query_all_bindings
- name: Verify query_all_bindings
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_bindings is not changed
- nm_query_all_bindings is not changed
@@ -209,7 +209,7 @@
register: nm_query_binding
- name: Verify query_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_query_binding is not changed
- nm_query_binding is not changed
@@ -231,7 +231,7 @@
register: nm_remove_binding
- name: Verify remove_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_binding is changed
- nm_remove_binding is changed
@@ -250,7 +250,7 @@
register: nm_remove_binding_again
- name: Verify remove_binding_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_binding_again is not changed
- nm_remove_binding_again is not changed
@@ -275,7 +275,7 @@
register: nm_query_non_binding
- name: Verify query_non_binding
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_binding is not changed
- nm_query_non_binding is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/main.yml
index f0e61a7ef..4c5bd5578 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: test that we have an aci apic host, aci username and aci password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vlan.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vlan.yml
index 1354c149a..abfcda88f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vlan.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vlan.yml
@@ -27,7 +27,7 @@
register: create_check_mode
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- create_check_mode is changed
- create_check_mode.sent.fvnsVlanInstP.attributes.allocMode == 'static'
@@ -40,7 +40,7 @@
register: create_static
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- create_static is changed
- create_static.previous == []
@@ -54,7 +54,7 @@
register: create_dynamic
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- create_dynamic is changed
- create_dynamic.previous == []
@@ -69,7 +69,7 @@
register: idempotent_static
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- idempotent_static is not changed
- idempotent_static.previous.0.fvnsVlanInstP.attributes.allocMode == 'static'
@@ -84,7 +84,7 @@
register: idempotent_dynamic
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- idempotent_dynamic is not changed
- idempotent_dynamic.previous.0.fvnsVlanInstP.attributes.allocMode == 'dynamic'
@@ -100,7 +100,7 @@
register: update_static
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- update_static is changed
- update_static.sent.fvnsVlanInstP.attributes.descr == 'Ansible Test Change'
@@ -112,7 +112,7 @@
register: update_dynamic
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- update_dynamic is changed
- update_dynamic.sent.fvnsVlanInstP.attributes.descr == 'Ansible Test Change'
@@ -125,7 +125,7 @@
register: vlan_alloc_fail
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- vlan_alloc_fail is failed
- "vlan_alloc_fail.msg == 'ACI requires parameter \\'pool_allocation_mode\\' for \\'pool_type\\' of \\'vlan\\' and \\'vsan\\' when parameter \\'pool\\' is provided'"
@@ -138,7 +138,7 @@
register: vlan_pool_fail
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- vlan_pool_fail is failed
- 'vlan_pool_fail.msg == "state is present but all of the following are missing: pool"'
@@ -151,7 +151,7 @@
register: vlan_pool_type_fail
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- vlan_pool_type_fail is failed
- 'vlan_pool_type_fail.msg == "missing required arguments: pool_type"'
@@ -165,7 +165,7 @@
register: get_all_pools
- name: assertion test - query
- assert:
+ ansible.builtin.assert:
that:
- get_all_pools is not changed
- get_all_pools.method == "GET"
@@ -178,7 +178,7 @@
register: get_static_pool
- name: assertion test - query
- assert:
+ ansible.builtin.assert:
that:
- get_static_pool is not changed
- get_static_pool.method == "GET"
@@ -193,7 +193,7 @@
register: get_dynamic_pool
- name: assertion test - query
- assert:
+ ansible.builtin.assert:
that:
- get_dynamic_pool is not changed
- get_dynamic_pool.method == "GET"
@@ -210,7 +210,7 @@
register: vlan_query_pool_type_fail
- name: assertion test - query
- assert:
+ ansible.builtin.assert:
that:
- vlan_query_pool_type_fail is failed
- 'vlan_query_pool_type_fail.msg == "missing required arguments: pool_type"'
@@ -221,7 +221,7 @@
register: delete_static
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- delete_static is changed
- delete_static.method == "DELETE"
@@ -235,7 +235,7 @@
register: delete_check_mode
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- delete_check_mode is changed
@@ -245,7 +245,7 @@
register: delete_dynamic
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- delete_dynamic is changed
- delete_dynamic.method == "DELETE"
@@ -258,7 +258,7 @@
register: idempotent_delete_static
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- idempotent_delete_static is not changed
- idempotent_delete_static.previous == []
@@ -269,7 +269,7 @@
register: idempotent_delete_dynamic
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- idempotent_delete_dynamic is not changed
- idempotent_delete_dynamic.previous == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vxlan.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vxlan.yml
index 6467af376..35b211233 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vxlan.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool/tasks/vxlan.yml
@@ -31,7 +31,7 @@
register: create_vxlan_check_mode
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- create_vxlan_check_mode is changed
- create_vxlan_check_mode.sent.fvnsVxlanInstP.attributes.descr == 'Ansible Test'
@@ -43,7 +43,7 @@
register: create_vxlan
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- create_vxlan is changed
- create_vxlan.previous == []
@@ -56,7 +56,7 @@
register: idempotent_vxlan
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- idempotent_vxlan is not changed
- idempotent_vxlan.previous.0.fvnsVxlanInstP.attributes.name == 'anstest'
@@ -69,7 +69,7 @@
register: update_vxlan
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- update_vxlan is changed
- update_vxlan.sent.fvnsVxlanInstP.attributes.descr == 'Ansible Test Change'
@@ -81,7 +81,7 @@
register: create_vxlan_2
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- create_vxlan_2 is changed
@@ -94,7 +94,7 @@
register: create_vxlan_alloc_mode
- name: assertion test - present
- assert:
+ ansible.builtin.assert:
that:
- create_vxlan_alloc_mode is failed
- "create_vxlan_alloc_mode.msg == 'vxlan pools do not support setting the \\'pool_allocation_mode\\'; please remove this parameter from the task'"
@@ -106,7 +106,7 @@
register: query_vxlan
- name: assertion test - query
- assert:
+ ansible.builtin.assert:
that:
- query_vxlan is not changed
- query_vxlan.current | length == 1
@@ -119,7 +119,7 @@
register: query_vxlan_all
- name: assertion test - query
- assert:
+ ansible.builtin.assert:
that:
- query_vxlan_all is not changed
- query_vxlan_all.current | length > 1
@@ -132,7 +132,7 @@
register: delete_vxlan_check_mode
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- delete_vxlan_check_mode is changed
- delete_vxlan_check_mode.previous != []
@@ -143,7 +143,7 @@
register: delete_vxlan
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- delete_vxlan is changed
- delete_vxlan.previous == delete_vxlan_check_mode.previous
@@ -162,7 +162,7 @@
register: delete_vxlan_pool_fail
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- delete_vxlan_idempotent is not changed
- delete_vxlan_idempotent.previous == []
@@ -173,7 +173,7 @@
pool: anstest_2
- name: assertion test - absent
- assert:
+ ansible.builtin.assert:
that:
- delete_vxlan_pool_fail is failed
- 'delete_vxlan_pool_fail.msg == "state is absent but all of the following are missing: pool"'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/main.yml
index 005628c5d..1b4c1a942 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: test that we have an aci apic host, aci username and aci password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/vlan.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/vlan.yml
index 6af58bf5d..e82623a3c 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/vlan.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_encap_pool_range/tasks/vlan.yml
@@ -43,7 +43,7 @@
register: range_present_check_mode
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present_check_mode is changed
- range_present_check_mode.sent.fvnsEncapBlk.attributes.allocMode == 'inherit'
@@ -58,7 +58,7 @@
register: range_present
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present is changed
- range_present.previous == []
@@ -72,7 +72,7 @@
register: range_present_idempotent
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present_idempotent is not changed
- range_present_idempotent.previous.0.fvnsEncapBlk.attributes.name == "anstest"
@@ -85,7 +85,7 @@
register: range_present_update
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present_update is changed
- range_present_update.previous != []
@@ -100,7 +100,7 @@
register: range_present_2
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present_2 is changed
- range_present_2.previous == []
@@ -113,7 +113,7 @@
register: range_start_low
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_start_low is failed
- range_start_low.msg == 'vlan pools must have "range_start" and "range_end" values between 1 and 4094'
@@ -126,7 +126,7 @@
register: range_start_high
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_start_high is failed
- range_start_high.msg == 'vlan pools must have "range_start" and "range_end" values between 1 and 4094'
@@ -139,7 +139,7 @@
register: range_end_low
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_end_low is failed
- range_end_low.msg == 'vlan pools must have "range_start" and "range_end" values between 1 and 4094'
@@ -152,7 +152,7 @@
register: range_end_high
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_end_high is failed
- range_end_high.msg == 'vlan pools must have "range_start" and "range_end" values between 1 and 4094'
@@ -165,7 +165,7 @@
register: range_start_end
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_start_end is failed
- range_start_end.msg == 'The "range_start" must be less than or equal to the "range_end"'
@@ -178,7 +178,7 @@
register: range_present_pool_type
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present_pool_type is failed
- "range_present_pool_type.msg == 'missing required arguments: pool_type'"
@@ -190,7 +190,7 @@
register: range_present_missing_param
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present_missing_param is failed
- "range_present_missing_param.msg == 'state is present but all of the following are missing: range_end, range_start'"
@@ -203,7 +203,7 @@
register: range_present_allocation
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- range_present_allocation is failed
- range_present_allocation.msg == 'ACI requires the "pool_allocation_mode" for "pool_type" of "vlan" and "vsan" when the "pool" is provided'
@@ -215,7 +215,7 @@
register: range_query
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query is not changed
- range_query.url.endswith("infra/vlanns-[anstest]-static/from-[vlan-20]-to-[vlan-40].json")
@@ -229,7 +229,7 @@
register: range_query_from_to_name
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query_from_to_name is not changed
- range_query_from_to_name.url.endswith("class/fvnsEncapBlk.json")
@@ -247,7 +247,7 @@
register: range_query_from_name
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query_from_name is not changed
- range_query_from_name.url.endswith("class/fvnsEncapBlk.json")
@@ -263,7 +263,7 @@
register: range_query_to_name
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query_to_name is not changed
- range_query_to_name.url.endswith('class/fvnsEncapBlk.json')
@@ -280,7 +280,7 @@
register: range_query_name
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query_name is not changed
- range_query_name.url.endswith("class/fvnsEncapBlk.json")
@@ -294,7 +294,7 @@
register: range_query_from_to
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query_from_to is not changed
- range_query_from_to.url.endswith("class/fvnsEncapBlk.json")
@@ -311,7 +311,7 @@
register: range_query_pool
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query_pool.current | length == 1
- range_query_pool.current.0.fvnsVlanInstP.attributes.name == "anstest"
@@ -326,7 +326,7 @@
register: range_query_all
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- range_query_all is not changed
- range_query_all.current | length > 1
@@ -340,7 +340,7 @@
register: delete_range
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_range is changed
- delete_range.proposed == {}
@@ -354,7 +354,7 @@
register: delete_check_mode
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_check_mode is changed
- delete_check_mode.previous != []
@@ -365,7 +365,7 @@
register: delete_range_2
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_range_2 is changed
- delete_range_2.previous == delete_check_mode.previous
@@ -376,7 +376,7 @@
register: delete_idempotent
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_idempotent is not changed
- delete_idempotent.previous == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg/tasks/main.yml
index ffd3ac599..82587ec93 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg/tasks/main.yml
@@ -1,22 +1,20 @@
# Test code for the ACI modules
# Copyright: (c) 2017, Jacob McGill (@jmcgill298)
# Copyright: (c) 2020, Shreyas Srish (@shrsr)
+# Copyright: (c) 2023, Christian Kolrep (@Christian-Kolrep)
+# Copyright: (c) 2024, Akini Ross (@akinross)
+# Copyright: (c) 2024, Samita Bhattacharjee (@samiib) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
-- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
-
-- name: Execute tasks only for non-cloud sites
- when: query_cloud.current == [] # This condition will execute only non-cloud sites
- block: # block specifies execution of tasks within, based on conditions
- - name: ensure tenant exists for tests to kick off
- cisco.aci.aci_tenant: &aci_tenant_present
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
password: "{{ aci_password }}"
@@ -24,35 +22,57 @@
use_ssl: '{{ aci_use_ssl | default(true) }}'
use_proxy: '{{ aci_use_proxy | default(true) }}'
output_level: debug
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Ensure tenant exists for tests to kick off
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
state: present
tenant: ansible_test
register: tenant_present
- - name: ensure monitoring policy exists
+ - name: Ensure monitoring policy exists
cisco.aci.aci_epg_monitoring_policy:
- host: "{{ aci_hostname }}"
- username: "{{ aci_username }}"
- password: "{{ aci_password }}"
- validate_certs: '{{ aci_validate_certs | default(false) }}'
- use_ssl: '{{ aci_use_ssl | default(true) }}'
- use_proxy: '{{ aci_use_proxy | default(true) }}'
- output_level: debug
+ <<: *aci_info
monitoring_policy: check
tenant: ansible_test
- - name: ensure bd exists for tests to kick off
+ - name: Ensure bd exists for tests to kick off
cisco.aci.aci_bd: &aci_bd_present
<<: *aci_tenant_present
bd: anstest
register: bd_present
- - name: ensure ap exists for tests to kick off
+ - name: Ensure ap exists for tests to kick off
cisco.aci.aci_ap: &aci_ap_present
<<: *aci_tenant_present
ap: anstest
register: ap_present
- - name: create epg - check mode works
+ - name: Ensure epg anstest dont exist for tests to kick off
+ cisco.aci.aci_epg:
+ <<: *aci_ap_present
+ epg: anstest
+ state: absent
+
+ - name: Ensure epg anstest2 dont exist for tests to kick off
+ cisco.aci.aci_epg:
+ <<: *aci_ap_present
+ epg: anstest2
+ state: absent
+
+ - name: Ensure epg anstest_useg_epg dont exist for tests to kick off
+ cisco.aci.aci_epg:
+ <<: *aci_ap_present
+ epg: anstest_useg_epg
+ state: absent
+
+ - name: Create epg - check mode works
cisco.aci.aci_epg: &aci_epg_present
<<: *aci_ap_present
epg: anstest
@@ -63,36 +83,36 @@
check_mode: true
register: epg_present_check_mode
- - name: create epg - creation works
+ - name: Create epg - creation works
cisco.aci.aci_epg:
<<: *aci_epg_present
register: epg_present
- - name: create epg - idempotency works
+ - name: Create epg - idempotency works
cisco.aci.aci_epg:
<<: *aci_epg_present
register: epg_present_idempotent
- - name: update epg - update works
+ - name: Update epg - update works
cisco.aci.aci_epg:
<<: *aci_epg_present
description: Ansible Test Update
register: epg_present_update
- - name: create epg - missing param
+ - name: Create epg - missing param
cisco.aci.aci_epg:
<<: *aci_epg_present
ap: "{{ fakevar | default(omit) }}"
ignore_errors: true
register: epg_present_missing_param
- - name: create epg - used for query
+ - name: Create epg - used for query
cisco.aci.aci_epg:
<<: *aci_epg_present
epg: anstest2
- - name: present assertions
- assert:
+ - name: Create and Update assertions
+ ansible.builtin.assert:
that:
- epg_present_check_mode is changed
- epg_present_check_mode.previous == []
@@ -110,21 +130,90 @@
- epg_present_missing_param is failed
- 'epg_present_missing_param.msg == "state is present but all of the following are missing: ap"'
- - name: get specific epg
+ # TEST NO VERIFICATION
+ - name: create epg with no verification (check mode)
+ cisco.aci.aci_epg: &aci_epg_no_verify
+ <<: *aci_epg_present
+ epg: anstest-no-verify
+ no_verification: true
+ check_mode: true
+ register: epg_present_no_verify_cm
+
+ - name: create epg with no verification
+ cisco.aci.aci_epg:
+ <<: *aci_epg_no_verify
+ register: epg_present_no_verify
+
+ - name: create epg with no verification again
+ cisco.aci.aci_epg:
+ <<: *aci_epg_no_verify
+ register: epg_present_no_verify_again
+
+ - name: update epg with no verification
+ cisco.aci.aci_epg:
+ <<: *aci_epg_no_verify
+ description: Ansible Test No Verify
+ register: update_epg_present_no_verify
+
+ - name: delete epg with no verification
+ cisco.aci.aci_epg:
+ <<: *aci_epg_no_verify
+ state: absent
+ register: delete_epg_present_no_verify
+
+ - name: delete epg with no verification again
+ cisco.aci.aci_epg:
+ <<: *aci_epg_no_verify
+ state: absent
+ register: delete_epg_present_no_verify_again
+
+ - name: no verification asserts
+ ansible.builtin.assert:
+ that:
+ - epg_present_no_verify_cm is changed
+ - epg_present_no_verify_cm.current_verified == false
+ - epg_present_no_verify_cm.current.0 == epg_present_no_verify_cm.proposed
+ - epg_present_no_verify is changed
+ - epg_present_no_verify.current_verified == false
+ - epg_present_no_verify.current.0 == epg_present_no_verify.proposed
+ - epg_present_no_verify.previous == []
+ - epg_present_no_verify_again is not changed
+ - epg_present_no_verify_again.current_verified == true
+ - epg_present_no_verify_again.current.0.fvAEPg.attributes.name == "anstest-no-verify"
+ - epg_present_no_verify_again.current.0.fvAEPg.attributes.descr == "Ansible Test"
+ - epg_present_no_verify_again.previous.0.fvAEPg.attributes.name == "anstest-no-verify"
+ - epg_present_no_verify_again.previous.0.fvAEPg.attributes.descr == "Ansible Test"
+ - update_epg_present_no_verify is changed
+ - update_epg_present_no_verify.current_verified == false
+ - update_epg_present_no_verify.current.0 == update_epg_present_no_verify.proposed
+ - update_epg_present_no_verify.previous.0.fvAEPg.attributes.name == "anstest-no-verify"
+ - update_epg_present_no_verify.previous.0.fvAEPg.attributes.descr == "Ansible Test"
+ - delete_epg_present_no_verify is changed
+ - delete_epg_present_no_verify.current_verified == false
+ - delete_epg_present_no_verify.current.0 == delete_epg_present_no_verify.proposed
+ - delete_epg_present_no_verify.previous.0.fvAEPg.attributes.name == "anstest-no-verify"
+ - delete_epg_present_no_verify.previous.0.fvAEPg.attributes.descr == "Ansible Test No Verify"
+ - delete_epg_present_no_verify_again is not changed
+ - delete_epg_present_no_verify_again.current_verified == true
+ - delete_epg_present_no_verify_again.current == []
+ - delete_epg_present_no_verify_again.previous == []
+ - delete_epg_present_no_verify_again.proposed == {}
+
+ - name: Query specific epg
cisco.aci.aci_epg:
<<: *aci_epg_present
state: query
register: epg_query
- - name: get all epgs
+ - name: Query all epgs
cisco.aci.aci_epg:
<<: *aci_tenant_present
state: query
tenant: "{{ fakevar | default(omit) }}"
register: epg_query_all
- - name: query assertions
- assert:
+ - name: Query assertions
+ ansible.builtin.assert:
that:
- epg_query is not changed
- epg_query.current | length == 1
@@ -134,40 +223,40 @@
- '"tn-ansible_test/ap-anstest/epg-anstest.json" in epg_query.url'
- epg_query_all is not changed
- epg_query_all.current | length > 1
- - '"?rsp-subtree=full&rsp-subtree-class=fvRsAEPgMonPol,fvRsBd" in epg_query_all.filter_string'
+ - '"?rsp-subtree=full&rsp-subtree-class=fvCrtrn,fvRsAEPgMonPol,fvRsBd" in epg_query_all.filter_string'
- '"class/fvAEPg.json" in epg_query_all.url'
- - name: delete epg - check mode works
+ - name: Delete epg - check mode works
cisco.aci.aci_epg: &aci_epg_absent
<<: *aci_epg_present
state: absent
check_mode: true
register: delete_epg_check_mode
- - name: delete epg - delete works
+ - name: Delete epg - delete works
cisco.aci.aci_epg:
<<: *aci_epg_absent
register: delete_epg
- - name: delete epg - idempotency works
+ - name: Delete epg - idempotency works
cisco.aci.aci_epg:
<<: *aci_epg_absent
register: delete_epg_idempotent
- - name: delete epg - cleanup extra epg
+ - name: Delete epg - cleanup extra epg
cisco.aci.aci_epg:
<<: *aci_epg_absent
epg: anstest2
- - name: delete epg - missing param fails
+ - name: Delete epg - missing param fails
cisco.aci.aci_epg:
<<: *aci_epg_absent
tenant: "{{ fakevar | default(omit) }}"
ignore_errors: true
register: delete_epg_missing_param
- - name: query assertions
- assert:
+ - name: Delete assertions
+ ansible.builtin.assert:
that:
- delete_epg_check_mode is changed
- delete_epg_check_mode.previous != []
@@ -178,7 +267,9 @@
- delete_epg_missing_param is failed
- 'delete_epg_missing_param.msg == "state is absent but all of the following are missing: tenant"'
- - name: create microsegmented epg with check mode
+ # USEG SPECIFIC TESTS
+
+ - name: Create useg epg (check mode)
cisco.aci.aci_epg: &cm_useg_epg_present
<<: *aci_ap_present
epg: anstest_useg_epg
@@ -188,129 +279,137 @@
check_mode: true
register: cm_useg_epg_present
- - name: Assertions check for create microsegmented epg with check mode
- assert:
- that:
- - cm_useg_epg_present is changed
- - cm_useg_epg_present.current == []
- - cm_useg_epg_present.previous == []
- - cm_useg_epg_present.sent.fvAEPg.attributes.name == 'anstest_useg_epg'
- - cm_useg_epg_present.sent.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - cm_useg_epg_present.sent.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
-
- - name: create microsegmented epg with normal mode
+ - name: Create useg epg (normal mode)
cisco.aci.aci_epg: &nm_useg_epg_present
<<: *cm_useg_epg_present
register: nm_useg_epg_present
- - name: Assertions check for create microsegmented epg with normal mode
- assert:
+ - name: Create useg epg again
+ cisco.aci.aci_epg:
+ <<: *cm_useg_epg_present
+ register: nm_useg_epg_present_again
+
+ - name: Assertions for creating useg epgs
+ ansible.builtin.assert:
that:
+ - cm_useg_epg_present is changed
+ - cm_useg_epg_present.current == []
+ - cm_useg_epg_present.previous == []
+ - cm_useg_epg_present.proposed.fvAEPg.attributes.name == 'anstest_useg_epg'
+ - cm_useg_epg_present.proposed.fvAEPg.attributes.isAttrBasedEPg == 'yes'
+ - cm_useg_epg_present.proposed.fvAEPg.children.1.fvCrtrn.attributes.name == 'default'
+ - cm_useg_epg_present.proposed.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
- nm_useg_epg_present is changed
- nm_useg_epg_present.current | length == 1
- nm_useg_epg_present.previous == []
- nm_useg_epg_present.current.0.fvAEPg.attributes.name == 'anstest_useg_epg'
- nm_useg_epg_present.current.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - nm_useg_epg_present.current.0.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
- - nm_useg_epg_present.sent.fvAEPg.attributes.name == 'anstest_useg_epg'
- - nm_useg_epg_present.sent.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - nm_useg_epg_present.sent.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
-
- - name: create microsegmented epg with normal mode - idempotency works
- cisco.aci.aci_epg:
- <<: *cm_useg_epg_present
- register: idempotency_nm_useg_epg_present
-
- - name: Idempotency assertions check for create microsegmented epg with normal mode
- assert:
- that:
- - idempotency_nm_useg_epg_present is not changed
- - idempotency_nm_useg_epg_present.current | length == 1
- - idempotency_nm_useg_epg_present.previous | length == 1
- - idempotency_nm_useg_epg_present.current.0.fvAEPg.attributes.name == 'anstest_useg_epg'
- - idempotency_nm_useg_epg_present.previous.0.fvAEPg.attributes.name == 'anstest_useg_epg'
- - idempotency_nm_useg_epg_present.current.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - idempotency_nm_useg_epg_present.previous.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - idempotency_nm_useg_epg_present.current.0.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
- - idempotency_nm_useg_epg_present.previous.0.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
-
- - name: get anstest_useg_epg epg
+ - nm_useg_epg_present.current.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - nm_useg_epg_present.current.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - nm_useg_epg_present_again is not changed
+ - nm_useg_epg_present_again.previous | length == 1
+ - nm_useg_epg_present_again.previous.0.fvAEPg.attributes.name == 'anstest_useg_epg'
+ - nm_useg_epg_present_again.previous.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - nm_useg_epg_present_again.previous.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - nm_useg_epg_present_again.previous.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
+ - nm_useg_epg_present_again.current | length == 1
+ - nm_useg_epg_present_again.current.0.fvAEPg.attributes.name == 'anstest_useg_epg'
+ - nm_useg_epg_present_again.current.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - nm_useg_epg_present_again.current.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - nm_useg_epg_present_again.current.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
+
+ - name: Query useg epg
cisco.aci.aci_epg:
<<: *nm_useg_epg_present
state: query
register: useg_epg_present
- - name: Assertions check for query microsegmented epg with normal mode
- assert:
+ - name: Assertions check for query useg epg
+ ansible.builtin.assert:
that:
- useg_epg_present is not changed
- useg_epg_present.current | length == 1
- useg_epg_present.current.0.fvAEPg.attributes.name == 'anstest_useg_epg'
- useg_epg_present.current.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - useg_epg_present.current.0.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - useg_epg_present.current.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - useg_epg_present.current.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+
+ - name: Update useg epg
+ cisco.aci.aci_epg:
+ <<: *cm_useg_epg_present
+ match: all
+ precedence: 1
+ register: nm_useg_epg_update
+
+ - name: Update useg epg (error)
+ cisco.aci.aci_epg:
+ <<: *cm_useg_epg_present
+ useg: no
+ ignore_errors: true
+ register: err_useg_epg_update
- - name: delete microsegmented epg with check mode
+ - name: Assertions check for update useg epg
+ assert:
+ that:
+ - nm_useg_epg_update is changed
+ - nm_useg_epg_update.previous | length == 1
+ - nm_useg_epg_update.previous.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - nm_useg_epg_update.previous.0.fvAEPg.children.0.fvCrtrn.attributes.prec == '0'
+ - nm_useg_epg_update.previous.0.fvAEPg.children.0.fvCrtrn.attributes.match == 'any'
+ - nm_useg_epg_update.previous.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - nm_useg_epg_update.current.0.fvAEPg.attributes == nm_useg_epg_update.previous.0.fvAEPg.attributes
+ - nm_useg_epg_update.current | length == 1
+ - nm_useg_epg_update.current.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - nm_useg_epg_update.current.0.fvAEPg.children.0.fvCrtrn.attributes.prec == '1'
+ - nm_useg_epg_update.current.0.fvAEPg.children.0.fvCrtrn.attributes.match == 'all'
+ - nm_useg_epg_update.current.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - err_useg_epg_update is failed
+ - 'err_useg_epg_update.msg == "Changing attribute useg on existing EPG is not supported."'
+
+ - name: Delete useg epg with (check mode)
cisco.aci.aci_epg: &cm_useg_epg_absent
<<: *nm_useg_epg_present
state: absent
check_mode: true
register: cm_useg_epg_absent
- - name: Assertions check for delete microsegmented epg with check mode
- assert:
+ - name: Delete useg epg
+ cisco.aci.aci_epg:
+ <<: *cm_useg_epg_absent
+ register: nm_useg_epg_absent
+
+ - name: Delete useg epg again
+ cisco.aci.aci_epg:
+ <<: *cm_useg_epg_absent
+ register: nm_useg_epg_absent_again
+
+ - name: Assertions check for delete useg epg with check mode
+ ansible.builtin.assert:
that:
- cm_useg_epg_absent is changed
- - cm_useg_epg_absent.current | length == 1
- cm_useg_epg_absent.previous | length == 1
- - cm_useg_epg_absent.current.0.fvAEPg.attributes.name == 'anstest_useg_epg'
- - cm_useg_epg_absent.current.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - cm_useg_epg_absent.current.0.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
- cm_useg_epg_absent.previous.0.fvAEPg.attributes.name == 'anstest_useg_epg'
- cm_useg_epg_absent.previous.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - cm_useg_epg_absent.previous.0.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
-
- - name: delete microsegmented epg with normal mode
- cisco.aci.aci_epg: &nm_useg_epg_absent
- <<: *cm_useg_epg_absent
- state: absent
- register: nm_useg_epg_absent
-
- - name: Assertions check for delete microsegmented epg with normal mode
- assert:
- that:
+ - cm_useg_epg_absent.previous.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - cm_useg_epg_absent.previous.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - cm_useg_epg_absent.current | length == 1
+ - cm_useg_epg_absent.current.0.fvAEPg.attributes.name == 'anstest_useg_epg'
+ - cm_useg_epg_absent.current.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
+ - cm_useg_epg_absent.current.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - cm_useg_epg_absent.current.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - cm_useg_epg_absent.proposed == {}
- nm_useg_epg_absent is changed
- - nm_useg_epg_absent.current | length == 0
+ - nm_useg_epg_absent.current == []
- nm_useg_epg_absent.previous | length == 1
- nm_useg_epg_absent.previous.0.fvAEPg.attributes.name == 'anstest_useg_epg'
- nm_useg_epg_absent.previous.0.fvAEPg.attributes.isAttrBasedEPg == 'yes'
- - nm_useg_epg_absent.previous.0.fvAEPg.children.0.fvRsBd.attributes.tnFvBDName == 'anstest'
-
- - name: delete microsegmented epg with normal mode - idempotency works
- cisco.aci.aci_epg:
- <<: *nm_useg_epg_absent
- register: idempotency_nm_useg_epg_absent
-
- - name: Idempotency assertions check for delete microsegmented epg with normal mode
- assert:
- that:
- - idempotency_nm_useg_epg_absent is not changed
- - idempotency_nm_useg_epg_absent.current | length == 0
- - idempotency_nm_useg_epg_absent.previous | length == 0
-
- - name: cleanup bd
- cisco.aci.aci_bd:
- <<: *aci_bd_present
- state: absent
- when: bd_present.previous == []
-
- - name: cleanup ap
- cisco.aci.aci_ap:
- <<: *aci_ap_present
- state: absent
- when: ap_present.previous == []
+ - nm_useg_epg_absent.previous.0.fvAEPg.children.0.fvCrtrn.attributes.name == 'default'
+ - nm_useg_epg_absent.previous.0.fvAEPg.children.1.fvRsBd.attributes.tnFvBDName == 'anstest'
+ - nm_useg_epg_absent_again is not changed
+ - nm_useg_epg_absent_again.current == []
+ - nm_useg_epg_absent_again.previous == []
- - name: cleanup tenant
+ - name: Cleanup tenant
cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
- when: tenant_present.previous == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_monitoring_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_monitoring_policy/tasks/main.yml
index 1671e252e..dbcf8ed18 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_monitoring_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_monitoring_policy/tasks/main.yml
@@ -18,7 +18,7 @@
use_ssl: '{{ aci_use_ssl | default(true) }}'
use_proxy: '{{ aci_use_proxy | default(true) }}'
output_level: '{{ aci_output_level | default("info") }}'
- aci_tenant: ansible_test
+ cisco.aci.aci_tenant: ansible_test
- name: Verify Cloud and Non-Cloud Sites in use.
ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_subnet/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_subnet/tasks/main.yml
index 07fb1d304..ae194bb89 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_subnet/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,14 +21,14 @@
output_level: debug
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: ensure tenant does not exists
cisco.aci.aci_tenant: &aci_tenant_absent
@@ -138,7 +138,7 @@
ignore_errors: true
- name: asserts for subnet creation tasks
- assert:
+ ansible.builtin.assert:
that:
- create_check_mode is changed
- create_check_mode.sent.fvSubnet.attributes.descr == create_subnet.sent.fvSubnet.attributes.descr == 'Ansible Test'
@@ -155,7 +155,7 @@
- create_wrong_mask.msg == "Valid Subnet Masks are 0 to 32 for IPv4 Addresses and 0 to 128 for IPv6 addresses"
- name: assert for subnet IpDPlearning tasks version >=5
- assert:
+ ansible.builtin.assert:
that:
- create_subnet2_5 is changed
- create_subnet2_5.current.0.fvSubnet.attributes.ctrl == 'no-default-gateway'
@@ -170,7 +170,7 @@
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: assert for subnet IpDPlearning tasks version < 5
- assert:
+ ansible.builtin.assert:
that:
- create_subnet2 is changed
- create_subnet2.current.0.fvSubnet.attributes.ctrl == 'no-default-gateway'
@@ -204,7 +204,7 @@
register: get_subnets_gateway
- name: asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- get_all_epg is not changed
- '"rsp-subtree-class=fvRsBDSubnetToProfile,fvRsNdPfxPol,fvSubnet" in get_all_epg.filter_string'
@@ -241,7 +241,7 @@
register: delete_idempotency
- name: asserts for deletion task
- assert:
+ ansible.builtin.assert:
that:
- delete_check_mode is changed
- delete_check_mode.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract/tasks/main.yml
index ec97334ab..f7213c1e6 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract/tasks/main.yml
@@ -1,15 +1,16 @@
# Test code for the ACI modules
# Copyright: (c) 2017, Jacob McGill (@jmcgill298)
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure contract binding does not exist prior to testing
cisco.aci.aci_epg_to_contract:
@@ -30,8 +31,8 @@
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- - name: ensure tenant exists for tests to kick off
- cisco.aci.aci_tenant: &aci_tenant_present
+ - name: remove tenant for tests to kick off
+ cisco.aci.aci_tenant: &aci_tenant_absent
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
password: "{{ aci_password }}"
@@ -40,6 +41,12 @@
use_proxy: '{{ aci_use_proxy | default(true) }}'
output_level: debug
tenant: ansible_test
+ state: absent
+ register: tenant_present
+
+ - name: ensure tenant exists for tests to kick off
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_tenant_absent
state: present
register: tenant_present
@@ -118,7 +125,7 @@
register: incompatible_present
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- provide_present_check_mode is changed
- provide_present_check_mode.sent.fvRsProv.attributes.tnVzBrCPName == 'anstest_http'
@@ -138,6 +145,68 @@
- incompatible_present is failed
- incompatible_present.msg == "the 'provider_match' is only configurable for Provided Contracts"
+ - name: bind taboo contract to epg
+ cisco.aci.aci_epg_to_contract:
+ <<: *aci_epg_present
+ contract: anstest_https
+ contract_type: taboo
+ register: taboo_present
+
+ - name: bind interface contract to epg
+ cisco.aci.aci_epg_to_contract:
+ <<: *aci_epg_present
+ contract: anstest_https
+ contract_type: interface
+ register: interface_present
+
+ - name: bind intra epg contract to epg
+ cisco.aci.aci_epg_to_contract: &aci_epg_intra_present
+ <<: *aci_epg_present
+ contract: anstest_https
+ contract_type: intra_epg
+ register: intra_epg_present
+
+ - name: bind intra epg contract to epg (error contract label)
+ cisco.aci.aci_epg_to_contract:
+ <<: *aci_epg_intra_present
+ contract_label: anstest_contract_label
+ ignore_errors: true
+ register: err_contract_label
+
+ - name: bind intra epg contract to epg (error subject label)
+ cisco.aci.aci_epg_to_contract:
+ <<: *aci_epg_intra_present
+ subject_label: anstest_subject_label
+ ignore_errors: true
+ register: err_subject_label
+
+ - name: bind intra epg contract to epg (error subject and contract label)
+ cisco.aci.aci_epg_to_contract:
+ <<: *aci_epg_intra_present
+ contract_label: anstest_contract_label
+ subject_label: anstest_subject_label
+ ignore_errors: true
+ register: err_subject_and_contract_label
+
+ - name: present assertions for taboo, interface and intra_epg contract types
+ assert:
+ that:
+ - taboo_present is changed
+ - taboo_present.previous == []
+ - taboo_present.current.0.fvRsProtBy.attributes.tnVzTabooName == 'anstest_https'
+ - interface_present is changed
+ - interface_present.previous == []
+ - interface_present.current.0.fvRsConsIf.attributes.tnVzCPIfName == 'anstest_https'
+ - intra_epg_present is changed
+ - intra_epg_present.previous == []
+ - intra_epg_present.current.0.fvRsIntraEpg.attributes.tnVzBrCPName == 'anstest_https'
+ - err_contract_label is failed
+ - err_contract_label.msg == "the 'contract_label' and 'subject_label' are not configurable for intra_epg contracts"
+ - err_subject_label is failed
+ - err_subject_label.msg == "the 'contract_label' and 'subject_label' are not configurable for intra_epg contracts"
+ - err_subject_and_contract_label is failed
+ - err_subject_and_contract_label.msg == "the 'contract_label' and 'subject_label' are not configurable for intra_epg contracts"
+
- name: get binding
cisco.aci.aci_epg_to_contract:
<<: *aci_epg_provide_present2
@@ -166,7 +235,7 @@
register: missing_required_query
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- query_provide_contract is not changed
- query_provide_contract.current != []
@@ -223,7 +292,7 @@
register: missing_required_absent
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- consume_absent_check_mode is changed
- consume_absent_check_mode.previous.0.fvRsCons is defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_interface/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_interface/tasks/main.yml
index a7ba64768..04edb3030 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_interface/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_interface/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -20,7 +20,7 @@
use_proxy: '{{ aci_use_proxy | default(true) }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure ansible_test does not exist prior to testing
cisco.aci.aci_tenant: &ansible_test_absent
@@ -95,7 +95,7 @@
register: inter_tenant_contract_interface_present
- name: Ensure inter_tenant_contract_interface binding with anstest1_epg
- assert:
+ ansible.builtin.assert:
that:
- inter_tenant_contract_interface_present is changed
- inter_tenant_contract_interface_present.current | length == 1
@@ -109,7 +109,7 @@
register: idempotency_check
- name: Verfication of idempotency_check
- assert:
+ ansible.builtin.assert:
that:
- idempotency_check is not changed
@@ -124,7 +124,7 @@
register: single_object_query_result
- name: Verification of single consumed contract interface
- assert:
+ ansible.builtin.assert:
that:
- single_object_query_result is not changed
- single_object_query_result.current.0.fvRsConsIf.attributes.tnVzCPIfName == 'inter_tenant_contract_interface'
@@ -139,7 +139,7 @@
register: all_object_query_result
- name: Verification of all consumed contract interface
- assert:
+ ansible.builtin.assert:
that:
- all_object_query_result is not changed
- inter_tenant_contract_interface_present.current | length >= 1
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_master/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_master/tasks/main.yml
index 08a956f96..5b21ec87f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_master/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_contract_master/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -21,10 +21,10 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure tenant doesn't exist
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: absent
tenant: ansible_test
@@ -34,7 +34,7 @@
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Ensure tenant exists for tests to kick off
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
state: present
tenant: ansible_test
@@ -113,7 +113,7 @@
- {ap: 'anstest_2', epg: 'anstest_3'}
- name: Verify add_contract_master
- assert:
+ ansible.builtin.assert:
that:
- item is changed
- item.current.0.fvRsSecInherited.attributes.tDn == "uni/tn-ansible_test/ap-anstest/epg-anstest"
@@ -132,7 +132,7 @@
- {ap: 'anstest', epg: 'anstest_2'}
- {ap: 'anstest_2', epg: 'anstest_3'}
- name: Verify add_another_contract_master
- assert:
+ ansible.builtin.assert:
that:
- item is changed
- item.current.0.fvRsSecInherited.attributes.tDn == "uni/tn-ansible_test/ap-anstest_2/epg-anstest_4"
@@ -159,7 +159,7 @@
register: query_specific_contract_master
- name: Verify query_specific_contract_master
- assert:
+ ansible.builtin.assert:
that:
- query_specific_contract_master is not changed
- query_specific_contract_master.current.0.fvRsSecInherited.attributes.dn == "uni/tn-ansible_test/ap-anstest/epg-anstest_2/rssecInherited-[uni/tn-ansible_test/ap-anstest_2/epg-anstest_4]"
@@ -177,7 +177,7 @@
register: query_another_specific_contract_master
- name: Verify query_another_specific_contract_master
- assert:
+ ansible.builtin.assert:
that:
- query_another_specific_contract_master is not changed
- query_another_specific_contract_master.current.0.fvRsSecInherited.attributes.dn == "uni/tn-ansible_test/ap-anstest/epg-anstest_2/rssecInherited-[uni/tn-ansible_test/ap-anstest/epg-anstest]"
@@ -195,14 +195,14 @@
register: remove_contract_master
- name: Verify remove_contract_master
- assert:
+ ansible.builtin.assert:
that:
- remove_contract_master is changed
- remove_contract_master.current == []
# Clean up environment
- name: Ensure tenant doesn't exist
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
state: absent
tenant: ansible_test
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_domain/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_domain/tasks/main.yml
index ea482f563..0903178ef 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_domain/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_to_domain/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,14 +21,14 @@
output_level: '{{ aci_output_level | default("debug") }}'
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -237,7 +237,7 @@
register: vmm_uplink_change_active
- name: vmm_uplink assertions
- assert:
+ ansible.builtin.assert:
that:
- vmm_uplink is changed
- vmm_uplink.current.0.fvRsDomAtt.children.0.fvUplinkOrderCont.attributes.active == "1,2"
@@ -287,7 +287,7 @@
register: vmm_uplink_empty_value_standby
- name: vmm_uplink assertions
- assert:
+ ansible.builtin.assert:
that:
- vmm_uplink_0_value is changed
- vmm_uplink_0_value.current.0.fvRsDomAtt.children.0.fvUplinkOrderCont.attributes.active == "0"
@@ -324,14 +324,14 @@
register: vmm_uplink_33_value
- name: vmm_uplink error assertions
- assert:
+ ansible.builtin.assert:
that:
- 'vmm_uplink_change_active_same_as_standby.msg == "APIC Error 120: Invalid Configuration. Uplink Id entered more than once or delimiter was misused."'
- 'vmm_uplink_empty_value_active.msg == "APIC Error 801: property active of uni/tn-ansible_test/ap-anstest/epg-anstest/rsdomAtt-[uni/vmmp-VMware/dom-anstest]/uplinkorder failed validation for value ''''"'
- 'vmm_uplink_string_value.msg == "APIC Error 801: property active of uni/tn-ansible_test/ap-anstest/epg-anstest/rsdomAtt-[uni/vmmp-VMware/dom-anstest]/uplinkorder failed validation for value ''testing''"'
- name: vmm_uplink error assertions for non-cloud
- assert:
+ ansible.builtin.assert:
that:
- 'vmm_uplink_33_value.msg == "APIC Error 120: Invalid Configuration. Uplink Id can not be higher than 32."'
@@ -344,7 +344,7 @@
register: custom_epg_name
- name: Verify custom epg name
- assert:
+ ansible.builtin.assert:
that:
- custom_epg_name.current.0.fvRsDomAtt.attributes.customEpgName == "anstest_epg"
@@ -386,7 +386,7 @@
loop: "{{ range(0, 7, 1)|list }}"
- name: domains with delimiter assertions
- assert:
+ ansible.builtin.assert:
that:
- delimeter.results.0 is changed
- delimeter.results.0.current.0.fvRsDomAtt.attributes.delimiter == "|"
@@ -403,7 +403,7 @@
- delimeter.results.6 is changed
- delimeter.results.6.current.0.fvRsDomAtt.attributes.delimiter == "="
- delimiter_not_allowed is not changed
- - 'delimiter_not_allowed.msg == "value of delimiter must be one of: |, ~, !, @, ^, +, =, got: not_allowed"'
+ - 'delimiter_not_allowed.msg == "value of delimiter must be one of: |, ~, !, @, ^, +, =, _, got: not_allowed"'
- delimeter_absent.results.0 is changed
- delimeter_absent.results.0.current == []
- delimeter_absent.results.1 is changed
@@ -441,7 +441,7 @@
register: untagged_vlan_absent
- name: domains with untagged vlan assertions
- assert:
+ ansible.builtin.assert:
that:
- untagged_vlan_true is changed
- untagged_vlan_true.current.0.fvRsDomAtt.attributes.untagged == "yes"
@@ -489,7 +489,7 @@
register: port_binding_absent
- name: domains with port binding assertions
- assert:
+ ansible.builtin.assert:
that:
- port_binding_dynamic is changed
- port_binding_dynamic.current.0.fvRsDomAtt.attributes.bindingType == "dynamicBinding"
@@ -532,7 +532,7 @@
register: port_allocation_absent
- name: domains with port allocation assertions
- assert:
+ ansible.builtin.assert:
that:
- port_allocation_elastic is changed
- port_allocation_elastic.current.0.fvRsDomAtt.attributes.portAllocation == "elastic"
@@ -565,7 +565,7 @@
register: number_of_ports_absent
- name: domains with number of ports assertions
- assert:
+ ansible.builtin.assert:
that:
- number_of_ports_2 is changed
- number_of_ports_2.current.0.fvRsDomAtt.attributes.numPorts == "2"
@@ -598,7 +598,7 @@
register: forged_transmits_and_mac_changes_absent
- name: domains with forged transmits and mac changes assertions
- assert:
+ ansible.builtin.assert:
that:
- forged_transmits_and_mac_changes_accept is changed
- forged_transmits_and_mac_changes_accept.current.0.fvRsDomAtt.children.0.vmmSecP.attributes.forgedTransmits == "accept"
@@ -610,7 +610,7 @@
- forged_transmits_and_mac_changes_absent.current == []
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- phys_check_mode_present is changed
- phys_present is changed
@@ -649,7 +649,7 @@
register: binding_query
- name: query assertions
- assert:
+ ansible.builtin.assert:
that:
- binding_query is not changed
- binding_query.current | length > 1
@@ -686,7 +686,7 @@
register: absent_missing_param
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- epg_domain_check_mode_absent is changed
- epg_domain_check_mode_absent.previous != []
@@ -732,4 +732,46 @@
cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
- when: tenant_present is changed \ No newline at end of file
+ when: tenant_present is changed
+
+ # Seperate underscore delimiter tests
+ # All other tests use underscore delimiters in naming of parents whiches causes tests fail
+ # Error: 400 - Validation failed: Tenant/Application/EPG name contains _. Please use another delimiter or rename
+ - name: Ensure tenant exists for testing underscore delimiter
+ cisco.aci.aci_tenant: &underscore_tenant
+ <<: *aci_info
+ tenant: underscore
+ state: present
+ register: tenant_present
+
+ - name: Ensure ap exists for testing underscore delimiter
+ cisco.aci.aci_ap: &underscore_ap
+ <<: *underscore_tenant
+ ap: underscore
+ register: ap_present
+
+ - name: Ensure epg exists for testing underscore delimiter
+ cisco.aci.aci_epg: &underscore_epg
+ <<: *underscore_ap
+ epg: underscore
+
+ - name: Create domain with underscore delimiter delimiter
+ cisco.aci.aci_epg_to_domain:
+ <<: *underscore_epg
+ domain: anstest
+ domain_type: vmm
+ vm_provider: vmware
+ delimiter: "_"
+ register: underscore
+
+ - name: Assert underscore delimiter
+ ansible.builtin.assert:
+ that:
+ - underscore is changed
+ - underscore.current.0.fvRsDomAtt.attributes.delimiter == "_"
+
+ - name: Remove tenant used for testing underscore delimiter
+ cisco.aci.aci_tenant:
+ <<: *underscore_tenant
+ state: absent
+ register: tenant_present \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/tasks/main.yml
new file mode 100644
index 000000000..75bd9b2e6
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_block_statement/tasks/main.yml
@@ -0,0 +1,251 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Akini Ross (@akinross)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites ( clean after )
+ when:
+ - query_cloud.current == []
+ block:
+
+ # CLEAN TEST ENVIRONMENT
+ - name: Ensure tenant removed
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ state: absent
+ tenant: ansible_test
+
+ # SETUP TEST ENVIRONMENT
+ - name: Create tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_tenant_absent
+ state: present
+
+ - name: Create AP
+ cisco.aci.aci_ap: &aci_ap
+ <<: *aci_tenant_present
+ ap: ansible_test
+
+ - name: Create uSeg EPG
+ cisco.aci.aci_epg:
+ <<: *aci_ap
+ epg: ansible_test_1
+ bd: ansible_test
+ useg: yes
+
+ # CREATE AND UPDATE TESTS
+ - name: Create block statement in default block (check mode)
+ cisco.aci.aci_epg_useg_attribute_block_statement: &block_a_parent_default_present
+ <<: *aci_ap
+ epg: ansible_test_1
+ name: block_a
+ check_mode: true
+ register: cm_create_block_a_parent_default
+
+ - name: Create block statement in default block
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_a_parent_default_present
+ register: nm_create_block_a_parent_default
+
+ - name: Create block statement in default block again
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_a_parent_default_present
+ register: nm_create_block_a_parent_default_again
+
+ - name: Assert create block statement in default block
+ ansible.builtin.assert:
+ that:
+ - cm_create_block_a_parent_default is changed
+ - cm_create_block_a_parent_default.previous == []
+ - cm_create_block_a_parent_default.current == []
+ - cm_create_block_a_parent_default.proposed.fvSCrtrn.attributes.name == "block_a"
+ - cm_create_block_a_parent_default.proposed.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - nm_create_block_a_parent_default is changed
+ - nm_create_block_a_parent_default.previous == []
+ - nm_create_block_a_parent_default.current.0.fvSCrtrn.attributes.name == "block_a"
+ - nm_create_block_a_parent_default.current.0.fvSCrtrn.attributes.match == "any"
+ - nm_create_block_a_parent_default.current.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - nm_create_block_a_parent_default_again is not changed
+ - nm_create_block_a_parent_default_again.previous.0.fvSCrtrn.attributes.name == "block_a"
+ - nm_create_block_a_parent_default_again.previous.0.fvSCrtrn.attributes.match == "any"
+ - nm_create_block_a_parent_default_again.previous.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - nm_create_block_a_parent_default_again.current.0.fvSCrtrn.attributes.name == "block_a"
+ - nm_create_block_a_parent_default_again.current.0.fvSCrtrn.attributes.match == "any"
+ - nm_create_block_a_parent_default_again.current.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+
+ - name: Update block statement in default block
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_a_parent_default_present
+ match: all
+ state: present
+ register: nm_update_block_a_parent_default
+
+ - name: Assert update block statement match
+ ansible.builtin.assert:
+ that:
+ - nm_update_block_a_parent_default is changed
+ - nm_update_block_a_parent_default.previous.0.fvSCrtrn.attributes.name == "block_a"
+ - nm_update_block_a_parent_default.previous.0.fvSCrtrn.attributes.match == "any"
+ - nm_update_block_a_parent_default.previous.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - nm_update_block_a_parent_default.current.0.fvSCrtrn.attributes.name == "block_a"
+ - nm_update_block_a_parent_default.current.0.fvSCrtrn.attributes.match == "all"
+ - nm_update_block_a_parent_default.current.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+
+ - name: Create block statement in block_a
+ cisco.aci.aci_epg_useg_attribute_block_statement: &block_b_parent_block_a
+ <<: *block_a_parent_default_present
+ name: block_b
+ match: all
+ parent_block_statements:
+ - block_a
+ register: nm_create_block_b_parent_block_a
+
+ - name: Create block statement in block_b
+ cisco.aci.aci_epg_useg_attribute_block_statement: &block_c_parent_block_b
+ <<: *block_a_parent_default_present
+ name: block_c
+ match: any
+ parent_block_statements:
+ - block_a
+ - block_b
+ register: nm_create_block_c_parent_block_b
+
+ - name: Assert create block statement in default block
+ ansible.builtin.assert:
+ that:
+ - nm_create_block_b_parent_block_a is changed
+ - nm_create_block_b_parent_block_a.previous == []
+ - nm_create_block_b_parent_block_a.current.0.fvSCrtrn.attributes.name == "block_b"
+ - nm_create_block_b_parent_block_a.current.0.fvSCrtrn.attributes.match == "all"
+ - nm_create_block_b_parent_block_a.current.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a/crtrn-block_b"
+ - nm_create_block_c_parent_block_b is changed
+ - nm_create_block_c_parent_block_b.previous == []
+ - nm_create_block_c_parent_block_b.current.0.fvSCrtrn.attributes.name == "block_c"
+ - nm_create_block_c_parent_block_b.current.0.fvSCrtrn.attributes.match == "any"
+ - nm_create_block_c_parent_block_b.current.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a/crtrn-block_b/crtrn-block_c"
+
+ - name: Create block statement in block_c (error)
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_a_parent_default_present
+ name: block_d
+ match: any
+ parent_block_statements:
+ - block_a
+ - block_b
+ - block_c
+ register: err_too_many_blocks
+ ignore_errors: true
+
+ - name: Assert create block statement in default block
+ ansible.builtin.assert:
+ that:
+ - err_too_many_blocks is failed
+ - err_too_many_blocks.msg == "3 block statements are provided but the maximum amount of parent_block_statements is 2"
+
+ # QUERY TESTS
+ - name: Query block statement in default block
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_a_parent_default_present
+ state: query
+ register: query_block_a_parent_default
+
+ - name: Query all block statements
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *aci_info
+ state: query
+ register: query_all_blocks
+
+ - name: Assert query block statements
+ ansible.builtin.assert:
+ that:
+ - query_block_a_parent_default is not changed
+ - query_block_a_parent_default.current | length == 1
+ - query_block_a_parent_default.current.0.fvSCrtrn.attributes.name == "block_a"
+ - query_block_a_parent_default.current.0.fvSCrtrn.attributes.match == "all"
+ - query_block_a_parent_default.current.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - query_all_blocks is not changed
+ - query_all_blocks.current | length >= 3
+
+ # REMOVE TESTS
+ - name: Remove block statement from block_b
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_c_parent_block_b
+ state: absent
+ register: rm_block_c_parent_block_b
+
+ - name: Remove block statement from block_a
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_b_parent_block_a
+ state: absent
+ register: rm_block_b_parent_block_a
+
+ - name: Remove block statement from default (check mode)
+ cisco.aci.aci_epg_useg_attribute_block_statement: &block_a_parent_default_absent
+ <<: *block_a_parent_default_present
+ state: absent
+ register: cm_remove_block_a_parent_default
+ check_mode: true
+
+ - name: Remove block statement from default
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_a_parent_default_absent
+ register: nm_remove_block_a_parent_default
+
+ - name: Remove block statement from default again
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block_a_parent_default_absent
+ register: nm_remove_block_a_parent_default_again
+
+ - name: Assert remove block statements
+ ansible.builtin.assert:
+ that:
+ - rm_block_c_parent_block_b is changed
+ - rm_block_c_parent_block_b.previous.0.fvSCrtrn.attributes.name == "block_c"
+ - rm_block_c_parent_block_b.previous.0.fvSCrtrn.attributes.match == "any"
+ - rm_block_c_parent_block_b.previous.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a/crtrn-block_b/crtrn-block_c"
+ - rm_block_c_parent_block_b.current == []
+ - rm_block_b_parent_block_a is changed
+ - rm_block_b_parent_block_a.previous.0.fvSCrtrn.attributes.name == "block_b"
+ - rm_block_b_parent_block_a.previous.0.fvSCrtrn.attributes.match == "all"
+ - rm_block_b_parent_block_a.previous.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a/crtrn-block_b"
+ - rm_block_b_parent_block_a.current == []
+ - cm_remove_block_a_parent_default is changed
+ - cm_remove_block_a_parent_default.previous.0.fvSCrtrn.attributes.name == "block_a"
+ - cm_remove_block_a_parent_default.previous.0.fvSCrtrn.attributes.match == "all"
+ - cm_remove_block_a_parent_default.previous.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - cm_remove_block_a_parent_default.current.0.fvSCrtrn.attributes.name == "block_a"
+ - cm_remove_block_a_parent_default.current.0.fvSCrtrn.attributes.match == "all"
+ - cm_remove_block_a_parent_default.current.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - cm_remove_block_a_parent_default.proposed == {}
+ - nm_remove_block_a_parent_default is changed
+ - nm_remove_block_a_parent_default.previous.0.fvSCrtrn.attributes.name == "block_a"
+ - nm_remove_block_a_parent_default.previous.0.fvSCrtrn.attributes.match == "all"
+ - nm_remove_block_a_parent_default.previous.0.fvSCrtrn.attributes.dn == "uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/crtrn-block_a"
+ - nm_remove_block_a_parent_default.current == []
+ - nm_remove_block_a_parent_default_again is not changed
+ - nm_remove_block_a_parent_default_again.previous == []
+ - nm_remove_block_a_parent_default_again.current == []
+
+ # CLEAN TEST ENVIRONMENT
+ - name: Remove tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/main.yml
new file mode 100644
index 000000000..32e4c37b8
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/main.yml
@@ -0,0 +1,261 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Christian Kolrep (@Christian-Kolrep)
+# Copyright: (c) 2024, Akini Ross (@akinross)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites ( clean after )
+ when:
+ - query_cloud.current == []
+ block:
+
+ # CLEAN TEST ENVIRONMENT
+ - name: Ensure tenant removed
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ state: absent
+ tenant: ansible_test
+
+ # SETUP TEST ENVIRONMENT
+ - name: Create tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_tenant_absent
+ state: present
+
+ - name: Create AP
+ cisco.aci.aci_ap: &aci_ap
+ <<: *aci_tenant_present
+ ap: ansible_test
+
+ - name: Create uSeg EPG
+ cisco.aci.aci_epg:
+ <<: *aci_ap
+ epg: ansible_test_1
+ bd: ansible_test
+ useg: yes
+
+ - name: Create block statement block_a
+ cisco.aci.aci_epg_useg_attribute_block_statement: &block
+ <<: *aci_ap
+ epg: ansible_test_1
+ name: block_a
+
+ - name: Create block statement block_b
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block
+ name: block_b
+ parent_block_statements:
+ - block_a
+
+ - name: Create block statement block_c
+ cisco.aci.aci_epg_useg_attribute_block_statement:
+ <<: *block
+ name: block_c
+ parent_block_statements:
+ - block_a
+ - block_b
+
+ # TEST THAT ALL LEVELS OF BLOCK STATEMENTS WORK WITH THE VM_NAME SIMPLE STATEMENT TYPE
+ - name: Execute tests for each block statement
+ ansible.builtin.include_tasks: simple_block_levels.yml
+ loop:
+ - []
+ - [block_a]
+ - [block_a, block_b]
+ - [block_a, block_b, block_c]
+ loop_control:
+ loop_var: parent_block_statements
+
+ # INPUT TEST FOR OPERATOR INPUT
+ - name: Create simple statement with all operator input options
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *aci_ap
+ epg: ansible_test_1
+ name: ansible_test_vm_name
+ type: vm_name
+ operator: "{{ item }}"
+ value: ansible_test_vm_name_value
+ register: nm_operators
+ loop:
+ - contains
+ - equals
+ - starts_with
+ - ends_with
+
+ - name: Assert simple statement with all operator input options
+ ansible.builtin.assert:
+ that:
+ - nm_operators.results | length == 4
+ - nm_operators.results.0.changed == true
+ - nm_operators.results.0.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_operators.results.1.changed == true
+ - nm_operators.results.1.current.0.fvVmAttr.attributes.operator == "equals"
+ - nm_operators.results.2.changed == true
+ - nm_operators.results.2.current.0.fvVmAttr.attributes.operator == "startsWith"
+ - nm_operators.results.3.changed == true
+ - nm_operators.results.3.current.0.fvVmAttr.attributes.operator == "endsWith"
+
+ # INPUT TESTS FOR TYPES
+ - name: Create simple statement with all type input options
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *aci_ap
+ epg: ansible_test_1
+ name: "{{ item.name }}"
+ type: "{{ item.type }}"
+ operator: "{{ item.operator }}"
+ category: "{{ item.category }}"
+ value: "{{ item.value }}"
+ use_subnet: "{{ item.use_subnet | default(omit) }}"
+ register: nm_types
+ loop:
+ - { name: ansible_test_ip_1, type: ip, operator: "{{ fake_var | default(omit) }}", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: 10.0.0.1 }
+ - { name: ansible_test_ip_2, type: ip, operator: "{{ fake_var | default(omit) }}", category: "{{ fake_var | default(omit) }}", use_subnet: true, value: "{{ fake_var | default(omit) }}" }
+ - { name: ansible_test_mac, type: mac, operator: "{{ fake_var | default(omit) }}", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "aa:bb:cc:dd:ee:ff" }
+ - { name: ansible_test_dns, type: dns, operator: "{{ fake_var | default(omit) }}", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "dns_filter" }
+ - { name: ansible_test_ad_group, type: ad_group, operator: "{{ fake_var | default(omit) }}", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "ad_group_selector" }
+ - { name: ansible_test_vm_custom_attr, type: vm_custom_attr, operator: "contains", category: "custom_attribute", use_subnet: "{{ fake_var | default(omit) }}", value: "custom_attribute_value" }
+ - { name: ansible_test_vm_vmm_domain, type: vm_vmm_domain, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_vmm_domain_value" }
+ - { name: ansible_test_vm_operating_system, type: vm_operating_system, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_operating_system_value" }
+ - { name: ansible_test_vm_hypervisor_id, type: vm_hypervisor_id, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_hypervisor_id_value" }
+ - { name: ansible_test_vm_datacenter, type: vm_datacenter, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_datacenter_value" }
+ - { name: ansible_test_vm_id, type: vm_id, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_id_value" }
+ - { name: ansible_test_vm_name, type: vm_name, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_name_value" }
+ - { name: ansible_test_vm_folder, type: vm_folder, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_folder_value" }
+ - { name: ansible_test_vm_folder_path, type: vm_folder_path, operator: "{{ fake_var | default(omit) }}", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_folder_path_value" }
+ - { name: ansible_test_vm_vnic, type: vm_vnic, operator: "contains", category: "{{ fake_var | default(omit) }}", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_vnic_value" }
+ - { name: ansible_test_vm_tag, type: vm_tag, operator: "equals", category: "vm_attribute", use_subnet: "{{ fake_var | default(omit) }}", value: "vm_attribute_value" }
+ ignore_errors: true # ignore errors is set to handle the ad group configuration which is not configurable in the lab environment, so error message is expected to ensure payload is sent
+
+ - name: Assert create simple statement with all type input options
+ ansible.builtin.assert:
+ that:
+ - nm_types.results | length == 16
+ - nm_types.results.0.changed == true
+ - nm_types.results.0.current.0.fvIpAttr.attributes.name == "ansible_test_ip_1"
+ - nm_types.results.0.current.0.fvIpAttr.attributes.ip == "10.0.0.1"
+ - nm_types.results.0.current.0.fvIpAttr.attributes.usefvSubnet == "no"
+ - nm_types.results.1.changed == true
+ - nm_types.results.1.current.0.fvIpAttr.attributes.name == "ansible_test_ip_2"
+ - nm_types.results.1.current.0.fvIpAttr.attributes.ip == "0.0.0.0"
+ - nm_types.results.1.current.0.fvIpAttr.attributes.usefvSubnet == "yes"
+ - nm_types.results.2.changed == true
+ - nm_types.results.2.current.0.fvMacAttr.attributes.name == "ansible_test_mac"
+ - nm_types.results.2.current.0.fvMacAttr.attributes.mac == "AA:BB:CC:DD:EE:FF"
+ - nm_types.results.3.changed == true
+ - nm_types.results.3.current.0.fvDnsAttr.attributes.name == "ansible_test_dns"
+ - nm_types.results.3.current.0.fvDnsAttr.attributes.filter == "dns_filter"
+ - nm_types.results.4.failed == true
+ - nm_types.results.4.msg == "APIC Error 400{{":"}} Invalid request. Can not contain child 'idgattr-[ad_group_selector]' under parent 'uni/tn-ansible_test/ap-ansible_test/epg-ansible_test_1/crtrn/idgattr-[ansible_test_ad_group]'"
+ - nm_types.results.5.changed == true
+ - nm_types.results.5.current.0.fvVmAttr.attributes.name == "ansible_test_vm_custom_attr"
+ - nm_types.results.5.current.0.fvVmAttr.attributes.labelName == "custom_attribute"
+ - nm_types.results.5.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.5.current.0.fvVmAttr.attributes.type == "custom-label"
+ - nm_types.results.5.current.0.fvVmAttr.attributes.value == "custom_attribute_value"
+ - nm_types.results.6.changed == true
+ - nm_types.results.6.current.0.fvVmAttr.attributes.name == "ansible_test_vm_vmm_domain"
+ - nm_types.results.6.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.6.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.6.current.0.fvVmAttr.attributes.type == "domain"
+ - nm_types.results.6.current.0.fvVmAttr.attributes.value == "vm_vmm_domain_value"
+ - nm_types.results.7.changed == true
+ - nm_types.results.7.current.0.fvVmAttr.attributes.name == "ansible_test_vm_operating_system"
+ - nm_types.results.7.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.7.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.7.current.0.fvVmAttr.attributes.type == "guest-os"
+ - nm_types.results.7.current.0.fvVmAttr.attributes.value == "vm_operating_system_value"
+ - nm_types.results.8.changed == true
+ - nm_types.results.8.current.0.fvVmAttr.attributes.name == "ansible_test_vm_hypervisor_id"
+ - nm_types.results.8.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.8.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.8.current.0.fvVmAttr.attributes.type == "hv"
+ - nm_types.results.8.current.0.fvVmAttr.attributes.value == "vm_hypervisor_id_value"
+ - nm_types.results.9.changed == true
+ - nm_types.results.9.current.0.fvVmAttr.attributes.name == "ansible_test_vm_datacenter"
+ - nm_types.results.9.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.9.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.9.current.0.fvVmAttr.attributes.type == "rootContName"
+ - nm_types.results.9.current.0.fvVmAttr.attributes.value == "vm_datacenter_value"
+ - nm_types.results.10.changed == true
+ - nm_types.results.10.current.0.fvVmAttr.attributes.name == "ansible_test_vm_id"
+ - nm_types.results.10.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.10.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.10.current.0.fvVmAttr.attributes.type == "vm"
+ - nm_types.results.10.current.0.fvVmAttr.attributes.value == "vm_id_value"
+ - nm_types.results.11.changed == true
+ - nm_types.results.11.current.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - nm_types.results.11.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.11.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.11.current.0.fvVmAttr.attributes.type == "vm-name"
+ - nm_types.results.11.current.0.fvVmAttr.attributes.value == "vm_name_value"
+ - nm_types.results.12.changed == true
+ - nm_types.results.12.current.0.fvVmAttr.attributes.name == "ansible_test_vm_folder"
+ - nm_types.results.12.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.12.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.12.current.0.fvVmAttr.attributes.type == "vm-folder"
+ - nm_types.results.12.current.0.fvVmAttr.attributes.value == "vm_folder_value"
+ - nm_types.results.13.changed == true
+ - nm_types.results.13.current.0.fvVmAttr.attributes.name == "ansible_test_vm_folder_path"
+ - nm_types.results.13.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.13.current.0.fvVmAttr.attributes.operator == "equals"
+ - nm_types.results.13.current.0.fvVmAttr.attributes.type == "vmfolder-path"
+ - nm_types.results.13.current.0.fvVmAttr.attributes.value == "vm_folder_path_value"
+ - nm_types.results.14.changed == true
+ - nm_types.results.14.current.0.fvVmAttr.attributes.name == "ansible_test_vm_vnic"
+ - nm_types.results.14.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.14.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_types.results.14.current.0.fvVmAttr.attributes.type == "vnic"
+ - nm_types.results.14.current.0.fvVmAttr.attributes.value == "vm_vnic_value"
+ - nm_types.results.15.changed == true
+ - nm_types.results.15.current.0.fvVmAttr.attributes.name == "ansible_test_vm_tag"
+ - nm_types.results.15.current.0.fvVmAttr.attributes.labelName == ""
+ - nm_types.results.15.current.0.fvVmAttr.attributes.operator == "equals"
+ - nm_types.results.15.current.0.fvVmAttr.attributes.type == "tag"
+ - nm_types.results.15.current.0.fvVmAttr.attributes.value == "vm_attribute_value"
+
+ # ERROR TESTS
+ - name: Create simple statement with too many parents (error)
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *aci_ap
+ epg: ansible_test_1
+ parent_block_statements:
+ - block_a
+ - block_b
+ - block_c
+ - block_d
+ name: ansible_test_vm_name
+ type: vm_name
+ operator: contains
+ value: ansible_test_vm_name_value
+ register: err_too_many_blocks
+ ignore_errors: true
+
+ - name: Assert create block statement in default block
+ ansible.builtin.assert:
+ that:
+ - err_too_many_blocks is failed
+ - err_too_many_blocks.msg == "4 block statements are provided but the maximum amount of parent_block_statements is 3"
+
+ # CLEAN TEST ENVIRONMENT
+ - name: Remove tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/simple_block_levels.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/simple_block_levels.yml
new file mode 100644
index 000000000..b37a5c7d5
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_epg_useg_attribute_simple_statement/tasks/simple_block_levels.yml
@@ -0,0 +1,156 @@
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+ aci_epg: &aci_epg
+ tenant: ansible_test
+ ap: ansible_test
+ epg: ansible_test_1
+
+# CREATE AND UPDATE TESTS
+- name: Create simple statement in block statement (check mode)
+ cisco.aci.aci_epg_useg_attribute_simple_statement: &simple_present
+ <<: *aci_info
+ <<: *aci_epg
+ parent_block_statements: "{{ parent_block_statements }}"
+ name: ansible_test_vm_name
+ type: vm_name
+ operator: contains
+ value: ansible_test_vm_name_value
+ check_mode: true
+ register: cm_create_simple
+
+- name: Create simple statement in block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *simple_present
+ register: nm_create_simple
+
+- name: Create simple statement in block statement again
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *simple_present
+ register: nm_create_simple_again
+
+- name: Assert create simple statement in block statement
+ ansible.builtin.assert:
+ that:
+ - cm_create_simple is changed
+ - cm_create_simple.previous == []
+ - cm_create_simple.current == []
+ - cm_create_simple.proposed.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - cm_create_simple.proposed.fvVmAttr.attributes.type == "vm-name"
+ - cm_create_simple.proposed.fvVmAttr.attributes.operator == "contains"
+ - cm_create_simple.proposed.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+ - nm_create_simple is changed
+ - nm_create_simple.previous == []
+ - nm_create_simple.current.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - nm_create_simple.current.0.fvVmAttr.attributes.type == "vm-name"
+ - nm_create_simple.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_create_simple.current.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+ - nm_create_simple_again is not changed
+ - nm_create_simple_again.previous.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - nm_create_simple_again.previous.0.fvVmAttr.attributes.type == "vm-name"
+ - nm_create_simple_again.previous.0.fvVmAttr.attributes.operator == "contains"
+ - nm_create_simple_again.previous.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+ - nm_create_simple_again.current.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - nm_create_simple_again.current.0.fvVmAttr.attributes.type == "vm-name"
+ - nm_create_simple_again.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_create_simple_again.current.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+
+# QUERY TESTS
+- name: Create another simple statement in block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement: &simple_present_update
+ <<: *simple_present
+ name: ansible_test_vm_name_2
+ type: vm_name
+ operator: contains
+ value: ansible_test_vm_name_value_2
+ register: nm_create_simple_2
+
+- name: Create another simple statement in block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *simple_present_update
+ operator: equals
+ value: ansible_test_vm_name_value_3
+ register: nm_create_simple_2_update
+
+- name: Assert updates
+ ansible.builtin.assert:
+ that:
+ - nm_create_simple_2.current.0.fvVmAttr.attributes.name == "ansible_test_vm_name_2"
+ - nm_create_simple_2.current.0.fvVmAttr.attributes.type == "vm-name"
+ - nm_create_simple_2.current.0.fvVmAttr.attributes.operator == "contains"
+ - nm_create_simple_2.current.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value_2"
+ - nm_create_simple_2_update.current.0.fvVmAttr.attributes.name == "ansible_test_vm_name_2"
+ - nm_create_simple_2_update.current.0.fvVmAttr.attributes.type == "vm-name"
+ - nm_create_simple_2_update.current.0.fvVmAttr.attributes.operator == "equals"
+ - nm_create_simple_2_update.current.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value_3"
+
+- name: Query simple statement in block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *simple_present
+ state: query
+ register: query_one
+
+- name: Query all simple statements of type vm_name
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *aci_info
+ type: vm_name
+ state: query
+ register: query_all
+
+- name: Assert queries
+ ansible.builtin.assert:
+ that:
+ - query_one.current | length == 1
+ - query_one.current.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - query_one.current.0.fvVmAttr.attributes.type == "vm-name"
+ - query_one.current.0.fvVmAttr.attributes.operator == "contains"
+ - query_one.current.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+ - query_all.current | length >= 2
+
+# REMOVE TESTS
+- name: Remove simple statement from block statement (check mode)
+ cisco.aci.aci_epg_useg_attribute_simple_statement: &simple_absent
+ <<: *simple_present
+ state: absent
+ check_mode: true
+ register: cm_remove_simple
+
+- name: Remove simple statement from block statement
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *simple_absent
+ register: nm_remove_simple
+
+- name: Remove simple statement from block statement again
+ cisco.aci.aci_epg_useg_attribute_simple_statement:
+ <<: *simple_absent
+ register: nm_remove_simple_again
+
+- name: Assert remove simple statement from block statement
+ ansible.builtin.assert:
+ that:
+ - cm_remove_simple is changed
+ - cm_remove_simple.previous.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - cm_remove_simple.previous.0.fvVmAttr.attributes.type == "vm-name"
+ - cm_remove_simple.previous.0.fvVmAttr.attributes.operator == "contains"
+ - cm_remove_simple.previous.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+ - cm_remove_simple.current.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - cm_remove_simple.current.0.fvVmAttr.attributes.type == "vm-name"
+ - cm_remove_simple.current.0.fvVmAttr.attributes.operator == "contains"
+ - cm_remove_simple.current.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+ - cm_remove_simple.proposed == {}
+ - nm_remove_simple is changed
+ - nm_remove_simple.previous.0.fvVmAttr.attributes.name == "ansible_test_vm_name"
+ - nm_remove_simple.previous.0.fvVmAttr.attributes.type == "vm-name"
+ - nm_remove_simple.previous.0.fvVmAttr.attributes.operator == "contains"
+ - nm_remove_simple.previous.0.fvVmAttr.attributes.value == "ansible_test_vm_name_value"
+ - nm_remove_simple.current == []
+ - nm_remove_simple_again is not changed
+ - nm_remove_simple_again.previous == []
+ - nm_remove_simple_again.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg/tasks/main.yml
index 34a482fa9..3716bd7e8 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -28,7 +28,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure tenant - ansible_test does not exists before testing
cisco.aci.aci_tenant: &tenant_absent
@@ -71,7 +71,7 @@
register: cm_web_esg_0_present
- name: Assertions check for add web_esg_0 with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_web_esg_0_present is changed
- cm_web_esg_0_present.current | length == 0
@@ -83,7 +83,7 @@
register: nm_web_esg_0_present
- name: Assertions check for add web_esg_0 with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_web_esg_0_present is changed
- nm_web_esg_0_present.current | length == 1
@@ -96,7 +96,7 @@
- nm_web_esg_0_present.current.0.fvESg.children[0].fvRsScope.attributes.tnFvCtxName == 'default'
- name: Assertions check for add web_esg_0 with normal mode (v5.2+)
- assert:
+ ansible.builtin.assert:
that:
- nm_web_esg_0_present.current.0.fvESg.attributes.shutdown == 'no'
when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
@@ -107,7 +107,7 @@
register: idempotency_web_esg_0_present
- name: Idempotency assertions check for add web_esg_0 with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_web_esg_0_present is not changed
- idempotency_web_esg_0_present.current | length == 1
@@ -123,7 +123,7 @@
register: ap_1_web_esg_0_present
- name: Assertions check for add web_esg_0 under ap(anstest_ap_1_present)
- assert:
+ ansible.builtin.assert:
that:
- ap_1_web_esg_0_present is changed
- ap_1_web_esg_0_present.current | length == 1
@@ -142,7 +142,7 @@
when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
- name: Assertions check for add web_esg_1
- assert:
+ ansible.builtin.assert:
that:
- web_esg_1_present is changed
- web_esg_1_present.current | length == 1
@@ -164,7 +164,7 @@
when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
- name: Assertions check for add web_esg_2
- assert:
+ ansible.builtin.assert:
that:
- web_esg_2_present is changed
- web_esg_2_present.current | length == 1
@@ -183,7 +183,7 @@
register: query_web_esg_0
- name: Assertions check for query an ESG(web_esg_0) under ap(anstest_ap)
- assert:
+ ansible.builtin.assert:
that:
- query_web_esg_0 is not changed
- query_web_esg_0.current | length == 1
@@ -191,7 +191,7 @@
- query_web_esg_0.current.0.fvESg.attributes.dn == "uni/tn-ansible_test/ap-anstest_ap/esg-web_esg_0"
- name: Assertions check for query an ESG(web_esg_0) under ap(anstest_ap) (v5.2+)
- assert:
+ ansible.builtin.assert:
that:
- query_web_esg_0.current.0.fvESg.attributes.shutdown == 'no'
when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
@@ -203,14 +203,14 @@
register: query_all_esg
- name: Assertions check for query all ESGs
- assert:
+ ansible.builtin.assert:
that:
- query_all_esg is not changed
- query_all_esg.current | length >= 2 # Count of ESGs added in the above tasks
when: version.current.0.topSystem.attributes.version is version('5.2', '<')
- name: Assertions check for query all ESGs
- assert:
+ ansible.builtin.assert:
that:
- query_all_esg is not changed
- query_all_esg.current | length >= 4 # Count of ESGs added in the above tasks
@@ -224,7 +224,7 @@
register: query_all_esg_with_name
- name: Assertions check for query all ESGs with a Specific Name
- assert:
+ ansible.builtin.assert:
that:
- query_all_esg_with_name is not changed
- query_all_esg_with_name.current | length >= 2
@@ -237,7 +237,7 @@
register: query_all_ap_esg
- name: Assertions check for query all ESGs of an App Profile (<v5.2)
- assert:
+ ansible.builtin.assert:
that:
- query_all_ap_esg is not changed
- query_all_ap_esg.current.0.fvAp.attributes.name == 'anstest_ap'
@@ -245,7 +245,7 @@
when: version.current.0.topSystem.attributes.version is version('5.2', '<')
- name: Assertions check for query all ESGs of an App Profile (>=v5.2)
- assert:
+ ansible.builtin.assert:
that:
- query_all_ap_esg is not changed
- query_all_ap_esg.current.0.fvAp.attributes.name == 'anstest_ap'
@@ -261,7 +261,7 @@
check_mode: true
- name: Assertions check for remove an ESG with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_web_esg_0_absent is changed
- cm_web_esg_0_absent.current | length == 1
@@ -275,7 +275,7 @@
register: nm_web_esg_0_absent
- name: Assertions check for remove an ESG with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_web_esg_0_absent is changed
- nm_web_esg_0_absent.current == []
@@ -288,7 +288,7 @@
register: idempotency_web_esg_0_absent
- name: Idempotency assertions check for remove an ESG with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_web_esg_0_absent is not changed
- idempotency_web_esg_0_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_contract_master/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_contract_master/tasks/main.yml
index debc3ec47..820e4be56 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_contract_master/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_contract_master/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -28,7 +28,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure tenant - ansible_test does not exists before testing
cisco.aci.aci_tenant: &tenant_absent
@@ -88,7 +88,7 @@
register: cm_contract_esg_present
- name: Assertions check for add an ESG contract master to web_esg with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_contract_esg_present is changed
- cm_contract_esg_present.current == []
@@ -102,7 +102,7 @@
register: nm_contract_esg_present
- name: Assertions check for add an ESG contract master to web_esg with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_contract_esg_present is changed
- nm_contract_esg_present.current | length == 1
@@ -115,7 +115,7 @@
register: idempotency_contract_esg_present
- name: Idempotency assertions check for add an ESG contract master to web_esg with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_contract_esg_present is not changed
- idempotency_contract_esg_present.current | length == 1
@@ -133,7 +133,7 @@
register: query_result_contract_master_esg
- name: Assertions check for query an ESG contract master
- assert:
+ ansible.builtin.assert:
that:
- query_result_contract_master_esg is not changed
- query_result_contract_master_esg.current | length == 1
@@ -149,7 +149,7 @@
register: query_all_contract_master
- name: Assertions check for query_all_contract_master
- assert:
+ ansible.builtin.assert:
that:
- query_all_contract_master is not changed
- query_all_contract_master.current | length == 1
@@ -168,7 +168,7 @@
register: cm_contract_esg_absent
- name: Assertions check for remove an ESG contract master with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_contract_esg_absent is changed
- cm_contract_esg_absent.current != []
@@ -182,7 +182,7 @@
register: nm_contract_esg_absent
- name: Assertions check for remove an ESG contract master with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_contract_esg_absent is changed
- nm_contract_esg_absent.current == []
@@ -195,7 +195,7 @@
register: idempotency_contract_esg_absent
- name: Idempotency assertions check for remove an ESG contract master with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_contract_esg_absent is not changed
- idempotency_contract_esg_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_epg_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_epg_selector/tasks/main.yml
index 599828ae7..39087a37d 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_epg_selector/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_epg_selector/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -28,7 +28,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure tenant - ansible_test does not exists before testing
cisco.aci.aci_tenant: &tenant_absent
@@ -88,7 +88,7 @@
register: cm_epg_selector_present
- name: Assertions check for add an EPG selector with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_epg_selector_present is changed
- cm_epg_selector_present.current | length == 0
@@ -101,7 +101,7 @@
register: nm_epg_selector_present
- name: Assertions check for add an EPG selector with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_epg_selector_present is changed
- nm_epg_selector_present.current | length == 1
@@ -114,7 +114,7 @@
register: cm_idempotency_epg_selector_present
- name: Idempotency assertions check for add an EPG selector with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_idempotency_epg_selector_present is not changed
- cm_idempotency_epg_selector_present.current | length == 1
@@ -125,7 +125,7 @@
register: nm_idempotency_epg_selector_present
- name: Idempotency assertions check for add an EPG selector with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_idempotency_epg_selector_present is not changed
- nm_idempotency_epg_selector_present.current | length == 1
@@ -142,7 +142,7 @@
register: query_single_epg_selector
- name: Assertions check for query an EPG selector with esg and epg name
- assert:
+ ansible.builtin.assert:
that:
- query_single_epg_selector is not changed
- query_single_epg_selector.current | length == 1
@@ -158,7 +158,7 @@
register: query_all_epg_selectors_under_ap
- name: Assertions check for query all EPG selectors under an application profile
- assert:
+ ansible.builtin.assert:
that:
- query_all_epg_selectors_under_ap is not changed
- query_all_epg_selectors_under_ap.current | length == 1
@@ -173,7 +173,7 @@
register: query_all_epg_selectors
- name: Assertions check for query all EPG selectors
- assert:
+ ansible.builtin.assert:
that:
- query_all_epg_selectors is not changed
- query_all_epg_selectors.current | length >= 1
@@ -191,7 +191,7 @@
register: cm_epg_selector_absent
- name: Assertions check for remove an EPG selector with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_epg_selector_absent is changed
- cm_epg_selector_absent.current != []
@@ -204,7 +204,7 @@
register: nm_epg_selector_absent
- name: Assertions check for remove an EPG selector with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_epg_selector_absent is changed
- nm_epg_selector_absent.current == []
@@ -217,7 +217,7 @@
register: cm_idempotency_epg_selector_absent
- name: Idempotency assertions check for EPG selector with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_idempotency_epg_selector_absent is not changed
- cm_idempotency_epg_selector_absent.current == []
@@ -228,7 +228,7 @@
register: nm_idempotency_epg_selector_absent
- name: Idempotency assertions check for EPG selector with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_idempotency_epg_selector_absent is not changed
- nm_idempotency_epg_selector_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_ip_subnet_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_ip_subnet_selector/tasks/main.yml
index f96391704..3564330aa 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_ip_subnet_selector/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_ip_subnet_selector/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -28,7 +28,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure tenant - ansible_test does not exists before testing
cisco.aci.aci_tenant: &tenant_absent
@@ -74,7 +74,7 @@
register: cm_subnet_ip_present
- name: Assertions check for add IP Subnet selector with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_subnet_ip_present is changed
- cm_subnet_ip_present.current == []
@@ -87,7 +87,7 @@
register: nm_subnet_ip_present
- name: Assertions check for add IP Subnet selector with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_subnet_ip_present is changed
- nm_subnet_ip_present.current | length == 1
@@ -103,7 +103,7 @@
register: idempotency_nm_subnet_ip_present
- name: Idempotency assertions check for add IP Subnet selectors with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_subnet_ip_present is not changed
- idempotency_nm_subnet_ip_present.current.0.fvEPSelector.attributes.matchExpression == "ip=='10.0.0.1'"
@@ -118,7 +118,7 @@
register: query_result
- name: Assertions check for query all IP Subnet selectors
- assert:
+ ansible.builtin.assert:
that:
- query_result is not changed
- query_result.current | length >= 1
@@ -131,7 +131,7 @@
register: cm_subnet_ip_absent
- name: Assertions check for remove IP Subnet selector with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_subnet_ip_absent is changed
- cm_subnet_ip_absent.current != []
@@ -146,7 +146,7 @@
register: nm_subnet_ip_absent
- name: Assertions check for remove IP Subnet selector with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_subnet_ip_absent is changed
- nm_subnet_ip_absent.current == []
@@ -159,7 +159,7 @@
register: idempotency_nm_subnet_ip_absent
- name: Idempotency assertions check for remove IP Subnet selector with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_subnet_ip_absent is not changed
- idempotency_nm_subnet_ip_absent.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_tag_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_tag_selector/tasks/main.yml
index 5df3b0754..f48e5f38c 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_tag_selector/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_esg_tag_selector/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -28,7 +28,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Ensure tenant - ansible_test does not exists before testing
cisco.aci.aci_tenant: &tenant_absent
@@ -79,7 +79,7 @@
register: selector_0_nm_present
- name: present assertions for Tag Selector - tag-selector-0
- assert:
+ ansible.builtin.assert:
that:
- selector_0_cm_present is changed
- selector_0_nm_present is changed
@@ -97,7 +97,7 @@
register: query_result
- name: Verification of query all Tag Selectors - query_result
- assert:
+ ansible.builtin.assert:
that:
- query_result is not changed
- query_result.current | length >= 1
@@ -111,7 +111,7 @@
register: result_with_name_and_value
- name: Verification of query - Tag Selectors with a name and value
- assert:
+ ansible.builtin.assert:
that:
- result_with_name_and_value is not changed
- result_with_name_and_value.current | length == 1
@@ -127,7 +127,7 @@
register: result_with_name
- name: Verification of query - Tag Selectors with only name
- assert:
+ ansible.builtin.assert:
that:
- result_with_name is not changed
- result_with_name.current | length == 1
@@ -151,7 +151,7 @@
register: selector_0_nm_absent_with_name_and_value
- name: Verification of selector_0_nm_absent_with_name - Tag Selectors under web_esg
- assert:
+ ansible.builtin.assert:
that:
- selector_0_cm_absent_with_name_and_value is changed
- selector_0_cm_absent_with_name_and_value.current | length == 1
@@ -166,7 +166,7 @@
register: idempotency_selector_0_nm_absent_with_name_and_value
- name: Verification of idempotency_selector_0_nm_absent_with_name_and_value - Tag Selectors under web_esg
- assert:
+ ansible.builtin.assert:
that:
- idempotency_selector_0_nm_absent_with_name_and_value is not changed
- idempotency_selector_0_nm_absent_with_name_and_value.current | length == 0
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/tasks/main.yml
new file mode 100644
index 000000000..b51aaf08a
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_connection_profile/tasks/main.yml
@@ -0,0 +1,222 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# GET Credentials from the inventory
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: "{{ aci_validate_certs | default(false) }}"
+ use_ssl: "{{ aci_use_ssl | default(true) }}"
+ use_proxy: "{{ aci_use_proxy | default(true) }}"
+ output_level: "{{ aci_output_level | default('info') }}"
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == []
+ block:
+
+ # CLEAN ENVIRONMENT
+ - name: Ensure ansible_fabric_ext_conn_profile is absent before testing
+ cisco.aci.aci_fabric_external_connection_profile: &delete_fabric_external_connection_profile
+ <<: *aci_info
+ fabric_id: 1
+ state: absent
+
+ # CREATE FABRIC EXTERNAL CONNECTION PROFILE
+ - name: Create ansible_fabric_ext_conn_profile with check mode
+ cisco.aci.aci_fabric_external_connection_profile: &create_fabric_external_connection_profile
+ <<: *aci_info
+ fabric_id: "1"
+ name: "ansible_fabric_ext_conn_profile"
+ description: "Fabric External Connection Profile"
+ community: "extended:as2-nn4:5:16"
+ site_id: "1"
+ peering_type: "automatic_with_rr"
+ peering_password: "abcd"
+ state: present
+ check_mode: true
+ register: add_fabric_external_connection_profile_cm
+
+ - name: Create ansible_fabric_ext_conn_profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *create_fabric_external_connection_profile
+ state: present
+ register: add_fabric_external_connection_profile
+
+ # CREATE FABRIC EXTERNAL CONNECTION PROFILE AGAIN TO TEST IDEMPOTENCE
+ - name: Create ansible_fabric_ext_conn_profile again
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *create_fabric_external_connection_profile
+ state: present
+ register: add_fabric_external_connection_profile_again
+
+ - name: Verify creation
+ ansible.builtin.assert:
+ that:
+ - add_fabric_external_connection_profile is changed
+ - add_fabric_external_connection_profile.previous == []
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.siteId == "1"
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+ - add_fabric_external_connection_profile.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+ - add_fabric_external_connection_profile_cm is changed
+ - add_fabric_external_connection_profile_cm.previous == []
+ - add_fabric_external_connection_profile_cm.current == []
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.attributes.siteId == "1"
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+ - add_fabric_external_connection_profile_cm.proposed.fvFabricExtConnP.children.0.fvPeeringP.attributes.password == "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER"
+ - add_fabric_external_connection_profile_again is changed # Idempotence is not supported when peering_password is set
+ - add_fabric_external_connection_profile_again.current == add_fabric_external_connection_profile_again.previous
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.attributes.siteId == "1"
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+ - add_fabric_external_connection_profile_again.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+ - add_fabric_external_connection_profile_again.previous.0.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - add_fabric_external_connection_profile_again.previous.0.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - add_fabric_external_connection_profile_again.previous.0.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - add_fabric_external_connection_profile_again.previous.0.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - add_fabric_external_connection_profile_again.previous.0.fvFabricExtConnP.attributes.siteId == "1"
+ - add_fabric_external_connection_profile_again.previous.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+ - add_fabric_external_connection_profile_again.previous.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+
+ # QUERY FABRIC EXTERNAL CONNECTION PROFILE
+ - name: Query fabric external connection profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *aci_info
+ fabric_id: 1
+ state: query
+ register: query_fabric_external_connection_profile
+
+ # QUERY ALL FABRIC EXTERNAL CONNECTION PROFILE
+ - name: Query all fabric external connection profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *aci_info
+ state: query
+ register: query_fabric_external_connection_profile_all
+
+ - name: Verify query
+ ansible.builtin.assert:
+ that:
+ - query_fabric_external_connection_profile is not changed
+ - query_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - query_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - query_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - query_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - query_fabric_external_connection_profile.current.0.fvFabricExtConnP.attributes.siteId == "1"
+ - query_fabric_external_connection_profile.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+ - query_fabric_external_connection_profile.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+ - query_fabric_external_connection_profile_all is not changed
+ - query_fabric_external_connection_profile_all.current | length == 1
+ - query_fabric_external_connection_profile_all.current.0.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - query_fabric_external_connection_profile_all.current.0.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - query_fabric_external_connection_profile_all.current.0.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - query_fabric_external_connection_profile_all.current.0.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - query_fabric_external_connection_profile_all.current.0.fvFabricExtConnP.attributes.siteId == "1"
+ - query_fabric_external_connection_profile_all.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+ - query_fabric_external_connection_profile_all.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+
+ # UPDATE PEERING PROFILE
+ - name: Update ansible_fabric_ext_conn_profile peering password
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *aci_info
+ fabric_id: "1"
+ peering_password: "abcd"
+ state: present
+ register: update_fabric_external_connection_profile_1
+
+ - name: Update ansible_fabric_ext_conn_profile peering type
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *aci_info
+ fabric_id: "1"
+ peering_type: "automatic_with_full_mesh"
+ state: present
+ register: update_fabric_external_connection_profile_2
+
+ - name: Verity updates
+ ansible.builtin.assert:
+ that:
+ - update_fabric_external_connection_profile_1 is changed
+ - update_fabric_external_connection_profile_1.proposed.fvFabricExtConnP.children.0.fvPeeringP.attributes.password == "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER"
+ - update_fabric_external_connection_profile_1.proposed.fvFabricExtConnP.children.0.fvPeeringP.attributes.type is undefined
+ - update_fabric_external_connection_profile_1.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+ - update_fabric_external_connection_profile_2 is changed
+ - update_fabric_external_connection_profile_2.proposed.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+ - update_fabric_external_connection_profile_2.proposed.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_full_mesh"
+ - update_fabric_external_connection_profile_2.current.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_full_mesh"
+ - update_fabric_external_connection_profile_2.previous.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_rr"
+
+ # DELETE FABRIC EXTERNAL CONNECTION PROFILE
+ - name: Delete ansible_fabric_ext_conn_profile with check mode
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *delete_fabric_external_connection_profile
+ check_mode: true
+ register: delete_fabric_external_connection_profile_cm
+
+ - name: Delete ansible_fabric_ext_conn_profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *delete_fabric_external_connection_profile
+ register: delete_fabric_external_connection_profile
+
+ # DELETE FABRIC EXTERNAL CONNECTION PROFILE AGAIN TO TEST IDEMPOTENCE
+ - name: Delete ansible_fabric_ext_conn_profile again
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *delete_fabric_external_connection_profile
+ register: delete_fabric_external_connection_profile_again
+
+ - name: Verify deletion
+ ansible.builtin.assert:
+ that:
+ - delete_fabric_external_connection_profile is changed
+ - delete_fabric_external_connection_profile.current == []
+ - delete_fabric_external_connection_profile.previous.0.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - delete_fabric_external_connection_profile.previous.0.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - delete_fabric_external_connection_profile.previous.0.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - delete_fabric_external_connection_profile.previous.0.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - delete_fabric_external_connection_profile.previous.0.fvFabricExtConnP.attributes.siteId == "1"
+ - delete_fabric_external_connection_profile.previous.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_full_mesh"
+ - delete_fabric_external_connection_profile.previous.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+ - delete_fabric_external_connection_profile_cm is changed
+ - delete_fabric_external_connection_profile_cm.proposed == {}
+ - delete_fabric_external_connection_profile_cm.current != []
+ - delete_fabric_external_connection_profile_cm.previous.0.fvFabricExtConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1"
+ - delete_fabric_external_connection_profile_cm.previous.0.fvFabricExtConnP.attributes.name == "ansible_fabric_ext_conn_profile"
+ - delete_fabric_external_connection_profile_cm.previous.0.fvFabricExtConnP.attributes.descr == "Fabric External Connection Profile"
+ - delete_fabric_external_connection_profile_cm.previous.0.fvFabricExtConnP.attributes.rt == "extended:as2-nn4:5:16"
+ - delete_fabric_external_connection_profile_cm.previous.0.fvFabricExtConnP.attributes.siteId == "1"
+ - delete_fabric_external_connection_profile_cm.previous.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.type == "automatic_with_full_mesh"
+ - delete_fabric_external_connection_profile_cm.previous.0.fvFabricExtConnP.children.0.fvPeeringP.attributes.password is undefined
+ - delete_fabric_external_connection_profile_again is not changed
+ - delete_fabric_external_connection_profile_again.current == []
+ - delete_fabric_external_connection_profile_again.previous == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/tasks/main.yml
new file mode 100644
index 000000000..8aa053186
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_external_routing_profile/tasks/main.yml
@@ -0,0 +1,278 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# GET Credentials from the inventory
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: "{{ aci_validate_certs | default(false) }}"
+ use_ssl: "{{ aci_use_ssl | default(true) }}"
+ use_proxy: "{{ aci_use_proxy | default(true) }}"
+ output_level: "{{ aci_output_level | default('info') }}"
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == []
+ block:
+
+ # CLEAN ENVIRONMENT
+ - name: Ensure fabric external connection profile is absent before testing
+ cisco.aci.aci_fabric_external_connection_profile: &delete_fabric_external_connection_profile
+ <<: *aci_info
+ fabric_id: "1"
+ name: "ansible_fabric_ext_conn_profile"
+ community: "extended:as2-nn4:5:16"
+ state: absent
+ register: cleaned
+
+ - name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+ when: cleaned is changed
+
+ - name: Ensure ansible_fabric_ext_routing_profile is absent before testing
+ cisco.aci.aci_fabric_external_routing_profile: &delete_fabric_external_routing_profile
+ <<: *aci_info
+ fabric_id: 1
+ name: ansible_fabric_ext_routing_profile
+ state: absent
+
+ - name: Create fabric external connection profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *delete_fabric_external_connection_profile
+ state: present
+
+ # CREATE FABRIC EXTERNAL ROUTING PROFILE
+ - name: Create ansible_fabric_ext_routing_profile with check mode
+ cisco.aci.aci_fabric_external_routing_profile: &create_fabric_external_routing_profile
+ <<: *aci_info
+ fabric_id: "1"
+ description: "Fabric external routing profile"
+ name: "ansible_fabric_ext_routing_profile"
+ subnets:
+ # Intentional duplicate subnet test
+ - 1.2.3.4/24
+ - 1.2.3.4/24
+ - 5.6.7.8/24
+ state: present
+ check_mode: true
+ register: add_fabric_external_routing_profile_cm
+
+ - name: Create ansible_fabric_ext_routing_profile
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *create_fabric_external_routing_profile
+ state: present
+ register: add_fabric_external_routing_profile
+
+ - name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+ when: add_fabric_external_routing_profile is changed
+
+ # CREATE FABRIC EXTERNAL ROUTING PROFILE AGAIN TO TEST IDEMPOTENCE
+ - name: Create ansible_fabric_ext_routing_profile again
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *create_fabric_external_routing_profile
+ state: present
+ register: add_fabric_external_routing_profile_again
+
+ - name: Verify creation
+ ansible.builtin.assert:
+ that:
+ - add_fabric_external_routing_profile is changed
+ - add_fabric_external_routing_profile.previous == []
+ - add_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - add_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "1.2.3.4/24"
+ - add_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "5.6.7.8/24"
+ - add_fabric_external_routing_profile_cm is changed
+ - add_fabric_external_routing_profile_cm.previous == []
+ - add_fabric_external_routing_profile_cm.current == []
+ - add_fabric_external_routing_profile_cm.proposed.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile_cm.proposed.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - add_fabric_external_routing_profile_cm.proposed.l3extFabricExtRoutingP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_external_routing_profile_cm.proposed.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile_cm.proposed.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "1.2.3.4/24"
+ - add_fabric_external_routing_profile_cm.proposed.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "5.6.7.8/24"
+ - add_fabric_external_routing_profile_again is not changed
+ - add_fabric_external_routing_profile_again.current == add_fabric_external_routing_profile_again.previous
+ - add_fabric_external_routing_profile_again.current.0.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile_again.current.0.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - add_fabric_external_routing_profile_again.current.0.l3extFabricExtRoutingP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_external_routing_profile_again.current.0.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile_again.current.0.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "1.2.3.4/24"
+ - add_fabric_external_routing_profile_again.current.0.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "5.6.7.8/24"
+ - add_fabric_external_routing_profile_again.previous.0.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile_again.previous.0.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - add_fabric_external_routing_profile_again.previous.0.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - add_fabric_external_routing_profile_again.previous.0.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "1.2.3.4/24"
+ - add_fabric_external_routing_profile_again.previous.0.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "5.6.7.8/24"
+
+ # QUERY FABRIC EXTERNAL ROUTING PROFILE
+ - name: Query fabric external routing profile
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *aci_info
+ fabric_id: 1
+ name: ansible_fabric_ext_routing_profile
+ state: query
+ register: query_fabric_external_routing_profile
+
+ # QUERY ALL FABRIC EXTERNAL ROUTING PROFILE
+ - name: Query all fabric external routing profile
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *aci_info
+ state: query
+ register: query_fabric_external_routing_profile_all
+
+ - name: Verify query
+ ansible.builtin.assert:
+ that:
+ - query_fabric_external_routing_profile is not changed
+ - query_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - query_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - query_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - query_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "1.2.3.4/24"
+ - query_fabric_external_routing_profile.current.0.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "5.6.7.8/24"
+ - query_fabric_external_routing_profile_all is not changed
+ - query_fabric_external_routing_profile_all.current | length == 1
+ - query_fabric_external_routing_profile_all.current.0.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - query_fabric_external_routing_profile_all.current.0.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - query_fabric_external_routing_profile_all.current.0.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - query_fabric_external_routing_profile_all.current.0.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "1.2.3.4/24"
+ - query_fabric_external_routing_profile_all.current.0.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "5.6.7.8/24"
+
+ # UPDATE SUBNETS
+ - name: Update fabric external routing profile - change subnets
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *create_fabric_external_routing_profile
+ subnets:
+ - 5.6.7.8/24
+ - 9.10.11.12/24
+ state: present
+ register: update_fabric_external_routing_profile_1
+
+ - name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+
+ - name: Update fabric external routing profile - remove 1 subnet
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *create_fabric_external_routing_profile
+ subnets:
+ - 9.10.11.12/24
+ state: present
+ register: update_fabric_external_routing_profile_2
+
+ - name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+
+ - name: Update fabric external routing profile - remove all subnets
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *create_fabric_external_routing_profile
+ subnets: null
+ state: present
+ register: update_fabric_external_routing_profile_3
+
+ - name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+
+ - name: Verify subnet update
+ ansible.builtin.assert:
+ that:
+ - update_fabric_external_routing_profile_1 is changed
+ - update_fabric_external_routing_profile_1.proposed.l3extFabricExtRoutingP.children | length == 3
+ - update_fabric_external_routing_profile_1.proposed.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "1.2.3.4/24"
+ - update_fabric_external_routing_profile_1.proposed.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.status == "deleted"
+ - update_fabric_external_routing_profile_1.proposed.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "5.6.7.8/24"
+ - update_fabric_external_routing_profile_1.proposed.l3extFabricExtRoutingP.children.2.l3extSubnet.attributes.ip == "9.10.11.12/24"
+ - update_fabric_external_routing_profile_1.current.0.l3extFabricExtRoutingP.children | length == 2
+ - update_fabric_external_routing_profile_1.current.0.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "5.6.7.8/24"
+ - update_fabric_external_routing_profile_1.current.0.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "9.10.11.12/24"
+ - update_fabric_external_routing_profile_2 is changed
+ - update_fabric_external_routing_profile_2.proposed.l3extFabricExtRoutingP.children | length == 2
+ - update_fabric_external_routing_profile_2.proposed.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "5.6.7.8/24"
+ - update_fabric_external_routing_profile_2.proposed.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.status == "deleted"
+ - update_fabric_external_routing_profile_2.proposed.l3extFabricExtRoutingP.children.1.l3extSubnet.attributes.ip == "9.10.11.12/24"
+ - update_fabric_external_routing_profile_2.current.0.l3extFabricExtRoutingP.children | length == 1
+ - update_fabric_external_routing_profile_2.current.0.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "9.10.11.12/24"
+ - update_fabric_external_routing_profile_3 is changed
+ - update_fabric_external_routing_profile_3.proposed.l3extFabricExtRoutingP.children | length == 1
+ - update_fabric_external_routing_profile_3.proposed.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.ip == "9.10.11.12/24"
+ - update_fabric_external_routing_profile_3.proposed.l3extFabricExtRoutingP.children.0.l3extSubnet.attributes.status == "deleted"
+ - update_fabric_external_routing_profile_3.current.0.l3extFabricExtRoutingP.children is undefined
+
+ # DELETE FABRIC EXTERNAL ROUTING PROFILE
+ - name: Delete ansible_fabric_ext_routing_profile with check mode
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *delete_fabric_external_routing_profile
+ check_mode: true
+ register: delete_fabric_external_routing_profile_cm
+
+ - name: Delete ansible_fabric_ext_routing_profile
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *delete_fabric_external_routing_profile
+ register: delete_fabric_external_routing_profile
+
+ - name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+ when: delete_fabric_external_routing_profile is changed
+
+ # DELETE FABRIC EXTERNAL ROUTING PROFILE AGAIN TO TEST IDEMPOTENCE
+ - name: Delete ansible_fabric_ext_routing_profile again
+ cisco.aci.aci_fabric_external_routing_profile:
+ <<: *delete_fabric_external_routing_profile
+ retries: 4
+ delay: 5
+ register: delete_fabric_external_routing_profile_again
+
+ - name: Verify deletion
+ ansible.builtin.assert:
+ that:
+ - delete_fabric_external_routing_profile is changed
+ - delete_fabric_external_routing_profile.current == []
+ - delete_fabric_external_routing_profile.previous.0.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - delete_fabric_external_routing_profile.previous.0.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - delete_fabric_external_routing_profile.previous.0.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - delete_fabric_external_routing_profile_cm is changed
+ - delete_fabric_external_routing_profile_cm.proposed == {}
+ - delete_fabric_external_routing_profile_cm.current != []
+ - delete_fabric_external_routing_profile_cm.previous.0.l3extFabricExtRoutingP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/fabricExtRoutingP-ansible_fabric_ext_routing_profile"
+ - delete_fabric_external_routing_profile_cm.previous.0.l3extFabricExtRoutingP.attributes.descr == "Fabric external routing profile"
+ - delete_fabric_external_routing_profile_cm.previous.0.l3extFabricExtRoutingP.attributes.name == "ansible_fabric_ext_routing_profile"
+ - delete_fabric_external_routing_profile_again is not changed
+ - delete_fabric_external_routing_profile_again.current == []
+ - delete_fabric_external_routing_profile_again.previous == []
+
+ - name: Clean up fabric external connection profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *delete_fabric_external_connection_profile \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_interface_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_interface_policy_group/tasks/main.yml
index 9f871da6b..a591d6435 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_interface_policy_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_interface_policy_group/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: "Please define the following variables: aci_hostname, aci_username and aci_password."
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -28,21 +28,21 @@
register: version
- name: Ensure leaf_policy_group does not exist
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
name: leaf_policy_group
type: leaf
state: absent
- name: Ensure spine_policy_group does not exist
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
name: spine_policy_group
type: spine
state: absent
- name: Add a leaf fabric interface policy group with check mode
- aci_fabric_interface_policy_group: &cm_leaf_policy_group_present
+ cisco.aci.aci_fabric_interface_policy_group: &cm_leaf_policy_group_present
<<: *aci_info
name: leaf_policy_group
type: leaf
@@ -52,7 +52,7 @@
register: cm_leaf_policy_group_present
- name: Add a leaf fabric interface policy group with normal mode
- aci_fabric_interface_policy_group: &nm_leaf_policy_group_present
+ cisco.aci.aci_fabric_interface_policy_group: &nm_leaf_policy_group_present
<<: *cm_leaf_policy_group_present
dwdm_policy: default
link_level_policy: default
@@ -63,12 +63,12 @@
register: nm_leaf_policy_group_present
- name: Add a leaf fabric interface policy group with normal mode again
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *nm_leaf_policy_group_present
register: nm_leaf_policy_group_present_again
- name: Add a spine fabric interface policy group with check mode
- aci_fabric_interface_policy_group: &cm_spine_policy_group_present
+ cisco.aci.aci_fabric_interface_policy_group: &cm_spine_policy_group_present
<<: *aci_info
name: spine_policy_group
type: spine
@@ -87,7 +87,7 @@
when: version.current.0.topSystem.attributes.version is version('6.0(2h)', '>=')
block:
- name: Add a spine fabric interface policy group with transceiver_policy_tdn
- aci_fabric_interface_policy_group: &tp_spine_policy_group_present
+ cisco.aci.aci_fabric_interface_policy_group: &tp_spine_policy_group_present
<<: *aci_info
name: spine_policy_group
type: spine
@@ -97,7 +97,7 @@
register: tp_spine_policy_group_present
- name: Remove the transceiver_policy from the spine fabric interface policy group
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
name: spine_policy_group
type: spine
@@ -107,7 +107,7 @@
register: tp_spine_policy_group_absent
- name: Assertions check for add fabric interface policy groups
- assert:
+ ansible.builtin.assert:
that:
- tp_spine_policy_group_present is changed
- tp_spine_policy_group_absent is changed
@@ -115,17 +115,17 @@
- tp_spine_policy_group_absent.current.0.fabricSpPortPGrp.children | selectattr('fabricRsOpticsFabIfPol.attributes.tDn', 'defined') | selectattr('fabricRsOpticsFabIfPol.attributes.tDn', 'equalto', "")
- name: Add a spine fabric interface policy group with normal mode
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_spine_policy_group_present
register: nm_spine_policy_group_present
- name: Add a spine fabric interface policy group with normal mode again
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_spine_policy_group_present
register: nm_spine_policy_group_present_again
- name: Update a spine fabric interface policy group with check mode
- aci_fabric_interface_policy_group: &cm_spine_policy_group_update
+ cisco.aci.aci_fabric_interface_policy_group: &cm_spine_policy_group_update
<<: *cm_spine_policy_group_present
descr: spine_policy_group updated
dwdm_policy: ""
@@ -138,17 +138,17 @@
register: cm_spine_policy_group_update
- name: Update a spine fabric interface policy group with normal mode
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_spine_policy_group_update
register: nm_spine_policy_group_update
- name: Update a spine fabric interface policy group with normal mode again
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_spine_policy_group_update
register: nm_spine_policy_group_update_again
- name: Assertions check for add fabric interface policy groups
- assert:
+ ansible.builtin.assert:
that:
- cm_leaf_policy_group_present is changed
- cm_leaf_policy_group_present.current == []
@@ -214,7 +214,7 @@
- nm_spine_policy_group_update_again.current.0.fabricSpPortPGrp.attributes.descr == "spine_policy_group updated"
- name: Invalid test - add a fabric interface policy group without type
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
name: nt_spine_policy_group
descr: negative test nt_spine_policy_group
@@ -223,7 +223,7 @@
ignore_errors: true
- name: Invalid test - add a fabric interface policy group without name
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
type: spine
descr: negative test spine_policy_group
@@ -232,7 +232,7 @@
ignore_errors: true
- name: Assertions check for invalid test - add fabric interface policy groups
- assert:
+ ansible.builtin.assert:
that:
- nt_without_type is not changed
- nt_without_type.msg == "missing required arguments{{':'}} type"
@@ -240,7 +240,7 @@
- nt_without_name.msg == "state is present but all of the following are missing{{':'}} name"
- name: Query a leaf fabric interface policy group with name
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
name: leaf_policy_group
type: leaf
@@ -248,14 +248,14 @@
register: query_leaf_policy_group
- name: Query all leaf fabric interface policy groups
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
type: leaf
state: query
register: query_all_leaf_policy_group
- name: Query a spine fabric interface policy group with name
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
name: spine_policy_group
type: spine
@@ -263,14 +263,14 @@
register: query_a_spine_policy_group
- name: Query all spine fabric interface policy groups
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *aci_info
type: spine
state: query
register: query_all_spine_policy_group
- name: Assertions check for query a fabric interface policy groups
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_policy_group is not changed
- query_leaf_policy_group.current != []
@@ -290,41 +290,41 @@
- query_all_spine_policy_group.current | length >= 1
- name: Remove a leaf fabric interface policy group with check mode
- aci_fabric_interface_policy_group: &cm_leaf_policy_group_absent
+ cisco.aci.aci_fabric_interface_policy_group: &cm_leaf_policy_group_absent
<<: *cm_leaf_policy_group_present
state: absent
check_mode: true
register: cm_leaf_policy_group_absent
- name: Remove a leaf fabric interface policy group with normal mode
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_leaf_policy_group_absent
register: nm_leaf_policy_group_absent
- name: Remove a leaf fabric interface policy group with normal mode again
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_leaf_policy_group_absent
register: nm_leaf_policy_group_absent_again
- name: Remove a spine fabric interface policy group with check mode
- aci_fabric_interface_policy_group: &cm_spine_policy_group_absent
+ cisco.aci.aci_fabric_interface_policy_group: &cm_spine_policy_group_absent
<<: *cm_spine_policy_group_present
state: absent
check_mode: true
register: cm_spine_policy_group_absent
- name: Remove a spine fabric interface policy group with normal mode
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_spine_policy_group_absent
register: nm_spine_policy_group_absent
- name: Remove a spine fabric interface policy group with normal mode again
- aci_fabric_interface_policy_group:
+ cisco.aci.aci_fabric_interface_policy_group:
<<: *cm_spine_policy_group_absent
register: nm_spine_policy_group_absent_again
- name: Assertions check for remove a fabric interface policy groups
- assert:
+ ansible.builtin.assert:
that:
- cm_leaf_policy_group_absent is changed
- cm_leaf_policy_group_absent.current != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_profile/tasks/main.yml
index d4bf60dd5..6fb60c923 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_profile/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,21 +22,21 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_leaf_switch_prf if it already exists
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
# CREATE SPINE SWITCH POLICY
- name: Create ansible_leaf_switch_prf
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: present
register: add_switch_prf
- name: Verify profile creation
- assert:
+ ansible.builtin.assert:
that:
- add_switch_prf.current.0.fabricLeafP.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf"
- add_switch_prf.current.0.fabricLeafP.attributes.name == "ansible_leaf_switch_prf"
@@ -44,14 +44,14 @@
# CREATE SPINE SWITCH POLICY AGAIN TO TEST IDEMPOTENCE
- name: Create ansible_leaf_switch_prf again
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: present
register: add_switch_prf_again
- name: Verify profile creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_switch_prf_again is not changed
- add_switch_prf_again.current.0.fabricLeafP.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf"
@@ -59,14 +59,14 @@
# QUERY SPINE SWITCH POLICY
- name: query leaf switch profile
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: query
register: query_switch_prf
- name: Verify profile query
- assert:
+ ansible.builtin.assert:
that:
- query_switch_prf is not changed
- query_switch_prf.current.0.fabricLeafP.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf"
@@ -74,26 +74,26 @@
# QUERY ALL SPINE SWITCH POLICIES
- name: query all leaf switch profiles
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
state: query
register: query_switch_prf_all
- name: Verify profile query idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_switch_prf_all is not changed
# DELETE SPINE SWITCH PROFILE
- name: Delete ansible_leaf_switch_prf
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
register: delete_switch_prf
- name: Verify profile deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_switch_prf is changed
- delete_switch_prf.current == []
@@ -102,21 +102,21 @@
# DELETE SPINE SWITCH PROFILE AGAIN TO TEST IDEMPOTENCE
- name: Delete ansible_leaf_switch_prf again
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
register: delete_switch_prf_again
- name: Verify profile deletion idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_switch_prf_again is not changed
- delete_switch_prf_again.current == []
# CLEAN UP ENVIRONMENT
- name: Remove ansible_leaf_switch_prf
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_switch_assoc/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_switch_assoc/tasks/main.yml
index 35caafdb3..68050b8d0 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_switch_assoc/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_leaf_switch_assoc/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,21 +22,21 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_leaf_switch_prf if it already exists
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
# CREATE SPINE SWITCH POLICY
- name: Create ansible_leaf_switch_prf
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: present
# CREATE SPINE SWITCH ASSOCIATION
- name: Create a leaf switch profile association
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc
@@ -45,7 +45,7 @@
register: add_association
- name: Verify association creation
- assert:
+ ansible.builtin.assert:
that:
- add_association.current.0.fabricLeafS.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc-typ-range"
- add_association.current.0.fabricLeafS.attributes.name == "ansible_leaf_switch_assoc"
@@ -53,13 +53,13 @@
- add_association.current.0.fabricLeafS.attributes.annotation == 'orchestrator:ansible'
- name: Verify Policy Group association
- assert:
+ ansible.builtin.assert:
that:
- add_association.current.0.fabricLeafS.children.0.fabricRsLeNodePGrp.attributes.tDn == "uni/fabric/funcprof/lenodepgrp-ansible_leaf_pol_grp1"
# CREATE SPINE SWITCH ASSOCIATION AGAIN TO TEST IDEMPOTENCE
- name: Create a leaf switch profile association again
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc
@@ -68,7 +68,7 @@
register: add_association_again
- name: Verify association creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_association_again is not changed
- add_association_again.current.0.fabricLeafS.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc-typ-range"
@@ -76,13 +76,13 @@
- add_association_again.current.0.fabricLeafS.attributes.type == "range"
- name: Verify Policy Group association idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_association_again.current.0.fabricLeafS.children.0.fabricRsLeNodePGrp.attributes.tDn == "uni/fabric/funcprof/lenodepgrp-ansible_leaf_pol_grp1"
# CREATE SPINE SWITCH ASSOCIATION WITHOUT POLICY GROUP
- name: Create a leaf switch profile association without a policy group
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc2
@@ -90,7 +90,7 @@
register: add_association_without_policy_group
- name: Verify association creation
- assert:
+ ansible.builtin.assert:
that:
- add_association_without_policy_group.current.0.fabricLeafS.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc2-typ-range"
- add_association_without_policy_group.current.0.fabricLeafS.attributes.name == "ansible_leaf_switch_assoc2"
@@ -98,7 +98,7 @@
# UPDATE SPINE SWITCH POLICY GROUP ASSOCIATION
- name: Update a leaf switch profile association
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc
@@ -107,7 +107,7 @@
register: update_association
- name: Verify association update
- assert:
+ ansible.builtin.assert:
that:
- update_association is changed
- update_association.current.0.fabricLeafS.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc-typ-range"
@@ -115,13 +115,13 @@
- update_association.current.0.fabricLeafS.attributes.type == "range"
- name: Verify Policy Group association update
- assert:
+ ansible.builtin.assert:
that:
- update_association.current.0.fabricLeafS.children.0.fabricRsLeNodePGrp.attributes.tDn == "uni/fabric/funcprof/lenodepgrp-ansible_leaf_pol_grp2"
# QUERY SPINE SWITCH ASSOCIATION
- name: Query leaf switch profile association
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc
@@ -129,7 +129,7 @@
register: query_association
- name: Verify query data
- assert:
+ ansible.builtin.assert:
that:
- query_association is not changed
- query_association.current.0.fabricLeafS.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc-typ-range"
@@ -137,25 +137,25 @@
- query_association.current.0.fabricLeafS.attributes.type == "range"
- name: Verify Policy Group association
- assert:
+ ansible.builtin.assert:
that:
- query_association.current.0.fabricLeafS.children.0.fabricRsLeNodePGrp.attributes.tDn == "uni/fabric/funcprof/lenodepgrp-ansible_leaf_pol_grp2"
# QUERY ALL SPINE SWITCH ASSOCIATIONS
- name: Query leaf switch profile association
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
state: query
register: query_association_all
- name: Verify query all idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_association_all is not changed
# DELETE SPINE SWITCH ASSOCIATION
- name: Delete leaf switch profile association
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc
@@ -163,7 +163,7 @@
register: delete_association
- name: Verify association removal
- assert:
+ ansible.builtin.assert:
that:
- delete_association is changed
- delete_association.current == []
@@ -173,7 +173,7 @@
# DELETE SPINE SWITCH ASSOCIATION AGAIN TO TEST IDEMPOTENCE
- name: Delete leaf switch profile association again
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc
@@ -181,14 +181,14 @@
register: delete_association_again
- name: Verify association removal idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_association_again is not changed
- delete_association_again.current == []
# CLEAN UP ENVIRONMENT
- name: Remove ansible_leaf_switch_prf
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.crt b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.crt
new file mode 100644
index 000000000..cfac5531e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICODCCAaGgAwIBAgIJAIt8XMntue0VMA0GCSqGSIb3DQEBCwUAMDQxDjAMBgNV
+BAMMBUFkbWluMRUwEwYDVQQKDAxZb3VyIENvbXBhbnkxCzAJBgNVBAYTAlVTMCAX
+DTE4MDEwOTAwNTk0NFoYDzIxMTcxMjE2MDA1OTQ0WjA0MQ4wDAYDVQQDDAVBZG1p
+bjEVMBMGA1UECgwMWW91ciBDb21wYW55MQswCQYDVQQGEwJVUzCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAohG/7axtt7CbSaMP7r+2mhTKbNgh0Ww36C7Ta14i
+v+VmLyKkQHnXinKGhp6uy3Nug+15a+eIu7CrgpBVMQeCiWfsnwRocKcQJWIYDrWl
+XHxGQn31yYKR6mylE7Dcj3rMFybnyhezr5D8GcP85YRPmwG9H2hO/0Y1FUnWu9Iw
+AQkCAwEAAaNQME4wHQYDVR0OBBYEFD0jLXfpkrU/ChzRvfruRs/fy1VXMB8GA1Ud
+IwQYMBaAFD0jLXfpkrU/ChzRvfruRs/fy1VXMAwGA1UdEwQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAOmvre+5tgZ0+F3DgsfxNQqLTrGiBgGCIymPkP/cBXXkNuJyl
+3ac7tArHQc7WEA4U2R2rZbEq8FC3UJJm4nUVtCPvEh3G9OhN2xwYev79yt6pIn/l
+KU0Td2OpVyo0eLqjoX5u2G90IBWzhyjFbo+CcKMrSVKj1YOdG0E3OuiJf00=
+-----END CERTIFICATE-----
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.key b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.key
new file mode 100644
index 000000000..63bb00cc0
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/pki/admin.key
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKIRv+2sbbewm0mj
+D+6/tpoUymzYIdFsN+gu02teIr/lZi8ipEB514pyhoaerstzboPteWvniLuwq4KQ
+VTEHgoln7J8EaHCnECViGA61pVx8RkJ99cmCkepspROw3I96zBcm58oXs6+Q/BnD
+/OWET5sBvR9oTv9GNRVJ1rvSMAEJAgMBAAECgYByu3QO0qF9h7X3JEu0Ld4cKBnB
+giQ2uJC/et7KxIJ/LOvw9GopBthyt27KwG1ntBkJpkTuAaQHkyNns7vLkNB0S0IR
++owVFEcKYq9VCHTaiQU8TDp24gN+yPTrpRuH8YhDVq5SfVdVuTMgHVQdj4ya4VlF
+Gj+a7+ipxtGiLsVGrQJBAM7p0Fm0xmzi+tBOASUAcVrPLcteFIaTBFwfq16dm/ON
+00Khla8Et5kMBttTbqbukl8mxFjBEEBlhQqb6EdQQ0sCQQDIhHx1a9diG7y/4DQA
+4KvR3FCYwP8PBORlSamegzCo+P1OzxiEo0amX7yQMA5UyiP/kUsZrme2JBZgna8S
+p4R7AkEAr7rMhSOPUnMD6V4WgsJ5g1Jp5kqkzBaYoVUUSms5RASz4+cwJVCwTX91
+Y1jcpVIBZmaaY3a0wrx13ajEAa0dOQJBAIpjnb4wqpsEh7VpmJqOdSdGxb1XXfFQ
+sA0T1OQYqQnFppWwqrxIL+d9pZdiA1ITnNqyvUFBNETqDSOrUHwwb2cCQGArE+vu
+ffPUWQ0j+fiK+covFG8NL7H+26NSGB5+Xsn9uwOGLj7K/YT6CbBtr9hJiuWjM1Al
+0V4ltlTuu2mTMaw=
+-----END PRIVATE KEY-----
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/tasks/main.yml
new file mode 100644
index 000000000..d5f90d95d
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access/tasks/main.yml
@@ -0,0 +1,328 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Akini Ross (@akinross)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: aci_hostname, aci_username and aci_password."
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: "{{ aci_validate_certs | default(false) }}"
+ use_ssl: "{{ aci_use_ssl | default(true) }}"
+ use_proxy: "{{ aci_use_proxy | default(true) }}"
+ output_level: "{{ aci_output_level | default('info') }}"
+
+- name: Query system information to fetch version
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+# CLEAN ENVIRONMENT
+- name: Clean environment
+ cisco.aci.aci_fabric_management_access: &aci_fabric_management_access_1_absent
+ <<: *aci_info
+ name: fabric_management_access_policy_1
+ state: absent
+
+- name: Ensure certificate_authority_1 exists
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_1
+ <<: *aci_info
+ name: certificate_authority_1
+ certificate_chain: "{{ lookup('file', 'pki/admin.crt') }}"
+ state: present
+
+- name: Ensure key_ring_1 exists
+ cisco.aci.aci_aaa_key_ring: &key_ring_1
+ <<: *aci_info
+ name: key_ring_1
+ certificate: "{{ lookup('file', 'pki/admin.crt') }}"
+ certificate_authority: certificate_authority_1
+ key: "{{ lookup('file', 'pki/admin.key') }}"
+ state: present
+ register: create_key_ring_1
+ until: create_key_ring_1 is not failed
+ delay: 2
+ retries: 4
+
+# CREATE
+- name: Create a new fabric management access policy (check_mode)
+ cisco.aci.aci_fabric_management_access: &aci_fabric_management_access_1_present
+ <<: *aci_fabric_management_access_1_absent
+ description: "This is a example Fabric Management Access policy."
+ state: present
+ check_mode: true
+ register: cm_create_fabric_management_access_policy_1
+
+- name: Create a new fabric management access policy
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_present
+ register: nm_create_fabric_management_access_policy_1
+
+- name: Create a new fabric management access policy again
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_present
+ register: nm_create_fabric_management_access_policy_1_again
+
+- name: Assertions for creating a fabric management access policy
+ ansible.builtin.assert:
+ that:
+ - cm_create_fabric_management_access_policy_1 is changed
+ - cm_create_fabric_management_access_policy_1.previous == []
+ - cm_create_fabric_management_access_policy_1.current == []
+ - cm_create_fabric_management_access_policy_1.proposed.commPol.attributes.name == "fabric_management_access_policy_1"
+ - cm_create_fabric_management_access_policy_1.proposed.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - nm_create_fabric_management_access_policy_1 is changed
+ - nm_create_fabric_management_access_policy_1.previous == []
+ - nm_create_fabric_management_access_policy_1.current.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_create_fabric_management_access_policy_1.current.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - nm_create_fabric_management_access_policy_1.current.0.commPol.children.0.commShellinabox.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1.current.0.commPol.children.1.commSsh.attributes.adminSt == "enabled"
+ - nm_create_fabric_management_access_policy_1.current.0.commPol.children.2.commTelnet.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1.current.0.commPol.children.3.commHttps.attributes.adminSt == "enabled"
+ - nm_create_fabric_management_access_policy_1.current.0.commPol.children.4.commHttp.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1_again is not changed
+ - nm_create_fabric_management_access_policy_1_again.previous.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_create_fabric_management_access_policy_1_again.previous.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - nm_create_fabric_management_access_policy_1_again.previous.0.commPol.children.0.commShellinabox.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1_again.previous.0.commPol.children.1.commSsh.attributes.adminSt == "enabled"
+ - nm_create_fabric_management_access_policy_1_again.previous.0.commPol.children.2.commTelnet.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1_again.previous.0.commPol.children.3.commHttps.attributes.adminSt == "enabled"
+ - nm_create_fabric_management_access_policy_1_again.previous.0.commPol.children.4.commHttp.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1_again.current.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_create_fabric_management_access_policy_1_again.current.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - nm_create_fabric_management_access_policy_1_again.current.0.commPol.children.0.commShellinabox.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1_again.current.0.commPol.children.1.commSsh.attributes.adminSt == "enabled"
+ - nm_create_fabric_management_access_policy_1_again.current.0.commPol.children.2.commTelnet.attributes.adminSt == "disabled"
+ - nm_create_fabric_management_access_policy_1_again.current.0.commPol.children.3.commHttps.attributes.adminSt == "enabled"
+ - nm_create_fabric_management_access_policy_1_again.current.0.commPol.children.4.commHttp.attributes.adminSt == "disabled"
+
+# UPDATE
+- name: Update an existing fabric management access policy description
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_present
+ description: "This is a changed description."
+ register: nm_update_fabric_management_access_policy_1_change_description
+
+- name: Assertions for updating a fabric management access policy description
+ ansible.builtin.assert:
+ that:
+ - nm_update_fabric_management_access_policy_1_change_description is changed
+ - nm_update_fabric_management_access_policy_1_change_description.previous.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - nm_update_fabric_management_access_policy_1_change_description.previous.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_update_fabric_management_access_policy_1_change_description.current.0.commPol.attributes.descr == "This is a changed description."
+ - nm_update_fabric_management_access_policy_1_change_description.current.0.commPol.attributes.name == "fabric_management_access_policy_1"
+
+- name: Update an existing fabric management access policy telnet, ssh, ssh_web, http, and https configuration
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_present
+ telnet:
+ admin_state: enabled
+ port: 25
+ ssh:
+ admin_state: enabled
+ password_auth_state: enabled
+ port: 20
+ ciphers:
+ - aes128_ctr
+ - aes192_ctr
+ - aes256_ctr
+ kex:
+ - dh_sha1
+ - ecdh_521
+ macs:
+ - sha2_256
+ - sha2_512
+ ssh_web:
+ admin_state: enabled
+ http:
+ admin_state: enabled
+ port: 85
+ allow_origins: http://127.0.0.1:8000
+ allow_credentials: enabled
+ throttle: enabled
+ throttle_rate: 7500
+ throttle_unit: requests_per_minute
+ https:
+ admin_state: enabled
+ port: 445
+ allow_origins: http://127.0.0.1:8000
+ allow_credentials: enabled
+ ssl:
+ - tls_v1.2
+ dh_param: 4096
+ throttle: enabled
+ throttle_rate: 7500
+ throttle_unit: requests_per_minute
+ admin_key_ring: key_ring_1
+ client_certificate_trustpoint: certificate_authority_1
+ client_certificate_authentication_state: enabled
+ register: nm_update_fabric_management_access_policy_1_change_child_configuration
+
+- name: Update an existing fabric management access policy https without admin_key_ring
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_present
+ https:
+ admin_state: enabled
+ port: 443
+ register: nm_update_fabric_management_access_policy_1_change_https_no_keyring
+
+- name: Assertions for updating a fabric management access policy telnet, ssh_web, http configuration
+ ansible.builtin.assert:
+ that:
+ - nm_update_fabric_management_access_policy_1_change_child_configuration is changed
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.0.commShellinabox.attributes.adminSt == "disabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.1.commSsh.attributes.adminSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.2.commTelnet.attributes.adminSt == "disabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.2.commTelnet.attributes.port == "23"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.adminSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.port == "443"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.accessControlAllowCredential == "disabled"
+ # - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.accessControlAllowOrigins == "" Commented because the default value is different between versions.
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.clientCertAuthState == "disabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.dhParam == "none"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.sslProtocols == "TLSv1.1,TLSv1.2"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.globalThrottleRate == "10000"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.globalThrottleSt == "disabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.attributes.globalThrottleUnit == "r/s"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.3.commHttps.children.0.commRsKeyRing.attributes.tnPkiKeyRingName == "default"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.4.commHttp.attributes.adminSt == "disabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.previous.0.commPol.children.4.commHttp.attributes.port == "80"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.0.commShellinabox.attributes.adminSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.1.commSsh.attributes.adminSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.1.commSsh.attributes.passwordAuth == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.1.commSsh.attributes.port == "20"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.1.commSsh.attributes.sshCiphers == "aes128-ctr,aes192-ctr,aes256-ctr"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.1.commSsh.attributes.kexAlgos == "diffie-hellman-group14-sha1,ecdh-sha2-nistp521"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.1.commSsh.attributes.sshMacs == "hmac-sha2-256,hmac-sha2-512"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.2.commTelnet.attributes.adminSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.2.commTelnet.attributes.port == "25"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.adminSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.port == "445"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.accessControlAllowCredential == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.accessControlAllowOrigins == "http://127.0.0.1:8000"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.clientCertAuthState == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.dhParam == "4096"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.sslProtocols == "TLSv1.2"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.globalThrottleRate == "7500"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.globalThrottleSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.attributes.globalThrottleUnit == "r/m"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.children.0.commRsKeyRing.attributes.tnPkiKeyRingName == "key_ring_1"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.3.commHttps.children.1.commRsClientCertCA.attributes.tDn == "uni/userext/pkiext/tp-certificate_authority_1"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.4.commHttp.attributes.adminSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.4.commHttp.attributes.port == "85"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.4.commHttp.attributes.accessControlAllowOrigins == "http://127.0.0.1:8000"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.4.commHttp.attributes.accessControlAllowCredential == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.4.commHttp.attributes.globalThrottleSt == "enabled"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.4.commHttp.attributes.globalThrottleRate == "7500"
+ - nm_update_fabric_management_access_policy_1_change_child_configuration.current.0.commPol.children.4.commHttp.attributes.globalThrottleUnit == "r/m"
+ - nm_update_fabric_management_access_policy_1_change_https_no_keyring is changed
+ - nm_update_fabric_management_access_policy_1_change_https_no_keyring.previous.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_update_fabric_management_access_policy_1_change_https_no_keyring.previous.0.commPol.children.3.commHttps.attributes.port == "445"
+ - nm_update_fabric_management_access_policy_1_change_https_no_keyring.previous.0.commPol.children.3.commHttps.children.0.commRsKeyRing.attributes.tnPkiKeyRingName == "key_ring_1"
+ - nm_update_fabric_management_access_policy_1_change_https_no_keyring.current.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_update_fabric_management_access_policy_1_change_https_no_keyring.current.0.commPol.children.3.commHttps.attributes.port == "443"
+ - nm_update_fabric_management_access_policy_1_change_https_no_keyring.current.0.commPol.children.3.commHttps.children.0.commRsKeyRing.attributes.tnPkiKeyRingName == "key_ring_1"
+
+# VERSION SPECIFIC TESTS
+- name: Test fabric management access policy http redirect
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+ block:
+ - name: Update an existing fabric management access policy http redirect >= 5.2
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_present
+ http:
+ redirect: tested
+ register: nm_update_fabric_management_access_policy_1_http_redirect
+
+ - name: Assertions for fabric management access policy http redirect
+ ansible.builtin.assert:
+ that:
+ - nm_update_fabric_management_access_policy_1_http_redirect is changed
+ - nm_update_fabric_management_access_policy_1_http_redirect.current.0.commPol.children.4.commHttp.attributes.redirectSt == "tested"
+
+# QUERY
+- name: Query an fabric management access policy
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_present
+ state: query
+ register: query_fabric_management_access_policy_1
+
+- name: Query all fabric management access policies
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_info
+ state: query
+ register: query_all
+
+- name: Assertions for querying fabric management access policies
+ ansible.builtin.assert:
+ that:
+ - query_fabric_management_access_policy_1 is not changed
+ - query_fabric_management_access_policy_1.current.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - query_fabric_management_access_policy_1.current.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - query_fabric_management_access_policy_1.current.0.commPol.children.0.commShellinabox.attributes.adminSt == "enabled"
+ - query_fabric_management_access_policy_1.current.0.commPol.children.1.commSsh.attributes.adminSt == "enabled"
+ - query_fabric_management_access_policy_1.current.0.commPol.children.2.commTelnet.attributes.adminSt == "enabled"
+ - query_fabric_management_access_policy_1.current.0.commPol.children.3.commHttps.attributes.adminSt == "enabled"
+ - query_fabric_management_access_policy_1.current.0.commPol.children.4.commHttp.attributes.adminSt == "enabled"
+ - query_fabric_management_access_policy_1.current.0.commPol.children | length == 5
+ - query_fabric_management_access_policy_1.current | length == 1
+ - query_all is not changed
+ - query_all.current | length >= 2
+
+# DELETE
+- name: Delete an existing fabric management access policy (check_mode)
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_absent
+ check_mode: true
+ register: cm_delete_fabric_management_access_policy_1
+
+- name: Delete an existing fabric management access policy
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_absent
+ register: nm_delete_fabric_management_access_policy_1
+
+- name: Delete an existing fabric management access policy again
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_absent
+ register: nm_delete_fabric_management_access_policy_1_again
+
+- name: Assertions for deleting a fabric management access policy
+ ansible.builtin.assert:
+ that:
+ - cm_delete_fabric_management_access_policy_1 is changed
+ - cm_delete_fabric_management_access_policy_1.previous.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - cm_delete_fabric_management_access_policy_1.previous.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - cm_delete_fabric_management_access_policy_1.current.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - cm_delete_fabric_management_access_policy_1.current.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - cm_delete_fabric_management_access_policy_1.proposed == {}
+ - nm_delete_fabric_management_access_policy_1 is changed
+ - nm_delete_fabric_management_access_policy_1.previous.0.commPol.attributes.descr == "This is a example Fabric Management Access policy."
+ - nm_delete_fabric_management_access_policy_1.previous.0.commPol.attributes.name == "fabric_management_access_policy_1"
+ - nm_delete_fabric_management_access_policy_1.current == []
+ - nm_delete_fabric_management_access_policy_1_again is not changed
+ - nm_delete_fabric_management_access_policy_1_again.previous == []
+ - nm_delete_fabric_management_access_policy_1_again.current == []
+
+# CLEAN ENVIRONMENT
+- name: Delete key_ring_1
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1
+ state: absent
+ register: delete_key_ring_1
+
+- name: Delete certificate_authority_1
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1
+ state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.crt b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.crt
new file mode 100644
index 000000000..cfac5531e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICODCCAaGgAwIBAgIJAIt8XMntue0VMA0GCSqGSIb3DQEBCwUAMDQxDjAMBgNV
+BAMMBUFkbWluMRUwEwYDVQQKDAxZb3VyIENvbXBhbnkxCzAJBgNVBAYTAlVTMCAX
+DTE4MDEwOTAwNTk0NFoYDzIxMTcxMjE2MDA1OTQ0WjA0MQ4wDAYDVQQDDAVBZG1p
+bjEVMBMGA1UECgwMWW91ciBDb21wYW55MQswCQYDVQQGEwJVUzCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAohG/7axtt7CbSaMP7r+2mhTKbNgh0Ww36C7Ta14i
+v+VmLyKkQHnXinKGhp6uy3Nug+15a+eIu7CrgpBVMQeCiWfsnwRocKcQJWIYDrWl
+XHxGQn31yYKR6mylE7Dcj3rMFybnyhezr5D8GcP85YRPmwG9H2hO/0Y1FUnWu9Iw
+AQkCAwEAAaNQME4wHQYDVR0OBBYEFD0jLXfpkrU/ChzRvfruRs/fy1VXMB8GA1Ud
+IwQYMBaAFD0jLXfpkrU/ChzRvfruRs/fy1VXMAwGA1UdEwQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAOmvre+5tgZ0+F3DgsfxNQqLTrGiBgGCIymPkP/cBXXkNuJyl
+3ac7tArHQc7WEA4U2R2rZbEq8FC3UJJm4nUVtCPvEh3G9OhN2xwYev79yt6pIn/l
+KU0Td2OpVyo0eLqjoX5u2G90IBWzhyjFbo+CcKMrSVKj1YOdG0E3OuiJf00=
+-----END CERTIFICATE-----
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.key b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.key
new file mode 100644
index 000000000..63bb00cc0
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/pki/admin.key
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKIRv+2sbbewm0mj
+D+6/tpoUymzYIdFsN+gu02teIr/lZi8ipEB514pyhoaerstzboPteWvniLuwq4KQ
+VTEHgoln7J8EaHCnECViGA61pVx8RkJ99cmCkepspROw3I96zBcm58oXs6+Q/BnD
+/OWET5sBvR9oTv9GNRVJ1rvSMAEJAgMBAAECgYByu3QO0qF9h7X3JEu0Ld4cKBnB
+giQ2uJC/et7KxIJ/LOvw9GopBthyt27KwG1ntBkJpkTuAaQHkyNns7vLkNB0S0IR
++owVFEcKYq9VCHTaiQU8TDp24gN+yPTrpRuH8YhDVq5SfVdVuTMgHVQdj4ya4VlF
+Gj+a7+ipxtGiLsVGrQJBAM7p0Fm0xmzi+tBOASUAcVrPLcteFIaTBFwfq16dm/ON
+00Khla8Et5kMBttTbqbukl8mxFjBEEBlhQqb6EdQQ0sCQQDIhHx1a9diG7y/4DQA
+4KvR3FCYwP8PBORlSamegzCo+P1OzxiEo0amX7yQMA5UyiP/kUsZrme2JBZgna8S
+p4R7AkEAr7rMhSOPUnMD6V4WgsJ5g1Jp5kqkzBaYoVUUSms5RASz4+cwJVCwTX91
+Y1jcpVIBZmaaY3a0wrx13ajEAa0dOQJBAIpjnb4wqpsEh7VpmJqOdSdGxb1XXfFQ
+sA0T1OQYqQnFppWwqrxIL+d9pZdiA1ITnNqyvUFBNETqDSOrUHwwb2cCQGArE+vu
+ffPUWQ0j+fiK+covFG8NL7H+26NSGB5+Xsn9uwOGLj7K/YT6CbBtr9hJiuWjM1Al
+0V4ltlTuu2mTMaw=
+-----END PRIVATE KEY-----
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/tasks/main.yml
new file mode 100644
index 000000000..5eced8237
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_management_access_https_cipher/tasks/main.yml
@@ -0,0 +1,233 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Akini Ross (@akinross)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: aci_hostname, aci_username and aci_password."
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: "{{ aci_validate_certs | default(false) }}"
+ use_ssl: "{{ aci_use_ssl | default(true) }}"
+ use_proxy: "{{ aci_use_proxy | default(true) }}"
+ output_level: "{{ aci_output_level | default('info') }}"
+
+- name: Query system information to fetch version
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Define cipher in version < 6.0
+ set_fact:
+ supported_cipher: "DHE-RSA-AES128-SHA"
+ supported_cipher_2: "DHE-RSA-AES256-SHA"
+ when: version.current.0.topSystem.attributes.version is version('6.0', '<')
+
+- name: Define speed settings in version >= 6.0
+ set_fact:
+ supported_cipher: "DHE-RSA-AES128-SHA256"
+ supported_cipher_2: "ECDHE-ECDSA-AES128-CCM"
+ when: version.current.0.topSystem.attributes.version is version('6.0', '>=')
+
+# CLEAN ENVIRONMENT
+- name: Clean environment
+ cisco.aci.aci_fabric_management_access: &aci_fabric_management_access_1_absent
+ <<: *aci_info
+ name: fabric_management_access_policy_1
+ state: absent
+
+- name: Ensure certificate_authority_1 exists
+ cisco.aci.aci_aaa_certificate_authority: &certificate_authority_1
+ <<: *aci_info
+ name: certificate_authority_1
+ certificate_chain: "{{ lookup('file', 'pki/admin.crt') }}"
+ state: present
+
+- name: Ensure key_ring_1 exists
+ cisco.aci.aci_aaa_key_ring: &key_ring_1
+ <<: *aci_info
+ name: key_ring_1
+ certificate: "{{ lookup('file', 'pki/admin.crt') }}"
+ certificate_authority: certificate_authority_1
+ key: "{{ lookup('file', 'pki/admin.key') }}"
+ state: present
+ register: create_key_ring_1
+ until: create_key_ring_1 is not failed
+ delay: 2
+ retries: 4
+
+- name: Ensure fabric_management_access_policy_1 exists
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_absent
+ https:
+ admin_state: enabled
+ port: 445
+ admin_key_ring: key_ring_1
+ client_certificate_trustpoint: certificate_authority_1
+ client_certificate_authentication_state: enabled
+ state: present
+
+# CREATE CIPHER
+- name: Create a https ssl cipher (check_mode)
+ cisco.aci.aci_fabric_management_access_https_cipher: &https_ssl_cipher_disabled
+ <<: *aci_info
+ fabric_management_access_policy_name: fabric_management_access_policy_1
+ id: "{{ supported_cipher }}"
+ cipher_state: disabled
+ state: present
+ check_mode: true
+ register: cm_create_https_ssl_cipher
+
+- name: Create a https ssl cipher
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_disabled
+ register: nm_create_https_ssl_cipher
+
+- name: Create a https ssl cipher again
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_disabled
+ register: nm_create_https_ssl_cipher_again
+
+- name: Assertions for disabling a https ssl cipher
+ ansible.builtin.assert:
+ that:
+ - cm_create_https_ssl_cipher is changed
+ - cm_create_https_ssl_cipher.previous == []
+ - cm_create_https_ssl_cipher.current == []
+ - cm_create_https_ssl_cipher.proposed.commCipher.attributes.id == "{{ supported_cipher }}"
+ - cm_create_https_ssl_cipher.proposed.commCipher.attributes.state == "disabled"
+ - nm_create_https_ssl_cipher is changed
+ - nm_create_https_ssl_cipher.previous == []
+ - nm_create_https_ssl_cipher.current.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_create_https_ssl_cipher.current.0.commCipher.attributes.state == "disabled"
+ - nm_create_https_ssl_cipher_again is not changed
+ - nm_create_https_ssl_cipher_again.previous.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_create_https_ssl_cipher_again.previous.0.commCipher.attributes.state == "disabled"
+ - nm_create_https_ssl_cipher_again.current.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_create_https_ssl_cipher_again.current.0.commCipher.attributes.state == "disabled"
+
+# UPDATE CIPHER
+- name: Update https ssl cipher (check_mode)
+ cisco.aci.aci_fabric_management_access_https_cipher: &https_ssl_cipher_enabled
+ <<: *https_ssl_cipher_disabled
+ cipher_state: enabled
+ check_mode: true
+ register: cm_update_https_ssl_cipher
+
+- name: Update https ssl cipher
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_enabled
+ register: nm_update_https_ssl_cipher
+
+- name: Update https ssl cipher again
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_enabled
+ register: nm_update_https_ssl_cipher_again
+
+- name: Assertions for enabling a https ssl cipher
+ ansible.builtin.assert:
+ that:
+ - cm_update_https_ssl_cipher is changed
+ - cm_update_https_ssl_cipher.previous.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - cm_update_https_ssl_cipher.previous.0.commCipher.attributes.state == "disabled"
+ - cm_update_https_ssl_cipher.current.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - cm_update_https_ssl_cipher.current.0.commCipher.attributes.state == "disabled"
+ - cm_update_https_ssl_cipher.proposed.commCipher.attributes.id == "{{ supported_cipher }}"
+ - cm_update_https_ssl_cipher.proposed.commCipher.attributes.state == "enabled"
+ - nm_update_https_ssl_cipher is changed
+ - nm_update_https_ssl_cipher.previous.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_update_https_ssl_cipher.previous.0.commCipher.attributes.state == "disabled"
+ - nm_update_https_ssl_cipher.current.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_update_https_ssl_cipher.current.0.commCipher.attributes.state == "enabled"
+ - nm_update_https_ssl_cipher_again is not changed
+ - nm_update_https_ssl_cipher_again.previous.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_update_https_ssl_cipher_again.previous.0.commCipher.attributes.state == "enabled"
+ - nm_update_https_ssl_cipher_again.current.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_update_https_ssl_cipher_again.current.0.commCipher.attributes.state == "enabled"
+
+# QUERY
+- name: Create another https ssl cipher
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_disabled
+ id: "{{ supported_cipher_2 }}"
+
+- name: Query an fabric management access policy
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_enabled
+ state: query
+ register: query_fabric_management_access_policy_1
+
+- name: Query all fabric management access policies
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *aci_info
+ state: query
+ register: query_all
+
+- name: Assertions for querying fabric management access policies
+ ansible.builtin.assert:
+ that:
+ - query_fabric_management_access_policy_1 is not changed
+ - query_fabric_management_access_policy_1.current | length == 1
+ - query_all is not changed
+ - query_all.current | length >= 2
+
+# DELETE
+- name: Delete https ssl cipher (check_mode)
+ cisco.aci.aci_fabric_management_access_https_cipher: &https_ssl_cipher_deleted
+ <<: *https_ssl_cipher_enabled
+ state: absent
+ check_mode: true
+ register: cm_delete_https_ssl_cipher
+
+- name: Delete https ssl cipher
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_deleted
+ register: nm_delete_https_ssl_cipher
+
+- name: Delete https ssl cipher again
+ cisco.aci.aci_fabric_management_access_https_cipher:
+ <<: *https_ssl_cipher_deleted
+ register: nm_delete_https_ssl_cipher_again
+
+- name: Assertions for deleting a https ssl cipher
+ ansible.builtin.assert:
+ that:
+ - cm_delete_https_ssl_cipher is changed
+ - cm_delete_https_ssl_cipher.previous.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - cm_delete_https_ssl_cipher.previous.0.commCipher.attributes.state == "enabled"
+ - cm_delete_https_ssl_cipher.current.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - cm_delete_https_ssl_cipher.current.0.commCipher.attributes.state == "enabled"
+ - cm_delete_https_ssl_cipher.proposed == {}
+ - nm_delete_https_ssl_cipher is changed
+ - nm_delete_https_ssl_cipher.previous.0.commCipher.attributes.id == "{{ supported_cipher }}"
+ - nm_delete_https_ssl_cipher.previous.0.commCipher.attributes.state == "enabled"
+ - nm_delete_https_ssl_cipher.current == []
+ - nm_delete_https_ssl_cipher_again is not changed
+ - nm_delete_https_ssl_cipher_again.previous == []
+ - nm_delete_https_ssl_cipher_again.current == []
+
+# CLEAN ENVIRONMENT
+- name: Delete fabric_management_access_policy_1
+ cisco.aci.aci_fabric_management_access:
+ <<: *aci_fabric_management_access_1_absent
+
+- name: Delete key_ring_1
+ cisco.aci.aci_aaa_key_ring:
+ <<: *key_ring_1
+ state: absent
+ register: delete_key_ring_1
+
+- name: Delete certificate_authority_1
+ cisco.aci.aci_aaa_certificate_authority:
+ <<: *certificate_authority_1
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node/tasks/main.yml
index 552661556..c769a9a4e 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -91,7 +91,7 @@
ignore_errors: true
- name: Verify add_fabric_node
- assert:
+ ansible.builtin.assert:
that:
- cm_add_fabric_node_tier_2 is changed
- nm_add_fabric_node is changed
@@ -137,7 +137,7 @@
register: nm_add_fabric_node_descr_again
- name: Verify add_fabric_node_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_fabric_node_descr is changed
- nm_add_fabric_node_descr is changed
@@ -157,7 +157,7 @@
register: nm_add_fabric_node_again_no_descr
- name: Verify add_fabric_node_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
# FIXME: Module is not idempotent
- cm_add_fabric_node_again_no_descr is not changed
@@ -183,7 +183,7 @@
register: nm_query_all_fabric_nodes
- name: Verify query_all_fabric_nodes
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_fabric_nodes is not changed
- nm_query_all_fabric_nodes is not changed
@@ -205,7 +205,7 @@
register: nm_query_fabric_node
- name: Verify query_fabric_node
- assert:
+ ansible.builtin.assert:
that:
- cm_query_fabric_node is not changed
- nm_query_fabric_node is not changed
@@ -232,7 +232,7 @@
register: nm_remove_fabric_node_again
- name: Verify remove_fabric_node
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_fabric_node is changed
- nm_remove_fabric_node is changed
@@ -255,7 +255,7 @@
register: nm_query_non_fabric_node
- name: Verify query_non_fabric_node
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_fabric_node is not changed
- nm_query_non_fabric_node is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node_control/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node_control/tasks/main.yml
index f41c69150..5a9d58af1 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node_control/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_node_control/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/tasks/main.yml
new file mode 100644
index 000000000..6da068c24
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod/tasks/main.yml
@@ -0,0 +1,206 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# Virtual pod setup has been skipped due to complex setup requirements assosiated with configuring a vPod.
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# GET Credentials from the inventory
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Ensure Fabric Setup Pod 77 is absent before testing
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ state: absent
+ register: cleaned
+
+- name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+ when: cleaned is changed
+
+# CREATE FABRIC SETUP POD
+- name: Create ansible_fabric_pod_setup with check mode
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ pool: 10.77.0.0/16
+ type: physical
+ description: Ansible test pod setup
+ state: present
+ check_mode: true
+ register: add_fabric_pod_setup_cm
+
+- name: Create ansible_fabric_pod_setup
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ pool: 10.77.0.0/16
+ type: physical
+ description: Ansible test pod setup
+ state: present
+ register: add_fabric_pod_setup
+
+- name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+
+- name: Verify profile creation
+ ansible.builtin.assert:
+ that:
+ - add_fabric_pod_setup is changed
+ - add_fabric_pod_setup.current.0.fabricSetupP.attributes.dn == "uni/controller/setuppol/setupp-77"
+ - add_fabric_pod_setup.current.0.fabricSetupP.attributes.podId == "77"
+ - add_fabric_pod_setup.current.0.fabricSetupP.attributes.podType == "physical"
+ - add_fabric_pod_setup.current.0.fabricSetupP.attributes.tepPool == "10.77.0.0/16"
+ - add_fabric_pod_setup.current.0.fabricSetupP.attributes.descr == "Ansible test pod setup"
+ - add_fabric_pod_setup.current.0.fabricSetupP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_pod_setup_cm is changed
+ - add_fabric_pod_setup_cm.previous == []
+ - add_fabric_pod_setup_cm.current == []
+ - add_fabric_pod_setup_cm.proposed.fabricSetupP.attributes.dn == "uni/controller/setuppol/setupp-77"
+ - add_fabric_pod_setup_cm.proposed.fabricSetupP.attributes.podId == "77"
+ - add_fabric_pod_setup_cm.proposed.fabricSetupP.attributes.podType == "physical"
+ - add_fabric_pod_setup_cm.proposed.fabricSetupP.attributes.tepPool == "10.77.0.0/16"
+ - add_fabric_pod_setup_cm.proposed.fabricSetupP.attributes.descr == "Ansible test pod setup"
+ - add_fabric_pod_setup_cm.proposed.fabricSetupP.attributes.annotation == 'orchestrator:ansible'
+
+# CREATE FABRIC SETUP POD AGAIN TO TEST IDEMPOTENCE
+- name: Create ansible_fabric_pod_setup again
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ pool: 10.77.0.0/16
+ type: physical
+ description: Ansible test pod setup
+ state: present
+ register: add_fabric_pod_setup_again
+
+- name: Verify profile creation idempotence
+ ansible.builtin.assert:
+ that:
+ - add_fabric_pod_setup_again is not changed
+ - add_fabric_pod_setup_again.current.0.fabricSetupP.attributes.dn == "uni/controller/setuppol/setupp-77"
+ - add_fabric_pod_setup_again.current.0.fabricSetupP.attributes.podId == "77"
+ - add_fabric_pod_setup_again.current.0.fabricSetupP.attributes.podType == "physical"
+ - add_fabric_pod_setup_again.current.0.fabricSetupP.attributes.tepPool == "10.77.0.0/16"
+ - add_fabric_pod_setup_again.current.0.fabricSetupP.attributes.descr == "Ansible test pod setup"
+
+# QUERY FABRIC SETUP POD
+- name: Query fabric setup pod
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ state: query
+ register: query_pod_profile
+
+- name: Verify profile query
+ ansible.builtin.assert:
+ that:
+ - query_pod_profile is not changed
+ - query_pod_profile.current.0.fabricSetupP.attributes.dn == "uni/controller/setuppol/setupp-77"
+ - query_pod_profile.current.0.fabricSetupP.attributes.podId == "77"
+ - query_pod_profile.current.0.fabricSetupP.attributes.podType == "physical"
+ - query_pod_profile.current.0.fabricSetupP.attributes.tepPool == "10.77.0.0/16"
+ - query_pod_profile.current.0.fabricSetupP.attributes.descr == "Ansible test pod setup"
+
+# QUERY ALL POD SETUPS
+- name: Query all fabric pod setups
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ state: query
+ register: query_pod_profile_all
+
+- name: Verify profile query idempotence
+ ansible.builtin.assert:
+ that:
+ - query_pod_profile_all is not changed
+
+# DELETE POD SETUP
+- name: Delete pod setup with check mode
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ state: absent
+ check_mode: true
+ register: delete_pod_setup_cm
+
+- name: Delete pod setup
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ state: absent
+ register: delete_pod_setup
+
+- name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+
+- name: Verify pod setup deletion
+ ansible.builtin.assert:
+ that:
+ - delete_pod_setup is changed
+ - delete_pod_setup.current == []
+ - delete_pod_setup.previous.0.fabricSetupP.attributes.dn == "uni/controller/setuppol/setupp-77"
+ - delete_pod_setup.previous.0.fabricSetupP.attributes.podId == "77"
+ - delete_pod_setup.previous.0.fabricSetupP.attributes.podType == "physical"
+ - delete_pod_setup.previous.0.fabricSetupP.attributes.tepPool == "10.77.0.0/16"
+ - delete_pod_setup.previous.0.fabricSetupP.attributes.descr == "Ansible test pod setup"
+ - delete_pod_setup_cm is changed
+ - delete_pod_setup_cm.current != []
+ - delete_pod_setup_cm.previous.0.fabricSetupP.attributes.dn == "uni/controller/setuppol/setupp-77"
+ - delete_pod_setup_cm.previous.0.fabricSetupP.attributes.podId == "77"
+ - delete_pod_setup_cm.previous.0.fabricSetupP.attributes.podType == "physical"
+ - delete_pod_setup_cm.previous.0.fabricSetupP.attributes.tepPool == "10.77.0.0/16"
+ - delete_pod_setup_cm.previous.0.fabricSetupP.attributes.descr == "Ansible test pod setup"
+ - delete_pod_setup_cm.proposed == {}
+
+# DELETE POD SETUP AGAIN TO TEST IDEMPOTENCE
+- name: Delete pod setup again
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 77
+ state: absent
+ register: delete_pod_setup_again
+
+- name: Verify profile deletion idempotence
+ ansible.builtin.assert:
+ that:
+ - delete_pod_setup_again is not changed
+ - delete_pod_setup_again.current == []
+
+# ERROR HANDLING
+- name: Create pod setup with out of range pod_id
+ cisco.aci.aci_fabric_pod:
+ <<: *aci_info
+ pod_id: 300
+ pool: 10.123.0.0/24
+ state: present
+ register: pod_setup_id_error
+ ignore_errors: true
+
+- name: Verify errors of Fabric Setup Pod
+ ansible.builtin.assert:
+ that:
+ - pod_setup_id_error is not changed
+ - pod_setup_id_error is failed
+ - pod_setup_id_error.msg == "Pod ID{{":"}} 300 is invalid; it must be in the range of 1 to 254." \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/tasks/main.yml
new file mode 100644
index 000000000..9a42b4656
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_connectivity_profile/tasks/main.yml
@@ -0,0 +1,225 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Samita Bhattacharjee (@samitab)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# GET Credentials from the inventory
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: "{{ aci_validate_certs | default(false) }}"
+ use_ssl: "{{ aci_use_ssl | default(true) }}"
+ use_proxy: "{{ aci_use_proxy | default(true) }}"
+ output_level: "{{ aci_output_level | default('info') }}"
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == []
+ block:
+
+ # CLEAN ENVIRONMENT
+ - name: Ensure fabric external connection profile is absent before testing
+ cisco.aci.aci_fabric_external_connection_profile: &delete_fabric_external_connection_profile
+ <<: *aci_info
+ fabric_id: "1"
+ name: "ansible_fabric_ext_conn_profile"
+ community: "extended:as2-nn4:5:16"
+ state: absent
+
+ - name: Ensure fabric pod connectivity profile is absent before testing
+ cisco.aci.aci_fabric_pod_connectivity_profile: &delete_fabric_pod_connectivity_profile
+ <<: *aci_info
+ fabric_id: 1
+ pod_id: 1
+ state: absent
+
+ - name: Create fabric external connection profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *delete_fabric_external_connection_profile
+ state: present
+
+ # CREATE FABRIC POD CONNECTIVITY PROFILE
+ - name: Create fabric pod connectivity profile with check mode
+ cisco.aci.aci_fabric_pod_connectivity_profile: &create_fabric_pod_connectivity_profile
+ <<: *aci_info
+ fabric_id: "1"
+ description: "Fabric Pod Connectivity Profile"
+ pod_id: "1"
+ unicast_tep: "10.1.1.2/32"
+ data_plane_tep: "10.1.1.1/32"
+ state: present
+ check_mode: true
+ register: add_fabric_pod_connectivity_profile_cm
+
+ - name: Create fabric pod connectivity profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *create_fabric_pod_connectivity_profile
+ state: present
+ register: add_fabric_pod_connectivity_profile
+
+ # CREATE FABRIC POD CONNECTIVITY PROFILE AGAIN TO TEST IDEMPOTENCE
+ - name: Create fabric pod connectivity profile again
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *create_fabric_pod_connectivity_profile
+ state: present
+ register: add_fabric_pod_connectivity_profile_again
+
+ - name: Verify creation
+ ansible.builtin.assert:
+ that:
+ - add_fabric_pod_connectivity_profile is changed
+ - add_fabric_pod_connectivity_profile.previous == []
+ - add_fabric_pod_connectivity_profile.current.0.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - add_fabric_pod_connectivity_profile.current.0.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - add_fabric_pod_connectivity_profile.current.0.fvPodConnP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_pod_connectivity_profile.current.0.fvPodConnP.attributes.id == "1"
+ - add_fabric_pod_connectivity_profile.current.0.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.2/32"
+ - add_fabric_pod_connectivity_profile.current.0.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.1/32"
+ - add_fabric_pod_connectivity_profile_cm is changed
+ - add_fabric_pod_connectivity_profile_cm.previous == []
+ - add_fabric_pod_connectivity_profile_cm.current == []
+ - add_fabric_pod_connectivity_profile_cm.proposed.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - add_fabric_pod_connectivity_profile_cm.proposed.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - add_fabric_pod_connectivity_profile_cm.proposed.fvPodConnP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_pod_connectivity_profile_cm.proposed.fvPodConnP.attributes.id == "1"
+ - add_fabric_pod_connectivity_profile_cm.proposed.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.2/32"
+ - add_fabric_pod_connectivity_profile_cm.proposed.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.1/32"
+ - add_fabric_pod_connectivity_profile_again is not changed
+ - add_fabric_pod_connectivity_profile_again.current == add_fabric_pod_connectivity_profile_again.previous
+ - add_fabric_pod_connectivity_profile_again.current.0.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - add_fabric_pod_connectivity_profile_again.current.0.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - add_fabric_pod_connectivity_profile_again.current.0.fvPodConnP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_pod_connectivity_profile_again.current.0.fvPodConnP.attributes.id == "1"
+ - add_fabric_pod_connectivity_profile_again.current.0.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.2/32"
+ - add_fabric_pod_connectivity_profile_again.current.0.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.1/32"
+ - add_fabric_pod_connectivity_profile_again.previous.0.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - add_fabric_pod_connectivity_profile_again.previous.0.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - add_fabric_pod_connectivity_profile_again.previous.0.fvPodConnP.attributes.id == "1"
+ - add_fabric_pod_connectivity_profile_again.previous.0.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.2/32"
+ - add_fabric_pod_connectivity_profile_again.previous.0.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.1/32"
+
+ # QUERY FABRIC POD CONNECTIVITY PROFILE
+ - name: Query fabric pod connectivity profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *aci_info
+ fabric_id: 1
+ pod_id: 1
+ state: query
+ register: query_fabric_pod_connectivity_profile
+
+ # QUERY ALL FABRIC POD CONNECTIVITY PROFILE
+ - name: Query all fabric pod connectivity profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *aci_info
+ state: query
+ register: query_fabric_pod_connectivity_profile_all
+
+ - name: Verify query
+ ansible.builtin.assert:
+ that:
+ - query_fabric_pod_connectivity_profile is not changed
+ - query_fabric_pod_connectivity_profile.current.0.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - query_fabric_pod_connectivity_profile.current.0.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - query_fabric_pod_connectivity_profile.current.0.fvPodConnP.attributes.id == "1"
+ - query_fabric_pod_connectivity_profile.current.0.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.2/32"
+ - query_fabric_pod_connectivity_profile.current.0.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.1/32"
+ - query_fabric_pod_connectivity_profile_all is not changed
+ - query_fabric_pod_connectivity_profile_all.current | length == 1
+ - query_fabric_pod_connectivity_profile_all.current.0.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - query_fabric_pod_connectivity_profile_all.current.0.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - query_fabric_pod_connectivity_profile_all.current.0.fvPodConnP.attributes.id == "1"
+ - query_fabric_pod_connectivity_profile_all.current.0.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.2/32"
+ - query_fabric_pod_connectivity_profile_all.current.0.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.1/32"
+
+ - name: Update fabric pod connectivity profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *create_fabric_pod_connectivity_profile
+ unicast_tep: "10.1.1.3/32"
+ data_plane_tep: "10.1.1.4/32"
+ state: present
+ register: update_fabric_pod_connectivity_profile
+
+ - name: Update fabric pod connectivity profile - remove unicast and data plane tep
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *create_fabric_pod_connectivity_profile
+ unicast_tep: null
+ data_plane_tep: null
+ state: present
+ register: update_fabric_pod_connectivity_profile_2
+
+ - name: Verify updates
+ ansible.builtin.assert:
+ that:
+ - update_fabric_pod_connectivity_profile is changed
+ - update_fabric_pod_connectivity_profile.proposed.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.2/32"
+ - update_fabric_pod_connectivity_profile.proposed.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.status == "deleted"
+ - update_fabric_pod_connectivity_profile.proposed.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.1/32"
+ - update_fabric_pod_connectivity_profile.proposed.fvPodConnP.children.1.fvIp.attributes.status == "deleted"
+ - update_fabric_pod_connectivity_profile.proposed.fvPodConnP.children.2.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.3/32"
+ - update_fabric_pod_connectivity_profile.proposed.fvPodConnP.children.3.fvIp.attributes.addr == "10.1.1.4/32"
+ - update_fabric_pod_connectivity_profile.current.0.fvPodConnP.children | length == 2
+ - update_fabric_pod_connectivity_profile.current.0.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.3/32"
+ - update_fabric_pod_connectivity_profile.current.0.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.4/32"
+ - update_fabric_pod_connectivity_profile_2 is changed
+ - update_fabric_pod_connectivity_profile_2.proposed.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.addr == "10.1.1.3/32"
+ - update_fabric_pod_connectivity_profile_2.proposed.fvPodConnP.children.0.fvExtRoutableUcastConnP.attributes.status == "deleted"
+ - update_fabric_pod_connectivity_profile_2.proposed.fvPodConnP.children.1.fvIp.attributes.addr == "10.1.1.4/32"
+ - update_fabric_pod_connectivity_profile_2.proposed.fvPodConnP.children.1.fvIp.attributes.status == "deleted"
+ - update_fabric_pod_connectivity_profile_2.current.0.fvPodConnP.children is undefined
+
+ # DELETE FABRIC POD CONNECTIVITY PROFILE
+ - name: Delete fabric pod connectivity profile with check mode
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *delete_fabric_pod_connectivity_profile
+ check_mode: true
+ register: delete_fabric_pod_connectivity_profile_cm
+
+ - name: Delete fabric pod connectivity profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *delete_fabric_pod_connectivity_profile
+ register: delete_fabric_pod_connectivity_profile
+
+ # DELETE FABRIC POD CONNECTIVITY PROFILE AGAIN TO TEST IDEMPOTENCE
+ - name: Delete fabric pod connectivity profile again
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *delete_fabric_pod_connectivity_profile
+ register: delete_fabric_pod_connectivity_profile_again
+
+ - name: Verify deletion
+ ansible.builtin.assert:
+ that:
+ - delete_fabric_pod_connectivity_profile is changed
+ - delete_fabric_pod_connectivity_profile.current == []
+ - delete_fabric_pod_connectivity_profile.previous.0.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - delete_fabric_pod_connectivity_profile.previous.0.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - delete_fabric_pod_connectivity_profile.previous.0.fvPodConnP.attributes.id == "1"
+ - delete_fabric_pod_connectivity_profile_cm is changed
+ - delete_fabric_pod_connectivity_profile_cm.proposed == {}
+ - delete_fabric_pod_connectivity_profile_cm.current != []
+ - delete_fabric_pod_connectivity_profile_cm.previous.0.fvPodConnP.attributes.dn == "uni/tn-infra/fabricExtConnP-1/podConnP-1"
+ - delete_fabric_pod_connectivity_profile_cm.previous.0.fvPodConnP.attributes.descr == "Fabric Pod Connectivity Profile"
+ - delete_fabric_pod_connectivity_profile_cm.previous.0.fvPodConnP.attributes.id == "1"
+ - delete_fabric_pod_connectivity_profile_again is not changed
+ - delete_fabric_pod_connectivity_profile_again.current == []
+ - delete_fabric_pod_connectivity_profile_again.previous == []
+
+ - name: Clean up fabric external connection profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *delete_fabric_external_connection_profile \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/tasks/main.yml
new file mode 100644
index 000000000..d9cab57a4
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_external_tep/tasks/main.yml
@@ -0,0 +1,210 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# GET Credentials from the inventory
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Change external tep to inactive
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: inactive
+ state: present
+ ignore_errors: true
+
+- name: Ensure existing external tep is absent
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: absent
+
+# CREATE EXTERNAL TEP
+- name: Create an external tep with check mode
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: active
+ state: present
+ check_mode: true
+ register: add_external_tep_cm
+
+- name: Create an external tep
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: active
+ state: present
+ register: add_external_tep
+
+- name: Verify external tep creation
+ ansible.builtin.assert:
+ that:
+ - add_external_tep is changed
+ - add_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.dn == "uni/controller/setuppol/setupp-1/extrtpodsubnet-[10.66.22.0/24]"
+ - add_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.pool == "10.66.22.0/24"
+ - add_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.reserveAddressCount == "5"
+ - add_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.state == "active"
+ - add_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.annotation == "orchestrator:ansible"
+ - add_external_tep_cm is changed
+ - add_external_tep_cm.previous == []
+ - add_external_tep_cm.current == []
+ - add_external_tep_cm.proposed.fabricExtRoutablePodSubnet.attributes.dn == "uni/controller/setuppol/setupp-1/extrtpodsubnet-[10.66.22.0/24]"
+ - add_external_tep_cm.proposed.fabricExtRoutablePodSubnet.attributes.pool == "10.66.22.0/24"
+ - add_external_tep_cm.proposed.fabricExtRoutablePodSubnet.attributes.reserveAddressCount == "5"
+ - add_external_tep_cm.proposed.fabricExtRoutablePodSubnet.attributes.state == "active"
+ - add_external_tep_cm.proposed.fabricExtRoutablePodSubnet.attributes.annotation == "orchestrator:ansible"
+
+# CREATE FABRIC POD PROFILE AGAIN TO TEST IDEMPOTENCE
+- name: Create an external tep again
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: active
+ state: present
+ register: add_external_tep_again
+
+- name: Verify external tep creation idempotence
+ ansible.builtin.assert:
+ that:
+ - add_external_tep_again is not changed
+ - add_external_tep_again.current.0.fabricExtRoutablePodSubnet.attributes.dn == "uni/controller/setuppol/setupp-1/extrtpodsubnet-[10.66.22.0/24]"
+ - add_external_tep_again.current.0.fabricExtRoutablePodSubnet.attributes.pool == "10.66.22.0/24"
+ - add_external_tep_again.current.0.fabricExtRoutablePodSubnet.attributes.reserveAddressCount == "5"
+ - add_external_tep_again.current.0.fabricExtRoutablePodSubnet.attributes.state == "active"
+ - add_external_tep_again.current.0.fabricExtRoutablePodSubnet.attributes.annotation == "orchestrator:ansible"
+
+# QUERY FABRIC EXTERNAL TEP
+- name: Query external tep
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: query
+ register: query_external_tep
+
+- name: Verify external tep query
+ ansible.builtin.assert:
+ that:
+ - query_external_tep is not changed
+ - query_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.dn == "uni/controller/setuppol/setupp-1/extrtpodsubnet-[10.66.22.0/24]"
+ - query_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.pool == "10.66.22.0/24"
+ - query_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.reserveAddressCount == "5"
+ - query_external_tep.current.0.fabricExtRoutablePodSubnet.attributes.state == "active"
+
+# QUERY ALL EXTERNAL TEPs
+- name: Query all external teps
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ state: query
+ register: query_external_tep_all
+
+- name: Verify query idempotence
+ ansible.builtin.assert:
+ that:
+ - query_external_tep_all is not changed
+
+# VERIFY UNABLE TO DELETE ACTIVE EXTERNAL TEP
+- name: Try to delete active external tep
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: absent
+ register: active_tep_error
+ ignore_errors: true
+
+- name: Verify unable to delete active external tep
+ ansible.builtin.assert:
+ that:
+ - active_tep_error is not changed
+ - active_tep_error is failed
+ - active_tep_error.msg == "APIC Error 105{{":"}} Unable to delete Routable TEP Pool.Please set the state = inactive."
+
+# CHANGE EXTERNAL TEP TO INACTIVE
+- name: Change external tep to inactive
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: inactive
+ state: present
+ register: external_tep_inactive
+
+# DELETE EXTERNAL TEP
+- name: Delete inactive external tep with check mode
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: absent
+ check_mode: true
+ register: delete_external_tep_cm
+
+- name: Delete inactive external tep
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: absent
+ register: delete_external_tep
+
+- name: Verify external tep deletion
+ ansible.builtin.assert:
+ that:
+ - external_tep_inactive is changed
+ - external_tep_inactive.current.0.fabricExtRoutablePodSubnet.attributes.state == "inactive"
+ - delete_external_tep is changed
+ - delete_external_tep.current == []
+ - delete_external_tep.previous.0.fabricExtRoutablePodSubnet.attributes.dn == "uni/controller/setuppol/setupp-1/extrtpodsubnet-[10.66.22.0/24]"
+ - delete_external_tep.previous.0.fabricExtRoutablePodSubnet.attributes.pool == "10.66.22.0/24"
+ - delete_external_tep.previous.0.fabricExtRoutablePodSubnet.attributes.reserveAddressCount == "5"
+ - delete_external_tep.previous.0.fabricExtRoutablePodSubnet.attributes.state == "inactive"
+ - delete_external_tep_cm is changed
+ - delete_external_tep_cm.current != []
+ - delete_external_tep_cm.previous.0.fabricExtRoutablePodSubnet.attributes.dn == "uni/controller/setuppol/setupp-1/extrtpodsubnet-[10.66.22.0/24]"
+ - delete_external_tep_cm.previous.0.fabricExtRoutablePodSubnet.attributes.pool == "10.66.22.0/24"
+ - delete_external_tep_cm.previous.0.fabricExtRoutablePodSubnet.attributes.reserveAddressCount == "5"
+ - delete_external_tep_cm.previous.0.fabricExtRoutablePodSubnet.attributes.state == "inactive"
+ - delete_external_tep_cm.proposed == {}
+
+# DELETE AGAIN TO TEST IDEMPOTENCE
+- name: Delete inactive external tep again
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: absent
+ register: delete_external_tep_again
+
+- name: Verify profile deletion idempotence
+ ansible.builtin.assert:
+ that:
+ - delete_external_tep_again is not changed
+ - delete_external_tep_again.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_policy_group/tasks/main.yml
index 282fe15d3..e05c831ad 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_policy_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_policy_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -62,7 +62,7 @@
register: nm_add_group_again
- name: Verify add policy group
- assert:
+ ansible.builtin.assert:
that:
- cm_add_group is changed
- nm_add_group is changed
@@ -95,7 +95,7 @@
register: nm_add_empty_group
- name: Verify add empty policy group
- assert:
+ ansible.builtin.assert:
that:
- nm_add_empty_group is changed
- nm_add_empty_group.current.0.fabricPodPGrp.attributes.dn == 'uni/fabric/funcprof/podpgrp-ansible_empty_pod_policy_group'
@@ -141,7 +141,7 @@
register: nm_modify_group_again
- name: Verify modify policy
- assert:
+ ansible.builtin.assert:
that:
- cm_modify_group is changed
- nm_modify_group is changed
@@ -186,7 +186,7 @@
register: nm_query_all_groups
- name: Verify query_all_groups
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_groups is not changed
- nm_query_all_groups is not changed
@@ -206,7 +206,7 @@
register: nm_query_group
- name: Verify query_group
- assert:
+ ansible.builtin.assert:
that:
- cm_query_group is not changed
- nm_query_group is not changed
@@ -246,7 +246,7 @@
register: nm_remove_group_again
- name: Verify remove_group and remove_group_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_group is changed
- nm_remove_group is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/tasks/main.yml
new file mode 100644
index 000000000..987ef55f8
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_profile/tasks/main.yml
@@ -0,0 +1,153 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# GET Credentials from the inventory
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Ensure Fabric Pod Profile is absent before testing
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ state: absent
+
+# CREATE FABRIC POD PROFILE
+- name: Create ansible_fabric_pod_profile with check mode
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ description: Ansible test pod profile
+ state: present
+ check_mode: true
+ register: add_fabric_pod_profile_cm
+
+- name: Create ansible_fabric_pod_profile
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ description: Ansible test pod profile
+ state: present
+ register: add_fabric_pod_profile
+
+- name: Verify profile creation
+ ansible.builtin.assert:
+ that:
+ - add_fabric_pod_profile is changed
+ - add_fabric_pod_profile.previous == []
+ - add_fabric_pod_profile.current.0.fabricPodP.attributes.dn == "uni/fabric/podprof-ansible_fabric_pod_profile"
+ - add_fabric_pod_profile.current.0.fabricPodP.attributes.name == "ansible_fabric_pod_profile"
+ - add_fabric_pod_profile.current.0.fabricPodP.attributes.descr == "Ansible test pod profile"
+ - add_fabric_pod_profile.current.0.fabricPodP.attributes.annotation == 'orchestrator:ansible'
+ - add_fabric_pod_profile_cm is changed
+ - add_fabric_pod_profile_cm.previous == []
+ - add_fabric_pod_profile_cm.current == []
+ - add_fabric_pod_profile_cm.proposed.fabricPodP.attributes.dn == "uni/fabric/podprof-ansible_fabric_pod_profile"
+ - add_fabric_pod_profile_cm.proposed.fabricPodP.attributes.name == "ansible_fabric_pod_profile"
+ - add_fabric_pod_profile_cm.proposed.fabricPodP.attributes.descr == "Ansible test pod profile"
+ - add_fabric_pod_profile_cm.proposed.fabricPodP.attributes.annotation == 'orchestrator:ansible'
+
+# CREATE FABRIC POD PROFILE AGAIN TO TEST IDEMPOTENCE
+- name: Create ansible_fabric_pod_profile again
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ description: Ansible test pod profile
+ state: present
+ register: add_fabric_pod_profile_again
+
+- name: Verify profile creation idempotence
+ ansible.builtin.assert:
+ that:
+ - add_fabric_pod_profile_again is not changed
+ - add_fabric_pod_profile_again.current.0.fabricPodP.attributes.dn == "uni/fabric/podprof-ansible_fabric_pod_profile"
+ - add_fabric_pod_profile_again.current.0.fabricPodP.attributes.name == "ansible_fabric_pod_profile"
+ - add_fabric_pod_profile_again.current.0.fabricPodP.attributes.descr == "Ansible test pod profile"
+
+# QUERY FABRIC POD PROFILE
+- name: Query fabric pod profile
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ state: query
+ register: query_pod_profile
+
+- name: Verify profile query
+ ansible.builtin.assert:
+ that:
+ - query_pod_profile is not changed
+ - query_pod_profile.current.0.fabricPodP.attributes.dn == "uni/fabric/podprof-ansible_fabric_pod_profile"
+ - query_pod_profile.current.0.fabricPodP.attributes.name == "ansible_fabric_pod_profile"
+ - query_pod_profile.current.0.fabricPodP.attributes.descr == "Ansible test pod profile"
+
+# QUERY ALL POD PROFILES
+- name: Query all fabric pod profiles
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ state: query
+ register: query_pod_profile_all
+
+- name: Verify profile query idempotence
+ ansible.builtin.assert:
+ that:
+ - query_pod_profile_all is not changed
+
+# DELETE POD PROFILE
+- name: Delete ansible_fabric_pod_profile with check mode
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ state: absent
+ check_mode: true
+ register: delete_pod_profile_cm
+
+- name: Delete ansible_fabric_pod_profile
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ state: absent
+ register: delete_pod_profile
+
+- name: Verify profile deletion
+ ansible.builtin.assert:
+ that:
+ - delete_pod_profile is changed
+ - delete_pod_profile.current == []
+ - delete_pod_profile.previous.0.fabricPodP.attributes.dn == "uni/fabric/podprof-ansible_fabric_pod_profile"
+ - delete_pod_profile.previous.0.fabricPodP.attributes.name == "ansible_fabric_pod_profile"
+ - delete_pod_profile.previous.0.fabricPodP.attributes.descr == "Ansible test pod profile"
+ - delete_pod_profile_cm is changed
+ - delete_pod_profile_cm.current != []
+ - delete_pod_profile_cm.previous.0.fabricPodP.attributes.dn == "uni/fabric/podprof-ansible_fabric_pod_profile"
+ - delete_pod_profile_cm.previous.0.fabricPodP.attributes.name == "ansible_fabric_pod_profile"
+ - delete_pod_profile_cm.previous.0.fabricPodP.attributes.descr == "Ansible test pod profile"
+ - delete_pod_profile_cm.proposed == {}
+
+# DELETE POD PROFILE AGAIN TO TEST IDEMPOTENCE
+- name: Delete ansible_fabric_pod_profile again
+ cisco.aci.aci_fabric_pod_profile:
+ <<: *aci_info
+ name: ansible_fabric_pod_profile
+ state: absent
+ register: delete_pod_profile_again
+
+- name: Verify profile deletion idempotence
+ ansible.builtin.assert:
+ that:
+ - delete_pod_profile_again is not changed
+ - delete_pod_profile_again.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/tasks/main.yml
new file mode 100644
index 000000000..74c33979e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_remote_pool/tasks/main.yml
@@ -0,0 +1,246 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Samita Bhattacharjee (@samitab)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# GET Credentials from the inventory
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Ensure Fabric Pod Remote Pool 66 is absent before testing
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ remote_id: 66
+ state: absent
+ register: cleaned
+
+- name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+ when: cleaned is changed
+
+- name: Change external tep to inactive
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: inactive
+ state: present
+ ignore_errors: true
+
+- name: Ensure existing external tep is absent
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: absent
+
+- name: Create Fabric External Connection Profile
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *aci_info
+ fabric_id: 1
+ site_id: 1
+ community: extended:as2-nn4:5:16
+ state: present
+
+- name: Create Fabric Pod Connectivity Profile
+ cisco.aci.aci_fabric_pod_connectivity_profile:
+ <<: *aci_info
+ fabric_id: 1
+ pod_id: 1
+ unicast_tep: 10.1.1.1/32
+ state: present
+
+- name: Create an external tep
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: active
+ state: present
+
+# CREATE FABRIC REMOTE POOL
+- name: Create a remote pool with check mode
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ remote_id: 66
+ state: present
+ check_mode: true
+ register: add_remote_pool_cm
+
+- name: Create a remote pool
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ remote_id: 66
+ state: present
+ register: add_remote_pool
+
+- name: Verify remote pool creation
+ ansible.builtin.assert:
+ that:
+ - add_remote_pool is changed
+ - add_remote_pool.current.0.fabricExtSetupP.attributes.dn == "uni/controller/setuppol/setupp-1/extsetupp-66"
+ - add_remote_pool.current.0.fabricExtSetupP.attributes.extPoolId == "66"
+ - add_remote_pool.current.0.fabricExtSetupP.attributes.tepPool == "10.66.22.0/24"
+ - add_remote_pool.current.0.fabricExtSetupP.attributes.annotation == "orchestrator:ansible"
+ - add_remote_pool_cm is changed
+ - add_remote_pool_cm.previous == []
+ - add_remote_pool_cm.current == []
+ - add_remote_pool_cm.proposed.fabricExtSetupP.attributes.dn == "uni/controller/setuppol/setupp-1/extsetupp-66"
+ - add_remote_pool_cm.proposed.fabricExtSetupP.attributes.extPoolId == "66"
+ - add_remote_pool_cm.proposed.fabricExtSetupP.attributes.tepPool == "10.66.22.0/24"
+ - add_remote_pool_cm.proposed.fabricExtSetupP.attributes.annotation == "orchestrator:ansible"
+
+
+- name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+
+# CREATE FABRIC REMOTE POOL AGAIN TO TEST IDEMPOTENCE
+- name: Create a remote pool again
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ remote_id: 66
+ state: present
+ register: add_remote_pool_again
+
+- name: Verify remote pool creation idempotence
+ ansible.builtin.assert:
+ that:
+ - add_remote_pool_again is not changed
+ - add_remote_pool_again.current.0.fabricExtSetupP.attributes.dn == "uni/controller/setuppol/setupp-1/extsetupp-66"
+ - add_remote_pool_again.current.0.fabricExtSetupP.attributes.extPoolId == "66"
+ - add_remote_pool_again.current.0.fabricExtSetupP.attributes.tepPool == "10.66.22.0/24"
+ - add_remote_pool_again.current.0.fabricExtSetupP.attributes.annotation == "orchestrator:ansible"
+
+# QUERY FABRIC REMOTE POOL
+- name: Query remote pool
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ remote_id: 66
+ state: query
+ register: query_remote_pool
+
+- name: Verify remote pool query
+ ansible.builtin.assert:
+ that:
+ - query_remote_pool is not changed
+ - query_remote_pool.current.0.fabricExtSetupP.attributes.dn == "uni/controller/setuppol/setupp-1/extsetupp-66"
+ - query_remote_pool.current.0.fabricExtSetupP.attributes.extPoolId == "66"
+ - query_remote_pool.current.0.fabricExtSetupP.attributes.tepPool == "10.66.22.0/24"
+
+# QUERY ALL REMOTE POOLs
+- name: Query all remote pools
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ state: query
+ register: query_remote_pool_all
+
+- name: Verify query idempotence
+ ansible.builtin.assert:
+ that:
+ - query_remote_pool_all is not changed
+
+# DELETE REMOTE POOL
+- name: Delete remote pool with check mode
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ remote_id: 66
+ state: absent
+ check_mode: true
+ register: delete_remote_pool_cm
+
+- name: Delete remote pool
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ remote_id: 66
+ state: absent
+ register: delete_remote_pool
+
+- name: Verify remote pool deletion
+ ansible.builtin.assert:
+ that:
+ - delete_remote_pool is changed
+ - delete_remote_pool.current == []
+ - delete_remote_pool.previous.0.fabricExtSetupP.attributes.dn == "uni/controller/setuppol/setupp-1/extsetupp-66"
+ - delete_remote_pool.previous.0.fabricExtSetupP.attributes.extPoolId == "66"
+ - delete_remote_pool.previous.0.fabricExtSetupP.attributes.tepPool == "10.66.22.0/24"
+ - delete_remote_pool_cm is changed
+ - delete_remote_pool_cm.current != []
+ - delete_remote_pool_cm.previous.0.fabricExtSetupP.attributes.dn == "uni/controller/setuppol/setupp-1/extsetupp-66"
+ - delete_remote_pool_cm.previous.0.fabricExtSetupP.attributes.extPoolId == "66"
+ - delete_remote_pool_cm.previous.0.fabricExtSetupP.attributes.tepPool == "10.66.22.0/24"
+ - delete_remote_pool_cm.proposed == {}
+
+
+- name: Sleep for 15 seconds and continue
+ ansible.builtin.wait_for:
+ timeout: 15
+ delegate_to: localhost
+
+# DELETE AGAIN TO TEST IDEMPOTENCE
+- name: Delete remote pool again
+ cisco.aci.aci_fabric_pod_remote_pool:
+ <<: *aci_info
+ pod_id: 1
+ remote_id: 66
+ state: absent
+ register: delete_remote_pool_again
+
+- name: Verify profile deletion idempotence
+ ansible.builtin.assert:
+ that:
+ - delete_remote_pool_again is not changed
+ - delete_remote_pool_again.current == []
+
+# CLEAN ENVIRONMENT
+- name: Change external tep to inactive
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ address_count: 5
+ status: inactive
+ state: present
+ ignore_errors: true
+
+- name: Ensure existing external tep is absent
+ cisco.aci.aci_fabric_pod_external_tep:
+ <<: *aci_info
+ pod_id: 1
+ pool: 10.66.22.0/24
+ state: absent
+
+- name: Ensure Fabric External Connection Profile is absent
+ cisco.aci.aci_fabric_external_connection_profile:
+ <<: *aci_info
+ fabric_id: 1
+ state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_selector/tasks/main.yml
index ca9fb8209..d1bcf7b95 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_selector/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_pod_selector/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_scheduler/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_scheduler/tasks/main.yml
index daf5e8956..532d0739f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_scheduler/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_scheduler/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Ensure first scheduler does not exist
- aci_fabric_scheduler: &aci_fabric_scheduler_absent
+ cisco.aci.aci_fabric_scheduler: &aci_fabric_scheduler_absent
<<: *aci_info
name: anstest_scheduler_reccuring
description: ACI scheduler test
@@ -40,7 +40,7 @@
state: absent
- name: Ensure second scheduler does not exist
- aci_fabric_scheduler: &aci_fabric_scheduler_2_absent
+ cisco.aci.aci_fabric_scheduler: &aci_fabric_scheduler_2_absent
<<: *aci_info
name: anstest_scheduler_oneTime
windowname: OneTime
@@ -50,30 +50,30 @@
state: absent
- name: Create first scheduler (check_mode)
- aci_fabric_scheduler: &aci_fabric_scheduler_present
+ cisco.aci.aci_fabric_scheduler: &aci_fabric_scheduler_present
<<: *aci_fabric_scheduler_absent
state: present
check_mode: true
register: cm_add_fabric_scheduler_1
- name: Create first scheduler (normal_mode)
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
register: nm_add_fabric_scheduler_1
- name: Create first scheduler again - testing idempotency
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
register: idempotency_add_fabric_scheduler_1
- name: Create second scheduler
- aci_fabric_scheduler: &aci_fabric_scheduler_2_present
+ cisco.aci.aci_fabric_scheduler: &aci_fabric_scheduler_2_present
<<: *aci_fabric_scheduler_2_absent
state: present
register: nm_add_fabric_scheduler_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_fabric_scheduler_1 is changed
- cm_add_fabric_scheduler_1.previous == []
@@ -92,19 +92,19 @@
- nm_add_fabric_scheduler_2.current.0.trigSchedP.children.0.trigAbsWindowP.attributes.date == "2023-11-21T00:00:00.000+00:00"
- name: Query all scheduler
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_info
state: query
register: query_all_fabric_scheduler
- name: Query first scheduler
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
state: query
register: query_first_fabric_scheduler
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_fabric_scheduler is not changed
- query_all_fabric_scheduler.current | length >= 2
@@ -119,32 +119,32 @@
- query_first_fabric_scheduler.current.0.trigSchedP.children.0.trigRecurrWindowP.attributes.minute == "30"
- name: Delete first scheduler (check_mode)
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
state: absent
check_mode: true
register: cm_delete_fabric_scheduler_1
- name: Delete first scheduler (normal_mode)
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
state: absent
register: nm_delete_fabric_scheduler_1
- name: Delete first scheduler again - testing idempotency
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
state: absent
register: idempotency_delete_maintenance_group_1
- name: Delete second scheduler (normal_mode)
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_2_present
state: absent
register: nm_delete_fabric_scheduler_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_fabric_scheduler_1 is changed
- cm_delete_fabric_scheduler_1.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_dst_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_dst_group/tasks/main.yml
index a67026daa..e1ec15be9 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_dst_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_dst_group/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group/tasks/main.yml
index c3e4eb55c..69673f032 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src/tasks/main.yml
index 6767e3e89..dc040b102 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_node/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_node/tasks/main.yml
index 0e5ea30b2..ed35acb3a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_node/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_node/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_path/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_path/tasks/main.yml
index e0c772843..c63342a1a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_path/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_span_src_group_src_path/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_profile/tasks/main.yml
index 684a9a874..ea79de9b7 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_profile/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,21 +22,21 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_spine_switch_prf if it already exists
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
# CREATE SPINE SWITCH POLICY
- name: Create ansible_spine_switch_prf
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: present
register: add_switch_prf
- name: Verify profile creation
- assert:
+ ansible.builtin.assert:
that:
- add_switch_prf.current.0.fabricSpineP.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf"
- add_switch_prf.current.0.fabricSpineP.attributes.name == "ansible_spine_switch_prf"
@@ -44,14 +44,14 @@
# CREATE SPINE SWITCH POLICY AGAIN TO TEST IDEMPOTENCE
- name: Create ansible_spine_switch_prf again
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: present
register: add_switch_prf_again
- name: Verify profile creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_switch_prf_again is not changed
- add_switch_prf_again.current.0.fabricSpineP.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf"
@@ -59,14 +59,14 @@
# QUERY SPINE SWITCH POLICY
- name: query spine switch profile
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: query
register: query_switch_prf
- name: Verify profile query
- assert:
+ ansible.builtin.assert:
that:
- query_switch_prf is not changed
- query_switch_prf.current.0.fabricSpineP.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf"
@@ -74,26 +74,26 @@
# QUERY ALL SPINE SWITCH POLICIES
- name: query all spine switch profiles
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
state: query
register: query_switch_prf_all
- name: Verify profile query idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_switch_prf_all is not changed
# DELETE SPINE SWITCH PROFILE
- name: Delete ansible_spine_switch_prf
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
register: delete_switch_prf
- name: Verify profile deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_switch_prf is changed
- delete_switch_prf.current == []
@@ -102,21 +102,21 @@
# DELETE SPINE SWITCH PROFILE AGAIN TO TEST IDEMPOTENCE
- name: Delete ansible_spine_switch_prf again
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
register: delete_switch_prf_again
- name: Verify profile deletion idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_switch_prf_again is not changed
- delete_switch_prf_again.current == []
# CLEAN UP ENVIRONMENT
- name: Remove ansible_spine_switch_prf
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_switch_assoc/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_switch_assoc/tasks/main.yml
index 697590fae..b9e79a9dd 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_switch_assoc/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_spine_switch_assoc/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,21 +22,21 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_spine_switch_prf if it already exists
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
# CREATE SPINE SWITCH POLICY
- name: Create ansible_spine_switch_prf
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: present
# CREATE SPINE SWITCH ASSOCIATION
- name: Create a spine switch profile association
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc
@@ -45,7 +45,7 @@
register: add_association
- name: Verify association creation
- assert:
+ ansible.builtin.assert:
that:
- add_association.current.0.fabricSpineS.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc-typ-range"
- add_association.current.0.fabricSpineS.attributes.name == "ansible_spine_switch_assoc"
@@ -53,13 +53,13 @@
- add_association.current.0.fabricSpineS.attributes.annotation == 'orchestrator:ansible'
- name: Verify Policy Group association
- assert:
+ ansible.builtin.assert:
that:
- add_association.current.0.fabricSpineS.children.0.fabricRsSpNodePGrp.attributes.tDn == "uni/fabric/funcprof/spnodepgrp-ansible_spine_pol_grp1"
# CREATE SPINE SWITCH ASSOCIATION AGAIN TO TEST IDEMPOTENCE
- name: Create a spine switch profile association again
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc
@@ -68,7 +68,7 @@
register: add_association_again
- name: Verify association creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_association_again is not changed
- add_association_again.current.0.fabricSpineS.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc-typ-range"
@@ -76,13 +76,13 @@
- add_association_again.current.0.fabricSpineS.attributes.type == "range"
- name: Verify Policy Group association idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_association_again.current.0.fabricSpineS.children.0.fabricRsSpNodePGrp.attributes.tDn == "uni/fabric/funcprof/spnodepgrp-ansible_spine_pol_grp1"
# CREATE SPINE SWITCH ASSOCIATION WITHOUT POLICY GROUP
- name: Create a spine switch profile association without a policy group
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc2
@@ -90,7 +90,7 @@
register: add_association_without_policy_group
- name: Verify association creation
- assert:
+ ansible.builtin.assert:
that:
- add_association_without_policy_group.current.0.fabricSpineS.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc2-typ-range"
- add_association_without_policy_group.current.0.fabricSpineS.attributes.name == "ansible_spine_switch_assoc2"
@@ -98,7 +98,7 @@
# UPDATE SPINE SWITCH POLICY GROUP ASSOCIATION
- name: Update a spine switch profile association
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc
@@ -107,7 +107,7 @@
register: update_association
- name: Verify association update
- assert:
+ ansible.builtin.assert:
that:
- update_association is changed
- update_association.current.0.fabricSpineS.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc-typ-range"
@@ -115,13 +115,13 @@
- update_association.current.0.fabricSpineS.attributes.type == "range"
- name: Verify Policy Group association update
- assert:
+ ansible.builtin.assert:
that:
- update_association.current.0.fabricSpineS.children.0.fabricRsSpNodePGrp.attributes.tDn == "uni/fabric/funcprof/spnodepgrp-ansible_spine_pol_grp2"
# QUERY SPINE SWITCH ASSOCIATION
- name: Query spine switch profile association
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc
@@ -129,7 +129,7 @@
register: query_association
- name: Verify query data
- assert:
+ ansible.builtin.assert:
that:
- query_association is not changed
- query_association.current.0.fabricSpineS.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc-typ-range"
@@ -137,25 +137,25 @@
- query_association.current.0.fabricSpineS.attributes.type == "range"
- name: Verify Policy Group association
- assert:
+ ansible.builtin.assert:
that:
- query_association.current.0.fabricSpineS.children.0.fabricRsSpNodePGrp.attributes.tDn == "uni/fabric/funcprof/spnodepgrp-ansible_spine_pol_grp2"
# QUERY ALL SPINE SWITCH ASSOCIATIONS
- name: Query spine switch profile association
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
state: query
register: query_association_all
- name: Verify query all idempotence
- assert:
+ ansible.builtin.assert:
that:
- query_association_all is not changed
# DELETE SPINE SWITCH ASSOCIATION
- name: Delete spine switch profile association
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc
@@ -163,7 +163,7 @@
register: delete_association
- name: Verify association removal
- assert:
+ ansible.builtin.assert:
that:
- delete_association is changed
- delete_association.current == []
@@ -173,7 +173,7 @@
# DELETE SPINE SWITCH ASSOCIATION AGAIN TO TEST IDEMPOTENCE
- name: Delete spine switch profile association again
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc
@@ -181,14 +181,14 @@
register: delete_association_again
- name: Verify association removal idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_association_again is not changed
- delete_association_again.current == []
# CLEAN UP ENVIRONMENT
- name: Remove ansible_spine_switch_prf
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_block/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_block/tasks/main.yml
index 5bd4ce68b..07fd4fe55 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_block/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_block/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,13 +22,13 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_spine_switch_prf if it already exists
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
- name: Remove ansible_leaf_switch_prf if it already exists
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
@@ -37,21 +37,21 @@
# CREATE SPINE SWITCH POLICY
- name: Create ansible_spine_switch_prf
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: present
# CREATE LEAF SWITCH POLICY
- name: Create ansible_leaf_switch_prf
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: present
# CREATE SPINE SWITCH ASSOCIATION
- name: Create a spine switch profile association
- aci_fabric_spine_switch_assoc:
+ cisco.aci.aci_fabric_spine_switch_assoc:
<<: *aci_info
profile: ansible_spine_switch_prf
name: ansible_spine_switch_assoc
@@ -60,7 +60,7 @@
# CREATE LEAF SWITCH ASSOCIATION
- name: Create a leaf switch profile association
- aci_fabric_leaf_switch_assoc:
+ cisco.aci.aci_fabric_leaf_switch_assoc:
<<: *aci_info
profile: ansible_leaf_switch_prf
name: ansible_leaf_switch_assoc
@@ -69,7 +69,7 @@
# CREATE SPINE SWITCH BLOCK
- name: Create a spine switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: spine
profile: ansible_spine_switch_prf
@@ -81,7 +81,7 @@
register: add_switch_block
- name: Verify spine block creation
- assert:
+ ansible.builtin.assert:
that:
- add_switch_block.current.0.fabricNodeBlk.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc-typ-range/nodeblk-ansible_spine_block"
- add_switch_block.current.0.fabricNodeBlk.attributes.name == "ansible_spine_block"
@@ -89,7 +89,7 @@
# ADD SPINE SWITCH BLOCK AGAIN TO TEST IDEMPOTENCE
- name: Create a spine switch association block again
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: spine
profile: ansible_spine_switch_prf
@@ -101,7 +101,7 @@
register: add_switch_block_again
- name: Verify spine block creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_switch_block_again is not changed
- add_switch_block_again.current.0.fabricNodeBlk.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc-typ-range/nodeblk-ansible_spine_block"
@@ -109,7 +109,7 @@
# CREATE LEAF SWITCH BLOCK
- name: Create a leaf switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: leaf
profile: ansible_leaf_switch_prf
@@ -121,14 +121,14 @@
register: add_leaf_switch_block
- name: Verify leaf block creation
- assert:
+ ansible.builtin.assert:
that:
- add_leaf_switch_block.current.0.fabricNodeBlk.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc-typ-range/nodeblk-ansible_leaf_block"
- add_leaf_switch_block.current.0.fabricNodeBlk.attributes.name == "ansible_leaf_block"
# ADD LEAF SWITCH BLOCK AGAIN TO TEST IDEMPOTENCE
- name: Create a leaf switch association block again
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: leaf
profile: ansible_leaf_switch_prf
@@ -140,7 +140,7 @@
register: add_leaf_switch_block_again
- name: Verify leaf block creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- add_leaf_switch_block_again is not changed
- add_leaf_switch_block_again.current.0.fabricNodeBlk.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc-typ-range/nodeblk-ansible_leaf_block"
@@ -148,7 +148,7 @@
# QUERY SPINE SWITCH BLOCK
- name: Query spine switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: spine
profile: ansible_spine_switch_prf
@@ -158,7 +158,7 @@
register: query_switch_block
- name: Verify block query
- assert:
+ ansible.builtin.assert:
that:
- query_switch_block is not changed
- query_switch_block.current.0.fabricNodeBlk.attributes.dn == "uni/fabric/spprof-ansible_spine_switch_prf/spines-ansible_spine_switch_assoc-typ-range/nodeblk-ansible_spine_block"
@@ -166,7 +166,7 @@
# QUERY LEAF SWITCH BLOCK
- name: Query leaf switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: leaf
profile: ansible_leaf_switch_prf
@@ -176,7 +176,7 @@
register: query_leaf_switch_block
- name: Verify leaf block query
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_switch_block is not changed
- query_leaf_switch_block.current.0.fabricNodeBlk.attributes.dn == "uni/fabric/leprof-ansible_leaf_switch_prf/leaves-ansible_leaf_switch_assoc-typ-range/nodeblk-ansible_leaf_block"
@@ -184,7 +184,7 @@
# REMOVE SPINE SWITCH BLOCK
- name: Remove spine switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: spine
profile: ansible_spine_switch_prf
@@ -194,7 +194,7 @@
register: delete_switch_block
- name: Verify spine switch block removal
- assert:
+ ansible.builtin.assert:
that:
- delete_switch_block is changed
- delete_switch_block.current == []
@@ -203,7 +203,7 @@
# REMOVE SPINE SWITCH BLOCK AGAIN TO TEST IDEMPOTENCE
- name: Remove spine switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: spine
profile: ansible_spine_switch_prf
@@ -213,14 +213,14 @@
register: delete_switch_block
- name: Verify spine switch block removal idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_switch_block is not changed
- delete_switch_block.current == []
# REMOVE LEAF SWITCH BLOCK
- name: Remove leaf switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: leaf
profile: ansible_leaf_switch_prf
@@ -230,7 +230,7 @@
register: delete_leaf_switch_block
- name: Verify leaf switch block removal
- assert:
+ ansible.builtin.assert:
that:
- delete_leaf_switch_block is changed
- delete_leaf_switch_block.current == []
@@ -239,7 +239,7 @@
# REMOVE LEAF SWITCH BLOCK AGAIN TO TEST IDEMPOTENCE
- name: Remove leaf switch association block
- aci_fabric_switch_block:
+ cisco.aci.aci_fabric_switch_block:
<<: *aci_info
switch_type: leaf
profile: ansible_leaf_switch_prf
@@ -249,20 +249,20 @@
register: delete_leaf_switch_block
- name: Verify leaf switch block removal idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_leaf_switch_block is not changed
- delete_leaf_switch_block.current == []
# CLEAN UP ENVIRONMENT
- name: Remove ansible_spine_switch_prf
- aci_fabric_spine_profile:
+ cisco.aci.aci_fabric_spine_profile:
<<: *aci_info
name: ansible_spine_switch_prf
state: absent
- name: Remove ansible_leaf_switch_prf
- aci_fabric_leaf_profile:
+ cisco.aci.aci_fabric_leaf_profile:
<<: *aci_info
name: ansible_leaf_switch_prf
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_policy_group/tasks/main.yml
index 83f5355a6..82acdc7c3 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_policy_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_switch_policy_group/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -52,14 +52,14 @@
register: add_fabric_leaf_policy_group
- name: Verify that ansible_fabric_leaf_policy_group has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.attributes.dn == "uni/fabric/funcprof/lenodepgrp-ansible_fabric_leaf_policy_group"
- add_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.attributes.name == "ansible_fabric_leaf_policy_group"
- add_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.attributes.annotation == 'orchestrator:ansible'
- name: Verify that ansible_fabric_leaf_policy_group children have correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.children.0.fabricRsNodeCfgSrv.attributes.tDn == "uni/fabric/analytics/cluster-ansible_test/cfgsrv-ansible_test"
- add_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.children.1.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
@@ -78,14 +78,14 @@
register: add_fabric_leaf_policy_group_again
- name: Verify that ansible_fabric_leaf_policy_group has not been changed
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_leaf_policy_group_again is not changed
- add_fabric_leaf_policy_group_again.current.0.fabricLeNodePGrp.attributes.dn == "uni/fabric/funcprof/lenodepgrp-ansible_fabric_leaf_policy_group"
- add_fabric_leaf_policy_group_again.current.0.fabricLeNodePGrp.attributes.name == "ansible_fabric_leaf_policy_group"
- name: Verify that ansible_fabric_leaf_policy_group children are still correct
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_leaf_policy_group_again.current.0.fabricLeNodePGrp.children.0.fabricRsNodeCfgSrv.attributes.tDn == "uni/fabric/analytics/cluster-ansible_test/cfgsrv-ansible_test"
- add_fabric_leaf_policy_group_again.current.0.fabricLeNodePGrp.children.1.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
@@ -112,13 +112,13 @@
register: add_fabric_spine_policy_group
- name: Verify that ansible_fabric_spine_policy_group has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_spine_policy_group.current.0.fabricSpNodePGrp.attributes.dn == "uni/fabric/funcprof/spnodepgrp-ansible_fabric_spine_policy_group"
- add_fabric_spine_policy_group.current.0.fabricSpNodePGrp.attributes.name == "ansible_fabric_spine_policy_group"
- name: Verify that ansible_fabric_spine_policy_group children have correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_spine_policy_group.current.0.fabricSpNodePGrp.children.0.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
- add_fabric_spine_policy_group.current.0.fabricSpNodePGrp.children.1.fabricRsTwampResponderPol.attributes.tnTwampResponderPolName == ""
@@ -136,14 +136,14 @@
register: add_fabric_spine_policy_group_again
- name: Verify that ansible_fabric_spine_policy_group has not been changed
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_spine_policy_group_again is not changed
- add_fabric_spine_policy_group_again.current.0.fabricSpNodePGrp.attributes.dn == "uni/fabric/funcprof/spnodepgrp-ansible_fabric_spine_policy_group"
- add_fabric_spine_policy_group_again.current.0.fabricSpNodePGrp.attributes.name == "ansible_fabric_spine_policy_group"
- name: Verify that ansible_fabric_spine_policy_group children are still correct
- assert:
+ ansible.builtin.assert:
that:
- add_fabric_spine_policy_group_again.current.0.fabricSpNodePGrp.children.0.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
- add_fabric_spine_policy_group_again.current.0.fabricSpNodePGrp.children.1.fabricRsTwampResponderPol.attributes.tnTwampResponderPolName == ""
@@ -166,14 +166,14 @@
register: update_fabric_leaf_policy_group
- name: Verify ansible_fabric_leaf_policy_group is changed
- assert:
+ ansible.builtin.assert:
that:
- update_fabric_leaf_policy_group is changed
- update_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.attributes.dn == "uni/fabric/funcprof/lenodepgrp-ansible_fabric_leaf_policy_group"
- update_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.attributes.name == "ansible_fabric_leaf_policy_group"
- name: Verify ansible_fabric_leaf_policy_group children are updated
- assert:
+ ansible.builtin.assert:
that:
- update_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.children.0.fabricRsNodeCfgSrv.attributes.tDn == "uni/fabric/analytics/cluster-ansible_test/cfgsrv-ansible_test"
- update_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.children.1.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
@@ -197,14 +197,14 @@
register: update_fabric_spine_policy_group
- name: Verify ansible_fabric_spine_policy_group is changed
- assert:
+ ansible.builtin.assert:
that:
- update_fabric_spine_policy_group is changed
- update_fabric_spine_policy_group.current.0.fabricSpNodePGrp.attributes.dn == "uni/fabric/funcprof/spnodepgrp-ansible_fabric_spine_policy_group"
- update_fabric_spine_policy_group.current.0.fabricSpNodePGrp.attributes.name == "ansible_fabric_spine_policy_group"
- name: Verify ansible_fabric_spine_policy_group children are updated
- assert:
+ ansible.builtin.assert:
that:
- update_fabric_spine_policy_group.current.0.fabricSpNodePGrp.children.0.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
- update_fabric_spine_policy_group.current.0.fabricSpNodePGrp.children.1.fabricRsTwampResponderPol.attributes.tnTwampResponderPolName == "default"
@@ -225,14 +225,14 @@
register: query_fabric_leaf_policy_group
- name: Verify attributes
- assert:
+ ansible.builtin.assert:
that:
- query_fabric_leaf_policy_group is not changed
- query_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.attributes.dn == "uni/fabric/funcprof/lenodepgrp-ansible_fabric_leaf_policy_group"
- query_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.attributes.name == "ansible_fabric_leaf_policy_group"
- name: Verify children
- assert:
+ ansible.builtin.assert:
that:
- query_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.children.0.fabricRsNodeCfgSrv.attributes.tDn == "uni/fabric/analytics/cluster-ansible_test/cfgsrv-ansible_test"
- query_fabric_leaf_policy_group.current.0.fabricLeNodePGrp.children.1.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
@@ -252,7 +252,7 @@
register: query_fabric_leaf_policy_group_all
- name: Verify query all is idempotent
- assert:
+ ansible.builtin.assert:
that:
- query_fabric_leaf_policy_group_all is not changed
@@ -266,14 +266,14 @@
register: query_fabric_spine_policy_group
- name: Verify attributes
- assert:
+ ansible.builtin.assert:
that:
- query_fabric_spine_policy_group is not changed
- query_fabric_spine_policy_group.current.0.fabricSpNodePGrp.attributes.dn == "uni/fabric/funcprof/spnodepgrp-ansible_fabric_spine_policy_group"
- query_fabric_spine_policy_group.current.0.fabricSpNodePGrp.attributes.name == "ansible_fabric_spine_policy_group"
- name: Verify children
- assert:
+ ansible.builtin.assert:
that:
- query_fabric_spine_policy_group.current.0.fabricSpNodePGrp.children.0.fabricRsCallhomeInvPol.attributes.tnCallhomeInvPName == "default"
- query_fabric_spine_policy_group.current.0.fabricSpNodePGrp.children.1.fabricRsTwampResponderPol.attributes.tnTwampResponderPolName == "default"
@@ -292,7 +292,7 @@
register: query_fabric_spine_policy_group_all
- name: Verify query all is idempotent
- assert:
+ ansible.builtin.assert:
that:
- query_fabric_spine_policy_group_all is not changed
@@ -306,7 +306,7 @@
register: delete_fabric_leaf_policy_group
- name: Verify Fabric Leaf Policy Group deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_fabric_leaf_policy_group is changed
- delete_fabric_leaf_policy_group.current == []
@@ -330,7 +330,7 @@
register: delete_fabric_spine_policy_group
- name: Verify Fabric Spine Policy Group deletion
- assert:
+ ansible.builtin.assert:
that:
- delete_fabric_spine_policy_group is changed
- delete_fabric_spine_policy_group.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_wide_settings/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_wide_settings/tasks/main.yml
index 526c8bee0..387d23580 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_wide_settings/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_fabric_wide_settings/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,7 +21,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will skip execution for cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_file_remote_path/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_file_remote_path/tasks/main.yml
index ab1560ba6..c0fcbaa9f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_file_remote_path/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_file_remote_path/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_filter/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter/tasks/main.yml
index a8928de57..db4e07eff 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_filter/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -64,7 +64,7 @@
register: nm_add_filter_again
- name: Verify add_filter
- assert:
+ ansible.builtin.assert:
that:
- cm_add_filter is changed
- cm_add_filter_again is changed
@@ -100,7 +100,7 @@
register: nm_add_filter_descr_again
- name: Verify add_filter_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_filter_descr is changed
- cm_add_filter_descr_again is changed
@@ -118,7 +118,7 @@
register: nm_add_filter_again_no_descr
- name: Verify add_filter_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_filter_again_no_descr is not changed
- nm_add_filter_again_no_descr is not changed
@@ -142,7 +142,7 @@
register: nm_query_all_filters
- name: Verify query_all_filters
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_filters is not changed
- nm_query_all_filters is not changed
@@ -166,7 +166,7 @@
register: nm_query_filter
- name: Verify query_filter
- assert:
+ ansible.builtin.assert:
that:
- cm_query_filter is not changed
- nm_query_filter is not changed
@@ -192,7 +192,7 @@
register: nm_remove_filter_again
- name: Verify remove_filter
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_filter is changed
- cm_remove_filter_again is changed
@@ -217,7 +217,7 @@
register: nm_query_non_filter
- name: Verify query_non_filter
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_filter is not changed
- nm_query_non_filter is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_entry/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_entry/tasks/main.yml
index e969111a2..859df9e97 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_entry/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_entry/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,7 +21,7 @@
output_level: '{{ aci_output_level | default("debug") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
# TODO current module will fail on cloud sites because range is not supported
# APIC Error 1: Invalid Configuration CLOUD_SOURCE_PORT_NOT_SUPPORTED: vz::EntryMo Dn = uni/tn-ansible_test/flt-anstest_fileter_2/e-source_port_start - Source port range is not allowed on CAPIC"
@@ -176,7 +176,7 @@
register: icmp6_msg_type_est
- name: Assertion check for the filter entry - match_only_fragments, source_port and tcp_flags attributes
- assert:
+ ansible.builtin.assert:
that:
- nt_match_only_fragments_with_dst_port is not changed
- nt_match_only_fragments_with_dst_port.msg == "Parameter 'match_only_fragments' cannot be used with 'Layer 4 Port' value"
@@ -266,7 +266,7 @@
register: entry_present_update
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: create filter entry - test different types
cisco.aci.aci_filter_entry:
@@ -309,7 +309,7 @@
register: present_incompatible_params
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- entry_present_check_mode is changed
- entry_present_check_mode.previous == []
@@ -346,7 +346,7 @@
- present_incompatible_params.msg.startswith("Parameter")
- name: present assertions for arp
- assert:
+ ansible.builtin.assert:
that:
- entry_present_2 is changed
- entry_present_2.sent.vzEntry.attributes.arpOpc == 'reply'
@@ -406,7 +406,7 @@
register: query_all
- name: query assertions for all
- assert:
+ ansible.builtin.assert:
that:
- query_tenant_filter_entry is not changed
- query_tenant_filter_entry.current | length == 1
@@ -450,7 +450,7 @@
- name: query assertions for only Non-Cloud
- assert:
+ ansible.builtin.assert:
that:
- query_tenant_filter.current.0.vzFilter.children | length == 4
when: query_cloud.current == [] # This condition will skip execution for cloud sites
@@ -486,7 +486,7 @@
with_items: ["anstest2", "anstest3", "anstest4"]
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- entry_absent_check_mode is changed
- entry_absent_check_mode.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/tasks/main.yml
new file mode 100644
index 000000000..a186c9ce6
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_filter_listify/tasks/main.yml
@@ -0,0 +1,197 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Shreyas Srish (shrsr@cisco.com)
+# Copyright: (c) 2024, Akini Ross <akinross@cisco.com>
+#
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ aci_model_data:
+ tenant:
+ - name: ansible_test
+ description: Created using listify
+ app:
+ - name: app_test
+ epg:
+ - name: web
+ bd: web_bd
+ - name: app
+ bd: app_bd
+ bd:
+ - name: bd_test
+ subnet:
+ - name: 10.10.10.1
+ mask: 24
+ scope:
+ - private
+ - shared
+ vrf: vrf_test
+ - name: bd_test2
+ subnet:
+ - name: 20.20.20.1
+ mask: 24
+ scope: [public, shared]
+ vrf: vrf_test
+ vrf:
+ - name: vrf_test
+ - name: ansible_test2
+ description: Created using listify
+ app:
+ - name: app_test2
+ epg:
+ - name: web2
+ bd: web_bd2
+ - name: app2
+ bd: app_bd2
+ policies:
+ protocol:
+ bfd:
+ - name: BFD-ON
+ description: Enable BFD
+ admin_state: enabled
+ detection_multiplier: 3
+ min_tx_interval: 50
+ min_rx_interval: 50
+ echo_rx_interval: 50
+ echo_admin_state: enabled
+ sub_interface_optimization_state: enabled
+ ospf:
+ interface:
+ - name: OSPF-P2P-IntPol
+ network_type: p2p
+ priority: 1
+ - name: OSPF-Broadcast-IntPol
+ network_type: bcast
+ priority: 1
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+
+ - name: Set facts for nested dictionaries
+ ansible.builtin.set_fact:
+ bfd_listify_output: '{{ aci_model_data|cisco.aci.aci_listify("tenant", "policies", "protocol", "bfd") }}'
+ ospf_listify_output: '{{ aci_model_data|cisco.aci.aci_listify("tenant", "policies", "protocol", "ospf", "interface") }}'
+
+ - name: Validate listify for nested dictionaries
+ ansible.builtin.assert:
+ that:
+ - bfd_listify_output.0.tenant_name == "ansible_test2"
+ - bfd_listify_output.0.tenant_description == "Created using listify"
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_admin_state == "enabled"
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_description == "Enable BFD"
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_detection_multiplier == 3
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_echo_admin_state == "enabled"
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_echo_rx_interval == 50
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_min_rx_interval == 50
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_min_tx_interval == 50
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_name == "BFD-ON"
+ - bfd_listify_output.0.tenant_policies_protocol_bfd_sub_interface_optimization_state == "enabled"
+ - ospf_listify_output.0.tenant_name == "ansible_test2"
+ - ospf_listify_output.0.tenant_description == "Created using listify"
+ - ospf_listify_output.0.tenant_policies_protocol_ospf_interface_name == "OSPF-P2P-IntPol"
+ - ospf_listify_output.0.tenant_policies_protocol_ospf_interface_network_type == "p2p"
+ - ospf_listify_output.0.tenant_policies_protocol_ospf_interface_priority == 1
+ - ospf_listify_output.1.tenant_policies_protocol_ospf_interface_name == "OSPF-Broadcast-IntPol"
+ - ospf_listify_output.1.tenant_policies_protocol_ospf_interface_network_type == "bcast"
+ - ospf_listify_output.1.tenant_policies_protocol_ospf_interface_priority == 1
+
+ - name: Create tenants
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: '{{ item.tenant_name }}'
+ description: '{{ item.tenant_description }}'
+ with_items: '{{ aci_model_data|cisco.aci.aci_listify("tenant") }}'
+ register: tenant_listify
+
+ - name: Create VRFs
+ cisco.aci.aci_vrf:
+ <<: *aci_info
+ tenant: '{{ item.tenant_name }}'
+ vrf_name: '{{ item.tenant_vrf_name }}'
+ with_items: '{{ aci_model_data|cisco.aci.aci_listify("tenant","vrf") }}'
+ register: vrf_listify
+
+ - name: Create BDs
+ cisco.aci.aci_bd:
+ <<: *aci_info
+ tenant: '{{ item.tenant_name }}'
+ vrf: '{{ item.tenant_bd_vrf }}'
+ bd: '{{ item.tenant_bd_name }}'
+ enable_routing: yes
+ with_items: '{{ aci_model_data|cisco.aci.aci_listify("tenant","bd") }}'
+ register: bd_listify
+
+ - name: Create BD subnets
+ cisco.aci.aci_bd_subnet:
+ <<: *aci_info
+ tenant: '{{ item.tenant_name }}'
+ bd: '{{ item.tenant_bd_name }}'
+ gateway: '{{ item.tenant_bd_subnet_name }}'
+ mask: '{{ item.tenant_bd_subnet_mask }}'
+ scope: '{{ item.tenant_bd_subnet_scope }}'
+ with_items: '{{ aci_model_data|cisco.aci.aci_listify("tenant","bd","subnet") }}'
+ register: bd_subnets_listify
+
+ - name: Create APs
+ cisco.aci.aci_ap:
+ <<: *aci_info
+ tenant: '{{ item.tenant_name }}'
+ app_profile: '{{ item.tenant_app_name }}'
+ with_items: '{{ aci_model_data|cisco.aci.aci_listify("tenant","app") }}'
+ register: ap_listify
+
+ - name: Create EPGs
+ cisco.aci.aci_epg:
+ <<: *aci_info
+ tenant: '{{ item.tenant_name }}'
+ app_profile: '{{ item.tenant_app_name }}'
+ epg: '{{ item.tenant_app_epg_name }}'
+ bd: '{{ item.tenant_app_epg_bd }}'
+ with_items: '{{ aci_model_data|cisco.aci.aci_listify("tenant","app","epg") }}'
+ register: epg_listify
+
+ - name: Validate listify
+ ansible.builtin.assert:
+ that:
+ - tenant_listify.results.0.current.0.fvTenant.attributes.name == "ansible_test"
+ - vrf_listify.results.0.current.0.fvCtx.attributes.name == "vrf_test"
+ - bd_listify.results.0.current.0.fvBD.attributes.name == "bd_test"
+ - bd_listify.results.1.current.0.fvBD.attributes.name == "bd_test2"
+ - bd_subnets_listify.results.0.current.0.fvSubnet.attributes.ip == "10.10.10.1/24"
+ - bd_subnets_listify.results.0.current.0.fvSubnet.attributes.scope == "private,shared"
+ - bd_subnets_listify.results.1.current.0.fvSubnet.attributes.ip == "20.20.20.1/24"
+ - bd_subnets_listify.results.1.current.0.fvSubnet.attributes.scope == "public,shared"
+ - ap_listify.results.0.current.0.fvAp.attributes.name == "app_test"
+ - epg_listify.results.0.current.0.fvAEPg.attributes.name == "web"
+ - epg_listify.results.1.current.0.fvAEPg.attributes.name == "app"
+ - tenant_listify.results.1.current.0.fvTenant.attributes.name == "ansible_test2"
+ - ap_listify.results.1.current.0.fvAp.attributes.name == "app_test2"
+ - epg_listify.results.2.current.0.fvAEPg.attributes.name == "web2"
+ - epg_listify.results.3.current.0.fvAEPg.attributes.name == "app2"
+
+ # Clean Up Environment
+ - name: Delete tenants
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: "{{ item }}"
+ state: absent
+ loop:
+ - ansible_test
+ - ansible_test2
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group/tasks/main.yml
index 5cf88997c..6f2fc7907 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,21 +20,21 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Create firmware policy
- aci_firmware_policy: &aci_firmware_policy_present
+ cisco.aci.aci_firmware_policy: &aci_firmware_policy_present
<<: *aci_info
name: anstest_policy
version: n9000-15.2(7)
state: present
- name: Ensure first firmware group does not exist
- aci_firmware_group: &aci_firmware_group_absent
+ cisco.aci.aci_firmware_group: &aci_firmware_group_absent
<<: *aci_info
group: anstest_group
policy: anstest_policy
@@ -43,37 +43,37 @@
state: absent
- name: Ensure second firmware group does not exist
- aci_firmware_group: &aci_firmware_group_2_absent
+ cisco.aci.aci_firmware_group: &aci_firmware_group_2_absent
<<: *aci_info
group: anstest_group_2
policy: anstest_policy
state: absent
- name: Create first firmware group (check_mode)
- aci_firmware_group: &aci_firmware_group_present
+ cisco.aci.aci_firmware_group: &aci_firmware_group_present
<<: *aci_firmware_group_absent
state: present
check_mode: true
register: cm_add_firmware_group_1
- name: Create first firmware group (normal_mode)
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_present
register: nm_add_firmware_group_1
- name: Create first firmware group again - testing idempotency
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_present
register: idempotency_add_firmware_group_1
- name: Create second firmware group
- aci_firmware_group: &aci_firmware_group_2_present
+ cisco.aci.aci_firmware_group: &aci_firmware_group_2_present
<<: *aci_firmware_group_2_absent
state: present
register: nm_add_firmware_group_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_firmware_group_1 is changed
- cm_add_firmware_group_1.previous == []
@@ -86,19 +86,19 @@
- nm_add_firmware_group_2 is changed
- name: Query all firmware groups
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_info
state: query
register: query_all_firmware_group
- name: Query first firmware group
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_present
state: query
register: query_first_firmware_group
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_firmware_group is not changed
- query_all_firmware_group.current | length >= 2
@@ -110,32 +110,32 @@
- query_first_firmware_group.current.0.firmwareFwGrp.children.0.firmwareRsFwgrpp.attributes.tnFirmwareFwPName == "anstest_policy"
- name: Delete first firmware group (check_mode)
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_present
state: absent
check_mode: true
register: cm_delete_firmware_group_1
- name: Delete first firmware group (normal_mode)
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_present
state: absent
register: nm_delete_firmware_group_1
- name: Delete first firmware group again - testing idempotency
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_present
state: absent
register: idempotency_delete_firmware_group_1
- name: Delete second firmware group (normal_mode)
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_2_present
state: absent
register: nm_delete_firmware_group_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_firmware_group_1 is changed
- cm_delete_firmware_group_1.proposed == {}
@@ -149,6 +149,6 @@
- nm_delete_firmware_group_2.current == []
- name: Delete firmware policy - clean up the environment
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group_node/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group_node/tasks/main.yml
index 8da20a7ca..49cba8fa2 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group_node/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_group_node/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,65 +20,65 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Create firmware policy exists
- aci_firmware_policy: &aci_firmware_policy_present
+ cisco.aci.aci_firmware_policy: &aci_firmware_policy_present
<<: *aci_info
name: anstest_policy
version: n9000-15.2(7)
state: present
- name: Create first firmware group
- aci_firmware_group: &aci_firmware_group_present
+ cisco.aci.aci_firmware_group: &aci_firmware_group_present
<<: *aci_info
group: anstest_group
firmwarepol: anstest_policy
state: present
- name: Ensure first firmware group node does not exist
- aci_firmware_group_node: &aci_firmware_group_node_absent
+ cisco.aci.aci_firmware_group_node: &aci_firmware_group_node_absent
<<: *aci_info
group: anstest_group
node: 1001
state: absent
- name: Ensure second firmware group node does not exist
- aci_firmware_group_node: &aci_firmware_group_node_2_absent
+ cisco.aci.aci_firmware_group_node: &aci_firmware_group_node_2_absent
<<: *aci_info
group: anstest_group
node: 1002
state: absent
- name: Create first firmware group node (check_mode)
- aci_firmware_group_node: &aci_firmware_group_node_present
+ cisco.aci.aci_firmware_group_node: &aci_firmware_group_node_present
<<: *aci_firmware_group_node_absent
state: present
check_mode: true
register: cm_add_firmware_group_node_1
- name: Create first firmware group node (normal_mode)
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_firmware_group_node_present
register: nm_add_firmware_group_node_1
- name: Create first firmware group node again - testing idempotency
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_firmware_group_node_present
register: idempotency_add_firmware_group_node_1
- name: Create second firmware group node
- aci_firmware_group_node: &aci_firmware_group_node_2_present
+ cisco.aci.aci_firmware_group_node: &aci_firmware_group_node_2_present
<<: *aci_firmware_group_node_2_absent
state: present
register: nm_add_firmware_group_node_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_firmware_group_node_1 is changed
- cm_add_firmware_group_node_1.previous == []
@@ -93,19 +93,19 @@
- name: Query all firmware group nodes
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_info
state: query
register: query_all_firmware_group_node
- name: Query first firmware group nnode
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_firmware_group_node_present
state: query
register: query_first_firmware_group_node
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_firmware_group_node is not changed
- query_all_firmware_group_node.current | length >= 2
@@ -115,32 +115,32 @@
- query_first_firmware_group_node.current.0.fabricNodeBlk.attributes.to_ == "1001"
- name: Delete first firmware group (check_mode)
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_firmware_group_node_present
state: absent
check_mode: true
register: cm_delete_firmware_group_node_1
- name: Delete first firmware group (normal_mode)
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_firmware_group_node_present
state: absent
register: nm_delete_firmware_group_node_1
- name: Delete first firmware group again - testing idempotency
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_firmware_group_node_present
state: absent
register: idempotency_delete_firmware_group_1
- name: Delete second firmware group (normal_mode)
- aci_firmware_group_node:
+ cisco.aci.aci_firmware_group_node:
<<: *aci_firmware_group_node_2_present
state: absent
register: nm_delete_firmware_group_node_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_firmware_group_node_1 is changed
- cm_delete_firmware_group_node_1.proposed == {}
@@ -154,11 +154,11 @@
- nm_delete_firmware_group_node_2.current == []
- name: Delete firmware group - clean up the environment
- aci_firmware_group:
+ cisco.aci.aci_firmware_group:
<<: *aci_firmware_group_present
state: absent
- name: Delete firmware policy - clean up the environment
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_policy/tasks/main.yml
index ec0bb88ae..4b4be8ad8 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Ensure first firmware policy does not exist
- aci_firmware_policy: &aci_firmware_policy_absent
+ cisco.aci.aci_firmware_policy: &aci_firmware_policy_absent
<<: *aci_info
name: anstest_policy
version: n9000-15.2(7)
@@ -35,37 +35,37 @@
state: absent
- name: Ensure second firmware policy does not exist
- aci_firmware_policy: &aci_firmware_policy_2_absent
+ cisco.aci.aci_firmware_policy: &aci_firmware_policy_2_absent
<<: *aci_info
name: anstest_policy_2
version: n9000-16.0(1)
state: absent
- name: Create first firmware policy (check_mode)
- aci_firmware_policy: &aci_firmware_policy_present
+ cisco.aci.aci_firmware_policy: &aci_firmware_policy_present
<<: *aci_firmware_policy_absent
state: present
check_mode: true
register: cm_add_firmware_policy_1
- name: Create first firmware policy (normal_mode)
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
register: nm_add_firmware_policy_1
- name: Create first firmware policy again - testing idempotency
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
register: idempotency_add_firmware_policy_1
- name: Create second firmware policy
- aci_firmware_policy: &aci_firmware_policy_2_present
+ cisco.aci.aci_firmware_policy: &aci_firmware_policy_2_present
<<: *aci_firmware_policy_2_absent
state: present
register: nm_add_firmware_policy_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_firmware_policy_1 is changed
- cm_add_firmware_policy_1.previous == []
@@ -81,19 +81,19 @@
- nm_add_firmware_policy_2.current.0.firmwareFwP.attributes.version == "n9000-16.0(1)"
- name: Query all firmware policies
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_info
state: query
register: query_all_firmware_policy
- name: Query first firmware policy
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
state: query
register: query_first_firmware_policy
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_firmware_policy is not changed
- query_all_firmware_policy.current | length >= 2
@@ -104,32 +104,32 @@
- query_first_firmware_policy.current.0.firmwareFwP.attributes.version == "n9000-15.2(7)"
- name: Delete first firmware policy (check_mode)
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
state: absent
check_mode: true
register: cm_delete_firmware_policy_1
- name: Delete first firmware policy (normal_mode)
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
state: absent
register: nm_delete_firmware_policy_1
- name: Delete first firmware policy again - testing idempotency
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_present
state: absent
register: idempotency_delete_firmware_policy_1
- name: Delete second firmware policy (normal_mode)
- aci_firmware_policy:
+ cisco.aci.aci_firmware_policy:
<<: *aci_firmware_policy_2_present
state: absent
register: nm_delete_firmware_policy_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_firmware_policy_1 is changed
- cm_delete_firmware_policy_1.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_source/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_source/tasks/main.yml
index d9287506c..a02049473 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_source/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_firmware_source/tasks/main.yml
@@ -22,7 +22,7 @@
# ADD SOURCE
- name: Add source (check_mode)
- aci_firmware_source: &source_present
+ cisco.aci.aci_firmware_source: &source_present
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
password: '{{ aci_password }}'
@@ -38,12 +38,12 @@
register: cm_add_source
- name: Add source (normal mode)
- aci_firmware_source:
+ cisco.aci.aci_firmware_source:
<<: *source_present
register: nm_add_source
- name: Verify add_source
- assert:
+ ansible.builtin.assert:
that:
- cm_add_source is changed
- nm_add_source is changed
@@ -60,22 +60,22 @@
- nm_add_source.current.0.firmwareOSource.attributes.annotation == 'orchestrator:ansible'
- name: Add source again (check_mode)
- aci_firmware_source: *source_present
+ cisco.aci.aci_firmware_source: *source_present
check_mode: true
register: cm_add_source_again
- name: Add source again (normal mode)
- aci_firmware_source:
+ cisco.aci.aci_firmware_source:
<<: *source_present
register: nm_add_source_again
- name: Verify add_source_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_source_again is not changed
- name: Add another source (normal mode)
- aci_firmware_source:
+ cisco.aci.aci_firmware_source:
<<: *source_present
source: ansible_test_2
register: nm_add_source
@@ -99,7 +99,7 @@
register: nm_query_all_sources
- name: Verify query_all_sources
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_sources is not changed
- nm_query_all_sources is not changed
@@ -108,20 +108,20 @@
# QUERY A SOURCE
- name: Query our source (check_mode)
- aci_firmware_source:
+ cisco.aci.aci_firmware_source:
<<: *source_query
source: ansible_test_1
check_mode: true
register: cm_query_source
- name: Query our source (normal mode)
- aci_firmware_source:
+ cisco.aci.aci_firmware_source:
<<: *source_query
source: ansible_test_1
register: nm_query_source
- name: Verify query_source
- assert:
+ ansible.builtin.assert:
that:
- cm_query_source is not changed
- nm_query_source is not changed
@@ -131,7 +131,7 @@
# REMOVE SOURCE
- name: Remove source (check_mode)
- aci_firmware_source: &source_remove
+ cisco.aci.aci_firmware_source: &source_remove
<<: *source_query
source: ansible_test_1
state: absent
@@ -139,11 +139,11 @@
register: cm_remove_source
- name: Remove source (normal mode)
- aci_firmware_source: *source_remove
+ cisco.aci.aci_firmware_source: *source_remove
register: nm_remove_source
- name: Verify remove_source
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_source is changed
- nm_remove_source is changed
@@ -151,36 +151,36 @@
- nm_remove_source.current == []
- name: Remove source again (check_mode)
- aci_firmware_source: *source_remove
+ cisco.aci.aci_firmware_source: *source_remove
check_mode: true
register: cm_remove_source_again
- name: Remove source again (normal mode)
- aci_firmware_source: *source_remove
+ cisco.aci.aci_firmware_source: *source_remove
register: nm_remove_source_again
- name: Verify remove_source_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_source_again is not changed
- nm_remove_source_again is not changed
# QUERY NON-EXISTING SOURCE
- name: Query non-existing source (check_mode)
- aci_firmware_source:
+ cisco.aci.aci_firmware_source:
<<: *source_query
source: non_existing_source
check_mode: true
register: cm_query_non_source
- name: Query non-existing source (normal mode)
- aci_firmware_source:
+ cisco.aci.aci_firmware_source:
<<: *source_query
source: non_existing_source
register: nm_query_non_source
- name: Verify query_non_source
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_source is not changed
- nm_query_non_source is not changed
@@ -202,7 +202,7 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "state is present but all of the following are missing: source, url"'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_igmp_interface_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_igmp_interface_policy/tasks/main.yml
index eac9daf6b..5e5be5de7 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_igmp_interface_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_igmp_interface_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
port: "{{ aci_port | default(omit) }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_blacklist/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_blacklist/tasks/main.yml
index 17e0bb67c..de24043b7 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_blacklist/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_blacklist/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -33,14 +33,14 @@
fex_id: 123
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -53,11 +53,11 @@
register: enable_and_clear
- name: set regex
- set_fact:
+ ansible.builtin.set_fact:
regexp: '(topology/pod-)(\d)(/paths-)(\d*)(/pathep-\[eth)(.*)(])'
- name: Save Target DNs
- set_fact:
+ ansible.builtin.set_fact:
tdn: "{{ item.fabricRsOosPath.attributes.tDn }}"
loop: "{{ enable_and_clear.current }}"
register: enabled_tdn
@@ -105,7 +105,7 @@
register: query_leaf_int_enabled
- name: Leaf - Verify that outofsvc_interface_blacklist is not present
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_int_enabled.current.0.fabricOOServicePol.children is not defined
@@ -118,7 +118,7 @@
register: disable_leaf_int_check
- name: Leaf - Verify that outofsvc_interface_blacklist is not created after check mode
- assert:
+ ansible.builtin.assert:
that:
- disable_leaf_int_check.current.0.fabricOOServicePol.children is not defined
@@ -130,7 +130,7 @@
register: disable_leaf_int
- name: Leaf - Verify that outofsvc_interface_blacklist is created
- assert:
+ ansible.builtin.assert:
that:
- disable_leaf_int.current|length == 1
- disable_leaf_int.current.0.fabricRsOosPath.attributes.tDn == "topology/pod-1/paths-1101/pathep-[eth1/33]"
@@ -145,7 +145,7 @@
register: disable_leaf_int_again
- name: Leaf - Verify that outofsvc_interface_blacklist remains created after disabling again
- assert:
+ ansible.builtin.assert:
that:
- disable_leaf_int_again is not changed
- disable_leaf_int_again.current|length == 1
@@ -160,7 +160,7 @@
register: query_leaf_int_disabled
- name: Leaf - Verify that outofsvc_interface_blacklist remains created after query
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_int_disabled is not changed
- query_leaf_int_disabled.current|length == 1
@@ -176,7 +176,7 @@
register: enable_leaf_int_check
- name: Leaf - Verify that outofsvc_interface_blacklist remains created after check mode
- assert:
+ ansible.builtin.assert:
that:
- enable_leaf_int_check.current|length == 1
- enable_leaf_int_check.current.0.fabricRsOosPath.attributes.tDn == "topology/pod-1/paths-1101/pathep-[eth1/33]"
@@ -190,7 +190,7 @@
register: enable_leaf_int
- name: Leaf - Verify that outofsvc_interface_blacklist is deleted
- assert:
+ ansible.builtin.assert:
that:
- enable_leaf_int.current.0.fabricOOServicePol.children is not defined
@@ -202,7 +202,7 @@
register: enable_leaf_int_again
- name: Leaf - Verify that outofsvc_interface_blacklist remains deleted after enabling again
- assert:
+ ansible.builtin.assert:
that:
- enable_leaf_int_again is not changed
- enable_leaf_int_again.current.0.fabricOOServicePol.children is not defined
@@ -221,7 +221,7 @@
register: query_spine_int_enabled
- name: Spine - Verify that outofsvc_interface_blacklist is not present
- assert:
+ ansible.builtin.assert:
that:
- query_spine_int_enabled.current.0.fabricOOServicePol.children is not defined
@@ -234,7 +234,7 @@
register: disable_spine_int_check
- name: Spine - Verify that outofsvc_interface_blacklist is not created after check mode
- assert:
+ ansible.builtin.assert:
that:
- disable_spine_int_check.current.0.fabricOOServicePol.children is not defined
@@ -246,7 +246,7 @@
register: disable_spine_int
- name: Spine - Verify that outofsvc_interface_blacklist is created
- assert:
+ ansible.builtin.assert:
that:
- disable_spine_int.current|length == 1
- disable_spine_int.current.0.fabricRsOosPath.attributes.tDn == "topology/pod-1/paths-1201/pathep-[eth1/33]"
@@ -260,7 +260,7 @@
register: disable_spine_int_again
- name: Spine - Verify that outofsvc_interface_blacklist remains created after disabling again
- assert:
+ ansible.builtin.assert:
that:
- disable_spine_int_again is not changed
- disable_spine_int_again.current|length == 1
@@ -275,7 +275,7 @@
register: query_spine_int_disabled
- name: Spine - Verify that outofsvc_interface_blacklist remains created after query
- assert:
+ ansible.builtin.assert:
that:
- query_spine_int_disabled is not changed
- query_spine_int_disabled.current|length == 1
@@ -291,7 +291,7 @@
register: enable_spine_int_check
- name: Spine - Verify that outofsvc_interface_blacklist remains created after check mode
- assert:
+ ansible.builtin.assert:
that:
- enable_spine_int_check.current|length == 1
- enable_spine_int_check.current.0.fabricRsOosPath.attributes.tDn == "topology/pod-1/paths-1201/pathep-[eth1/33]"
@@ -305,7 +305,7 @@
register: enable_spine_int
- name: Spine - Verify that outofsvc_interface_blacklist is deleted
- assert:
+ ansible.builtin.assert:
that:
- enable_spine_int.current.0.fabricOOServicePol.children is not defined
@@ -317,7 +317,7 @@
register: enable_spine_int_again
- name: Spine - Verify that outofsvc_interface_blacklist remains deleted after enabling again
- assert:
+ ansible.builtin.assert:
that:
- enable_spine_int_again is not changed
- enable_spine_int_again.current.0.fabricOOServicePol.children is not defined
@@ -336,7 +336,7 @@
register: query_fex_int_enabled
- name: Fex - Verify that outofsvc_interface_blacklist is not present
- assert:
+ ansible.builtin.assert:
that:
- query_fex_int_enabled.current.0.fabricOOServicePol.children is not defined
@@ -349,7 +349,7 @@
register: disable_fex_int_check
- name: Fex - Verify that outofsvc_interface_blacklist is not created after check mode
- assert:
+ ansible.builtin.assert:
that:
- disable_fex_int_check.current.0.fabricOOServicePol.children is not defined
@@ -361,7 +361,7 @@
register: disable_fex_int
- name: Fex - Verify that outofsvc_interface_blacklist is created
- assert:
+ ansible.builtin.assert:
that:
- disable_fex_int.current|length == 1
- disable_fex_int.current.0.fabricRsOosPath.attributes.tDn == "topology/pod-1/paths-1101/extpaths-123/pathep-[eth1/33]"
@@ -375,7 +375,7 @@
register: disable_fex_int_again
- name: Fex - Verify that outofsvc_interface_blacklist remains created after disabling again
- assert:
+ ansible.builtin.assert:
that:
- disable_fex_int_again is not changed
- disable_fex_int_again.current|length == 1
@@ -390,7 +390,7 @@
register: query_fex_int_disabled
- name: Fex - Verify that outofsvc_interface_blacklist remains created after query
- assert:
+ ansible.builtin.assert:
that:
- query_fex_int_disabled is not changed
- query_fex_int_disabled.current|length == 1
@@ -406,7 +406,7 @@
register: enable_fex_int_check
- name: Fex - Verify that outofsvc_interface_blacklist remains created after check mode
- assert:
+ ansible.builtin.assert:
that:
- enable_fex_int_check.current|length == 1
- enable_fex_int_check.current.0.fabricRsOosPath.attributes.tDn == "topology/pod-1/paths-1101/extpaths-123/pathep-[eth1/33]"
@@ -420,7 +420,7 @@
register: enable_fex_int
- name: Fex - Verify that outofsvc_interface_blacklist is deleted
- assert:
+ ansible.builtin.assert:
that:
- enable_fex_int.current.0.fabricOOServicePol.children is not defined
@@ -432,7 +432,7 @@
register: enable_fex_int_again
- name: Fex - Verify that outofsvc_interface_blacklist remains deleted after enabling again
- assert:
+ ansible.builtin.assert:
that:
- enable_fex_int_again is not changed
- enable_fex_int_again.current.0.fabricOOServicePol.children is not defined
@@ -462,7 +462,7 @@
register: query_all_disabled
- name: All - Verify that multiple outofsvc_interface_blacklist exist
- assert:
+ ansible.builtin.assert:
that:
- query_all_disabled is not changed
- query_all_disabled.current | length == 3
@@ -492,7 +492,7 @@
register: query_all_enabled
- name: All - Verify that no outofsvc_interface_blacklist exist
- assert:
+ ansible.builtin.assert:
that:
- query_all_enabled is not changed
- query_all_enabled.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_config/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_config/tasks/main.yml
index 3e8ebcb82..b9bf19f61 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_config/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_config/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -28,7 +28,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for ACI v6+ and non-cloud sites
when:
@@ -74,7 +74,7 @@
ignore_errors: true
- name: Assertions check for the invalid tasks
- assert:
+ ansible.builtin.assert:
that:
- invalid_interface_absent.msg is match("state is absent but all of the following are missing{{':'}} node")
- invalid_interface_details is not changed
@@ -128,7 +128,7 @@
ignore_errors: true
- name: Assertions check for invalid interface configuration tasks
- assert:
+ ansible.builtin.assert:
that:
- invalid_node is not changed
- invalid_node.msg is match("^Node ID{{':'}} .+? is invalid; it must be in the range of 101 to 4000.")
@@ -169,7 +169,7 @@
register: nm_interface_501_present
- name: Assertions check for an interface 501
- assert:
+ ansible.builtin.assert:
that:
- interface_501_absent.current == []
- cm_interface_501_present is changed
@@ -213,7 +213,7 @@
register: nm_interface_502_present
- name: Assertions check for an interface 502
- assert:
+ ansible.builtin.assert:
that:
- interface_502_absent.current == []
- cm_interface_502_present is changed
@@ -257,7 +257,7 @@
register: nm_interface_505_present
- name: Assertions check for an interface 505
- assert:
+ ansible.builtin.assert:
that:
- interface_505_absent.current == []
- cm_interface_505_present is changed
@@ -301,7 +301,7 @@
register: nm_interface_506_present
- name: Assertions check for an interface 506
- assert:
+ ansible.builtin.assert:
that:
- interface_506_absent.current == []
- cm_interface_506_present is changed
@@ -345,7 +345,7 @@
register: nm_interface_507_present
- name: Assertions check for an interface 507
- assert:
+ ansible.builtin.assert:
that:
- interface_507_absent.current == []
- cm_interface_507_present is changed
@@ -385,7 +385,7 @@
register: nm_interface_508_present
- name: Assertions check for an interface 508
- assert:
+ ansible.builtin.assert:
that:
- interface_508_absent.current == []
- cm_interface_508_present is changed
@@ -431,7 +431,7 @@
register: idm_interface_509_present
- name: Assertions check for an interface 509
- assert:
+ ansible.builtin.assert:
that:
- interface_509_absent.current == []
- cm_interface_509_present is changed
@@ -493,7 +493,7 @@
register: idm_breakout_501_present
- name: Assertions check for convert the interface 501 to breakout(100g-4x)
- assert:
+ ansible.builtin.assert:
that:
- invalid_breakout_501_present is not changed
- invalid_breakout_501_present.msg == "parameters are mutually exclusive{{':'}} policy_group|breakout"
@@ -524,7 +524,7 @@
register: query_all_access_interfaces
- name: Assertions check for query all access interfaces
- assert:
+ ansible.builtin.assert:
that:
- query_all_access_interfaces is not changed
- query_all_access_interfaces.current|length >= 5
@@ -537,7 +537,7 @@
register: query_all_fabric_interfaces
- name: Assertions check for query all fabric interfaces
- assert:
+ ansible.builtin.assert:
that:
- query_all_fabric_interfaces is not changed
- query_all_fabric_interfaces.current|length >= 2
@@ -551,7 +551,7 @@
register: query_access_interface_502
- name: Assertions check for query a access interface with node id 502
- assert:
+ ansible.builtin.assert:
that:
- query_access_interface_502 is not changed
- query_access_interface_502.current|length == 1
@@ -570,7 +570,7 @@
register: query_access_fabric_509
- name: Assertions check for query a fabric interface with node id 509
- assert:
+ ansible.builtin.assert:
that:
- query_access_fabric_509 is not changed
- query_access_fabric_509.current|length == 1
@@ -617,7 +617,7 @@
register: rm_interface_508_present
- name: Assertions check for remove Interfaces 501 to 508
- assert:
+ ansible.builtin.assert:
that:
- rm_interface_501_present is changed
- rm_interface_501_present.current == []
@@ -646,7 +646,7 @@
register: nm_rm_interface_509_present
- name: Assertions check for remove Interface 509
- assert:
+ ansible.builtin.assert:
that:
- cm_rm_interface_509_present is changed
- cm_rm_interface_509_present.current != []
@@ -660,7 +660,7 @@
register: idm_rm_interface_509_present
- name: Assertions check for remove Interface 509 with idempotency check
- assert:
+ ansible.builtin.assert:
that:
- idm_rm_interface_509_present is not changed
- idm_rm_interface_509_present.current == []
@@ -674,7 +674,7 @@
register: query_interface_509
- name: Assertions check for query an interface 509 after removed from the APIC
- assert:
+ ansible.builtin.assert:
that:
- query_interface_509 is not changed
- query_interface_509.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_description/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_description/tasks/main.yml
index ec4f0250d..474603c12 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_description/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_description/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: debug
- name: Node types
- set_fact:
+ ansible.builtin.set_fact:
test_vars_leaf: &test_vars_leaf
pod_id: 1
node_id: 1101
@@ -41,7 +41,7 @@
description: testing
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -72,7 +72,7 @@
register: query_leaf_description
- name: Leaf - Verify that no infraHPathS is present
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_description.current.0.infraInfra.children.0.infraHPathS.children is not defined
@@ -84,7 +84,7 @@
register: set_leaf_description
- name: Leaf - Verify that description is set on interface
- assert:
+ ansible.builtin.assert:
that:
- set_leaf_description.current|length == 1
- set_leaf_description.current.0.infraHPathS.children.0.infraRsHPathAtt.attributes.tDn == "topology/pod-1/paths-1101/pathep-[eth1/33]"
@@ -99,7 +99,7 @@
register: query_leaf_interface_1101_eth1_33
- name: Assertion check for query Leaf interface - 1101_eth1_33
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_interface_1101_eth1_33.current.0.infraHPathS.children | length == 1
- query_leaf_interface_1101_eth1_33.current.0.infraHPathS.children.0.infraRsHPathAtt.attributes.rn == "rsHPathAtt-[topology/pod-1/paths-1101/pathep-[eth1/33]]"
@@ -115,7 +115,7 @@
register: query_all_leaf_interfaces
- name: Verify query all leaf interfaces
- assert:
+ ansible.builtin.assert:
that:
- query_all_leaf_interfaces.current | length > 1
- query_all_leaf_interfaces.current.1.infraHPathS.children.0.infraRsHPathAtt.attributes.rn == "rsHPathAtt-[topology/pod-1/paths-1101/pathep-[eth1/33]]"
@@ -137,7 +137,7 @@
register: query_leaf_description_again
- name: Leaf - Verify that no infraHPathS is present
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_description_again.current.0.infraInfra.children.0.infraHPathS.children is not defined
@@ -155,7 +155,7 @@
register: query_spine_description
- name: Spine - Verify that no infraSHPathS is present
- assert:
+ ansible.builtin.assert:
that:
- query_spine_description.current.0.infraInfra.children.0.infraSHPathS.children is not defined
@@ -167,7 +167,7 @@
register: set_spine_description
- name: Spine - Verify that description is set on interface
- assert:
+ ansible.builtin.assert:
that:
- set_spine_description.current|length == 1
- set_spine_description.current.0.infraSHPathS.children.0.infraRsSHPathAtt.attributes.tDn == "topology/pod-1/paths-1201/pathep-[eth1/33]"
@@ -181,7 +181,7 @@
register: query_spine_interface_1201_eth1_33
- name: Assertion check for query Spine interface - 1201_eth1_33
- assert:
+ ansible.builtin.assert:
that:
- query_spine_interface_1201_eth1_33.current.0.infraSHPathS.children | length == 1
- query_spine_interface_1201_eth1_33.current.0.infraSHPathS.children.0.infraRsSHPathAtt.attributes.rn == "rsSHPathAtt-[topology/pod-1/paths-1201/pathep-[eth1/33]]"
@@ -197,7 +197,7 @@
register: query_all_spine_interfaces
- name: Verify query all spine interfaces
- assert:
+ ansible.builtin.assert:
that:
- query_all_spine_interfaces.current | length >= 1
- query_all_spine_interfaces.current.1.infraSHPathS.children.0.infraRsSHPathAtt.attributes.rn == "rsSHPathAtt-[topology/pod-1/paths-1201/pathep-[eth1/33]]"
@@ -219,7 +219,7 @@
register: query_spine_description_again
- name: Spine - Verify that no infraSHPathS is present
- assert:
+ ansible.builtin.assert:
that:
- query_spine_description_again.current.0.infraInfra.children.0.infraSHPathS.children is not defined
@@ -237,7 +237,7 @@
register: query_fex_description
- name: Fex - Verify that no infraHPathS is present
- assert:
+ ansible.builtin.assert:
that:
- query_fex_description.current.0.infraInfra.children.0.infraHPathS.children is not defined
@@ -249,7 +249,7 @@
register: set_fex_description
- name: Fex - Verify that description is set on interface
- assert:
+ ansible.builtin.assert:
that:
- set_fex_description.current|length == 1
- set_fex_description.current.0.infraHPathS.children.0.infraRsHPathAtt.attributes.tDn == "topology/pod-1/paths-1101/extpaths-123/pathep-[eth1/33]"
@@ -263,7 +263,7 @@
register: query_fex_interface_1201_eth1_33
- name: Assertion check for query Fex interface - 1101_eth123_1_33
- assert:
+ ansible.builtin.assert:
that:
- query_fex_interface_1201_eth1_33.current.0.infraHPathS.children | length == 1
- query_fex_interface_1201_eth1_33.current.0.infraHPathS.children.0.infraRsHPathAtt.attributes.rn == "rsHPathAtt-[topology/pod-1/paths-1101/extpaths-123/pathep-[eth1/33]]"
@@ -284,6 +284,6 @@
register: query_fex_description_again
- name: Fex - Verify that no infraHPathS is present
- assert:
+ ansible.builtin.assert:
that:
- query_fex_description_again.current.0.infraInfra.children.0.infraHPathS.children is not defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/tasks/main.yml
new file mode 100644
index 000000000..2d688f2c6
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd/tasks/main.yml
@@ -0,0 +1,245 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Anvitha Jain (@anvjain)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Execute tasks only for non-cloud sites
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=') # This condition will execute only when APIC version >= 5.2
+ block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+ - name: Add a new tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # CREATE BFD Interface policy
+ - name: Add a new BFD Interface policy - check mode
+ cisco.aci.aci_interface_policy_bfd: &add_bfd_interface_pol
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ description: Ansible BFD Interface Policy
+ state: present
+ check_mode: true
+ register: cm_add_bfd_interface_pol
+
+ - name: Add a new BFD Interface policy - normal mode
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *add_bfd_interface_pol
+ state: present
+ register: nm_add_bfd_interface_pol
+
+ - name: Verify BFD Interface Policy creation
+ assert:
+ that:
+ - cm_add_bfd_interface_pol is changed
+ - nm_add_bfd_interface_pol is changed
+ - cm_add_bfd_interface_pol.previous == nm_add_bfd_interface_pol.previous == []
+ - cm_add_bfd_interface_pol.proposed.bfdIfPol.attributes.dn == nm_add_bfd_interface_pol.current.0.bfdIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdIfPol-ansible_bfd_interface_policy"
+ - cm_add_bfd_interface_pol.proposed.bfdIfPol.attributes.name == nm_add_bfd_interface_pol.current.0.bfdIfPol.attributes.name == "ansible_bfd_interface_policy"
+ - cm_add_bfd_interface_pol.proposed.bfdIfPol.attributes.descr == nm_add_bfd_interface_pol.current.0.bfdIfPol.attributes.descr == "Ansible BFD Interface Policy"
+
+ - name: Add a new BFD Interface policy again - idempotency
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *add_bfd_interface_pol
+ state: present
+ register: add_bfd_interface_pol_again
+
+ - name: Verify BFD Interface Policy creation again - idempotency
+ assert:
+ that:
+ - add_bfd_interface_pol_again is not changed
+ - add_bfd_interface_pol_again.previous != []
+ - add_bfd_interface_pol_again.current | length == 1
+ - add_bfd_interface_pol_again.previous | length == 1
+
+ - name: Modify a BFD Interface policy
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *add_bfd_interface_pol
+ admin_state: disabled
+ detection_multiplier: 5
+ min_transmit_interval: 270
+ min_receive_interval: 500
+ state: present
+ register: update_bfd_interface_pol
+
+ - name: Verify modifying BFD Interface Policy
+ assert:
+ that:
+ - update_bfd_interface_pol is changed
+ - update_bfd_interface_pol.previous != update_bfd_interface_pol.current
+ - update_bfd_interface_pol.current.0.bfdIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdIfPol-ansible_bfd_interface_policy"
+ - update_bfd_interface_pol.current.0.bfdIfPol.attributes.name == "ansible_bfd_interface_policy"
+ - update_bfd_interface_pol.current.0.bfdIfPol.attributes.descr == "Ansible BFD Interface Policy"
+ - update_bfd_interface_pol.current.0.bfdIfPol.attributes.adminSt == "disabled"
+ - update_bfd_interface_pol.current.0.bfdIfPol.attributes.detectMult == "5"
+ - update_bfd_interface_pol.current.0.bfdIfPol.attributes.minRxIntvl == "500"
+ - update_bfd_interface_pol.current.0.bfdIfPol.attributes.minTxIntvl == "270"
+
+ # Added another BFD Interface policy
+ - name: Add a new BFD Interface policy - normal mode
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *add_bfd_interface_pol
+ name: ansible_bfd_interface_policy_2
+ state: present
+ register: add_bfd_interface_pol_2
+
+ - name: Verify BFD Interface Policy creation
+ assert:
+ that:
+ - add_bfd_interface_pol_2 is changed
+ - add_bfd_interface_pol_2.previous == []
+ - add_bfd_interface_pol_2.current.0.bfdIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdIfPol-ansible_bfd_interface_policy_2"
+ - add_bfd_interface_pol_2.current.0.bfdIfPol.attributes.name == "ansible_bfd_interface_policy_2"
+ - add_bfd_interface_pol_2.current.0.bfdIfPol.attributes.descr == "Ansible BFD Interface Policy"
+ - add_bfd_interface_pol_2.current.0.bfdIfPol.attributes.adminSt == "enabled"
+ - add_bfd_interface_pol_2.current.0.bfdIfPol.attributes.detectMult == "3"
+ - add_bfd_interface_pol_2.current.0.bfdIfPol.attributes.minRxIntvl == "50"
+ - add_bfd_interface_pol_2.current.0.bfdIfPol.attributes.minTxIntvl == "50"
+
+ - name: Query all BFD Interface policies in a specific tenant
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: query
+ register: query_all_result
+
+ - name: Verify querying all BFD Interface Policies
+ assert:
+ that:
+ - query_all_result is not changed
+ - query_all_result.current.0.fvTenant.children | length == 2
+ - query_all_result.current.0.fvTenant.children[0].bfdIfPol.attributes.name == "ansible_bfd_interface_policy_2"
+ - query_all_result.current.0.fvTenant.children[1].bfdIfPol.attributes.name == "ansible_bfd_interface_policy"
+
+ - name: Query 'ansible_bfd_interface_policy' BFD Interface policies in a specific tenant
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ state: query
+ register: query_result
+
+ - name: Verify querying'ansible_bfd_interface_policy BFD' Multihop Interface Policy
+ assert:
+ that:
+ - query_result is not changed
+ - query_result.current.0.bfdIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdIfPol-ansible_bfd_interface_policy"
+ - query_result.current.0.bfdIfPol.attributes.name == "ansible_bfd_interface_policy"
+
+ - name: Remove a BFD Interface policy - check mode
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ state: absent
+ check_mode: true
+ register: cm_remove_bfd_interface_pol
+
+ - name: Remove a BFD Interface policy - normal mode
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ state: absent
+ register: nm_remove_bfd_interface_pol
+
+ - name: Remove a BFD Interface policy again
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_interface_policy
+ state: absent
+ register: remove_bfd_interface_pol_again
+
+ - name: Verify removing BFD Interface Policies
+ assert:
+ that:
+ - nm_remove_bfd_interface_pol is changed
+ - cm_remove_bfd_interface_pol is changed
+ - cm_remove_bfd_interface_pol.proposed == {}
+ - nm_remove_bfd_interface_pol.previous != []
+ - remove_bfd_interface_pol_again is not changed
+ - nm_remove_bfd_interface_pol.current == remove_bfd_interface_pol_again.current == []
+
+# Validating out of range parameters.
+
+# Added BFD Interface policy with out of the range detection_multiplier
+ - name: Add a new BFD Interface policy - out of the range detection_multiplier
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *add_bfd_interface_pol
+ name: ansible_bfd_interface_policy_3
+ detection_multiplier: 256
+ state: present
+ ignore_errors: true
+ register: add_bfd_interface_pol_3
+
+ - name: Verify BFD Interface Policy creation
+ assert:
+ that:
+ - add_bfd_interface_pol_3 is not changed
+ - add_bfd_interface_pol_3.msg == "The \"detection_multiplier\" must be a value between 1 and 50"
+
+# Added BFD Interface policy with out of the range min_transmit_interval
+ - name: Add a new BFD Interface policy - out of the range min_transmit_interval
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *add_bfd_interface_pol
+ name: ansible_bfd_interface_policy_3
+ min_transmit_interval: 10
+ state: present
+ ignore_errors: true
+ register: add_bfd_interface_pol_3
+
+ - name: Verify BFD Interface Policy creation
+ assert:
+ that:
+ - add_bfd_interface_pol_3 is not changed
+ - add_bfd_interface_pol_3.msg == "The \"min_transmit_interval\" must be a value between 50 and 999"
+
+# Added BFD Interface policy with out of the range min_receive_interval
+ - name: Add a new BFD Interface policy - out of the range min_receive_interval
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *add_bfd_interface_pol
+ name: ansible_bfd_interface_policy_3
+ min_receive_interval: 1000
+ state: present
+ ignore_errors: true
+ register: add_bfd_interface_pol_3
+
+ - name: Verify BFD Interface Policy creation
+ assert:
+ that:
+ - add_bfd_interface_pol_3 is not changed
+ - add_bfd_interface_pol_3.msg == "The \"min_receive_interval\" must be a value between 50 and 999" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/tasks/main.yml
new file mode 100644
index 000000000..8454803ec
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_bfd_multihop/tasks/main.yml
@@ -0,0 +1,245 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Anvitha Jain (@anvjain)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Execute tasks only for non-cloud sites
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=') # This condition will execute only when APIC version >= 5.2
+ block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_tenant
+ aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+ - name: Add a new tenant
+ aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # CREATE BFD Multihop Interface policy
+ - name: Add a new BFD Multihop Interface policy - check mode
+ cisco.aci.aci_interface_policy_bfd_multihop: &add_bfd_multihop_interface_pol
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ description: Ansible BFD Multihop Interface Policy
+ state: present
+ check_mode: true
+ register: cm_add_bfd_multihop_interface_pol
+
+ - name: Add a new BFD Multihop Interface policy - normal mode
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *add_bfd_multihop_interface_pol
+ state: present
+ register: nm_add_bfd_multihop_interface_pol
+
+ - name: Verify BFD Multihop Interface Policy creation
+ assert:
+ that:
+ - cm_add_bfd_multihop_interface_pol is changed
+ - nm_add_bfd_multihop_interface_pol is changed
+ - cm_add_bfd_multihop_interface_pol.previous == nm_add_bfd_multihop_interface_pol.previous == []
+ - cm_add_bfd_multihop_interface_pol.proposed.bfdMhIfPol.attributes.dn == nm_add_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdMhIfPol-ansible_bfd_multihop_interface_policy"
+ - cm_add_bfd_multihop_interface_pol.proposed.bfdMhIfPol.attributes.name == nm_add_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.name == "ansible_bfd_multihop_interface_policy"
+ - cm_add_bfd_multihop_interface_pol.proposed.bfdMhIfPol.attributes.descr == nm_add_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.descr == "Ansible BFD Multihop Interface Policy"
+
+ - name: Add a new BFD Multihop Interface policy again - idempotency
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *add_bfd_multihop_interface_pol
+ state: present
+ register: add_bfd_multihop_interface_pol_again
+
+ - name: Verify BFD Multihop Interface Policy creation again - idempotency
+ assert:
+ that:
+ - add_bfd_multihop_interface_pol_again is not changed
+ - add_bfd_multihop_interface_pol_again.previous != []
+ - add_bfd_multihop_interface_pol_again.current | length == 1
+ - add_bfd_multihop_interface_pol_again.previous | length == 1
+
+ - name: Modify a BFD Multihop Interface policy
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *add_bfd_multihop_interface_pol
+ admin_state: disabled
+ detection_multiplier: 5
+ min_transmit_interval: 270
+ min_receive_interval: 500
+ state: present
+ register: update_bfd_multihop_interface_pol
+
+ - name: Verify modifying BFD Multihop Interface Policy
+ assert:
+ that:
+ - update_bfd_multihop_interface_pol is changed
+ - update_bfd_multihop_interface_pol.previous != update_bfd_multihop_interface_pol.current
+ - update_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdMhIfPol-ansible_bfd_multihop_interface_policy"
+ - update_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.name == "ansible_bfd_multihop_interface_policy"
+ - update_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.descr == "Ansible BFD Multihop Interface Policy"
+ - update_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.adminSt == "disabled"
+ - update_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.detectMult == "5"
+ - update_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.minRxIntvl == "500"
+ - update_bfd_multihop_interface_pol.current.0.bfdMhIfPol.attributes.minTxIntvl == "270"
+
+ # Added another BFD Multihop Interface policy
+ - name: Add a new BFD Multihop Interface policy - normal mode
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *add_bfd_multihop_interface_pol
+ name: ansible_bfd_multihop_interface_policy_2
+ state: present
+ register: add_bfd_multihop_interface_pol_2
+
+ - name: Verify BFD Multihop Interface Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_interface_pol_2 is changed
+ - add_bfd_multihop_interface_pol_2.previous == []
+ - add_bfd_multihop_interface_pol_2.current.0.bfdMhIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdMhIfPol-ansible_bfd_multihop_interface_policy_2"
+ - add_bfd_multihop_interface_pol_2.current.0.bfdMhIfPol.attributes.name == "ansible_bfd_multihop_interface_policy_2"
+ - add_bfd_multihop_interface_pol_2.current.0.bfdMhIfPol.attributes.descr == "Ansible BFD Multihop Interface Policy"
+ - add_bfd_multihop_interface_pol_2.current.0.bfdMhIfPol.attributes.adminSt == "enabled"
+ - add_bfd_multihop_interface_pol_2.current.0.bfdMhIfPol.attributes.detectMult == "3"
+ - add_bfd_multihop_interface_pol_2.current.0.bfdMhIfPol.attributes.minRxIntvl == "250"
+ - add_bfd_multihop_interface_pol_2.current.0.bfdMhIfPol.attributes.minTxIntvl == "250"
+
+ - name: Query all BFD Multihop Interface policies in a specific tenant
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: query
+ register: query_all_result
+
+ - name: Verify querying all BFD Multihop Interface Policies
+ assert:
+ that:
+ - query_all_result is not changed
+ - query_all_result.current.0.fvTenant.children | length == 2
+ - query_all_result.current.0.fvTenant.children[0].bfdMhIfPol.attributes.name == "ansible_bfd_multihop_interface_policy_2"
+ - query_all_result.current.0.fvTenant.children[1].bfdMhIfPol.attributes.name == "ansible_bfd_multihop_interface_policy"
+
+ - name: Query 'ansible_bfd_multihop_interface_policy' BFD Multihop Interface policies in a specific tenant
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ state: query
+ register: query_result
+
+ - name: Verify querying'ansible_bfd_multihop_interface_policy BFD' Multihop Interface Policy
+ assert:
+ that:
+ - query_result is not changed
+ - query_result.current.0.bfdMhIfPol.attributes.dn == "uni/tn-ansible_tenant/bfdMhIfPol-ansible_bfd_multihop_interface_policy"
+ - query_result.current.0.bfdMhIfPol.attributes.name == "ansible_bfd_multihop_interface_policy"
+
+ - name: Remove a BFD Multihop Interface policy - check mode
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ state: absent
+ check_mode: true
+ register: cm_remove_bfd_multihop_interface_pol
+
+ - name: Remove a BFD Multihop Interface policy - normal mode
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ state: absent
+ register: nm_remove_bfd_multihop_interface_pol
+
+ - name: Remove a BFD Multihop Interface policy again - idempotency
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ state: absent
+ register: remove_bfd_multihop_interface_pol_again
+
+ - name: Verify removing BFD Multihop Interface Policies
+ assert:
+ that:
+ - nm_remove_bfd_multihop_interface_pol is changed
+ - cm_remove_bfd_multihop_interface_pol is changed
+ - cm_remove_bfd_multihop_interface_pol.proposed == nm_remove_bfd_multihop_interface_pol.proposed == {}
+ - nm_remove_bfd_multihop_interface_pol.previous != []
+ - remove_bfd_multihop_interface_pol_again is not changed
+ - nm_remove_bfd_multihop_interface_pol.current == remove_bfd_multihop_interface_pol_again.current == []
+
+# Validating out of rage parameters.
+
+# Added BFD Multihop Interface policy with out of the range detection_multiplier
+ - name: Add a new BFD Multihop Interface policy - out of the range detection_multiplier
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *add_bfd_multihop_interface_pol
+ name: ansible_bfd_multihop_interface_policy_3
+ detection_multiplier: 256
+ state: present
+ ignore_errors: true
+ register: add_bfd_multihop_interface_pol_3
+
+ - name: Verify BFD Multihop Interface Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_interface_pol_3 is not changed
+ - add_bfd_multihop_interface_pol_3.msg == "The \"detection_multiplier\" must be a value between 1 and 50"
+
+# Added BFD Multihop Interface policy with out of the range min_transmit_interval
+ - name: Add a new BFD Multihop Interface policy - out of the range min_transmit_interval
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *add_bfd_multihop_interface_pol
+ name: ansible_bfd_multihop_interface_policy_3
+ min_transmit_interval: 50
+ state: present
+ ignore_errors: true
+ register: add_bfd_multihop_interface_pol_3
+
+ - name: Verify BFD Multihop Interface Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_interface_pol_3 is not changed
+ - add_bfd_multihop_interface_pol_3.msg == "The \"min_transmit_interval\" must be a value between 250 and 999"
+
+# Added BFD Multihop Interface policy with out of the range min_receive_interval
+ - name: Add a new BFD Multihop Interface policy - out of the range min_receive_interval
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *add_bfd_multihop_interface_pol
+ name: ansible_bfd_multihop_interface_policy_3
+ min_receive_interval: 1000
+ state: present
+ ignore_errors: true
+ register: add_bfd_multihop_interface_pol_3
+
+ - name: Verify BFD Multihop Interface Policy creation
+ assert:
+ that:
+ - add_bfd_multihop_interface_pol_3 is not changed
+ - add_bfd_multihop_interface_pol_3.msg == "The \"min_receive_interval\" must be a value between 250 and 999" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_cdp/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_cdp/tasks/main.yml
index 48ac1d806..db7751943 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_cdp/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_cdp/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -63,7 +63,7 @@
register: cdp_idem
- name: Assert that idempotency is not changed
- assert:
+ ansible.builtin.assert:
that:
- cdp_idem is not changed
@@ -86,7 +86,7 @@
var: cdp_disable
- name: Assert that CDP is Disabled
- assert:
+ ansible.builtin.assert:
that:
- cdp_disable.current.0.cdpIfPol.attributes.adminSt == 'disabled'
@@ -106,6 +106,6 @@
var: cdp_query
- name: CDP Query Assertion
- assert:
+ ansible.builtin.assert:
that:
- cdp_query is not changed \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/tasks/main.yml
new file mode 100644
index 000000000..841c29ad8
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_eigrp/tasks/main.yml
@@ -0,0 +1,192 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a eigrp interface policy (check_mode)
+ cisco.aci.aci_interface_policy_eigrp: &aci_interface_policy_eigrp_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ eigrp_interface: ansible_eigrp_interface_1
+ description: eigrp interface policy 1 for ansible_tenant tenant
+ bandwidth: 100000
+ control_state: [bfd, nexthop_self, passive, split_horizon]
+ delay: 10
+ delay_unit: picoseconds
+ hello_interval: 10
+ hold_interval: 30
+ state: present
+ check_mode: true
+ register: cm_add_eigrp_interface
+
+ - name: Add a eigrp interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_interface_policy_eigrp_present
+ register: nm_add_eigrp_interface
+
+ - name: Add the first eigrp interface policy again - testing idempotency
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_interface_policy_eigrp_present
+ register: nm_add_eigrp_interface_idempotency
+
+ - name: Add a second eigrp interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_info
+ tenant: ansible_tenant
+ eigrp_interface: ansible_eigrp_interface_2
+ description: eigrp interface policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_eigrp_interface_2
+
+ - name: Add a third eigrp interface policy - bandwidth out of bounds
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_info
+ tenant: ansible_tenant
+ eigrp_interface: ansible_eigrp_interface_3
+ bandwidth: 2560000001
+ state: present
+ ignore_errors: true
+ register: error_bw_out_of_bounds
+
+ - name: Add a fourth eigrp interface policy - hello_interval out of bounds
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_info
+ tenant: ansible_tenant
+ eigrp_interface: ansible_eigrp_interface_4
+ hello_interval: 65536
+ state: present
+ ignore_errors: true
+ register: error_helloIntvl_out_of_bounds
+
+ - name: Add a fifth eigrp interface policy - hold_interval out of bounds
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_info
+ tenant: ansible_tenant
+ eigrp_interface: ansible_eigrp_interface_5
+ hold_interval: 65536
+ state: present
+ ignore_errors: true
+ register: error_holdIntvl_out_of_bounds
+
+ - name: Asserts for eigrp interface policys creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_eigrp_interface is changed
+ - cm_add_eigrp_interface.previous == []
+ - cm_add_eigrp_interface.current == []
+ - nm_add_eigrp_interface is changed
+ - nm_add_eigrp_interface.current.0.eigrpIfPol.attributes.name == "ansible_eigrp_interface_1"
+ - nm_add_eigrp_interface.current.0.eigrpIfPol.attributes.bw == "100000"
+ - nm_add_eigrp_interface.current.0.eigrpIfPol.attributes.ctrl == "bfd,nh-self,passive,split-horizon"
+ - nm_add_eigrp_interface.current.0.eigrpIfPol.attributes.delay == "10"
+ - nm_add_eigrp_interface.current.0.eigrpIfPol.attributes.delayUnit == "pico"
+ - nm_add_eigrp_interface.current.0.eigrpIfPol.attributes.helloIntvl == "10"
+ - nm_add_eigrp_interface.current.0.eigrpIfPol.attributes.holdIntvl == "30"
+ - nm_add_eigrp_interface_idempotency is not changed
+ - nm_add_eigrp_interface_2 is changed
+ - nm_add_eigrp_interface_2.previous == []
+ - nm_add_eigrp_interface_2.current.0.eigrpIfPol.attributes.name == "ansible_eigrp_interface_2"
+ - nm_add_eigrp_interface_2.current.0.eigrpIfPol.attributes.bw == "0"
+ - nm_add_eigrp_interface_2.current.0.eigrpIfPol.attributes.ctrl == "nh-self,split-horizon"
+ - nm_add_eigrp_interface_2.current.0.eigrpIfPol.attributes.delay == "0"
+ - nm_add_eigrp_interface_2.current.0.eigrpIfPol.attributes.delayUnit == "tens-of-micro"
+ - nm_add_eigrp_interface_2.current.0.eigrpIfPol.attributes.helloIntvl == "5"
+ - nm_add_eigrp_interface_2.current.0.eigrpIfPol.attributes.holdIntvl == "15"
+ - error_bw_out_of_bounds.msg == "Parameter 'bandwidth' is only valid in range between 0 and 2560000000."
+ - error_helloIntvl_out_of_bounds.msg == "Parameter 'hello_interval' is only valid in range between 1 and 65535."
+ - error_holdIntvl_out_of_bounds.msg == "Parameter 'hold_interval' is only valid in range between 1 and 65535."
+
+ - name: Query all eigrp interface policies
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_info
+ state: query
+ register: query_all_eigrp_interface
+
+ - name: Query ansible_eigrp_interface_1
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_interface_policy_eigrp_present
+ state: query
+ register: query_ansible_eigrp_interface_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_eigrp_interface is not changed
+ - query_all_eigrp_interface.current|length >= 2
+ - query_ansible_eigrp_interface_1 is not changed
+ - query_ansible_eigrp_interface_1.current.0.eigrpIfPol.attributes.name == "ansible_eigrp_interface_1"
+ - query_ansible_eigrp_interface_1.current.0.eigrpIfPol.attributes.bw == "100000"
+ - query_ansible_eigrp_interface_1.current.0.eigrpIfPol.attributes.ctrl == "bfd,nh-self,passive,split-horizon"
+ - query_ansible_eigrp_interface_1.current.0.eigrpIfPol.attributes.delay == "10"
+ - query_ansible_eigrp_interface_1.current.0.eigrpIfPol.attributes.delayUnit == "pico"
+ - query_ansible_eigrp_interface_1.current.0.eigrpIfPol.attributes.helloIntvl == "10"
+ - query_ansible_eigrp_interface_1.current.0.eigrpIfPol.attributes.holdIntvl == "30"
+
+ - name: Remove eigrp interface policy (check_mode)
+ cisco.aci.aci_interface_policy_eigrp: &eigrp_interface_absent
+ <<: *aci_interface_policy_eigrp_present
+ state: absent
+ check_mode: true
+ register: cm_remove_eigrp_interface
+
+ - name: Remove eigrp interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *eigrp_interface_absent
+ register: nm_remove_eigrp_interface
+
+ - name: Remove eigrp interface policy - testing idempotency
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *eigrp_interface_absent
+ register: nm_remove_eigrp_interface_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_eigrp_interface is changed
+ - cm_remove_eigrp_interface.proposed == {}
+ - nm_remove_eigrp_interface is changed
+ - nm_remove_eigrp_interface.previous != []
+ - nm_remove_eigrp_interface.method == "DELETE"
+ - nm_remove_eigrp_interface_idempotency is not changed
+ - nm_remove_eigrp_interface_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_fc/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_fc/tasks/main.yml
index 5e039380e..001ce0323 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_fc/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_fc/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Ensure first fc interface policy does not exist
- aci_interface_policy_fc: &aci_interface_policy_fc_absent
+ cisco.aci.aci_interface_policy_fc: &aci_interface_policy_fc_absent
<<: *aci_info
name: anstest_policy
description: test for fc interface policy
@@ -40,36 +40,36 @@
state: absent
- name: Ensure second fc interface policy does not exist
- aci_interface_policy_fc: &aci_interface_policy_fc_2_absent
+ cisco.aci.aci_interface_policy_fc: &aci_interface_policy_fc_2_absent
<<: *aci_info
name: anstest_policy_2
state: absent
- name: Create first fc interface policy (check_mode)
- aci_interface_policy_fc: &aci_interface_policy_fc_present
+ cisco.aci.aci_interface_policy_fc: &aci_interface_policy_fc_present
<<: *aci_interface_policy_fc_absent
state: present
check_mode: true
register: cm_add_interface_policy_fc_1
- name: Create first fc interface policy (normal_mode)
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_interface_policy_fc_present
register: nm_add_interface_policy_fc_1
- name: Create first fc interface policy again - testing idempotency
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_interface_policy_fc_present
register: idempotency_add_interface_policy_fc_1
- name: Create second fc interface policy
- aci_interface_policy_fc: &aci_interface_policy_fc_2_present
+ cisco.aci.aci_interface_policy_fc: &aci_interface_policy_fc_2_present
<<: *aci_interface_policy_fc_2_absent
state: present
register: nm_add_interface_policy_fc_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_interface_policy_fc_1 is changed
- cm_add_interface_policy_fc_1.previous == []
@@ -94,19 +94,19 @@
- idempotency_add_interface_policy_fc_1 is not changed
- name: Query all fc interface policies
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_info
state: query
register: query_all_interface_policy_fc
- name: Query first fc interface policy
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_interface_policy_fc_present
state: query
register: query_first_interface_policy_fc
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_interface_policy_fc is not changed
- query_all_interface_policy_fc.current | length >= 2
@@ -121,32 +121,32 @@
- query_first_interface_policy_fc.current.0.fcIfPol.attributes.trunkMode == "trunk-on"
- name: Delete first fc interface policy (check_mode)
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_interface_policy_fc_present
state: absent
check_mode: true
register: cm_delete_interface_policy_fc_1
- name: Delete first fc interface policy (normal_mode)
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_interface_policy_fc_present
state: absent
register: nm_delete_interface_policy_fc_1
- name: Delete first fc interface policy again - testing idempotency
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_interface_policy_fc_present
state: absent
register: idempotency_delete_interface_policy_fc_1
- name: Delete second fc interface policy (normal_mode)
- aci_interface_policy_fc:
+ cisco.aci.aci_interface_policy_fc:
<<: *aci_interface_policy_fc_2_present
state: absent
register: nm_delete_interface_policy_fc_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_interface_policy_fc_1 is changed
- cm_delete_interface_policy_fc_1.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/tasks/main.yml
new file mode 100644
index 000000000..4a8fca8f4
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_hsrp/tasks/main.yml
@@ -0,0 +1,184 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Add a HSRP interface policy in check mode
+ cisco.aci.aci_interface_policy_hsrp: &hsrp_present
+ <<: *tenant_present
+ hsrp: hsrp1
+ controls: ["bia"]
+ reload_delay: 2
+ delay: 2
+ state: present
+ check_mode: true
+ register: cm_add_hsrp
+
+ - name: Add a HSRP interface policy in normal mode
+ cisco.aci.aci_interface_policy_hsrp: *hsrp_present
+ register: nm_add_hsrp
+
+ - name: Verify add hsrp
+ ansible.builtin.assert:
+ that:
+ - cm_add_hsrp is changed
+ - nm_add_hsrp is changed
+ - cm_add_hsrp.previous == nm_add_hsrp.previous == []
+ - cm_add_hsrp.proposed.hsrpIfPol.attributes.ctrl == "bia"
+ - cm_add_hsrp.proposed.hsrpIfPol.attributes.delay == "2"
+ - cm_add_hsrp.proposed.hsrpIfPol.attributes.reloadDelay == "2"
+ - cm_add_hsrp.proposed.hsrpIfPol.attributes.name == "hsrp1"
+ - nm_add_hsrp.current.0.hsrpIfPol.attributes.ctrl == "bia"
+ - nm_add_hsrp.current.0.hsrpIfPol.attributes.delay == "2"
+ - nm_add_hsrp.current.0.hsrpIfPol.attributes.reloadDelay == "2"
+ - nm_add_hsrp.current.0.hsrpIfPol.attributes.name == "hsrp1"
+ - nm_add_hsrp.current.0.hsrpIfPol.attributes.dn == "uni/tn-ansible_test/hsrpIfPol-hsrp1"
+
+ - name: Add the HSRP interface policy again to check idempotency
+ cisco.aci.aci_interface_policy_hsrp: *hsrp_present
+ register: nm_add_hsrp_again
+
+ - name: Verify add_hsrp again
+ ansible.builtin.assert:
+ that:
+ - nm_add_hsrp_again is not changed
+
+ - name: Update hsrp interface policy
+ cisco.aci.aci_interface_policy_hsrp: &hsrp_update
+ <<: *hsrp_present
+ delay: 3
+ register: nm_hsrp_update
+
+ - name: Verify update hsrp
+ ansible.builtin.assert:
+ that:
+ - nm_hsrp_update is changed
+ - nm_hsrp_update.current.0.hsrpIfPol.attributes.delay == "3"
+ - nm_hsrp_update.current.0.hsrpIfPol.attributes.reloadDelay == "2"
+ - nm_hsrp_update.current.0.hsrpIfPol.attributes.name == "hsrp1"
+ - nm_hsrp_update.current.0.hsrpIfPol.attributes.dn == "uni/tn-ansible_test/hsrpIfPol-hsrp1"
+
+ - name: Update hsrp interface policy to check for errors in delay
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *hsrp_update
+ delay: 10001
+ register: nm_hsrp_error1
+ ignore_errors: true
+
+ - name: Update hsrp interface policy to check for errors in reload delay
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *hsrp_update
+ reload_delay: 10001
+ register: nm_hsrp_error2
+ ignore_errors: true
+
+ - name: Verify errors
+ ansible.builtin.assert:
+ that:
+ - nm_hsrp_error1.msg == "Parameter 'delay' is only valid in range between 1 and 10000."
+ - nm_hsrp_error2.msg == "Parameter 'reload_delay' is only valid in range between 1 and 10000."
+
+ - name: Add another HSRP interface policy in check mode
+ cisco.aci.aci_interface_policy_hsrp: &hsrp2
+ <<: *tenant_present
+ hsrp: hsrp2
+ controls: ["bfd"]
+ state: present
+ register: add_hsrp2
+
+ - name: Query hsrp interface policy 1
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *hsrp_update
+ state: query
+ register: query_hsrp
+
+ - name: Query all hsrp interface policies under the tenant
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *tenant_present
+ state: query
+ register: query_all_tenant
+
+ - name: Query all hsrp interface policies
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *tenant_present
+ state: query
+ register: query_all
+
+ - name: Verify query hsrp
+ ansible.builtin.assert:
+ that:
+ - query_hsrp is not changed
+ - query_all_tenant is not changed
+ - query_all is not changed
+ - query_hsrp.current.0.hsrpIfPol.attributes.delay == "3"
+ - query_hsrp.current.0.hsrpIfPol.attributes.reloadDelay == "2"
+ - query_hsrp.current.0.hsrpIfPol.attributes.name == "hsrp1"
+ - query_hsrp.current.0.hsrpIfPol.attributes.dn == "uni/tn-ansible_test/hsrpIfPol-hsrp1"
+ - query_all_tenant.current.0.fvTenant.children | length == 2
+ - query_all.current.0.fvTenant.children | length >= 2
+
+ - name: Remove hsrp interface policy 1 in check mode
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *hsrp_update
+ state: absent
+ check_mode: true
+ register: cm_remove_hsrp
+
+ - name: Remove hsrp interface policy 1
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *hsrp_update
+ state: absent
+ register: remove_hsrp
+
+ - name: Remove hsrp interface policy 2
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *hsrp2
+ state: absent
+ register: remove_hsrp2
+
+ - name: Remove hsrp interface policy again
+ cisco.aci.aci_interface_policy_hsrp:
+ <<: *hsrp2
+ state: absent
+ register: remove_hsrp2_again
+
+ - name: Verify remove hsrp
+ ansible.builtin.assert:
+ that:
+ - cm_remove_hsrp is changed
+ - cm_remove_hsrp.proposed == {}
+ - remove_hsrp is changed
+ - remove_hsrp2 is changed
+ - remove_hsrp.current == []
+ - remove_hsrp2.current == []
+ - remove_hsrp2_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_l2/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_l2/tasks/main.yml
index f52b74fdb..ccfb3a641 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_l2/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_l2/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Ensure first l2 interface policy does not exist
- aci_interface_policy_l2: &aci_interface_policy_l2_absent
+ cisco.aci.aci_interface_policy_l2: &aci_interface_policy_l2_absent
<<: *aci_info
name: anstest_policy
description: test for l2 interface policy
@@ -37,36 +37,36 @@
state: absent
- name: Ensure second l2 interface policy does not exist
- aci_interface_policy_l2: &aci_interface_policy_l2_2_absent
+ cisco.aci.aci_interface_policy_l2: &aci_interface_policy_l2_2_absent
<<: *aci_info
name: anstest_policy_2
state: absent
- name: Create first l2 interface policy (check_mode)
- aci_interface_policy_l2: &aci_interface_policy_l2_present
+ cisco.aci.aci_interface_policy_l2: &aci_interface_policy_l2_present
<<: *aci_interface_policy_l2_absent
state: present
check_mode: true
register: cm_add_interface_policy_l2_1
- name: Create first l2 interface policy (normal_mode)
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_interface_policy_l2_present
register: nm_add_interface_policy_l2_1
- name: Create first l2 interface policy again - testing idempotency
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_interface_policy_l2_present
register: idempotency_add_interface_policy_l2_1
- name: Create second l2 interface policy
- aci_interface_policy_l2: &aci_interface_policy_l2_2_present
+ cisco.aci.aci_interface_policy_l2: &aci_interface_policy_l2_2_present
<<: *aci_interface_policy_l2_2_absent
state: present
register: nm_add_interface_policy_l2_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_interface_policy_l2_1 is changed
- cm_add_interface_policy_l2_1.previous == []
@@ -84,19 +84,19 @@
- nm_add_interface_policy_l2_2.current.0.l2IfPol.attributes.vepa == "disabled"
- name: Query all l2 interface policies
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_info
state: query
register: query_all_interface_policy_l2
- name: Query first l2 interface policy
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_interface_policy_l2_present
state: query
register: query_first_interface_policy_l2
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_interface_policy_l2 is not changed
- query_all_interface_policy_l2.current | length >= 2
@@ -108,32 +108,32 @@
- query_first_interface_policy_l2.current.0.l2IfPol.attributes.vepa == "enabled"
- name: Delete first l2 interface policy (check_mode)
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_interface_policy_l2_present
state: absent
check_mode: true
register: cm_delete_interface_policy_l2_1
- name: Delete first l2 interface policy (normal_mode)
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_interface_policy_l2_present
state: absent
register: nm_delete_interface_policy_l2_1
- name: Delete first l2 interface policy again - testing idempotency
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_interface_policy_l2_present
state: absent
register: idempotency_delete_interface_policy_l2_1
- name: Delete second l2 interface policy (normal_mode)
- aci_interface_policy_l2:
+ cisco.aci.aci_interface_policy_l2:
<<: *aci_interface_policy_l2_2_present
state: absent
register: nm_delete_interface_policy_l2_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_interface_policy_l2_1 is changed
- cm_delete_interface_policy_l2_1.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_breakout_port_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_breakout_port_group/tasks/main.yml
index b84f64b9a..25c8a1aec 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_breakout_port_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_breakout_port_group/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -21,7 +21,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -55,7 +55,7 @@
register: nm_create_brkout_port
- name: Verify cm_create_brkout_port and nm_create_brkout_port
- assert:
+ ansible.builtin.assert:
that:
- cm_create_brkout_port is changed
- cm_create_brkout_port.previous == []
@@ -81,7 +81,7 @@
register: nm_create_brkout_port_again
- name: Verify nm_create_brkout_port_again
- assert:
+ ansible.builtin.assert:
that:
- nm_create_brkout_port_again is not changed
@@ -93,7 +93,7 @@
register: nm_create_another_brkout_port
- name: Verify nm_create_another_brkout_port
- assert:
+ ansible.builtin.assert:
that:
- nm_create_another_brkout_port is changed
- nm_create_another_brkout_port.previous == []
@@ -110,7 +110,7 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
query_all.current | length >= 2
@@ -122,7 +122,7 @@
register: query_one
- name: Verify query_one
- assert:
+ ansible.builtin.assert:
that:
- query_one is not changed
- query_one.current.0.infraBrkoutPortGrp.attributes.name == "ansible_breakout_port"
@@ -137,7 +137,7 @@
register: change_ansible_breakout_port
- name: Verify change_ansible_breakout_port
- assert:
+ ansible.builtin.assert:
that:
- change_ansible_breakout_port is changed
- change_ansible_breakout_port.current.0.infraBrkoutPortGrp.attributes.brkoutMap == "none"
@@ -151,7 +151,7 @@
register: rm_breakout_port
- name: Verify rm_breakout_port
- assert:
+ ansible.builtin.assert:
that:
- rm_breakout_port is changed
- rm_breakout_port.current == []
@@ -164,6 +164,6 @@
register: query_removed_breakout_port
- name: Verify query_removed_breakout_port
- assert:
+ ansible.builtin.assert:
that:
- query_removed_breakout_port.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_fc_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_fc_policy_group/tasks/main.yml
index 5a758bb3d..ed646ec01 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_fc_policy_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_fc_policy_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -71,7 +71,7 @@
register: intf_policy_leaf_access_fc_port_polgrp_update
- name: Verify present assertions for FC Port Policy Group
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_access_fc_port_polgrp_check_mode_present is changed
- intf_policy_leaf_access_fc_port_polgrp_present is changed
@@ -116,7 +116,7 @@
register: intf_policy_leaf_access_fc_pc_polgrp_update
- name: Verify present assertions for FC PC Policy Group
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_access_fc_pc_polgrp_check_mode_present is changed
- intf_policy_leaf_access_fc_pc_polgrp_present is changed
@@ -149,7 +149,7 @@
register: query_leaf_access_fc_port_policy_group
- name: Verify query assertions for Leaf Access FC Port Policy Group
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_access_fc_port_policy_group is not changed
- query_leaf_access_fc_port_policy_group.current[0] | length >= 1
@@ -172,7 +172,7 @@
register: query_leaf_access_fc_pc_policy_group
- name: Verify query assertions for Leaf Access FC PC Policy Group
- assert:
+ ansible.builtin.assert:
that:
- query_leaf_access_fc_pc_policy_group is not changed
- query_leaf_access_fc_pc_policy_group.current[0] | length >= 1
@@ -196,7 +196,7 @@
register: intf_policy_leaf_access_fc_port_polgrp_absent_idempotent
- name: Verify absent assertions for FC Port Policy Group
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_access_fc_port_polgrp_check_mode_absent is changed
- intf_policy_leaf_access_fc_port_polgrp_check_mode_absent.previous != []
@@ -222,7 +222,7 @@
register: intf_policy_leaf_access_fc_pc_polgrp_absent_idempotent
- name: Verify absent assertions for FC PC policy group
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_access_fc_pc_polgrp_check_mode_absent is changed
- intf_policy_leaf_access_fc_pc_polgrp_check_mode_absent.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_policy_group/tasks/main.yml
index 3f6e25505..730710869 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_policy_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_policy_group/tasks/main.yml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -29,7 +29,7 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -86,7 +86,7 @@
# TODO: also test for errors
- name: present assertions for interface policy leaf policy group (PC)
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_check_mode_present is changed
- intf_policy_leaf_polgrp_present is changed
@@ -110,7 +110,7 @@
register: binding_query
- name: Query assertions for interface policy leaf policy group (PC)
- assert:
+ ansible.builtin.assert:
that:
- binding_query is not changed
- binding_query.current | length >= 1
@@ -142,7 +142,7 @@
register: intf_policy_leaf_polgrp_absent_missing_param
- name: absent assertions for interface policy leaf policy group (PC)
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_check_mode_absent is changed
- intf_policy_leaf_polgrp_check_mode_absent.previous != []
@@ -191,7 +191,7 @@
# TODO: also test for errors
- name: present assertions for interface policy leaf policy group (VPC)
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_check_mode_present is changed
- intf_policy_leaf_polgrp_present is changed
@@ -215,7 +215,7 @@
register: binding_query
- name: Query assertions for interface policy leaf policy group (VPC)
- assert:
+ ansible.builtin.assert:
that:
- binding_query is not changed
- binding_query.current | length >= 1
@@ -235,7 +235,7 @@
register: binding_query_node_all
- name: Query assertions for interface policy leaf policy group (VPC)
- assert:
+ ansible.builtin.assert:
that:
- binding_query_node_all is not changed
- binding_query_node_all.current | length >= 1
@@ -267,7 +267,7 @@
register: intf_policy_leaf_polgrp_absent_missing_param
- name: absent assertions for interface policy leaf policy group (VPC)
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_check_mode_absent is changed
- intf_policy_leaf_polgrp_check_mode_absent.previous != []
@@ -286,7 +286,7 @@
register: intf_policy_leaf_polgrp_pa_policy_error
- name: VPC error assertions (adding invalid parameters)
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_pa_policy_error.msg == 'port_authentication is not a valid parameter for link/node (Port Channel, Virtual Port Channel), if used assign null to it (port_authentication{{":"}} null).'
@@ -343,7 +343,7 @@
# TODO: also test for errors
- name: present assertions for interface policy leaf policy group (Leaf Access Port)
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_check_mode_present is changed
- intf_policy_leaf_polgrp_present is changed
@@ -368,12 +368,12 @@
register: binding_query
- name: Query assertions interface policy leaf policy group (Leaf Access Port)
- assert:
+ ansible.builtin.assert:
that:
- binding_query is not changed
- binding_query.current | length >= 1
- '"/api/mo/uni/infra/funcprof/accportgrp-policygroupname_leaf.json" in binding_query.url'
- - binding_query.current.0.infraAccPortGrp.children.14.infraRsAttEntP.attributes.tDn == "uni/infra/attentp-test_aep"
+ - binding_query.current.0.infraAccPortGrp.children.10.infraRsAttEntP.attributes.tDn == "uni/infra/attentp-test_aep"
- name: Remove interface policy leaf policy group (Leaf Access Port) - check mode
cisco.aci.aci_interface_policy_leaf_policy_group:
@@ -400,7 +400,7 @@
register: intf_policy_leaf_polgrp_absent_missing_param
- name: absent assertions for interface policy leaf policy group (Leaf Access Port)
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_check_mode_absent is changed
- intf_policy_leaf_polgrp_check_mode_absent.previous != []
@@ -430,7 +430,7 @@
register: intf_policy_leaf_policy_group_link_present_2
- name: present assertions (PC) for APIC version > 5
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_policy_group_link_present_2 is changed
- intf_policy_leaf_policy_group_link_present_2.previous != []
@@ -446,7 +446,7 @@
register: intf_policy_leaf_polgrp_present_2
- name: present assertions (Leaf Access Port) for APIC version > 5
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_present_2 is changed
- intf_policy_leaf_polgrp_present_2.previous == []
@@ -474,7 +474,7 @@
register: intf_policy_leaf_policy_group_node_present_2
- name: present assertions (VPC) for APIC version > 6
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_policy_group_node_present_2 is changed
- intf_policy_leaf_policy_group_node_present_2.previous == []
@@ -497,7 +497,7 @@
register: intf_policy_leaf_polgrp_present_3
- name: present assertions (Leaf Access Port) for APIC version >= 6.0.2
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_present_3 is changed
- intf_policy_leaf_polgrp_present_3.previous != []
@@ -530,7 +530,7 @@
register: intf_policy_leaf_polgrp_all_policy_present
- name: present assertions (Leaf Access Port) for all the policies.
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_leaf_polgrp_all_policy_present is changed
- intf_policy_leaf_polgrp_all_policy_present.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile/tasks/main.yml
index 51d553c54..08bbd31b6 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -70,7 +70,7 @@
register: nm_add_leaf_interface_profile_fex
- name: Verify add_leaf_interface_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_add_leaf_interface_profile is changed
- nm_add_leaf_interface_profile is changed
@@ -115,7 +115,7 @@
register: nm_add_leaf_interface_profile_descr_fex
- name: Verify add_leaf_interface_profile_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_leaf_interface_profile_descr is changed
- nm_add_leaf_interface_profile_descr is changed
@@ -141,7 +141,7 @@
register: nm_add_leaf_interface_profile_again_no_descr_fex
- name: Verify add_leaf_interface_profile_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_leaf_interface_profile_again_no_descr is not changed
- nm_add_leaf_interface_profile_again_no_descr is not changed
@@ -171,7 +171,7 @@
type: fex
- name: Verify query_all_leaf_interface_profiles
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_leaf_interface_profiles is not changed
- nm_query_all_leaf_interface_profiles is not changed
@@ -200,7 +200,7 @@
register: nm_query_leaf_interface_profile_fex
- name: Verify query_leaf_interface_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_query_leaf_interface_profile is not changed
- nm_query_leaf_interface_profile is not changed
@@ -234,7 +234,7 @@
register: nm_remove_leaf_interface_profile_again_fex
- name: Verify remove_leaf_interface_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_leaf_interface_profile is changed
- nm_remove_leaf_interface_profile is changed
@@ -265,7 +265,7 @@
# TODO: Implement more tests
- name: Verify query_non_leaf_interface_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_leaf_interface_profile is not changed
- nm_query_non_leaf_interface_profile is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile_fex_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile_fex_policy_group/tasks/main.yml
index 41853af11..2fc177909 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile_fex_policy_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_leaf_profile_fex_policy_group/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: "Please define the following variables: aci_hostname, aci_username and aci_password."
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,7 +21,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -50,7 +50,7 @@
register: cm_fex_policy_group_present
- name: Assertions check for add Fex Policy Group to anstest_fex_profile - Interface Policy Fex profile with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_fex_policy_group_present is changed
- cm_fex_policy_group_present.current | length == 0
@@ -65,7 +65,7 @@
register: nm_fex_policy_group_present
- name: Assertions check for add Fex Policy Group to anstest_fex_profile - Interface Policy Fex profile with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_fex_policy_group_present is changed
- nm_fex_policy_group_present.current | length == 1
@@ -80,7 +80,7 @@
register: idempotency_fex_policy_group_present
- name: Idempotency assertions check for add Fex Policy Group to anstest_fex_profile - Interface Policy Fex profile with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_fex_policy_group_present is not changed
- idempotency_fex_policy_group_present.current | length == 1
@@ -104,7 +104,7 @@
register: multiple_fex_policy_group_present
- name: Assertions check for add multiple Fex Policy Group to anstest_fex_profile - Interface Policy Fex profile with normal mode
- assert:
+ ansible.builtin.assert:
that:
- multiple_fex_policy_group_present is changed
- multiple_fex_policy_group_present.results.0 is changed
@@ -125,7 +125,7 @@
register: temp_anstest_fex_profile_absent
- name: Assertions check for remove temp_anstest_fex_profile - Interface Policy Fex profile
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_profile_absent.current | length == 0
@@ -136,7 +136,7 @@
register: temp_anstest_fex_profile_present
- name: Assertions check for add temp_anstest_fex_profile - Interface Policy Fex profile
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_profile_present is changed
- temp_anstest_fex_profile_present.current | length == 1
@@ -151,7 +151,7 @@
register: temp_anstest_fex_policy_group_present
- name: Assertions check for add Fex Policy Group to temp_anstest_fex_profile - Interface Policy Fex profile
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_policy_group_present is changed
- temp_anstest_fex_policy_group_present.current | length == 1
@@ -168,7 +168,7 @@
register: query_res_fex_policy_group_with_profile
- name: Assertions check for query anstest_fex_policy_group - fex policy group with fex_profile
- assert:
+ ansible.builtin.assert:
that:
- query_res_fex_policy_group_with_profile is not changed
- query_res_fex_policy_group_with_profile.current | length == 1
@@ -183,7 +183,7 @@
register: query_all_policy_groups_under_fex_profile
- name: Assertions check for query all fex policy group under anstest_fex_profile
- assert:
+ ansible.builtin.assert:
that:
- query_all_policy_groups_under_fex_profile is not changed
- query_all_policy_groups_under_fex_profile.current.0.infraFexP.children | length == 3
@@ -196,7 +196,7 @@
register: query_res_anstest_fex_policy_group
- name: Assertions check for query all anstest_fex_policy_group - fex policy groups
- assert:
+ ansible.builtin.assert:
that:
- query_res_anstest_fex_policy_group is not changed
- query_res_anstest_fex_policy_group.current | length >= 2
@@ -210,7 +210,7 @@
register: all_fex_policy_groups
- name: Assertions check for query all - fex policy groups
- assert:
+ ansible.builtin.assert:
that:
- all_fex_policy_groups is not changed
- all_fex_policy_groups.current | length >= 4
@@ -226,7 +226,7 @@
register: cm_anstest_fex_policy_group_absent
- name: Assertions check for remove anstest_fex_policy_group - Fex Policy Group from anstest_fex_profile with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_anstest_fex_policy_group_absent is changed
- cm_anstest_fex_policy_group_absent.current | length == 1
@@ -243,7 +243,7 @@
register: nm_anstest_fex_policy_group_absent
- name: Assertions check for remove anstest_fex_policy_group - Fex Policy Group from anstest_fex_profile with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_anstest_fex_policy_group_absent is changed
- nm_anstest_fex_policy_group_absent.current | length == 0
@@ -258,7 +258,7 @@
register: idempotency_anstest_fex_policy_group_absent
- name: Idempotency assertions check for remove anstest_fex_policy_group - Fex Policy Group from anstest_fex_profile with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_anstest_fex_policy_group_absent is not changed
- idempotency_anstest_fex_policy_group_absent.current | length == 0
@@ -271,7 +271,7 @@
register: temp_anstest_fex_profile_absent
- name: Assertions check for remove temp_anstest_fex_profile Fex Profile
- assert:
+ ansible.builtin.assert:
that:
- temp_anstest_fex_profile_absent is changed
- temp_anstest_fex_profile_absent.current | length == 0
@@ -286,7 +286,7 @@
register: fex_profile_present_absent
- name: Assertions check for remove anstest_fex_profile Fex Profile
- assert:
+ ansible.builtin.assert:
that:
- fex_profile_present_absent is changed
- fex_profile_present_absent.current | length == 0
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_link_level/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_link_level/tasks/main.yml
index a3ee0c4b8..c5a6843e5 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_link_level/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_link_level/tasks/main.yml
@@ -5,19 +5,32 @@
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
+ # SET ACI_INFO VARS FOR SYSTEM LOGIN WITHIN TASKS
+ - name: Set vars for system login
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ port: "{{ aci_port | default(omit) }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
# CLEAN ENVIRONMENT
- name: Remove Link Level Policy
- aci_interface_policy_link_level: &interface_policy_link_level_absent
+ cisco.aci.aci_interface_policy_link_level: &interface_policy_link_level_absent
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
password: '{{ aci_password }}'
@@ -30,7 +43,7 @@
# ADD LINK LEVEL POLICY
- name: Add Link Level Policy (check mode)
- aci_interface_policy_link_level: &interface_policy_link_level_present
+ cisco.aci.aci_interface_policy_link_level: &interface_policy_link_level_present
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
password: '{{ aci_password }}'
@@ -44,11 +57,11 @@
register: cm_add_policy
- name: Add Link Level Policy (normal mode)
- aci_interface_policy_link_level: *interface_policy_link_level_present
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_present
register: nm_add_policy
- name: Verify Add Link Level Policy
- assert:
+ ansible.builtin.assert:
that:
- cm_add_policy is changed
- nm_add_policy is changed
@@ -59,16 +72,16 @@
- nm_add_policy.proposed.fabricHIfPol.attributes.name == cm_add_policy.proposed.fabricHIfPol.attributes.name == nm_add_policy.sent.fabricHIfPol.attributes.name == 'ansible_test'
- name: Add Link Level Policy again (check mode)
- aci_interface_policy_link_level: *interface_policy_link_level_present
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_present
check_mode: true
register: cm_add_policy_again
- name: Add Link Level Policy again (normal mode)
- aci_interface_policy_link_level: *interface_policy_link_level_present
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_present
register: nm_add_policy_again
- name: Verify Add Link Level Policy again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_policy_again is not changed
- nm_add_policy_again is not changed
@@ -78,20 +91,20 @@
# CHANGE LINK LEVEL POLICY
- name: Change description of Link Level Policy (check mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_present
description: Ansible test Link Level Policy
check_mode: true
register: cm_add_policy_descr
- name: Change description of Link Level Policy (normal mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_present
description: Ansible test Link Level Policy
register: nm_add_policy_descr
- name: Verify add_policy_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_policy_descr is changed
- nm_add_policy_descr is changed
@@ -99,20 +112,20 @@
- nm_add_policy_descr.current.0.fabricHIfPol.attributes.dn == 'uni/infra/hintfpol-ansible_test'
- name: Change description of Link Level Policy again (check mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_present
description: Ansible test Link Level Policy
check_mode: true
register: cm_add_policy_descr_again
- name: Change description of Link Level Policy again (normal mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_present
description: Ansible test Link Level Policy
register: nm_add_policy_descr_again
- name: Verify add_policy_descr_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_policy_descr_again is not changed
- nm_add_policy_descr_again is not changed
@@ -122,26 +135,88 @@
# ADD LINK LEVEL POLICY AGAIN WITH NO DESCRIPTION
- name: Add Link Level Policy again with no description (check mode)
- aci_interface_policy_link_level: *interface_policy_link_level_present
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_present
check_mode: true
register: cm_add_policy_again_no_descr
- name: Add Link Level Policy again with no description (normal mode)
- aci_interface_policy_link_level: *interface_policy_link_level_present
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_present
register: nm_add_policy_again_no_descr
- name: Verify add_policy_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_policy_again_no_descr is not changed
- nm_add_policy_again_no_descr is not changed
- cm_add_policy_again_no_descr.proposed.fabricHIfPol.attributes.name == nm_add_policy_again_no_descr.proposed.fabricHIfPol.attributes.name == 'ansible_test'
- cm_add_policy_again_no_descr.sent == nm_add_policy_again_no_descr.sent == {}
- cm_add_policy_again_no_descr.previous.0.fabricHIfPol.attributes.dn== nm_add_policy_again_no_descr.previous.0.fabricHIfPol.attributes.dn == cm_add_policy_again_no_descr.current.0.fabricHIfPol.attributes.dn == nm_add_policy_again_no_descr.current.0.fabricHIfPol.attributes.dn == 'uni/infra/hintfpol-ansible_test'
+
+ # CHANGE SPEED ON LINK LEVEL POLICY
+ - name: Test each speed setting for Link Level Policy
+ block:
+ - name: Query system information to fetch version
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+ - name: Define speed settings in version < 5.2
+ set_fact:
+ supported_speed: ["100M", "1G", "10G", "25G", "40G", "50G", "100G", "200G", "400G", "inherit"]
+ when: version.current.0.topSystem.attributes.version is version('5.2', '<')
+
+ - name: Define speed settings in version >= 5.2
+ set_fact:
+ supported_speed: ["100M", "1G", "10G", "25G", "40G", "50G", "100G", "200G", "400G", "auto", "inherit"]
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=')
+
+ - name: Add Link Level Policy with various speeds (check mode)
+ cisco.aci.aci_interface_policy_link_level:
+ <<: *interface_policy_link_level_present
+ speed: "{{ item }}"
+ check_mode: true
+ loop: "{{ supported_speed }}"
+ register: cm_add_policy_speed
+ loop_control:
+ label: "speed-{{ item }}"
+
+ - name: Add Link Level Policy with various speeds (normal mode)
+ cisco.aci.aci_interface_policy_link_level:
+ <<: *interface_policy_link_level_present
+ speed: "{{ item }}"
+ loop: "{{ supported_speed }}"
+ register: nm_add_policy_speed
+ loop_control:
+ label: "speed-{{ item }}"
+
+ - name: Verify each speed setting (normal mode)
+ ansible.builtin.assert:
+ that:
+ - "item.1.current.0.fabricHIfPol.attributes.name == 'ansible_test'"
+ - "item.1.current.0.fabricHIfPol.attributes.dn == 'uni/infra/hintfpol-ansible_test'"
+ - "item.1.current.0.fabricHIfPol.attributes.speed == item.0"
+ quiet: true
+ loop: "{{ supported_speed | zip(nm_add_policy_speed.results) }}"
+ loop_control:
+ label: "speed-{{ item.0 }}"
+
+ - name: Verify each speed setting (check mode)
+ ansible.builtin.assert:
+ that:
+ - "item.1.current.0.fabricHIfPol.attributes.name == 'ansible_test'"
+ - "item.1.current.0.fabricHIfPol.attributes.dn == 'uni/infra/hintfpol-ansible_test'"
+ - "item.1.current.0.fabricHIfPol.attributes.speed == 'inherit'"
+ - "item.1.proposed.fabricHIfPol.attributes.speed == item.0"
+ quiet: true
+ loop: "{{ supported_speed | zip(cm_add_policy_speed.results) }}"
+ loop_control:
+ label: "speed-{{ item.0 }}"
# QUERY ALL LINK LEVEL POLICIES
- name: Query all Link Level Policies (check mode)
- aci_interface_policy_link_level: &interface_policy_link_level_query
+ cisco.aci.aci_interface_policy_link_level: &interface_policy_link_level_query
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
password: '{{ aci_password }}'
@@ -154,11 +229,11 @@
register: cm_query_all_policies
- name: Query all Link Level Policies (normal mode)
- aci_interface_policy_link_level: *interface_policy_link_level_query
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_query
register: nm_query_all_policies
- name: Verify query_all_policies
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_policies is not changed
- nm_query_all_policies is not changed
@@ -167,20 +242,20 @@
# QUERY A LINK LEVEL POLICY
- name: Query our Link Level Policy (check mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_query
link_level_policy: ansible_test
check_mode: true
register: cm_query_policy
- name: Query our Link Level Policy (normal mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_query
link_level_policy: ansible_test
register: nm_query_policy
- name: Verify query_policy
- assert:
+ ansible.builtin.assert:
that:
- cm_query_policy is not changed
- nm_query_policy is not changed
@@ -191,16 +266,16 @@
# REMOVE LINK LEVEL POLICY
- name: Remove Link Level Policy (check mode)
- aci_interface_policy_link_level: *interface_policy_link_level_absent
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_absent
check_mode: true
register: cm_remove_policy
- name: Remove Link Level Policy (normal mode)
- aci_interface_policy_link_level: *interface_policy_link_level_absent
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_absent
register: nm_remove_policy
- name: Verify remove_policy
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_policy is changed
- nm_remove_policy is changed
@@ -210,16 +285,16 @@
- nm_remove_policy.current == []
- name: Remove Link Level Policy again (check mode)
- aci_interface_policy_link_level: *interface_policy_link_level_absent
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_absent
check_mode: true
register: cm_remove_policy_again
- name: Remove Link Level Policy again (normal mode)
- aci_interface_policy_link_level: *interface_policy_link_level_absent
+ cisco.aci.aci_interface_policy_link_level: *interface_policy_link_level_absent
register: nm_remove_policy_again
- name: Verify remove_policy_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_policy_again is not changed
- nm_remove_policy_again is not changed
@@ -229,20 +304,20 @@
# QUERY NON-EXISTING LINK LEVEL POLICY
- name: Query non-existing Link Level Policy (check mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_query
link_level_policy: ansible_test
check_mode: true
register: cm_query_non_policy
- name: Query non-existing Link Level Policy (normal mode)
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
<<: *interface_policy_link_level_query
link_level_policy: ansible_test
register: nm_query_non_policy
- name: Verify query_non_policy
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_policy is not changed
- nm_query_non_policy is not changed
@@ -251,7 +326,7 @@
# PROVOKE ERRORS - REQUIRED PARAMETER MISSING
- name: Error when required parameter is missing
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
password: '{{ aci_password }}'
@@ -264,14 +339,14 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "state is present but all of the following are missing: link_level_policy"'
# PROVOKE ERRORS - DEBOUNCE OUT OF RANGE
- name: Error when link debounce interval is out of range
- aci_interface_policy_link_level:
+ cisco.aci.aci_interface_policy_link_level:
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
password: '{{ aci_password }}'
@@ -286,7 +361,7 @@
register: error_on_debounce_out_of_range
- name: Verify error_on_debounce_out_of_range
- assert:
+ ansible.builtin.assert:
that:
- error_on_debounce_out_of_range is failed
- 'error_on_debounce_out_of_range.msg == "The \"link_debounce_interval\" must be a value between 0 and 5000"' \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_lldp/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_lldp/tasks/main.yml
index 225e142ba..f06adae80 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_lldp/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_lldp/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Ensure first lldp interface policy does not exist
- aci_interface_policy_lldp: &aci_interface_policy_lldp_absent
+ cisco.aci.aci_interface_policy_lldp: &aci_interface_policy_lldp_absent
<<: *aci_info
name: anstest_policy
description: test for lldp interface policy
@@ -36,36 +36,36 @@
state: absent
- name: Ensure second lldp interface policy does not exist
- aci_interface_policy_lldp: &aci_interface_policy_lldp_2_absent
+ cisco.aci.aci_interface_policy_lldp: &aci_interface_policy_lldp_2_absent
<<: *aci_info
name: anstest_policy_2
state: absent
- name: Create first lldp interface policy (check_mode)
- aci_interface_policy_lldp: &aci_interface_policy_lldp_present
+ cisco.aci.aci_interface_policy_lldp: &aci_interface_policy_lldp_present
<<: *aci_interface_policy_lldp_absent
state: present
check_mode: true
register: cm_add_interface_policy_lldp_1
- name: Create first lldp interface policy (normal_mode)
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_interface_policy_lldp_present
register: nm_add_interface_policy_lldp_1
- name: Create first lldp interface policy again - testing idempotency
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_interface_policy_lldp_present
register: idempotency_add_interface_policy_lldp_1
- name: Create second lldp interface policy
- aci_interface_policy_lldp: &aci_interface_policy_lldp_2_present
+ cisco.aci.aci_interface_policy_lldp: &aci_interface_policy_lldp_2_present
<<: *aci_interface_policy_lldp_2_absent
state: present
register: nm_add_interface_policy_lldp_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_interface_policy_lldp_1 is changed
- cm_add_interface_policy_lldp_1.previous == []
@@ -81,19 +81,19 @@
- nm_add_interface_policy_lldp_2.current.0.lldpIfPol.attributes.adminTxSt == "enabled"
- name: Query all lldp interface policies
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_info
state: query
register: query_all_interface_policy_lldp
- name: Query first lldp interface policy
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_interface_policy_lldp_present
state: query
register: query_first_interface_policy_lldp
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_interface_policy_lldp is not changed
- query_all_interface_policy_lldp.current | length >= 2
@@ -104,32 +104,32 @@
- query_first_interface_policy_lldp.current.0.lldpIfPol.attributes.adminTxSt == "disabled"
- name: Delete first lldp interface policy (check_mode)
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_interface_policy_lldp_present
state: absent
check_mode: true
register: cm_delete_interface_policy_lldp_1
- name: Delete first lldp interface policy (normal_mode)
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_interface_policy_lldp_present
state: absent
register: nm_delete_interface_policy_lldp_1
- name: Delete first lldp interface policy again - testing idempotency
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_interface_policy_lldp_present
state: absent
register: idempotency_delete_interface_policy_lldp_1
- name: Delete second lldp interface policy (normal_mode)
- aci_interface_policy_lldp:
+ cisco.aci.aci_interface_policy_lldp:
<<: *aci_interface_policy_lldp_2_present
state: absent
register: nm_delete_interface_policy_lldp_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_interface_policy_lldp_1 is changed
- cm_delete_interface_policy_lldp_1.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_mcp/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_mcp/tasks/main.yml
index 7255c14ad..63ceb0f45 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_mcp/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_mcp/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Ensure first mcp interface policy does not exist - APIC version >= 5.0
- aci_interface_policy_mcp: &aci_interface_policy_mcp_absent_5
+ cisco.aci.aci_interface_policy_mcp: &aci_interface_policy_mcp_absent_5
<<: *aci_info
name: anstest_policy
description: test for mcp interface policy
@@ -42,7 +42,7 @@
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Ensure first mcp interface policy does not exist
- aci_interface_policy_mcp: &aci_interface_policy_mcp_absent
+ cisco.aci.aci_interface_policy_mcp: &aci_interface_policy_mcp_absent
<<: *aci_info
name: anstest_policy
description: test for mcp interface policy
@@ -51,13 +51,13 @@
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Ensure second mcp interface policy does not exist
- aci_interface_policy_mcp: &aci_interface_policy_mcp_2_absent
+ cisco.aci.aci_interface_policy_mcp: &aci_interface_policy_mcp_2_absent
<<: *aci_info
name: anstest_policy_2
state: absent
- name: Create first mcp interface policy (check_mode) - APIC version >= 5.0
- aci_interface_policy_mcp: &aci_interface_policy_mcp_present_5
+ cisco.aci.aci_interface_policy_mcp: &aci_interface_policy_mcp_present_5
<<: *aci_interface_policy_mcp_absent_5
state: present
check_mode: true
@@ -65,19 +65,19 @@
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Create first mcp interface policy (normal_mode) - APIC version >= 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present_5
register: nm_add_interface_policy_mcp_1_5
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Create first mcp interface policy again - testing idempotency - APIC version >= 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present_5
register: idempotency_add_interface_policy_mcp_1_5
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Create first mcp interface policy (check_mode) - APIC version < 5.0
- aci_interface_policy_mcp: &aci_interface_policy_mcp_present
+ cisco.aci.aci_interface_policy_mcp: &aci_interface_policy_mcp_present
<<: *aci_interface_policy_mcp_absent
state: present
check_mode: true
@@ -85,25 +85,25 @@
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Create first mcp interface policy (normal_mode) - APIC version < 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present
register: nm_add_interface_policy_mcp_1
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Create first mcp interface policy again - testing idempotency - APIC version < 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present
register: idempotency_add_interface_policy_mcp_1
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Create second mcp interface policy
- aci_interface_policy_mcp: &aci_interface_policy_mcp_2_present
+ cisco.aci.aci_interface_policy_mcp: &aci_interface_policy_mcp_2_present
<<: *aci_interface_policy_mcp_2_absent
state: present
register: nm_add_interface_policy_mcp_2
- name: Asserts for creation tasks for first mcp interface policy - APIC version >= 5.0
- assert:
+ ansible.builtin.assert:
that:
- cm_add_interface_policy_mcp_1_5 is changed
- cm_add_interface_policy_mcp_1_5.previous == []
@@ -115,7 +115,7 @@
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Asserts for creation tasks for first mcp interface policy - APIC version < 5.0
- assert:
+ ansible.builtin.assert:
that:
- cm_add_interface_policy_mcp_1 is changed
- cm_add_interface_policy_mcp_1.previous == []
@@ -127,55 +127,55 @@
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Asserts for creation tasks for second mcp interface policy
- assert:
+ ansible.builtin.assert:
that:
- nm_add_interface_policy_mcp_2 is changed
- nm_add_interface_policy_mcp_2.current.0.mcpIfPol.attributes.name == "anstest_policy_2"
- nm_add_interface_policy_mcp_2.current.0.mcpIfPol.attributes.adminSt == "enabled"
- name: Query all mcp interface policies
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_info
state: query
register: query_all_interface_policy_mcp
- name: Query first mcp interface policy
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present_5
state: query
register: query_first_interface_policy_mcp_5
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Query first mcp interface policy
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present
state: query
register: query_first_interface_policy_mcp
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_interface_policy_mcp is not changed
- query_all_interface_policy_mcp.current | length >= 2
- '"class/mcpIfPol.json" in query_all_interface_policy_mcp.url'
- name: Asserts for individual query tasks - APIC version >= 5.0
- assert:
+ ansible.builtin.assert:
that:
- query_first_interface_policy_mcp_5.current.0.mcpIfPol.attributes.name == "anstest_policy"
- query_first_interface_policy_mcp_5.current.0.mcpIfPol.attributes.adminSt == "disabled"
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Asserts for individual query tasks - APIC version < 5.0
- assert:
+ ansible.builtin.assert:
that:
- query_first_interface_policy_mcp.current.0.mcpIfPol.attributes.name == "anstest_policy"
- query_first_interface_policy_mcp.current.0.mcpIfPol.attributes.adminSt == "disabled"
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Delete first mcp interface policy (check_mode) - APIC version >= 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present_5
state: absent
check_mode: true
@@ -183,21 +183,21 @@
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Delete first mcp interface policy (normal_mode) - APIC version >= 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present_5
state: absent
register: nm_delete_interface_policy_mcp_1_5
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Delete first mcp interface policy again - testing idempotency - APIC version >= 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present_5
state: absent
register: idempotency_delete_interface_policy_mcp_1_5
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Delete first mcp interface policy (check_mode) - APIC version < 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present
state: absent
check_mode: true
@@ -205,27 +205,27 @@
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Delete first mcp interface policy (normal_mode) - APIC version < 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present
state: absent
register: nm_delete_interface_policy_mcp_1
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Delete first mcp interface policy again - testing idempotency - APIC version < 5.0
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_present
state: absent
register: idempotency_delete_interface_policy_mcp_1
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Delete second mcp interface policy (normal_mode)
- aci_interface_policy_mcp:
+ cisco.aci.aci_interface_policy_mcp:
<<: *aci_interface_policy_mcp_2_present
state: absent
register: nm_delete_interface_policy_mcp_2
- name: Asserts for first mcp interface policy deletion tasks - APIC version >= 5.0
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_interface_policy_mcp_1_5 is changed
- cm_delete_interface_policy_mcp_1_5.proposed == {}
@@ -237,7 +237,7 @@
when: version.current.0.topSystem.attributes.version is version('5', '>=')
- name: Asserts for first mcp interface policy deletion tasks - APIC version < 5.0
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_interface_policy_mcp_1 is changed
- cm_delete_interface_policy_mcp_1.proposed == {}
@@ -249,7 +249,7 @@
when: version.current.0.topSystem.attributes.version is version('5', '<')
- name: Asserts for second mcp interface policy deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- nm_delete_interface_policy_mcp_2.previous != []
- nm_delete_interface_policy_mcp_2.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_ospf/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_ospf/tasks/main.yml
index 71e096435..5dce71fcb 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_ospf/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_ospf/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -53,7 +53,7 @@
register: nm_add_ospf_interface_policy_again
- name: Verify add_ospf_interface_policy
- assert:
+ ansible.builtin.assert:
that:
- cm_add_ospf_interface_policy is changed
- cm_add_ospf_interface_policy.current == []
@@ -134,7 +134,7 @@
register: nm_add_ospf_descr_again
- name: Verify add_ospf_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_ospf_descr is changed
- cm_add_ospf_descr.previous.0.ospfIfPol.attributes.annotation == "orchestrator:ansible"
@@ -256,7 +256,7 @@
register: err_change_ospf_transmit_delay
- name: Verify cost change and error input values
- assert:
+ ansible.builtin.assert:
that:
- err_change_ospf_cost is not changed
- err_change_ospf_cost.msg == "Parameter 'cost' is only valid in range between 1 and 450."
@@ -282,7 +282,7 @@
register: nm_add_ospf_again_no_descr
- name: Verify add_ospf_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_ospf_again_no_descr is not changed
- nm_add_ospf_again_no_descr is not changed
@@ -308,7 +308,7 @@
register: nm_query_all_ospfs
- name: Verify query_all_ospfs
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_ospfs is not changed
- nm_query_all_ospfs is not changed
@@ -333,7 +333,7 @@
register: nm_query_ospf
- name: Verify query_ospf
- assert:
+ ansible.builtin.assert:
that:
- cm_query_ospf is not changed
- nm_query_ospf is not changed
@@ -360,7 +360,7 @@
register: nm_remove_ospf_again
- name: Verify remove_ospf
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_ospf is changed
- nm_remove_ospf is changed
@@ -384,7 +384,7 @@
# TODO: Implement more tests
- name: Verify query_non_ospf
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_ospf is not changed
- nm_query_non_ospf is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/tasks/main.yml
new file mode 100644
index 000000000..df4914b7a
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_pim/tasks/main.yml
@@ -0,0 +1,275 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new PIM route map policy
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim_route_map_policy: ansible_pim_route_map_policy
+ description: PIM route map policy 1 for ansible_tenant tenant
+ state: present
+
+ # CREATION TASKS
+ - name: Add a pim interface policy (check_mode)
+ cisco.aci.aci_interface_policy_pim: &aci_interface_policy_pim_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim: ansible_pim_interface_1
+ description: pim interface policy 1 for ansible_tenant tenant
+ authentication_key: my_password
+ authentication_type: md5_hmac
+ control_state: [multicast_domain_boundary, strict_rfc_compliant, passive]
+ designated_router_delay: 6
+ designated_router_priority: 2
+ hello_interval: 60000
+ join_prune_interval: 120
+ inbound_join_prune_filter_policy: ansible_pim_route_map_policy
+ outbound_join_prune_filter_policy: ansible_pim_route_map_policy
+ neighbor_filter_policy: ansible_pim_route_map_policy
+ state: present
+ check_mode: true
+ register: cm_add_pim_interface
+
+ - name: Add a pim interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_interface_policy_pim_present
+ register: nm_add_pim_interface
+
+ - name: Add a second pim interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim: ansible_pim_interface_2
+ description: pim interface policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_pim_interface_2
+
+ - name: Add a third pim interface policy - designed router delay out of bounds
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim: ansible_pim_interface_3
+ designated_router_delay: 65536
+ state: present
+ ignore_errors: true
+ register: error_dr_relay_out_of_bounds
+
+ - name: Add a fourth pim interface policy - designed router priority out of bounds
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim: ansible_pim_interface_4
+ designated_router_priority: 4294967296
+ state: present
+ ignore_errors: true
+ register: error_dr_priority_out_of_bounds
+
+ - name: Add a fifth pim interface policy - hello interval out of bounds
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim: ansible_pim_interface_5
+ hello_interval: 18724287
+ state: present
+ ignore_errors: true
+ register: error_helloIntvl_out_of_bounds
+
+ - name: Add a sixth pim interface policy - join prune interval out of bounds
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim: ansible_pim_interface_6
+ join_prune_interval: 65521
+ state: present
+ ignore_errors: true
+ register: error_jpIntvl_out_of_bounds
+
+ - name: Asserts for pim interface policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_pim_interface is changed
+ - cm_add_pim_interface.previous == []
+ - cm_add_pim_interface.current == []
+ - nm_add_pim_interface is changed
+ - nm_add_pim_interface.current.0.pimIfPol.attributes.name == "ansible_pim_interface_1"
+ - nm_add_pim_interface.current.0.pimIfPol.attributes.authT == "ah-md5"
+ - nm_add_pim_interface.current.0.pimIfPol.attributes.ctrl == "border,passive,strict-rfc-compliant"
+ - nm_add_pim_interface.current.0.pimIfPol.attributes.drDelay == "6"
+ - nm_add_pim_interface.current.0.pimIfPol.attributes.drPrio == "2"
+ - nm_add_pim_interface.current.0.pimIfPol.attributes.helloItvl == "60000"
+ - nm_add_pim_interface.current.0.pimIfPol.attributes.jpInterval == "120"
+ - nm_add_pim_interface.sent.pimIfPol.attributes.authKey == "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER"
+ - nm_add_pim_interface_2 is changed
+ - nm_add_pim_interface_2.previous == []
+ - nm_add_pim_interface_2.current.0.pimIfPol.attributes.name == "ansible_pim_interface_2"
+ - nm_add_pim_interface_2.current.0.pimIfPol.attributes.authT == "none"
+ - nm_add_pim_interface_2.current.0.pimIfPol.attributes.ctrl == ""
+ - nm_add_pim_interface_2.current.0.pimIfPol.attributes.drDelay == "3"
+ - nm_add_pim_interface_2.current.0.pimIfPol.attributes.drPrio == "1"
+ - nm_add_pim_interface_2.current.0.pimIfPol.attributes.helloItvl == "30000"
+ - nm_add_pim_interface_2.current.0.pimIfPol.attributes.jpInterval == "60"
+ - error_dr_relay_out_of_bounds.msg == "Parameter 'designated_router_delay' is only valid in range between 1 and 65535."
+ - error_dr_priority_out_of_bounds.msg == "Parameter 'designated_router_priority' is only valid in range between 1 and 4294967295."
+ - error_helloIntvl_out_of_bounds.msg == "Parameter 'hello_interval' is only valid in range between 1 and 18724286."
+ - error_jpIntvl_out_of_bounds.msg == "Parameter 'join_prune_interval' is only valid in range between 60 and 65520."
+
+ # CREATION TASKS
+ - name: Query all pim interface policies
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_info
+ state: query
+ register: query_all_pim_interface
+
+ - name: Query ansible_pim_interface_1
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_interface_policy_pim_present
+ state: query
+ register: query_ansible_pim_interface_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_pim_interface is not changed
+ - query_all_pim_interface.current|length >= 2
+ - query_ansible_pim_interface_1 is not changed
+ - query_ansible_pim_interface_1.current.0.pimIfPol.attributes.name == "ansible_pim_interface_1"
+ - query_ansible_pim_interface_1.current.0.pimIfPol.attributes.authT == "ah-md5"
+ - query_ansible_pim_interface_1.current.0.pimIfPol.attributes.ctrl == "border,passive,strict-rfc-compliant"
+ - query_ansible_pim_interface_1.current.0.pimIfPol.attributes.drDelay == "6"
+ - query_ansible_pim_interface_1.current.0.pimIfPol.attributes.drPrio == "2"
+ - query_ansible_pim_interface_1.current.0.pimIfPol.attributes.helloItvl == "60000"
+ - query_ansible_pim_interface_1.current.0.pimIfPol.attributes.jpInterval == "120"
+
+ # UPDATE TASKS
+ - name: Update first pim interface policy (check_mode)
+ cisco.aci.aci_interface_policy_pim: &aci_interface_policy_pim_update
+ <<: *aci_interface_policy_pim_present
+ control_state: passive
+ designated_router_delay: 4
+ designated_router_priority: 1
+ hello_interval: 30000
+ join_prune_interval: 60
+ check_mode: true
+ register: cm_update_pim_interface
+
+ - name: Update first pim interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_pim:
+ <<: *aci_interface_policy_pim_update
+ register: nm_update_pim_interface
+
+ - name: Asserts for pim interface policy update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_pim_interface is changed
+ - cm_update_pim_interface.previous == cm_update_pim_interface.current
+ - nm_update_pim_interface is changed
+ - nm_update_pim_interface.current.0.pimIfPol.attributes.name == "ansible_pim_interface_1"
+ - nm_update_pim_interface.current.0.pimIfPol.attributes.authT == "ah-md5"
+ - nm_update_pim_interface.current.0.pimIfPol.attributes.ctrl == "passive"
+ - nm_update_pim_interface.current.0.pimIfPol.attributes.drDelay == "4"
+ - nm_update_pim_interface.current.0.pimIfPol.attributes.drPrio == "1"
+ - nm_update_pim_interface.current.0.pimIfPol.attributes.helloItvl == "30000"
+ - nm_update_pim_interface.current.0.pimIfPol.attributes.jpInterval == "60"
+ - nm_update_pim_interface.sent.pimIfPol.attributes.authKey == "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER"
+
+ # CHILDREN DELETION TASKS
+ - name: Remove inbound join prune filter from pim interface policy (check_mode)
+ cisco.aci.aci_interface_policy_pim: &pim_interface_inbound_jp_absent
+ <<: *aci_interface_policy_pim_update
+ inbound_join_prune_filter_policy: ""
+ check_mode: true
+ register: cm_remove_pim_interface_inbound_jp
+
+ - name: Remove inbound join prune filter from pim interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_pim:
+ <<: *pim_interface_inbound_jp_absent
+ register: nm_remove_pim_interface_inbound_jp
+
+ - name: Remove outbound join prune filter and neighbor filter from pim interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_pim:
+ <<: *pim_interface_inbound_jp_absent
+ outbound_join_prune_filter_policy: ""
+ neighbor_filter_policy: ""
+ register: cm_remove_pim_interface_all_child_classes
+
+ - name: Asserts child classes deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_pim_interface_inbound_jp is changed
+ - cm_remove_pim_interface_inbound_jp.current == cm_remove_pim_interface_inbound_jp.previous
+ - nm_remove_pim_interface_inbound_jp is changed
+ - nm_remove_pim_interface_inbound_jp.current.0.pimIfPol.children | length == 2
+ - cm_remove_pim_interface_all_child_classes is changed
+ - cm_remove_pim_interface_all_child_classes.current.0.pimIfPol.children is not defined
+
+ # DELETION TASKS
+ - name: Remove pim interface policy (check_mode)
+ cisco.aci.aci_interface_policy_pim: &pim_interface_absent
+ <<: *aci_interface_policy_pim_update
+ state: absent
+ check_mode: true
+ register: cm_remove_pim_interface
+
+ - name: Remove pim interface policy (normal_mode)
+ cisco.aci.aci_interface_policy_pim:
+ <<: *pim_interface_absent
+ register: nm_remove_pim_interface
+
+ - name: Remove pim interface policy - testing idempotency
+ cisco.aci.aci_interface_policy_pim:
+ <<: *pim_interface_absent
+ register: nm_remove_pim_interface_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_pim_interface is changed
+ - cm_remove_pim_interface.proposed == {}
+ - nm_remove_pim_interface is changed
+ - nm_remove_pim_interface.previous != []
+ - nm_remove_pim_interface.current == []
+ - nm_remove_pim_interface_idempotency is not changed
+ - nm_remove_pim_interface_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_channel/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_channel/tasks/main.yml
index 36c84b30f..cac1bb65a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_channel/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_channel/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Ensure first port channel interface policy does not exist
- aci_interface_policy_port_channel: &aci_interface_policy_port_channel_absent
+ cisco.aci.aci_interface_policy_port_channel: &aci_interface_policy_port_channel_absent
<<: *aci_info
name: anstest_policy
description: test for port channel interface policy
@@ -42,7 +42,7 @@
state: absent
- name: Ensure second port channel interface policy does not exist
- aci_interface_policy_port_channel: &aci_interface_policy_port_channel_2_absent
+ cisco.aci.aci_interface_policy_port_channel: &aci_interface_policy_port_channel_2_absent
<<: *aci_info
name: anstest_policy_2
fast_select: true
@@ -51,44 +51,44 @@
state: absent
- name: Create first port channel interface policy (check_mode)
- aci_interface_policy_port_channel: &aci_interface_policy_port_channel_present
+ cisco.aci.aci_interface_policy_port_channel: &aci_interface_policy_port_channel_present
<<: *aci_interface_policy_port_channel_absent
state: present
check_mode: true
register: cm_add_interface_policy_port_channel_1
- name: Create first port channel interface policy (normal_mode)
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
register: nm_add_interface_policy_port_channel_1
- name: Create first port channel interface policy again - testing idempotency
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
register: idempotency_add_interface_policy_port_channel_1
- name: Create second port channel interface policy
- aci_interface_policy_port_channel: &aci_interface_policy_port_channel_2_present
+ cisco.aci.aci_interface_policy_port_channel: &aci_interface_policy_port_channel_2_present
<<: *aci_interface_policy_port_channel_2_absent
state: present
register: nm_add_interface_policy_port_channel_2
- name: Modify first port channel interface policy with max links above 16 - testing failure message
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
max_links: 17
ignore_errors: true
register: nm_policy_port_channel_max_links_failure
- name: Modify first port channel interface policy with min links bellow 1 - testing failure message
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
min_links: 0
ignore_errors: true
register: nm_policy_port_channel_min_links_failure
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_interface_policy_port_channel_1 is changed
- cm_add_interface_policy_port_channel_1.previous == []
@@ -110,19 +110,19 @@
- nm_policy_port_channel_min_links_failure.msg == "The \"min_links\" must be a value between 1 and 16"
- name: Query all port channel interface policies
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_info
state: query
register: query_all_interface_policy_port_channel
- name: Query first port channel interface policy
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
state: query
register: query_first_interface_policy_port_channel
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_interface_policy_port_channel is not changed
- query_all_interface_policy_port_channel.current | length >= 2
@@ -135,32 +135,32 @@
- query_first_interface_policy_port_channel.current.0.lacpLagPol.attributes.mode == "active"
- name: Delete first port channel interface policy (check_mode)
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
state: absent
check_mode: true
register: cm_delete_interface_policy_port_channel_1
- name: Delete first port channel interface policy (normal_mode)
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
state: absent
register: nm_delete_interface_policy_port_channel_1
- name: Delete first port channel interface policy again - testing idempotency
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_present
state: absent
register: idempotency_delete_interface_policy_port_channel_1
- name: Delete second port channel interface policy (normal_mode)
- aci_interface_policy_port_channel:
+ cisco.aci.aci_interface_policy_port_channel:
<<: *aci_interface_policy_port_channel_2_present
state: absent
register: nm_delete_interface_policy_port_channel_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_interface_policy_port_channel_1 is changed
- cm_delete_interface_policy_port_channel_1.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_security/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_security/tasks/main.yml
index c040bfb1e..9f4e958c4 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_security/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_port_security/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# CLEAN ENVIRONMENT
- name: Remove policy port security
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: '{{ item }}'
state: absent
@@ -38,7 +38,7 @@
# ADD
- name: Add a port security interface policy - check mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security1
description: security 1
@@ -49,7 +49,7 @@
register: port_security1_cm
- name: Add a port security interface policy - normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security1
description: security 1
@@ -59,7 +59,7 @@
register: port_security1_nm
- name: Add a port security interface policy again - normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security1
description: security 1
@@ -69,7 +69,7 @@
register: port_security1_nm_again
- name: Add a port security interface policy - normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security2
description: security 2
@@ -80,7 +80,7 @@
register: port_security1_nm_error_timeout
- name: Add a port security interface policy - normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security3
description: security 3
@@ -91,7 +91,7 @@
register: port_security1_nm_error_max
- name: Add a port security interface policy again for security 3- normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security3
description: security 3
@@ -102,7 +102,7 @@
register: port_security1_nm_with_no_error
- name: Verify present cases
- assert:
+ ansible.builtin.assert:
that:
- port_security1_cm is changed
- port_security1_nm is changed
@@ -123,20 +123,20 @@
# QUERY
- name: Query a port security interface policy - normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security1
state: query
register: port_security1_query
- name: Query all port security interface policies - normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
state: query
register: port_all_query
- name: Verify query cases
- assert:
+ ansible.builtin.assert:
that:
- port_security1_query is not changed
- port_all_query is not changed
@@ -149,14 +149,14 @@
# REMOVE
- name: Remove a port security interface policy - normal mode
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: security1
state: absent
register: port_security1_remove
- name: Verify remove cases
- assert:
+ ansible.builtin.assert:
that:
- port_security1_remove is changed
- port_security1_remove.previous.0.l2PortSecurityPol.attributes.dn == "uni/infra/portsecurityP-security1"
@@ -167,7 +167,7 @@
# CLEAN END
- name: Remove all policy port securities
- aci_interface_policy_port_security:
+ cisco.aci.aci_interface_policy_port_security:
<<: *aci_info
port_security: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spanning_tree/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spanning_tree/tasks/main.yml
index 3bb33d896..aad106ae6 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spanning_tree/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spanning_tree/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: "{{ aci_output_level | default('info') }}"
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# CLEAN ENVIRONMENT
- name: Remove policy spanning tree
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: "{{ item }}"
state: absent
@@ -38,7 +38,7 @@
# ADD
- name: Add a spanning tree interface policy BPDU Guard - check mode
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_bpduguard
description: BPDU Guard
@@ -48,7 +48,7 @@
register: stp_bpduguard_cm
- name: Add a spanning tree interface policy BPDU Guard - normal mode
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_bpduguard
description: BPDU Guard
@@ -57,7 +57,7 @@
register: stp_bpduguard_nm
- name: Add a spanning tree interface policy BPDU Guard - normal mode again
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_bpduguard
description: BPDU Guard
@@ -66,7 +66,7 @@
register: stp_bpduguard_nm_again
- name: Add a spanning tree interface policy BPDU Filter - check mode
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_bpdufilter
description: BPDU Filter
@@ -76,7 +76,7 @@
register: stp_bpdufilter_cm
- name: Add a spanning tree interface policy BPDU Filter - normal mode
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_bpdufilter
description: BPDU Filter
@@ -85,7 +85,7 @@
register: stp_bpdufilter_nm
- name: Add a spanning tree interface policy BPDU Filter - normal mode again
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_bpdufilter
description: BPDU Filter
@@ -94,7 +94,7 @@
register: stp_bpdufilter_nm_again
- name: Add a spanning tree interface policy Both - normal mode
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_both
description: Both controls
@@ -104,7 +104,7 @@
register: stp_both_nm
- name: Add a spanning tree interface policy Both - normal mode again
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_both
description: Both controls
@@ -114,7 +114,7 @@
register: stp_both_nm_again
- name: verify add tasks
- assert:
+ ansible.builtin.assert:
that:
- stp_bpduguard_cm is changed
- stp_bpduguard_nm is changed
@@ -130,20 +130,20 @@
# QUERY
- name: Query a spanning tree interface policy
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: stp_both
state: query
register: stp_query_both
- name: Query all spanning tree interface policies
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
state: query
register: stp_query_all
- name: verify query tasks
- assert:
+ ansible.builtin.assert:
that:
- stp_query_both is not changed
- stp_query_all is not changed
@@ -152,7 +152,7 @@
# CLEAN ENVIRONMENT
- name: Remove policy port security
- aci_interface_policy_spanning_tree:
+ cisco.aci.aci_interface_policy_spanning_tree:
<<: *aci_info
stp_policy: "{{ item }}"
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spine_policy_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spine_policy_group/tasks/main.yml
index fec8415a3..534614450 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spine_policy_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_spine_policy_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -65,7 +65,7 @@
register: intf_policy_spine_polgrp_update
- name: Verify present assertions for Spine Policy Group
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_spine_polgrp_check_mode_present is changed
- intf_policy_spine_polgrp_present is changed
@@ -97,7 +97,7 @@
register: query_spine_policy_group
- name: Verify query assertions for Spine Policy Group
- assert:
+ ansible.builtin.assert:
that:
- query_spine_policy_group is not changed
- query_spine_policy_group.current[0] | length >= 1
@@ -120,7 +120,7 @@
register: intf_policy_spine_polgrp_absent_idempotent
- name: Verify absent assertions for Spine Policy Group
- assert:
+ ansible.builtin.assert:
that:
- intf_policy_spine_polgrp_check_mode_absent is changed
- intf_policy_spine_polgrp_check_mode_absent.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/tasks/main.yml
new file mode 100644
index 000000000..656a50213
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_policy_storm_control/tasks/main.yml
@@ -0,0 +1,285 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Eric Girard <@netgirard>
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Remove all ansible Storm Control policies before test begins
+ cisco.aci.aci_interface_policy_storm_control: &caci_storm_control_policies_cleanup
+ <<: *aci_info
+ storm_control_policy: '{{ item }}'
+ state: absent
+ loop:
+ - ansible_storm_control_policy_1
+ - ansible_storm_control_policy_2
+ - ansible_storm_control_policy_3
+ - ansible_storm_control_policy_4
+
+ # CREATE STORM CONTROL POLICY
+ - name: Add a Storm Control policy (check_mode)
+ cisco.aci.aci_interface_policy_storm_control: &aci_interface_policy_storm_control_present
+ <<: *aci_info
+ storm_control_policy: ansible_storm_control_policy_1
+ description: Storm Control policy 1
+ all_types_configuration:
+ rate: 100
+ burst_rate: 125
+ rate_type: pps
+ storm_control_action: shutdown
+ storm_control_soak_action: 5
+ check_mode: true
+ register: cm_add_storm_control_policy
+
+ - name: Add a Storm Control policy (normal_mode)
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_interface_policy_storm_control_present
+ register: nm_add_storm_control_policy
+
+ - name: Add the first Storm Control policy again - testing idempotency
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_interface_policy_storm_control_present
+ register: nm_add_storm_control_policy_idempotency
+
+ - name: Add a second Storm Control policy (normal_mode)
+ cisco.aci.aci_interface_policy_storm_control: &aci_interface_policy_storm_control_2_present
+ <<: *aci_info
+ storm_control_policy: ansible_storm_control_policy_2
+ description: Storm Control policy 2
+ broadcast_configuration:
+ rate: 100
+ burst_rate: 125
+ rate_type: pps
+ multicast_configuration:
+ rate: 75
+ burst_rate: 100
+ rate_type: pps
+ unicast_configuration:
+ rate: 50
+ burst_rate: 75
+ rate_type: pps
+ register: nm_add_storm_control_policy_2
+
+ - name: Add a third Storm Control Policy (normal_mode) - testing empty configuration for multicast and unicast
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_info
+ storm_control_policy: ansible_storm_control_policy_3
+ broadcast_configuration:
+ rate: 25
+ burst_rate: 50
+ rate_type: pps
+ register: nm_add_storm_control_policy_3
+
+ - name: Add a fourth Storm Control Policy with rate in percentage out of bonds - testing error message
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_info
+ storm_control_policy: ansible_storm_control_policy_4
+ all_types_configuration:
+ rate: 125
+ burst_rate: 100
+ rate_type: percentage
+ ignore_errors: true
+ register: nm_test_error_msg_storm_control_policy
+
+ - name: Asserts for Storm Control policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_storm_control_policy is changed
+ - cm_add_storm_control_policy.previous == []
+ - cm_add_storm_control_policy.current == []
+ - cm_add_storm_control_policy.proposed.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_1"
+ - cm_add_storm_control_policy.proposed.stormctrlIfPol.attributes.descr == "Storm Control policy 1"
+ - cm_add_storm_control_policy.proposed.stormctrlIfPol.attributes.ratePps == "100"
+ - cm_add_storm_control_policy.proposed.stormctrlIfPol.attributes.burstPps == "125"
+ - cm_add_storm_control_policy.proposed.stormctrlIfPol.attributes.isUcMcBcStormPktCfgValid == "Invalid"
+ - cm_add_storm_control_policy.proposed.stormctrlIfPol.attributes.stormCtrlAction == "shutdown"
+ - cm_add_storm_control_policy.proposed.stormctrlIfPol.attributes.stormCtrlSoakInstCount == "5"
+ - nm_add_storm_control_policy is changed
+ - nm_add_storm_control_policy.previous == []
+ - nm_add_storm_control_policy.current.0.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_1"
+ - nm_add_storm_control_policy.current.0.stormctrlIfPol.attributes.descr == "Storm Control policy 1"
+ - nm_add_storm_control_policy.current.0.stormctrlIfPol.attributes.ratePps == "100"
+ - nm_add_storm_control_policy.current.0.stormctrlIfPol.attributes.burstPps == "125"
+ - nm_add_storm_control_policy.current.0.stormctrlIfPol.attributes.isUcMcBcStormPktCfgValid == "Invalid"
+ - nm_add_storm_control_policy.current.0.stormctrlIfPol.attributes.stormCtrlAction == "shutdown"
+ - nm_add_storm_control_policy.current.0.stormctrlIfPol.attributes.stormCtrlSoakInstCount == "5"
+ - nm_add_storm_control_policy_idempotency is not changed
+ - nm_add_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_1"
+ - nm_add_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.descr == "Storm Control policy 1"
+ - nm_add_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.ratePps == "100"
+ - nm_add_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.burstPps == "125"
+ - nm_add_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.isUcMcBcStormPktCfgValid == "Invalid"
+ - nm_add_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.stormCtrlAction == "shutdown"
+ - nm_add_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.stormCtrlSoakInstCount == "5"
+ - nm_add_storm_control_policy_2 is changed
+ - nm_add_storm_control_policy_2.previous == []
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_2"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.descr == "Storm Control policy 2"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.bcRatePps == "100"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.bcBurstPps == "125"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.mcRatePps == "75"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.mcBurstPps == "100"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.uucRatePps == "50"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.uucBurstPps == "75"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.isUcMcBcStormPktCfgValid == "Valid"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.stormCtrlAction == "drop"
+ - nm_add_storm_control_policy_2.current.0.stormctrlIfPol.attributes.stormCtrlSoakInstCount == "3"
+ - nm_add_storm_control_policy_3 is changed
+ - nm_add_storm_control_policy_3.previous == []
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_3"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.bcRatePps == "25"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.bcBurstPps == "50"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.mcRatePps == "unspecified"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.mcRate == "100.000000"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.mcBurstPps == "unspecified"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.mcBurstRate == "100.000000"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.uucRatePps == "unspecified"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.uucRate == "100.000000"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.uucBurstPps == "unspecified"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.uucBurstRate == "100.000000"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.isUcMcBcStormPktCfgValid == "Valid"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.stormCtrlAction == "drop"
+ - nm_add_storm_control_policy_3.current.0.stormctrlIfPol.attributes.stormCtrlSoakInstCount == "3"
+ - nm_test_error_msg_storm_control_policy.msg == "If argument rate_type is percentage, the rate needs to be a value between 0 and 100 inclusive, got 125"
+
+ # QUERY STORM CONTROL POLICY
+ - name: Query all Storm Control policies
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_info
+ state: query
+ register: query_all_storm_control_policy
+
+ - name: Query ansible_storm_control_policy_1
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_interface_policy_storm_control_present
+ state: query
+ register: query_ansible_storm_control_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_storm_control_policy is not changed
+ - query_all_storm_control_policy.current|length >= 2
+ - query_ansible_storm_control_policy_1 is not changed
+ - query_ansible_storm_control_policy_1.current|length == 1
+ - query_ansible_storm_control_policy_1.current.0.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_1"
+ - query_ansible_storm_control_policy_1.current.0.stormctrlIfPol.attributes.descr == "Storm Control policy 1"
+ - query_ansible_storm_control_policy_1.current.0.stormctrlIfPol.attributes.ratePps == "100"
+ - query_ansible_storm_control_policy_1.current.0.stormctrlIfPol.attributes.burstPps == "125"
+ - query_ansible_storm_control_policy_1.current.0.stormctrlIfPol.attributes.isUcMcBcStormPktCfgValid == "Invalid"
+ - query_ansible_storm_control_policy_1.current.0.stormctrlIfPol.attributes.stormCtrlAction == "shutdown"
+ - query_ansible_storm_control_policy_1.current.0.stormctrlIfPol.attributes.stormCtrlSoakInstCount == "5"
+
+ # UPDATE STORM CONTROL POLICY
+ - name: Update first Storm Control policy (check_mode)
+ cisco.aci.aci_interface_policy_storm_control: &aci_interface_policy_storm_control_update
+ <<: *aci_interface_policy_storm_control_present
+ description: Updated description for first ansible Storm Control policy
+ all_types_configuration:
+ rate: 50
+ burst_rate: 75
+ rate_type: percentage
+ storm_control_action: drop
+ check_mode: true
+ register: cm_update_storm_control_policy
+
+ - name: Update first Storm Control policy (normal_mode)
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_interface_policy_storm_control_update
+ register: nm_update_storm_control_policy
+
+ - name: Update first Storm Control policy again - testing idempotency
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *aci_interface_policy_storm_control_update
+ register: nm_udpate_storm_control_policy_idempotency
+
+ - name: Asserts for Storm Control policy update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_storm_control_policy is changed
+ - cm_update_storm_control_policy.previous == cm_update_storm_control_policy.current
+ - cm_update_storm_control_policy.proposed.stormctrlIfPol.attributes.descr == "Updated description for first ansible Storm Control policy"
+ - cm_update_storm_control_policy.proposed.stormctrlIfPol.attributes.rate == "50.000000"
+ - cm_update_storm_control_policy.proposed.stormctrlIfPol.attributes.burstRate == "75.000000"
+ - cm_update_storm_control_policy.proposed.stormctrlIfPol.attributes.ratePps == "unspecified"
+ - cm_update_storm_control_policy.proposed.stormctrlIfPol.attributes.burstPps == "unspecified"
+ - cm_update_storm_control_policy.proposed.stormctrlIfPol.attributes.stormCtrlAction == "drop"
+ - nm_update_storm_control_policy is changed
+ - nm_update_storm_control_policy.current.0.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_1"
+ - nm_update_storm_control_policy.current.0.stormctrlIfPol.attributes.descr == "Updated description for first ansible Storm Control policy"
+ - nm_update_storm_control_policy.current.0.stormctrlIfPol.attributes.rate == "50.000000"
+ - nm_update_storm_control_policy.current.0.stormctrlIfPol.attributes.burstRate == "75.000000"
+ - nm_update_storm_control_policy.current.0.stormctrlIfPol.attributes.ratePps == "unspecified"
+ - nm_update_storm_control_policy.current.0.stormctrlIfPol.attributes.burstPps == "unspecified"
+ - nm_update_storm_control_policy.current.0.stormctrlIfPol.attributes.stormCtrlAction == "drop"
+ - nm_udpate_storm_control_policy_idempotency is not changed
+ - nm_udpate_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.name == "ansible_storm_control_policy_1"
+ - nm_udpate_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.descr == "Updated description for first ansible Storm Control policy"
+ - nm_udpate_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.rate == "50.000000"
+ - nm_udpate_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.burstRate == "75.000000"
+ - nm_udpate_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.ratePps == "unspecified"
+ - nm_udpate_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.burstPps == "unspecified"
+ - nm_udpate_storm_control_policy_idempotency.current.0.stormctrlIfPol.attributes.stormCtrlAction == "drop"
+
+ # DELETE STORM CONTROL POLICY
+ - name: Remove Storm Control policy (check_mode)
+ cisco.aci.aci_interface_policy_storm_control: &storm_control_policy_absent
+ <<: *aci_interface_policy_storm_control_update
+ state: absent
+ check_mode: true
+ register: cm_remove_storm_control_policy
+
+ - name: Remove Storm Control policy (normal_mode)
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *storm_control_policy_absent
+ register: nm_remove_storm_control_policy
+
+ - name: Remove Storm Control policy - testing idempotency
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *storm_control_policy_absent
+ register: nm_remove_storm_control_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_storm_control_policy is changed
+ - cm_remove_storm_control_policy.current == cm_remove_storm_control_policy.previous
+ - cm_remove_storm_control_policy.proposed == {}
+ - nm_remove_storm_control_policy is changed
+ - nm_remove_storm_control_policy.previous != []
+ - nm_remove_storm_control_policy.proposed == {}
+ - nm_remove_storm_control_policy.current == []
+ - nm_remove_storm_control_policy_idempotency is not changed
+ - nm_remove_storm_control_policy_idempotency.previous == []
+ - nm_remove_storm_control_policy_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove all ansible Storm Control Policies - cleanup before ending tests
+ cisco.aci.aci_interface_policy_storm_control:
+ <<: *caci_storm_control_policies_cleanup
+ loop:
+ - ansible_storm_control_policy_1
+ - ansible_storm_control_policy_2
+ - ansible_storm_control_policy_3
+ - ansible_storm_control_policy_4
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/tasks/main.yml
index 099b2eed9..4b5c32455 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_interface_selector_to_switch_policy_leaf_profile/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -83,7 +83,7 @@
# TODO: also test for errors
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- intftoleaf_check_mode_present is changed
- intftoleaf_present is changed
@@ -101,7 +101,7 @@
register: binding_query1
- name: query 1 assertions
- assert:
+ ansible.builtin.assert:
that:
- binding_query1 is not changed
- binding_query1.current | length >= 1
@@ -121,7 +121,7 @@
register: binding_query2
- name: query 2 assertions
- assert:
+ ansible.builtin.assert:
that:
- binding_query2 is not changed
- binding_query2.current | length >= 1
@@ -153,7 +153,7 @@
register: intftoleaf_absent_missing_param
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- intftoleaf_check_mode_absent is changed
- intftoleaf_check_mode_absent.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/tasks/main.yml
new file mode 100644
index 000000000..db44b6719
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_key_policy/tasks/main.yml
@@ -0,0 +1,153 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new Keychain policy
+ cisco.aci.aci_keychain_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ keychain_policy: ansible_keychain_policy_1
+ description: Keychain policy 1 for ansible_tenant tenant
+ state: present
+
+ - name: Add a Key policy (check_mode)
+ cisco.aci.aci_key_policy: &aci_key_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ keychain_policy: ansible_keychain_policy_1
+ id: 1
+ description: Key policy 1 for ansible_tenant tenant
+ start_time: "2024-01-01 00:00:00"
+ end_time: "2026-01-01 00:00:00"
+ pre_shared_key: my_password
+ state: present
+ check_mode: true
+ register: cm_add_key_policy
+
+ - name: Add a Key policy (normal_mode)
+ cisco.aci.aci_key_policy:
+ <<: *aci_key_policy_present
+ register: nm_add_key_policy
+
+ - name: Add the first Key policy again - testing hidden key authentification
+ cisco.aci.aci_key_policy:
+ <<: *aci_key_policy_present
+ register: nm_add_key_policy_idempotency
+
+ - name: Add a second Key policy (normal_mode)
+ cisco.aci.aci_key_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ keychain_policy: ansible_keychain_policy_1
+ id: 2
+ description: Key policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_key_policy_2
+
+ - name: Asserts for Key policys creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_key_policy is changed
+ - cm_add_key_policy.previous == []
+ - cm_add_key_policy.current == []
+ - nm_add_key_policy is changed
+ - nm_add_key_policy.current.0.fvKeyPol.attributes.id == "1"
+ - nm_add_key_policy.current.0.fvKeyPol.attributes.startTime == "2024-01-01T00:00:00.000+00:00"
+ - nm_add_key_policy.current.0.fvKeyPol.attributes.endTime == "2026-01-01T00:00:00.000+00:00"
+ - nm_add_key_policy_idempotency is changed
+ - nm_add_key_policy_2 is changed
+ - nm_add_key_policy_2.previous == []
+ - nm_add_key_policy_2.current.0.fvKeyPol.attributes.id == "2"
+ - nm_add_key_policy_2.current.0.fvKeyPol.attributes.endTime == "infinite"
+
+ - name: Query all Key policies
+ cisco.aci.aci_key_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_key_policy
+
+ - name: Query ansible_key_policy_1
+ cisco.aci.aci_key_policy:
+ <<: *aci_key_policy_present
+ state: query
+ register: query_ansible_key_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_key_policy is not changed
+ - query_all_key_policy.current|length >= 2
+ - query_ansible_key_policy_1 is not changed
+ - query_ansible_key_policy_1.current.0.fvKeyPol.attributes.id == "1"
+ - query_ansible_key_policy_1.current.0.fvKeyPol.attributes.startTime == "2024-01-01T00:00:00.000+00:00"
+ - query_ansible_key_policy_1.current.0.fvKeyPol.attributes.endTime == "2026-01-01T00:00:00.000+00:00"
+
+ - name: Remove Key policy (check_mode)
+ cisco.aci.aci_key_policy: &key_policy_absent
+ <<: *aci_key_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_key_policy
+
+ - name: Remove Key policy (normal_mode)
+ cisco.aci.aci_key_policy:
+ <<: *key_policy_absent
+ register: nm_remove_key_policy
+
+ - name: Remove Key policy - testing idempotency
+ cisco.aci.aci_key_policy:
+ <<: *key_policy_absent
+ register: nm_remove_key_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_key_policy is changed
+ - cm_remove_key_policy.proposed == {}
+ - nm_remove_key_policy is changed
+ - nm_remove_key_policy.previous != []
+ - nm_remove_key_policy.method == "DELETE"
+ - nm_remove_key_policy_idempotency is not changed
+ - nm_remove_key_policy_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/tasks/main.yml
new file mode 100644
index 000000000..0a0356cf7
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_keychain_policy/tasks/main.yml
@@ -0,0 +1,135 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a Keychain policy (check_mode)
+ cisco.aci.aci_keychain_policy: &aci_keychain_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ keychain_policy: ansible_keychain_policy_1
+ description: Keychain policy 1 for ansible_tenant tenant
+ state: present
+ check_mode: true
+ register: cm_add_keychain_policy
+
+ - name: Add a Keychain policy (normal_mode)
+ cisco.aci.aci_keychain_policy:
+ <<: *aci_keychain_policy_present
+ register: nm_add_keychain_policy
+
+ - name: Add the first Keychain policy again - testing idempotency
+ cisco.aci.aci_keychain_policy:
+ <<: *aci_keychain_policy_present
+ register: nm_add_keychain_policy_idempotency
+
+ - name: Add a second Keychain policy (normal_mode)
+ cisco.aci.aci_keychain_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ keychain_policy: ansible_keychain_policy_2
+ description: Keychain policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_keychain_policy_2
+
+ - name: Asserts for Keychain policys creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_keychain_policy is changed
+ - cm_add_keychain_policy.previous == []
+ - cm_add_keychain_policy.current == []
+ - nm_add_keychain_policy is changed
+ - nm_add_keychain_policy.current.0.fvKeyChainPol.attributes.name == "ansible_keychain_policy_1"
+ - nm_add_keychain_policy_idempotency is not changed
+ - nm_add_keychain_policy_2 is changed
+ - nm_add_keychain_policy_2.previous == []
+ - nm_add_keychain_policy_2.current.0.fvKeyChainPol.attributes.name == "ansible_keychain_policy_2"
+
+ - name: Query all Keychain policies
+ cisco.aci.aci_keychain_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_keychain_policy
+
+ - name: Query ansible_keychain_policy_1
+ cisco.aci.aci_keychain_policy:
+ <<: *aci_keychain_policy_present
+ state: query
+ register: query_ansible_keychain_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_keychain_policy is not changed
+ - query_all_keychain_policy.current|length >= 2
+ - query_ansible_keychain_policy_1 is not changed
+ - query_ansible_keychain_policy_1.current.0.fvKeyChainPol.attributes.name == "ansible_keychain_policy_1"
+
+ - name: Remove Keychain policy (check_mode)
+ cisco.aci.aci_keychain_policy: &keychain_policy_absent
+ <<: *aci_keychain_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_keychain_policy
+
+ - name: Remove Keychain policy (normal_mode)
+ cisco.aci.aci_keychain_policy:
+ <<: *keychain_policy_absent
+ register: nm_remove_keychain_policy
+
+ - name: Remove Keychain policy - testing idempotency
+ cisco.aci.aci_keychain_policy:
+ <<: *keychain_policy_absent
+ register: nm_remove_keychain_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_keychain_policy is changed
+ - cm_remove_keychain_policy.proposed == {}
+ - nm_remove_keychain_policy is changed
+ - nm_remove_keychain_policy.previous != []
+ - nm_remove_keychain_policy.method == "DELETE"
+ - nm_remove_keychain_policy_idempotency is not changed
+ - nm_remove_keychain_policy_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out/tasks/main.yml
index f72831322..2fcafc985 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a new L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -52,14 +52,14 @@
register: add_l2out
- name: Verify add_l2out
- assert:
+ ansible.builtin.assert:
that:
- add_l2out.current.0.l2extOut.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out"
- add_l2out.current.0.l2extOut.attributes.name == "ansible_l2out"
- add_l2out.current.0.l2extOut.attributes.annotation == 'orchestrator:ansible'
- name: Add the L2Out again
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -71,12 +71,12 @@
register: add_l2out_again
- name: Verify add_l2out_again
- assert:
+ ansible.builtin.assert:
that:
- add_l2out_again is not changed
- name: Add a new L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out_2
@@ -88,13 +88,13 @@
register: add_l2out_2
- name: Verify add_l2out_2
- assert:
+ ansible.builtin.assert:
that:
- add_l2out_2.current.0.l2extOut.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out_2"
- add_l2out_2.current.0.l2extOut.attributes.name == "ansible_l2out_2"
- name: Query the L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -102,26 +102,26 @@
register: query_l2out
- name: Verify query_l2out
- assert:
+ ansible.builtin.assert:
that:
- query_l2out is not changed
- query_l2out.current.0.l2extOut.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out"
- query_l2out.current.0.l2extOut.attributes.name == "ansible_l2out"
- name: Query all l2outs under a specific tenant
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
state: query
register: query_l2out_all
- name: Verify query_l2out_all
- assert:
+ ansible.builtin.assert:
that:
- query_l2out_all is not changed
- name: Remove the L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -129,7 +129,7 @@
register: remove_l2out
- name: Verify remove_l2out
- assert:
+ ansible.builtin.assert:
that:
- remove_l2out is changed
- remove_l2out.previous.0.l2extOut.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg/tasks/main.yml
index 39feb5216..9b2698498 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add New L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -52,7 +52,7 @@
register: add_l2out
- name: Add another L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out_2
@@ -64,7 +64,7 @@
register: add_l2out_2
- name: Add L2 external end point group
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -75,13 +75,13 @@
register: l2extepg
- name: Verify l2extepg
- assert:
+ ansible.builtin.assert:
that:
- l2extepg.current.0.l2extInstP.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg"
- l2extepg.current.0.l2extInstP.attributes.annotation == 'orchestrator:ansible'
- name: Add L2 external end point group again
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -92,13 +92,13 @@
register: l2extepg_again
- name: Verify l2extepg_again
- assert:
+ ansible.builtin.assert:
that:
- l2extepg_again is not changed
- l2extepg.current.0.l2extInstP.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg"
- name: Add another L2 external end point group
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out_2
@@ -110,12 +110,12 @@
register: l2extepg_2
- name: Verify l2extepg_2
- assert:
+ ansible.builtin.assert:
that:
- l2extepg_2.current.0.l2extInstP.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out_2/instP-ansible_extepg_2"
- name: Query the L2 external end point group
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -124,30 +124,30 @@
register: query_l2extepg
- name: Query all L2 external epg in a tenant
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
state: query
register: query_all_in_tenant
- name: Verify query_all_in_tenant
- assert:
+ ansible.builtin.assert:
that:
- query_all_in_tenant is not changed
- name: Query all L2 external epgs
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
state: query
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- name: Remove L2 external end point group
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -157,7 +157,7 @@
register: remove_l2extepg
- name: Verify remove_l2extepg
- assert:
+ ansible.builtin.assert:
that:
- remove_l2extepg is changed
- remove_l2extepg.previous.0.l2extInstP.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg_to_contract/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg_to_contract/tasks/main.yml
index 25c211f6b..0781aa682 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg_to_contract/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_extepg_to_contract/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add New L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -52,7 +52,7 @@
register: add_l2out
- name: Add another L2Out
- aci_l2out:
+ cisco.aci.aci_l2out:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out_2
@@ -64,7 +64,7 @@
register: add_l2out_2
- name: Add L2 external end point group
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -75,13 +75,13 @@
register: l2extepg
- name: Verify l2extepg
- assert:
+ ansible.builtin.assert:
that:
- l2extepg is changed
- l2extepg.current.0.l2extInstP.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg"
- name: Add L2 external end point group again
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -92,13 +92,13 @@
register: l2extepg_again
- name: Verify l2extepg_again
- assert:
+ ansible.builtin.assert:
that:
- l2extepg_again is not changed
- l2extepg.current.0.l2extInstP.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg"
- name: Add another L2 external end point group
- aci_l2out_extepg:
+ cisco.aci.aci_l2out_extepg:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out_2
@@ -110,13 +110,13 @@
register: l2extepg_2
- name: Verify l2extepg_2
- assert:
+ ansible.builtin.assert:
that:
- l2extepg_2 is changed
- l2extepg_2.current.0.l2extInstP.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out_2/instP-ansible_extepg_2"
- name: Bind External End Point Groups to Contracts
- aci_l2out_extepg_to_contract:
+ cisco.aci.aci_l2out_extepg_to_contract:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -127,14 +127,14 @@
register: bind_extepg_provider_contract
- name: Verify bind_extepg_provider_contract
- assert:
+ ansible.builtin.assert:
that:
- bind_extepg_provider_contract is changed
- bind_extepg_provider_contract.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg/rsprov-ansible_contract"
- bind_extepg_provider_contract.current.0.fvRsProv.attributes.annotation == 'orchestrator:ansible'
- name: Bind second External End Point Groups to Contracts
- aci_l2out_extepg_to_contract:
+ cisco.aci.aci_l2out_extepg_to_contract:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out_2
@@ -145,13 +145,13 @@
register: bind_extepg_provider_contract
- name: Verify bind_extepg_provider_contract
- assert:
+ ansible.builtin.assert:
that:
- bind_extepg_provider_contract is changed
- bind_extepg_provider_contract.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out_2/instP-ansible_extepg_2/rsprov-ansible_contract2"
- name: Query the External End Point Groups
- aci_l2out_extepg_to_contract:
+ cisco.aci.aci_l2out_extepg_to_contract:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -162,26 +162,26 @@
register: query_extepg
- name: Verify query_extepg
- assert:
+ ansible.builtin.assert:
that:
- query_extepg is not changed
- query_extepg.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg/rsprov-ansible_contract"
- name: Query all the External End Point Groups
- aci_l2out_extepg_to_contract:
+ cisco.aci.aci_l2out_extepg_to_contract:
<<: *aci_info
contract_type: provider
state: query
register: query_all
- name: Verify query_extepg
- assert:
+ ansible.builtin.assert:
that:
- query_extepg is not changed
- query_extepg.current | length > 0
- name: Remove existing contract to External End Point Groups
- aci_l2out_extepg_to_contract:
+ cisco.aci.aci_l2out_extepg_to_contract:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -192,14 +192,14 @@
register: remove_contract_extepg
- name: Verify remove_contract_extepg
- assert:
+ ansible.builtin.assert:
that:
- remove_contract_extepg is changed
- remove_contract_extepg.current == []
- remove_contract_extepg.previous.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/l2out-ansible_l2out/instP-ansible_extepg/rsprov-ansible_contract"
- name: Bind External End Point Groups to Contracts
- aci_l2out_extepg_to_contract:
+ cisco.aci.aci_l2out_extepg_to_contract:
<<: *aci_info
tenant: ansible_tenant
l2out: ansible_l2out
@@ -212,7 +212,7 @@
register: bind_extepg_consumer_contract
- name: Verify bind_extepg_consumer_contract
- assert:
+ ansible.builtin.assert:
that:
- bind_extepg_consumer_contract is not changed
- bind_extepg_consumer_contract.msg == "the 'provider_match' is only configurable for Provided Contracts" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_path/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_path/tasks/main.yml
index a573668de..62440ce64 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_path/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_path/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -26,7 +26,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -83,7 +83,7 @@
register: nm_path_to_intfp
- name: Verify path to interface profile
- assert:
+ ansible.builtin.assert:
that:
- cm_path_to_intfp is changed
- nm_path_to_intfp is changed
@@ -111,7 +111,7 @@
register: third_path
- name: Verify path to interface profile
- assert:
+ ansible.builtin.assert:
that:
- second_path is changed
- third_path is changed
@@ -166,7 +166,7 @@
register: query_path
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.l2extLIfP.children | length >= 3
@@ -192,7 +192,7 @@
register: rm_non_existing
- name: Verify remove path
- assert:
+ ansible.builtin.assert:
that:
- cm_rm_path is changed
- nm_rm_path is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_profile/tasks/main.yml
index 7e28c1cd4..86e6548f8 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_interface_profile/tasks/main.yml
@@ -5,7 +5,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -23,7 +23,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -65,7 +65,7 @@
register: nm_add_intf
- name: Verify nm_add_intf
- assert:
+ ansible.builtin.assert:
that:
- cm_add_intf is changed
- nm_add_intf is changed
@@ -79,7 +79,7 @@
register: add_intf_again
- name: Verify add_intf_again
- assert:
+ ansible.builtin.assert:
that:
- add_intf_again is not changed
@@ -100,7 +100,7 @@
register: query_all_profiles
- name: Verify query_all_profiles
- assert:
+ ansible.builtin.assert:
that:
- query_all_profiles is not changed
- query_all_profiles.current.0.l2extLNodeP.children | length > 1
@@ -113,7 +113,7 @@
register: query_spec_profile
- name: Verify query_spec_profile
- assert:
+ ansible.builtin.assert:
that:
- query_spec_profile is not changed
- query_spec_profile.current|length == 1
@@ -129,7 +129,7 @@
register: query_nonexist_profile
- name: Verify query_nonexist_profile
- assert:
+ ansible.builtin.assert:
that:
- query_nonexist_profile is not changed
- query_nonexist_profile.current == []
@@ -142,7 +142,7 @@
register: remove_profile
- name: Verify remove_profile
- assert:
+ ansible.builtin.assert:
that:
- remove_profile is changed
- remove_profile.current == []
@@ -154,7 +154,7 @@
register: remove_nonexist_profile
- name: Verify remove_nonexist_profile
- assert:
+ ansible.builtin.assert:
that:
- remove_nonexist_profile is not changed
- remove_nonexist_profile.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_node_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_node_profile/tasks/main.yml
index 82b4aaac5..d8b8f8b21 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_node_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l2out_logical_node_profile/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -27,7 +27,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -74,7 +74,7 @@
register: nm_add_second_node_profile
- name: Verify add_node_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_add_node_profile is changed
- nm_add_node_profile is changed
@@ -121,7 +121,7 @@
register: nm_query_all_node_profiles
- name: Verify query_node_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_query_node_profile is not changed
- nm_query_node_profile is not changed
@@ -166,7 +166,7 @@
register: nm_remove_second_node_profile
- name: Verify remove_node_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_node_profile is changed
- cm_remove_second_node_profile is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out/tasks/main.yml
index 65474048c..352f9d5b4 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out/tasks/main.yml
@@ -1,15 +1,16 @@
# Test code for the ACI modules
# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -18,29 +19,36 @@
use_ssl: '{{ aci_use_ssl | default(true) }}'
use_proxy: '{{ aci_use_proxy | default(true) }}'
output_level: debug
-
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Remove the ansible_l3out
- aci_l3out: &aci_l3out_absent
+ cisco.aci.aci_l3out: &aci_l3out_absent
<<: *aci_info
tenant: ansible_tenant
name: ansible_l3out
@@ -50,7 +58,7 @@
state: absent
- name: Remove the second ansible_l3out
- aci_l3out: &aci_l3out_2_absent
+ cisco.aci.aci_l3out: &aci_l3out_2_absent
<<: *aci_info
tenant: ansible_tenant
name: ansible_l3out_2
@@ -61,30 +69,30 @@
state: absent
- name: Add a new L3Out (check_mode)
- aci_l3out: &aci_l3out_present
+ cisco.aci.aci_l3out: &aci_l3out_present
<<: *aci_l3out_absent
state: present
check_mode: true
register: cm_add_l3out
- name: Add a new L3Out (normal_mode)
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
register: nm_add_l3out
- name: create L3Out again - testing idempotency
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
register: create_idempotency
- name: Add the second ansible_l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_2_absent
state: present
register: cm_add_l3out_2
- name: asserts for l3out creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_l3out is changed
- cm_add_l3out.previous == []
@@ -95,26 +103,26 @@
- create_idempotency is not changed
- name: Add export and import to route_control
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
route_control: [ import, export ]
register: nm_add_l3out_import_export
- name: Add export to route_control
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
route_control: export
register: nm_add_l3out_export
- name: Add just import to route_control - testing failure message
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
route_control: import
register: nm_add_l3out_import_error
ignore_errors: true
- name: asserts for l3out route control tasks
- assert:
+ ansible.builtin.assert:
that:
- nm_add_l3out_import_export is changed
- nm_add_l3out_import_export.current.0.l3extOut.attributes.enforceRtctrl == "export,import"
@@ -123,26 +131,44 @@
- nm_add_l3out_import_error.msg == "The route_control parameter is invalid{{':'}} allowed options are export or import,export only"
- name: Add BGP protocol
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
l3protocol: bgp
register: nm_add_l3out_bgp
- name: Add BGP protocol again - testing L3protocol changes
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
l3protocol: bgp
register: nm_add_l3out_bgp_again
+ - name: Remove OSPF protocol - testing L3protocol changes
+ cisco.aci.aci_l3out: &aci_l3out_remove_ospf
+ <<: *aci_l3out_2_absent
+ l3protocol: [ eigrp, pim ]
+ asn: 1
+ state: present
+ register: nm_add_l3out_bgp_without_ospf
+
+ - name: Remove OSPF protocol again - testing L3protocol changes
+ cisco.aci.aci_l3out:
+ <<: *aci_l3out_remove_ospf
+ register: nm_add_l3out_bgp_without_ospf_again
+
- name: Add PIM protocol, ospf_spec and asn - testing warning message for asn
- aci_l3out:
+ aci_l3out: &aci_l3out_add_pim
<<: *aci_l3out_present
l3protocol: pim
asn: 1
register: nm_add_l3out_pim
+ - name: Add PIM protocol, ospf_spec and asn again - testing warning message for asn
+ aci_l3out:
+ <<: *aci_l3out_add_pim
+ register: nm_add_l3out_pim_again
+
- name: Add EIGRP protocol - testing warning message for OSPF spec
- aci_l3out:
+ cisco.aci.aci_l3out: &aci_l3out_add_eigrp
<<: *aci_l3out_present
l3protocol: eigrp
asn: 1
@@ -150,8 +176,13 @@
description: OSPF warnings message works
register: nm_add_l3out_eigrp
- - name: remove asn - testing failure message
+ - name: Add EIGRP protocol again - testing warning message for OSPF spec
aci_l3out:
+ <<: *aci_l3out_add_eigrp
+ register: nm_add_l3out_eigrp_again
+
+ - name: remove asn - testing failure message
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
l3protocol: eigrp
asn: null
@@ -159,26 +190,30 @@
ignore_errors: true
- name: remove protocol - testing static protocol
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
l3protocol: static
register: nm_remove_l3protocol
- name: asserts for l3out protocols tasks
- assert:
+ ansible.builtin.assert:
that:
- nm_add_l3out_bgp is changed
- - nm_add_l3out_bgp_again is changed
+ - nm_add_l3out_bgp_again is not changed
+ - nm_add_l3out_bgp_without_ospf is changed
+ - nm_add_l3out_bgp_without_ospf_again is not changed
- nm_add_l3out_pim is changed
- nm_add_l3out_pim.warnings.0 == "Parameter 'asn' is only applicable when l3protocol is 'eigrp'. The ASN will be ignored"
+ - nm_add_l3out_pim_again is not changed
- nm_add_l3out_eigrp is changed
- nm_add_l3out_eigrp.current.0.l3extOut.children.0.eigrpExtP.attributes.asn == "1"
- nm_add_l3out_eigrp.warnings.0 == "Parameter 'ospf' is only applicable when l3protocol is 'ospf'. The OPSF specifications will be ignored"
+ - nm_add_l3out_eigrp_again is not changed
- add_l3out_without_asn.msg == "Parameter 'asn' is required when l3protocol is 'eigrp'"
- nm_remove_l3protocol is changed
- name: Add OSPF protocol
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
l3protocol: ospf
ospf:
@@ -191,7 +226,7 @@
register: nm_add_l3out_ospf
- name: asserts for l3out OSPF protocol tasks
- assert:
+ ansible.builtin.assert:
that:
- nm_add_l3out_ospf is changed
- nm_add_l3out_ospf.current.0.l3extOut.children.2.ospfExtP.attributes.areaCost == "1"
@@ -202,58 +237,58 @@
- nm_add_l3out_ospf.current.0.l3extOut.children.2.ospfExtP.attributes.multipodInternal == "no"
- name: get ansible_l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
state: query
register: get_l3out
- name: get all l3outs in ansible_tenant
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
state: query
register: get_all_l3out_ansible_tenant
- name: get all l3outs
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
state: query
register: get_all_l3out
- name: asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- get_l3out is not changed
- '"rsp-subtree=full&rsp-subtree-class=bgpExtP,eigrpExtP,l3extRsEctx,l3extRsL3DomAtt,ospfExtP,pimExtP" in get_l3out.filter_string'
- '"tn-ansible_tenant/out-ansible_l3out.json" in get_l3out.url'
- get_all_l3out_ansible_tenant is not changed
- - '"ospfExtP" in get_all_l3out_ansible_tenant.current.0.fvTenant.children.0.l3extOut.children.2'
+ - '"pimExtP" in get_all_l3out_ansible_tenant.current.0.fvTenant.children.0.l3extOut.children.0'
+ - '"eigrpExtP" in get_all_l3out_ansible_tenant.current.0.fvTenant.children.0.l3extOut.children.1'
- '"ospfExtP" in get_all_l3out_ansible_tenant.current.0.fvTenant.children.1.l3extOut.children.2'
- - '"bgpExtP" in get_all_l3out_ansible_tenant.current.0.fvTenant.children.1.l3extOut.children.3'
- get_all_l3out is not changed
- get_all_l3out.current | length >= 2
- name: delete l3out (check_mode)
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
state: absent
check_mode: true
register: delete_cm
- name: delete l3out (normal_mode)
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
state: absent
register: delete_l3out
- name: delete l3out again - testing idempotency
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_l3out_present
state: absent
register: delete_idempotency
- name: asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- delete_cm is changed
- delete_cm.proposed == {}
@@ -263,8 +298,120 @@
- delete_idempotency is not changed
- delete_idempotency.previous == []
+ - name: Execute tasks only for ACI v5+ because SR-MPLS L3Out is not supported lower versions
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ block:
+
+ - name: Add a SR-MPLS l3out
+ cisco.aci.aci_l3out: &aci_sr_mpls_l3out
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_sr_mpls_l3out
+ domain: ansible_dom
+ vrf: ansible_vrf
+ mpls: "yes"
+ state: present
+ register: add_sr_mpls_l3out
+
+ - name: Add a SR-MPLS l3out again
+ cisco.aci.aci_l3out:
+ <<: *aci_sr_mpls_l3out
+ register: add_sr_mpls_l3out_again
+
+ - name: Delete a SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_sr_mpls_l3out
+ state: absent
+ register: delete_sr_mpls_l3out
+
+ - name: Ensure infra SR-MPLS l3out does not exist
+ cisco.aci.aci_l3out: &aci_infra_sr_mpls_l3out_absent
+ <<: *aci_info
+ tenant: infra
+ name: ansible_infra_sr_mpls_l3out
+ mpls: "yes"
+ state: absent
+
+ - name: Add a infra SR-MPLS l3out (error)
+ cisco.aci.aci_l3out: &aci_infra_sr_mpls_l3out
+ <<: *aci_info
+ tenant: infra
+ name: ansible_infra_sr_mpls_l3out
+ domain: ansible_dom
+ vrf: ansible_vrf
+ l3protocol: ospf
+ mpls: "yes"
+ ignore_errors: true
+ register: err_infra_sr_mpls_l3out_no_bgp
+
+ - name: Add a infra SR-MPLS l3out (error)
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out
+ l3protocol: bgp
+ ignore_errors: true
+ register: err_infra_sr_mpls_l3out_no_overlay_1_vrf
+
+ - name: Add a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out
+ vrf: overlay-1
+ l3protocol: bgp
+ register: add_infra_sr_mpls_l3out
+
+ - name: Add a infra SR-MPLS l3out again
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out
+ vrf: overlay-1
+ l3protocol: bgp
+ register: add_infra_sr_mpls_l3out_again
+
+ - name: Delete a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+ register: delete_infra_sr_mpls_l3out
+
+ - name: Asserts SR-MPLS l3out
+ ansible.builtin.assert:
+ that:
+ - add_sr_mpls_l3out is changed
+ - add_sr_mpls_l3out.previous == []
+ - add_sr_mpls_l3out.current.0.l3extOut.attributes.mplsEnabled == "yes"
+ - add_sr_mpls_l3out.current.0.l3extOut.attributes.name == "ansible_sr_mpls_l3out"
+ - add_sr_mpls_l3out.current.0.l3extOut.children.0.l3extRsL3DomAtt.attributes.tDn == "uni/l3dom-ansible_dom"
+ - add_sr_mpls_l3out.current.0.l3extOut.children.1.l3extRsEctx.attributes.tnFvCtxName == "ansible_vrf"
+ - add_sr_mpls_l3out_again is not changed
+ - delete_sr_mpls_l3out is changed
+ - delete_sr_mpls_l3out.previous.0.l3extOut.attributes.mplsEnabled == "yes"
+ - delete_sr_mpls_l3out.previous.0.l3extOut.attributes.name == "ansible_sr_mpls_l3out"
+ - delete_sr_mpls_l3out.previous.0.l3extOut.children.0.l3extRsL3DomAtt.attributes.tDn == "uni/l3dom-ansible_dom"
+ - delete_sr_mpls_l3out.previous.0.l3extOut.children.1.l3extRsEctx.attributes.tnFvCtxName == "ansible_vrf"
+ - delete_sr_mpls_l3out.current == []
+ - add_infra_sr_mpls_l3out is changed
+ - add_infra_sr_mpls_l3out.previous == []
+ - add_infra_sr_mpls_l3out.current.0.l3extOut.attributes.mplsEnabled == "yes"
+ - add_infra_sr_mpls_l3out.current.0.l3extOut.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - add_infra_sr_mpls_l3out.current.0.l3extOut.children.0.mplsExtP.children.0.mplsRsLabelPol.attributes.tDn == "uni/tn-infra/mplslabelpol-default"
+ - add_infra_sr_mpls_l3out.current.0.l3extOut.children.1.l3extRsL3DomAtt.attributes.tDn == "uni/l3dom-ansible_dom"
+ - add_infra_sr_mpls_l3out.current.0.l3extOut.children.2.l3extProvLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - add_infra_sr_mpls_l3out.current.0.l3extOut.children.3.l3extRsEctx.attributes.tnFvCtxName == "overlay-1"
+ - add_infra_sr_mpls_l3out.current.0.l3extOut.children.4.bgpExtP.attributes.descr == ""
+ - add_infra_sr_mpls_l3out_again is not changed
+ - delete_infra_sr_mpls_l3out is changed
+ - delete_infra_sr_mpls_l3out.previous.0.l3extOut.attributes.mplsEnabled == "yes"
+ - delete_infra_sr_mpls_l3out.previous.0.l3extOut.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - delete_infra_sr_mpls_l3out.previous.0.l3extOut.children.0.mplsExtP.children.0.mplsRsLabelPol.attributes.tDn == "uni/tn-infra/mplslabelpol-default"
+ - delete_infra_sr_mpls_l3out.previous.0.l3extOut.children.1.l3extRsL3DomAtt.attributes.tDn == "uni/l3dom-ansible_dom"
+ - delete_infra_sr_mpls_l3out.previous.0.l3extOut.children.2.l3extProvLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - delete_infra_sr_mpls_l3out.previous.0.l3extOut.children.3.l3extRsEctx.attributes.tnFvCtxName == "overlay-1"
+ - delete_infra_sr_mpls_l3out.previous.0.l3extOut.children.4.bgpExtP.attributes.descr == ""
+ - delete_infra_sr_mpls_l3out.current == []
+ - err_infra_sr_mpls_l3out_no_overlay_1_vrf.failed == true
+ - err_infra_sr_mpls_l3out_no_overlay_1_vrf.msg == "The vrf parameter must be 'overlay-1' when tenant is 'infra' and mpls is 'yes'"
+ - err_infra_sr_mpls_l3out_no_bgp.failed == true
+ - err_infra_sr_mpls_l3out_no_bgp.msg == "The l3protocol parameter must be 'bgp' when tenant is 'infra' and mpls is 'yes'"
+
- name: Delete the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/tasks/main.yml
new file mode 100644
index 000000000..19c034eb8
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_interface_profile/tasks/main.yml
@@ -0,0 +1,226 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Anvitha Jain (@anvjain)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ # This condition will execute only when APIC version >= 5.2 and for non-cloud APICs
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=') and query_cloud.current == []
+ block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+ # Add a tenant
+ - name: Add a new tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # Add VRF
+ - name: Add a new VRF
+ cisco.aci.aci_vrf:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_vrf
+ description: Ansible VRF
+ state: present
+
+ # Add L3Out
+ - name: Add a new L3 Outside
+ cisco.aci.aci_l3out:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_l3out
+ description: Ansible L3 Outside
+ domain: ansible_dom
+ vrf: ansible_vrf
+ l3protocol: bgp
+ state: present
+
+ # ADD l3out logical node profile
+ - name: l3out logical node profile
+ cisco.aci.aci_l3out_logical_node_profile:
+ <<: *aci_info
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ node_profile: ansible_node_profile
+ state: present
+
+ # ADD l3out logical interface profile
+ - name: l3out logical interface profile
+ cisco.aci.aci_l3out_logical_interface_profile:
+ <<: *aci_info
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ node_profile: ansible_node_profile
+ interface_profile: ansible_interface_profile
+ state: present
+
+ # CREATE L3Out BFD Interface policy
+ - name: Add a new L3Out BFD Interface policy
+ cisco.aci.aci_interface_policy_bfd:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd__interface_policy
+ description: Ansible BFD Interface Policy
+ state: present
+ register: add_bfd_interface_pol
+
+ # Add L3Out BFD Interface Profile
+ - name: Add a new L3Out BFD Interface Profile - check mode
+ cisco.aci.aci_l3out_bfd_interface_profile: &present_l3out_bfd_int_profile
+ <<: *aci_info
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ bfd_interface_policy: ansible_bfd_interface_policy
+ state: present
+ check_mode: true
+ register: cm_add_l3out_bfd_int_prof
+
+ - name: Add a new L3Out BFD Interface Profile - normal mode
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ state: present
+ register: nm_add_l3out_bfd_int_prof
+
+ - name: Verify adding L3Out BFD Interface Profile
+ assert:
+ that:
+ - cm_add_l3out_bfd_int_prof is changed
+ - nm_add_l3out_bfd_int_prof is changed
+ - cm_add_l3out_bfd_int_prof.previous == nm_add_l3out_bfd_int_prof.previous == []
+ - cm_add_l3out_bfd_int_prof.proposed.bfdIfP.attributes.dn == nm_add_l3out_bfd_int_prof.proposed.bfdIfP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/bfdIfP"
+ - cm_add_l3out_bfd_int_prof.proposed.bfdIfP.children.0.bfdRsIfPol.attributes.tnBfdIfPolName == cm_add_l3out_bfd_int_prof.proposed.bfdIfP.children.0.bfdRsIfPol.attributes.tnBfdIfPolName == "ansible_bfd_interface_policy"
+
+ - name: Add L3Out BFD Interface Profile again- idempotency
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ state: present
+ register: add_l3out_bfd_int_prof_again
+
+ - name: Verify adding L3Out BFD Interface Profile again - idempotency
+ assert:
+ that:
+ - add_l3out_bfd_int_prof_again is not changed
+
+ # Update L3Out BFD Interface Profile
+ - name: Update L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ authentication_type: sha1
+ key: "abc*123"
+ key_id: 15
+ state: present
+ register: update_l3out_bfd_int_prof
+
+ - name: Verify updating L3Out BFD Interface Profile
+ assert:
+ that:
+ - update_l3out_bfd_int_prof is changed
+ - update_l3out_bfd_int_prof.sent.bfdIfP.attributes.keyId == "15"
+ - update_l3out_bfd_int_prof.sent.bfdIfP.attributes.key == "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER"
+ - update_l3out_bfd_int_prof.sent.bfdIfP.attributes.type == "sha1"
+
+ # Remove children from L3Out BFD Interface Profile
+ - name: Remove children from L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ bfd_interface_policy: ""
+ register: remove_children_l3out_bfd_int_prof
+
+ - name: Asserts for children removal tasks for the from L3Out BFD Interface Profile
+ ansible.builtin.assert:
+ that:
+ - remove_children_l3out_bfd_int_prof is changed
+ - remove_children_l3out_bfd_int_prof.sent.bfdIfP.children.0.bfdRsIfPol.attributes.tnBfdIfPolName == ""
+
+ # Query L3Out BFD Interface Profile
+ - name: Query L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ state: query
+ register: query_l3out_bfd_int_prof
+
+ - name: Query all L3Out BFD Interface Profile
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *aci_info
+ state: query
+ register: query_all_l3out_bfd_int_prof
+
+ # Validating out of range parameters.
+ - name: Add out of range key_id
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ key_id: 256
+ state: present
+ ignore_errors: true
+ register: out_of_range_key_id
+
+ - name: Verify out of range key_id
+ assert:
+ that:
+ - out_of_range_key_id is not changed
+ - out_of_range_key_id.msg == "The \"key_id\" must be a value between 1 and 255"
+
+ - name: Delete L3Out BFD Interface Profile - check mode
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ state: absent
+ check_mode: true
+ register: cm_remove_l3out_bfd_int_prof
+
+ - name: Delete L3Out BFD Interface Profile - normal mode
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ state: absent
+ register: nm_remove_l3out_bfd_int_prof
+
+ - name: Delete L3Out BFD Interface Profile again - idempotency
+ cisco.aci.aci_l3out_bfd_interface_profile:
+ <<: *present_l3out_bfd_int_profile
+ state: absent
+ register: remove_l3out_bfd_int_prof_again
+
+ - name: Verify removing L3Out BFD Interface Profile
+ assert:
+ that:
+ - cm_remove_l3out_bfd_int_prof is changed
+ - nm_remove_l3out_bfd_int_prof is changed
+ - cm_remove_l3out_bfd_int_prof.proposed == nm_remove_l3out_bfd_int_prof.proposed == {}
+ - remove_l3out_bfd_int_prof_again is not changed
+ - nm_remove_l3out_bfd_int_prof.current == remove_l3out_bfd_int_prof_again.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/tasks/main.yml
new file mode 100644
index 000000000..920453708
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bfd_multihop_interface_profile/tasks/main.yml
@@ -0,0 +1,233 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Anvitha Jain (@anvjain)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ # This condition will execute only when APIC version >= 5.2 and for non-cloud APICs
+ when: version.current.0.topSystem.attributes.version is version('5.2', '>=') and query_cloud.current == []
+ block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+ # Add a tenant
+ - name: Add a new tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # Add VRF
+ - name: Add a new VRF
+ cisco.aci.aci_vrf:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_vrf
+ description: Ansible VRF
+ state: present
+
+ # Add L3Out
+ - name: Add a new L3 Outside
+ cisco.aci.aci_l3out:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_l3out
+ description: Ansible L3 Outside
+ domain: ansible_dom
+ vrf: ansible_vrf
+ l3protocol: bgp
+ state: present
+
+ # ADD l3out logical node profile
+ - name: l3out logical node profile
+ cisco.aci.aci_l3out_logical_node_profile:
+ <<: *aci_info
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ node_profile: ansible_node_profile
+ state: present
+
+ # ADD l3out logical interface profile
+ - name: l3out logical interface profile
+ cisco.aci.aci_l3out_logical_interface_profile:
+ <<: *aci_info
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ node_profile: ansible_node_profile
+ interface_profile: ansible_interface_profile
+ state: present
+
+ # CREATE BFD Multihop Interface policy
+ - name: Add a new BFD Multihop Interface policy
+ cisco.aci.aci_interface_policy_bfd_multihop:
+ <<: *aci_info
+ tenant: ansible_tenant
+ name: ansible_bfd_multihop_interface_policy
+ description: Ansible BFD Multihop Interface Policy
+ state: present
+ register: add_bfd_multihop_interface_pol
+
+ # Add BFD Multihop Interface Profile
+ - name: Add a new BFD Multihop Interface Profile - check mode
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile: &present_bfd_mh_int_profile
+ <<: *aci_info
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ l3out_logical_node_profile: ansible_node_profile
+ l3out_logical_interface_profile: ansible_interface_profile
+ bfd_multihop_interface_policy: ansible_bfd_multihop_interface_policy
+ state: present
+ check_mode: true
+ register: cm_add_bfd_mh_int_prof
+
+ - name: Add a new BFD Multihop Interface Profile - normal mode
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ state: present
+ register: nm_add_bfd_mh_int_prof
+
+ - name: Verify adding BFD Multihop Interface Profile
+ assert:
+ that:
+ - cm_add_bfd_mh_int_prof is changed
+ - nm_add_bfd_mh_int_prof is changed
+ - cm_add_bfd_mh_int_prof.previous == nm_add_bfd_mh_int_prof.previous == []
+ - cm_add_bfd_mh_int_prof.proposed.bfdMhIfP.attributes.dn == nm_add_bfd_mh_int_prof.proposed.bfdMhIfP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/bfdMhIfP"
+ - cm_add_bfd_mh_int_prof.proposed.bfdMhIfP.children.0.bfdRsMhIfPol.attributes.tnBfdMhIfPolName == nm_add_bfd_mh_int_prof.proposed.bfdMhIfP.children.0.bfdRsMhIfPol.attributes.tnBfdMhIfPolName == "ansible_bfd_multihop_interface_policy"
+
+ # Query BFD Multihop Interface Profile
+ - name: Query BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ state: query
+ register: query_bfd_mh_int_prof
+
+ - name: Add BFD Multihop Interface Profile again- idempotency
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ state: present
+ register: add_bfd_mh_int_prof_again
+
+ - name: Verify adding BFD Multihop Interface Profile again - idempotency
+ assert:
+ that:
+ - add_bfd_mh_int_prof_again is not changed
+
+ # Update BFD Multihop Interface Profile
+ - name: Update BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ authentication_type: sha1
+ key: "abc*123"
+ key_id: 15
+ state: present
+ register: update_bfd_mh_int_prof
+
+ - name: Verify updating BFD Multihop Interface Profile
+ assert:
+ that:
+ - update_bfd_mh_int_prof is changed
+ - update_bfd_mh_int_prof.sent.bfdMhIfP.attributes.keyId == "15"
+ - update_bfd_mh_int_prof.sent.bfdMhIfP.attributes.key == "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER"
+ - update_bfd_mh_int_prof.sent.bfdMhIfP.attributes.type == "sha1"
+
+ # Remove children from L3Out BFD Interface Profile
+ - name: Remove children from BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ bfd_multihop_interface_policy: ""
+ register: remove_children_bfd_mh_int_prof
+
+ - name: Asserts for children removal tasks for the from BFD Multihop Interface Profile
+ ansible.builtin.assert:
+ that:
+ - remove_children_bfd_mh_int_prof is changed
+ - remove_children_bfd_mh_int_prof.sent.bfdMhIfP.children.0.bfdRsMhIfPol.attributes.tnBfdMhIfPolName == ""
+
+ # Query BFD Multihop Interface Profile
+ - name: Query BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ state: query
+ register: query_bfd_mh_int_prof
+
+ - name: Query all BFD Multihop Interface Profile
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *aci_info
+ state: query
+ register: query_all_bfd_mh_int_prof
+
+ # Validating out of range parameters.
+ - name: Add out of range key_id
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ key_id: 256
+ state: present
+ ignore_errors: true
+ register: out_of_range_key_id
+
+ - name: Verify out of range key_id
+ assert:
+ that:
+ - out_of_range_key_id is not changed
+ - out_of_range_key_id.msg == "The \"key_id\" must be a value between 1 and 255"
+
+ - name: Delete BFD Multihop Interface Profile - check mode
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ state: absent
+ check_mode: true
+ register: cm_remove_bfd_mh_int_prof
+
+ - name: Delete BFD Multihop Interface Profile - normal mode
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ state: absent
+ register: nm_remove_bfd_mh_int_prof
+
+ - name: Delete BFD Multihop Interface Profile again - idempotency
+ cisco.aci.aci_l3out_bfd_multihop_interface_profile:
+ <<: *present_bfd_mh_int_profile
+ state: absent
+ register: remove_bfd_mh_int_prof_again
+
+ - name: Verify removing BFD Multihop Interface Profile
+ assert:
+ that:
+ - cm_remove_bfd_mh_int_prof is changed
+ - nm_remove_bfd_mh_int_prof is changed
+ - cm_remove_bfd_mh_int_prof.proposed == nm_remove_bfd_mh_int_prof.proposed == {}
+ - remove_bfd_mh_int_prof_again is not changed
+ - nm_remove_bfd_mh_int_prof.current == remove_bfd_mh_int_prof_again.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_peer/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_peer/tasks/main.yml
index 8ed2daee3..e7588be41 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_peer/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_peer/tasks/main.yml
@@ -1,16 +1,18 @@
# Test code for the ACI modules
# Copyright: (c) 2021, Tim Cragg (@timcragg)
+# Copyright: (c) 2023, Akini ROss (@akinross)
+
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: "Please define the following variables: aci_hostname, aci_username and aci_password."
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -28,17 +30,17 @@
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
# CLEAN ENVIRONMENT
- name: Remove ansible_tenant if it already exists
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Remove ansible_l3ext_domain if it already exists
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
@@ -48,21 +50,21 @@
when: query_cloud.current == [] # This condition will skip execution for cloud sites
block:
- name: Remove ansible_port_channel_ipg if it already exists
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
state: absent
- name: Remove ansible_vpc_ipg if it already exists
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
state: absent
- name: Add a new tenant required for l3out
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
@@ -70,7 +72,7 @@
# ADD domain
- name: Add domain for l3out
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
@@ -78,7 +80,7 @@
# ADD VRF
- name: Add VRF for l3out
- aci_vrf:
+ cisco.aci.aci_vrf:
<<: *aci_info
tenant: ansible_tenant
vrf: ansible_vrf
@@ -86,7 +88,7 @@
# ADD PC IPG
- name: Add port-channel IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
@@ -94,7 +96,7 @@
# ADD vPC IPG
- name: Add vPC IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
@@ -102,7 +104,7 @@
# ADD l3out
- name: Add l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
name: ansible_l3out
@@ -113,7 +115,7 @@
# ADD l3out logical node profile
- name: l3out logical node profile
- aci_l3out_logical_node_profile:
+ cisco.aci.aci_l3out_logical_node_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -122,7 +124,7 @@
# ADD l3out logical interface profile
- name: l3out logical interface profile
- aci_l3out_logical_interface_profile:
+ cisco.aci.aci_l3out_logical_interface_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -132,7 +134,7 @@
# ADD l3out interface
- name: Add routed interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -148,7 +150,7 @@
# ADD l3out port-channel
- name: Add routed interface port-channel
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -164,7 +166,7 @@
# ADD l3out vPC
- name: Add interface vPC
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -181,7 +183,7 @@
# ADD BGP peer to ethernet port
- name: add BGP peer to ethernet port (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -207,7 +209,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: add BGP peer to ethernet port (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -230,7 +232,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been created with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
- add_eth_bgp_peer.current.0.bgpPeerP.attributes.addr == "192.168.50.2"
@@ -245,7 +247,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been created with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
- add_eth_bgp_peer_32.current.0.bgpPeerP.attributes.addr == "192.168.50.2"
@@ -256,20 +258,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been created correctly
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer.current.0.bgpPeerP.children.2.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been created correctly
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# ADD BGP peer again to check idempotence
- name: add BGP peer to ethernet port again (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -294,7 +296,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: add BGP peer to ethernet port again (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -317,7 +319,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been created with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer_again is not changed
- add_eth_bgp_peer_again.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
@@ -330,7 +332,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been created with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer_again_32 is not changed
- add_eth_bgp_peer_again_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
@@ -341,20 +343,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object is still correct (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer_again.current.0.bgpPeerP.children.2.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object his still correct (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_eth_bgp_peer_again_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# MODIFY BGP peer
- name: update BGP peer (version >= 4)
- aci_l3out_bgp_peer: &interface_profile_bgp_peer_present
+ cisco.aci.aci_l3out_bgp_peer: &interface_profile_bgp_peer_present
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -386,7 +388,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: update BGP peer (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -412,7 +414,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been updated with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_eth_bgp_peer is changed
- update_eth_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
@@ -429,7 +431,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been updated with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_eth_bgp_peer_32 is changed
- update_eth_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
@@ -442,20 +444,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been updated correctly (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_eth_bgp_peer.current.0.bgpPeerP.children.2.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been updated correctly (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_eth_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# QUERY BGP peer
- name: query BGP peer (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -470,7 +472,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: query BGP peer (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -485,7 +487,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- query_eth_bgp_peer is not changed
- query_eth_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
@@ -500,7 +502,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- query_eth_bgp_peer_32 is not changed
- query_eth_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/peerP-[192.168.50.2]"
@@ -513,13 +515,13 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP remote AS (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- query_eth_bgp_peer.current.0.bgpPeerP.children.2.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP remote AS (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- query_eth_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '<')
@@ -529,7 +531,7 @@
block:
# Route Control Profile validation check for Interface Profile level
- name: Add Route Control Profile to the ansible_interface_profile (version >= 4) - check mode
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *interface_profile_bgp_peer_present
route_control_profiles:
- tenant: "ansible_tenant"
@@ -544,13 +546,13 @@
register: cm_if_rtctrl_present
- name: Assertions check for add Route Control Profile to the ansible_interface_profile (version >= 4) - check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_if_rtctrl_present is changed
- cm_if_rtctrl_present.sent.bgpPeerP.children | length == 2
- name: Add Route Control Profile to the ansible_interface_profile (version >= 4) - normal mode - missing param
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *interface_profile_bgp_peer_present
route_control_profiles:
- tenant: "ansible_tenant"
@@ -564,13 +566,13 @@
ignore_errors: true
- name: Assertions check for add Route Control Profile to the ansible_interface_profile (version >= 4) - normal mode - missing param
- assert:
+ ansible.builtin.assert:
that:
- nm_if_rtctrl_present_missing_param is failed
- "nm_if_rtctrl_present_missing_param.msg == 'missing required arguments: direction found in route_control_profiles'"
- name: Add Route Control Profile to the ansible_interface_profile (version >= 4) - normal mode
- aci_l3out_bgp_peer: &nm_if_rtctrl_present
+ cisco.aci.aci_l3out_bgp_peer: &nm_if_rtctrl_present
<<: *interface_profile_bgp_peer_present
route_control_profiles:
- tenant: "ansible_tenant"
@@ -584,7 +586,7 @@
register: nm_if_rtctrl_present
- name: Assertions check for add Route Control Profile to the ansible_interface_profile (version >= 4) - normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_if_rtctrl_present is changed
- nm_if_rtctrl_present.current | length == 1
@@ -594,13 +596,13 @@
- nm_if_rtctrl_present.current.0.bgpPeerP.children | length >= nm_if_rtctrl_present.previous.0.bgpPeerP.children | length
- name: Add Route Control Profile to the ansible_interface_profile (version >= 4) - normal mode - idempotency works
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *nm_if_rtctrl_present
state: present
register: idempotency_nm_if_rtctrl_present
- name: Idempotency assertions check for add Route Control Profile to the ansible_interface_profile (version >= 4) - normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_if_rtctrl_present is not changed
- idempotency_nm_if_rtctrl_present.current | length == 1
@@ -611,7 +613,7 @@
- idempotency_nm_if_rtctrl_present.previous.0.bgpPeerP.children | length >= 2
- name: Query a BGP Peer with Interface Profile
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -625,7 +627,7 @@
register: query_if_bgp_peer
- name: Assertions check for query a BGP Peer with Interface Profile
- assert:
+ ansible.builtin.assert:
that:
- query_if_bgp_peer is not changed
- query_if_bgp_peer.current | length == 1
@@ -634,7 +636,7 @@
# Route Control Profile validation check for Node Profile level
- name: Add BGP Peer to the Node Profile level (version >= 4) - check mode
- aci_l3out_bgp_peer: &cm_ln_rtctrl_present
+ cisco.aci.aci_l3out_bgp_peer: &cm_ln_rtctrl_present
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -655,7 +657,7 @@
register: cm_ln_rtctrl_present
- name: Assertions check for add BGP Peer to the Node Profile level (version >= 4) - check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_ln_rtctrl_present is changed
- cm_ln_rtctrl_present.current | length == 0
@@ -664,13 +666,13 @@
- cm_ln_rtctrl_present.sent.bgpPeerP.children | length >= 2
- name: Add BGP Peer to the Node Profile level (version >= 4) - normal mode
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *cm_ln_rtctrl_present
state: present
register: nm_ln_rtctrl_present
- name: Assertions check for add BGP Peer to the Node Profile level (version >= 4) - normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_ln_rtctrl_present is changed
- nm_ln_rtctrl_present.current | length == 1
@@ -681,13 +683,13 @@
- nm_ln_rtctrl_present.current.0.bgpPeerP.children.2.bgpLocalAsnP.attributes.localAsn == "100"
- name: Add BGP Peer to the Node Profile level (version >= 4) - normal mode - idempotency works
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *cm_ln_rtctrl_present
state: present
register: idempotency_nm_ln_rtctrl_present
- name: Idempotency assertions check for add BGP Peer to the Node Profile level (version >= 4) - normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_ln_rtctrl_present is not changed
- idempotency_nm_ln_rtctrl_present.current | length == 1
@@ -697,7 +699,7 @@
- idempotency_nm_ln_rtctrl_present.previous.0.bgpPeerP.attributes.addr == "192.168.50.3"
- name: Add BGP Peer to the Node Profile level (version >= 4) - normal mode - missing param
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *cm_ln_rtctrl_present
route_control_profiles:
- tenant: "ansible_tenant"
@@ -711,13 +713,13 @@
ignore_errors: true
- name: Assertions check for add BGP Peer to the Node Profile level (version >= 4) - normal mode - missing param
- assert:
+ ansible.builtin.assert:
that:
- nm_ln_rtctrl_present_missing_param is failed
- "nm_ln_rtctrl_present_missing_param.msg == 'missing required arguments: direction found in route_control_profiles'"
- name: Query a BGP Peer from the Node Profile level
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -727,27 +729,27 @@
register: query_ln_bgp_peer
- name: Assertions check for query a BGP Peer from the Node Profile level
- assert:
+ ansible.builtin.assert:
that:
- query_ln_bgp_peer is not changed
- query_ln_bgp_peer.current | length == 1
- query_ln_bgp_peer.current.0.bgpPeerP.attributes.addr == "192.168.50.3"
- name: Query all BGP peers
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
state: query
register: query_all_bgp_peer
- name: Assertions check for query all BGP peers
- assert:
+ ansible.builtin.assert:
that:
- query_all_bgp_peer is not changed
- query_all_bgp_peer.current | length != 0
# DELETE BGP peer
- name: delete BGP peer
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -761,7 +763,7 @@
register: remove_eth_bgp_peer
- name: verify remove_eth_bgp_peer
- assert:
+ ansible.builtin.assert:
that:
- remove_eth_bgp_peer is changed
- remove_eth_bgp_peer.current == []
@@ -770,7 +772,7 @@
# ADD BGP peer to port-channel
- name: add BGP peer to port-channel (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -795,7 +797,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: add BGP peer to port-channel (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -818,7 +820,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been created with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
- add_pc_bgp_peer.current.0.bgpPeerP.attributes.addr == "192.168.50.2"
@@ -830,7 +832,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been created with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
- add_pc_bgp_peer_32.current.0.bgpPeerP.attributes.addr == "192.168.50.2"
@@ -840,20 +842,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been created correctly (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been created correctly (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# ADD BGP peer again to check idempotence
- name: add BGP peer to port-channel again (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -878,7 +880,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: add BGP peer to port-channel again (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -901,7 +903,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been created with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer_again is not changed
- add_pc_bgp_peer_again.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
@@ -914,7 +916,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been created with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer_again_32 is not changed
- add_pc_bgp_peer_again_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
@@ -925,20 +927,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been created correctly (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer_again.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been created correctly (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_pc_bgp_peer_again_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# MODIFY BGP peer
- name: update BGP peer (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -971,7 +973,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: update BGP peer (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1000,7 +1002,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been updated with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_pc_bgp_peer is changed
- update_pc_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
@@ -1015,7 +1017,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been updated with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_pc_bgp_peer_32 is changed
- update_pc_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
@@ -1028,20 +1030,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been created correctly (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_pc_bgp_peer.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been created correctly (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_pc_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# QUERY BGP peer
- name: query BGP peer (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1056,7 +1058,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: query BGP peer (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1071,7 +1073,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- query_pc_bgp_peer is not changed
- query_pc_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
@@ -1086,7 +1088,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- query_pc_bgp_peer_32 is not changed
- query_pc_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]/peerP-[192.168.50.2]"
@@ -1099,20 +1101,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP remote AS (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- query_pc_bgp_peer.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP remote AS (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- query_pc_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# DELETE BGP peer
- name: delete BGP peer
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1126,7 +1128,7 @@
register: remove_pc_bgp_peer
- name: verify remove_pc_bgp_peer
- assert:
+ ansible.builtin.assert:
that:
- remove_pc_bgp_peer is changed
- remove_pc_bgp_peer.current == []
@@ -1135,7 +1137,7 @@
# ADD BGP peer to vPC
- name: add BGP peer to vPC (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1160,7 +1162,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: add BGP peer to vPC (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1183,7 +1185,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been created with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
- add_vpc_bgp_peer.current.0.bgpPeerP.attributes.addr == "192.168.50.2"
@@ -1195,7 +1197,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been created with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
- add_vpc_bgp_peer_32.current.0.bgpPeerP.attributes.addr == "192.168.50.2"
@@ -1205,20 +1207,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been created correctly (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been created correctly (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# ADD BGP peer again to check idempotence
- name: add BGP peer to vPC again (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1243,7 +1245,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: add BGP peer to vPC again (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1266,7 +1268,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been created with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer_again is not changed
- add_vpc_bgp_peer_again.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
@@ -1279,7 +1281,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been created with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer_again_32 is not changed
- add_vpc_bgp_peer_again_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
@@ -1290,20 +1292,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been created correctly (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer_again.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been created correctly (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_vpc_bgp_peer_again_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65456"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# MODIFY BGP peer
- name: update BGP peer (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1336,7 +1338,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: update BGP peer (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1365,7 +1367,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer has been updated with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_vpc_bgp_peer is changed
- update_vpc_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
@@ -1380,7 +1382,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer has been updated with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_vpc_bgp_peer_32 is changed
- update_vpc_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
@@ -1393,20 +1395,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify remote AS object has been created correctly (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_vpc_bgp_peer.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify remote AS object has been created correctly (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_vpc_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# QUERY BGP peer
- name: query BGP peer (version >= 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1421,7 +1423,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: query BGP peer (version < 4)
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1436,7 +1438,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP peer attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- query_vpc_bgp_peer is not changed
- query_vpc_bgp_peer.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
@@ -1451,7 +1453,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP peer attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- query_vpc_bgp_peer_32 is not changed
- query_vpc_bgp_peer_32.current.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
@@ -1464,20 +1466,20 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: verify BGP remote AS (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- query_pc_bgp_peer.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: verify BGP remote AS (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- query_pc_bgp_peer_32.current.0.bgpPeerP.children.1.bgpAsP.attributes.asn == "65457"
when: version.current.0.topSystem.attributes.version is version('4', '<')
# DELETE BGP peer
- name: delete BGP peer
- aci_l3out_bgp_peer:
+ cisco.aci.aci_l3out_bgp_peer:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -1491,36 +1493,170 @@
register: remove_vpc_bgp_peer
- name: verify remove_vpc_bgp_peer
- assert:
+ ansible.builtin.assert:
that:
- remove_vpc_bgp_peer is changed
- remove_vpc_bgp_peer.current == []
- remove_vpc_bgp_peer.previous.0.bgpPeerP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]/peerP-[192.168.50.2]"
- remove_vpc_bgp_peer.previous.0.bgpPeerP.attributes.addr == "192.168.50.2"
+ # Create BGP Peer with password
+ - name: Create BGP Peer with password
+ aci_l3out_bgp_peer: &bgp_peer_with_password
+ <<: *aci_info
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ node_profile: ansible_node_profile
+ interface_profile: ansible_interface_profile
+ pod_id: 1
+ node_id: 201-202
+ path_ep: ansible_vpc_ipg
+ peer_ip: 192.168.50.2
+ description: ansible_test_description
+ bgp_password: ansible_test_password
+ remote_asn: 65450
+ local_as_number: 65460
+ bgp_controls:
+ - send-com
+ transport_data_plane: mpls
+ state: present
+ register: create_with_password
+
+ - name: Update BGP Peer to remove remote as and local as number
+ aci_l3out_bgp_peer:
+ <<: *bgp_peer_with_password
+ remote_asn: 0
+ local_as_number: 0
+ state: present
+ register: update_remove_remote_local_as
+
+ - name: Asser that BGP Peer with password, remote as and local as
+ assert:
+ that:
+ - create_with_password is changed
+ - create_with_password.previous == []
+ - create_with_password.current.0.bgpPeerP.attributes.password is not defined
+ - create_with_password.current.0.bgpPeerP.children.0.bgpLocalAsnP.attributes.localAsn == "65460"
+ - create_with_password.current.0.bgpPeerP.children.2.bgpAsP.attributes.asn == "65450"
+ - update_remove_remote_local_as is changed
+ - update_remove_remote_local_as.previous != []
+ - update_remove_remote_local_as.current.0.bgpPeerP.children | length == 1
+ - update_remove_remote_local_as.current.0.bgpPeerP.children.0.bgpLocalAsnP is not defined
+ - update_remove_remote_local_as.current.0.bgpPeerP.children.0.bgpAsP is not defined
+
+ - name: Execute tasks only for ACI v5+ because SR MPLS L3Out is not supported lower versions
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ block:
+
+ - name: Create l3out in infra tenant
+ aci_l3out: &aci_infra_l3out
+ <<: *aci_info
+ tenant: infra
+ name: ansible_infra_l3out
+ vrf: overlay-1
+ mpls: yes
+ domain: ansible_domain
+ route_control: export
+ l3protocol: bgp
+ state: present
+
+ - name: Create l3out logical node profile in infra tenant
+ aci_l3out_logical_node_profile:
+ <<: *aci_info
+ tenant: infra
+ l3out: ansible_infra_l3out
+ node_profile: ansible_infra_l3out_node_profile
+ state: present
+
+ - name: Create Infra BGP Peer with password
+ aci_l3out_bgp_peer: &infra_bgp_peer
+ <<: *aci_info
+ tenant: infra
+ l3out: ansible_infra_l3out
+ node_profile: ansible_infra_l3out_node_profile
+ ttl: 2
+ bgp_infra_peer: true
+ bgp_password: ansible_test_password
+ peer_ip: 192.168.50.2
+ remote_asn: 65450
+ local_as_number: 65460
+ peer_type: sr_mpls
+ bgp_controls:
+ - send-domain-path
+ transport_data_plane: sr_mpls
+ bgp_peer_prefix_policy: ansible_peer_prefix_profile
+ state: present
+ register: create_infra_bgp_peer
+
+ - name: Query Infra BGP Peer
+ aci_l3out_bgp_peer:
+ <<: *infra_bgp_peer
+ state: query
+ register: query_infra_bgp_peer
+
+ - name: Query all Infra BGP Peer
+ aci_l3out_bgp_peer:
+ <<: *infra_bgp_peer
+ bgp_infra_peer: true
+ state: query
+ register: query_all_infra_bgp_peer
+
+ - name: Remove Infra BGP Peer
+ aci_l3out_bgp_peer:
+ <<: *infra_bgp_peer
+ state: absent
+ register: remove_infra_bgp_peer
+
+ # CLEAN UP INFRA L3OUT
+ - name: Remove ansible_infra_l3out
+ aci_l3out:
+ <<: *aci_infra_l3out
+ state: absent
+
+ - name: Asser that BGP Peer with password, remote as and local as
+ assert:
+ that:
+ - create_infra_bgp_peer is changed
+ - create_infra_bgp_peer.previous == []
+ - create_infra_bgp_peer.current.0.bgpInfraPeerP.attributes.dn == "uni/tn-infra/out-ansible_infra_l3out/lnodep-ansible_infra_l3out_node_profile/infraPeerP-[192.168.50.2]"
+ - create_infra_bgp_peer.current.0.bgpInfraPeerP.attributes.peerT == "sr-mpls"
+ - create_infra_bgp_peer.current.0.bgpInfraPeerP.attributes.ctrlExt == "send-domain-path"
+ - create_infra_bgp_peer.current.0.bgpInfraPeerP.children.1.bgpRsPeerPfxPol.attributes.tnBgpPeerPfxPolName == "ansible_peer_prefix_profile"
+ - query_infra_bgp_peer is not changed
+ - query_infra_bgp_peer.current | length == 1
+ - query_infra_bgp_peer.current.0.bgpInfraPeerP.attributes.dn == "uni/tn-infra/out-ansible_infra_l3out/lnodep-ansible_infra_l3out_node_profile/infraPeerP-[192.168.50.2]"
+ - query_all_infra_bgp_peer is not changed
+ - query_all_infra_bgp_peer.current | length >= 1
+ - remove_infra_bgp_peer is changed
+ - remove_infra_bgp_peer.previous.0.bgpInfraPeerP.attributes.dn == "uni/tn-infra/out-ansible_infra_l3out/lnodep-ansible_infra_l3out_node_profile/infraPeerP-[192.168.50.2]"
+ - remove_infra_bgp_peer.previous.0.bgpInfraPeerP.attributes.peerT == "sr-mpls"
+ - remove_infra_bgp_peer.previous.0.bgpInfraPeerP.attributes.ctrlExt == "send-domain-path"
+ - remove_infra_bgp_peer.previous.0.bgpInfraPeerP.children.1.bgpRsPeerPfxPol.attributes.tnBgpPeerPfxPolName == "ansible_peer_prefix_profile"
+ - remove_infra_bgp_peer.current == []
+
# CLEAN UP
- name: Remove ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Remove ansible_l3ext_domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
state: absent
- name: Remove ansible_port_channel_ipg
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
state: absent
- name: Remove ansible_vpc_ipg
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_protocol_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_protocol_profile/tasks/main.yml
index 85b43726c..26d0f436f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_protocol_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_bgp_protocol_profile/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a new l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -50,7 +50,7 @@
state: present
- name: Add a new logical node profile
- aci_l3out_logical_node_profile:
+ cisco.aci.aci_l3out_logical_node_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -59,7 +59,7 @@
state: present
- name: Add a second logical node profile
- aci_l3out_logical_node_profile:
+ cisco.aci.aci_l3out_logical_node_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -68,7 +68,7 @@
state: present
- name: Add a new BGP timers policy
- aci_bgp_timers_policy:
+ cisco.aci.aci_bgp_timers_policy:
<<: *aci_info
tenant: ansible_tenant
bgp_timers_policy: ansible_bgp_timers_policy
@@ -76,7 +76,7 @@
state: present
- name: Add a new BGP protocol profile
- aci_bgp_best_path_policy:
+ cisco.aci.aci_bgp_best_path_policy:
<<: *aci_info
tenant: ansible_tenant
bgp_best_path_policy: ansible_bgp_best_path_policy
@@ -84,7 +84,7 @@
state: present
- name: Add a BGP protocol profile (check_mode)
- aci_l3out_bgp_protocol_profile: &aci_l3out_bgp_protocol_profile_present
+ cisco.aci.aci_l3out_bgp_protocol_profile: &aci_l3out_bgp_protocol_profile_present
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -96,17 +96,17 @@
register: cm_add_bgp_protocol_profile
- name: Add a BGP protocol profile (normal_mode)
- aci_l3out_bgp_protocol_profile:
+ cisco.aci.aci_l3out_bgp_protocol_profile:
<<: *aci_l3out_bgp_protocol_profile_present
register: nm_add_bgp_protocol_profile
- name: Add the first BGP protocol profile again - testing idempotency
- aci_l3out_bgp_protocol_profile:
+ cisco.aci.aci_l3out_bgp_protocol_profile:
<<: *aci_l3out_bgp_protocol_profile_present
register: nm_add_bgp_protocol_profile_idempotency
- name: Add a second BGP protocol profile (normal_mode)
- aci_l3out_bgp_protocol_profile:
+ cisco.aci.aci_l3out_bgp_protocol_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -115,7 +115,7 @@
register: nm_add_bgp_protocol_profile_2
- name: Asserts for BGP protocol profiles creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_bgp_protocol_profile is changed
- cm_add_bgp_protocol_profile.previous == []
@@ -128,19 +128,19 @@
- nm_add_bgp_protocol_profile_2.previous == []
- name: Query all BGP best path policies
- aci_l3out_bgp_protocol_profile:
+ cisco.aci.aci_l3out_bgp_protocol_profile:
<<: *aci_info
state: query
register: query_all_bgp_protocol_profile
- name: Query ansible_bgp_protocol_profile_1
- aci_l3out_bgp_protocol_profile:
+ cisco.aci.aci_l3out_bgp_protocol_profile:
<<: *aci_l3out_bgp_protocol_profile_present
state: query
register: query_ansible_bgp_protocol_profile_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_bgp_protocol_profile is not changed
- query_all_bgp_protocol_profile.current|length >= 2
@@ -151,24 +151,24 @@
- query_ansible_bgp_protocol_profile_1.current.0.bgpProtP.children.1.bgpRsBgpNodeCtxPol.attributes.state == "formed"
- name: Remove BGP protocol profile (check_mode)
- aci_l3out_bgp_protocol_profile: &bgp_protocol_profile_absent
+ cisco.aci.aci_l3out_bgp_protocol_profile: &bgp_protocol_profile_absent
<<: *aci_l3out_bgp_protocol_profile_present
state: absent
check_mode: true
register: cm_remove_bgp_protocol_profile
- name: Remove BGP protocol profile (normal_mode)
- aci_l3out_bgp_protocol_profile:
+ cisco.aci.aci_l3out_bgp_protocol_profile:
<<: *bgp_protocol_profile_absent
register: nm_remove_bgp_protocol_profile
- name: Remove BGP protocol profile - testing idempotency
- aci_l3out_bgp_protocol_profile:
+ cisco.aci.aci_l3out_bgp_protocol_profile:
<<: *bgp_protocol_profile_absent
register: nm_remove_bgp_protocol_profile_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_bgp_protocol_profile is changed
- cm_remove_bgp_protocol_profile.proposed == {}
@@ -179,6 +179,6 @@
- nm_remove_bgp_protocol_profile_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/tasks/main.yml
new file mode 100644
index 000000000..5b34dadf1
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_dhcp_relay_label/tasks/main.yml
@@ -0,0 +1,242 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add new Domain
+ cisco.aci.aci_domain: &aci_domain_present
+ <<: *aci_info
+ domain: ansible_dom
+ domain_type: l3dom
+ state: present
+
+ - name: Addd a new VRF
+ cisco.aci.aci_vrf: &aci_vrf_present
+ <<: *aci_tenant_present
+ vrf: ansible_vrf
+ description: Ansible VRF
+
+ - name: Add a new L3Out
+ cisco.aci.aci_l3out: &aci_l3out_present
+ <<: *aci_vrf_present
+ l3out: ansible_l3out
+ domain: ansible_dom
+ route_control: export
+ l3protocol: eigrp
+ asn: 1
+ description: Ansible L3Out
+
+ - name: Add a new L3Out logical node profile
+ cisco.aci.aci_l3out_logical_node_profile: &aci_l3out_node_profile_present
+ <<: *aci_tenant_present
+ l3out: ansible_l3out
+ node_profile: ansible_l3out_node_profile
+ description: Ansible L3Out Logical Node Profile
+
+ - name: Add a new L3Out logical interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_interface_profile_present
+ <<: *aci_l3out_node_profile_present
+ interface_profile: ansible_l3out_interface_profile
+ description: First Ansible L3Out Logical Interface Profile
+
+ - name: Add a new DHCP relay policy in infra
+ cisco.aci.aci_dhcp_relay:
+ <<: *aci_info
+ relay_policy: ansible_dhcp_relay_policy_infra
+ description: Ansible DHCP Relay Policy in infra
+ state: present
+
+ - name: Add a new DHCP relay policy in ansible tenant
+ cisco.aci.aci_dhcp_relay:
+ <<: *aci_tenant_present
+ relay_policy: ansible_dhcp_relay_policy_tenant
+ description: Ansible DHCP Relay Policy in tenant
+ state: present
+
+ - name: Add a new DHCP option policy
+ cisco.aci.aci_dhcp_option_policy:
+ <<: *aci_tenant_present
+ dhcp_option_policy: ansible_dhcp_option_policy
+ description: Ansible DHCP Option Policy
+ state: present
+
+ - name: Add L3Out DHCP Relay Label to first interface profile (check mode)
+ cisco.aci.aci_l3out_dhcp_relay_label: &aci_l3out_dhcp_relay_label_present
+ <<: *aci_l3out_interface_profile_present
+ dhcp_relay_label: ansible_dhcp_relay_policy_tenant
+ scope: tenant
+ dhcp_option_policy: ansible_dhcp_option_policy
+ description: First Ansible DHCP Relay Label
+ check_mode: true
+ register: cm_add_l3out_dhcp_relay_label
+
+ - name: Add L3Out DHCP Relay Label to first interface profile (normal mode)
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_l3out_dhcp_relay_label_present
+ register: nm_add_l3out_dhcp_relay_label
+
+ - name: Add L3Out DHCP relay label to first interface profile again - testing idempotency
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_l3out_dhcp_relay_label_present
+ register: nm_add_l3out_dhcp_relay_label_idempotency
+
+ - name: Create a second L3Out logical interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_interface_profile_present_2
+ <<: *aci_l3out_node_profile_present
+ interface_profile: ansible_l3out_interface_profile_2
+ description: Second Ansible L3Out Logical Interface Profile
+
+ - name: Add L3Out DHCP Relay Label to second interface profile (normal_mode)
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_l3out_interface_profile_present_2
+ dhcp_relay_label: ansible_dhcp_relay_policy_infra
+ description: Second Ansible DHCP Relay Label
+ state: present
+ register: nm_add_l3out_dhcp_relay_label_2
+
+ - name: Asserts for DHCP relay labels creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_l3out_dhcp_relay_label is changed
+ - cm_add_l3out_dhcp_relay_label.previous == []
+ - cm_add_l3out_dhcp_relay_label.current == []
+ - nm_add_l3out_dhcp_relay_label is changed
+ - nm_add_l3out_dhcp_relay_label.current.0.dhcpLbl.attributes.name == "ansible_dhcp_relay_policy_tenant"
+ - nm_add_l3out_dhcp_relay_label.current.0.dhcpLbl.attributes.owner == "tenant"
+ - nm_add_l3out_dhcp_relay_label.current.0.dhcpLbl.children.0.dhcpRsDhcpOptionPol.attributes.tnDhcpOptionPolName == "ansible_dhcp_option_policy"
+ - nm_add_l3out_dhcp_relay_label_idempotency is not changed
+ - nm_add_l3out_dhcp_relay_label_2 is changed
+ - nm_add_l3out_dhcp_relay_label_2.previous == []
+ - nm_add_l3out_dhcp_relay_label_2.current.0.dhcpLbl.attributes.name == "ansible_dhcp_relay_policy_infra"
+ - nm_add_l3out_dhcp_relay_label_2.current.0.dhcpLbl.attributes.owner == "infra"
+
+ - name: Query all l3Out DHCP relay labels
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_info
+ state: query
+ register: query_all_l3out_dhcp_relay_label
+
+ - name: Query first L3Out DHCP relay label
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_l3out_dhcp_relay_label_present
+ state: query
+ register: query_ansible_l3out_dhcp_relay_label_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_l3out_dhcp_relay_label is not changed
+ - query_all_l3out_dhcp_relay_label.current|length >= 2
+ - query_ansible_l3out_dhcp_relay_label_1 is not changed
+ - query_ansible_l3out_dhcp_relay_label_1.current.0.dhcpLbl.attributes.name == "ansible_dhcp_relay_policy_tenant"
+ - query_ansible_l3out_dhcp_relay_label_1.current.0.dhcpLbl.attributes.owner == "tenant"
+ - query_ansible_l3out_dhcp_relay_label_1.current.0.dhcpLbl.children.0.dhcpRsDhcpOptionPol.attributes.tnDhcpOptionPolName == "ansible_dhcp_option_policy"
+
+ - name: Update first L3out DHCP relay label by deleting current DHCP options (check_mode)
+ cisco.aci.aci_l3out_dhcp_relay_label: &aci_l3out_dhcp_relay_label_update
+ <<: *aci_l3out_dhcp_relay_label_present
+ dhcp_option_policy: ""
+ check_mode: true
+ register: cm_update_l3out_dhcp_relay_label
+
+ - name: Update first L3out DHCP relay label by deleting current DHCP options (normal_mode)
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_l3out_dhcp_relay_label_update
+ register: nm_update_l3out_dhcp_relay_label
+
+ - name: Update first L3out DHCP relay label by deleting current DHCP options again - testing idempotency
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_l3out_dhcp_relay_label_update
+ register: nm_update_l3out_dhcp_relay_label_idempotency
+
+ - name: Query updated first L3Out DHCP relay label
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *aci_l3out_dhcp_relay_label_update
+ state: query
+ register: query_ansible_l3out_dhcp_relay_label_1_updated
+
+ - name: Asserts for DHCP relay labels update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_l3out_dhcp_relay_label is changed
+ - cm_update_l3out_dhcp_relay_label.previous == cm_update_l3out_dhcp_relay_label.current
+ - nm_update_l3out_dhcp_relay_label is changed
+ - nm_update_l3out_dhcp_relay_label.current.0.dhcpLbl.children.0.dhcpRsDhcpOptionPol.attributes.tnDhcpOptionPolName == ""
+ - nm_update_l3out_dhcp_relay_label_idempotency is not changed
+ - query_ansible_l3out_dhcp_relay_label_1_updated is not changed
+ - query_ansible_l3out_dhcp_relay_label_1_updated.current.0.dhcpLbl.children.0.dhcpRsDhcpOptionPol.attributes.tDn == "uni/tn-common/dhcpoptpol-default"
+ - query_ansible_l3out_dhcp_relay_label_1_updated.current.0.dhcpLbl.children.0.dhcpRsDhcpOptionPol.attributes.tnDhcpOptionPolName == ""
+
+ - name: Remove L3Out DHCP relay label from interface profile (check_mode)
+ cisco.aci.aci_l3out_dhcp_relay_label: &l3out_dhcp_relay_label_absent
+ <<: *aci_l3out_dhcp_relay_label_update
+ state: absent
+ check_mode: true
+ register: cm_remove_l3out_dhcp_relay_label
+
+ - name: Remove L3Out DHCP relay label from interface profile (normal_mode)
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *l3out_dhcp_relay_label_absent
+ register: nm_remove_l3out_dhcp_relay_label
+
+ - name: Remove L3Out DHCP relay label from interface profile - testing idempotency
+ cisco.aci.aci_l3out_dhcp_relay_label:
+ <<: *l3out_dhcp_relay_label_absent
+ register: nm_remove_l3out_dhcp_relay_label_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_l3out_dhcp_relay_label is changed
+ - cm_remove_l3out_dhcp_relay_label.proposed == {}
+ - nm_remove_l3out_dhcp_relay_label is changed
+ - nm_remove_l3out_dhcp_relay_label.previous != []
+ - nm_remove_l3out_dhcp_relay_label.method == "DELETE"
+ - nm_remove_l3out_dhcp_relay_label_idempotency is not changed
+ - nm_remove_l3out_dhcp_relay_label_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
+
+ - name: Remove the ansible_dom - cleanup before ending tests
+ cisco.aci.aci_domain:
+ <<: *aci_domain_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/tasks/main.yml
new file mode 100644
index 000000000..8607897b1
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_eigrp_interface_profile/tasks/main.yml
@@ -0,0 +1,224 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add new Domain
+ cisco.aci.aci_domain: &aci_domain_present
+ <<: *aci_info
+ domain: ansible_dom
+ domain_type: l3dom
+ state: present
+
+ - name: Addd a new VRF
+ cisco.aci.aci_vrf: &aci_vrf_present
+ <<: *aci_tenant_present
+ vrf: ansible_vrf
+ description: Ansible VRF
+
+ - name: Add a new L3Out
+ cisco.aci.aci_l3out: &aci_l3out_present
+ <<: *aci_vrf_present
+ l3out: ansible_l3out
+ domain: ansible_dom
+ route_control: export
+ l3protocol: eigrp
+ asn: 1
+ description: Ansible L3Out
+
+ - name: Add a new L3Out logical node profile
+ cisco.aci.aci_l3out_logical_node_profile: &aci_l3out_node_profile_present
+ <<: *aci_tenant_present
+ l3out: ansible_l3out
+ node_profile: ansible_l3out_node_profile
+ description: Ansible L3Out Logical Node Profile
+
+ - name: Add a new L3Out logical interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_interface_profile_present
+ <<: *aci_l3out_node_profile_present
+ interface_profile: ansible_l3out_interface_profile
+ description: First Ansible L3Out Logical Interface Profile
+
+ - name: Add a new eigrp interface policy
+ cisco.aci.aci_interface_policy_eigrp:
+ <<: *aci_tenant_present
+ eigrp: ansible_eigrp_interface_policy
+ description: Ansible EIGRP Interface Policy
+ state: present
+
+ - name: Add a new keychain policy
+ cisco.aci.aci_keychain_policy:
+ <<: *aci_tenant_present
+ keychain_policy: ansible_keychain_policy
+ description: Ansible Keychain Policy
+ state: present
+
+ - name: Add eigrp policy to first interface profile (check mode)
+ cisco.aci.aci_l3out_eigrp_interface_profile: &aci_l3out_eigrp_interface_profile_present
+ <<: *aci_l3out_interface_profile_present
+ eigrp_policy: ansible_eigrp_interface_policy
+ eigrp_keychain_policy: ansible_keychain_policy
+ description: First Ansible EIGRP Interface Profile
+ check_mode: true
+ register: cm_add_l3out_eigrp_interface_profile
+
+ - name: Add eigrp policy to first interface profile (normal mode)
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *aci_l3out_eigrp_interface_profile_present
+ register: nm_add_l3out_eigrp_interface_profile
+
+ - name: Add eigrp interface profile again - testing idempotency
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *aci_l3out_eigrp_interface_profile_present
+ register: nm_add_l3out_eigrp_interface_profile_idempotency
+
+ - name: Create a second L3Out logical interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_interface_profile_present_2
+ <<: *aci_l3out_node_profile_present
+ interface_profile: ansible_l3out_interface_profile_2
+ description: Second Ansible L3Out Logical Interface Profile
+
+ - name: Add eigrp policy to second interface profile (normal_mode)
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *aci_l3out_interface_profile_present_2
+ eigrp_policy: ansible_eigrp_interface_policy
+ description: Second Ansible EIGRP Interface Profile
+ state: present
+ register: nm_add_l3out_eigrp_interface_profile_2
+
+ - name: Asserts for eigrp interface policies creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_l3out_eigrp_interface_profile is changed
+ - cm_add_l3out_eigrp_interface_profile.previous == []
+ - cm_add_l3out_eigrp_interface_profile.current == []
+ - nm_add_l3out_eigrp_interface_profile is changed
+ - nm_add_l3out_eigrp_interface_profile.current.0.eigrpIfP.children.0.eigrpAuthIfP.children.0.eigrpRsKeyChainPol.attributes.tnFvKeyChainPolName == "ansible_keychain_policy"
+ - nm_add_l3out_eigrp_interface_profile.current.0.eigrpIfP.children.1.eigrpRsIfPol.attributes.tnEigrpIfPolName == "ansible_eigrp_interface_policy"
+ - nm_add_l3out_eigrp_interface_profile_idempotency is not changed
+ - nm_add_l3out_eigrp_interface_profile_2 is changed
+ - nm_add_l3out_eigrp_interface_profile_2.previous == []
+ - nm_add_l3out_eigrp_interface_profile_2.current.0.eigrpIfP.children.0.eigrpRsIfPol.attributes.tnEigrpIfPolName == "ansible_eigrp_interface_policy"
+
+ - name: Query all eigrp interface profiles
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *aci_info
+ state: query
+ register: query_all_l3out_eigrp_interface_profile
+
+ - name: Query first eigrp interface profile
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *aci_l3out_eigrp_interface_profile_present
+ state: query
+ register: query_ansible_l3out_eigrp_interface_profile_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_l3out_eigrp_interface_profile is not changed
+ - query_all_l3out_eigrp_interface_profile.current|length >= 2
+ - query_ansible_l3out_eigrp_interface_profile_1 is not changed
+ - query_ansible_l3out_eigrp_interface_profile_1.current.0.eigrpIfP.children.0.eigrpAuthIfP.children.0.eigrpRsKeyChainPol.attributes.tDn == "uni/tn-ansible_tenant/keychainp-ansible_keychain_policy"
+ - query_ansible_l3out_eigrp_interface_profile_1.current.0.eigrpIfP.children.0.eigrpAuthIfP.children.0.eigrpRsKeyChainPol.attributes.state == "formed"
+ - query_ansible_l3out_eigrp_interface_profile_1.current.0.eigrpIfP.children.1.eigrpRsIfPol.attributes.tDn == "uni/tn-ansible_tenant/eigrpIfPol-ansible_eigrp_interface_policy"
+ - query_ansible_l3out_eigrp_interface_profile_1.current.0.eigrpIfP.children.1.eigrpRsIfPol.attributes.state == "formed"
+
+ - name: Remove authentification from first eigrp interface profile (check mode)
+ cisco.aci.aci_l3out_eigrp_interface_profile: &aci_l3out_eigrp_interface_profile_remove_auth
+ <<: *aci_l3out_eigrp_interface_profile_present
+ eigrp_keychain_policy: ""
+ check_mode: true
+ register: cm_remove_auth_l3out_eigrp_interface_profile
+
+ - name: Remove authentification from first eigrp interface profile (normal mode)
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *aci_l3out_eigrp_interface_profile_remove_auth
+ register: nm_remove_auth_l3out_eigrp_interface_profile
+
+ - name: Remove authentification from first eigrp interface profile again - testing idempotency
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *aci_l3out_eigrp_interface_profile_remove_auth
+ register: nm_remove_auth_eigrp_interface_profile_idempotency
+
+ - name: Asserts authentification removal tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_auth_l3out_eigrp_interface_profile is changed
+ - cm_remove_auth_l3out_eigrp_interface_profile.current == cm_remove_auth_l3out_eigrp_interface_profile.previous
+ - nm_remove_auth_l3out_eigrp_interface_profile is changed
+ - nm_remove_auth_l3out_eigrp_interface_profile.current.0.eigrpIfP.children|length == 1
+ - nm_remove_auth_eigrp_interface_profile_idempotency is not changed
+
+ - name: Remove eigrp interface profile (check_mode)
+ cisco.aci.aci_l3out_eigrp_interface_profile: &l3out_eigrp_interface_profile_absent
+ <<: *aci_l3out_eigrp_interface_profile_present
+ state: absent
+ check_mode: true
+ register: cm_remove_l3out_eigrp_interface_profile
+
+ - name: Remove eigrp interface profile (normal_mode)
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *l3out_eigrp_interface_profile_absent
+ register: nm_remove_l3out_eigrp_interface_profile
+
+ - name: Remove eigrp interface profile - testing idempotency
+ cisco.aci.aci_l3out_eigrp_interface_profile:
+ <<: *l3out_eigrp_interface_profile_absent
+ register: nm_remove_l3out_eigrp_interface_profile_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_l3out_eigrp_interface_profile is changed
+ - cm_remove_l3out_eigrp_interface_profile.proposed == {}
+ - nm_remove_l3out_eigrp_interface_profile is changed
+ - nm_remove_l3out_eigrp_interface_profile.previous != []
+ - nm_remove_l3out_eigrp_interface_profile.method == "DELETE"
+ - nm_remove_l3out_eigrp_interface_profile_idempotency is not changed
+ - nm_remove_l3out_eigrp_interface_profile_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
+
+ - name: Remove the ansible_dom - cleanup before ending tests
+ cisco.aci.aci_domain:
+ <<: *aci_domain_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg/tasks/main.yml
index d52fb5ef4..61291cb6a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg/tasks/main.yml
@@ -29,7 +29,7 @@
block:
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg_to_contract/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg_to_contract/tasks/main.yml
index c49475d0a..d8437c522 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg_to_contract/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extepg_to_contract/tasks/main.yml
@@ -1,15 +1,16 @@
# Test code for the ACI modules
# Copyright: (c) 2020, Shreyas Srish (@shrsr)
+# Copyright: (c) 2023, Akini Ross (@akinross)
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
-- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,28 +22,35 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
- <<: *aci_info
- tenant: ansible_tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_test
state: absent
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
- tenant: ansible_tenant
+ tenant: ansible_test
description: Ansible tenant
state: present
- name: Add a new l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
- tenant: ansible_tenant
+ tenant: ansible_test
name: ansible_l3out
description: l3out for Ansible tenant
domain: ansible_dom
@@ -52,91 +60,202 @@
state: present
- name: Add a new ExtEpg
- aci_l3out_extepg:
+ cisco.aci.aci_l3out_extepg:
<<: *aci_info
- tenant: ansible_tenant
+ tenant: ansible_test
l3out: ansible_l3out
name: ansible_extEpg
description: ExtEpg for Ansible l3out
state: present
-
- - name: Bind External End Point Groups to Contracts
- aci_l3out_extepg_to_contract:
+
+ - name: Bind External End Point Groups to Contracts (check-mode)
+ cisco.aci.aci_l3out_extepg_to_contract: &aci_ext_epg_present
<<: *aci_info
- tenant: ansible_tenant
+ tenant: ansible_test
l3out: ansible_l3out
extepg: ansible_extEpg
contract: ansible_contract
contract_type: provider
state: present
- register: bind_extepg_provider_contract
+ register: cm_bind_extepg_provider_contract
+ check_mode: true
+
+ - name: Bind External End Point Groups to Contracts
+ aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_present
+ register: nm_bind_extepg_provider_contract
+
+ - name: Bind External End Point Groups to Contracts again
+ aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_present
+ register: nm_bind_extepg_provider_contract_again
- name: Verify bind_extepg_provider_contract
- assert:
+ ansible.builtin.assert:
that:
- - bind_extepg_provider_contract.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
- - bind_extepg_provider_contract.current.0.fvRsProv.attributes.annotation == 'orchestrator:ansible'
+ - cm_bind_extepg_provider_contract is changed
+ - cm_bind_extepg_provider_contract.previous == []
+ - cm_bind_extepg_provider_contract.proposed.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - cm_bind_extepg_provider_contract.proposed.fvRsProv.attributes.annotation == "orchestrator:ansible"
+ - cm_bind_extepg_provider_contract.proposed.fvRsProv.attributes.tnVzBrCPName == "ansible_contract"
+ - nm_bind_extepg_provider_contract is changed
+ - nm_bind_extepg_provider_contract.previous == []
+ - nm_bind_extepg_provider_contract.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - nm_bind_extepg_provider_contract.current.0.fvRsProv.attributes.annotation == "orchestrator:ansible"
+ - nm_bind_extepg_provider_contract.current.0.fvRsProv.attributes.tnVzBrCPName == "ansible_contract"
+ - nm_bind_extepg_provider_contract_again is not changed
+ - nm_bind_extepg_provider_contract_again.previous.0.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - nm_bind_extepg_provider_contract_again.previous.0.fvRsProv.attributes.annotation == "orchestrator:ansible"
+ - nm_bind_extepg_provider_contract_again.previous.0.fvRsProv.attributes.tnVzBrCPName == "ansible_contract"
+ - nm_bind_extepg_provider_contract_again.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - nm_bind_extepg_provider_contract_again.current.0.fvRsProv.attributes.annotation == "orchestrator:ansible"
+ - nm_bind_extepg_provider_contract_again.current.0.fvRsProv.attributes.tnVzBrCPName == "ansible_contract"
- - name: Bind second External End Point Groups to Contracts
- aci_l3out_extepg_to_contract:
+ - name: Bind second External End Point Groups to Contracts with contract label and subject label
+ cisco.aci.aci_l3out_extepg_to_contract:
<<: *aci_info
- tenant: ansible_tenant
+ tenant: ansible_test
l3out: ansible_l3out
extepg: ansible_extEpg
contract: ansible_contract2
contract_type: provider
+ contract_label: anstest_contract_label
+ subject_label: anstest_subject_label
state: present
register: bind_extepg_provider_contract_2
- name: Verify bind_extepg_provider_contract_2
- assert:
+ ansible.builtin.assert:
that:
- - bind_extepg_provider_contract_2.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract2"
+ - bind_extepg_provider_contract_2.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract2"
+ - bind_extepg_provider_contract_2.current.0.fvRsProv.attributes.tnVzBrCPName == "ansible_contract2"
+ - bind_extepg_provider_contract_2.current.0.fvRsProv.children.0.vzProvSubjLbl.attributes.name == "anstest_subject_label"
+ - bind_extepg_provider_contract_2.current.0.fvRsProv.children.1.vzProvLbl.attributes.name == "anstest_contract_label"
+ - bind_extepg_provider_contract_2.current.0.fvRsProv.children | length == 2
- - name: Query the External End Point Groups
- aci_l3out_extepg_to_contract:
- <<: *aci_info
- tenant: ansible_tenant
- l3out: ansible_l3out
- extepg: ansible_extEpg
+ - name: Bind taboo contract to external epg
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_present
contract: ansible_contract
- contract_type: provider
- state: query
- register: query_extepg
+ contract_type: taboo
+ register: taboo_present
- - name: Verify query_extepg
- assert:
+ - name: Bind interface contract to external epg
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_present
+ contract: ansible_contract
+ contract_type: interface
+ register: interface_present
+
+ - name: Bind intra epg contract to external epg
+ cisco.aci.aci_l3out_extepg_to_contract: &aci_ext_epg_intra_present
+ <<: *aci_ext_epg_present
+ contract: ansible_contract
+ contract_type: intra_epg
+ register: intra_epg_present
+ when: version.current.0.topSystem.attributes.version is version('5', '>=') # This condition will execute only for APIC version 5.x and above
+
+ - name: Bind intra epg contract to external epg (error contract label)
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_intra_present
+ contract_label: anstest_contract_label
+ ignore_errors: true
+ register: err_contract_label
+
+ - name: Bind intra epg contract to external epg (error subject label)
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_intra_present
+ subject_label: anstest_subject_label
+ ignore_errors: true
+ register: err_subject_label
+
+ - name: Bind intra epg contract to external epg (error subject and contract label)
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_intra_present
+ contract_label: anstest_contract_label
+ subject_label: anstest_subject_label
+ ignore_errors: true
+ register: err_subject_and_contract_label
+
+ - name: Verify present assertions for taboo, interface and intra_epg contract types
+ ansible.builtin.assert:
that:
- - query_extepg is not changed
- - query_extepg.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - taboo_present is changed
+ - taboo_present.previous == []
+ - taboo_present.current.0.fvRsProtBy.attributes.tnVzTabooName == 'ansible_contract'
+ - interface_present is changed
+ - interface_present.previous == []
+ - interface_present.current.0.fvRsConsIf.attributes.tnVzCPIfName == 'ansible_contract'
+ - err_contract_label is failed
+ - err_contract_label.msg == "the 'contract_label' and 'subject_label' are not configurable for intra_epg contracts"
+ - err_subject_label is failed
+ - err_subject_label.msg == "the 'contract_label' and 'subject_label' are not configurable for intra_epg contracts"
+ - err_subject_and_contract_label is failed
+ - err_subject_and_contract_label.msg == "the 'contract_label' and 'subject_label' are not configurable for intra_epg contracts"
+
+ - name: Verify present assertions for taboo, interface and intra_epg contract types
+ ansible.builtin.assert:
+ that:
+ - intra_epg_present is changed
+ - intra_epg_present.previous == []
+ - intra_epg_present.current.0.fvRsIntraEpg.attributes.tnVzBrCPName == 'ansible_contract'
+ when: version.current.0.topSystem.attributes.version is version('5', '>=') # This condition will execute only for APIC version 5.x and above
+
+ - name: Query the External End Point Groups
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_present
+ state: query
+ register: query_extepg
- name: Query all the External End Point Groups
- aci_l3out_extepg_to_contract:
+ cisco.aci.aci_l3out_extepg_to_contract:
<<: *aci_info
contract_type: provider
state: query
register: query_all
- - name: Remove existing contract to External End Point Groups
- aci_l3out_extepg_to_contract:
- <<: *aci_info
- tenant: ansible_tenant
- l3out: ansible_l3out
- extepg: ansible_extEpg
- contract: ansible_contract
- contract_type: provider
+ - name: Verify query_extepg
+ ansible.builtin.assert:
+ that:
+ - query_extepg is not changed
+ - query_extepg.current | length == 1
+ - query_extepg.current.0.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - query_all is not changed
+ - query_all.current | length >= 1
+
+ - name: Remove existing contract to External End Point Groups (check-mode)
+ aci_l3out_extepg_to_contract: &aci_ext_epg_absent
+ <<: *aci_ext_epg_present
state: absent
- register: remove_contract_extepg
+ register: cm_remove_contract_extepg
+ check_mode: true
+
+ - name: Remove existing contract to External End Point Groups
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_absent
+ register: nm_remove_contract_extepg
+
+ - name: Remove existing contract to External End Point Groups again
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_ext_epg_absent
+ register: nm_remove_contract_extepg_again
- name: Verify remove_contract_extepg
- assert:
+ ansible.builtin.assert:
that:
- - remove_contract_extepg.previous.0.fvRsProv.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - cm_remove_contract_extepg is changed
+ - cm_remove_contract_extepg.previous.0.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - nm_remove_contract_extepg is changed
+ - nm_remove_contract_extepg.previous.0.fvRsProv.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/instP-ansible_extEpg/rsprov-ansible_contract"
+ - nm_remove_contract_extepg.current == []
+ - nm_remove_contract_extepg_again is not changed
+ - nm_remove_contract_extepg_again.previous == []
+ - nm_remove_contract_extepg_again.current == []
- name: Bind External End Point Groups to Contracts
- aci_l3out_extepg_to_contract:
+ cisco.aci.aci_l3out_extepg_to_contract:
<<: *aci_info
- tenant: ansible_tenant
+ tenant: ansible_test
l3out: ansible_l3out
extepg: ansible_extEpg
contract: ansible_contract
@@ -147,6 +266,13 @@
register: bind_extepg_consumer_contract
- name: Verify bind_extepg_consumer_contract
- assert:
+ ansible.builtin.assert:
that:
- - bind_extepg_consumer_contract.msg == "the 'provider_match' is only configurable for Provided Contracts" \ No newline at end of file
+ - bind_extepg_consumer_contract.msg == "the 'provider_match' is only configurable for Provided Contracts"
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extsubnet/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extsubnet/tasks/main.yml
index 4be8a65f7..be15031db 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extsubnet/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_extsubnet/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a new l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
name: ansible_l3out
@@ -52,7 +52,7 @@
state: present
- name: Add a new ExtEpg
- aci_l3out_extepg:
+ cisco.aci.aci_l3out_extepg:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -84,7 +84,7 @@
register: nm_add_subnet
- name: Verify cm_add_subnet and nm_add_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_add_subnet is changed
- nm_add_subnet is changed
@@ -107,7 +107,7 @@
register: nm_add_subnet_again
- name: Verify nm_add_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_again is not changed
@@ -139,7 +139,7 @@
register: nm_change_subnet
- name: Verify cm_change_subnet and nm_change_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_change_subnet is changed
- nm_change_subnet is changed
@@ -164,7 +164,7 @@
register: nm_add_another_subnet
- name: Verify nm_add_another_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_add_another_subnet is changed
- nm_add_another_subnet.current.0.l3extSubnet.attributes.ip == "192.1.2.0/24"
@@ -189,7 +189,7 @@
register: query_subnet
- name: Verify query_all and query_subnet
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_subnet is not changed
@@ -208,7 +208,7 @@
register: rm_subnet
- name: Verify rm_subnet
- assert:
+ ansible.builtin.assert:
that:
- rm_subnet is changed
- rm_subnet.current == []
@@ -230,7 +230,7 @@
ignore_errors: true
- name: asserts failed aggregate creation tasks
- assert:
+ ansible.builtin.assert:
that:
- nm_aggregate_scope_none is failed
- nm_aggregate_scope_none.msg.startswith("missing parameter(s) required by 'aggregate'")
@@ -251,7 +251,7 @@
ignore_errors: true
- name: asserts failed aggregate creation tasks
- assert:
+ ansible.builtin.assert:
that:
- nm_aggregate_scope_mismatch is failed
- nm_aggregate_scope_mismatch.msg == "All aggregate values ['export-rtctrl', 'import-rtctrl'] need to be defined in scope ['import-security']."
@@ -286,7 +286,7 @@
register: nm_aggregate_scope_match
- name: asserts success aggregate creation task
- assert:
+ ansible.builtin.assert:
that:
- cm_aggregate_scope_match is changed
- cm_aggregate_scope_match.proposed.l3extSubnet.attributes.ip == "0.0.0.0/0"
@@ -313,6 +313,6 @@
register: nm_aggregate_scope_match
- name: asserts success aggregate creation task reversed input order
- assert:
+ ansible.builtin.assert:
that:
- nm_aggregate_scope_match is not changed \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/tasks/main.yml
new file mode 100644
index 000000000..5bc0cf78b
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi/tasks/main.yml
@@ -0,0 +1,220 @@
+# Author: Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create domain
+ cisco.aci.aci_domain: &domain_present
+ <<: *aci_info
+ domain: l3outintftest
+ domain_type: l3dom
+ state: present
+
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Configure VRF
+ cisco.aci.aci_vrf: &vrf_present
+ <<: *tenant_present
+ vrf: l3outintftest
+
+ - name: Create L3Out
+ cisco.aci.aci_l3out:
+ <<: *vrf_present
+ l3out: l3outintftest
+ domain: l3outintftest
+ route_control: export
+
+ - name: Create node profile
+ cisco.aci.aci_l3out_logical_node_profile: &np_present
+ <<: *tenant_present
+ l3out: l3outintftest
+ node_profile: nodes
+
+ - name: Add interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &intf_present
+ <<: *np_present
+ interface_profile: Floating
+
+ - name: Create a floating svi in check mode
+ cisco.aci.aci_l3out_floating_svi: &floating_svi
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ address: 23.45.67.90/24
+ external_bridge_group_profile: bridge1
+ state: present
+ check_mode: true
+ register: add_floating_cm
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create a floating svi in normal mode
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *floating_svi
+ state: present
+ register: add_floating_nm
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create a floating svi again
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *floating_svi
+ state: present
+ register: add_floating_again
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Update floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *floating_svi
+ external_bridge_group_profile: bridge2
+ state: present
+ register: update_floating
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Delete an external_bridge_group_profile
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *floating_svi
+ external_bridge_group_profile: ""
+ state: present
+ register: remove_bridge
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create another floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 202
+ encap: vlan-1
+ address: 24.45.67.90/24
+ external_bridge_group_profile: ""
+ state: present
+ register: add_floating2
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create another floating svi with no external_bridge_group_profile
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 203
+ encap: vlan-1
+ address: 25.45.67.90/24
+ state: present
+ register: add_floating3
+
+ - name: Change floating svi with an attempt to delete external_bridge_group_profile
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 203
+ encap: vlan-1
+ address: 25.45.67.90/24
+ external_bridge_group_profile: ""
+ state: present
+ register: change_floating3
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Verify present ops
+ ansible.builtin.assert:
+ that:
+ - add_floating_cm is changed
+ - add_floating_nm is changed
+ - add_floating_again is not changed
+ - update_floating is changed
+ - remove_bridge is changed
+ - add_floating2 is changed
+ - add_floating3 is changed
+ - change_floating3 is not changed
+ - add_floating_cm.proposed.l3extVirtualLIfP.attributes.addr == "23.45.67.90/24"
+ - add_floating_cm.proposed.l3extVirtualLIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-201]-[vlan-1]"
+ - add_floating_cm.proposed.l3extVirtualLIfP.attributes.encap == "vlan-1"
+ - add_floating_cm.proposed.l3extVirtualLIfP.children.0.l3extBdProfileCont.children.0.l3extRsBdProfile.attributes.tDn == "uni/tn-ansible_test/bdprofile-bridge1"
+ - add_floating_nm.current.0.l3extVirtualLIfP.attributes.addr == "23.45.67.90/24"
+ - add_floating_nm.current.0.l3extVirtualLIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-201]-[vlan-1]"
+ - add_floating_nm.current.0.l3extVirtualLIfP.attributes.encap == "vlan-1"
+ - add_floating_nm.current.0.l3extVirtualLIfP.children.0.l3extBdProfileCont.children.0.l3extRsBdProfile.attributes.tDn == "uni/tn-ansible_test/bdprofile-bridge1"
+ - update_floating.current.0.l3extVirtualLIfP.children.0.l3extBdProfileCont.children.0.l3extRsBdProfile.attributes.tDn == "uni/tn-ansible_test/bdprofile-bridge2"
+ - remove_bridge.current.0.l3extVirtualLIfP.children is not defined
+ - add_floating2.current.0.l3extVirtualLIfP.attributes.addr == "24.45.67.90/24"
+ - add_floating2.current.0.l3extVirtualLIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-202]-[vlan-1]"
+ - add_floating2.current.0.l3extVirtualLIfP.attributes.encap == "vlan-1"
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Verify present ops for all versions
+ ansible.builtin.assert:
+ that:
+ - add_floating3 is changed
+ - add_floating3.current.0.l3extVirtualLIfP.attributes.addr == "25.45.67.90/24"
+ - add_floating3.current.0.l3extVirtualLIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-203]-[vlan-1]"
+ - add_floating3.current.0.l3extVirtualLIfP.attributes.encap == "vlan-1"
+ - add_floating3.current.0.l3extVirtualLIfP.children is not defined
+
+ - name: Query a floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *floating_svi
+ state: query
+ register: query_floating
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Query all floating svis
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ state: query
+ register: query_all_floating
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Verify Query ops
+ ansible.builtin.assert:
+ that:
+ - query_floating is not changed
+ - query_all_floating is not changed
+ - query_floating.current.0.l3extVirtualLIfP.attributes.addr == "23.45.67.90/24"
+ - query_floating.current.0.l3extVirtualLIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-201]-[vlan-1]"
+ - query_floating.current.0.l3extVirtualLIfP.attributes.encap == "vlan-1"
+ - query_all_floating.current.0.l3extLIfP.children | length == 3
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Remove a floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *floating_svi
+ state: absent
+ register: remove_floating
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Verify remove ops
+ ansible.builtin.assert:
+ that:
+ - remove_floating is changed
+ - remove_floating.current == []
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Clean up environment
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/tasks/main.yml
new file mode 100644
index 000000000..3ecc01a2e
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path/tasks/main.yml
@@ -0,0 +1,365 @@
+# Author: Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create domain
+ cisco.aci.aci_domain: &domain_present
+ <<: *aci_info
+ domain: l3outintftest
+ domain_type: l3dom
+ state: present
+
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Configure VRF
+ cisco.aci.aci_vrf: &vrf_present
+ <<: *tenant_present
+ vrf: l3outintftest
+
+ - name: Create L3Out
+ cisco.aci.aci_l3out:
+ <<: *vrf_present
+ l3out: l3outintftest
+ domain: l3outintftest
+ route_control: export
+
+ - name: Create node profile
+ cisco.aci.aci_l3out_logical_node_profile: &np_present
+ <<: *tenant_present
+ l3out: l3outintftest
+ node_profile: nodes
+
+ - name: Add interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &intf_present
+ <<: *np_present
+ interface_profile: Floating
+
+ - name: Create a floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ address: 23.45.67.90/24
+ state: present
+
+ - name: Create a floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 202
+ encap: vlan-1
+ address: 26.45.67.90/24
+ state: present
+
+ - name: Add VMM domain
+ cisco.aci.aci_domain:
+ <<: *aci_info
+ domain: vmm_dom
+ domain_type: vmm
+ vm_provider: vmware
+ state: present
+
+ - name: Add a vSwitch policy to vmware domain
+ cisco.aci.aci_vmm_vswitch_policy:
+ <<: *aci_info
+ domain: vmm_dom
+ vm_provider: vmware
+ enhanced_lag:
+ - name: enhanced
+ - name: enhanced2
+ state: present
+
+ - name: Create a floating svi path of type physical in check_mode
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ floating_ip: 25.45.67.90/24
+ access_encap: vlan-1
+ state: present
+ check_mode: true
+ register: add_floating_path_cm
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create a floating svi path of type physical in normal mode
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ floating_ip: 25.45.67.90/24
+ access_encap: vlan-1
+ state: present
+ register: add_floating_path_nm
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create a floating svi path of type physical in normal mode again
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ floating_ip: 25.45.67.90/24
+ access_encap: vlan-1
+ state: present
+ register: add_floating_path_again
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Update a floating svi path of type physical
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ floating_ip: 25.45.67.90/24
+ access_encap: vlan-2
+ state: present
+ register: update_floating_path
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create another floating svi path of type physical
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom2
+ floating_ip: 25.45.67.90/24
+ access_encap: vlan-1
+ state: present
+ register: add_another_floating_path
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create a floating svi path of type virtual
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 202
+ encap: vlan-1
+ domain_type: vmware
+ domain: vmm_dom
+ floating_ip: 27.45.67.90/24
+ forged_transmit: enabled
+ mac_change: enabled
+ promiscuous_mode: enabled
+ enhanced_lag_policy: enhanced
+ state: present
+ register: add_enhanced
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create a floating svi path of type virtual (change enhanced_lag_policy)
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 202
+ encap: vlan-1
+ domain_type: vmware
+ domain: vmm_dom
+ floating_ip: 27.45.67.90/24
+ forged_transmit: enabled
+ mac_change: enabled
+ promiscuous_mode: enabled
+ enhanced_lag_policy: enhanced2
+ state: present
+ register: change_enhanced
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create a floating svi path of type virtual (delete enhanced_lag_policy)
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 202
+ encap: vlan-1
+ domain_type: vmware
+ domain: vmm_dom
+ floating_ip: 27.45.67.90/24
+ forged_transmit: enabled
+ mac_change: enabled
+ promiscuous_mode: enabled
+ enhanced_lag_policy: ""
+ state: present
+ register: del_enhanced
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Verify present ops
+ ansible.builtin.assert:
+ that:
+ - add_floating_path_cm is changed
+ - add_floating_path_nm is changed
+ - add_floating_path_again is not changed
+ - update_floating_path is changed
+ - add_another_floating_path is changed
+ - add_enhanced is changed
+ - change_enhanced is changed
+ - del_enhanced is changed
+ - add_floating_path_nm.current.0.l3extRsDynPathAtt.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-201]-[vlan-1]/rsdynPathAtt-[uni/phys-physical_dom]"
+ - add_floating_path_nm.current.0.l3extRsDynPathAtt.attributes.encap == "vlan-1"
+ - add_floating_path_nm.current.0.l3extRsDynPathAtt.attributes.floatingAddr == "25.45.67.90/24"
+ - update_floating_path.current.0.l3extRsDynPathAtt.attributes.encap == "vlan-2"
+ - add_enhanced.current.0.l3extRsDynPathAtt.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-202]-[vlan-1]/rsdynPathAtt-[uni/vmmp-VMware/dom-vmm_dom]"
+ - add_enhanced.current.0.l3extRsDynPathAtt.attributes.floatingAddr == "27.45.67.90/24"
+ - add_enhanced.current.0.l3extRsDynPathAtt.attributes.forgedTransmit == "Enabled"
+ - add_enhanced.current.0.l3extRsDynPathAtt.attributes.macChange == "Enabled"
+ - add_enhanced.current.0.l3extRsDynPathAtt.attributes.promMode == "Enabled"
+ - add_enhanced.current.0.l3extRsDynPathAtt.children.0.l3extVirtualLIfPLagPolAtt.children.0.l3extRsVSwitchEnhancedLagPol.attributes.tDn == "uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont/enlacplagp-enhanced"
+ - change_enhanced.current.0.l3extRsDynPathAtt.children.0.l3extVirtualLIfPLagPolAtt.children.0.l3extRsVSwitchEnhancedLagPol.attributes.tDn == "uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont/enlacplagp-enhanced2"
+ - add_enhanced.sent.l3extRsDynPathAtt.children.0.l3extVirtualLIfPLagPolAtt.children.0.l3extRsVSwitchEnhancedLagPol.attributes.tDn == "uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont/enlacplagp-enhanced"
+ - change_enhanced.sent.l3extRsDynPathAtt.children.0.l3extVirtualLIfPLagPolAtt.children.0.l3extRsVSwitchEnhancedLagPol.attributes.tDn == "uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont/enlacplagp-enhanced2"
+ - del_enhanced.current.0.l3extRsDynPathAtt.children is not defined
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+# Special Case
+ - name: Create a floating svi path of type virtual with enhanced2 of type l3extRsVSwitchEnhancedLagPol
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 202
+ encap: vlan-1
+ domain_type: vmware
+ domain: vmm_dom
+ floating_ip: 27.45.67.90/24
+ enhanced_lag_policy: enhanced2
+ state: present
+ register: check_v_four
+
+ - name: Delete enhanced2 of type l3extRsVSwitchEnhancedLagPol
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: api/node/mo/uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-202]-[vlan-1]/rsdynPathAtt-[uni/vmmp-VMware/dom-vmm_dom]/vlifplagpolatt/rsvSwitchEnhancedLagPol-[uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont/enlacplagp-enhanced2].json
+ method: post
+ content: |
+ {"l3extRsVSwitchEnhancedLagPol":{"attributes":{"dn":"uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-202]-[vlan-1]/rsdynPathAtt-[uni/vmmp-VMware/dom-vmm_dom]/vlifplagpolatt/rsvSwitchEnhancedLagPol-[uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont/enlacplagp-enhanced2]","status":"deleted"}}}
+
+ - name: Create a floating svi path of type virtual with enhanced2 of type l3extRsVSwitchEnhancedLagPol
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 202
+ encap: vlan-1
+ domain_type: vmware
+ domain: vmm_dom
+ floating_ip: 27.45.67.90/24
+ enhanced_lag_policy: enhanced2
+ state: present
+ register: check_enhanced
+
+ - name: Verify special case
+ ansible.builtin.assert:
+ that:
+ - check_v_four is changed
+ - check_enhanced is changed
+ - check_v_four.current.0.l3extRsDynPathAtt.attributes.floatingAddr == "27.45.67.90/24"
+ - check_enhanced.current.0.l3extRsDynPathAtt.children.0.l3extVirtualLIfPLagPolAtt.children.0.l3extRsVSwitchEnhancedLagPol.attributes.tDn == "uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont/enlacplagp-enhanced2"
+
+ - name: Query a floating svi path
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ state: query
+ register: query_floating
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Query all floating svi paths
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ state: query
+ register: query_all_floating
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Verify query ops
+ ansible.builtin.assert:
+ that:
+ - query_floating is not changed
+ - query_all_floating is not changed
+ - query_floating.current.0.l3extRsDynPathAtt.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-nodes/lifp-Floating/vlifp-[topology/pod-1/node-201]-[vlan-1]/rsdynPathAtt-[uni/phys-physical_dom]"
+ - query_floating.current.0.l3extRsDynPathAtt.attributes.floatingAddr == "25.45.67.90/24"
+ - query_floating.current.0.l3extRsDynPathAtt.attributes.encap == "vlan-2"
+ - query_all_floating.current.0.l3extVirtualLIfP.children | length == 2
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Remove a floating svi path
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ state: absent
+ register: remove_floating_path
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Verify absent ops
+ ansible.builtin.assert:
+ that:
+ - remove_floating_path is changed
+ - remove_floating_path.current == []
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ # Clean up Environment
+ - name: Remove vSwitch Policy
+ cisco.aci.aci_vmm_vswitch_policy:
+ <<: *aci_info
+ domain: vmm_dom
+ vm_provider: vmware
+ state: absent
+
+ - name: Remove VMM domain
+ cisco.aci.aci_domain:
+ <<: *aci_info
+ domain: vmm_dom
+ domain_type: vmm
+ vm_provider: vmware
+ state: absent
+
+ - name: Remove test tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/tasks/main.yml
new file mode 100644
index 000000000..a1aedf96c
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_path_secondary_ip/tasks/main.yml
@@ -0,0 +1,226 @@
+# Author: Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when:
+ - version.current.0.topSystem.attributes.version is version('5', '>=')
+ - query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create domain
+ cisco.aci.aci_domain: &domain_present
+ <<: *aci_info
+ domain: l3outintftest
+ domain_type: l3dom
+ state: present
+
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Configure VRF
+ cisco.aci.aci_vrf: &vrf_present
+ <<: *tenant_present
+ vrf: l3outintftest
+
+ - name: Create L3Out
+ cisco.aci.aci_l3out:
+ <<: *vrf_present
+ l3out: l3outintftest
+ domain: l3outintftest
+ route_control: export
+
+ - name: Create node profile
+ cisco.aci.aci_l3out_logical_node_profile: &np_present
+ <<: *tenant_present
+ l3out: l3outintftest
+ node_profile: NODES
+
+ - name: Add interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &intf_present
+ <<: *np_present
+ interface_profile: Floating
+
+ - name: Create a floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ address: 23.45.67.90/24
+ state: present
+
+ - name: Create a floating svi path of type physical
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ floating_ip: 25.45.67.90/24
+ state: present
+
+ - name: Create a floating svi path of type virtual
+ cisco.aci.aci_l3out_floating_svi_path:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: vmware
+ domain: virtual
+ floating_ip: 25.45.67.90/24
+ state: present
+
+ - name: Create a floating svi path secondary_ip (virtual)
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: vmware
+ domain: virtual
+ secondary_ip: 30.45.67.90/24
+ state: present
+ register: add_ip_virtual
+
+ - name: Create a floating svi path secondary_ip in check mode
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ secondary_ip: 27.45.67.90/24
+ state: present
+ check_mode: true
+ register: add_ip_cm
+
+ - name: Create a floating svi path secondary_ip in normal mode
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ secondary_ip: 27.45.67.90/24
+ state: present
+ register: add_ip_nm
+
+ - name: Create a floating svi path secondary_ip again
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ secondary_ip: 27.45.67.90/24
+ state: present
+ register: add_ip_again
+
+ - name: Create another floating svi path secondary_ip
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ secondary_ip: 28.45.67.90/24
+ state: present
+ register: add_another_ip
+
+ - name: Verify present ops
+ ansible.builtin.assert:
+ that:
+ - add_ip_cm is changed
+ - add_ip_nm is changed
+ - add_ip_again is not changed
+ - add_another_ip is changed
+ - add_ip_virtual.current.0.l3extIp.attributes.addr == "30.45.67.90/24"
+ - add_ip_cm.proposed.l3extIp.attributes.addr == "27.45.67.90/24"
+ - add_ip_nm.current.0.l3extIp.attributes.addr == "27.45.67.90/24"
+ - add_another_ip.current.0.l3extIp.attributes.addr == "28.45.67.90/24"
+
+ - name: Query a floating svi path secondary_ip
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ secondary_ip: 27.45.67.90/24
+ state: query
+ register: query_ip
+
+ - name: Query all ips
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ state: query
+ register: query_all
+
+ - name: Verify query ops
+ ansible.builtin.assert:
+ that:
+ - query_ip is not changed
+ - query_all is not changed
+ - query_ip.current.0.l3extIp.attributes.addr == "27.45.67.90/24"
+ - query_all.current.0.l3extRsDynPathAtt.children | length == 2
+
+ - name: Delete a floating svi path secondary_ip
+ cisco.aci.aci_l3out_floating_svi_path_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ domain_type: physical
+ domain: physical_dom
+ secondary_ip: 27.45.67.90/24
+ state: absent
+ register: delete_ip
+
+ - name: Verify delete ops
+ ansible.builtin.assert:
+ that:
+ - delete_ip is changed
+ - delete_ip.current == []
+
+# Clean up environment
+ - name: Remove test tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+ \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/tasks/main.yml
new file mode 100644
index 000000000..f0d2040c6
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_floating_svi_secondary_ip/tasks/main.yml
@@ -0,0 +1,159 @@
+# Author: Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create domain
+ cisco.aci.aci_domain: &domain_present
+ <<: *aci_info
+ domain: l3outintftest
+ domain_type: l3dom
+ state: present
+
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Configure VRF
+ cisco.aci.aci_vrf: &vrf_present
+ <<: *tenant_present
+ vrf: l3outintftest
+
+ - name: Create L3Out
+ cisco.aci.aci_l3out:
+ <<: *vrf_present
+ l3out: l3outintftest
+ domain: l3outintftest
+ route_control: export
+
+ - name: Create node profile
+ cisco.aci.aci_l3out_logical_node_profile: &np_present
+ <<: *tenant_present
+ l3out: l3outintftest
+ node_profile: NODES
+
+ - name: Add interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &intf_present
+ <<: *np_present
+ interface_profile: Floating
+
+ - name: Create a floating svi
+ cisco.aci.aci_l3out_floating_svi:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ address: 23.45.67.90/24
+ external_bridge_group_profile: bridge1
+ state: present
+ register: add_floating_cm
+
+ - name: Create a floating svi secondary_ip in check mode
+ cisco.aci.aci_l3out_floating_svi_secondary_ip: &floating_svi
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ secondary_ip: 25.45.67.90/24
+ state: present
+ check_mode: true
+ register: add_ip_cm
+
+ - name: Create a floating svi secondary_ip in normal mode
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ <<: *floating_svi
+ state: present
+ register: add_ip_nm
+
+ - name: Create a floating svi secondary_ip again
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ <<: *floating_svi
+ state: present
+ register: add_ip_again
+
+ - name: Create another floating svi secondary_ip
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ secondary_ip: 26.45.67.90/24
+ state: present
+ register: add_another_ip
+
+ - name: Verify present ops
+ ansible.builtin.assert:
+ that:
+ - add_ip_cm is changed
+ - add_ip_nm is changed
+ - add_ip_again is not changed
+ - add_another_ip is changed
+ - add_ip_nm.current.0.l3extIp.attributes.addr == "25.45.67.90/24"
+ - add_another_ip.current.0.l3extIp.attributes.addr == "26.45.67.90/24"
+
+ - name: Query a floating svi secondary_ip
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ <<: *floating_svi
+ state: query
+ register: query_ip
+
+ - name: Query all ips
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ <<: *intf_present
+ pod_id: 1
+ node_id: 201
+ encap: vlan-1
+ state: query
+ register: query_all
+
+ - name: Verify query ops
+ ansible.builtin.assert:
+ that:
+ - query_ip is not changed
+ - query_all is not changed
+ - query_ip.current.0.l3extIp.attributes.addr == "25.45.67.90/24"
+ - query_all.current.0.l3extVirtualLIfP.children | length == 2
+
+ - name: Delete a floating svi secondary_ip
+ cisco.aci.aci_l3out_floating_svi_secondary_ip:
+ <<: *floating_svi
+ state: absent
+ register: delete_ip
+
+ - name: Verify delete ops
+ ansible.builtin.assert:
+ that:
+ - delete_ip is changed
+ - delete_ip.current == []
+
+# Clean up environment
+ - name: Remove test tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/tasks/main.yml
new file mode 100644
index 000000000..d1a4ef501
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_group/tasks/main.yml
@@ -0,0 +1,195 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create domain
+ cisco.aci.aci_domain:
+ <<: *aci_info
+ domain: l3outintftest
+ domain_type: l3dom
+ state: present
+
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Configure VRF
+ cisco.aci.aci_vrf: &vrf_present
+ <<: *tenant_present
+ vrf: l3outintftest
+
+ - name: Create L3Out
+ cisco.aci.aci_l3out:
+ <<: *vrf_present
+ l3out: l3outintftest
+ domain: l3outintftest
+ route_control: export
+
+ - name: Create node profile
+ cisco.aci.aci_l3out_logical_node_profile: &np_present
+ <<: *tenant_present
+ l3out: l3outintftest
+ node_profile: node1
+
+ - name: Create interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &intf_present
+ <<: *np_present
+ interface_profile: intf1
+
+ - name: Add a hsrp interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ <<: *intf_present
+ hsrp_policy: default
+ version: v1
+ state: present
+
+ - name: Add a hsrp group (check mode)
+ cisco.aci.aci_l3out_hsrp_group: &group_present
+ <<: *intf_present
+ hsrp_interface_group: group1
+ group_id: 1
+ ip: 12.34.56.32
+ mac: 00:00:00:00:00:FF
+ group_name: one
+ group_type: ipv4
+ ip_obtain_mode: admin
+ group_policy: default
+ state: present
+ check_mode: true
+ register: cm_add_group
+
+ - name: Add a hsrp group (normal mode)
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *group_present
+ register: nm_add_group
+
+ - name: Add hsrp group again
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *group_present
+ register: add_group_again
+
+ - name: Change hsrp group
+ cisco.aci.aci_l3out_hsrp_group: &group_update
+ <<: *group_present
+ group_id: 3
+ register: update_group
+
+ - name: Add another hsrp group
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *intf_present
+ hsrp_interface_group: group2
+ group_name: two
+ ip_obtain_mode: learn
+ state: present
+ register: nm_add_group2
+
+ - name: Verify add hsrp groups
+ ansible.builtin.assert:
+ that:
+ - cm_add_group is changed
+ - nm_add_group is changed
+ - add_group_again is not changed
+ - cm_add_group.proposed.hsrpGroupP.attributes.groupAf == "ipv4"
+ - cm_add_group.proposed.hsrpGroupP.attributes.groupId == "1"
+ - cm_add_group.proposed.hsrpGroupP.attributes.groupName == "one"
+ - cm_add_group.proposed.hsrpGroupP.attributes.ip == "12.34.56.32"
+ - cm_add_group.proposed.hsrpGroupP.attributes.ipObtainMode == "admin"
+ - cm_add_group.proposed.hsrpGroupP.attributes.mac == "00:00:00:00:00:FF"
+ - cm_add_group.proposed.hsrpGroupP.children.0.hsrpRsGroupPol.attributes.tnHsrpGroupPolName == "default"
+ - nm_add_group.current.0.hsrpGroupP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP/hsrpGroupP-group1"
+ - nm_add_group.current.0.hsrpGroupP.attributes.groupAf == "ipv4"
+ - nm_add_group.current.0.hsrpGroupP.attributes.groupId == "1"
+ - cm_add_group.previous == nm_add_group.previous == []
+ - update_group.current.0.hsrpGroupP.attributes.groupId == "3"
+ - nm_add_group.current.0.hsrpGroupP.attributes.name == "group1"
+ - nm_add_group.current.0.hsrpGroupP.attributes.groupName == "one"
+ - nm_add_group.current.0.hsrpGroupP.attributes.ip == "12.34.56.32"
+ - nm_add_group.current.0.hsrpGroupP.attributes.ipObtainMode == "admin"
+ - nm_add_group.current.0.hsrpGroupP.attributes.mac == "00:00:00:00:00:FF"
+ - nm_add_group.current.0.hsrpGroupP.children.0.hsrpRsGroupPol.attributes.tnHsrpGroupPolName == "default"
+ - nm_add_group2.current.0.hsrpGroupP.attributes.name == "group2"
+ - nm_add_group2.current.0.hsrpGroupP.attributes.groupName == "two"
+ - nm_add_group2.current.0.hsrpGroupP.attributes.ipObtainMode == "learn"
+
+ - name: Query a hsrp group
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *group_update
+ state: query
+ register: query_group
+
+ - name: Query all hsrp groups
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *intf_present
+ state: query
+ register: query_all
+
+ - name: Verify query
+ ansible.builtin.assert:
+ that:
+ - query_group is not changed
+ - query_all is not changed
+ - query_group.current.0.hsrpGroupP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP/hsrpGroupP-group1"
+ - query_group.current.0.hsrpGroupP.attributes.groupAf == "ipv4"
+ - query_group.current.0.hsrpGroupP.attributes.groupId == "3"
+ - query_group.current.0.hsrpGroupP.attributes.name == "group1"
+ - query_group.current.0.hsrpGroupP.attributes.groupName == "one"
+ - query_group.current.0.hsrpGroupP.attributes.ip == "12.34.56.32"
+ - query_group.current.0.hsrpGroupP.attributes.ipObtainMode == "admin"
+ - query_group.current.0.hsrpGroupP.attributes.mac == "00:00:00:00:00:FF"
+ - query_group.current.0.hsrpGroupP.children.0.hsrpRsGroupPol.attributes.tnHsrpGroupPolName == "default"
+ - query_all.current.0.hsrpIfP.children | length == 2
+
+ - name: Remove a hsrp group in check mode
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *group_update
+ state: absent
+ check_mode: true
+ register: cm_absent_group
+
+ - name: Remove a hsrp group
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *group_update
+ state: absent
+ register: absent_group
+
+ - name: Remove hsrp group again
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *group_update
+ state: absent
+ register: absent_group_again
+
+ - name: Verify remove
+ ansible.builtin.assert:
+ that:
+ - cm_absent_group is changed
+ - cm_absent_group.proposed == {}
+ - absent_group is changed
+ - absent_group.current == []
+ - absent_group_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/tasks/main.yml
new file mode 100644
index 000000000..162e1ce04
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_interface_profile/tasks/main.yml
@@ -0,0 +1,152 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create domain
+ cisco.aci.aci_domain:
+ <<: *aci_info
+ domain: l3outintftest
+ domain_type: l3dom
+ state: present
+
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Configure VRF
+ cisco.aci.aci_vrf: &vrf_present
+ <<: *tenant_present
+ vrf: l3outintftest
+
+ - name: Create L3Out
+ cisco.aci.aci_l3out:
+ <<: *vrf_present
+ l3out: l3outintftest
+ domain: l3outintftest
+ route_control: export
+
+ - name: Create node profile
+ cisco.aci.aci_l3out_logical_node_profile: &np_present
+ <<: *tenant_present
+ l3out: l3outintftest
+ node_profile: node1
+
+ - name: Create interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &intf_present
+ <<: *np_present
+ interface_profile: intf1
+
+ - name: Add a new hsrp interface profile (check mode)
+ cisco.aci.aci_l3out_hsrp_interface_profile: &hsrp_present
+ <<: *intf_present
+ version: v1
+ state: present
+ check_mode: true
+ register: cm_add_hsrp
+
+ - name: Add a new hsrp interface profile (normal mode)
+ cisco.aci.aci_l3out_hsrp_interface_profile: *hsrp_present
+ register: nm_add_hsrp
+
+ - name: Verify add hsrp
+ ansible.builtin.assert:
+ that:
+ - cm_add_hsrp is changed
+ - nm_add_hsrp is changed
+ - cm_add_hsrp.proposed.hsrpIfP.attributes.version == "v1"
+ - cm_add_hsrp.previous == nm_add_hsrp.previous == []
+ - nm_add_hsrp.current.0.hsrpIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP"
+ - nm_add_hsrp.current.0.hsrpIfP.attributes.version == "v1"
+
+ - name: Add the hsrp interface profile again to check idempotency
+ cisco.aci.aci_l3out_hsrp_interface_profile: *hsrp_present
+ register: nm_add_hsrp_again
+
+ - name: Verify idempotency
+ ansible.builtin.assert:
+ that:
+ - nm_add_hsrp_again is not changed
+
+ - name: Update the hsrp interface_profile
+ cisco.aci.aci_l3out_hsrp_interface_profile: &hsrp_update
+ <<: *hsrp_present
+ hsrp_policy: default
+ version: v2
+ register: nm_hsrp_update
+
+ - name: Verify update hsrp
+ ansible.builtin.assert:
+ that:
+ - nm_hsrp_update is changed
+ - nm_hsrp_update.current.0.hsrpIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP"
+ - nm_hsrp_update.current.0.hsrpIfP.attributes.version == "v2"
+ - nm_hsrp_update.current.0.hsrpIfP.children.0.hsrpRsIfPol.attributes.tnHsrpIfPolName == "default"
+
+ - name: Query the hsrp interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ <<: *hsrp_update
+ state: query
+ register: query_hsrp
+
+ - name: Verify query hsrp
+ ansible.builtin.assert:
+ that:
+ - query_hsrp is not changed
+ - query_hsrp.current.0.hsrpIfP.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP"
+ - query_hsrp.current.0.hsrpIfP.attributes.version == "v2"
+ - query_hsrp.current.0.hsrpIfP.children.0.hsrpRsIfPol.attributes.tnHsrpIfPolName == "default"
+
+ - name: Remove the hsrp interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ <<: *hsrp_update
+ state: absent
+ register: cm_remove_hsrp
+ check_mode: true
+
+ - name: Remove the hsrp interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ <<: *hsrp_update
+ state: absent
+ register: remove_hsrp
+
+ - name: Remove the hsrp interface profile again
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ <<: *hsrp_update
+ state: absent
+ register: remove_hsrp_again
+
+ - name: Verify remove_hsrp
+ ansible.builtin.assert:
+ that:
+ - cm_remove_hsrp is changed
+ - cm_remove_hsrp.proposed == {}
+ - remove_hsrp is changed
+ - remove_hsrp.current == []
+ - remove_hsrp_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/tasks/main.yml
new file mode 100644
index 000000000..d267f2d3d
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_hsrp_secondary_vip/tasks/main.yml
@@ -0,0 +1,173 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Shreyas Srish (@shrsr)
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+# SET VARS
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove test tenant before we kickoff
+ cisco.aci.aci_tenant: &tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # SETUP ENVIRONMENT
+ - name: Create domain
+ cisco.aci.aci_domain:
+ <<: *aci_info
+ domain: l3outintftest
+ domain_type: l3dom
+ state: present
+
+ - name: Create tenant
+ cisco.aci.aci_tenant: &tenant_present
+ <<: *tenant_absent
+ state: present
+
+ - name: Configure VRF
+ cisco.aci.aci_vrf: &vrf_present
+ <<: *tenant_present
+ vrf: l3outintftest
+
+ - name: Create L3Out
+ cisco.aci.aci_l3out:
+ <<: *vrf_present
+ l3out: l3outintftest
+ domain: l3outintftest
+ route_control: export
+
+ - name: Create node profile
+ cisco.aci.aci_l3out_logical_node_profile: &np_present
+ <<: *tenant_present
+ l3out: l3outintftest
+ node_profile: node1
+
+ - name: Create interface profile
+ cisco.aci.aci_l3out_logical_interface_profile: &intf_present
+ <<: *np_present
+ interface_profile: intf1
+
+ - name: Add a hsrp interface profile
+ cisco.aci.aci_l3out_hsrp_interface_profile:
+ <<: *intf_present
+ hsrp_policy: default
+ version: v1
+ state: present
+
+ - name: Add a hsrp group
+ cisco.aci.aci_l3out_hsrp_group:
+ <<: *intf_present
+ hsrp_interface_group: group1
+ group_id: 1
+ ip: 12.34.56.32
+ mac: 00:00:00:00:00:FF
+ group_name: one
+ group_type: ipv4
+ ip_obtain_mode: admin
+ group_policy: default
+ state: present
+
+ - name: Add a hsrp group secondary vip (check mode)
+ cisco.aci.aci_l3out_hsrp_secondary_vip: &vip
+ <<: *intf_present
+ hsrp_interface_group: group1
+ secondary_virtual_ip: 191.1.1.1
+ check_mode: true
+ register: cm_vip
+
+ - name: Add a hsrp group secondary vip (normal mode)
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *vip
+ register: nm_vip
+
+ - name: Add a hsrp group secondary vip again
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *vip
+ register: add_vip_again
+
+ - name: Add another vip
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *vip
+ secondary_virtual_ip: 191.1.1.2
+ register: add_vip2
+
+ - name: Verify add hsrp vips
+ ansible.builtin.assert:
+ that:
+ - cm_vip is changed
+ - nm_vip is changed
+ - add_vip_again is not changed
+ - add_vip2 is changed
+ - cm_vip.previous == nm_vip.previous == []
+ - cm_vip.proposed.hsrpSecVip.attributes.ip == "191.1.1.1"
+ - nm_vip.current.0.hsrpSecVip.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP/hsrpGroupP-group1/hsrpSecVip-[191.1.1.1]"
+ - nm_vip.current.0.hsrpSecVip.attributes.ip == "191.1.1.1"
+ - add_vip2.current.0.hsrpSecVip.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP/hsrpGroupP-group1/hsrpSecVip-[191.1.1.2]"
+ - add_vip2.current.0.hsrpSecVip.attributes.ip == "191.1.1.2"
+
+
+ - name: Query a vip
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *vip
+ state: query
+ register: query_vip
+
+ - name: Query all vips
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *intf_present
+ hsrp_interface_group: group1
+ state: query
+ register: query_all
+
+ - name: Verify query
+ ansible.builtin.assert:
+ that:
+ - query_vip is not changed
+ - query_all is not changed
+ - query_vip.current.0.hsrpSecVip.attributes.dn == "uni/tn-ansible_test/out-l3outintftest/lnodep-node1/lifp-intf1/hsrpIfP/hsrpGroupP-group1/hsrpSecVip-[191.1.1.1]"
+ - query_vip.current.0.hsrpSecVip.attributes.ip == "191.1.1.1"
+ - query_all.current.0.hsrpGroupP.children | length == 2
+
+ - name: Remove a hsrp group vip in check mode
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *vip
+ state: absent
+ check_mode: true
+ register: cm_absent_vip
+
+ - name: Remove a hsrp group vip
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *vip
+ state: absent
+ register: absent_vip
+
+ - name: Remove hsrp group again
+ cisco.aci.aci_l3out_hsrp_secondary_vip:
+ <<: *vip
+ state: absent
+ register: absent_vip_again
+
+ - name: Verify remove
+ ansible.builtin.assert:
+ that:
+ - cm_absent_vip is changed
+ - cm_absent_vip.proposed == {}
+ - absent_vip is changed
+ - absent_vip.current == []
+ - absent_vip_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface/tasks/main.yml
index 5b2a247d8..38e4321e3 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface/tasks/main.yml
@@ -1,16 +1,17 @@
# Test code for the ACI modules
# Copyright: (c) 2021, Tim Cragg (@timcragg)
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,40 +23,40 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_tenant if it already exists
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Remove ansible_l3ext_domain if it already exists
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
state: absent
- name: Remove ansible_port_channel_ipg if it already exists
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
state: absent
- name: Remove ansible_vpc_ipg if it already exists
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
state: absent
- name: Add a new tenant required for l3out
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
@@ -63,7 +64,7 @@
# ADD domain
- name: Add domain for l3out
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
@@ -71,7 +72,7 @@
# ADD VRF
- name: Add VRF for l3out
- aci_vrf:
+ cisco.aci.aci_vrf:
<<: *aci_info
tenant: ansible_tenant
vrf: ansible_vrf
@@ -79,7 +80,7 @@
# ADD PC IPG
- name: Add port-channel IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
@@ -87,7 +88,7 @@
# ADD vPC IPG
- name: Add vPC IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
@@ -95,7 +96,7 @@
# ADD l3out
- name: Add l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
name: ansible_l3out
@@ -106,7 +107,7 @@
# ADD l3out logical node profile
- name: l3out logical node profile
- aci_l3out_logical_node_profile:
+ cisco.aci.aci_l3out_logical_node_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -115,7 +116,7 @@
# ADD l3out logical interface profile
- name: l3out logical interface profile
- aci_l3out_logical_interface_profile:
+ cisco.aci.aci_l3out_logical_interface_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -125,7 +126,7 @@
# ADD l3out interface
- name: Add routed interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -144,7 +145,7 @@
register: add_l3out_interface
- name: Verify l3out has been created with the correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]"
- add_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.50.1/27"
@@ -157,7 +158,7 @@
# ADD l3out interface again to check idempotency
- name: Add routed interface again
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -176,13 +177,13 @@
register: add_l3out_interface_again
- name: Verify l3out has not changed
- assert:
+ ansible.builtin.assert:
that:
- add_l3out_interface_again is not changed
# MODIFY l3out attributes
- name: Update routed interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -199,7 +200,7 @@
register: update_l3out_interface
- name: Verify routed interface has correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]"
- update_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.60.1/27"
@@ -209,7 +210,7 @@
# QUERY l3out interface
- name: Query routed interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -222,7 +223,7 @@
register: query_l3out_interface
- name: Verify query_l3out_interface
- assert:
+ ansible.builtin.assert:
that:
- query_l3out_interface is not changed
- query_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]"
@@ -232,7 +233,7 @@
- query_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.mode == "regular"
- name: Query all interfaces
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -242,7 +243,7 @@
register: query_l3out_interfaces
- name: Verify query_l3out_interfaces
- assert:
+ ansible.builtin.assert:
that:
- query_l3out_interfaces is not changed
- query_l3out_interfaces.current.0.l3extLIfP.children.0.l3extRsPathL3OutAtt.attributes.rn == "rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]"
@@ -253,7 +254,7 @@
# DELETE l3out interface
- name: Remove routed sub-interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -266,14 +267,14 @@
register: delete_l3out_interface
- name: Verify interface has been deleted
- assert:
+ ansible.builtin.assert:
that:
- delete_l3out_interface.current == []
- delete_l3out_interface.previous.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]"
# ADD l3out port-channel
- name: Add routed interface port-channel
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -289,7 +290,7 @@
register: add_l3out_pc_interface
- name: Verify l3out port-channel has been created with the correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_l3out_pc_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]"
- add_l3out_pc_interface.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.70.1/27"
@@ -298,7 +299,7 @@
# ADD l3out port-channel again to check idempotency
- name: Add routed interface port-channel again
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -314,13 +315,13 @@
register: add_l3out_pc_interface_again
- name: Verify interface has not changed
- assert:
+ ansible.builtin.assert:
that:
- add_l3out_pc_interface_again is not changed
# MODIFY l3out port-channel attributes
- name: Update routed port-channel interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -336,7 +337,7 @@
register: update_l3out_pc_interface
- name: Verify l3out port-channel has been updated with the correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_l3out_pc_interface is changed
- update_l3out_pc_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]"
@@ -346,7 +347,7 @@
# QUERY l3out port-channel interface
- name: Query l3out port-channel
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -359,7 +360,7 @@
register: query_l3out_pc_interface
- name: Verify query_l3out_pc_interface
- assert:
+ ansible.builtin.assert:
that:
- query_l3out_pc_interface is not changed
- query_l3out_pc_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]"
@@ -369,7 +370,7 @@
# DELETE l3out port-channel interface
- name: Remove port-channel
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -382,14 +383,14 @@
register: delete_l3out_pc_interface
- name: Verify interface has been deleted
- assert:
+ ansible.builtin.assert:
that:
- delete_l3out_pc_interface.current == []
- delete_l3out_pc_interface.previous.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[ansible_port_channel_ipg]]"
# ADD l3out vPC
- name: Add interface vPC
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface: &ext_svi_interface
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -402,43 +403,45 @@
mode: native
addr: 192.168.90.1/27
encap: vlan-913
+ mac: "00:22:BD:F8:19:FE"
+ description: "anisble test description"
state: present
register: add_l3out_vpc_interface
- name: Verify l3out vPC has been created with the correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]"
- add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.90.1/27"
- add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.ifInstT == "ext-svi"
- add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.encap == "vlan-913"
+ - add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.encapScope == "local"
- add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.mode == "native"
+ - add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.mac == "00:22:BD:F8:19:FE"
+ - add_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.descr == "anisble test description"
- name: Add interface vPC again
- aci_l3out_interface:
- <<: *aci_info
- tenant: ansible_tenant
- l3out: ansible_l3out
- node_profile: ansible_node_profile
- interface_profile: ansible_interface_profile
- pod_id: 1
- node_id: 201-202
- path_ep: ansible_vpc_ipg
- interface_type: ext-svi
- mode: native
- addr: 192.168.90.1/27
- encap: vlan-913
- state: present
+ cisco.aci.aci_l3out_interface:
+ <<: *ext_svi_interface
register: add_l3out_vpc_interface_again
+ - name: Change encap_scope on interface vPC
+ cisco.aci.aci_l3out_interface:
+ <<: *ext_svi_interface
+ encap_scope: vrf
+ state: present
+ register: change_l3out_vpc_interface_encap_scope
+
- name: Verify vPC interface is not changed
- assert:
+ ansible.builtin.assert:
that:
- add_l3out_vpc_interface_again is not changed
+ - change_l3out_vpc_interface_encap_scope.previous.0.l3extRsPathL3OutAtt.attributes.encapScope == "local"
+ - change_l3out_vpc_interface_encap_scope.current.0.l3extRsPathL3OutAtt.attributes.encapScope == "ctx"
# MODIFY vPC interface
- name: Update interface vPC
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -455,7 +458,7 @@
register: modify_l3out_vpc_interface
- name: Verify l3out vPC has been updated with the correct attributes
- assert:
+ ansible.builtin.assert:
that:
- modify_l3out_vpc_interface is changed
- modify_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]"
@@ -466,7 +469,7 @@
# QUERY vPC interface
- name: Query vPC interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -479,7 +482,7 @@
register: query_l3out_vpc_interface
- name: Verify l3out vPC query
- assert:
+ ansible.builtin.assert:
that:
- query_l3out_vpc_interface is not changed
- query_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/protpaths-201-202/pathep-[ansible_vpc_ipg]]"
@@ -489,7 +492,7 @@
- query_l3out_vpc_interface.current.0.l3extRsPathL3OutAtt.attributes.mode == "regular"
- name: Delete vPC interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -502,33 +505,264 @@
register: delete_l3out_vpc_interface
- name: Verify vPC interface is deleted
- assert:
+ ansible.builtin.assert:
that:
- delete_l3out_vpc_interface.current == []
+ - name: Execute tasks only for APIC version 5.x and above
+ when:
+ - version.current.0.topSystem.attributes.version is version('5', '>=') # This condition will execute only for APIC version 5.x and above
+ block:
+
+ - name: Ensure infra SR-MPLS l3out does not exist
+ cisco.aci.aci_l3out: &aci_infra_sr_mpls_l3out_absent
+ <<: *aci_info
+ tenant: infra
+ name: ansible_infra_sr_mpls_l3out
+ domain: ansible_dom
+ vrf: overlay-1
+ mpls: "yes"
+ l3protocol: bgp
+ state: absent
+
+ - name: Add a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+ state: present
+
+ - name: Add a node profile in the infra SR-MPLS l3out
+ cisco.aci.aci_l3out_logical_node_profile: &aci_infra_node_profile
+ <<: *aci_info
+ tenant: infra
+ l3out: ansible_infra_sr_mpls_l3out
+ node_profile: ansible_infra_sr_mpls_l3out_node_profile
+
+ - name: Add interface profile in the infra SR-MPLS l3out node profile
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_infra_interface_profile
+ <<: *aci_infra_node_profile
+ interface_profile: ansible_infra_sr_mpls_l3out_interface_profile
+
+ - name: Add direct port channel interface in the infra SR-MPLS l3out interface profile (check_mode)
+ aci_l3out_interface: &aci_infra_pc_interface
+ <<: *aci_infra_interface_profile
+ pod_id: 1
+ node_id: 101
+ path_ep: pc_ansible_test
+ interface_type: l3-port
+ addr: 192.168.90.1/24
+ state: present
+ register: cm_add_infra_sr_mpls_l3out_port_channel_interface
+ check_mode: true
+
+ - name: Add direct port channel interface in the infra SR-MPLS l3out interface profile
+ aci_l3out_interface:
+ <<: *aci_infra_pc_interface
+ register: nm_add_infra_sr_mpls_l3out_port_channel_interface
+
+ - name: Add direct port channel interface in the infra SR-MPLS l3out interface profile again
+ aci_l3out_interface:
+ <<: *aci_infra_pc_interface
+ register: nm_add_infra_sr_mpls_l3out_port_channel_interface_again
+
+ - name: Add interface in the infra SR-MPLS l3out interface profile
+ aci_l3out_interface: &aci_infra_interface
+ <<: *aci_infra_interface_profile
+ pod_id: 1
+ node_id: 101
+ path_ep: eth1/17
+ interface_type: l3-port
+ addr: 192.168.91.1/24
+ state: present
+ register: nm_add_infra_sr_mpls_l3out_interface
+
+ - name: Add sub interface in the infra SR-MPLS l3out interface profile
+ aci_l3out_interface: &aci_infra_sub_interface
+ <<: *aci_infra_interface_profile
+ pod_id: 1
+ node_id: 101
+ path_ep: eth1/18
+ interface_type: sub-interface
+ addr: 192.168.92.1/24
+ state: present
+ register: nm_add_infra_sr_mpls_l3out_sub_interface
+
+ - name: Verify interfaces in the infra SR-MPLS l3out interface profile
+ assert:
+ that:
+ - cm_add_infra_sr_mpls_l3out_port_channel_interface is changed
+ - cm_add_infra_sr_mpls_l3out_port_channel_interface.previous == []
+ - cm_add_infra_sr_mpls_l3out_port_channel_interface.proposed.l3extRsPathL3OutAtt.attributes.annotation == "orchestrator:ansible"
+ - cm_add_infra_sr_mpls_l3out_port_channel_interface.proposed.l3extRsPathL3OutAtt.attributes.addr == "192.168.90.1/24"
+ - cm_add_infra_sr_mpls_l3out_port_channel_interface.proposed.l3extRsPathL3OutAtt.attributes.ifInstT == "l3-port"
+ - cm_add_infra_sr_mpls_l3out_port_channel_interface.proposed.l3extRsPathL3OutAtt.attributes.tDn == "topology/pod-1/paths-101/pathep-[pc_ansible_test]"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface is changed
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface.previous == []
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface.current.0.l3extRsPathL3OutAtt.attributes.annotation == "orchestrator:ansible"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.90.1/24"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface.current.0.l3extRsPathL3OutAtt.attributes.ifInstT == "l3-port"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface.current.0.l3extRsPathL3OutAtt.attributes.tDn == "topology/pod-1/paths-101/pathep-[pc_ansible_test]"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again is not changed
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.previous.0.l3extRsPathL3OutAtt.attributes.annotation == "orchestrator:ansible"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.previous.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.90.1/24"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.previous.0.l3extRsPathL3OutAtt.attributes.ifInstT == "l3-port"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.previous.0.l3extRsPathL3OutAtt.attributes.tDn == "topology/pod-1/paths-101/pathep-[pc_ansible_test]"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.current.0.l3extRsPathL3OutAtt.attributes.annotation == "orchestrator:ansible"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.90.1/24"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.current.0.l3extRsPathL3OutAtt.attributes.ifInstT == "l3-port"
+ - nm_add_infra_sr_mpls_l3out_port_channel_interface_again.current.0.l3extRsPathL3OutAtt.attributes.tDn == "topology/pod-1/paths-101/pathep-[pc_ansible_test]"
+ - nm_add_infra_sr_mpls_l3out_interface is changed
+ - nm_add_infra_sr_mpls_l3out_interface.previous == []
+ - nm_add_infra_sr_mpls_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.annotation == "orchestrator:ansible"
+ - nm_add_infra_sr_mpls_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.91.1/24"
+ - nm_add_infra_sr_mpls_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.ifInstT == "l3-port"
+ - nm_add_infra_sr_mpls_l3out_interface.current.0.l3extRsPathL3OutAtt.attributes.tDn == "topology/pod-1/paths-101/pathep-[eth1/17]"
+ - nm_add_infra_sr_mpls_l3out_sub_interface is changed
+ - nm_add_infra_sr_mpls_l3out_sub_interface.previous == []
+ - nm_add_infra_sr_mpls_l3out_sub_interface.current.0.l3extRsPathL3OutAtt.attributes.annotation == "orchestrator:ansible"
+ - nm_add_infra_sr_mpls_l3out_sub_interface.current.0.l3extRsPathL3OutAtt.attributes.addr == "192.168.92.1/24"
+ - nm_add_infra_sr_mpls_l3out_sub_interface.current.0.l3extRsPathL3OutAtt.attributes.ifInstT == "sub-interface"
+ - nm_add_infra_sr_mpls_l3out_sub_interface.current.0.l3extRsPathL3OutAtt.attributes.tDn == "topology/pod-1/paths-101/pathep-[eth1/18]"
+
+ - name: Enable micro BFD on direct port channel interface in the infra SR-MPLS l3out interface profile without destination (error)
+ aci_l3out_interface:
+ <<: *aci_infra_pc_interface
+ micro_bfd: true
+ register: err_micro_bfd_not_provided_destination
+ ignore_errors: true
+
+ - name: Enable micro BFD on direct port channel interface in the infra SR-MPLS l3out interface profile timer without micro BFD (error)
+ aci_l3out_interface:
+ <<: *aci_infra_pc_interface
+ micro_bfd_timer: 75
+ register: err_micro_bfd_timer_not_provided_micro_bfd
+ ignore_errors: true
+
+ - name: Enable micro BFD on direct port channel interface in the infra SR-MPLS l3out interface profile destination without micro BFD (error)
+ aci_l3out_interface:
+ <<: *aci_infra_pc_interface
+ micro_bfd_destination: true
+ register: err_micro_bfd_destination_not_provided_micro_bfd
+ ignore_errors: true
+
+ - name: Verify micro BFD errors
+ assert:
+ that:
+ - err_micro_bfd_not_provided_destination is failed
+ - err_micro_bfd_not_provided_destination.msg == "micro_bfd is True but all of the following are missing{{":"}} micro_bfd_destination"
+ - err_micro_bfd_timer_not_provided_micro_bfd is failed
+ - err_micro_bfd_timer_not_provided_micro_bfd.msg == "missing parameter(s) required by 'micro_bfd_timer'{{":"}} micro_bfd"
+ - err_micro_bfd_destination_not_provided_micro_bfd is failed
+ - err_micro_bfd_destination_not_provided_micro_bfd.msg == "missing parameter(s) required by 'micro_bfd_destination'{{":"}} micro_bfd"
+
+ - name: Enable micro BFD on direct port channel interface in the infra SR-MPLS l3out interface (check_mode)
+ aci_l3out_interface: &enable_bfd
+ <<: *aci_infra_pc_interface
+ micro_bfd: true
+ micro_bfd_destination: 192.168.90.2
+ register: cm_enable_micro_bfd
+ check_mode: true
+
+ - name: Enable micro BFD on direct port channel interface in the infra SR-MPLS l3out interface
+ aci_l3out_interface:
+ <<: *enable_bfd
+ register: nm_enable_micro_bfd
+
+ - name: Change timer for micro on direct port channel interface in the infra SR-MPLS l3out interface
+ aci_l3out_interface:
+ <<: *enable_bfd
+ micro_bfd_timer: 75
+ register: nm_change_micro_bfd_timer
+
+ - name: Diable micro BFD on direct port channel interface in the infra SR-MPLS l3out interface
+ aci_l3out_interface:
+ <<: *enable_bfd
+ micro_bfd: false
+ register: nm_disable_micro_bfd
+
+ - name: Verify micro BFD configuration on direct port channel interface in the infra SR-MPLS l3out interface
+ assert:
+ that:
+ - cm_enable_micro_bfd is changed
+ - cm_enable_micro_bfd.previous.0.l3extRsPathL3OutAtt.children is undefined
+ - cm_enable_micro_bfd.proposed.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.adminState == "yes"
+ - cm_enable_micro_bfd.proposed.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.dst == "192.168.90.2"
+ - nm_enable_micro_bfd is changed
+ - nm_enable_micro_bfd.previous.0.l3extRsPathL3OutAtt.children is undefined
+ - nm_enable_micro_bfd.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.adminState == "yes"
+ - nm_enable_micro_bfd.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.dst == "192.168.90.2"
+ - nm_enable_micro_bfd.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.stTm == "0"
+ - nm_change_micro_bfd_timer is changed
+ - nm_change_micro_bfd_timer.previous.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.adminState == "yes"
+ - nm_change_micro_bfd_timer.previous.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.dst == "192.168.90.2"
+ - nm_change_micro_bfd_timer.previous.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.stTm == "0"
+ - nm_change_micro_bfd_timer.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.adminState == "yes"
+ - nm_change_micro_bfd_timer.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.dst == "192.168.90.2"
+ - nm_change_micro_bfd_timer.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.stTm == "75"
+ - nm_disable_micro_bfd is changed
+ - nm_disable_micro_bfd.previous.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.adminState == "yes"
+ - nm_disable_micro_bfd.previous.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.dst == "192.168.90.2"
+ - nm_disable_micro_bfd.previous.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.stTm == "75"
+ - nm_disable_micro_bfd.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.adminState == "no"
+ - nm_disable_micro_bfd.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.dst == "192.168.90.2"
+ - nm_disable_micro_bfd.current.0.l3extRsPathL3OutAtt.children.0.bfdMicroBfdP.attributes.stTm == "75"
+
+ - name: Delete direct port channel interface in the infra SR-MPLS l3out interface profile again (check_mode)
+ aci_l3out_interface: &aci_infra_pc_interface_absent
+ <<: *aci_infra_pc_interface
+ state: absent
+ register: cm_delete_infra_sr_mpls_l3out_port_channel_interface
+ check_mode: true
+
+ - name: Delete direct port channel interface in the infra SR-MPLS l3out interface profile
+ aci_l3out_interface:
+ <<: *aci_infra_pc_interface_absent
+ register: nm_delete_infra_sr_mpls_l3out_port_channel_interface
+
+ - name: Delete direct port channel interface in the infra SR-MPLS l3out interface profile again
+ aci_l3out_interface:
+ <<: *aci_infra_pc_interface_absent
+ register: nm_delete_infra_sr_mpls_l3out_port_channel_interface_again
+
+ - name: Verify deletion of port channel interfaces in the infra SR-MPLS l3out interface profile
+ assert:
+ that:
+ - cm_delete_infra_sr_mpls_l3out_port_channel_interface is changed
+ - cm_delete_infra_sr_mpls_l3out_port_channel_interface.previous != []
+ - cm_delete_infra_sr_mpls_l3out_port_channel_interface.proposed == {}
+ - nm_delete_infra_sr_mpls_l3out_port_channel_interface is changed
+ - nm_delete_infra_sr_mpls_l3out_port_channel_interface.previous != []
+ - nm_delete_infra_sr_mpls_l3out_port_channel_interface.current == []
+ - nm_delete_infra_sr_mpls_l3out_port_channel_interface_again is not changed
+ - nm_delete_infra_sr_mpls_l3out_port_channel_interface_again.previous == []
+ - nm_delete_infra_sr_mpls_l3out_port_channel_interface_again.current == []
+
+ - name: Remove a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+
# CLEAN UP
- name: Remove ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Remove ansible_l3ext_domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
state: absent
- name: Remove ansible_port_channel_ipg
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
state: absent
- name: Remove ansible_vpc_ipg
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface_secondary_ip/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface_secondary_ip/tasks/main.yml
index 775d40ee8..df49658be 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface_secondary_ip/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_interface_secondary_ip/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,26 +22,26 @@
# CLEAN ENVIRONMENT
- name: Remove test tenant if it already exists
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_test
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Remove port-channel IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
state: absent
- name: Remove vPC IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
@@ -49,7 +49,7 @@
# ADD PC IPG
- name: Add port-channel IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
@@ -57,7 +57,7 @@
# ADD vPC IPG
- name: Add vPC IPG
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
@@ -65,7 +65,7 @@
# ADD domain
- name: Add domain for l3out
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
@@ -73,7 +73,7 @@
# ADD tenant
- name: Add a new tenant required for l3out
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_test
description: Ansible tenant
@@ -81,7 +81,7 @@
# ADD VRF
- name: Add VRF for l3out
- aci_vrf:
+ cisco.aci.aci_vrf:
<<: *aci_info
tenant: ansible_test
vrf: ansible_vrf
@@ -89,7 +89,7 @@
# ADD l3out
- name: Add l3out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_test
name: ansible_l3out
@@ -100,7 +100,7 @@
# ADD l3out logical node profile
- name: l3out logical node profile
- aci_l3out_logical_node_profile:
+ cisco.aci.aci_l3out_logical_node_profile:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -109,7 +109,7 @@
# ADD l3out logical interface profile
- name: l3out logical interface profile
- aci_l3out_logical_interface_profile:
+ cisco.aci.aci_l3out_logical_interface_profile:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -119,7 +119,7 @@
# ADD l3out routed interface
- name: Add routed interface
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -135,7 +135,7 @@
# ADD l3out routed interface po
- name: Add routed interface port-channel
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -151,7 +151,7 @@
# ADD l3out routed interface vPC
- name: Add routed interface vPC
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -167,7 +167,7 @@
# ADD l3out routed interface vPC member
- name: Add routed interface vPC member
- aci_l3out_logical_interface_vpc_member:
+ cisco.aci.aci_l3out_logical_interface_vpc_member:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -182,7 +182,7 @@
# ADD secondary IPs to the interfaces
- name: Add secondary IP to routed interface
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -197,7 +197,7 @@
register: secondary_intf
- name: Add secondary to IP routed interface port-channel
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -212,7 +212,7 @@
register: secondary_po
- name: Add secondary IP to routed interface vPC
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -228,7 +228,7 @@
register: secondary_vpc
- name: Verify secondaries have been created with the correct attributes
- assert:
+ ansible.builtin.assert:
that:
- secondary_intf.current.0.l3extIp.attributes.dn == "uni/tn-ansible_test/out-ansible_l3out/lnodep-ansible_node_profile/lifp-ansible_interface_profile/rspathL3OutAtt-[topology/pod-1/paths-201/pathep-[eth1/15]]/addr-[192.168.50.2/27]"
- secondary_intf.current.0.l3extIp.attributes.ipv6Dad == "disabled"
@@ -240,7 +240,7 @@
# CHECK idempotency
- name: Add secondary IP to routed interface with no changes
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -255,7 +255,7 @@
register: secondary_intf_again
- name: Add secondary to IP routed interface port-channel with no changes
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -270,7 +270,7 @@
register: secondary_po_again
- name: Add secondary IP to routed interface vPC with no changes
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -286,7 +286,7 @@
register: secondary_vpc_again
- name: Verify MOs have not changed
- assert:
+ ansible.builtin.assert:
that:
- secondary_intf_again is not changed
- secondary_po_again is not changed
@@ -294,7 +294,7 @@
# CHECK updates/modifications
- name: Modify routed interface
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -309,7 +309,7 @@
register: secondary_intf_update
- name: Modify routed port-channel
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -324,7 +324,7 @@
register: secondary_po_update
- name: Modify routed vPC
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -340,7 +340,7 @@
register: secondary_vpc_update
- name: Verify updates have been applied
- assert:
+ ansible.builtin.assert:
that:
- secondary_intf_update is changed
- secondary_po_update is changed
@@ -351,7 +351,7 @@
# QUERIES
- name: Query secondary for interface
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -366,7 +366,7 @@
register: secondary_intf_query
- name: Query secondary for po
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -381,7 +381,7 @@
register: secondary_po_query
- name: Query secondary for vpc
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -397,13 +397,13 @@
register: secondary_vpc_query
- name: Query all secondary IPs
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
state: query
register: secondary_all_query
- name: Verify queries
- assert:
+ ansible.builtin.assert:
that:
- secondary_intf_query is not changed
- secondary_po_query is not changed
@@ -418,7 +418,7 @@
# DELETE secondary IPs
- name: Delete secondary for interface
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -433,7 +433,7 @@
register: secondary_intf_remove
- name: Delete secondary for po
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -448,7 +448,7 @@
register: secondary_po_remove
- name: Delete secondary for vpc
- aci_l3out_interface_secondary_ip:
+ cisco.aci.aci_l3out_interface_secondary_ip:
<<: *aci_info
tenant: ansible_test
l3out: ansible_l3out
@@ -464,7 +464,7 @@
register: secondary_vpc_remove
- name: Verify objects have been deleted
- assert:
+ ansible.builtin.assert:
that:
- secondary_intf_remove.current == []
- secondary_po_remove.current == []
@@ -475,27 +475,27 @@
# CLEAN UP
- name: Remove tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_test
state: absent
- name: Remove ext domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_l3ext_domain
domain_type: l3dom
state: absent
- name: Remove port-channel
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: link
policy_group: ansible_port_channel_ipg
state: absent
- name: Remove vpc
- aci_interface_policy_leaf_policy_group:
+ cisco.aci.aci_interface_policy_leaf_policy_group:
<<: *aci_info
lag_type: node
policy_group: ansible_vpc_ipg
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile/tasks/main.yml
index b3ad827f1..506690c70 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile/tasks/main.yml
@@ -1,9 +1,12 @@
+# Test code for the ACI modules
# Author: Marcel Zehnder (@maercu)
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -15,164 +18,287 @@
# CLEAN ENVIRONMENT
- name: Remove test tenant before we kickoff
- cisco.aci.aci_tenant: &tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
- tenant: ansible_test
+ tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# SETUP ENVIRONMENT
- name: Create domain
- cisco.aci.aci_domain: &domain_present
+ cisco.aci.aci_domain: &aci_domain_present
<<: *aci_info
- domain: l3outintftest
+ domain: ansible_dom
domain_type: l3dom
state: present
- name: Create tenant
- cisco.aci.aci_tenant: &tenant_present
- <<: *tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_tenant_absent
state: present
- name: Configure VRF
- cisco.aci.aci_vrf: &vrf_present
- <<: *tenant_present
- vrf: l3outintftest
+ cisco.aci.aci_vrf: &aci_vrf_present
+ <<: *aci_tenant_present
+ vrf: ansible_vrf
+ state: present
- name: Create L3Out
cisco.aci.aci_l3out:
- <<: *vrf_present
- l3out: l3outintftest
- domain: l3outintftest
- route_control: export
+ <<: *aci_vrf_present
+ l3out: ansible_l3out
+ domain: ansible_dom
+ state: present
- name: Crete node profile
- cisco.aci.aci_l3out_logical_node_profile: &np_present
- <<: *tenant_present
- l3out: l3outintftest
- node_profile: NODES
-
- # BEGIN WITH TESTS (ADD PROFILE)
- - name: Add interface profile (check_mode)
- cisco.aci.aci_l3out_logical_interface_profile: &intf_present
- <<: *np_present
- interface_profile: INTFS
- description: test
+ cisco.aci.aci_l3out_logical_node_profile: &aci_np_present
+ <<: *aci_tenant_present
+ l3out: ansible_l3out
+ node_profile: ansible_node_profile
+ state: present
+
+# CREATE Logical Interface Profile
+ - name: Add a Logical Interface Profile (check_mode)
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_logical_interface_profile_present
+ <<: *aci_np_present
+ interface_profile: ansible_interface_profile_1
+ description: Logical Interface Profile 1 for ansible_node_profile
+ nd_policy: default
+ egress_dpp_policy: default
+ ingress_dpp_policy: default
+ qos_priority: level1
+ qos_custom_policy: default
+ pim_v4_interface_profile:
+ tenant: common
+ pim: default
+ pim_v6_interface_profile:
+ tenant: common
+ pim: default
+ igmp_interface_profile:
+ tenant: common
+ igmp: default
+ state: present
check_mode: true
- register: cm_add_intf
+ register: cm_add_interface_profile
- - name: Add interface profile (normal_mode)
+ - name: Add a Logical Interface Profile (normal_mode)
cisco.aci.aci_l3out_logical_interface_profile:
- <<: *intf_present
- register: nm_add_intf
+ <<: *aci_l3out_logical_interface_profile_present
+ register: nm_add_interface_profile
- - name: Verify nm_add_intf
- assert:
- that:
- - cm_add_intf is changed
- - nm_add_intf is changed
- - cm_add_intf.previous == nm_add_intf.previous == []
- - cm_add_intf.sent.l3extLIfP.attributes.name == nm_add_intf.sent.l3extLIfP.attributes.name == 'INTFS'
- - cm_add_intf.sent.l3extLIfP.attributes.descr == nm_add_intf.sent.l3extLIfP.attributes.descr == 'test'
- - nm_add_intf.current.0.l3extLIfP.attributes.annotation == 'orchestrator:ansible'
-
- - name: Add profile again, check if idempotency works
+ - name: Add the first Logical Interface Profile again - testing idempotency
cisco.aci.aci_l3out_logical_interface_profile:
- <<: *intf_present
- register: add_intf_again
+ <<: *aci_l3out_logical_interface_profile_present
+ register: nm_add_interface_profile_idempotency
- - name: Verify add_intf_again
- assert:
- that:
- - add_intf_again is not changed
-
- # UPDATE INTERFACE PROFILE
- - name: Update profile
- cisco.aci.aci_l3out_logical_interface_profile: &intf_update
- <<: *intf_present
- nd_policy: NDTEST
- description: new test
- register: update_intf
-
- - name: Verify update_intf
- assert:
+ - name: Add a second Logical Interface Profile (normal_mode)
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_logical_interface_profile_2_present
+ <<: *aci_np_present
+ interface_profile: ansible_interface_profile_2
+ description: Logical Interface Profile 2 for ansible_node_profile
+ state: present
+ register: nm_add_interface_profile_2
+
+ - name: Asserts for Logical Interface Profile creation tasks
+ ansible.builtin.assert:
that:
- - update_intf.sent.l3extLIfP.attributes.descr == 'new test'
- - update_intf is changed
- - update_intf.previous != []
+ - cm_add_interface_profile is changed
+ - cm_add_interface_profile.previous == []
+ - cm_add_interface_profile.current == []
+ - cm_add_interface_profile.proposed.l3extLIfP.attributes.name == "ansible_interface_profile_1"
+ - cm_add_interface_profile.proposed.l3extLIfP.attributes.prio == "level1"
+ - nm_add_interface_profile.proposed.l3extLIfP.children.0.l3extRsNdIfPol.attributes.tnNdIfPolName == "default"
+ - nm_add_interface_profile.proposed.l3extLIfP.children.1.l3extRsIngressQosDppPol.attributes.tnQosDppPolName == "default"
+ - nm_add_interface_profile.proposed.l3extLIfP.children.2.l3extRsEgressQosDppPol.attributes.tnQosDppPolName == "default"
+ - nm_add_interface_profile.proposed.l3extLIfP.children.3.l3extRsLIfPCustQosPol.attributes.tnQosCustomPolName == "default"
+ - nm_add_interface_profile.proposed.l3extLIfP.children.4.pimIPV6IfP.children.0.pimRsV6IfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - nm_add_interface_profile.proposed.l3extLIfP.children.5.pimIfP.children.0.pimRsIfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - nm_add_interface_profile.proposed.l3extLIfP.children.6.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == "uni/tn-common/igmpIfPol-default"
+ - nm_add_interface_profile is changed
+ - nm_add_interface_profile.previous == []
+ - nm_add_interface_profile.current.0.l3extLIfP.attributes.name == "ansible_interface_profile_1"
+ - nm_add_interface_profile.current.0.l3extLIfP.attributes.prio == "level1"
+ - nm_add_interface_profile.current.0.l3extLIfP.children.0.l3extRsLIfPCustQosPol.attributes.tnQosCustomPolName == "default"
+ - nm_add_interface_profile.current.0.l3extLIfP.children.1.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == "uni/tn-common/igmpIfPol-default"
+ - nm_add_interface_profile.current.0.l3extLIfP.children.2.pimIfP.children.0.pimRsIfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - nm_add_interface_profile.current.0.l3extLIfP.children.3.pimIPV6IfP.children.0.pimRsV6IfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - nm_add_interface_profile.current.0.l3extLIfP.children.4.l3extRsEgressQosDppPol.attributes.tnQosDppPolName == "default"
+ - nm_add_interface_profile.current.0.l3extLIfP.children.5.l3extRsIngressQosDppPol.attributes.tnQosDppPolName == "default"
+ - nm_add_interface_profile.current.0.l3extLIfP.children.6.l3extRsNdIfPol.attributes.tnNdIfPolName == "default"
+ - nm_add_interface_profile_idempotency is not changed
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.attributes.name == "ansible_interface_profile_1"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.attributes.prio == "level1"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.children.0.l3extRsLIfPCustQosPol.attributes.tnQosCustomPolName == "default"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.children.1.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == "uni/tn-common/igmpIfPol-default"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.children.2.pimIfP.children.0.pimRsIfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.children.3.pimIPV6IfP.children.0.pimRsV6IfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.children.4.l3extRsEgressQosDppPol.attributes.tnQosDppPolName == "default"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.children.5.l3extRsIngressQosDppPol.attributes.tnQosDppPolName == "default"
+ - nm_add_interface_profile_idempotency.current.0.l3extLIfP.children.6.l3extRsNdIfPol.attributes.tnNdIfPolName == "default"
+ - nm_add_interface_profile_2 is changed
+ - nm_add_interface_profile_2.previous == []
+ - nm_add_interface_profile_2.current.0.l3extLIfP.attributes.name == "ansible_interface_profile_2"
+ - nm_add_interface_profile_2.current.0.l3extLIfP.attributes.prio == "unspecified"
- # ADD ANOTHER PROFILE
- - name: Add another profile
+ # QUERY Logical Interface Profile
+ - name: Query all Logical Interface Profiles
cisco.aci.aci_l3out_logical_interface_profile:
- <<: *intf_present
- interface_profile: INTF2
+ <<: *aci_info
+ state: query
+ register: query_all_interface_profile
- # QUERY ALL PROFILES
- - name: Query all profiles
+ - name: Query ansible_interface_profile_1
cisco.aci.aci_l3out_logical_interface_profile:
- <<: *aci_info
+ <<: *aci_l3out_logical_interface_profile_present
state: query
- register: query_all_profiles
+ register: query_ansible_interface_profile_1
- - name: Verify query_all_profiles
- assert:
+ - name: Asserts query tasks
+ ansible.builtin.assert:
that:
- - query_all_profiles is not changed
- - query_all_profiles.current|length >= 1
+ - query_all_interface_profile is not changed
+ - query_all_interface_profile.current|length >= 2
+ - query_ansible_interface_profile_1 is not changed
+ - query_ansible_interface_profile_1.current|length == 1
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.attributes.name == "ansible_interface_profile_1"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.attributes.prio == "level1"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.children.0.l3extRsLIfPCustQosPol.attributes.tDn == "uni/tn-common/qoscustom-default"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.children.1.igmpIfP.children.0.igmpRsIfPol.attributes.tDn == "uni/tn-common/igmpIfPol-default"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.children.2.pimIfP.children.0.pimRsIfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.children.3.pimIPV6IfP.children.0.pimRsV6IfPol.attributes.tDn == "uni/tn-common/pimifpol-default"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.children.4.l3extRsEgressQosDppPol.attributes.tDn == "uni/tn-common/qosdpppol-default"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.children.5.l3extRsIngressQosDppPol.attributes.tDn == "uni/tn-common/qosdpppol-default"
+ - query_ansible_interface_profile_1.current.0.l3extLIfP.children.6.l3extRsNdIfPol.attributes.tDn == "uni/tn-common/ndifpol-default"
+
+ #REMOVE ASSOCIATED EPG/EXTERNAL EPG FROM NETFLOW EXPORTER POLICIES
+ - name: Remove all child classes from first Logical Interface Profile (check_mode)
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_logical_interface_profile_remove_child_classes
+ <<: *aci_l3out_logical_interface_profile_present
+ nd_policy: ""
+ egress_dpp_policy: ""
+ ingress_dpp_policy: ""
+ qos_custom_policy: ""
+ pim_v4_interface_profile: {}
+ pim_v6_interface_profile: {}
+ igmp_interface_profile: {}
+ check_mode: true
+ register: cm_remove_child_classes_interface_profile
- # QUERY A SPECIFIC PROFILE
- - name: Query a specific profile
+ - name: Remove all child classes from first Logical Interface Profile (normal_mode)
cisco.aci.aci_l3out_logical_interface_profile:
- <<: *intf_update
- state: query
- register: query_spec_profile
+ <<: *aci_l3out_logical_interface_profile_remove_child_classes
+ register: nm_remove_child_classes_interface_profile
+
+ - name: Remove all child classes from first Logical Interface Profile again - testing idempotency
+ cisco.aci.aci_l3out_logical_interface_profile:
+ <<: *aci_l3out_logical_interface_profile_remove_child_classes
+ register: nm_remove_child_classes_interface_profile_idempotency
- - name: Verify query_spec_profile
- assert:
+ - name: Asserts for child classes removal tasks
+ ansible.builtin.assert:
that:
- - query_spec_profile is not changed
- - query_spec_profile.current|length == 1
+ - cm_remove_child_classes_interface_profile is changed
+ - cm_remove_child_classes_interface_profile.current == cm_remove_child_classes_interface_profile.previous
+ - cm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.0.l3extRsNdIfPol.attributes.tnNdIfPolName == ""
+ - cm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.1.l3extRsIngressQosDppPol.attributes.tnQosDppPolName == ""
+ - cm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.2.l3extRsEgressQosDppPol.attributes.tnQosDppPolName == ""
+ - cm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.3.l3extRsLIfPCustQosPol.attributes.tnQosCustomPolName == ""
+ - cm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.4.pimIPV6IfP.attributes.status == "deleted"
+ - cm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.5.pimIfP.attributes.status == "deleted"
+ - cm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.6.igmpIfP.attributes.status == "deleted"
+ - nm_remove_child_classes_interface_profile is changed
+ - nm_remove_child_classes_interface_profile.current.0.l3extLIfP.children.0.l3extRsLIfPCustQosPol.attributes.tnQosCustomPolName == ""
+ - nm_remove_child_classes_interface_profile.current.0.l3extLIfP.children.1.l3extRsEgressQosDppPol.attributes.tnQosDppPolName == ""
+ - nm_remove_child_classes_interface_profile.current.0.l3extLIfP.children.2.l3extRsIngressQosDppPol.attributes.tnQosDppPolName == ""
+ - nm_remove_child_classes_interface_profile.current.0.l3extLIfP.children.3.l3extRsNdIfPol.attributes.tnNdIfPolName == ""
+ - nm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.4.pimIPV6IfP.attributes.status == "deleted"
+ - nm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.5.pimIfP.attributes.status == "deleted"
+ - nm_remove_child_classes_interface_profile.proposed.l3extLIfP.children.6.igmpIfP.attributes.status == "deleted"
+ - nm_remove_child_classes_interface_profile.current.0.l3extLIfP.children|length == 4
+ - nm_remove_child_classes_interface_profile_idempotency is not changed
+ - nm_remove_child_classes_interface_profile_idempotency.current.0.l3extLIfP.children.0.l3extRsLIfPCustQosPol.attributes.tnQosCustomPolName == ""
+ - nm_remove_child_classes_interface_profile_idempotency.current.0.l3extLIfP.children.1.l3extRsEgressQosDppPol.attributes.tnQosDppPolName == ""
+ - nm_remove_child_classes_interface_profile_idempotency.current.0.l3extLIfP.children.2.l3extRsIngressQosDppPol.attributes.tnQosDppPolName == ""
+ - nm_remove_child_classes_interface_profile_idempotency.current.0.l3extLIfP.children.3.l3extRsNdIfPol.attributes.tnNdIfPolName == ""
+ - nm_remove_child_classes_interface_profile_idempotency.current.0.l3extLIfP.children|length == 4
+
+ #UPDATE Logical Interface Profile
+ - name: Update first Logical Interface Profile (check_mode)
+ cisco.aci.aci_l3out_logical_interface_profile: &aci_l3out_logical_interface_profile_update
+ <<: *aci_l3out_logical_interface_profile_remove_child_classes
+ prio: level2
+ description: Updated description for first ansible Logical Interface Profile
+ check_mode: true
+ register: cm_update_interface_profile
- # QUERY A NON EXISTING PROFILE
- - name: Query a nonexisting profile
+ - name: Update first Logical Interface Profile (normal_mode)
cisco.aci.aci_l3out_logical_interface_profile:
- <<: *np_present
- interface_profile: nonexist
- state: query
- register: query_nonexist_profile
+ <<: *aci_l3out_logical_interface_profile_update
+ register: nm_update_interface_profile
+
+ - name: Update first Logical Interface Profile again - testing idempotency
+ cisco.aci.aci_l3out_logical_interface_profile:
+ <<: *aci_l3out_logical_interface_profile_update
+ register: nm_udpate_interface_profile_idempotency
- - name: Verify query_nonexist_profile
- assert:
+ - name: Asserts for Logical Interface Profile update tasks
+ ansible.builtin.assert:
that:
- - query_nonexist_profile is not changed
- - query_nonexist_profile.current == []
+ - cm_update_interface_profile is changed
+ - cm_update_interface_profile.previous == cm_update_interface_profile.current
+ - cm_update_interface_profile.proposed.l3extLIfP.attributes.prio == "level2"
+ - cm_update_interface_profile.proposed.l3extLIfP.attributes.descr == "Updated description for first ansible Logical Interface Profile"
+ - nm_update_interface_profile is changed
+ - nm_update_interface_profile.current.0.l3extLIfP.attributes.prio == "level2"
+ - nm_update_interface_profile.current.0.l3extLIfP.attributes.descr == "Updated description for first ansible Logical Interface Profile"
+ - nm_udpate_interface_profile_idempotency is not changed
+ - nm_udpate_interface_profile_idempotency.current.0.l3extLIfP.attributes.prio == "level2"
+ - nm_udpate_interface_profile_idempotency.current.0.l3extLIfP.attributes.descr == "Updated description for first ansible Logical Interface Profile"
- # REMOVE PROFILE
- - name: Remove interface profile
- cisco.aci.aci_l3out_logical_interface_profile: &intf_absent
- <<: *intf_update
+ # DELETE Logical Interface Profile
+ - name: Remove Logical Interface Profile (check_mode)
+ cisco.aci.aci_l3out_logical_interface_profile: &interface_profile_absent
+ <<: *aci_l3out_logical_interface_profile_update
state: absent
- register: remove_profile
+ check_mode: true
+ register: cm_remove_interface_profile
- - name: Verify remove_profile
- assert:
- that:
- - remove_profile is changed
- - remove_profile.current == []
+ - name: Remove Logical Interface Profile (normal_mode)
+ cisco.aci.aci_l3out_logical_interface_profile:
+ <<: *interface_profile_absent
+ register: nm_remove_interface_profile
- # REMOVE NONEXISTING PROFILE
- - name: Remove interface profile again (nonexisting)
+ - name: Remove Logical Interface Profile - testing idempotency
cisco.aci.aci_l3out_logical_interface_profile:
- <<: *intf_absent
- register: remove_nonexist_profile
+ <<: *interface_profile_absent
+ register: nm_remove_interface_profile_idempotency
- - name: Verify remove_nonexist_profile
- assert:
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
that:
- - remove_nonexist_profile is not changed
- - remove_nonexist_profile.current == []
+ - cm_remove_interface_profile is changed
+ - cm_remove_interface_profile.current == cm_remove_interface_profile.previous
+ - cm_remove_interface_profile.proposed == {}
+ - nm_remove_interface_profile is changed
+ - nm_remove_interface_profile.previous != []
+ - nm_remove_interface_profile.proposed == {}
+ - nm_remove_interface_profile.current == []
+ - nm_remove_interface_profile_idempotency is not changed
+ - nm_remove_interface_profile_idempotency.previous == []
+ - nm_remove_interface_profile_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
+
+ - name: Remove the ansible_dom - cleanup before ending tests
+ cisco.aci.aci_domain:
+ <<: *aci_domain_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile_ospf_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile_ospf_policy/tasks/main.yml
index d10a88a7f..e98864604 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile_ospf_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_profile_ospf_policy/tasks/main.yml
@@ -3,7 +3,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -21,7 +21,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -75,7 +75,7 @@
register: nm_add_ospfIfP
- name: Verify add_ospfIfP
- assert:
+ ansible.builtin.assert:
that:
- cm_add_ospfIfP is changed
- nm_add_ospfIfP is changed
@@ -88,7 +88,7 @@
register: nm_add_ospfIfP_again
- name: Verify add_ospfIfP_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_ospfIfP_again is not changed
@@ -101,7 +101,7 @@
register: update_ospfIfP
- name: Verify update_ospfIfP
- assert:
+ ansible.builtin.assert:
that:
- update_ospfIfP is changed
- update_ospfIfP.previous != []
@@ -116,7 +116,7 @@
register: query_ospfIfP_profile
- name: Verify query_ospfIfP_profile
- assert:
+ ansible.builtin.assert:
that:
- query_ospfIfP_profile is not changed
- query_ospfIfP_profile.current|length == 1
@@ -137,7 +137,7 @@
register: remove_profile_again
- name: Verify remove_profile and remove_profile_again
- assert:
+ ansible.builtin.assert:
that:
- remove_profile.previous|length == 1
- remove_profile.previous[0].ospfIfP.children[0].ospfRsIfPol.attributes.tnOspfIfPolName == 'default'
@@ -154,7 +154,7 @@
register: query_nonexist_policy
- name: Verify query_nonexist_policy
- assert:
+ ansible.builtin.assert:
that:
- query_nonexist_policy is not changed
- query_nonexist_policy.current == []
@@ -166,7 +166,7 @@
register: remove_nonexist_policy
- name: Verify remove_nonexist_policy
- assert:
+ ansible.builtin.assert:
that:
- remove_nonexist_policy is not changed
- remove_nonexist_policy.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_vpc_member/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_vpc_member/tasks/main.yml
index 749d2137f..755e93bea 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_vpc_member/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_interface_vpc_member/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a new L3Out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
name: ansible_l3out
@@ -69,7 +69,7 @@
state: present
- name: Add two vPC-interfaces
- aci_l3out_interface:
+ cisco.aci.aci_l3out_interface:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -85,7 +85,7 @@
- policy_group_two
- name: Add a VPC member based on path_dn
- aci_l3out_logical_interface_vpc_member:
+ cisco.aci.aci_l3out_logical_interface_vpc_member:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -97,13 +97,13 @@
register: l3out_logical_interface_vpc_member_present
- name: Assertions check for add a VPC member based on path_dn
- assert:
+ ansible.builtin.assert:
that:
- l3out_logical_interface_vpc_member_present is changed
- l3out_logical_interface_vpc_member_present.current.0.l3extMember.attributes.annotation == 'orchestrator:ansible'
- name: Add a VPC member based on pod_id, node_id, path_ep
- aci_l3out_logical_interface_vpc_member:
+ cisco.aci.aci_l3out_logical_interface_vpc_member:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -118,7 +118,7 @@
state: present
- name: Query a specific VPC member under ansible_l3out
- aci_l3out_logical_interface_vpc_member:
+ cisco.aci.aci_l3out_logical_interface_vpc_member:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -130,7 +130,7 @@
register: query_result
- name: Query all relationships
- aci_l3out_logical_interface_vpc_member:
+ cisco.aci.aci_l3out_logical_interface_vpc_member:
<<: *aci_info
tenant: ansible_tenant
state: query
@@ -138,7 +138,7 @@
register: query_result
- name: Remove a VPC member
- aci_l3out_logical_interface_vpc_member:
+ cisco.aci.aci_l3out_logical_interface_vpc_member:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node/tasks/main.yml
index 1d61ee3e3..52ae8d7d9 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node/tasks/main.yml
@@ -1,14 +1,16 @@
-# Author: Marcel Zehnder (@maercu)
+# Test code for the ACI modules
+# Copyright: (c) 2021, Marcel Zehnder (@maercu)
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -18,6 +20,13 @@
use_proxy: '{{ aci_use_proxy | default(true) }}'
output_level: '{{ aci_output_level | default("info") }}'
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
# CLEAN ENVIRONMENT
- name: Remove test tenant before we kickoff
cisco.aci.aci_tenant: &tenant_absent
@@ -26,7 +35,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -79,7 +88,7 @@
register: nm_add_node
- name: Verify nm_add_node
- assert:
+ ansible.builtin.assert:
that:
- cm_add_node is changed
- nm_add_node is changed
@@ -95,7 +104,7 @@
register: add_node_again
- name: Verify add_node_again
- assert:
+ ansible.builtin.assert:
that:
- add_node_again is not changed
@@ -119,7 +128,7 @@
register: remove_loopback_ip
- name: Verify update_node
- assert:
+ ansible.builtin.assert:
that:
- update_node is changed
- update_node.previous != []
@@ -138,6 +147,138 @@
router_id: 12.12.12.12
loopback_address: 12.12.12.13
+ - name: Execute tasks only for APIC version 5.x and above
+ when:
+ - version.current.0.topSystem.attributes.version is version('5', '>=') # This condition will execute only for APIC version 5.x and above
+ block:
+
+ - name: Ensure infra SR-MPLS l3out does not exist
+ cisco.aci.aci_l3out: &aci_infra_sr_mpls_l3out_absent
+ <<: *aci_info
+ tenant: infra
+ name: ansible_infra_sr_mpls_l3out
+ domain: ansible_dom
+ vrf: overlay-1
+ mpls: "yes"
+ l3protocol: bgp
+ state: absent
+
+ - name: Add a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+ state: present
+
+ - name: Add a node profile in the infra SR-MPLS l3out
+ cisco.aci.aci_l3out_logical_node_profile: &aci_infra_node_profile
+ <<: *aci_info
+ tenant: infra
+ l3out: ansible_infra_sr_mpls_l3out
+ node_profile: ansible_infra_sr_mpls_l3out_node_profile
+
+ - name: Add a node in the infra SR-MPLS l3out node profile (check_mode)
+ cisco.aci.aci_l3out_logical_node: &aci_infra_node_profile_node
+ <<: *aci_infra_node_profile
+ tenant: infra
+ l3out: ansible_infra_sr_mpls_l3out
+ node_profile: ansible_infra_sr_mpls_l3out_node_profile
+ pod_id: 1
+ node_id: 113
+ router_id_as_loopback: no
+ loopback_address: 50.0.0.1
+ mpls_transport_loopback_address: 51.0.0.1
+ sid: 500
+ check_mode: true
+ register: cm_add_infra_node_profile_node
+
+ - name: Add a node in the infra SR-MPLS l3out node profile without loopback (error)
+ cisco.aci.aci_l3out_logical_node:
+ <<: *aci_infra_node_profile_node
+ loopback_address: "{{ fake_var | default(omit) }}"
+ ignore_errors: true
+ register: err_add_infra_node_profile_node_without_loopback
+
+ - name: Add a node in the infra SR-MPLS l3out node profile without sid (error)
+ cisco.aci.aci_l3out_logical_node:
+ <<: *aci_infra_node_profile_node
+ sid: "{{ fake_var | default(omit) }}"
+ ignore_errors: true
+ register: err_add_infra_node_profile_node_without_sid
+
+ - name: Add a node in the infra SR-MPLS l3out node profile without mpls transport loopback addressid (error)
+ cisco.aci.aci_l3out_logical_node:
+ <<: *aci_infra_node_profile_node
+ mpls_transport_loopback_address: "{{ fake_var | default(omit) }}"
+ ignore_errors: true
+ register: err_add_infra_node_profile_node_without_mpls_transport_loopback_address
+
+ - name: Add a node in the infra SR-MPLS l3out node profile (normal mode)
+ cisco.aci.aci_l3out_logical_node:
+ <<: *aci_infra_node_profile_node
+ register: nm_add_infra_node_profile_node
+
+ - name: Add a node in the infra SR-MPLS l3out node profile again
+ cisco.aci.aci_l3out_logical_node:
+ <<: *aci_infra_node_profile_node
+ register: nm_add_infra_node_profile_node_again
+
+ - name: Change the node in the infra SR-MPLS l3out node profile
+ cisco.aci.aci_l3out_logical_node:
+ <<: *aci_infra_node_profile_node
+ loopback_address: 50.0.0.2
+ mpls_transport_loopback_address: 51.0.0.2
+ sid: 501
+ register: nm_change_infra_node_profile_node
+
+ - name: Verify mpls custom qos policy configuration on node profile
+ assert:
+ that:
+ - cm_add_infra_node_profile_node is changed
+ - cm_add_infra_node_profile_node.previous == []
+ - cm_add_infra_node_profile_node.proposed.l3extRsNodeL3OutAtt.attributes.rtrIdLoopBack == "no"
+ - cm_add_infra_node_profile_node.proposed.l3extRsNodeL3OutAtt.attributes.tDn == "topology/pod-1/node-113"
+ - cm_add_infra_node_profile_node.proposed.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.attributes.addr == "50.0.0.1"
+ - cm_add_infra_node_profile_node.proposed.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.loopbackAddr == "51.0.0.1"
+ - cm_add_infra_node_profile_node.proposed.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.sidoffset == "500"
+ - err_add_infra_node_profile_node_without_loopback is failed
+ - err_add_infra_node_profile_node_without_loopback.msg == "missing parameter(s) required by 'mpls_transport_loopback_address'{{":"}} loopback_address"
+ - err_add_infra_node_profile_node_without_sid is failed
+ - err_add_infra_node_profile_node_without_sid.msg == "parameters are required together{{":"}} mpls_transport_loopback_address, sid"
+ - err_add_infra_node_profile_node_without_mpls_transport_loopback_address is failed
+ - err_add_infra_node_profile_node_without_mpls_transport_loopback_address.msg == "parameters are required together{{":"}} mpls_transport_loopback_address, sid"
+ - nm_add_infra_node_profile_node is changed
+ - nm_add_infra_node_profile_node.previous == []
+ - nm_add_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.attributes.rtrIdLoopBack == "no"
+ - nm_add_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.attributes.tDn == "topology/pod-1/node-113"
+ - nm_add_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.attributes.addr == "50.0.0.1"
+ - nm_add_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.loopbackAddr == "51.0.0.1"
+ - nm_add_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.sidoffset == "500"
+ - nm_add_infra_node_profile_node_again is not changed
+ - nm_add_infra_node_profile_node_again.previous.0.l3extRsNodeL3OutAtt.attributes.rtrIdLoopBack == "no"
+ - nm_add_infra_node_profile_node_again.previous.0.l3extRsNodeL3OutAtt.attributes.tDn == "topology/pod-1/node-113"
+ - nm_add_infra_node_profile_node_again.previous.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.attributes.addr == "50.0.0.1"
+ - nm_add_infra_node_profile_node_again.previous.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.loopbackAddr == "51.0.0.1"
+ - nm_add_infra_node_profile_node_again.previous.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.sidoffset == "500"
+ - nm_add_infra_node_profile_node_again.current.0.l3extRsNodeL3OutAtt.attributes.rtrIdLoopBack == "no"
+ - nm_add_infra_node_profile_node_again.current.0.l3extRsNodeL3OutAtt.attributes.tDn == "topology/pod-1/node-113"
+ - nm_add_infra_node_profile_node_again.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.attributes.addr == "50.0.0.1"
+ - nm_add_infra_node_profile_node_again.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.loopbackAddr == "51.0.0.1"
+ - nm_add_infra_node_profile_node_again.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.sidoffset == "500"
+ - nm_change_infra_node_profile_node is changed
+ - nm_change_infra_node_profile_node.previous.0.l3extRsNodeL3OutAtt.attributes.rtrIdLoopBack == "no"
+ - nm_change_infra_node_profile_node.previous.0.l3extRsNodeL3OutAtt.attributes.tDn == "topology/pod-1/node-113"
+ - nm_change_infra_node_profile_node.previous.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.attributes.addr == "50.0.0.1"
+ - nm_change_infra_node_profile_node.previous.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.loopbackAddr == "51.0.0.1"
+ - nm_change_infra_node_profile_node.previous.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.sidoffset == "500"
+ - nm_change_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.attributes.rtrIdLoopBack == "no"
+ - nm_change_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.attributes.tDn == "topology/pod-1/node-113"
+ - nm_change_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.attributes.addr == "50.0.0.2"
+ - nm_change_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.loopbackAddr == "51.0.0.2"
+ - nm_change_infra_node_profile_node.current.0.l3extRsNodeL3OutAtt.children.0.l3extLoopBackIfP.children.0.mplsNodeSidP.attributes.sidoffset == "501"
+
+ - name: Remove a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+
# QUERY ALL NODES
- name: Query all nodes
cisco.aci.aci_l3out_logical_node:
@@ -146,7 +287,7 @@
register: query_all_nodes
- name: Verify query_all_nodes
- assert:
+ ansible.builtin.assert:
that:
- query_all_nodes is not changed
- query_all_nodes.current|length >= 1
@@ -159,7 +300,7 @@
register: query_spec_node
- name: Verify query_spec_node
- assert:
+ ansible.builtin.assert:
that:
- query_spec_node is not changed
- query_spec_node.current|length == 1
@@ -174,7 +315,7 @@
register: remove_node
- name: Verify remove_node
- assert:
+ ansible.builtin.assert:
that:
- remove_node is changed
- remove_node.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node_profile/tasks/main.yml
index cbd3fa1a9..a744027d9 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_logical_node_profile/tasks/main.yml
@@ -1,15 +1,16 @@
# Test code for the ACI modules
# Copyright: (c) 2021, Jason Juenger (@jasonjuenger)
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -19,6 +20,13 @@
use_proxy: '{{ aci_use_proxy | default(true) }}'
output_level: info
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
cisco.aci.aci_tenant:
@@ -27,7 +35,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -79,7 +87,7 @@
register: nm_add_second_node_profile
- name: Verify add_node_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_add_node_profile is changed
- nm_add_node_profile is changed
@@ -111,7 +119,7 @@
register: nm_mod_node_profile
- name: Verify mod_node_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_mod_node_profile is changed
- nm_mod_node_profile is changed
@@ -120,6 +128,73 @@
- nm_mod_node_profile.current.0.l3extLNodeP.attributes.dn == 'uni/tn-ansible_tenant/out-ansible_l3out/lnodep-ansible_node_profile'
- nm_mod_node_profile.current.0.l3extLNodeP.attributes.name == 'ansible_node_profile'
+ - name: Execute tasks only for APIC version 5.x and above
+ when:
+ - version.current.0.topSystem.attributes.version is version('5', '>=') # This condition will execute only for APIC version 5.x and above
+ block:
+
+ - name: Ensure infra SR-MPLS l3out does not exist
+ cisco.aci.aci_l3out: &aci_infra_sr_mpls_l3out_absent
+ <<: *aci_info
+ tenant: infra
+ name: ansible_infra_sr_mpls_l3out
+ domain: ansible_dom
+ vrf: overlay-1
+ mpls: "yes"
+ l3protocol: bgp
+ state: absent
+
+ - name: Add a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+ state: present
+
+ - name: Add a node profile with MPLS custom QoS policy
+ cisco.aci.aci_l3out_logical_node_profile: &aci_infra_node_profile_qos
+ <<: *aci_info
+ tenant: infra
+ l3out: ansible_infra_sr_mpls_l3out
+ node_profile: ansible_infra_sr_mpls_l3out_node_profile
+ mpls_custom_qos_policy: ansible_test_mpls_custom_qos_policy
+ register: nm_add_node_profile_qos
+
+ - name: Modify MPLS custom QoS policy to node profile
+ cisco.aci.aci_l3out_logical_node_profile: &aci_infra_node_profile_qos_changed
+ <<: *aci_infra_node_profile_qos
+ mpls_custom_qos_policy: ansible_test_mpls_custom_qos_policy_changed
+ register: nm_mod_node_profile_qos_changed
+
+ - name: Modify MPLS custom QoS policy to node profile again
+ cisco.aci.aci_l3out_logical_node_profile:
+ <<: *aci_infra_node_profile_qos_changed
+ register: nm_mod_node_profile_qos_again
+
+ - name: Remove MPLS custom QoS policy from node profile again
+ cisco.aci.aci_l3out_logical_node_profile:
+ <<: *aci_infra_node_profile_qos_changed
+ mpls_custom_qos_policy: ""
+ register: nm_del_node_profile_qos
+
+ - name: Verify MPLS custom QoS policy configuration on node profile
+ assert:
+ that:
+ - nm_add_node_profile_qos is changed
+ - nm_add_node_profile_qos.previous == []
+ - nm_add_node_profile_qos.current.0.l3extLNodeP.children.0.l3extRsLNodePMplsCustQosPol.attributes.tDn == "uni/tn-infra/qosmplscustom-ansible_test_mpls_custom_qos_policy"
+ - nm_mod_node_profile_qos_changed is changed
+ - nm_mod_node_profile_qos_changed.previous.0.l3extLNodeP.children.0.l3extRsLNodePMplsCustQosPol.attributes.tDn == "uni/tn-infra/qosmplscustom-ansible_test_mpls_custom_qos_policy"
+ - nm_mod_node_profile_qos_changed.current.0.l3extLNodeP.children.0.l3extRsLNodePMplsCustQosPol.attributes.tDn == "uni/tn-infra/qosmplscustom-ansible_test_mpls_custom_qos_policy_changed"
+ - nm_mod_node_profile_qos_again is not changed
+ - nm_mod_node_profile_qos_again.previous.0.l3extLNodeP.children.0.l3extRsLNodePMplsCustQosPol.attributes.tDn == "uni/tn-infra/qosmplscustom-ansible_test_mpls_custom_qos_policy_changed"
+ - nm_mod_node_profile_qos_again.current.0.l3extLNodeP.children.0.l3extRsLNodePMplsCustQosPol.attributes.tDn == "uni/tn-infra/qosmplscustom-ansible_test_mpls_custom_qos_policy_changed"
+ - nm_del_node_profile_qos is changed
+ - nm_del_node_profile_qos.previous.0.l3extLNodeP.children.0.l3extRsLNodePMplsCustQosPol.attributes.tDn == "uni/tn-infra/qosmplscustom-ansible_test_mpls_custom_qos_policy_changed"
+ - nm_del_node_profile_qos.current.0.l3extLNodeP.children is undefined
+
+ - name: Remove a infra SR-MPLS l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+
- name: Query existing node profile (check mode)
cisco.aci.aci_l3out_logical_node_profile: &query_existing_node_profile
<<: *aci_info
@@ -153,7 +228,7 @@
register: nm_query_all_node_profiles
- name: Verify query_node_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_query_node_profile is not changed
- nm_query_node_profile is not changed
@@ -198,7 +273,7 @@
register: nm_remove_second_node_profile
- name: Verify remove_node_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_node_profile is changed
- cm_remove_second_node_profile is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_route_tag_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_route_tag_policy/tasks/main.yml
index d7ad61c6d..69b19c53f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_route_tag_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_route_tag_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -27,7 +27,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -66,7 +66,7 @@
register: nm_add_rtp_2
- name: asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_rtp is changed
- cm_add_rtp.previous == []
@@ -93,7 +93,7 @@
register: query_first_rtp
- name: asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_rtp is not changed
- query_all_rtp.current.0.fvTenant.children | length >= 2
@@ -130,7 +130,7 @@
register: nm_delete_rtp_2
- name: asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_rtp is changed
- cm_delete_rtp.proposed == {}
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes/tasks/main.yml
index 147d180fc..90f8c4cbb 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a new L3Out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
name: ansible_l3out
@@ -71,7 +71,7 @@
register: l3out_logical_node
- name: Verify l3out_logical_node
- assert:
+ ansible.builtin.assert:
that:
- l3out_logical_node is changed
- l3out_logical_node.previous == []
@@ -80,7 +80,7 @@
- l3out_logical_node.sent.l3extRsNodeL3OutAtt.attributes.tDn == 'topology/pod-1/node-101'
- name: Add static routes (check_mode)
- aci_l3out_static_routes: &route_present
+ cisco.aci.aci_l3out_static_routes: &route_present
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -93,12 +93,12 @@
register: cm_add_route
- name: Add static routes (normal_mode)
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *route_present
register: nm_add_route
- name: Verify cm_add_route and nm_add_route
- assert:
+ ansible.builtin.assert:
that:
- cm_add_route is changed
- nm_add_route is changed
@@ -109,18 +109,18 @@
- nm_add_route.current[0].ipRouteP.attributes.annotation == 'orchestrator:ansible'
- name: Add static routes again (check_mode)
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *route_present
check_mode: true
register: cm_add_route_again
- name: Add static routes again (normal_mode)
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *route_present
register: nm_add_route_again
- name: Verify cm_add_route_again and nm_add_route_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_route_again is not changed
- nm_add_route_again is not changed
@@ -130,14 +130,14 @@
- nm_add_route_again.current[0].ipRouteP.attributes.ip == "10.1.0.1/24"
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: version
- name: Add static routes with bfd
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -152,7 +152,7 @@
register: nm_add_route_with_bfd
- name: Verify nm_add_route_with_bfd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_route_with_bfd is changed
- nm_add_route_with_bfd.current[0].ipRouteP.attributes.dn == "uni/tn-ansible_tenant/out-ansible_l3out/lnodep-lNode/rsnodeL3OutAtt-[topology/pod-1/node-101]/rt-[10.1.0.1/24]"
@@ -162,7 +162,7 @@
when: version.current.0.topSystem.attributes.version is version('4.2', '>=')
- name: Query for a specific MO under l3out
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -174,14 +174,14 @@
register: query_specific_mo
- name: Verify query_specific_mo
- assert:
+ ansible.builtin.assert:
that:
- query_specific_mo is not changed
- query_specific_mo.current|length == 1
- query_specific_mo.current[0].ipRouteP.attributes.ip == "10.1.0.1/24"
- name: Query all relationships
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *aci_info
tenant: ansible_tenant
state: query
@@ -189,7 +189,7 @@
register: query_all_relationships
- name: Verify query_all_relationships
- assert:
+ ansible.builtin.assert:
that:
- query_all_relationships is not changed
- query_all_relationships.current|length == 1
@@ -201,13 +201,13 @@
- query_all_relationships.current[0].fvTenant.children[0].l3extOut.children[0].l3extLNodeP.children[0].l3extRsNodeL3OutAtt.attributes.tDn == "topology/pod-1/node-101"
- name: Verify query_all_relationships for bfd
- assert:
+ ansible.builtin.assert:
that:
- query_all_relationships.current[0].fvTenant.children[0].l3extOut.children[0].l3extLNodeP.children[0].l3extRsNodeL3OutAtt.children[0].ipRouteP.attributes.rtCtrl == "bfd"
when: version.current.0.topSystem.attributes.version is version('4.2', '>=')
- name: Remove static routes (check_mode)
- aci_l3out_static_routes: &route_absent
+ cisco.aci.aci_l3out_static_routes: &route_absent
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -220,12 +220,12 @@
register: cm_remove_static_routes
- name: Remove static routes (normal_mode)
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *route_absent
register: nm_remove_static_routes
- name: Verify cm_remove_static_routes and nm_remove_static_routes
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_static_routes is changed
- nm_remove_static_routes is changed
@@ -233,18 +233,18 @@
- nm_remove_static_routes.current|length == 0
- name: Remove static routes again (check_mode)
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *route_absent
check_mode: true
register: cm_remove_static_routes_again
- name: Remove static routes again (normal_mode)
- aci_l3out_static_routes:
+ cisco.aci.aci_l3out_static_routes:
<<: *route_absent
register: nm_remove_static_routes_again
- name: Verify cm_remove_static_routes_again and nm_remove_static_routes_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_static_routes_again is not changed
- nm_remove_static_routes_again is not changed
@@ -252,7 +252,7 @@
- nm_remove_static_routes_again.current|length == 0
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes_nexthop/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes_nexthop/tasks/main.yml
index 7d4de1a09..1e7d495fe 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes_nexthop/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_static_routes_nexthop/tasks/main.yml
@@ -3,7 +3,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -21,7 +21,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -85,7 +85,7 @@
register: nm_add_nh
- name: Verify nm_add_nh
- assert:
+ ansible.builtin.assert:
that:
- cm_add_nh is changed
- nm_add_nh is changed
@@ -99,7 +99,7 @@
register: add_nh_again
- name: Verify add_nh_again
- assert:
+ ansible.builtin.assert:
that:
- add_nh_again is not changed
@@ -117,7 +117,7 @@
register: query_all_nhs
- name: Verify query_all_nhs
- assert:
+ ansible.builtin.assert:
that:
- query_all_nhs is not changed
- query_all_nhs.current|length >= 1
@@ -130,7 +130,7 @@
register: query_spec_nh
- name: Verify query_spec_node
- assert:
+ ansible.builtin.assert:
that:
- query_spec_nh is not changed
- query_spec_nh.current|length == 1
@@ -143,7 +143,7 @@
register: remove_nh
- name: Verify remove_nh
- assert:
+ ansible.builtin.assert:
that:
- remove_nh is changed
- remove_nh.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/tasks/main.yml
new file mode 100644
index 000000000..f4e987492
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_l3out_to_sr_mpls_infra_l3out/tasks/main.yml
@@ -0,0 +1,238 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: debug
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when:
+ - query_cloud.current == [] # This condition will execute only non-cloud sites
+ - version.current.0.topSystem.attributes.version is version('5', '>=') # This condition will execute only for APIC version 5.x and above
+ block: # block specifies execution of tasks within, based on conditions
+
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_test
+ state: absent
+
+ - name: Ensure infra sr mpls l3out does not exist
+ cisco.aci.aci_l3out: &aci_infra_sr_mpls_l3out_absent
+ <<: *aci_info
+ tenant: infra
+ name: ansible_infra_sr_mpls_l3out
+ domain: ansible_dom
+ vrf: overlay-1
+ mpls: "yes"
+ l3protocol: bgp
+ state: absent
+
+ - name: Add a new ansible_tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_absent
+ state: present
+
+ - name: Add a infra sr mpls l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
+ state: present
+
+ - name: Add a sr mpls l3out
+ cisco.aci.aci_l3out:
+ <<: *aci_tenant_absent
+ name: ansible_sr_mpls_l3out
+ domain: ansible_dom
+ vrf: ansible_vrf
+ mpls: "yes"
+ state: present
+
+ - name: Add a new l3out to sr-mpls infra l3out (check_mode)
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out: &l3out_to_infra_present
+ <<: *aci_tenant_absent
+ l3out: ansible_sr_mpls_l3out
+ description: ansible_sr_mpls_l3out_description
+ infra_l3out: ansible_infra_sr_mpls_l3out
+ external_epg: uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg
+ outbound_route_map: uni/tn-ansible_test/prof-outbound_route_map
+ state: present
+ check_mode: true
+ register: cm_add_l3out_to_infra
+
+ - name: Add a new l3out to sr-mpls infra l3out
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ <<: *l3out_to_infra_present
+ register: nm_add_l3out_to_infra
+
+ - name: Add a new l3out to sr-mpls infra l3out again
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ <<: *l3out_to_infra_present
+ register: nm_add_l3out_to_infra_again
+
+ - name: Assert creation of l3out to sr-mpls infra l3outs
+ ansible.builtin.assert:
+ that:
+ - cm_add_l3out_to_infra is changed
+ - cm_add_l3out_to_infra.previous == []
+ - cm_add_l3out_to_infra.proposed.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - cm_add_l3out_to_infra.proposed.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description"
+ - cm_add_l3out_to_infra.proposed.l3extConsLbl.children.0.l3extRsLblToProfile.attributes.direction == "export"
+ - cm_add_l3out_to_infra.proposed.l3extConsLbl.children.0.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map"
+ - cm_add_l3out_to_infra.proposed.l3extConsLbl.children.1.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg"
+ - nm_add_l3out_to_infra is changed
+ - nm_add_l3out_to_infra.previous == []
+ - nm_add_l3out_to_infra.current.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_add_l3out_to_infra.current.0.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description"
+ - nm_add_l3out_to_infra.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.direction == "export"
+ - nm_add_l3out_to_infra.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map"
+ - nm_add_l3out_to_infra.current.0.l3extConsLbl.children.0.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg"
+ - nm_add_l3out_to_infra_again is not changed
+ - nm_add_l3out_to_infra_again.previous.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_add_l3out_to_infra_again.previous.0.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description"
+ - nm_add_l3out_to_infra_again.previous.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.direction == "export"
+ - nm_add_l3out_to_infra_again.previous.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map"
+ - nm_add_l3out_to_infra_again.previous.0.l3extConsLbl.children.0.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg"
+ - nm_add_l3out_to_infra_again.current.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_add_l3out_to_infra_again.current.0.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description"
+ - nm_add_l3out_to_infra_again.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.direction == "export"
+ - nm_add_l3out_to_infra_again.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map"
+ - nm_add_l3out_to_infra_again.current.0.l3extConsLbl.children.0.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg"
+
+ - name: Update a l3out to sr-mpls infra l3out
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out: &l3out_to_infra_present_updated
+ <<: *l3out_to_infra_present
+ description: ansible_sr_mpls_l3out_description_updated
+ external_epg: uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg_updated
+ outbound_route_map: uni/tn-ansible_test/prof-outbound_route_map_updated
+ inbound_route_map: uni/tn-ansible_test/prof-inbound_route_map
+ register: nm_update_l3out_to_infra
+
+ - name: Update a l3out to sr-mpls infra l3out to remove inbound route map
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ <<: *l3out_to_infra_present_updated
+ inbound_route_map: ""
+ register: nm_update_l3out_to_infra_remove_inbound_route_map
+
+ - name: Assert updates of l3out to sr-mpls infra l3outs
+ ansible.builtin.assert:
+ that:
+ - nm_update_l3out_to_infra is changed
+ - nm_update_l3out_to_infra.previous.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_update_l3out_to_infra.previous.0.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description"
+ - nm_update_l3out_to_infra.previous.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.direction == "export"
+ - nm_update_l3out_to_infra.previous.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map"
+ - nm_update_l3out_to_infra.previous.0.l3extConsLbl.children.0.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg"
+ - nm_update_l3out_to_infra.previous.0.l3extConsLbl.children | length == 2
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description_updated"
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.direction == "import"
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-inbound_route_map"
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.children.2.l3extRsLblToProfile.attributes.direction == "export"
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.children.2.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map_updated"
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.children.0.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg_updated"
+ - nm_update_l3out_to_infra.current.0.l3extConsLbl.children | length == 3
+ - nm_update_l3out_to_infra_remove_inbound_route_map is changed
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description_updated"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.direction == "import"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-inbound_route_map"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.children.2.l3extRsLblToProfile.attributes.direction == "export"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.children.2.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map_updated"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.children.0.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg_updated"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.previous.0.l3extConsLbl.children | length == 3
+ - nm_update_l3out_to_infra_remove_inbound_route_map.current.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.current.0.l3extConsLbl.attributes.descr == "ansible_sr_mpls_l3out_description_updated"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.direction == "export"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.current.0.l3extConsLbl.children.1.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map_updated"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.current.0.l3extConsLbl.children.0.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg_updated"
+ - nm_update_l3out_to_infra_remove_inbound_route_map.current.0.l3extConsLbl.children | length == 2
+
+ - name: Query a l3out to sr-mpls infra l3out
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ <<: *l3out_to_infra_present
+ state: query
+ register: query_one
+
+ - name: Query all l3out to sr-mpls infra l3outs
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ <<: *aci_info
+ state: query
+ register: query_all
+
+ - name: Assert l3out to sr-mpls infra l3outs queries
+ ansible.builtin.assert:
+ that:
+ - query_one is not changed
+ - query_one.current | length == 1
+ - query_one.current.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - query_one.current.0.l3extConsLbl.children | length == 4
+ - query_one.current.0.l3extConsLbl.children.0.bgpDomainIdAllocator.attributes.rn == "bgpdomainid"
+ - query_one.current.0.l3extConsLbl.children.1.l3extRsProvLblDef.attributes.tDn == "resPolCont/tn-[uni/tn-infra]/provlbl-ansible_infra_sr_mpls_l3out"
+ - query_one.current.0.l3extConsLbl.children.2.l3extRsLblToInstP.attributes.tDn == "uni/tn-ansible_test/out-ansible_sr_mpls_l3out/instP-ansible_external_epg_updated"
+ - query_one.current.0.l3extConsLbl.children.3.l3extRsLblToProfile.attributes.tDn == "uni/tn-ansible_test/prof-outbound_route_map_updated"
+ - query_all is not changed
+ - query_all.current | length >= 1
+
+ - name: Delete a l3out to sr-mpls infra l3out (check_mode)
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out: &l3out_to_infra_absent
+ <<: *l3out_to_infra_present
+ state: absent
+ check_mode: true
+ register: cm_delete_l3out_to_infra
+
+ - name: Delete a l3out to sr-mpls infra l3out
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ <<: *l3out_to_infra_absent
+ register: nm_delete_l3out_to_infra
+
+ - name: Delete a l3out to sr-mpls infra l3out again
+ cisco.aci.aci_l3out_to_sr_mpls_infra_l3out:
+ <<: *l3out_to_infra_absent
+ register: nm_delete_l3out_to_infra_again
+
+ - name: Assert deletion of l3out to sr-mpls infra l3outs
+ ansible.builtin.assert:
+ that:
+ - cm_delete_l3out_to_infra is changed
+ - cm_delete_l3out_to_infra.previous.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - cm_delete_l3out_to_infra.proposed == {}
+ - nm_delete_l3out_to_infra is changed
+ - nm_delete_l3out_to_infra.previous.0.l3extConsLbl.attributes.name == "ansible_infra_sr_mpls_l3out"
+ - nm_delete_l3out_to_infra.current == []
+ - nm_delete_l3out_to_infra_again is not changed
+ - nm_delete_l3out_to_infra_again.previous == []
+ - nm_delete_l3out_to_infra_again.current == []
+
+ # CLEAN ENVIRONMENT END OF TESTS
+ - name: Delete the ansible_tenant at the end of tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_absent
+
+ - name: Delete a infra sr mpls l3out at the end of tests
+ cisco.aci.aci_l3out:
+ <<: *aci_infra_sr_mpls_l3out_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_lookup_interface_range/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_lookup_interface_range/tasks/main.yml
index 5660d0b87..cac0c5b52 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_lookup_interface_range/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_lookup_interface_range/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -26,7 +26,7 @@
register: single_string_single_range
- name: Valid input assertions
- assert:
+ ansible.builtin.assert:
that:
- single_string_single_range.results.0.item == "5/0"
- single_string_single_range.results.1.item == "5/1"
@@ -39,7 +39,7 @@
register: single_string_multiple_interface
- name: Valid input assertions
- assert:
+ ansible.builtin.assert:
that:
- single_string_multiple_interface.results.0.item == "1/1"
- single_string_multiple_interface.results.1.item == "1/2"
@@ -59,7 +59,7 @@
register: single_string_single_interface_as_range
- name: Valid input assertions
- assert:
+ ansible.builtin.assert:
that:
- single_string_single_interface_as_range.results.0.item == "1/1"
@@ -70,7 +70,7 @@
register: single_string_mix_ranges
- name: Valid input assertions
- assert:
+ ansible.builtin.assert:
that:
- single_string_mix_ranges.results.0.item == "1/1"
- single_string_mix_ranges.results.1.item == "1/2"
@@ -101,7 +101,7 @@
register: invalid_range_order
- name: Invalid input assertions
- assert:
+ ansible.builtin.assert:
that:
- "'Invalid range inputs,' in invalid_pattern.msg"
- "'Invalid range inputs,' in invalid_range_order.msg"
@@ -121,7 +121,7 @@
msg: "{{ disable_leaf_int }}"
- name: Valid disable interface assertions
- assert:
+ ansible.builtin.assert:
that:
- disable_leaf_int.results.0.current.0.fabricRsOosPath.attributes.lc == "blacklist"
- disable_leaf_int.results.0.current.0.fabricRsOosPath.attributes.tDn == "topology/pod-1/paths-1101/pathep-[eth1/30]"
@@ -141,7 +141,7 @@
register: enable_leaf_int
- name: Valid enable interface assertions
- assert:
+ ansible.builtin.assert:
that:
- enable_leaf_int.results.0.current == []
- enable_leaf_int.results.1.current == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group/tasks/main.yml
index 12284c8a6..b3a6701f4 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,27 +20,27 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Create Scheduler
- aci_fabric_scheduler: &aci_fabric_scheduler_present
+ cisco.aci.aci_fabric_scheduler: &aci_fabric_scheduler_present
<<: *aci_info
name: anstest_scheduler
state: present
- name: Create maintenance policy
- aci_maintenance_policy: &aci_maintenance_policy_present
+ cisco.aci.aci_maintenance_policy: &aci_maintenance_policy_present
<<: *aci_info
name: anstest_policy
scheduler: anstest_scheduler
state: present
- name: Ensure first maintenance group does not exist
- aci_maintenance_group: &aci_maintenance_group_absent
+ cisco.aci.aci_maintenance_group: &aci_maintenance_group_absent
<<: *aci_info
group: anstest_group
policy: anstest_policy
@@ -50,37 +50,37 @@
state: absent
- name: Ensure second maintenance group does not exist
- aci_maintenance_group: &aci_maintenance_group_2_absent
+ cisco.aci.aci_maintenance_group: &aci_maintenance_group_2_absent
<<: *aci_info
group: anstest_group_2
policy: anstest_policy_2
state: absent
- name: Create first maintenance group (check_mode)
- aci_maintenance_group: &aci_maintenance_group_present
+ cisco.aci.aci_maintenance_group: &aci_maintenance_group_present
<<: *aci_maintenance_group_absent
state: present
check_mode: true
register: cm_add_maintenance_group_1
- name: Create first maintenance group (normal_mode)
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_present
register: nm_add_maintenance_group_1
- name: Create first maintenance group again - testing idempotency
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_present
register: idempotency_add_maintenance_group_1
- name: Create second maintenance group
- aci_maintenance_group: &aci_maintenance_group_2_present
+ cisco.aci.aci_maintenance_group: &aci_maintenance_group_2_present
<<: *aci_maintenance_group_2_absent
state: present
register: nm_add_maintenance_group_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_maintenance_group_1 is changed
- cm_add_maintenance_group_1.previous == []
@@ -99,19 +99,19 @@
- name: Query all maintenance groups
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_info
state: query
register: query_all_maintenance_group
- name: Query first maintenance group
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_present
state: query
register: query_first_maintenance_group
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_maintenance_group is not changed
- query_all_maintenance_group.current | length >= 2
@@ -126,32 +126,32 @@
- query_first_maintenance_group.current.0.maintMaintGrp.attributes.type == "ALL"
- name: Delete first maintenance group (check_mode)
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_present
state: absent
check_mode: true
register: cm_delete_maintenance_group_1
- name: Delete first maintenance group (normal_mode)
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_present
state: absent
register: nm_delete_maintenance_group_1
- name: Delete first maintenance group again - testing idempotency
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_present
state: absent
register: idempotency_delete_maintenance_group_1
- name: Delete second maintenance group (normal_mode)
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_2_present
state: absent
register: nm_delete_maintenance_group_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_maintenance_group_1 is changed
- cm_delete_maintenance_group_1.proposed == {}
@@ -165,11 +165,11 @@
- nm_delete_maintenance_group_2.current == []
- name: Delete maintenance policy - clean up the environment
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
state: absent
- name: Delete scheduler - clean up the environment
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group_node/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group_node/tasks/main.yml
index 9be9ecbe8..d2223e892 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group_node/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_group_node/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,71 +20,71 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Create Scheduler
- aci_fabric_scheduler: &aci_fabric_scheduler_present
+ cisco.aci.aci_fabric_scheduler: &aci_fabric_scheduler_present
<<: *aci_info
name: anstest_scheduler
state: present
- name: Create maintenance policy
- aci_maintenance_policy: &aci_maintenance_policy_present
+ cisco.aci.aci_maintenance_policy: &aci_maintenance_policy_present
<<: *aci_info
name: anstest_policy
scheduler: anstest_scheduler
state: present
- name: Create maintenance groupe
- aci_maintenance_group: &aci_maintenance_group_present
+ cisco.aci.aci_maintenance_group: &aci_maintenance_group_present
<<: *aci_info
group: anstest_group
policy: anstest_policy
state: present
- name: Ensure first maintenance group node does not exist
- aci_maintenance_group_node: &aci_maintenance_group_node_absent
+ cisco.aci.aci_maintenance_group_node: &aci_maintenance_group_node_absent
<<: *aci_info
group: anstest_group
node: 1001
state: absent
- name: Ensure second maintenance group node does not exist
- aci_maintenance_group_node: &aci_maintenance_group_node_2_absent
+ cisco.aci.aci_maintenance_group_node: &aci_maintenance_group_node_2_absent
<<: *aci_info
group: anstest_group
node: 1002
state: absent
- name: Create first maintenance group node (check_mode)
- aci_maintenance_group_node: &aci_maintenance_group_node_present
+ cisco.aci.aci_maintenance_group_node: &aci_maintenance_group_node_present
<<: *aci_maintenance_group_node_absent
state: present
check_mode: true
register: cm_add_maintenance_group_node_1
- name: Create first maintenance group node (normal_mode)
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_maintenance_group_node_present
register: nm_add_maintenance_group_node_1
- name: Create first maintenance group node again - testing idempotency
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_maintenance_group_node_present
register: idempotency_add_maintenance_group_node_1
- name: Create second maintenance group node
- aci_maintenance_group_node: &aci_maintenance_group_node_2_present
+ cisco.aci.aci_maintenance_group_node: &aci_maintenance_group_node_2_present
<<: *aci_maintenance_group_node_2_absent
state: present
register: nm_add_maintenance_group_node_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_maintenance_group_node_1 is changed
- cm_add_maintenance_group_node_1.previous == []
@@ -99,19 +99,19 @@
- name: Query all maintenance group nodes
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_info
state: query
register: query_all_maintenance_group_node
- name: Query first maintenance group nnode
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_maintenance_group_node_present
state: query
register: query_first_maintenance_group_node
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_maintenance_group_node is not changed
- query_all_maintenance_group_node.current | length >= 2
@@ -120,32 +120,32 @@
- query_first_maintenance_group_node.current.0.fabricNodeBlk.attributes.to_ == "1001"
- name: Delete first maintenance group (check_mode)
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_maintenance_group_node_present
state: absent
check_mode: true
register: cm_delete_maintenance_group_node_1
- name: Delete first maintenance group (normal_mode)
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_maintenance_group_node_present
state: absent
register: nm_delete_maintenance_group_node_1
- name: Delete first maintenance group again - testing idempotency
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_maintenance_group_node_present
state: absent
register: idempotency_delete_maintenance_group_1
- name: Delete second maintenance group (normal_mode)
- aci_maintenance_group_node:
+ cisco.aci.aci_maintenance_group_node:
<<: *aci_maintenance_group_node_2_present
state: absent
register: nm_delete_maintenance_group_node_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_maintenance_group_node_1 is changed
- cm_delete_maintenance_group_node_1.proposed == {}
@@ -159,16 +159,16 @@
- nm_delete_maintenance_group_node_2.current == []
- name: Delete maintenance group - clean up the environment
- aci_maintenance_group:
+ cisco.aci.aci_maintenance_group:
<<: *aci_maintenance_group_present
state: absent
- name: Delete maintenance policy - clean up the environment
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
state: absent
- name: Delete scheduler - clean up the environment
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_policy/tasks/main.yml
index 8628c2a84..28abdbc72 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_maintenance_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,20 +20,20 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Create Scheduler
- aci_fabric_scheduler: &aci_fabric_scheduler_present
+ cisco.aci.aci_fabric_scheduler: &aci_fabric_scheduler_present
<<: *aci_info
name: anstest_scheduler
state: present
- name: Ensure first maintenance policy does not exist
- aci_maintenance_policy: &aci_maintenance_policy_absent
+ cisco.aci.aci_maintenance_policy: &aci_maintenance_policy_absent
<<: *aci_info
name: anstest_policy
description: test for maintenance policy
@@ -49,37 +49,37 @@
state: absent
- name: Ensure second maintenance policy does not exist
- aci_maintenance_policy: &aci_maintenance_policy_2_absent
+ cisco.aci.aci_maintenance_policy: &aci_maintenance_policy_2_absent
<<: *aci_info
name: anstest_policy_2
scheduler: anstest_scheduler
state: absent
- name: Create first maintenance policy (check_mode)
- aci_maintenance_policy: &aci_maintenance_policy_present
+ cisco.aci.aci_maintenance_policy: &aci_maintenance_policy_present
<<: *aci_maintenance_policy_absent
state: present
check_mode: true
register: cm_add_maintenance_policy_1
- name: Create first maintenance policy (normal_mode)
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
register: nm_add_maintenance_policy_1
- name: Create first maintenance policy again - testing idempotency
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
register: idempotency_add_maintenance_policy_1
- name: Create second maintenance policy
- aci_maintenance_policy: &aci_maintenance_policy_2_present
+ cisco.aci.aci_maintenance_policy: &aci_maintenance_policy_2_present
<<: *aci_maintenance_policy_2_absent
state: present
register: nm_add_maintenance_policy_2
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_maintenance_policy_1 is changed
- cm_add_maintenance_policy_1.previous == []
@@ -109,19 +109,19 @@
- nm_add_maintenance_policy_2.current.0.maintMaintP.children.0.maintRsPolScheduler.attributes.tnTrigSchedPName == "anstest_scheduler"
- name: Query all maintenance policies
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_info
state: query
register: query_all_maintenance_policy
- name: Query first maintenance policy
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
state: query
register: query_first_maintenance_policy
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_maintenance_policy is not changed
- query_all_maintenance_policy.current | length >= 2
@@ -140,32 +140,32 @@
- query_first_maintenance_policy.current.0.maintMaintP.children.0.maintRsPolScheduler.attributes.tnTrigSchedPName == "anstest_scheduler"
- name: Delete first maintenance policy (check_mode)
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
state: absent
check_mode: true
register: cm_delete_maintenance_policy_1
- name: Delete first maintenance policy (normal_mode)
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
state: absent
register: nm_delete_maintenance_policy_1
- name: Delete first maintenance policy again - testing idempotency
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_present
state: absent
register: idempotency_delete_maintenance_policy_1
- name: Delete second maintenance policy (normal_mode)
- aci_maintenance_policy:
+ cisco.aci.aci_maintenance_policy:
<<: *aci_maintenance_policy_2_present
state: absent
register: nm_delete_maintenance_policy_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_maintenance_policy_1 is changed
- cm_delete_maintenance_policy_1.proposed == {}
@@ -179,6 +179,6 @@
- nm_delete_maintenance_policy_2.current == []
- name: Delete scheduler - clean up the environment
- aci_fabric_scheduler:
+ cisco.aci.aci_fabric_scheduler:
<<: *aci_fabric_scheduler_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_as_path_regex_term/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_as_path_regex_term/tasks/main.yml
index cdabd8b4e..120acf12d 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_as_path_regex_term/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_as_path_regex_term/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a match rule profile
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -49,7 +49,7 @@
register: cm_add_match_rule
- name: Add a match regex AS-Path term (check_mode)
- aci_match_as_path_regex_term: &aci_match_as_path_regex_term_present
+ cisco.aci.aci_match_as_path_regex_term: &aci_match_as_path_regex_term_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -61,17 +61,17 @@
register: cm_add_match_as_path_regex_term
- name: Add a match regex AS-Path term (normal_mode)
- aci_match_as_path_regex_term:
+ cisco.aci.aci_match_as_path_regex_term:
<<: *aci_match_as_path_regex_term_present
register: nm_add_match_as_path_regex_term
- name: Add the first match regex AS-Path term again - testing idempotency
- aci_match_as_path_regex_term:
+ cisco.aci.aci_match_as_path_regex_term:
<<: *aci_match_as_path_regex_term_present
register: nm_add_match_as_path_regex_term_idempotency
- name: Add a second match regex AS-Path term (normal_mode)
- aci_match_as_path_regex_term:
+ cisco.aci.aci_match_as_path_regex_term:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -81,7 +81,7 @@
register: nm_add_match_as_path_regex_term_2
- name: Asserts for match regex AS-Path terms creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_match_as_path_regex_term is changed
- cm_add_match_as_path_regex_term.previous == []
@@ -96,19 +96,19 @@
- nm_add_match_as_path_regex_term_2.current.0.rtctrlMatchAsPathRegexTerm.attributes.regex == ""
- name: Query all match regex AS-Path terms
- aci_match_as_path_regex_term:
+ cisco.aci.aci_match_as_path_regex_term:
<<: *aci_info
state: query
register: query_all_match_as_path_regex_term
- name: Query ansible_match_as_path_regex_term_1
- aci_match_as_path_regex_term:
+ cisco.aci.aci_match_as_path_regex_term:
<<: *aci_match_as_path_regex_term_present
state: query
register: query_ansible_match_as_path_regex_term_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_match_as_path_regex_term is not changed
- query_all_match_as_path_regex_term.current|length >= 2
@@ -117,24 +117,24 @@
- query_ansible_match_as_path_regex_term_1.current.0.rtctrlMatchAsPathRegexTerm.attributes.regex == ".*"
- name: Remove match regex AS-Path term for l3out (check_mode)
- aci_match_as_path_regex_term: &match_as_path_regex_term_absent
+ cisco.aci.aci_match_as_path_regex_term: &match_as_path_regex_term_absent
<<: *aci_match_as_path_regex_term_present
state: absent
check_mode: true
register: cm_remove_match_as_path_regex_term
- name: Remove match regex AS-Path term for l3out (normal_mode)
- aci_match_as_path_regex_term:
+ cisco.aci.aci_match_as_path_regex_term:
<<: *match_as_path_regex_term_absent
register: nm_remove_match_as_path_regex_term
- name: Remove match regex AS-Path term for l3out again - testing previous Removal
- aci_match_as_path_regex_term:
+ cisco.aci.aci_match_as_path_regex_term:
<<: *match_as_path_regex_term_absent
register: nm_remove_match_as_path_regex_term_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_match_as_path_regex_term is changed
- cm_remove_match_as_path_regex_term.proposed == {}
@@ -145,6 +145,6 @@
- nm_remove_match_as_path_regex_term_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_factor/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_factor/tasks/main.yml
index 2cc1f3ac1..22a69dcfe 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_factor/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_factor/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a match rule profile
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -48,7 +48,7 @@
state: present
- name: Add a match community term
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -57,7 +57,7 @@
state: present
- name: Add a match community factor (check_mode)
- aci_match_community_factor: &aci_match_community_factor_present
+ cisco.aci.aci_match_community_factor: &aci_match_community_factor_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -70,17 +70,17 @@
register: cm_add_match_community_factor
- name: Add a match community factor (normal_mode)
- aci_match_community_factor:
+ cisco.aci.aci_match_community_factor:
<<: *aci_match_community_factor_present
register: nm_add_match_community_factor
- name: Add the first match community factor again - testing idempotency
- aci_match_community_factor:
+ cisco.aci.aci_match_community_factor:
<<: *aci_match_community_factor_present
register: nm_add_match_community_factor_idempotency
- name: Add a second match community factor (normal_mode)
- aci_match_community_factor:
+ cisco.aci.aci_match_community_factor:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -91,7 +91,7 @@
register: nm_add_match_community_factor_2
- name: Asserts for match community factors creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_match_community_factor is changed
- cm_add_match_community_factor.previous == []
@@ -104,19 +104,19 @@
- nm_add_match_community_factor_2.current.0.rtctrlMatchCommFactor.attributes.community == "regular:as2-nn2:4:16"
- name: Query all match community factors
- aci_match_community_factor:
+ cisco.aci.aci_match_community_factor:
<<: *aci_info
state: query
register: query_all_match_community_factor
- name: Query a specific match community factor
- aci_match_community_factor:
+ cisco.aci.aci_match_community_factor:
<<: *aci_match_community_factor_present
state: query
register: query_ansible_match_community_factor_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_match_community_factor is not changed
- query_all_match_community_factor.current|length >= 2
@@ -124,24 +124,24 @@
- query_ansible_match_community_factor_1.current.0.rtctrlMatchCommFactor.attributes.community == "regular:as2-nn2:4:15"
- name: Remove match community factor (check_mode)
- aci_match_community_factor: &match_community_term_absent
+ cisco.aci.aci_match_community_factor: &match_community_term_absent
<<: *aci_match_community_factor_present
state: absent
check_mode: true
register: cm_remove_match_community_factor
- name: Remove match community factor (normal_mode)
- aci_match_community_factor:
+ cisco.aci.aci_match_community_factor:
<<: *match_community_term_absent
register: nm_remove_match_community_factor
- name: Remove match community factor again - testing previous Removal
- aci_match_community_factor:
+ cisco.aci.aci_match_community_factor:
<<: *match_community_term_absent
register: nm_remove_match_community_factor_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_match_community_factor is changed
- cm_remove_match_community_factor.proposed == {}
@@ -152,6 +152,6 @@
- nm_remove_match_community_factor_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_regex_term/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_regex_term/tasks/main.yml
index c0b12c78c..264a04afa 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_regex_term/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_regex_term/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a match rule profile
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -49,7 +49,7 @@
register: cm_add_match_rule
- name: Add a match community regex term (check_mode)
- aci_match_community_regex_term: &aci_match_community_regex_term_present
+ cisco.aci.aci_match_community_regex_term: &aci_match_community_regex_term_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -62,17 +62,17 @@
register: cm_add_match_community_regex_term
- name: Add a match community regex term (normal_mode)
- aci_match_community_regex_term:
+ cisco.aci.aci_match_community_regex_term:
<<: *aci_match_community_regex_term_present
register: nm_add_match_community_regex_term
- name: Add the first match community regex term again - testing idempotency
- aci_match_community_regex_term:
+ cisco.aci.aci_match_community_regex_term:
<<: *aci_match_community_regex_term_present
register: nm_add_match_community_regex_term_idempotency
- name: Add a second match community regex term (normal_mode)
- aci_match_community_regex_term: &aci_match_community_regex_term_2_present
+ cisco.aci.aci_match_community_regex_term: &aci_match_community_regex_term_2_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -81,7 +81,7 @@
register: nm_add_match_community_regex_term_2
- name: Asserts for match community regex terms creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_match_community_regex_term is changed
- cm_add_match_community_regex_term.previous == []
@@ -97,20 +97,20 @@
- nm_add_match_community_regex_term_2.current.0.rtctrlMatchCommRegexTerm.attributes.commType == "regular"
- name: Query all match community regex terms
- aci_match_community_regex_term:
+ cisco.aci.aci_match_community_regex_term:
<<: *aci_info
state: query
community_type: extended
register: query_all_match_community_regex_term
- name: Query ansible_match_community_regex_term_regular
- aci_match_community_regex_term:
+ cisco.aci.aci_match_community_regex_term:
<<: *aci_match_community_regex_term_2_present
state: query
register: query_ansible_match_community_regex_term_regular
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_match_community_regex_term is not changed
- query_all_match_community_regex_term.current.0.rtctrlMatchCommRegexTerm.attributes.commType == "extended"
@@ -119,24 +119,24 @@
- query_ansible_match_community_regex_term_regular.current.0.rtctrlMatchCommRegexTerm.attributes.commType == "regular"
- name: Remove match community regex term (check_mode)
- aci_match_community_regex_term: &match_community_regex_term_absent
+ cisco.aci.aci_match_community_regex_term: &match_community_regex_term_absent
<<: *aci_match_community_regex_term_present
state: absent
check_mode: true
register: cm_remove_match_community_regex_term
- name: Remove match community regex term (normal_mode)
- aci_match_community_regex_term:
+ cisco.aci.aci_match_community_regex_term:
<<: *match_community_regex_term_absent
register: nm_remove_match_community_regex_term
- name: Remove match community regex term again - testing previous Removal
- aci_match_community_regex_term:
+ cisco.aci.aci_match_community_regex_term:
<<: *match_community_regex_term_absent
register: nm_remove_match_community_regex_term_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_match_community_regex_term is changed
- cm_remove_match_community_regex_term.proposed == {}
@@ -147,6 +147,6 @@
- nm_remove_match_community_regex_term_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_term/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_term/tasks/main.yml
index aecf89096..038abb761 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_term/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_community_term/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,26 +21,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a match rule profile
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -49,7 +49,7 @@
register: cm_add_match_rule
- name: Add a match community term (check_mode)
- aci_match_community_term: &aci_match_community_term_present
+ cisco.aci.aci_match_community_term: &aci_match_community_term_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -60,17 +60,17 @@
register: cm_add_match_community_term
- name: Add a match community term (normal_mode)
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *aci_match_community_term_present
register: nm_add_match_community_term
- name: Add the first match community term again - testing idempotency
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *aci_match_community_term_present
register: nm_add_match_community_term_idempotency
- name: Add a second match community term (normal_mode)
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -80,7 +80,7 @@
register: nm_add_match_community_term_2
- name: Asserts for match community terms creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_match_community_term is changed
- cm_add_match_community_term.previous == []
@@ -93,19 +93,19 @@
- nm_add_match_community_term_2.current.0.rtctrlMatchCommTerm.attributes.name == "ansible_match_community_term_2"
- name: Query all match community terms
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *aci_info
state: query
register: query_all_match_community_term
- name: Query ansible_match_community_term_1
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *aci_match_community_term_present
state: query
register: query_ansible_match_community_term_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_match_community_term is not changed
- query_all_match_community_term.current|length >= 2
@@ -113,24 +113,24 @@
- query_ansible_match_community_term_1.current.0.rtctrlMatchCommTerm.attributes.name == "ansible_match_community_term_1"
- name: Remove match community term (check_mode)
- aci_match_community_term: &match_community_term_absent
+ cisco.aci.aci_match_community_term: &match_community_term_absent
<<: *aci_match_community_term_present
state: absent
check_mode: true
register: cm_remove_match_community_term
- name: Remove match community term (normal_mode)
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *match_community_term_absent
register: nm_remove_match_community_term
- name: Remove match community term again - testing previous Removal
- aci_match_community_term:
+ cisco.aci.aci_match_community_term:
<<: *match_community_term_absent
register: nm_remove_match_community_term_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_match_community_term is changed
- cm_remove_match_community_term.proposed == {}
@@ -141,6 +141,6 @@
- nm_remove_match_community_term_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_route_destination/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_route_destination/tasks/main.yml
index b4d49c2ff..54d906952 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_route_destination/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_route_destination/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,26 +22,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a match rule profile
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -50,7 +50,7 @@
register: cm_add_match_rule
- name: Add a match route destination rule (check_mode)
- aci_match_route_destination: &aci_match_route_destination_present
+ cisco.aci.aci_match_route_destination: &aci_match_route_destination_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -64,17 +64,17 @@
register: cm_add_match_route_destination
- name: Add a match route destination rule (normal_mode)
- aci_match_route_destination:
+ cisco.aci.aci_match_route_destination:
<<: *aci_match_route_destination_present
register: nm_add_match_route_destination
- name: Add the first match route destination rule again - testing idempotency
- aci_match_route_destination:
+ cisco.aci.aci_match_route_destination:
<<: *aci_match_route_destination_present
register: nm_add_match_route_destination_idempotency
- name: Add a second match route destination rule (normal_mode)
- aci_match_route_destination:
+ cisco.aci.aci_match_route_destination:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -84,7 +84,7 @@
register: nm_add_match_route_destination_2
- name: Asserts for match route destination rule creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_match_route_destination is changed
- cm_add_match_route_destination.previous == []
@@ -103,19 +103,19 @@
- nm_add_match_route_destination_2.current.0.rtctrlMatchRtDest.attributes.toPfxLen == "0"
- name: Query all match regex AS-Path terms
- aci_match_route_destination:
+ cisco.aci.aci_match_route_destination:
<<: *aci_info
state: query
register: query_all_match_route_destination
- name: Query ansible_match_route_destination_1
- aci_match_route_destination:
+ cisco.aci.aci_match_route_destination:
<<: *aci_match_route_destination_present
state: query
register: query_ansible_match_route_destination_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_match_route_destination is not changed
- query_all_match_route_destination.current|length >= 2
@@ -126,24 +126,24 @@
- query_ansible_match_route_destination_1.current.0.rtctrlMatchRtDest.attributes.toPfxLen == "32"
- name: Remove match route destination rule (check_mode)
- aci_match_route_destination: &match_route_destination_absent
+ cisco.aci.aci_match_route_destination: &match_route_destination_absent
<<: *aci_match_route_destination_present
state: absent
check_mode: true
register: cm_remove_match_route_destination
- name: Remove match route destination rule (normal_mode)
- aci_match_route_destination:
+ cisco.aci.aci_match_route_destination:
<<: *match_route_destination_absent
register: nm_remove_match_route_destination
- name: Remove match route destination rule again - testing previous Removal
- aci_match_route_destination:
+ cisco.aci.aci_match_route_destination:
<<: *match_route_destination_absent
register: nm_remove_match_route_destination_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_match_route_destination is changed
- cm_remove_match_route_destination.proposed == {}
@@ -154,6 +154,6 @@
- nm_remove_match_route_destination_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_rule/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_rule/tasks/main.yml
index 23509494c..4d453d017 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_match_rule/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_match_rule/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,26 +22,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a match rule profile (check_mode)
- aci_match_rule: &aci_match_rule_present
+ cisco.aci.aci_match_rule: &aci_match_rule_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule_1
@@ -51,17 +51,17 @@
register: cm_add_match_rule
- name: Add a match rule profile (normal_mode)
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_match_rule_present
register: nm_add_match_rule
- name: Add the first match rule profile again - testing idempotency
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_match_rule_present
register: nm_add_match_rule_idempotency
- name: Add a second match rule profile (normal_mode)
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule_2
@@ -70,7 +70,7 @@
register: nm_add_match_rule_2
- name: Asserts for match rule profiles creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_match_rule is changed
- cm_add_match_rule.previous == []
@@ -83,19 +83,19 @@
- nm_add_match_rule_2.current.0.rtctrlSubjP.attributes.name == "ansible_match_rule_2"
- name: Query all match rule profiles
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_info
state: query
register: query_all_match_rule
- name: Query ansible_match_rule_1
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *aci_match_rule_present
state: query
register: query_ansible_match_rule_1
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_match_rule is not changed
- query_all_match_rule.current|length >= 2
@@ -103,24 +103,24 @@
- query_ansible_match_rule_1.current.0.rtctrlSubjP.attributes.name == "ansible_match_rule_1"
- name: Remove match rule profile for l3out (check_mode)
- aci_match_rule: &match_rule_absent
+ cisco.aci.aci_match_rule: &match_rule_absent
<<: *aci_match_rule_present
state: absent
check_mode: true
register: cm_remove_match_rule
- name: Remove match rule profile for l3out (normal_mode)
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *match_rule_absent
register: nm_remove_match_rule
- name: Remove match rule profile for l3out again - testing previous Removal
- aci_match_rule:
+ cisco.aci.aci_match_rule:
<<: *match_rule_absent
register: nm_remove_match_rule_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_match_rule is changed
- cm_remove_match_rule.proposed == {}
@@ -131,6 +131,6 @@
- nm_remove_match_rule_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/tasks/main.yml
new file mode 100644
index 000000000..a5b58cb39
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_exporter_policy/tasks/main.yml
@@ -0,0 +1,337 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new VRF
+ cisco.aci.aci_vrf:
+ <<: *aci_info
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ description: ansible VRF for ansible_tenant tenant
+ state: present
+
+ - name: Add a new Application Profile
+ cisco.aci.aci_ap:
+ <<: *aci_info
+ tenant: ansible_tenant
+ ap: ansible_ap
+ description: ansible Application Profile for ansible_tenant tenant
+ state: present
+
+ - name: Add a new EPG
+ cisco.aci.aci_epg:
+ <<: *aci_info
+ tenant: ansible_tenant
+ ap: ansible_ap
+ epg: ansible_epg
+ description: ansible EPG for ansible_ap Application Profile
+ state: present
+
+ - name: Add a new L3Out
+ cisco.aci.aci_l3out:
+ <<: *aci_info
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ domain: ansible_dom
+ l3out: ansible_l3out
+ description: ansible L3Out for ansible_tenant tenant
+ state: present
+
+ - name: Add a new External EPG
+ cisco.aci.aci_l3out_extepg:
+ <<: *aci_info
+ tenant: ansible_tenant
+ extepg: ansible_extepg
+ l3out: ansible_l3out
+ description: ansible External EPG for ansible_l3out L3Out
+ state: present
+
+ # CREATE NETFLOW EXPORTER POLICY
+ - name: Add a Netflow Exporter policy (check_mode)
+ cisco.aci.aci_netflow_exporter_policy: &aci_netflow_exporter_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_exporter_policy: ansible_netflow_exporter_policy_1
+ description: Netflow Exporter policy 1 for ansible_tenant tenant
+ dscp: AF12
+ destination_address: 11.11.11.1
+ destination_port: smtp
+ source_ip_type: inband_management_ip
+ associated_epg:
+ tenant: ansible_tenant
+ ap: ansible_ap
+ epg: ansible_epg
+ state: present
+ associated_vrf:
+ tenant: ansible_tenant
+ vrf: ansible_vrf
+ check_mode: true
+ register: cm_add_netflow_exporter_policy
+
+ - name: Add a Netflow Exporter policy (normal_mode)
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_present
+ register: nm_add_netflow_exporter_policy
+
+ - name: Add the first Netflow Exporter policy again - testing idempotency
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_present
+ register: nm_add_netflow_exporter_policy_idempotency
+
+ - name: Add a second Netflow Exporter policy (normal_mode)
+ cisco.aci.aci_netflow_exporter_policy: &aci_netflow_exporter_policy_2_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_exporter_policy: ansible_netflow_exporter_policy_2
+ description: Netflow Exporter policy 2 for ansible_tenant tenant
+ dscp: CS2
+ destination_address: 11.11.11.2
+ destination_port: https
+ custom_source_address: 12.12.12.2/12
+ associated_extepg:
+ tenant: ansible_tenant
+ l3out: ansible_l3out
+ extepg: ansible_extepg
+ state: present
+ register: nm_add_netflow_exporter_policy_2
+
+ - name: Asserts for Netflow Exporter policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_netflow_exporter_policy is changed
+ - cm_add_netflow_exporter_policy.previous == []
+ - cm_add_netflow_exporter_policy.current == []
+ - cm_add_netflow_exporter_policy.proposed.netflowExporterPol.attributes.name == "ansible_netflow_exporter_policy_1"
+ - cm_add_netflow_exporter_policy.proposed.netflowExporterPol.attributes.dscp == "AF12"
+ - cm_add_netflow_exporter_policy.proposed.netflowExporterPol.attributes.dstAddr == "11.11.11.1"
+ - cm_add_netflow_exporter_policy.proposed.netflowExporterPol.attributes.dstPort == "smtp"
+ - cm_add_netflow_exporter_policy.proposed.netflowExporterPol.attributes.sourceIpType == "inband-mgmt-ip"
+ - cm_add_netflow_exporter_policy.proposed.netflowExporterPol.children.0.netflowRsExporterToCtx.attributes.tDn == "uni/tn-ansible_tenant/ctx-ansible_vrf"
+ - cm_add_netflow_exporter_policy.proposed.netflowExporterPol.children.1.netflowRsExporterToEPg.attributes.tDn == "uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg"
+ - nm_add_netflow_exporter_policy is changed
+ - nm_add_netflow_exporter_policy.previous == []
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.attributes.name == "ansible_netflow_exporter_policy_1"
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.attributes.dscp == "AF12"
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.attributes.dstAddr == "11.11.11.1"
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.attributes.dstPort == "smtp"
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.attributes.sourceIpType == "inband-mgmt-ip"
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.attributes.srcAddr == "0.0.0.0"
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.children.0.netflowRsExporterToCtx.attributes.tDn == "uni/tn-ansible_tenant/ctx-ansible_vrf"
+ - nm_add_netflow_exporter_policy.current.0.netflowExporterPol.children.1.netflowRsExporterToEPg.attributes.tDn == "uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg"
+ - nm_add_netflow_exporter_policy_idempotency is not changed
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.name == "ansible_netflow_exporter_policy_1"
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.dscp == "AF12"
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.dstAddr == "11.11.11.1"
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.dstPort == "smtp"
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.sourceIpType == "inband-mgmt-ip"
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.srcAddr == "0.0.0.0"
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.children.0.netflowRsExporterToCtx.attributes.tDn == "uni/tn-ansible_tenant/ctx-ansible_vrf"
+ - nm_add_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.children.1.netflowRsExporterToEPg.attributes.tDn == "uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg"
+ - nm_add_netflow_exporter_policy_2 is changed
+ - nm_add_netflow_exporter_policy_2.previous == []
+ - nm_add_netflow_exporter_policy_2.current.0.netflowExporterPol.attributes.name == "ansible_netflow_exporter_policy_2"
+ - nm_add_netflow_exporter_policy_2.current.0.netflowExporterPol.attributes.dscp == "CS2"
+ - nm_add_netflow_exporter_policy_2.current.0.netflowExporterPol.attributes.dstAddr == "11.11.11.2"
+ - nm_add_netflow_exporter_policy_2.current.0.netflowExporterPol.attributes.dstPort == "https"
+ - nm_add_netflow_exporter_policy_2.current.0.netflowExporterPol.attributes.sourceIpType == "custom-src-ip"
+ - nm_add_netflow_exporter_policy_2.current.0.netflowExporterPol.attributes.srcAddr == "12.12.12.2/12"
+ - nm_add_netflow_exporter_policy_2.current.0.netflowExporterPol.children.0.netflowRsExporterToEPg.attributes.tDn == "uni/tn-ansible_tenant/out-ansible_l3out/instP-ansible_extepg"
+
+ # QUERY NETFLOW EXPORTER POLICY
+ - name: Query all Netflow Exporter policies
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_netflow_exporter_policy
+
+ - name: Query ansible_netflow_exporter_policy_1
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_present
+ state: query
+ register: query_ansible_netflow_exporter_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_netflow_exporter_policy is not changed
+ - query_all_netflow_exporter_policy.current|length >= 2
+ - query_ansible_netflow_exporter_policy_1 is not changed
+ - query_ansible_netflow_exporter_policy_1.current|length == 1
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.attributes.name == "ansible_netflow_exporter_policy_1"
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.attributes.dscp == "AF12"
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.attributes.dstAddr == "11.11.11.1"
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.attributes.dstPort == "smtp"
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.attributes.sourceIpType == "inband-mgmt-ip"
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.attributes.srcAddr == "0.0.0.0"
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.children.0.netflowRsExporterToCtx.attributes.tDn == "uni/tn-ansible_tenant/ctx-ansible_vrf"
+ - query_ansible_netflow_exporter_policy_1.current.0.netflowExporterPol.children.1.netflowRsExporterToEPg.attributes.tDn == "uni/tn-ansible_tenant/ap-ansible_ap/epg-ansible_epg"
+
+ #REMOVE ASSOCIATED EPG/EXTERNAL EPG FROM NETFLOW EXPORTER POLICIES
+ - name: Remove associated EPG from first Netflow Exporter policy (check_mode)
+ cisco.aci.aci_netflow_exporter_policy: &aci_netflow_exporter_policy_remove_epg
+ <<: *aci_netflow_exporter_policy_present
+ associated_epg: {}
+ associated_vrf: {}
+ check_mode: true
+ register: cm_remove_epg_netflow_exporter_policy
+
+ - name: Remove associated EPG from first Netflow Exporter policy (normal_mode)
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_remove_epg
+ register: nm_remove_epg_netflow_exporter_policy
+
+ - name: Remove associated EPG from first Netflow Exporter policy again - testing idempotency
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_remove_epg
+ register: nm_remove_epg_netflow_exporter_policy_idempotency
+
+ - name: Remove associated external EPG from second Netflow Exporter policy (normal_mode)
+ cisco.aci.aci_netflow_exporter_policy: &aci_netflow_exporter_policy_2_remove_extepg
+ <<: *aci_netflow_exporter_policy_2_present
+ associated_extepg: {}
+ register: nm_remove_extepg_netflow_exporter_policy_2
+
+ - name: Remove associated external EPG from second Netflow Exporter policy again - testing idempotency
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_2_remove_extepg
+ register: nm_remove_extepg_netflow_exporter_policy_2_idempotency
+
+ - name: Asserts for associated EPGs removal tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_epg_netflow_exporter_policy is changed
+ - cm_remove_epg_netflow_exporter_policy.current == cm_remove_epg_netflow_exporter_policy.previous
+ - cm_remove_epg_netflow_exporter_policy.proposed.netflowExporterPol.children.0.netflowRsExporterToCtx.attributes.status == "deleted"
+ - cm_remove_epg_netflow_exporter_policy.proposed.netflowExporterPol.children.1.netflowRsExporterToEPg.attributes.status == "deleted"
+ - nm_remove_epg_netflow_exporter_policy is changed
+ - nm_remove_epg_netflow_exporter_policy.proposed.netflowExporterPol.children.0.netflowRsExporterToCtx.attributes.status == "deleted"
+ - nm_remove_epg_netflow_exporter_policy.proposed.netflowExporterPol.children.1.netflowRsExporterToEPg.attributes.status == "deleted"
+ - '"children" not in nm_remove_epg_netflow_exporter_policy.current.0.netflowExporterPol'
+ - nm_remove_epg_netflow_exporter_policy_idempotency is not changed
+ - '"children" not in nm_remove_epg_netflow_exporter_policy_idempotency.current.0.netflowExporterPol'
+ - nm_remove_extepg_netflow_exporter_policy_2 is changed
+ - nm_remove_extepg_netflow_exporter_policy_2.proposed.netflowExporterPol.children.0.netflowRsExporterToEPg.attributes.status == "deleted"
+ - '"children" not in nm_remove_extepg_netflow_exporter_policy_2.current.0.netflowExporterPol'
+ - nm_remove_extepg_netflow_exporter_policy_2_idempotency is not changed
+ - '"children" not in nm_remove_extepg_netflow_exporter_policy_2_idempotency.current.0.netflowExporterPol'
+
+ #UPDATE NETFLOW EXPORTER POLICY
+ - name: Update first Netflow Exporter policy (check_mode)
+ cisco.aci.aci_netflow_exporter_policy: &aci_netflow_exporter_policy_update
+ <<: *aci_netflow_exporter_policy_remove_epg
+ dscp: AF13
+ destination_address: 11.11.11.3
+ destination_port: http
+ source_ip_type: out_of_band_management_ip
+ description: Updated description for first ansible Netflow Exporter policy
+ check_mode: true
+ register: cm_update_netflow_exporter_policy
+
+ - name: Update first Netflow Exporter policy (normal_mode)
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_update
+ register: nm_update_netflow_exporter_policy
+
+ - name: Update first Netflow Exporter policy again - testing idempotency
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_netflow_exporter_policy_update
+ register: nm_udpate_netflow_exporter_policy_idempotency
+
+ - name: Asserts for Netflow Exporter policy update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_netflow_exporter_policy is changed
+ - cm_update_netflow_exporter_policy.previous == cm_update_netflow_exporter_policy.current
+ - cm_update_netflow_exporter_policy.proposed.netflowExporterPol.attributes.dscp == "AF13"
+ - cm_update_netflow_exporter_policy.proposed.netflowExporterPol.attributes.dstAddr == "11.11.11.3"
+ - cm_update_netflow_exporter_policy.proposed.netflowExporterPol.attributes.dstPort == "http"
+ - cm_update_netflow_exporter_policy.proposed.netflowExporterPol.attributes.sourceIpType == "oob-mgmt-ip"
+ - cm_update_netflow_exporter_policy.proposed.netflowExporterPol.attributes.descr == "Updated description for first ansible Netflow Exporter policy"
+ - nm_update_netflow_exporter_policy is changed
+ - nm_update_netflow_exporter_policy.current.0.netflowExporterPol.attributes.dscp == "AF13"
+ - nm_update_netflow_exporter_policy.current.0.netflowExporterPol.attributes.dstAddr == "11.11.11.3"
+ - nm_update_netflow_exporter_policy.current.0.netflowExporterPol.attributes.dstPort == "http"
+ - nm_update_netflow_exporter_policy.current.0.netflowExporterPol.attributes.sourceIpType == "oob-mgmt-ip"
+ - nm_update_netflow_exporter_policy.current.0.netflowExporterPol.attributes.srcAddr == "0.0.0.0"
+ - nm_update_netflow_exporter_policy.current.0.netflowExporterPol.attributes.descr == "Updated description for first ansible Netflow Exporter policy"
+ - nm_udpate_netflow_exporter_policy_idempotency is not changed
+ - nm_udpate_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.dstAddr == "11.11.11.3"
+ - nm_udpate_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.dstPort == "http"
+ - nm_udpate_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.sourceIpType == "oob-mgmt-ip"
+ - nm_udpate_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.srcAddr == "0.0.0.0"
+ - nm_udpate_netflow_exporter_policy_idempotency.current.0.netflowExporterPol.attributes.descr == "Updated description for first ansible Netflow Exporter policy"
+
+ # DELETE NETFLOW EXPORTER POLICY
+ - name: Remove Netflow Exporter policy (check_mode)
+ cisco.aci.aci_netflow_exporter_policy: &netflow_exporter_policy_absent
+ <<: *aci_netflow_exporter_policy_update
+ state: absent
+ check_mode: true
+ register: cm_remove_netflow_exporter_policy
+
+ - name: Remove Netflow Exporter policy (normal_mode)
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *netflow_exporter_policy_absent
+ register: nm_remove_netflow_exporter_policy
+
+ - name: Remove Netflow Exporter policy - testing idempotency
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *netflow_exporter_policy_absent
+ register: nm_remove_netflow_exporter_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_netflow_exporter_policy is changed
+ - cm_remove_netflow_exporter_policy.current == cm_remove_netflow_exporter_policy.previous
+ - cm_remove_netflow_exporter_policy.proposed == {}
+ - nm_remove_netflow_exporter_policy is changed
+ - nm_remove_netflow_exporter_policy.previous != []
+ - nm_remove_netflow_exporter_policy.proposed == {}
+ - nm_remove_netflow_exporter_policy.current == []
+ - nm_remove_netflow_exporter_policy_idempotency is not changed
+ - nm_remove_netflow_exporter_policy_idempotency.previous == []
+ - nm_remove_netflow_exporter_policy_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/tasks/main.yml
new file mode 100644
index 000000000..ada9d5ad8
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_policy/tasks/main.yml
@@ -0,0 +1,193 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a Netflow Record policy
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_record_policy: ansible_netflow_record_policy
+ description: Netflow Record policy for ansible_tenant tenant
+ state: present
+
+ # CREATE NETFLOW MONITOR POLICY
+ - name: Add a Netflow Monitor policy (check_mode)
+ cisco.aci.aci_netflow_monitor_policy: &aci_netflow_monitor_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_monitor_policy: ansible_netflow_monitor_policy_1
+ netflow_record_policy: ansible_netflow_record_policy
+ description: Netflow Monitor policy 1 for ansible_tenant tenant
+ state: present
+ check_mode: true
+ register: cm_add_netflow_monitor_policy
+
+ - name: Add a Netflow Monitor policy (normal_mode)
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_netflow_monitor_policy_present
+ register: nm_add_netflow_monitor_policy
+
+ - name: Add the first Netflow Monitor policy again - testing idempotency
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_netflow_monitor_policy_present
+ register: nm_add_netflow_monitor_policy_idempotency
+
+ - name: Add a second Netflow Monitor policy (normal_mode)
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_monitor_policy: ansible_netflow_monitor_policy_2
+ description: Netflow Monitor policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_netflow_monitor_policy_2
+
+ - name: Asserts for Netflow Monitor policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_netflow_monitor_policy is changed
+ - cm_add_netflow_monitor_policy.previous == []
+ - cm_add_netflow_monitor_policy.current == []
+ - cm_add_netflow_monitor_policy.proposed.netflowMonitorPol.attributes.name == "ansible_netflow_monitor_policy_1"
+ - cm_add_netflow_monitor_policy.proposed.netflowMonitorPol.children.0.netflowRsMonitorToRecord.attributes.tnNetflowRecordPolName == "ansible_netflow_record_policy"
+ - nm_add_netflow_monitor_policy is changed
+ - nm_add_netflow_monitor_policy.previous == []
+ - nm_add_netflow_monitor_policy.current.0.netflowMonitorPol.attributes.name == "ansible_netflow_monitor_policy_1"
+ - nm_add_netflow_monitor_policy.current.0.netflowMonitorPol.children.0.netflowRsMonitorToRecord.attributes.tnNetflowRecordPolName == "ansible_netflow_record_policy"
+ - nm_add_netflow_monitor_policy_idempotency is not changed
+ - nm_add_netflow_monitor_policy_idempotency.current.0.netflowMonitorPol.attributes.name == "ansible_netflow_monitor_policy_1"
+ - nm_add_netflow_monitor_policy_idempotency.current.0.netflowMonitorPol.children.0.netflowRsMonitorToRecord.attributes.tnNetflowRecordPolName == "ansible_netflow_record_policy"
+ - nm_add_netflow_monitor_policy_2 is changed
+ - nm_add_netflow_monitor_policy_2.previous == []
+ - nm_add_netflow_monitor_policy_2.current.0.netflowMonitorPol.attributes.name == "ansible_netflow_monitor_policy_2"
+
+ # QUERY NETFLOW MONITOR POLICY
+ - name: Query all Netflow Monitor policies
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_netflow_monitor_policy
+
+ - name: Query ansible_netflow_monitor_policy_1
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_netflow_monitor_policy_present
+ state: query
+ register: query_ansible_netflow_monitor_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_netflow_monitor_policy is not changed
+ - query_all_netflow_monitor_policy.current|length >= 2
+ - query_ansible_netflow_monitor_policy_1 is not changed
+ - query_ansible_netflow_monitor_policy_1.current|length == 1
+ - query_ansible_netflow_monitor_policy_1.current.0.netflowMonitorPol.attributes.name == "ansible_netflow_monitor_policy_1"
+ - query_ansible_netflow_monitor_policy_1.current.0.netflowMonitorPol.children.0.netflowRsMonitorToRecord.attributes.tDn == "uni/tn-ansible_tenant/recordpol-ansible_netflow_record_policy"
+
+ # UPDATE NETFLOW MONITOR POLICY
+ - name: Add a Netflow Monitor policy (check_mode)
+ cisco.aci.aci_netflow_monitor_policy: &aci_netflow_monitor_policy_update
+ <<: *aci_netflow_monitor_policy_present
+ netflow_record_policy: ""
+ description: Updated Netflow Monitor policy 1 for ansible_tenant tenant
+ state: present
+ check_mode: true
+ register: cm_update_netflow_monitor_policy
+
+ - name: Add a Netflow Monitor policy (normal_mode)
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_netflow_monitor_policy_update
+ register: nm_update_netflow_monitor_policy
+
+ - name: Add the first Netflow Monitor policy again - testing idempotency
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_netflow_monitor_policy_update
+ register: nm_update_netflow_monitor_policy_idempotency
+
+ - name: Asserts for Netflow Monitor policy update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_netflow_monitor_policy is changed
+ - cm_update_netflow_monitor_policy.previous == cm_update_netflow_monitor_policy.current
+ - cm_update_netflow_monitor_policy.proposed.netflowMonitorPol.attributes.descr == "Updated Netflow Monitor policy 1 for ansible_tenant tenant"
+ - cm_update_netflow_monitor_policy.proposed.netflowMonitorPol.children.0.netflowRsMonitorToRecord.attributes.tnNetflowRecordPolName == ""
+ - nm_update_netflow_monitor_policy is changed
+ - nm_update_netflow_monitor_policy.current.0.netflowMonitorPol.attributes.descr == "Updated Netflow Monitor policy 1 for ansible_tenant tenant"
+ - nm_update_netflow_monitor_policy.current.0.netflowMonitorPol.children.0.netflowRsMonitorToRecord.attributes.tnNetflowRecordPolName == ""
+ - nm_update_netflow_monitor_policy_idempotency is not changed
+ - nm_update_netflow_monitor_policy_idempotency.current.0.netflowMonitorPol.attributes.descr == "Updated Netflow Monitor policy 1 for ansible_tenant tenant"
+ - nm_update_netflow_monitor_policy_idempotency.current.0.netflowMonitorPol.children.0.netflowRsMonitorToRecord.attributes.tnNetflowRecordPolName == ""
+
+ # DELETE NETFLOW MONITOR POLICY
+ - name: Remove Netflow Monitor policy (check_mode)
+ cisco.aci.aci_netflow_monitor_policy: &netflow_monitor_policy_absent
+ <<: *aci_netflow_monitor_policy_update
+ state: absent
+ check_mode: true
+ register: cm_remove_netflow_monitor_policy
+
+ - name: Remove Netflow Monitor policy (normal_mode)
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *netflow_monitor_policy_absent
+ register: nm_remove_netflow_monitor_policy
+
+ - name: Remove Netflow Monitor policy - testing idempotency
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *netflow_monitor_policy_absent
+ register: nm_remove_netflow_monitor_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_netflow_monitor_policy is changed
+ - cm_remove_netflow_monitor_policy.current == cm_remove_netflow_monitor_policy.previous
+ - cm_remove_netflow_monitor_policy.proposed == {}
+ - nm_remove_netflow_monitor_policy is changed
+ - nm_remove_netflow_monitor_policy.previous != []
+ - nm_remove_netflow_monitor_policy.proposed == {}
+ - nm_remove_netflow_monitor_policy.current == []
+ - nm_remove_netflow_monitor_policy_idempotency is not changed
+ - nm_remove_netflow_monitor_policy_idempotency.previous == []
+ - nm_remove_netflow_monitor_policy_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/tasks/main.yml
new file mode 100644
index 000000000..7ee25f61c
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_monitor_to_exporter/tasks/main.yml
@@ -0,0 +1,172 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a Netflow Monitor policy
+ cisco.aci.aci_netflow_monitor_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_monitor_policy: ansible_netflow_monitor_policy
+ description: Netflow Monitor policy for ansible_tenant tenant
+ state: present
+
+ - name: Add a first Netflow Exporter policy
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_exporter_policy: ansible_netflow_exporter_policy_1
+ description: Netflow Exporter policy 1 for ansible_tenant tenant
+ destination_address: 11.11.11.1
+ destination_port: https
+ state: present
+
+ - name: Add a second Netflow Exporter policy
+ cisco.aci.aci_netflow_exporter_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_exporter_policy: ansible_netflow_exporter_policy_2
+ description: Netflow Exporter policy 2 for ansible_tenant tenant
+ destination_address: 12.12.12.2
+ destination_port: http
+ state: present
+
+ # CREATE NETFLOW MONITOR TO EXPORTER
+ - name: Add a first Netflow Exporter policy to the Netflow Monitor policy (check_mode)
+ cisco.aci.aci_netflow_monitor_to_exporter: &aci_netflow_monitor_to_exporter_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_monitor_policy: ansible_netflow_monitor_policy
+ netflow_exporter_policy: ansible_netflow_exporter_policy_1
+ state: present
+ check_mode: true
+ register: cm_add_netflow_monitor_to_exporter
+
+ - name: Add a first Netflow Exporter policy to the Netflow Monitor policy (normal_mode)
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ <<: *aci_netflow_monitor_to_exporter_present
+ register: nm_add_netflow_monitor_to_exporter
+
+ - name: Add the first Netflow Monitor policy again - testing idempotency
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ <<: *aci_netflow_monitor_to_exporter_present
+ register: nm_add_netflow_monitor_to_exporter_idempotency
+
+ - name: Add a second Netflow Monitor policy (normal_mode)
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_monitor_policy: ansible_netflow_monitor_policy
+ netflow_exporter_policy: ansible_netflow_exporter_policy_2
+ state: present
+ register: nm_add_netflow_monitor_to_exporter_2
+
+ - name: Asserts for Netflow Monitor policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_netflow_monitor_to_exporter is changed
+ - cm_add_netflow_monitor_to_exporter.previous == []
+ - cm_add_netflow_monitor_to_exporter.current == []
+ - cm_add_netflow_monitor_to_exporter.proposed.netflowRsMonitorToExporter.attributes.tnNetflowExporterPolName == "ansible_netflow_exporter_policy_1"
+ - nm_add_netflow_monitor_to_exporter is changed
+ - nm_add_netflow_monitor_to_exporter.previous == []
+ - nm_add_netflow_monitor_to_exporter.current.0.netflowRsMonitorToExporter.attributes.tnNetflowExporterPolName == "ansible_netflow_exporter_policy_1"
+ - nm_add_netflow_monitor_to_exporter_idempotency is not changed
+ - nm_add_netflow_monitor_to_exporter_idempotency.current.0.netflowRsMonitorToExporter.attributes.tnNetflowExporterPolName == "ansible_netflow_exporter_policy_1"
+ - nm_add_netflow_monitor_to_exporter_2 is changed
+ - nm_add_netflow_monitor_to_exporter_2.previous == []
+ - nm_add_netflow_monitor_to_exporter_2.current.0.netflowRsMonitorToExporter.attributes.tnNetflowExporterPolName == "ansible_netflow_exporter_policy_2"
+
+ # QUERY NETFLOW MONITOR TO EXPORTER
+ - name: Query all Netflow Monitor to Exporter Associations
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ <<: *aci_info
+ state: query
+ register: query_all_netflow_monitor_to_exporter
+
+ - name: Query first Netflow Monitor to Exporter Association
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ <<: *aci_netflow_monitor_to_exporter_present
+ state: query
+ register: query_ansible_netflow_monitor_policy_to_exporter
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_netflow_monitor_to_exporter is not changed
+ - query_all_netflow_monitor_to_exporter.current|length >= 2
+ - query_ansible_netflow_monitor_policy_to_exporter is not changed
+ - query_ansible_netflow_monitor_policy_to_exporter.current|length == 1
+ - query_ansible_netflow_monitor_policy_to_exporter.current.0.netflowRsMonitorToExporter.attributes.tnNetflowExporterPolName == "ansible_netflow_exporter_policy_1"
+
+ # DELETE NETFLOW MONITOR TO EXPORTER
+ - name: Remove first Netflow Exporter policy from the Netflow Monitor policy (check_mode)
+ cisco.aci.aci_netflow_monitor_to_exporter: &netflow_monitor_to_exporter_absent
+ <<: *aci_netflow_monitor_to_exporter_present
+ state: absent
+ check_mode: true
+ register: cm_remove_netflow_monitor_to_exporter
+
+ - name: Remove first Netflow Exporter policy from the Netflow Monitor policy (normal_mode)
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ <<: *netflow_monitor_to_exporter_absent
+ register: nm_remove_netflow_monitor_to_exporter
+
+ - name: Remove first Netflow Exporter policy from the Netflow Monitor policy - testing idempotency
+ cisco.aci.aci_netflow_monitor_to_exporter:
+ <<: *netflow_monitor_to_exporter_absent
+ register: nm_remove_netflow_monitor_to_exporter_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_netflow_monitor_to_exporter is changed
+ - cm_remove_netflow_monitor_to_exporter.current == cm_remove_netflow_monitor_to_exporter.previous
+ - cm_remove_netflow_monitor_to_exporter.proposed == {}
+ - nm_remove_netflow_monitor_to_exporter is changed
+ - nm_remove_netflow_monitor_to_exporter.previous != []
+ - nm_remove_netflow_monitor_to_exporter.current == []
+ - nm_remove_netflow_monitor_to_exporter_idempotency is not changed
+ - nm_remove_netflow_monitor_to_exporter_idempotency.previous == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/tasks/main.yml
new file mode 100644
index 000000000..0645e9159
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_netflow_record_policy/tasks/main.yml
@@ -0,0 +1,194 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # CREATE NETFLOW RECORD POLICY
+ - name: Add a Netflow Record policy (check_mode)
+ cisco.aci.aci_netflow_record_policy: &aci_netflow_record_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_record_policy: ansible_netflow_record_policy_1
+ description: Netflow Record policy 1 for ansible_tenant tenant
+ collect: [sampler_id, bytes_counter]
+ match: [destination_ipv4_v6, source_ipv4_v6]
+ state: present
+ check_mode: true
+ register: cm_add_netflow_record_policy
+
+ - name: Add a Netflow Record policy (normal_mode)
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_netflow_record_policy_present
+ register: nm_add_netflow_record_policy
+
+ - name: Add the first Netflow Record policy again - testing idempotency
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_netflow_record_policy_present
+ register: nm_add_netflow_record_policy_idempotency
+
+ - name: Add a second Netflow Record policy (normal_mode)
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ netflow_record_policy: ansible_netflow_record_policy_2
+ description: Netflow Record policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_netflow_record_policy_2
+
+ - name: Asserts for Netflow Record policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_netflow_record_policy is changed
+ - cm_add_netflow_record_policy.previous == []
+ - cm_add_netflow_record_policy.current == []
+ - cm_add_netflow_record_policy.proposed.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_1"
+ - cm_add_netflow_record_policy.proposed.netflowRecordPol.attributes.collect == "count-bytes,sampler-id"
+ - cm_add_netflow_record_policy.proposed.netflowRecordPol.attributes.match == "dst-ip,src-ip"
+ - nm_add_netflow_record_policy is changed
+ - nm_add_netflow_record_policy.previous == []
+ - nm_add_netflow_record_policy.current.0.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_1"
+ - nm_add_netflow_record_policy.current.0.netflowRecordPol.attributes.collect == "count-bytes,sampler-id"
+ - nm_add_netflow_record_policy.current.0.netflowRecordPol.attributes.match == "dst-ip,src-ip"
+ - nm_add_netflow_record_policy_idempotency is not changed
+ - nm_add_netflow_record_policy_idempotency.current.0.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_1"
+ - nm_add_netflow_record_policy_idempotency.current.0.netflowRecordPol.attributes.collect == "count-bytes,sampler-id"
+ - nm_add_netflow_record_policy_idempotency.current.0.netflowRecordPol.attributes.match == "dst-ip,src-ip"
+ - nm_add_netflow_record_policy_2 is changed
+ - nm_add_netflow_record_policy_2.previous == []
+ - nm_add_netflow_record_policy_2.current.0.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_2"
+ - nm_add_netflow_record_policy_2.current.0.netflowRecordPol.attributes.collect == "src-intf"
+ - nm_add_netflow_record_policy_2.current.0.netflowRecordPol.attributes.match == ""
+
+ # QUERY NETFLOW RECORD POLICY
+ - name: Query all Netflow Record policies
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_netflow_record_policy
+
+ - name: Query ansible_netflow_record_policy_1
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_netflow_record_policy_present
+ state: query
+ register: query_ansible_netflow_record_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_netflow_record_policy is not changed
+ - query_all_netflow_record_policy.current|length >= 2
+ - query_ansible_netflow_record_policy_1 is not changed
+ - query_ansible_netflow_record_policy_1.current|length == 1
+ - query_ansible_netflow_record_policy_1.current.0.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_1"
+ - query_ansible_netflow_record_policy_1.current.0.netflowRecordPol.attributes.collect == "count-bytes,sampler-id"
+ - query_ansible_netflow_record_policy_1.current.0.netflowRecordPol.attributes.match == "dst-ip,src-ip"
+
+ #UPDATE NETFLOW RECORD POLICY
+ - name: Update first Netflow Record policy (check_mode)
+ cisco.aci.aci_netflow_record_policy: &aci_netflow_record_policy_update
+ <<: *aci_netflow_record_policy_present
+ collect: [pkts_counter, pkt_disposition]
+ match: [destination_ipv4, source_ipv4]
+ state: present
+ check_mode: true
+ register: cm_update_netflow_record_policy
+
+ - name: Update first Netflow Record policy (normal_mode)
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_netflow_record_policy_update
+ register: nm_update_netflow_record_policy
+
+ - name: Update first Netflow Record policy again - testing idempotency
+ cisco.aci.aci_netflow_record_policy:
+ <<: *aci_netflow_record_policy_update
+ register: nm_udpate_netflow_record_policy_idempotency
+
+ - name: Asserts for Netflow Record policy update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_netflow_record_policy is changed
+ - cm_update_netflow_record_policy.previous == cm_update_netflow_record_policy.current
+ - cm_update_netflow_record_policy.proposed.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_1"
+ - cm_update_netflow_record_policy.proposed.netflowRecordPol.attributes.collect == "count-pkts,pkt-disp"
+ - cm_update_netflow_record_policy.proposed.netflowRecordPol.attributes.match == "dst-ipv4,src-ipv4"
+ - nm_update_netflow_record_policy is changed
+ - nm_update_netflow_record_policy.current.0.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_1"
+ - nm_update_netflow_record_policy.current.0.netflowRecordPol.attributes.collect == "count-pkts,pkt-disp"
+ - nm_update_netflow_record_policy.current.0.netflowRecordPol.attributes.match == "dst-ipv4,src-ipv4"
+ - nm_udpate_netflow_record_policy_idempotency is not changed
+ - nm_udpate_netflow_record_policy_idempotency.current.0.netflowRecordPol.attributes.name == "ansible_netflow_record_policy_1"
+ - nm_udpate_netflow_record_policy_idempotency.current.0.netflowRecordPol.attributes.collect == "count-pkts,pkt-disp"
+ - nm_udpate_netflow_record_policy_idempotency.current.0.netflowRecordPol.attributes.match == "dst-ipv4,src-ipv4"
+
+ # DELETE NETFLOW RECORD POLICY
+ - name: Remove Netflow Record policy (check_mode)
+ cisco.aci.aci_netflow_record_policy: &netflow_record_policy_absent
+ <<: *aci_netflow_record_policy_update
+ state: absent
+ check_mode: true
+ register: cm_remove_netflow_record_policy
+
+ - name: Remove Netflow Record policy (normal_mode)
+ cisco.aci.aci_netflow_record_policy:
+ <<: *netflow_record_policy_absent
+ register: nm_remove_netflow_record_policy
+
+ - name: Remove Netflow Record policy - testing idempotency
+ cisco.aci.aci_netflow_record_policy:
+ <<: *netflow_record_policy_absent
+ register: nm_remove_netflow_record_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_netflow_record_policy is changed
+ - cm_remove_netflow_record_policy.current == cm_remove_netflow_record_policy.previous
+ - cm_remove_netflow_record_policy.proposed == {}
+ - nm_remove_netflow_record_policy is changed
+ - nm_remove_netflow_record_policy.previous != []
+ - nm_remove_netflow_record_policy.current == []
+ - nm_remove_netflow_record_policy_idempotency is not changed
+ - nm_remove_netflow_record_policy_idempotency.previous == []
+ - nm_remove_netflow_record_policy_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/tasks/main.yml
new file mode 100644
index 000000000..a7f77758b
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_node_block/tasks/main.yml
@@ -0,0 +1,275 @@
+# Test code for the ACI modules
+# Copyright: (c) 2024, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ # CLEAN ENVIRONMENT
+ - name: Remove the ansible_access_spine_switch_profile
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_absent
+ <<: *aci_info
+ switch_profile: ansible_access_spine_switch_profile
+ state: absent
+
+ - name: Remove the ansible_access_leaf_switch_profile
+ cisco.aci.aci_switch_policy_leaf_profile: &aci_access_leaf_switch_profile_absent
+ <<: *aci_info
+ leaf_profile: ansible_access_leaf_switch_profile
+ state: absent
+
+ # CREATE ACCESS SWITCH POLICY PROFILES
+ - name: Add a new Access Spine Switch profile
+ cisco.aci.aci_access_spine_switch_profile: &aci_access_spine_switch_profile_present
+ <<: *aci_access_spine_switch_profile_absent
+ state: present
+
+ - name: Add a new Access Leaf Switch profile
+ cisco.aci.aci_switch_policy_leaf_profile: &aci_access_leaf_switch_profile_present
+ <<: *aci_access_leaf_switch_profile_absent
+ state: present
+
+ # CREATE ACCESS SWITCH POLICY SELECTORS
+ - name: Add a new Access Spine Switch selector
+ cisco.aci.aci_access_spine_switch_selector:
+ <<: *aci_access_spine_switch_profile_present
+ switch_selector: ansible_access_spine_switch_selector
+ selector_type: range
+ state: present
+
+ - name: Add a new Access Leaf Switch selector
+ cisco.aci.aci_switch_leaf_selector:
+ <<: *aci_access_leaf_switch_profile_present
+ leaf: ansible_access_leaf_switch_selector
+ state: present
+
+ # CREATE NODE BLOCK FOR SWITCH POLICY LEAF SELECTOR
+ - name: Add a new Node Block for Switch policy leaf selector (check_mode)
+ cisco.aci.aci_node_block: &aci_node_block_leaf_present
+ <<: *aci_info
+ switch_profile: ansible_access_leaf_switch_profile
+ port_selector: ansible_access_leaf_switch_selector
+ node_block: ansible_node_block_leaf_1
+ from: 1011
+ to: 1011
+ description: Node Block for Switch policy leaf selector 1
+ type_node: leaf
+ state: present
+ check_mode: true
+ register: cm_add_node_block_leaf
+
+ - name: Add a new Node Block for Switch policy leaf selector (normal_mode)
+ cisco.aci.aci_node_block:
+ <<: *aci_node_block_leaf_present
+ register: nm_add_node_block_leaf
+
+ - name: Add the first Node Block for Switch policy leaf selector again - testing idempotency
+ cisco.aci.aci_node_block:
+ <<: *aci_node_block_leaf_present
+ register: nm_add_node_block_leaf_idempotency
+
+ - name: Add a second Node Block for Switch policy leaf selector (normal_mode)
+ cisco.aci.aci_node_block: &aci_node_block_leaf_2_present
+ <<: *aci_info
+ switch_profile: ansible_access_leaf_switch_profile
+ port_selector: ansible_access_leaf_switch_selector
+ node_block: ansible_node_block_leaf_2
+ from: 1012
+ to: 1012
+ description: Node Block for Switch policy leaf selector 2
+ type_node: leaf
+ state: present
+ register: nm_add_node_block_leaf_2
+
+ - name: Add a Node Block for Switch policy spine selector (normal_mode)
+ cisco.aci.aci_node_block: &aci_node_block_spine_present
+ <<: *aci_info
+ switch_profile: ansible_access_spine_switch_profile
+ port_selector: ansible_access_spine_switch_selector
+ node_block: ansible_node_block_spine
+ from: 1014
+ to: 1014
+ description: Node Block for Switch policy spine selector
+ type_node: spine
+ state: present
+ register: nm_add_node_block_spine
+
+ - name: Asserts for Node Blocks creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_node_block_leaf is changed
+ - cm_add_node_block_leaf.previous == []
+ - cm_add_node_block_leaf.current == []
+ - cm_add_node_block_leaf.proposed.infraNodeBlk.attributes.name == "ansible_node_block_leaf_1"
+ - cm_add_node_block_leaf.proposed.infraNodeBlk.attributes.descr == "Node Block for Switch policy leaf selector 1"
+ - cm_add_node_block_leaf.proposed.infraNodeBlk.attributes.from_ == "1011"
+ - cm_add_node_block_leaf.proposed.infraNodeBlk.attributes.to_ == "1011"
+ - cm_add_node_block_leaf.proposed.infraNodeBlk.attributes.dn == "uni/infra/nprof-ansible_access_leaf_switch_profile/leaves-ansible_access_leaf_switch_selector-typ-range/nodeblk-ansible_node_block_leaf_1"
+ - nm_add_node_block_leaf is changed
+ - nm_add_node_block_leaf.previous == []
+ - nm_add_node_block_leaf.current.0.infraNodeBlk.attributes.name == "ansible_node_block_leaf_1"
+ - nm_add_node_block_leaf.current.0.infraNodeBlk.attributes.descr == "Node Block for Switch policy leaf selector 1"
+ - nm_add_node_block_leaf.current.0.infraNodeBlk.attributes.from_ == "1011"
+ - nm_add_node_block_leaf.current.0.infraNodeBlk.attributes.to_ == "1011"
+ - nm_add_node_block_leaf.current.0.infraNodeBlk.attributes.dn == "uni/infra/nprof-ansible_access_leaf_switch_profile/leaves-ansible_access_leaf_switch_selector-typ-range/nodeblk-ansible_node_block_leaf_1"
+ - nm_add_node_block_leaf_idempotency is not changed
+ - nm_add_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.name == "ansible_node_block_leaf_1"
+ - nm_add_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.descr == "Node Block for Switch policy leaf selector 1"
+ - nm_add_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.from_ == "1011"
+ - nm_add_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.to_ == "1011"
+ - nm_add_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.dn == "uni/infra/nprof-ansible_access_leaf_switch_profile/leaves-ansible_access_leaf_switch_selector-typ-range/nodeblk-ansible_node_block_leaf_1"
+ - nm_add_node_block_leaf_2 is changed
+ - nm_add_node_block_leaf_2.previous == []
+ - nm_add_node_block_leaf_2.current.0.infraNodeBlk.attributes.name == "ansible_node_block_leaf_2"
+ - nm_add_node_block_leaf_2.current.0.infraNodeBlk.attributes.descr == "Node Block for Switch policy leaf selector 2"
+ - nm_add_node_block_leaf_2.current.0.infraNodeBlk.attributes.from_ == "1012"
+ - nm_add_node_block_leaf_2.current.0.infraNodeBlk.attributes.to_ == "1012"
+ - nm_add_node_block_leaf_2.current.0.infraNodeBlk.attributes.dn == "uni/infra/nprof-ansible_access_leaf_switch_profile/leaves-ansible_access_leaf_switch_selector-typ-range/nodeblk-ansible_node_block_leaf_2"
+ - nm_add_node_block_leaf_2 is changed
+ - nm_add_node_block_leaf_2.previous == []
+ - nm_add_node_block_spine.current.0.infraNodeBlk.attributes.name == "ansible_node_block_spine"
+ - nm_add_node_block_spine.current.0.infraNodeBlk.attributes.descr == "Node Block for Switch policy spine selector"
+ - nm_add_node_block_spine.current.0.infraNodeBlk.attributes.from_ == "1014"
+ - nm_add_node_block_spine.current.0.infraNodeBlk.attributes.to_ == "1014"
+ - nm_add_node_block_spine.current.0.infraNodeBlk.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile/spines-ansible_access_spine_switch_selector-typ-range/nodeblk-ansible_node_block_spine"
+
+ # QUERY NODE BLOCKS
+ - name: Query all Node Block for Switch policy leaf selectors
+ cisco.aci.aci_node_block:
+ <<: *aci_info
+ state: query
+ register: query_all_node_block
+
+ - name: Query ansible_node_block_leaf_1
+ cisco.aci.aci_node_block:
+ <<: *aci_node_block_leaf_present
+ state: query
+ register: query_ansible_node_block_leaf_1
+
+ - name: Query ansible_node_block_spine
+ cisco.aci.aci_node_block:
+ <<: *aci_node_block_spine_present
+ state: query
+ register: query_ansible_node_block_spine
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_node_block is not changed
+ - query_all_node_block.current|length >= 3
+ - query_ansible_node_block_leaf_1 is not changed
+ - query_ansible_node_block_leaf_1.current|length == 1
+ - query_ansible_node_block_leaf_1.current.0.infraNodeBlk.attributes.name == "ansible_node_block_leaf_1"
+ - query_ansible_node_block_leaf_1.current.0.infraNodeBlk.attributes.descr == "Node Block for Switch policy leaf selector 1"
+ - query_ansible_node_block_leaf_1.current.0.infraNodeBlk.attributes.from_ == "1011"
+ - query_ansible_node_block_leaf_1.current.0.infraNodeBlk.attributes.to_ == "1011"
+ - query_ansible_node_block_leaf_1.current.0.infraNodeBlk.attributes.dn == "uni/infra/nprof-ansible_access_leaf_switch_profile/leaves-ansible_access_leaf_switch_selector-typ-range/nodeblk-ansible_node_block_leaf_1"
+ - query_ansible_node_block_spine is not changed
+ - query_ansible_node_block_spine.current|length == 1
+ - query_ansible_node_block_spine.current.0.infraNodeBlk.attributes.name == "ansible_node_block_spine"
+ - query_ansible_node_block_spine.current.0.infraNodeBlk.attributes.descr == "Node Block for Switch policy spine selector"
+ - query_ansible_node_block_spine.current.0.infraNodeBlk.attributes.from_ == "1014"
+ - query_ansible_node_block_spine.current.0.infraNodeBlk.attributes.to_ == "1014"
+ - query_ansible_node_block_spine.current.0.infraNodeBlk.attributes.dn == "uni/infra/spprof-ansible_access_spine_switch_profile/spines-ansible_access_spine_switch_selector-typ-range/nodeblk-ansible_node_block_spine"
+
+ # UPDATE NODE BLOCKS
+ - name: Update first Node Block for Switch policy leaf selector (check_mode)
+ cisco.aci.aci_node_block: &aci_node_block_leaf_update
+ <<: *aci_node_block_leaf_present
+ description: Updated description for first ansible Node Block for Switch policy leaf selector
+ from: 1013
+ to: 1013
+ check_mode: true
+ register: cm_update_node_block
+
+ - name: Update first Node Block for Switch policy leaf selector (normal_mode)
+ cisco.aci.aci_node_block:
+ <<: *aci_node_block_leaf_update
+ register: nm_update_node_block
+
+ - name: Update first Node Block for Switch policy leaf selector again - testing idempotency
+ cisco.aci.aci_node_block:
+ <<: *aci_node_block_leaf_update
+ register: nm_udpate_node_block_leaf_idempotency
+
+ - name: Asserts for Node Blocks update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_node_block is changed
+ - cm_update_node_block.previous == cm_update_node_block.current
+ - cm_update_node_block.proposed.infraNodeBlk.attributes.descr == "Updated description for first ansible Node Block for Switch policy leaf selector"
+ - cm_update_node_block.proposed.infraNodeBlk.attributes.from_ == "1013"
+ - cm_update_node_block.proposed.infraNodeBlk.attributes.to_ == "1013"
+ - nm_update_node_block is changed
+ - nm_update_node_block.current.0.infraNodeBlk.attributes.name == "ansible_node_block_leaf_1"
+ - nm_update_node_block.current.0.infraNodeBlk.attributes.descr == "Updated description for first ansible Node Block for Switch policy leaf selector"
+ - nm_update_node_block.current.0.infraNodeBlk.attributes.from_ == "1013"
+ - nm_update_node_block.current.0.infraNodeBlk.attributes.to_ == "1013"
+ - nm_update_node_block.current.0.infraNodeBlk.attributes.dn == "uni/infra/nprof-ansible_access_leaf_switch_profile/leaves-ansible_access_leaf_switch_selector-typ-range/nodeblk-ansible_node_block_leaf_1"
+ - nm_udpate_node_block_leaf_idempotency is not changed
+ - nm_udpate_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.name == "ansible_node_block_leaf_1"
+ - nm_udpate_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.descr == "Updated description for first ansible Node Block for Switch policy leaf selector"
+ - nm_udpate_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.from_ == "1013"
+ - nm_udpate_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.to_ == "1013"
+ - nm_udpate_node_block_leaf_idempotency.current.0.infraNodeBlk.attributes.dn == "uni/infra/nprof-ansible_access_leaf_switch_profile/leaves-ansible_access_leaf_switch_selector-typ-range/nodeblk-ansible_node_block_leaf_1"
+
+ # DELETE NODE BLOCKS
+ - name: Remove Node Block for Switch policy leaf selector (check_mode)
+ cisco.aci.aci_node_block: &node_block_leaf_absent
+ <<: *aci_node_block_leaf_update
+ state: absent
+ check_mode: true
+ register: cm_remove_node_block_leaf
+
+ - name: Remove Node Block for Switch policy leaf selector (normal_mode)
+ cisco.aci.aci_node_block:
+ <<: *node_block_leaf_absent
+ register: nm_remove_node_block_leaf
+
+ - name: Remove Node Block for Switch policy leaf selector - testing idempotency
+ cisco.aci.aci_node_block:
+ <<: *node_block_leaf_absent
+ register: nm_remove_node_block_leaf_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_node_block_leaf is changed
+ - cm_remove_node_block_leaf.current == cm_remove_node_block_leaf.previous
+ - cm_remove_node_block_leaf.proposed == {}
+ - nm_remove_node_block_leaf is changed
+ - nm_remove_node_block_leaf.previous != []
+ - nm_remove_node_block_leaf.proposed == {}
+ - nm_remove_node_block_leaf.current == []
+ - nm_remove_node_block_leaf_idempotency is not changed
+ - nm_remove_node_block_leaf_idempotency.previous == []
+ - nm_remove_node_block_leaf_idempotency.current == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the Access Spine Switch profile - cleanup before ending tests
+ cisco.aci.aci_access_spine_switch_profile:
+ <<: *aci_access_spine_switch_profile_absent
+
+ - name: Remove the Access Leaf Switch profile - cleanup before ending tests
+ cisco.aci.aci_switch_policy_leaf_profile:
+ <<: *aci_access_leaf_switch_profile_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_node_mgmt_epg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_node_mgmt_epg/tasks/main.yml
index 310fc822b..8cdf876f6 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_node_mgmt_epg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_node_mgmt_epg/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Remove node mgmt in_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: "{{ item }}"
@@ -39,7 +39,7 @@
- ansible-inband-2
- name: Remove node mgmt out_of_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: "{{ item }}"
@@ -50,7 +50,7 @@
# Add operations
- name: Add node mgmt in_band epg in check mode
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband
@@ -61,7 +61,7 @@
register: add_cm_inband
- name: Add node mgmt out_of_band epg in check mode
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband
@@ -70,7 +70,7 @@
register: add_cm_outofband
- name: Add node mgmt in_band epg in normal mode
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband
@@ -80,7 +80,7 @@
register: add_nm_inband
- name: Add node mgmt out_of_band epg in normal mode
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband
@@ -88,7 +88,7 @@
register: add_nm_outofband
- name: Add node mgmt in_band epg in normal mode again
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband
@@ -98,7 +98,7 @@
register: add_nm_inband_again
- name: Add node mgmt out_of_band epg in normal mode again
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband
@@ -106,7 +106,7 @@
register: add_nm_outofband_again
- name: Add another node mgmt in_band epg in normal mode
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband-2
@@ -116,7 +116,7 @@
register: add_nm_inband_2
- name: Add another node mgmt out_of_band epg in normal mode
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband-2
@@ -124,7 +124,7 @@
register: add_nm_outofband_2
- name: Add another node mgmt in_band epg in normal mode with change made to bd
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband-2
@@ -134,7 +134,7 @@
register: add_nm_inband_bd4
- name: Add another node mgmt in_band epg in normal mode with change made to encap
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband-2
@@ -144,7 +144,7 @@
register: add_nm_inband_encap4
- name: Verify add operations
- assert:
+ ansible.builtin.assert:
that:
- add_cm_inband is changed
- add_cm_inband.sent.mgmtInB.attributes.name == 'ansible-inband'
@@ -173,7 +173,7 @@
# Query operations
- name: Query node mgmt in_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband
@@ -183,7 +183,7 @@
register: query_inband
- name: Query node mgmt out_of_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband
@@ -191,21 +191,21 @@
register: query_outofband
- name: Query all in band
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
state: query
register: query_all_inband
- name: Query all out of band
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
state: query
register: query_all_outofband
- name: Verify query operations
- assert:
+ ansible.builtin.assert:
that:
- query_inband is not changed
- query_inband.current.0.mgmtInB.attributes.name == 'ansible-inband'
@@ -217,7 +217,7 @@
# Remove operations
- name: Remove node mgmt in_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband-2
@@ -225,7 +225,7 @@
register: remove_inband_2
- name: Remove node mgmt out_of_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband-2
@@ -233,7 +233,7 @@
register: remove_outofband_2
- name: Remove node mgmt in_band epg again
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband-2
@@ -241,7 +241,7 @@
register: remove_inband_2_again
- name: Verify remove operations
- assert:
+ ansible.builtin.assert:
that:
- remove_inband_2 is changed
- remove_inband_2.previous.0.mgmtInB.attributes.name == 'ansible-inband-2'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_policy/tasks/main.yml
index ddc5b69e6..6d07f2b00 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -56,7 +56,7 @@
register: nm_add_policy_again
- name: Verify add policy
- assert:
+ ansible.builtin.assert:
that:
- cm_add_policy is changed
- nm_add_policy is changed
@@ -105,7 +105,7 @@
register: nm_modify_policy_again
- name: Verify modify policy
- assert:
+ ansible.builtin.assert:
that:
- cm_modify_policy is changed
- nm_modify_policy is changed
@@ -138,7 +138,7 @@
register: nm_query_all_policies
- name: Verify query_all_policies
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_policies is not changed
- nm_query_all_policies is not changed
@@ -158,7 +158,7 @@
register: nm_query_policy
- name: Verify query_policy
- assert:
+ ansible.builtin.assert:
that:
- cm_query_policy is not changed
- nm_query_policy is not changed
@@ -194,7 +194,7 @@
register: nm_remove_policy_again
- name: Verify remove_policy
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_policy is changed
- nm_remove_policy is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_server/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_server/tasks/main.yml
index 15c6799cb..1a1ea2879 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_server/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_ntp_server/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -68,7 +68,7 @@
register: nm_add_server_again
- name: Verify add server
- assert:
+ ansible.builtin.assert:
that:
- cm_add_server is changed
- nm_add_server is changed
@@ -120,7 +120,7 @@
register: nm_modify_server_again
- name: Verify modify policy
- assert:
+ ansible.builtin.assert:
that:
- cm_modify_server is changed
- nm_modify_server is changed
@@ -156,7 +156,7 @@
register: nm_query_all_servers
- name: Verify query_all_servers
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_servers is not changed
- nm_query_all_servers is not changed
@@ -176,7 +176,7 @@
register: nm_query_server
- name: Verify query_server
- assert:
+ ansible.builtin.assert:
that:
- cm_query_server is not changed
- nm_query_server is not changed
@@ -215,7 +215,7 @@
register: nm_remove_server_again
- name: Verify remove_server
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_server is changed
- nm_remove_server is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/tasks/main.yml
new file mode 100644
index 000000000..c9cdf09c2
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_entry/tasks/main.yml
@@ -0,0 +1,196 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a new PIM route map policy
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim_route_map_policy: ansible_pim_route_map_policy
+ description: PIM route map policy 1 for ansible_tenant tenant
+ state: present
+
+ # CREATION TASKS
+ - name: Add a PIM route map entry (check_mode)
+ cisco.aci.aci_pim_route_map_entry: &aci_pim_route_map_entry_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim_route_map_policy: ansible_pim_route_map_policy
+ order: 1
+ description: PIM route map entry 1 for pim_route_map_policy
+ source_ip: 1.1.1.1/24
+ group_ip: 224.0.0.1/24
+ rp_ip: 1.1.1.2
+ action: deny
+ state: present
+ check_mode: true
+ register: cm_add_pim_route_map_entry
+
+ - name: Add a PIM route map entry (normal_mode)
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *aci_pim_route_map_entry_present
+ register: nm_add_pim_route_map_entry
+
+ - name: Add the first PIM route map entry again - testing idempotency
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *aci_pim_route_map_entry_present
+ register: nm_add_pim_route_map_entry_idempotency
+
+ - name: Add a second PIM route map entry (normal_mode)
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim_route_map_policy: ansible_pim_route_map_policy
+ order: 2
+ description: PIM route map entry 2 for pim_route_map_policy
+ state: present
+ register: nm_add_pim_route_map_entry_2
+
+ - name: Asserts for PIM route map entry creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_pim_route_map_entry is changed
+ - cm_add_pim_route_map_entry.previous == []
+ - cm_add_pim_route_map_entry.current == []
+ - nm_add_pim_route_map_entry is changed
+ - nm_add_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.order == "1"
+ - nm_add_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.action == "deny"
+ - nm_add_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.grp == "224.0.0.1/24"
+ - nm_add_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.rp == "1.1.1.2"
+ - nm_add_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.src == "1.1.1.1/24"
+ - nm_add_pim_route_map_entry_idempotency is not changed
+ - nm_add_pim_route_map_entry_2 is changed
+ - nm_add_pim_route_map_entry_2.previous == []
+ - nm_add_pim_route_map_entry_2.current.0.pimRouteMapEntry.attributes.order == "2"
+ - nm_add_pim_route_map_entry_2.current.0.pimRouteMapEntry.attributes.action == "permit"
+
+ # QUERY TASKS
+ - name: Query all PIM route map entries
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *aci_info
+ state: query
+ register: query_all_pim_route_map_entry
+
+ - name: Query ansible_pim_route_map_entry_1
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *aci_pim_route_map_entry_present
+ state: query
+ register: query_ansible_pim_route_map_entry_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_pim_route_map_entry is not changed
+ - query_all_pim_route_map_entry.current|length >= 2
+ - query_ansible_pim_route_map_entry_1 is not changed
+ - query_ansible_pim_route_map_entry_1.current.0.pimRouteMapEntry.attributes.order == "1"
+ - query_ansible_pim_route_map_entry_1.current.0.pimRouteMapEntry.attributes.action == "deny"
+ - query_ansible_pim_route_map_entry_1.current.0.pimRouteMapEntry.attributes.grp == "224.0.0.1/24"
+ - query_ansible_pim_route_map_entry_1.current.0.pimRouteMapEntry.attributes.rp == "1.1.1.2"
+ - query_ansible_pim_route_map_entry_1.current.0.pimRouteMapEntry.attributes.src == "1.1.1.1/24"
+
+ # UPDATE TASKS
+ - name: Update first PIM route map entry (check_mode)
+ cisco.aci.aci_pim_route_map_entry: &aci_pim_route_map_entry_update
+ <<: *aci_pim_route_map_entry_present
+ order: 3
+ source_ip: 1.1.1.3/24
+ group_ip: 224.0.0.3/24
+ rp_ip: 1.1.1.3
+ action: permit
+ check_mode: true
+ register: cm_update_pim_route_map_entry
+
+ - name: Update first PIM route map entry (normal_mode)
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *aci_pim_route_map_entry_update
+ register: nm_update_pim_route_map_entry
+
+ - name: Update first PIM route map entry again - testing idempotency
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *aci_pim_route_map_entry_update
+ register: nm_update_pim_route_map_entry_idempotency
+
+ - name: Asserts for PIM route map entry update tasks
+ ansible.builtin.assert:
+ that:
+ - cm_update_pim_route_map_entry is changed
+ - cm_update_pim_route_map_entry.previous == cm_update_pim_route_map_entry.current
+ - nm_update_pim_route_map_entry is changed
+ - nm_update_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.order == "3"
+ - nm_update_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.action == "permit"
+ - nm_update_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.grp == "224.0.0.3/24"
+ - nm_update_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.rp == "1.1.1.3"
+ - nm_update_pim_route_map_entry.current.0.pimRouteMapEntry.attributes.src == "1.1.1.3/24"
+ - nm_update_pim_route_map_entry_idempotency is not changed
+
+ # DELETION TASKS
+ - name: Remove PIM route map entry (check_mode)
+ cisco.aci.aci_pim_route_map_entry: &pim_route_map_entry_absent
+ <<: *aci_pim_route_map_entry_update
+ state: absent
+ check_mode: true
+ register: cm_remove_pim_route_map_entry
+
+ - name: Remove PIM route map entry (normal_mode)
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *pim_route_map_entry_absent
+ register: nm_remove_pim_route_map_entry
+
+ - name: Remove PIM route map entry - testing idempotency
+ cisco.aci.aci_pim_route_map_entry:
+ <<: *pim_route_map_entry_absent
+ register: nm_remove_pim_route_map_entry_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_pim_route_map_entry is changed
+ - cm_remove_pim_route_map_entry.proposed == {}
+ - nm_remove_pim_route_map_entry is changed
+ - nm_remove_pim_route_map_entry.previous != []
+ - nm_remove_pim_route_map_entry.current == []
+ - nm_remove_pim_route_map_entry_idempotency is not changed
+ - nm_remove_pim_route_map_entry_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/tasks/main.yml
new file mode 100644
index 000000000..4737bb2bb
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_pim_route_map_policy/tasks/main.yml
@@ -0,0 +1,135 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a PIM route map policy (check_mode)
+ cisco.aci.aci_pim_route_map_policy: &aci_pim_route_map_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim_route_map_policy: ansible_pim_route_map_policy_1
+ description: PIM route map policy 1 for ansible_tenant tenant
+ state: present
+ check_mode: true
+ register: cm_add_pim_route_map_policy
+
+ - name: Add a PIM route map policy (normal_mode)
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_pim_route_map_policy_present
+ register: nm_add_pim_route_map_policy
+
+ - name: Add the first PIM route map policy again - testing idempotency
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_pim_route_map_policy_present
+ register: nm_add_pim_route_map_policy_idempotency
+
+ - name: Add a second PIM route map policy (normal_mode)
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ pim_route_map_policy: ansible_pim_route_map_policy_2
+ description: PIM route map policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_pim_route_map_policy_2
+
+ - name: Asserts for PIM route map policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_pim_route_map_policy is changed
+ - cm_add_pim_route_map_policy.previous == []
+ - cm_add_pim_route_map_policy.current == []
+ - nm_add_pim_route_map_policy is changed
+ - nm_add_pim_route_map_policy.current.0.pimRouteMapPol.attributes.name == "ansible_pim_route_map_policy_1"
+ - nm_add_pim_route_map_policy_idempotency is not changed
+ - nm_add_pim_route_map_policy_2 is changed
+ - nm_add_pim_route_map_policy_2.previous == []
+ - nm_add_pim_route_map_policy_2.current.0.pimRouteMapPol.attributes.name == "ansible_pim_route_map_policy_2"
+
+ - name: Query all PIM route map policies
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_pim_route_map_policy
+
+ - name: Query ansible_pim_route_map_policy_1
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *aci_pim_route_map_policy_present
+ state: query
+ register: query_ansible_pim_route_map_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_pim_route_map_policy is not changed
+ - query_all_pim_route_map_policy.current|length >= 2
+ - query_ansible_pim_route_map_policy_1 is not changed
+ - query_ansible_pim_route_map_policy_1.current.0.pimRouteMapPol.attributes.name == "ansible_pim_route_map_policy_1"
+
+ - name: Remove PIM route map policy (check_mode)
+ cisco.aci.aci_pim_route_map_policy: &pim_route_map_policy_absent
+ <<: *aci_pim_route_map_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_pim_route_map_policy
+
+ - name: Remove PIM route map policy (normal_mode)
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *pim_route_map_policy_absent
+ register: nm_remove_pim_route_map_policy
+
+ - name: Remove PIM route map policy - testing idempotency
+ cisco.aci.aci_pim_route_map_policy:
+ <<: *pim_route_map_policy_absent
+ register: nm_remove_pim_route_map_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_pim_route_map_policy is changed
+ - cm_remove_pim_route_map_policy.proposed == {}
+ - nm_remove_pim_route_map_policy is changed
+ - nm_remove_pim_route_map_policy.previous != []
+ - nm_remove_pim_route_map_policy.current == []
+ - nm_remove_pim_route_map_policy_idempotency is not changed
+ - nm_remove_pim_route_map_policy_idempotency.previous == []
+
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/tasks/main.yml
new file mode 100644
index 000000000..0a984577a
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_custom_policy/tasks/main.yml
@@ -0,0 +1,139 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ # CREATE QOS CUSTOM POLICY
+ - name: Add a QoS Custom policy (check_mode)
+ cisco.aci.aci_qos_custom_policy: &aci_qos_custom_policy_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_1
+ description: QoS Custom policy 1 for ansible_tenant tenant
+ state: present
+ check_mode: true
+ register: cm_add_qos_custom_policy
+
+ - name: Add a QoS Custom policy (normal_mode)
+ cisco.aci.aci_qos_custom_policy:
+ <<: *aci_qos_custom_policy_present
+ register: nm_add_qos_custom_policy
+
+ - name: Add the first QoS Custom policy again - testing idempotency
+ cisco.aci.aci_qos_custom_policy:
+ <<: *aci_qos_custom_policy_present
+ register: nm_add_qos_custom_policy_idempotency
+
+ - name: Add a second QoS Custom policy (normal_mode)
+ cisco.aci.aci_qos_custom_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_2
+ description: QoS Custom policy 2 for ansible_tenant tenant
+ state: present
+ register: nm_add_qos_custom_policy_2
+
+ - name: Asserts for QoS Custom policy creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_qos_custom_policy is changed
+ - cm_add_qos_custom_policy.previous == []
+ - cm_add_qos_custom_policy.current == []
+ - nm_add_qos_custom_policy is changed
+ - nm_add_qos_custom_policy.current.0.qosCustomPol.attributes.name == "ansible_qos_custom_policy_1"
+ - nm_add_qos_custom_policy_idempotency is not changed
+ - nm_add_qos_custom_policy_2 is changed
+ - nm_add_qos_custom_policy_2.previous == []
+ - nm_add_qos_custom_policy_2.current.0.qosCustomPol.attributes.name == "ansible_qos_custom_policy_2"
+
+ # QUERY QOS CUSTOM POLICY
+ - name: Query all QoS Custom policies
+ cisco.aci.aci_qos_custom_policy:
+ <<: *aci_info
+ state: query
+ register: query_all_qos_custom_policy
+
+ - name: Query ansible_qos_custom_policy_1
+ cisco.aci.aci_qos_custom_policy:
+ <<: *aci_qos_custom_policy_present
+ state: query
+ register: query_ansible_qos_custom_policy_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_qos_custom_policy is not changed
+ - query_all_qos_custom_policy.current|length >= 2
+ - query_ansible_qos_custom_policy_1 is not changed
+ - query_ansible_qos_custom_policy_1.current.0.qosCustomPol.attributes.name == "ansible_qos_custom_policy_1"
+
+ # DELETE QOS CUSTOM POLICY
+ - name: Remove QoS Custom policy (check_mode)
+ cisco.aci.aci_qos_custom_policy: &qos_custom_policy_absent
+ <<: *aci_qos_custom_policy_present
+ state: absent
+ check_mode: true
+ register: cm_remove_qos_custom_policy
+
+ - name: Remove QoS Custom policy (normal_mode)
+ cisco.aci.aci_qos_custom_policy:
+ <<: *qos_custom_policy_absent
+ register: nm_remove_qos_custom_policy
+
+ - name: Remove QoS Custom policy - testing idempotency
+ cisco.aci.aci_qos_custom_policy:
+ <<: *qos_custom_policy_absent
+ register: nm_remove_qos_custom_policy_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_qos_custom_policy is changed
+ - cm_remove_qos_custom_policy.proposed == {}
+ - nm_remove_qos_custom_policy is changed
+ - nm_remove_qos_custom_policy.previous != []
+ - nm_remove_qos_custom_policy.current == []
+ - nm_remove_qos_custom_policy_idempotency is not changed
+ - nm_remove_qos_custom_policy_idempotency.previous == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/tasks/main.yml
new file mode 100644
index 000000000..efcfa993f
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dot1p_class/tasks/main.yml
@@ -0,0 +1,167 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a QoS Custom policy
+ cisco.aci.aci_qos_custom_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_1
+ description: QoS Custom policy 1 for ansible_tenant tenant
+ state: present
+
+ # CREATE QOS Dot1P Class
+ - name: Add a QoS Dot1P Class (check_mode)
+ cisco.aci.aci_qos_dot1p_class: &aci_qos_dot1p_class_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_1
+ priority: level1
+ dot1p_from: best_effort
+ dot1p_to: excellent_effort
+ dot1p_target: AF31
+ target_cos: best_effort
+ state: present
+ check_mode: true
+ register: cm_add_qos_dot1p_class
+
+ - name: Add a QoS Dot1P Class (normal_mode)
+ cisco.aci.aci_qos_dot1p_class:
+ <<: *aci_qos_dot1p_class_present
+ register: nm_add_qos_dot1p_class
+
+ - name: Add the first QoS Dot1P Class again - testing idempotency
+ cisco.aci.aci_qos_dot1p_class:
+ <<: *aci_qos_dot1p_class_present
+ register: nm_add_qos_dot1p_class_idempotency
+
+ - name: Add a second QoS Dot1P Class (normal_mode)
+ cisco.aci.aci_qos_dot1p_class:
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_1
+ dot1p_from: video
+ dot1p_to: voice
+ state: present
+ register: nm_add_qos_dot1p_class_2
+
+ - name: Asserts for QoS Dot1P Class creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_qos_dot1p_class is changed
+ - cm_add_qos_dot1p_class.previous == []
+ - cm_add_qos_dot1p_class.current == []
+ - nm_add_qos_dot1p_class is changed
+ - nm_add_qos_dot1p_class.current.0.qosDot1PClass.attributes.prio == "level1"
+ - nm_add_qos_dot1p_class.current.0.qosDot1PClass.attributes.from == "1"
+ - nm_add_qos_dot1p_class.current.0.qosDot1PClass.attributes.to == "2"
+ - nm_add_qos_dot1p_class.current.0.qosDot1PClass.attributes.target == "AF31"
+ - nm_add_qos_dot1p_class.current.0.qosDot1PClass.attributes.targetCos == "1"
+ - nm_add_qos_dot1p_class.current.0.qosDot1PClass.attributes.dn == "uni/tn-ansible_tenant/qoscustom-ansible_qos_custom_policy_1/dot1P-1-2"
+ - nm_add_qos_dot1p_class_idempotency is not changed
+ - nm_add_qos_dot1p_class_2 is changed
+ - nm_add_qos_dot1p_class_2.previous == []
+ - nm_add_qos_dot1p_class_2.current.0.qosDot1PClass.attributes.prio == "unspecified"
+ - nm_add_qos_dot1p_class_2.current.0.qosDot1PClass.attributes.from == "4"
+ - nm_add_qos_dot1p_class_2.current.0.qosDot1PClass.attributes.to == "5"
+ - nm_add_qos_dot1p_class_2.current.0.qosDot1PClass.attributes.target == "unspecified"
+ - nm_add_qos_dot1p_class_2.current.0.qosDot1PClass.attributes.targetCos == "unspecified"
+ - nm_add_qos_dot1p_class_2.current.0.qosDot1PClass.attributes.dn == "uni/tn-ansible_tenant/qoscustom-ansible_qos_custom_policy_1/dot1P-4-5"
+
+ # QUERY QOS Dot1P Class
+ - name: Query all QoS Custom policies
+ cisco.aci.aci_qos_dot1p_class:
+ <<: *aci_info
+ state: query
+ register: query_all_qos_dot1p_class
+
+ - name: Query ansible_qos_dot1p_class_1
+ cisco.aci.aci_qos_dot1p_class:
+ <<: *aci_qos_dot1p_class_present
+ state: query
+ register: query_ansible_qos_dot1p_class_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_qos_dot1p_class is not changed
+ - query_all_qos_dot1p_class.current|length >= 2
+ - query_ansible_qos_dot1p_class_1 is not changed
+ - query_ansible_qos_dot1p_class_1.current.0.qosDot1PClass.attributes.prio == "level1"
+ - query_ansible_qos_dot1p_class_1.current.0.qosDot1PClass.attributes.from == "1"
+ - query_ansible_qos_dot1p_class_1.current.0.qosDot1PClass.attributes.to == "2"
+ - query_ansible_qos_dot1p_class_1.current.0.qosDot1PClass.attributes.target == "AF31"
+ - query_ansible_qos_dot1p_class_1.current.0.qosDot1PClass.attributes.targetCos == "1"
+ - query_ansible_qos_dot1p_class_1.current.0.qosDot1PClass.attributes.dn == "uni/tn-ansible_tenant/qoscustom-ansible_qos_custom_policy_1/dot1P-1-2"
+
+ # DELETE QOS Dot1P Class
+ - name: Remove QoS Dot1P Class (check_mode)
+ cisco.aci.aci_qos_dot1p_class: &qos_dot1p_class_absent
+ <<: *aci_qos_dot1p_class_present
+ state: absent
+ check_mode: true
+ register: cm_remove_qos_dot1p_class
+
+ - name: Remove QoS Dot1P Class (normal_mode)
+ cisco.aci.aci_qos_dot1p_class:
+ <<: *qos_dot1p_class_absent
+ register: nm_remove_qos_dot1p_class
+
+ - name: Remove QoS Dot1P Class - testing idempotency
+ cisco.aci.aci_qos_dot1p_class:
+ <<: *qos_dot1p_class_absent
+ register: nm_remove_qos_dot1p_class_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_qos_dot1p_class is changed
+ - cm_remove_qos_dot1p_class.proposed == {}
+ - nm_remove_qos_dot1p_class is changed
+ - nm_remove_qos_dot1p_class.previous != []
+ - nm_remove_qos_dot1p_class.current == []
+ - nm_remove_qos_dot1p_class_idempotency is not changed
+ - nm_remove_qos_dot1p_class_idempotency.previous == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/tasks/main.yml
new file mode 100644
index 000000000..b64848d05
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_qos_dscp_class/tasks/main.yml
@@ -0,0 +1,167 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT BEFORE TESTS
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current == [] # This condition will execute only non-cloud sites
+ block: # block specifies execution of tasks within, based on conditions
+ - name: Add a new tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ description: Ansible tenant
+ state: present
+
+ - name: Add a QoS Custom policy
+ cisco.aci.aci_qos_custom_policy:
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_1
+ description: QoS Custom policy 1 for ansible_tenant tenant
+ state: present
+
+ # CREATE QOS DSCP Class
+ - name: Add a QoS DSCP Class (check_mode)
+ cisco.aci.aci_qos_dscp_class: &aci_qos_dscp_class_present
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_1
+ priority: level1
+ dscp_from: AF11
+ dscp_to: AF21
+ dscp_target: AF31
+ target_cos: best_effort
+ state: present
+ check_mode: true
+ register: cm_add_qos_dscp_class
+
+ - name: Add a QoS DSCP Class (normal_mode)
+ cisco.aci.aci_qos_dscp_class:
+ <<: *aci_qos_dscp_class_present
+ register: nm_add_qos_dscp_class
+
+ - name: Add the first QoS DSCP Class again - testing idempotency
+ cisco.aci.aci_qos_dscp_class:
+ <<: *aci_qos_dscp_class_present
+ register: nm_add_qos_dscp_class_idempotency
+
+ - name: Add a second QoS DSCP Class (normal_mode)
+ cisco.aci.aci_qos_dscp_class:
+ <<: *aci_info
+ tenant: ansible_tenant
+ qos_custom_policy: ansible_qos_custom_policy_1
+ dscp_from: AF32
+ dscp_to: AF42
+ state: present
+ register: nm_add_qos_dscp_class_2
+
+ - name: Asserts for QoS DSCP Class creation tasks
+ ansible.builtin.assert:
+ that:
+ - cm_add_qos_dscp_class is changed
+ - cm_add_qos_dscp_class.previous == []
+ - cm_add_qos_dscp_class.current == []
+ - nm_add_qos_dscp_class is changed
+ - nm_add_qos_dscp_class.current.0.qosDscpClass.attributes.prio == "level1"
+ - nm_add_qos_dscp_class.current.0.qosDscpClass.attributes.from == "AF11"
+ - nm_add_qos_dscp_class.current.0.qosDscpClass.attributes.to == "AF21"
+ - nm_add_qos_dscp_class.current.0.qosDscpClass.attributes.target == "AF31"
+ - nm_add_qos_dscp_class.current.0.qosDscpClass.attributes.targetCos == "1"
+ - nm_add_qos_dscp_class.current.0.qosDscpClass.attributes.dn == "uni/tn-ansible_tenant/qoscustom-ansible_qos_custom_policy_1/dcsp-AF11-AF21"
+ - nm_add_qos_dscp_class_idempotency is not changed
+ - nm_add_qos_dscp_class_2 is changed
+ - nm_add_qos_dscp_class_2.previous == []
+ - nm_add_qos_dscp_class_2.current.0.qosDscpClass.attributes.prio == "unspecified"
+ - nm_add_qos_dscp_class_2.current.0.qosDscpClass.attributes.from == "AF32"
+ - nm_add_qos_dscp_class_2.current.0.qosDscpClass.attributes.to == "AF42"
+ - nm_add_qos_dscp_class_2.current.0.qosDscpClass.attributes.target == "unspecified"
+ - nm_add_qos_dscp_class_2.current.0.qosDscpClass.attributes.targetCos == "unspecified"
+ - nm_add_qos_dscp_class_2.current.0.qosDscpClass.attributes.dn == "uni/tn-ansible_tenant/qoscustom-ansible_qos_custom_policy_1/dcsp-AF32-AF42"
+
+ # QUERY QOS DSCP Class
+ - name: Query all QoS Custom policies
+ cisco.aci.aci_qos_dscp_class:
+ <<: *aci_info
+ state: query
+ register: query_all_qos_dscp_class
+
+ - name: Query ansible_qos_dscp_class_1
+ cisco.aci.aci_qos_dscp_class:
+ <<: *aci_qos_dscp_class_present
+ state: query
+ register: query_ansible_qos_dscp_class_1
+
+ - name: Asserts query tasks
+ ansible.builtin.assert:
+ that:
+ - query_all_qos_dscp_class is not changed
+ - query_all_qos_dscp_class.current|length >= 2
+ - query_ansible_qos_dscp_class_1 is not changed
+ - query_ansible_qos_dscp_class_1.current.0.qosDscpClass.attributes.prio == "level1"
+ - query_ansible_qos_dscp_class_1.current.0.qosDscpClass.attributes.from == "AF11"
+ - query_ansible_qos_dscp_class_1.current.0.qosDscpClass.attributes.to == "AF21"
+ - query_ansible_qos_dscp_class_1.current.0.qosDscpClass.attributes.target == "AF31"
+ - query_ansible_qos_dscp_class_1.current.0.qosDscpClass.attributes.targetCos == "1"
+ - query_ansible_qos_dscp_class_1.current.0.qosDscpClass.attributes.dn == "uni/tn-ansible_tenant/qoscustom-ansible_qos_custom_policy_1/dcsp-AF11-AF21"
+
+ # DELETE QOS DSCP Class
+ - name: Remove QoS DSCP Class (check_mode)
+ cisco.aci.aci_qos_dscp_class: &qos_dscp_class_absent
+ <<: *aci_qos_dscp_class_present
+ state: absent
+ check_mode: true
+ register: cm_remove_qos_dscp_class
+
+ - name: Remove QoS DSCP Class (normal_mode)
+ cisco.aci.aci_qos_dscp_class:
+ <<: *qos_dscp_class_absent
+ register: nm_remove_qos_dscp_class
+
+ - name: Remove QoS DSCP Class - testing idempotency
+ cisco.aci.aci_qos_dscp_class:
+ <<: *qos_dscp_class_absent
+ register: nm_remove_qos_dscp_class_idempotency
+
+ - name: Asserts deletion tasks
+ ansible.builtin.assert:
+ that:
+ - cm_remove_qos_dscp_class is changed
+ - cm_remove_qos_dscp_class.proposed == {}
+ - nm_remove_qos_dscp_class is changed
+ - nm_remove_qos_dscp_class.previous != []
+ - nm_remove_qos_dscp_class.current == []
+ - nm_remove_qos_dscp_class_idempotency is not changed
+ - nm_remove_qos_dscp_class_idempotency.previous == []
+
+ # CLEAN ENVIRONMENT BEFORE ENDING TESTS
+ - name: Remove the ansible_tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_present
+ state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/error_handling.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/error_handling.yml
index 49c6fca53..2ea77b46f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/error_handling.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/error_handling.yml
@@ -24,7 +24,7 @@
register: error_on_name_resolution
- name: Verify error_on_name_resolution
- assert:
+ ansible.builtin.assert:
that:
- error_on_name_resolution is failed
- error_on_name_resolution.msg.startswith("Connection failed for https://foo.bar.cisco.com/api/aaaLogin.json.")
@@ -51,7 +51,7 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "missing required arguments: path"'
@@ -78,7 +78,7 @@
register: error_on_missing_attributes
- name: Verify error_on_missing_attributes
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_attributes is failed
- error_on_missing_attributes.method == 'POST'
@@ -110,11 +110,11 @@
register: error_on_input_validation
- name: Verify error_on_input_validation
- assert:
+ ansible.builtin.assert:
that:
- error_on_input_validation is failed
- error_on_input_validation.method == 'POST'
- - "error_on_input_validation.msg == 'APIC Error 801: property descr of tn-ansible_test failed validation for value \\'This is an [invalid] description\\''"
+ - "error_on_input_validation.msg is ansible.builtin.regex('APIC Error 801: property descr of.*tn-ansible_test failed validation for value \\'This is an \\[invalid\\] description\\'')"
- 'error_on_input_validation.response == "HTTP Error 400: Bad Request"'
- error_on_input_validation.status == 400
- "'current' not in error_on_input_validation"
@@ -142,7 +142,7 @@
register: error_on_invalid_attributes
- name: Verify error_on_invalid_attributes
- assert:
+ ansible.builtin.assert:
that:
- error_on_invalid_attributes is failed
- error_on_invalid_attributes.method == 'POST'
@@ -173,7 +173,7 @@
register: error_on_invalid_object
- name: Verify error_on_invalid_object
- assert:
+ ansible.builtin.assert:
that:
- error_on_invalid_object is failed
- error_on_invalid_object.method == 'POST'
@@ -314,7 +314,7 @@
register: err_fail_parse_json
- name: Assertions checks for import error handling, invalid src, invalid path extension and parse failures
- assert:
+ ansible.builtin.assert:
that:
- err_missing_lxml.msg == "The lxml python library is missing, or lacks etree support."
- err_missing_xmljson.msg == "The xmljson python library is missing, or lacks cobra support."
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_inline.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_inline.yml
index 3d5c9be48..74711ffed 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_inline.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_inline.yml
@@ -54,10 +54,11 @@
register: cm_verify_checkmode_tenant
- name: Verify checkmode POST operation
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- cm_add_tenant.proposed.fvTenant.attributes.name == "ansible_test"
+ - cm_add_tenant.proposed.fvTenant.attributes.annotation == "orchestrator:ansible"
- cm_verify_checkmode_tenant.current == []
- name: Add tenant (normal mode)
@@ -69,9 +70,10 @@
register: nm_add_tenant_again
- name: Verify add_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant is changed
+ - nm_add_tenant.imdata.0.fvTenant.attributes.annotation == "orchestrator:ansible"
- nm_add_tenant_again is not changed
# CHANGE TENANT
@@ -102,7 +104,7 @@
register: nm_add_tenant_descr_again
- name: Verify add_tenant_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_descr is changed
- nm_add_tenant_descr_again is not changed
@@ -113,7 +115,7 @@
register: nm_add_tenant_again_no_descr
- name: Verify add_tenant_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_again_no_descr is not changed
@@ -132,7 +134,7 @@
register: nm_query_all_tenants
- name: Verify query_all_tenants
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_tenants is not changed
@@ -151,7 +153,7 @@
register: nm_query_tenant
- name: Verify query_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_tenant is not changed
@@ -165,7 +167,7 @@
register: nm_remove_tenant_again
- name: Verify remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_tenant is changed
- nm_remove_tenant_again is not changed
@@ -176,6 +178,163 @@
register: nm_query_non_tenant
- name: Verify query_non_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_tenant is not changed
+
+# VERIFY ANNOTATION SUPPORT
+- name: Add tenant with annotation option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test"
+ }
+ }
+ }
+ register: nm_add_tenant_annotation_option
+
+- name: Add tenant with annotation in content
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ content:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test",
+ "annotation": "test:incontent"
+ }
+ }
+ }
+ register: nm_add_tenant_annotation_content
+
+- name: Add tenant with annotation in content and option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test",
+ "annotation": "test:optionincontent"
+ }
+ }
+ }
+ register: nm_add_tenant_annotation_option_content
+
+- name: Add tag to tenant with annotation unsupported
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni/tn-ansible_test/tagKey-foo.json
+ method: post
+ annotation: test:inoption
+ content:
+ {
+ "tagTag": {
+ "attributes": {
+ "value": "bar"
+ }
+ }
+ }
+ register: nm_add_tag_no_annotation
+
+- name: Remove tenant
+ cisco.aci.aci_rest: *tenant_absent
+
+- name: Add tenant with children objects including annotation
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content:
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test"
+ },
+ "children": [
+ {
+ "fvCtx": {
+ "attributes": {
+ "name": "VRF1"
+ }
+ }
+ },
+ {
+ "fvAp": {
+ "attributes": {
+ "name": "Application1"
+ },
+ "children": [
+ {
+ "fvAEPg": {
+ "attributes": {
+ "name": "WebTier",
+ "annotation": "test:inchild"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ register: nm_add_tenant_annotation_children
+
+- name: Verify annotation support
+ assert:
+ that:
+ - nm_add_tenant_annotation_option.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_content.imdata.0.fvTenant.attributes.annotation == "test:incontent"
+ - nm_add_tenant_annotation_option_content.imdata.0.fvTenant.attributes.annotation == "test:optionincontent"
+ - nm_add_tag_no_annotation.imdata.0.tagTag.attributes.annotation is undefined
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.children.0.fvAEPg.attributes.annotation == "test:inchild"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.2.fvCtx.attributes.annotation == "test:inoption" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_string.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_string.yml
index 7a1dfd8ce..9efa19c71 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_string.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/json_string.yml
@@ -55,10 +55,11 @@
register: cm_verify_checkmode_tenant
- name: Verify checkmode POST operation
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- cm_add_tenant.proposed.fvTenant.attributes.name == "ansible_test"
+ - cm_add_tenant.proposed.fvTenant.attributes.annotation == "orchestrator:ansible"
- cm_verify_checkmode_tenant.current == []
- name: Add tenant (normal mode)
@@ -70,9 +71,10 @@
register: nm_add_tenant_again
- name: Verify add_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant is changed
+ - nm_add_tenant.imdata.0.fvTenant.attributes.annotation == "orchestrator:ansible"
- nm_add_tenant_again is not changed
# CHANGE TENANT
@@ -103,7 +105,7 @@
register: nm_add_tenant_descr_again
- name: Verify add_tenant_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_descr is changed
- nm_add_tenant_descr_again is not changed
@@ -114,7 +116,7 @@
register: nm_add_tenant_again_no_descr
- name: Verify add_tenant_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_again_no_descr is not changed
@@ -133,7 +135,7 @@
register: nm_query_all_tenants
- name: Verify query_all_tenants
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_tenants is not changed
@@ -152,7 +154,7 @@
register: nm_query_tenant
- name: Verify query_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_tenant is not changed
@@ -166,7 +168,7 @@
register: nm_remove_tenant_again
- name: Verify remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_tenant is changed
- nm_remove_tenant_again is not changed
@@ -177,6 +179,163 @@
register: nm_query_non_tenant
- name: Verify query_non_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_tenant is not changed
+
+# VERIFY ANNOTATION SUPPORT
+- name: Add tenant with annotation option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content: |
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test"
+ }
+ }
+ }
+ register: nm_add_tenant_annotation_option
+
+- name: Add tenant with annotation in content
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ content: |
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test",
+ "annotation": "test:incontent"
+ }
+ }
+ }
+ register: nm_add_tenant_annotation_content
+
+- name: Add tenant with annotation in content and option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content: |
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test",
+ "annotation": "test:optionincontent"
+ }
+ }
+ }
+ register: nm_add_tenant_annotation_option_content
+
+- name: Add tag to tenant with annotation unsupported
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni/tn-ansible_test/tagKey-foo.json
+ method: post
+ annotation: test:inoption
+ content: |
+ {
+ "tagTag": {
+ "attributes": {
+ "value": "bar"
+ }
+ }
+ }
+ register: nm_add_tag_no_annotation
+
+- name: Remove tenant
+ cisco.aci.aci_rest: *tenant_absent
+
+- name: Add tenant with children objects including annotation
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content: |
+ {
+ "fvTenant": {
+ "attributes": {
+ "descr": "Ansible test tenant",
+ "name": "ansible_test"
+ },
+ "children": [
+ {
+ "fvCtx": {
+ "attributes": {
+ "name": "VRF1"
+ }
+ }
+ },
+ {
+ "fvAp": {
+ "attributes": {
+ "name": "Application1"
+ },
+ "children": [
+ {
+ "fvAEPg": {
+ "attributes": {
+ "name": "WebTier",
+ "annotation": "test:inchild"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ register: nm_add_tenant_annotation_children
+
+- name: Verify annotation support
+ assert:
+ that:
+ - nm_add_tenant_annotation_option.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_content.imdata.0.fvTenant.attributes.annotation == "test:incontent"
+ - nm_add_tenant_annotation_option_content.imdata.0.fvTenant.attributes.annotation == "test:optionincontent"
+ - nm_add_tag_no_annotation.imdata.0.tagTag.attributes.annotation is undefined
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.children.0.fvAEPg.attributes.annotation == "test:inchild"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.2.fvCtx.attributes.annotation == "test:inoption" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/main.yml
index c06f0cee2..c0055bbd3 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/main.yml
@@ -5,7 +5,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_file.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_file.yml
index fea63112b..6b3ffc841 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_file.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_file.yml
@@ -5,7 +5,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -17,7 +17,7 @@
output_path: "/tmp/ansible_output_file.log"
- name: Ensure tenant does not exists using ans_test_delete xml template
- cisco.aci.aci_rest:
+ cisco.aci.aci_rest: &tenant_delete
<<: *aci_info
path: /api/mo/uni.xml
src: "./targets/aci_rest/tasks/xml_files/tn-ans_test_delete.xml"
@@ -46,10 +46,11 @@
register: cm_verify_checkmode_tenant
- name: Assertions check for add tenant using ans_test_create xml template file with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- '"ans_test_create" in cm_add_tenant.proposed'
+ - '"orchestrator:ansible" in cm_add_tenant.proposed'
- cm_verify_checkmode_tenant.current == []
- name: Add tenant using ans_test_create xml template file with normal mode
@@ -61,12 +62,13 @@
register: nm_add_tenant
- name: Assertions check for add tenant using ans_test_create xml template file with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant is changed
- nm_add_tenant.imdata.0.fvTenant.attributes.name == "ans_test_create"
- nm_add_tenant.imdata.0.fvTenant.attributes.descr == "ans_test_create tenant created successfully"
- nm_add_tenant.imdata.0.fvTenant.attributes.dn == "uni/tn-ans_test_create"
+ - nm_add_tenant.imdata.0.fvTenant.attributes.annotation == "orchestrator:ansible"
- nm_add_tenant.imdata.0.fvTenant.children != []
- name: Add tenant using ans_test_create xml template file with normal mode - idempotency works
@@ -78,7 +80,7 @@
register: idempotency_nm_add_tenant
- name: Idempotency assertions check for add tenant using ans_test_create xml template file with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_add_tenant is not changed
@@ -90,7 +92,7 @@
register: query_ans_test_create
- name: Assertions check for querying ans_test_create tenant using query string after the create
- assert:
+ ansible.builtin.assert:
that:
- query_ans_test_create is not changed
- query_ans_test_create.imdata != []
@@ -108,7 +110,7 @@
register: cm_update_tenant
- name: Assertions check for update tenant description using ans_test_update xml template file with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_update_tenant is changed
@@ -121,7 +123,7 @@
register: nm_update_tenant
- name: Assertions check for update tenant description using ans_test_update xml template file with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_update_tenant is changed
- nm_update_tenant.imdata.0.fvTenant.attributes.name == "ans_test_create"
@@ -137,7 +139,7 @@
register: idempotency_nm_update_tenant
- name: Idempotency assertions check for update tenant description using ans_test_update xml template file with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_update_tenant is not changed
@@ -149,7 +151,7 @@
register: query_ans_test_update
- name: Assertions check for querying ans_test_create tenant using query string after the update
- assert:
+ ansible.builtin.assert:
that:
- query_ans_test_update is not changed
- query_ans_test_update.imdata != []
@@ -167,7 +169,7 @@
ignore_errors: true
- name: Assertions check for update tenant name using ans_test_negative_update_check xml template file with normal mode
- assert:
+ ansible.builtin.assert:
that:
- negative_update_tenant_check is failed
@@ -181,7 +183,7 @@
register: cm_delete_tenant
- name: Assertions check for delete tenant using ans_test_delete xml template file with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_tenant is changed
@@ -194,7 +196,7 @@
register: nm_delete_tenant
- name: Assertions check for delete tenant using ans_test_delete xml template file with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_delete_tenant is changed
- nm_delete_tenant.imdata.0.fvTenant.attributes.name == "ans_test_create"
@@ -210,7 +212,7 @@
register: idempotency_nm_delete_tenant
- name: Idempotency assertions check for delete tenant using ans_test_delete xml template file with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_delete_tenant is not changed
- idempotency_nm_delete_tenant.imdata == {}
@@ -223,7 +225,100 @@
register: query_ans_test_delete
- name: Assertions check for querying ans_test_create tenant using query string after the delete
- assert:
+ ansible.builtin.assert:
that:
- query_ans_test_delete is not changed
- query_ans_test_delete.imdata == []
+
+# VERIFY ANNOTATION SUPPORT
+- name: Add tenant with annotation option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ annotation: test:inoption
+ src: "./targets/aci_rest/tasks/xml_files/tn-ans_test_create.xml"
+ register: nm_add_tenant_annotation_option
+
+- name: Add tenant with annotation in content
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ src: "./targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml"
+ register: nm_add_tenant_annotation_content
+
+- name: Remove tenant
+ cisco.aci.aci_rest: *tenant_delete
+
+- name: Add tenant with annotation in content and option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ annotation: test:inoption
+ src: "./targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml"
+ register: nm_add_tenant_annotation_option_content
+
+- name: Add tag to tenant with annotation unsupported
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni/tn-ans_test_create/tagKey-foo.xml
+ method: post
+ annotation: test:inoption
+ src: "./targets/aci_rest/tasks/xml_files/tag.xml"
+ register: nm_add_tag_no_annotation
+
+- name: Remove tenant
+ cisco.aci.aci_rest: *tenant_delete
+
+- name: Add tenant with children objects including annotation
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ annotation: test:inoption
+ src: "./targets/aci_rest/tasks/xml_files/tn-ans_test_annotation_children.xml"
+ register: nm_add_tenant_annotation_children
+
+- name: Verify annotation support
+ assert:
+ that:
+ - nm_add_tenant_annotation_option.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_content.imdata.0.fvTenant.attributes.annotation == "test:optionincontent"
+ - nm_add_tenant_annotation_option_content.imdata.0.fvTenant.attributes.annotation == "test:optionincontent"
+ - nm_add_tag_no_annotation.imdata.0.tagTag.attributes.annotation is undefined
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.children.0.fvAEPg.attributes.annotation == "test:inchild"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.1.fvCtx.attributes.annotation == "test:inoption" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tag.xml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tag.xml
new file mode 100644
index 000000000..f5918f0e3
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tag.xml
@@ -0,0 +1 @@
+<tagTag value="bar"/> \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml
new file mode 100644
index 000000000..281e6e282
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation.xml
@@ -0,0 +1 @@
+<fvTenant descr="ans_test_create tenant created successfully" dn="uni/tn-ans_test_create" name="ans_test_create" status="" annotation="test:optionincontent"/> \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation_children.xml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation_children.xml
new file mode 100644
index 000000000..448998bf6
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_files/tn-ans_test_annotation_children.xml
@@ -0,0 +1,6 @@
+<fvTenant name="ans_test_create" descr="Ansible test tenant xml">
+ <fvCtx name="VRF1"/>
+ <fvAp name="Application1">
+ <fvAEPg name="WebTier" annotation="test:inchild"/>
+ </fvAp>
+</fvTenant> \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_string.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_string.yml
index d1424bafa..e3e627e3e 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_string.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/xml_string.yml
@@ -70,12 +70,14 @@
register: cm_verify_checkmode_tenant
- name: Verify checkmode POST operation
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- '"ansible_test" in cm_add_tenant.proposed'
+ - '"orchestrator:ansible" in cm_add_tenant.proposed'
- cm_add_tenant_2 is changed
- - '"ansible_test" in cm_add_tenant.proposed'
+ - '"ansible_test" in cm_add_tenant_2.proposed'
+ - '"orchestrator:ansible" in cm_add_tenant_2.proposed'
- cm_verify_checkmode_tenant.current == []
- name: Add tenant (normal mode)
@@ -108,7 +110,7 @@
register: nm_add_tenant_again
- name: Verify add_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant is changed
- nm_add_tenant_again is not changed
@@ -144,7 +146,7 @@
register: nm_add_tenant_descr_again
- name: Verify add_tenant_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_descr is changed
- nm_add_tenant_descr_again is not changed
@@ -159,7 +161,7 @@
register: nm_add_tenant_again_no_descr
- name: Verify add_tenant_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_again_no_descr is not changed
@@ -178,7 +180,7 @@
register: nm_query_all_tenants
- name: Verify query_all_tenants
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_tenants is not changed
@@ -197,7 +199,7 @@
register: nm_query_tenant
- name: Verify query_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_tenant is not changed
@@ -211,7 +213,7 @@
register: nm_remove_tenant_again
- name: Verify remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_tenant is changed
- nm_remove_tenant_again is not changed
@@ -222,6 +224,123 @@
register: nm_query_non_tenant
- name: Verify query_non_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_tenant is not changed
+
+# VERIFY ANNOTATION
+- name: Add tenant with annotation (normal mode)
+ cisco.aci.aci_rest: &tenant_annotation
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ annotation: test:label
+ content:
+ <fvTenant name="ansible_test_annotation"/>
+ register: nm_add_tenant_annotation
+
+# VERIFY ANNOTATION SUPPORT
+- name: Add tenant with annotation option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ annotation: test:inoption
+ content:
+ <fvTenant name="ansible_test" descr="Ansible test tenant"/>
+ register: nm_add_tenant_annotation_option
+
+- name: Add tenant with annotation in content
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ content:
+ <fvTenant name="ansible_test" descr="Ansible test tenant" annotation="test:incontent"/>
+ register: nm_add_tenant_annotation_content
+
+- name: Add tenant with annotation in content and option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ annotation: test:inoption
+ content:
+ <fvTenant name="ansible_test" descr="Ansible test tenant" annotation="test:optionincontent"/>
+ register: nm_add_tenant_annotation_option_content
+
+- name: Add tag to tenant with annotation unsupported
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni/tn-ansible_test/tagKey-foo.xml
+ method: post
+ annotation: test:inoption
+ content:
+ <tagTag value="bar"/>
+ register: nm_add_tag_no_annotation
+
+- name: Remove tenant
+ cisco.aci.aci_rest: *tenant_absent
+
+- name: Add tenant with children objects including annotation
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.xml
+ method: post
+ annotation: test:inoption
+ content:
+ <fvTenant name="ansible_test" descr="Ansible test tenant">
+ <fvCtx name="VRF1"/>
+ <fvAp name="Application1">
+ <fvAEPg name="WebTier" annotation="test:inchild"/>
+ </fvAp>
+ </fvTenant>
+ register: nm_add_tenant_annotation_children
+
+- name: Verify annotation support
+ assert:
+ that:
+ - nm_add_tenant_annotation_option.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_content.imdata.0.fvTenant.attributes.annotation == "test:incontent"
+ - nm_add_tenant_annotation_option_content.imdata.0.fvTenant.attributes.annotation == "test:optionincontent"
+ - nm_add_tag_no_annotation.imdata.0.tagTag.attributes.annotation is undefined
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.children.0.fvAEPg.attributes.annotation == "test:inchild"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.1.fvCtx.attributes.annotation == "test:inoption" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_inline.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_inline.yml
index 6cd06afcd..3d0ca07d8 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_inline.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_inline.yml
@@ -50,10 +50,11 @@
register: cm_verify_checkmode_tenant
- name: Verify checkmode POST operation
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- cm_add_tenant.proposed.fvTenant.attributes.name == "ansible_test"
+ - cm_add_tenant.proposed.fvTenant.attributes.annotation == "orchestrator:ansible"
- cm_verify_checkmode_tenant.current == []
- name: Add tenant (normal mode)
@@ -65,7 +66,7 @@
register: nm_add_tenant_again
- name: Verify add_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant is changed
- nm_add_tenant_again is not changed
@@ -94,9 +95,10 @@
register: nm_add_tenant_descr_again
- name: Verify add_tenant_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_descr is changed
+ - nm_add_tenant.imdata.0.fvTenant.attributes.annotation == "orchestrator:ansible"
- nm_add_tenant_descr_again is not changed
# ADD TENANT AGAIN
@@ -105,7 +107,7 @@
register: nm_add_tenant_again_no_descr
- name: Verify add_tenant_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_again_no_descr is not changed
@@ -124,7 +126,7 @@
register: nm_query_all_tenants
- name: Verify query_all_tenants
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_tenants is not changed
@@ -143,7 +145,7 @@
register: nm_query_tenant
- name: Verify query_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_tenant is not changed
@@ -157,7 +159,7 @@
register: nm_remove_tenant_again
- name: Verify remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_tenant is changed
- nm_remove_tenant_again is not changed
@@ -168,6 +170,129 @@
register: nm_query_non_tenant
- name: Verify query_non_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_tenant is not changed
+
+# VERIFY ANNOTATION SUPPORT
+- name: Add tenant with annotation option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content:
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ register: nm_add_tenant_annotation_option
+
+- name: Add tenant with annotation in content
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ content:
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ annotation: test:incontent
+ register: nm_add_tenant_annotation_content
+
+- name: Add tenant with annotation in content and option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content:
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ annotation: test:optionincontent
+ register: nm_add_tenant_annotation_option_content
+
+- name: Add tag to tenant with annotation unsupported
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni/tn-ansible_test/tagKey-foo.json
+ method: post
+ annotation: test:inoption
+ content:
+ tagTag:
+ attributes:
+ value: bar
+ register: nm_add_tag_no_annotation
+
+- name: Remove tenant
+ cisco.aci.aci_rest: *tenant_absent
+
+- name: Add tenant with children objects including annotation
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content:
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ children:
+ - fvCtx:
+ attributes:
+ name: VRF1
+ - fvAp:
+ attributes:
+ name: Application1
+ children:
+ - fvAEPg:
+ attributes:
+ name: WebTier
+ annotation: test:inchild
+ register: nm_add_tenant_annotation_children
+
+- name: Verify annotation support
+ assert:
+ that:
+ - nm_add_tenant_annotation_option.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_content.imdata.0.fvTenant.attributes.annotation == "test:incontent"
+ - nm_add_tenant_annotation_option_content.imdata.0.fvTenant.attributes.annotation == "test:optionincontent"
+ - nm_add_tag_no_annotation.imdata.0.tagTag.attributes.annotation is undefined
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.children.0.fvAEPg.attributes.annotation == "test:inchild"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.2.fvCtx.attributes.annotation == "test:inoption"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_string.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_string.yml
index 895045474..982235c9a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_string.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_rest/tasks/yaml_string.yml
@@ -50,10 +50,11 @@
register: cm_verify_checkmode_tenant
- name: Verify checkmode POST operation
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- cm_add_tenant.proposed.fvTenant.attributes.name == "ansible_test"
+ - cm_add_tenant.proposed.fvTenant.attributes.annotation == "orchestrator:ansible"
- cm_verify_checkmode_tenant.current == []
- name: Add tenant (normal mode)
@@ -65,9 +66,10 @@
register: nm_add_tenant_again
- name: Verify add_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant is changed
+ - nm_add_tenant.imdata.0.fvTenant.attributes.annotation == "orchestrator:ansible"
- nm_add_tenant_again is not changed
# CHANGE TENANT
@@ -94,7 +96,7 @@
register: nm_add_tenant_descr_again
- name: Verify add_tenant_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_descr is changed
- nm_add_tenant_descr_again is not changed
@@ -105,7 +107,7 @@
register: nm_add_tenant_again_no_descr
- name: Verify add_tenant_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_again_no_descr is not changed
@@ -124,7 +126,7 @@
register: nm_query_all_tenants
- name: Verify query_all_tenants
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_tenants is not changed
@@ -143,7 +145,7 @@
register: nm_query_tenant
- name: Verify query_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_tenant is not changed
@@ -157,7 +159,7 @@
register: nm_remove_tenant_again
- name: Verify remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_tenant is changed
- nm_remove_tenant_again is not changed
@@ -168,6 +170,129 @@
register: nm_query_non_tenant
- name: Verify query_non_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_tenant is not changed
+
+# VERIFY ANNOTATION SUPPORT
+- name: Add tenant with annotation option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content: |
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ register: nm_add_tenant_annotation_option
+
+- name: Add tenant with annotation in content
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ content: |
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ annotation: test:incontent
+ register: nm_add_tenant_annotation_content
+
+- name: Add tenant with annotation in content and option
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content: |
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ annotation: test:optionincontent
+ register: nm_add_tenant_annotation_option_content
+
+- name: Add tag to tenant with annotation unsupported
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni/tn-ansible_test/tagKey-foo.json
+ method: post
+ annotation: test:inoption
+ content: |
+ tagTag:
+ attributes:
+ value: bar
+ register: nm_add_tag_no_annotation
+
+- name: Remove tenant
+ cisco.aci.aci_rest: *tenant_absent
+
+- name: Add tenant with children objects including annotation
+ cisco.aci.aci_rest:
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+ path: /api/mo/uni.json
+ method: post
+ annotation: test:inoption
+ content: |
+ fvTenant:
+ attributes:
+ descr: Ansible test tenant
+ name: ansible_test
+ children:
+ - fvCtx:
+ attributes:
+ name: VRF1
+ - fvAp:
+ attributes:
+ name: Application1
+ children:
+ - fvAEPg:
+ attributes:
+ name: WebTier
+ annotation: test:inchild
+ register: nm_add_tenant_annotation_children
+
+- name: Verify annotation support
+ assert:
+ that:
+ - nm_add_tenant_annotation_option.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_content.imdata.0.fvTenant.attributes.annotation == "test:incontent"
+ - nm_add_tenant_annotation_option_content.imdata.0.fvTenant.attributes.annotation == "test:optionincontent"
+ - nm_add_tag_no_annotation.imdata.0.tagTag.attributes.annotation is undefined
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.attributes.annotation == "test:inoption"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.0.fvAp.children.0.fvAEPg.attributes.annotation == "test:inchild"
+ - nm_add_tenant_annotation_children.imdata.0.fvTenant.children.2.fvCtx.attributes.annotation == "test:inoption" \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_context/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_context/tasks/main.yml
index 83f46e4b8..31eef79a6 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_context/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_context/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,26 +22,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a new action rule profile
- aci_tenant_action_rule_profile: &aci_action_rule_present
+ cisco.aci.aci_tenant_action_rule_profile: &aci_action_rule_present
<<: *aci_info
tenant: ansible_tenant
action_rule: ansible_action_rule
@@ -49,7 +49,7 @@
state: present
- name: Add a new L3Out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -59,7 +59,7 @@
state: present
- name: Add a route control profile for l3out
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -68,7 +68,7 @@
state: present
- name: Add a subject profile
- aci_match_rule: &aci_match_rule_present
+ cisco.aci.aci_match_rule: &aci_match_rule_present
<<: *aci_info
tenant: ansible_tenant
match_rule: ansible_match_rule
@@ -76,7 +76,7 @@
state: present
- name: Add a route control context policy for l3out (check_mode)
- aci_route_control_context: &aci_route_control_context_present
+ cisco.aci.aci_route_control_context: &aci_route_control_context_present
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -92,17 +92,17 @@
register: cm_add_route_control_context_l3out
- name: Add a route control context policy again (normal_mode)
- aci_route_control_context:
+ cisco.aci.aci_route_control_context:
<<: *aci_route_control_context_present
register: nm_add_route_control_context_l3out
- name: Add a route control context policy again - testing idempotency
- aci_route_control_context:
+ cisco.aci.aci_route_control_context:
<<: *aci_route_control_context_present
register: nm_add_route_control_context_l3out_idempotency
- name: Add a route control profile for tenant
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *aci_info
tenant: ansible_tenant
route_control_profile: ansible_rtctrl_profile_tenant
@@ -110,7 +110,7 @@
state: present
- name: Add a route control context policy for tenant
- aci_route_control_context:
+ cisco.aci.aci_route_control_context:
<<: *aci_info
tenant: ansible_tenant
route_control_profile: ansible_rtctrl_profile_tenant
@@ -120,7 +120,7 @@
register: nm_add_route_control_context_tenant
- name: Asserts for route control profiles creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_route_control_context_l3out is changed
- cm_add_route_control_context_l3out.previous == []
@@ -139,20 +139,20 @@
- nm_add_route_control_context_tenant.current.0.rtctrlCtxP.attributes.order == "0"
- name: Query all route control context policies
- aci_route_control_context:
+ cisco.aci.aci_route_control_context:
<<: *aci_info
state: query
register: query_all_route_control_context
- name: Query ansible_route_control_context_l3out route control context policy
- aci_route_control_context:
+ cisco.aci.aci_route_control_context:
<<: *aci_info
route_control_context: ansible_route_control_context_l3out
state: query
register: query_route_control_context_l3out
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_route_control_context is not changed
- query_all_route_control_context.current|length >= 2
@@ -164,24 +164,24 @@
- query_route_control_context_l3out.current.0.rtctrlCtxP.children.1.rtctrlRsCtxPToSubjP.attributes.tDn == "uni/tn-ansible_tenant/subj-ansible_match_rule"
- name: Remove route control context policy for l3out (check_mode)
- aci_route_control_context: &aci_route_control_context_absent
+ cisco.aci.aci_route_control_context: &aci_route_control_context_absent
<<: *aci_route_control_context_present
state: absent
check_mode: true
register: cm_remove_route_control_context
- name: Remove route control context policy for l3out (normal_mode)
- aci_route_control_context:
+ cisco.aci.aci_route_control_context:
<<: *aci_route_control_context_absent
register: nm_remove_remove_route_control_context
- name: Remove route control profile for l3out again - testing previous Removal
- aci_route_control_context:
+ cisco.aci.aci_route_control_context:
<<: *aci_route_control_context_absent
register: nm_remove_route_control_context_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_route_control_context is changed
- cm_remove_route_control_context.proposed == {}
@@ -192,6 +192,6 @@
- nm_remove_route_control_context_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_profile/tasks/main.yml
index db0022100..d0c044472 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_route_control_profile/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,26 +22,26 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant: &aci_tenant_absent
+ cisco.aci.aci_tenant: &aci_tenant_absent
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add a new L3Out
- aci_l3out:
+ cisco.aci.aci_l3out:
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -51,7 +51,7 @@
state: present
- name: Add route control profile for l3out (check_mode)
- aci_route_control_profile: &aci_route_control_profile_present
+ cisco.aci.aci_route_control_profile: &aci_route_control_profile_present
<<: *aci_info
tenant: ansible_tenant
l3out: ansible_l3out
@@ -64,17 +64,17 @@
register: cm_add_route_control_profile
- name: Add route control profile for l3out (normal_mode)
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *aci_route_control_profile_present
register: nm_add_route_control_profile
- name: Add route control profile for l3out again - testing idempotency
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *aci_route_control_profile_present
register: nm_add_route_control_profile_idempotency
- name: Add route control profile for tenant (normal_mode)
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *aci_info
tenant: ansible_tenant
route_control_profile: ansible_rtctrl_profile_tenant
@@ -83,7 +83,7 @@
register: nm_add_route_control_profile_2
- name: Asserts for route control profiles creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_route_control_profile is changed
- cm_add_route_control_profile.previous == []
@@ -94,42 +94,42 @@
- nm_add_route_control_profile_2.previous == []
- name: Query all route control profiles
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *aci_info
state: query
register: query_all_route_control_profile
- name: Query ansible_rtctrl_profile_l3out
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *aci_route_control_profile_present
state: query
register: query_ansible_rtctrl_profile_l3out
- name: Asserts query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_route_control_profile is not changed
- query_all_route_control_profile.current|length >= 2
- name: Remove route control profile for l3out (check_mode)
- aci_route_control_profile: &route_control_profile_absent
+ cisco.aci.aci_route_control_profile: &route_control_profile_absent
<<: *aci_route_control_profile_present
state: absent
check_mode: true
register: cm_remove_route_control_profile
- name: Remove route control profile for l3out (normal_mode)
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *route_control_profile_absent
register: nm_remove_route_control_profile
- name: Remove route control profile for l3out again - testing previous Removal
- aci_route_control_profile:
+ cisco.aci.aci_route_control_profile:
<<: *route_control_profile_absent
register: nm_remove_route_control_profile_idempotency
- name: Asserts deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_route_control_profile is changed
- cm_remove_route_control_profile.proposed == {}
@@ -140,6 +140,6 @@
- nm_remove_route_control_profile_idempotency.previous == []
- name: Remove the ansible_tenant - cleanup before ending tests
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client/tasks/main.yml
index e5c0ce185..5e6f44ceb 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,14 +22,14 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_snmp_client_group if it already exists
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
# ADD snmp policy
- name: Add snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
admin_state: enabled
@@ -37,7 +37,7 @@
# ADD snmp client group
- name: Add snmp client group
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -46,7 +46,7 @@
# ADD snmp client
- name: Add snmp client
- aci_snmp_client:
+ cisco.aci.aci_snmp_client:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -56,7 +56,7 @@
register: add_snmp_client
- name: Verify that ansible_snmp_client has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_client.current.0.snmpClientP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group/client-[10.20.30.0/24]"
- add_snmp_client.current.0.snmpClientP.attributes.addr == "10.20.30.0/24"
@@ -65,7 +65,7 @@
# ADD snmp client again to check idempotency
- name: Add snmp client again
- aci_snmp_client:
+ cisco.aci.aci_snmp_client:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -75,13 +75,13 @@
register: add_snmp_client_again
- name: Verify that add_snmp_client_group_again stays the same
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_client_again is not changed
# MODIFY snmp client
- name: Update snmp client
- aci_snmp_client:
+ cisco.aci.aci_snmp_client:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -91,7 +91,7 @@
register: update_snmp_client
- name: Verify that ansible_snmp_client_group has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_snmp_client is changed
- update_snmp_client.current.0.snmpClientP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group/client-[10.20.30.0/24]"
@@ -100,7 +100,7 @@
# QUERY snmp client
- name: Query snmp client
- aci_snmp_client:
+ cisco.aci.aci_snmp_client:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -109,7 +109,7 @@
register: query_snmp_client
- name: Verify the attributes under query_snmp_client
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_client is not changed
- query_snmp_client.current.0.snmpClientP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group/client-[10.20.30.0/24]"
@@ -117,19 +117,19 @@
- query_snmp_client.current.0.snmpClientP.attributes.name == "new_snmp_client_name"
- name: Query all snmp client
- aci_snmp_client:
+ cisco.aci.aci_snmp_client:
<<: *aci_info
state: query
register: query_snmp_client_all
- name: Verify query_snmp_client_all
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_client_all is not changed
# DELETE snmp client group
- name: Remove the snmp client
- aci_snmp_client:
+ cisco.aci.aci_snmp_client:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -138,7 +138,7 @@
register: remove_snmp_client
- name: Verify remove_snmp_client
- assert:
+ ansible.builtin.assert:
that:
- remove_snmp_client is changed
- remove_snmp_client.previous.0.snmpClientP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group/client-[10.20.30.0/24]"
@@ -146,14 +146,14 @@
# DELETE snmp policy
- name: Remove the snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
# DELETE snmp client group
- name: Remove the snmp client group
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client_group/tasks/main.yml
index f54a7841a..b93d3f2fb 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_client_group/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,14 +22,14 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_snmp_client_group if it already exists
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
# ADD snmp policy
- name: Add snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
admin_state: enabled
@@ -37,7 +37,7 @@
# ADD snmp client group
- name: Add snmp client group
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -47,7 +47,7 @@
register: add_snmp_client_group
- name: Add snmp client group on default mgmt_epg
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group_no_epg
@@ -56,7 +56,7 @@
register: add_snmp_client_group_no_epg
- name: Verify that ansible_snmp_client_group has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_client_group.current.0.snmpClientGrpP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group"
- add_snmp_client_group.current.0.snmpClientGrpP.attributes.name == "ansible_snmp_client_group"
@@ -64,20 +64,20 @@
- add_snmp_client_group.current.0.snmpClientGrpP.attributes.annotation == 'orchestrator:ansible'
- name: Verify that ansible_snmp_client_group_no_epg has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_client_group_no_epg.current.0.snmpClientGrpP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group_no_epg"
- add_snmp_client_group_no_epg.current.0.snmpClientGrpP.attributes.name == "ansible_snmp_client_group_no_epg"
- add_snmp_client_group_no_epg.current.0.snmpClientGrpP.attributes.descr == "client group descr"
- name: Verify that children of ansible_snmp_client_group have been created with correct values
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_client_group.current.0.snmpClientGrpP.children.0.snmpRsEpg.attributes.tDn == "uni/tn-mgmt/mgmtp-default/oob-default"
# ADD snmp client group again to check idempotency
- name: Add snmp client group again
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -87,13 +87,13 @@
register: add_snmp_client_group_again
- name: Verify that add_snmp_client_group_again stays the same
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_client_group_again is not changed
# MODIFY snmp client group
- name: Update snmp client group
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -103,7 +103,7 @@
register: update_snmp_client_group
- name: Verify that ansible_snmp_client_group has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_snmp_client_group is changed
- update_snmp_client_group.current.0.snmpClientGrpP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group"
@@ -112,7 +112,7 @@
# QUERY snmp client group
- name: Query snmp client group
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -120,7 +120,7 @@
register: query_snmp_client_group
- name: Verify the attributes under query_snmp_client_group
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_client_group is not changed
- query_snmp_client_group.current.0.snmpClientGrpP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group"
@@ -128,19 +128,19 @@
- query_snmp_client_group.current.0.snmpClientGrpP.attributes.descr == "new client group descr"
- name: Query all snmp client groups
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
state: query
register: query_snmp_client_group_all
- name: Verify query_snmp_client_group_all
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_client_group_all is not changed
# DELETE snmp client group
- name: Remove the snmp client group
- aci_snmp_client_group:
+ cisco.aci.aci_snmp_client_group:
<<: *aci_info
policy: ansible_snmp_policy
client_group: ansible_snmp_client_group
@@ -148,7 +148,7 @@
register: remove_snmp_client_group
- name: Verify remove_snmp_client_group
- assert:
+ ansible.builtin.assert:
that:
- remove_snmp_client_group is changed
- remove_snmp_client_group.previous.0.snmpClientGrpP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/clgrp-ansible_snmp_client_group"
@@ -156,7 +156,7 @@
# DELETE snmp policy
- name: Remove the snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_community_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_community_policy/tasks/main.yml
index 570476d37..53538a09f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_community_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_community_policy/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,14 +22,14 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_snmp_policy if it already exists
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
# ADD snmp policy
- name: Add snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
admin_state: enabled
@@ -37,7 +37,7 @@
# ADD snmp community
- name: Add snmp community
- aci_snmp_community_policy:
+ cisco.aci.aci_snmp_community_policy:
<<: *aci_info
policy: ansible_snmp_policy
community: ansible_snmp_community
@@ -45,7 +45,7 @@
register: add_snmp_community
- name: Verify that ansible_snmp_community has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_community.current.0.snmpCommunityP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/community-ansible_snmp_community"
- add_snmp_community.current.0.snmpCommunityP.attributes.name == "ansible_snmp_community"
@@ -54,7 +54,7 @@
# ADD snmp community again to check idempotency
- name: Add snmp client group again
- aci_snmp_community_policy:
+ cisco.aci.aci_snmp_community_policy:
<<: *aci_info
policy: ansible_snmp_policy
community: ansible_snmp_community
@@ -62,13 +62,13 @@
register: add_snmp_community_again
- name: Verify that add_snmp_community_again stays the same
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_community_again is not changed
# MODIFY snmp client community
- name: Update snmp community
- aci_snmp_community_policy:
+ cisco.aci.aci_snmp_community_policy:
<<: *aci_info
policy: ansible_snmp_policy
community: ansible_snmp_community
@@ -76,7 +76,7 @@
register: update_snmp_community
- name: Verify that ansible_snmp_community has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_snmp_community is changed
- update_snmp_community.current.0.snmpCommunityP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/community-ansible_snmp_community"
@@ -85,7 +85,7 @@
# QUERY snmp community
- name: Query snmp community
- aci_snmp_community_policy:
+ cisco.aci.aci_snmp_community_policy:
<<: *aci_info
policy: ansible_snmp_policy
community: ansible_snmp_community
@@ -93,7 +93,7 @@
register: query_snmp_community
- name: Verify the attributes under query_snmp_client_group
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_community is not changed
- query_snmp_community.current.0.snmpCommunityP.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy/community-ansible_snmp_community"
@@ -101,19 +101,19 @@
- query_snmp_community.current.0.snmpCommunityP.attributes.descr == "new community description"
- name: Query all snmp communities
- aci_snmp_community_policy:
+ cisco.aci.aci_snmp_community_policy:
<<: *aci_info
state: query
register: query_snmp_community_all
- name: Verify query_snmp_community_all
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_community_all is not changed
# DELETE snmp community
- name: Remove the snmp community
- aci_snmp_community_policy:
+ cisco.aci.aci_snmp_community_policy:
<<: *aci_info
policy: ansible_snmp_policy
community: ansible_snmp_community
@@ -121,7 +121,7 @@
register: remove_snmp_community
- name: Verify remove_snmp_community
- assert:
+ ansible.builtin.assert:
that:
- remove_snmp_community is changed
- remove_snmp_community.current == []
@@ -130,7 +130,7 @@
# DELETE snmp policy
- name: Remove the snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_policy/tasks/main.yml
index 823ea8f30..70f60f5be 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_snmp_policy/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,14 +22,14 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_snmp_policy if it already exists
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
# ADD snmp policy
- name: Add snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
admin_state: enabled
@@ -40,7 +40,7 @@
register: add_snmp_policy
- name: Verify that ansible_snmp_policy has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_policy.current.0.snmpPol.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy"
- add_snmp_policy.current.0.snmpPol.attributes.name == "ansible_snmp_policy"
@@ -52,7 +52,7 @@
# ADD snmp policy again to check idempotency
- name: Add snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
admin_state: enabled
@@ -63,13 +63,13 @@
register: add_snmp_policy_again
- name: Verify that ansible_snmp_policy stays the same
- assert:
+ ansible.builtin.assert:
that:
- add_snmp_policy_again is not changed
# MODIFY snmp policy
- name: Update snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
admin_state: disabled
@@ -80,7 +80,7 @@
register: update_snmp_policy
- name: Verify that ansible_snmp_policy has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_snmp_policy.current.0.snmpPol.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy"
- update_snmp_policy.current.0.snmpPol.attributes.name == "ansible_snmp_policy"
@@ -91,14 +91,14 @@
# QUERY snmp policy
- name: Query snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: query
register: query_snmp_policy
- name: Verify the attributes under query_snmp_policy
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_policy is not changed
- query_snmp_policy.current.0.snmpPol.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy"
@@ -109,26 +109,26 @@
- query_snmp_policy.current.0.snmpPol.attributes.descr == "new policy description"
- name: Query all snmp policies
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
state: query
register: query_snmp_policy_all
- name: Verify query_snmp_policy_all
- assert:
+ ansible.builtin.assert:
that:
- query_snmp_policy_all is not changed
# DELETE snmp policy
- name: Remove the snmp policy
- aci_snmp_policy:
+ cisco.aci.aci_snmp_policy:
<<: *aci_info
name: ansible_snmp_policy
state: absent
register: remove_snmp_policy
- name: Verify remove_snmp_policy
- assert:
+ ansible.builtin.assert:
that:
- remove_snmp_policy is changed
- remove_snmp_policy.previous.0.snmpPol.attributes.dn == "uni/fabric/snmppol-ansible_snmp_policy"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_static_binding_to_epg/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_static_binding_to_epg/tasks/main.yml
index 0e9096b85..7917551ad 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_static_binding_to_epg/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_static_binding_to_epg/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,7 +21,7 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -163,7 +163,7 @@
register: missing_required_present
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- provide_present_check_mode is changed
- provide_present_check_mode.sent.fvRsPathAtt.attributes.encap == 'vlan-222'
@@ -198,7 +198,7 @@
register: query_all
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- query_static_binding is not changed
- query_static_binding.current != []
@@ -234,7 +234,7 @@
register: encap_id_range
- name: primary_ecap_id assertions
- assert:
+ ansible.builtin.assert:
that:
- primary_ecap_id_unknown is changed
- primary_ecap_id_unknown.sent.fvRsPathAtt.attributes.primaryEncap == 'unknown'
@@ -330,7 +330,7 @@
register: nm_multiple_extpaths
- name: Verify interface type and extpaths
- assert:
+ ansible.builtin.assert:
that:
- cm_fex_port_channel is changed
- nm_fex_port_channel is changed
@@ -361,7 +361,7 @@
register: missing_param_absent
- name: Absent assertions
- assert:
+ ansible.builtin.assert:
that:
- provide_absent is changed
- provide_absent.previous.0.fvRsPathAtt is defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_static_node_mgmt_address/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_static_node_mgmt_address/tasks/main.yml
index ce1553a45..ed86fd5fe 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_static_node_mgmt_address/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_static_node_mgmt_address/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,14 +20,14 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: Remove node mgmt in_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband
@@ -36,7 +36,7 @@
state: absent
- name: Remove node mgmt out_of_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband
@@ -44,7 +44,7 @@
# Add operations
- name: Add node mgmt in_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband
@@ -53,14 +53,14 @@
state: present
- name: Add node mgmt out_of_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband
state: present
- name: Add ipv4 address to mgmt interface in band in check mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
pod_id: 1
@@ -73,7 +73,7 @@
register: cm_add_inb
- name: Add ipv4 address to mgmt interface out of band in check mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
pod_id: 1
@@ -86,7 +86,7 @@
register: cm_add_oob
- name: Add ipv4 address to mgmt interface in band in normal mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
pod_id: 1
@@ -98,7 +98,7 @@
register: nm_add_inb
- name: Add ipv4 address to mgmt interface out of band in normal mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
pod_id: 1
@@ -110,7 +110,7 @@
register: nm_add_oob
- name: Add ipv4 address to mgmt interface in band in normal mode again
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
pod_id: 1
@@ -122,7 +122,7 @@
register: nm_add_inb_again
- name: Add ipv4 address to mgmt interface out of band in normal mode again
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
pod_id: 1
@@ -134,7 +134,7 @@
register: nm_add_oob_again
- name: Add another ipv4 address to mgmt interface in band in normal mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
pod_id: 1
@@ -146,7 +146,7 @@
register: nm_add_inb_2
- name: Add another ipv4 address to mgmt interface out of band in normal mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
pod_id: 1
@@ -158,7 +158,7 @@
register: nm_add_oob_2
- name: Verify add operations
- assert:
+ ansible.builtin.assert:
that:
- cm_add_inb is changed
- cm_add_inb.sent.mgmtRsInBStNode.attributes.addr == '3.1.1.2/24'
@@ -177,7 +177,7 @@
- nm_add_oob_again is not changed
- name: Query ipv4 address to mgmt interface in band in normal mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
pod_id: 1
@@ -189,7 +189,7 @@
register: nm_query_inb
- name: Query ipv4 address to mgmt interface out_of_band in normal mode
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
pod_id: 1
@@ -201,7 +201,7 @@
register: nm_query_oob
- name: Query all addresses in epg in band
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
type: in_band
@@ -209,7 +209,7 @@
register: query_all_epg_inb
- name: Query all addresses in epg out of band
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
type: out_of_band
@@ -217,21 +217,21 @@
register: query_all_epg_oob
- name: Query all in band addresses
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
type: in_band
state: query
register: query_all_inb
- name: Query all out_of_band addresses
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
type: out_of_band
state: query
register: query_all_oob
- name: Verify query operations
- assert:
+ ansible.builtin.assert:
that:
- nm_query_inb is not changed
- nm_query_oob is not changed
@@ -245,7 +245,7 @@
- query_all_oob.current.0.mgmtMgmtP.children.0.mgmtOoB.children | length == 2
- name: Remove ipv4 address to mgmt interface in-band
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
pod_id: 1
@@ -257,7 +257,7 @@
register: remove_in_band
- name: Remove ipv4 address to mgmt interface out of band
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
pod_id: 1
@@ -269,7 +269,7 @@
register: remove_out_of_band
- name: Remove ipv4 address to mgmt interface in-band again
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-inband
pod_id: 1
@@ -281,7 +281,7 @@
register: remove_in_band_again
- name: Remove ipv4 address to mgmt interface out of band again
- aci_static_node_mgmt_address:
+ cisco.aci.aci_static_node_mgmt_address:
<<: *aci_info
epg: ansible-outofband
pod_id: 1
@@ -293,7 +293,7 @@
register: remove_out_of_band_again
- name: Verify remove operations
- assert:
+ ansible.builtin.assert:
that:
- remove_in_band is changed
- remove_in_band.previous.0.mgmtRsInBStNode.attributes.addr == '2.1.1.4/24'
@@ -306,7 +306,7 @@
# Clean environment for other ci test cases
- name: Remove node mgmt in_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: in_band
epg: ansible-inband
@@ -315,7 +315,7 @@
state: absent
- name: Remove node mgmt out_of_band epg
- aci_node_mgmt_epg:
+ cisco.aci.aci_node_mgmt_epg:
<<: *aci_info
type: out_of_band
epg: ansible-outofband
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/main.yml
new file mode 100644
index 000000000..eb39aabf5
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/main.yml
@@ -0,0 +1,253 @@
+# Test code for the ACI modules
+
+# Copyright: (c) 2022, Mark Ciecior (@markciecior)
+# Copyright: (c) 2024, Akini Ross (akinross@cisco.com)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: version
+
+- name: Verify Cloud and Non-Cloud Sites in use.
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+
+- name: Execute tasks only for non-cloud sites
+ when:
+ - query_cloud.current == []
+ block:
+
+ # CLEAN TEST ENVIRONMENT
+ - name: Ensure tenant removed
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ state: absent
+ tenant: ansible_test
+
+ # SETUP TEST ENVIRONMENT
+ - name: Create tenant
+ cisco.aci.aci_tenant: &aci_tenant_present
+ <<: *aci_tenant_absent
+ state: present
+
+ - name: Create BD
+ cisco.aci.aci_bd:
+ <<: *aci_tenant_present
+ bd: ansible_test_bd
+
+ - name: Create VRF
+ cisco.aci.aci_vrf:
+ <<: *aci_tenant_present
+ vrf: ansible_test_vrf
+
+ - name: Create AP
+ cisco.aci.aci_ap: &aci_ap
+ <<: *aci_tenant_present
+ ap: ansible_test_ap
+
+ - name: Create EPG
+ cisco.aci.aci_epg:
+ <<: *aci_ap
+ epg: ansible_test_epg
+ bd: ansible_test_bd
+
+ - name: Bind End Point Group to Provider Contract
+ cisco.aci.aci_epg_to_contract:
+ <<: *aci_tenant_present
+ ap: ansible_test_ap
+ epg: ansible_test_epg
+ contract_type: provider
+ contract: ansible_test_contract
+
+ - name: Bind End Point Group to Consumer Contract
+ cisco.aci.aci_epg_to_contract:
+ <<: *aci_tenant_present
+ ap: ansible_test_ap
+ epg: ansible_test_epg
+ contract_type: consumer
+ contract: ansible_test_contract
+
+ - name: Create ESG
+ cisco.aci.aci_esg:
+ <<: *aci_ap
+ esg: ansible_test_esg
+ vrf: ansible_test_vrf
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ - name: Create L2Out
+ cisco.aci.aci_l2out:
+ <<: *aci_tenant_present
+ l2out: ansible_test_l2out
+ bd: ansible_test_bd
+ domain: l2Dom
+ vlan: 3200
+
+ - name: Create L2Out External End Point Group
+ cisco.aci.aci_l2out_extepg:
+ <<: *aci_tenant_present
+ l2out: ansible_test_l2out
+ extepg: ansible_test_external_epg
+
+ - name: Create L2Out
+ cisco.aci.aci_l3out:
+ <<: *aci_tenant_present
+ l3out: ansible_test_l3out
+ vrf: ansible_test_vrf
+ domain: l3dom
+
+ - name: Create L3Out External End Point Group
+ cisco.aci.aci_l3out_extepg:
+ <<: *aci_tenant_present
+ l3out: ansible_test_l3out
+ extepg: ansible_test_external_epg
+
+ - name: Bind L3out External End Point Group to Provider Contract
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_tenant_present
+ tenant: ansible_test
+ l3out: ansible_test_l3out
+ extepg: ansible_test_external_epg
+ contract: ansible_test_contract
+ contract_type: provider
+
+ - name: Bind L3out External End Point Group to Consumer Contract
+ cisco.aci.aci_l3out_extepg_to_contract:
+ <<: *aci_tenant_present
+ tenant: ansible_test
+ l3out: ansible_test_l3out
+ extepg: ansible_test_external_epg
+ contract: ansible_test_contract
+ contract_type: consumer
+
+ - name: Create Contract
+ cisco.aci.aci_contract: &aci_contract_present
+ <<: *aci_tenant_present
+ contract: ansible_test_contract
+
+ - name: Create Subject
+ cisco.aci.aci_contract_subject:
+ <<: *aci_contract_present
+ subject: ansible_test_subject
+
+ # TESTS THAT ALL PARENT CLASS COMBINATIONS ARE CONFIGURABLE
+ - name: Execute tests for each parent class
+ ansible.builtin.include_tasks: subject_label.yml
+ loop:
+ - { l2out: "{{ fake_var | default(omit) }}", l3out: "{{ fake_var | default(omit) }}", external_epg: "{{ fake_var | default(omit) }}", contract: "ansible_test_contract", subject: "ansible_test_subject", ap: "{{ fake_var | default(omit) }}", epg: "{{ fake_var | default(omit) }}", esg: "{{ fake_var | default(omit) }}"}
+ - { l2out: "ansible_test_l2out", l3out: "{{ fake_var | default(omit) }}", external_epg: "ansible_test_external_epg", contract: "{{ fake_var | default(omit) }}", subject: "{{ fake_var | default(omit) }}", ap: "{{ fake_var | default(omit) }}", epg: "{{ fake_var | default(omit) }}", esg: "{{ fake_var | default(omit) }}"}
+ - { l2out: "{{ fake_var | default(omit) }}", l3out: "ansible_test_l3out", external_epg: "ansible_test_external_epg", contract: "{{ fake_var | default(omit) }}", subject: "{{ fake_var | default(omit) }}", ap: "{{ fake_var | default(omit) }}", epg: "{{ fake_var | default(omit) }}", esg: "{{ fake_var | default(omit) }}"}
+ - { l2out: "{{ fake_var | default(omit) }}", l3out: "ansible_test_l3out", external_epg: "ansible_test_external_epg", contract: "ansible_test_contract", subject: "{{ fake_var | default(omit) }}", ap: "{{ fake_var | default(omit) }}", epg: "{{ fake_var | default(omit) }}", esg: "{{ fake_var | default(omit) }}"}
+ - { l2out: "{{ fake_var | default(omit) }}", l3out: "{{ fake_var | default(omit) }}", external_epg: "{{ fake_var | default(omit) }}", contract: "{{ fake_var | default(omit) }}", subject: "{{ fake_var | default(omit) }}", ap: "ansible_test_ap", epg: "ansible_test_epg", esg: "{{ fake_var | default(omit) }}"}
+ - { l2out: "{{ fake_var | default(omit) }}", l3out: "{{ fake_var | default(omit) }}", external_epg: "{{ fake_var | default(omit) }}", contract: "ansible_test_contract", subject: "{{ fake_var | default(omit) }}", ap: "ansible_test_ap", epg: "ansible_test_epg", esg: "{{ fake_var | default(omit) }}"}
+ loop_control:
+ loop_var: parent_class
+
+ - name: Execute tests for esg class which is only supported in 5+
+ ansible.builtin.include_tasks: subject_label.yml
+ loop:
+ - { l2out: "{{ fake_var | default(omit) }}", l3out: "{{ fake_var | default(omit) }}", external_epg: "{{ fake_var | default(omit) }}", contract: "{{ fake_var | default(omit) }}", subject: "{{ fake_var | default(omit) }}", ap: "ansible_test_ap", epg: "{{ fake_var | default(omit) }}", esg: "ansible_test_esg"}
+ loop_control:
+ loop_var: parent_class
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+
+ # ERROR TESTS
+ - name: Mutually exclusive all provided (error)
+ cisco.aci.aci_subject_label:
+ <<: *aci_tenant_present
+ l2out: ansible_test_l2out
+ l3out: ansible_test_l3out
+ subject: ansible_test_subject
+ epg: ansible_test_epg
+ esg: ansible_test_esg
+ register: err_mutually_exclusive_all
+ ignore_errors: true
+
+ - name: Mutually exclusive two provided (error)
+ cisco.aci.aci_subject_label:
+ <<: *aci_tenant_present
+ l2out: ansible_test_l2out
+ l3out: ansible_test_l3out
+ register: err_mutually_exclusive_two
+ ignore_errors: true
+
+ - name: Mutually exclusive esg with contract provided (error)
+ cisco.aci.aci_subject_label:
+ <<: *aci_tenant_present
+ esg: ansible_test_esg
+ contract: ansible_test_contract
+ register: err_mutually_exclusive_esg
+ ignore_errors: true
+
+ - name: Missing required input one of L2Out, L3Out, EPG, ESG, subject (error)
+ cisco.aci.aci_subject_label:
+ <<: *aci_tenant_present
+ subject_label: ansible_test_l2out
+ subject_label_type: consumer
+ register: err_missing_required_input_missing_one_of
+ ignore_errors: true
+
+ - name: Missing required input subject_type (error)
+ cisco.aci.aci_subject_label:
+ <<: *aci_tenant_present
+ l2out: ansible_test_l2out
+ register: err_missing_required_input_subject_type
+ ignore_errors: true
+
+ - name: Missing required input subject_label (error)
+ cisco.aci.aci_subject_label:
+ <<: *aci_tenant_present
+ l2out: ansible_test_l2out
+ subject_label_type: consumer
+ register: err_missing_required_input_subject_label
+ ignore_errors: true
+
+ - name: Missing required input external_epg (error)
+ cisco.aci.aci_subject_label:
+ <<: *aci_tenant_present
+ l2out: ansible_test_l2out
+ subject_label_type: consumer
+ subject_label: ansible_test_subject_label
+ register: err_missing_required_input_external_epg
+ ignore_errors: true
+
+ - name: Assert input errors
+ ansible.builtin.assert:
+ that:
+ - err_mutually_exclusive_all is failed
+ - err_mutually_exclusive_all.msg == "parameters are mutually exclusive{{":"}} l2out|l3out|epg|esg|subject"
+ - err_mutually_exclusive_two is failed
+ - err_mutually_exclusive_two.msg == "parameters are mutually exclusive{{":"}} l2out|l3out|epg|esg|subject"
+ - err_mutually_exclusive_esg is failed
+ - err_mutually_exclusive_esg.msg == "parameters are mutually exclusive{{":"}} esg|contract"
+ - err_missing_required_input_missing_one_of is failed
+ - err_missing_required_input_missing_one_of.msg == "state is present but any of the following are missing{{":"}} l2out, l3out, epg, esg, subject"
+ - err_missing_required_input_subject_type is failed
+ - err_missing_required_input_subject_type.msg == "missing required arguments{{":"}} subject_label_type"
+ - err_missing_required_input_subject_label is failed
+ - err_missing_required_input_subject_label.msg == "state is present but all of the following are missing{{":"}} subject_label"
+ - err_missing_required_input_external_epg is failed
+ - err_missing_required_input_external_epg.msg == "missing parameter(s) required by 'l2out'{{":"}} external_epg"
+
+ # CLEAN TEST ENVIRONMENT
+ - name: Remove tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/subject_label.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/subject_label.yml
new file mode 100644
index 000000000..bb15cc846
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_subject_label/tasks/subject_label.yml
@@ -0,0 +1,188 @@
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ aci_hostname }}"
+ username: "{{ aci_username }}"
+ password: "{{ aci_password }}"
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("debug") }}'
+
+# CREATE TESTS
+- name: Create subject label (check mode)
+ cisco.aci.aci_subject_label: &subject_label_present
+ <<: *aci_info
+ tenant: ansible_test
+ l2out: "{{ parent_class.l2out }}"
+ l3out: "{{ parent_class.l3out }}"
+ external_epg: "{{ parent_class.external_epg }}"
+ contract: "{{ parent_class.contract }}"
+ subject: "{{ parent_class.subject }}"
+ ap: "{{ parent_class.ap }}"
+ epg: "{{ parent_class.epg }}"
+ esg: "{{ parent_class.esg }}"
+ subject_label_type: consumer
+ subject_label: ansible_test_subject_label_1
+ check_mode: true
+ register: cm_create_subject_label
+
+- name: Create subject label
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_present
+ register: nm_create_subject_label
+
+- name: Create subject label again
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_present
+ register: nm_create_subject_label_again
+
+- name: Assert create subject label
+ ansible.builtin.assert:
+ that:
+ - cm_create_subject_label is changed
+ - cm_create_subject_label.previous == []
+ - cm_create_subject_label.current == []
+ - cm_create_subject_label.proposed.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - nm_create_subject_label is changed
+ - nm_create_subject_label.previous == []
+ - nm_create_subject_label.current.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - nm_create_subject_label.current.0.vzConsSubjLbl.attributes.descr == ""
+ - nm_create_subject_label.current.0.vzConsSubjLbl.attributes.isComplement == "no"
+ - nm_create_subject_label.current.0.vzConsSubjLbl.attributes.tag == "yellow-green"
+ - nm_create_subject_label_again is not changed
+ - nm_create_subject_label_again.previous.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - nm_create_subject_label_again.previous.0.vzConsSubjLbl.attributes.descr == ""
+ - nm_create_subject_label_again.previous.0.vzConsSubjLbl.attributes.isComplement == "no"
+ - nm_create_subject_label_again.previous.0.vzConsSubjLbl.attributes.tag == "yellow-green"
+ - nm_create_subject_label_again.current.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - nm_create_subject_label_again.current.0.vzConsSubjLbl.attributes.descr == ""
+ - nm_create_subject_label_again.current.0.vzConsSubjLbl.attributes.isComplement == "no"
+ - nm_create_subject_label_again.current.0.vzConsSubjLbl.attributes.tag == "yellow-green"
+
+# UPDATE TESTS
+- name: Update subject label
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_present
+ description: changed_description
+ complement: true
+ tag: chartreuse
+ register: nm_update_subject_label
+
+- name: Assert update subject label
+ ansible.builtin.assert:
+ that:
+ - nm_update_subject_label is changed
+ - nm_update_subject_label.previous.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - nm_update_subject_label.previous.0.vzConsSubjLbl.attributes.descr == ""
+ - nm_update_subject_label.previous.0.vzConsSubjLbl.attributes.isComplement == "no"
+ - nm_update_subject_label.previous.0.vzConsSubjLbl.attributes.tag == "yellow-green"
+ - nm_update_subject_label.current.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - nm_update_subject_label.current.0.vzConsSubjLbl.attributes.descr == "changed_description"
+ - nm_update_subject_label.current.0.vzConsSubjLbl.attributes.isComplement == "yes"
+ - nm_update_subject_label.current.0.vzConsSubjLbl.attributes.tag == "chartreuse"
+
+# QUERY TESTS
+- name: Create subject label 2
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_present
+ subject_label: ansible_test_subject_label_2
+ tag: cadet_blue
+
+- name: Create provider subject label 3, 4 and 5
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_present
+ subject_label: "{{ item }}"
+ subject_label_type: provider
+ loop:
+ - ansible_test_subject_label_3
+ - ansible_test_subject_label_4
+ - ansible_test_subject_label_5
+ register: create_provider_subject_labels
+
+- name: Assert create of provider subject label
+ ansible.builtin.assert:
+ that:
+ - create_provider_subject_labels.results.0.current.0.vzProvSubjLbl.attributes.name == "ansible_test_subject_label_3"
+ - create_provider_subject_labels.results.1.current.0.vzProvSubjLbl.attributes.name == "ansible_test_subject_label_4"
+ - create_provider_subject_labels.results.2.current.0.vzProvSubjLbl.attributes.name == "ansible_test_subject_label_5"
+
+- name: Query subject label
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_present
+ register: query_one
+
+- name: Query all consumer subject labels
+ cisco.aci.aci_subject_label:
+ <<: *aci_info
+ subject_label_type: consumer
+ state: query
+ register: query_all_consumer
+
+- name: Query all provider subject labels
+ cisco.aci.aci_subject_label:
+ <<: *aci_info
+ subject_label_type: provider
+ state: query
+ register: query_all_provider
+
+- name: Assert query subject label
+ ansible.builtin.assert:
+ that:
+ - query_one is not changed
+ - query_one.current.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - query_one.current.0.vzConsSubjLbl.attributes.descr == "changed_description"
+ - query_one.current.0.vzConsSubjLbl.attributes.isComplement == "yes"
+ - query_one.current.0.vzConsSubjLbl.attributes.tag == "chartreuse"
+ - query_all_consumer is not changed
+ - query_all_consumer.current | length >= 2
+ - query_all_provider is not changed
+ - query_all_provider.current | length >= 3
+
+# DELETE TESTS
+- name: Delete subject label (check mode)
+ cisco.aci.aci_subject_label: &subject_label_absent
+ <<: *subject_label_present
+ state: absent
+ check_mode: true
+ register: cm_delete_subject_label
+
+- name: Delete subject label
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_absent
+ register: nm_delete_subject_label
+
+- name: Delete subject label again
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_absent
+ register: nm_delete_subject_label_again
+
+- name: Assert delete subject label
+ ansible.builtin.assert:
+ that:
+ - cm_delete_subject_label is changed
+ - cm_delete_subject_label.previous.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - cm_delete_subject_label.current.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - cm_delete_subject_label.proposed == {}
+ - nm_delete_subject_label is changed
+ - nm_delete_subject_label.previous.0.vzConsSubjLbl.attributes.name == "ansible_test_subject_label_1"
+ - nm_delete_subject_label.current == []
+ - nm_delete_subject_label_again is not changed
+ - nm_delete_subject_label_again.previous == []
+ - nm_delete_subject_label_again.current == []
+
+# CLEAN TEST ENVIRONMENT
+- name: Delete consumer subject label 2
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_absent
+ subject_label: ansible_test_subject_label_2
+
+- name: Delete provider subject labels 3, 4 and 5
+ cisco.aci.aci_subject_label:
+ <<: *subject_label_absent
+ subject_label: "{{ item }}"
+ subject_label_type: provider
+ loop:
+ - ansible_test_subject_label_3
+ - ansible_test_subject_label_4
+ - ansible_test_subject_label_5
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_leaf_selector/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_leaf_selector/tasks/main.yml
index d57239e49..da683c852 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_leaf_selector/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_leaf_selector/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -69,7 +69,7 @@
# TODO: also test for errors
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- sw_leaf_selec_check_mode_present is changed
- sw_leaf_selec_present is changed
@@ -93,7 +93,7 @@
register: binding_query
- name: present assertions
- assert:
+ ansible.builtin.assert:
that:
- binding_query is not changed
- binding_query.current | length >= 1
@@ -126,7 +126,7 @@
register: sw_leaf_selec_absent_missing_param
- name: absent assertions
- assert:
+ ansible.builtin.assert:
that:
- sw_leaf_selec_check_mode_absent is changed
- sw_leaf_selec_check_mode_absent.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_leaf_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_leaf_profile/tasks/main.yml
index 2bed3b67c..022013c67 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_leaf_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_leaf_profile/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -57,7 +57,7 @@
register: nm_add_switch_leaf_profile_again
- name: Verify add_switch_leaf_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_add_switch_leaf_profile is changed
- nm_add_switch_leaf_profile is changed
@@ -94,7 +94,7 @@
register: nm_add_switch_leaf_profile_descr_again
- name: Verify add_switch_leaf_profile_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_switch_leaf_profile_descr is changed
- nm_add_switch_leaf_profile_descr is changed
@@ -113,7 +113,7 @@
register: nm_add_switch_leaf_profile_again_no_descr
- name: Verify add_switch_leaf_profile_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_switch_leaf_profile_again_no_descr is not changed
- nm_add_switch_leaf_profile_again_no_descr is not changed
@@ -138,7 +138,7 @@
register: nm_query_all_switch_leaf_profiles
- name: Verify query_all_switch_leaf_profiles
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_switch_leaf_profiles is not changed
- nm_query_all_switch_leaf_profiles is not changed
@@ -161,7 +161,7 @@
register: nm_query_switch_leaf_profile
- name: Verify query_switch_leaf_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_query_switch_leaf_profile is not changed
- nm_query_switch_leaf_profile is not changed
@@ -188,7 +188,7 @@
register: nm_remove_switch_leaf_profile_again
- name: Verify remove_switch_leaf_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_switch_leaf_profile is changed
- nm_remove_switch_leaf_profile is changed
@@ -212,7 +212,7 @@
# TODO: Implement more tests
- name: Verify query_non_switch_leaf_profile
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_switch_leaf_profile is not changed
- nm_query_non_switch_leaf_profile is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_vpc_protection_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_vpc_protection_group/tasks/main.yml
index c0ef39cfe..a161025a1 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_vpc_protection_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_switch_policy_vpc_protection_group/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -54,7 +54,7 @@
register: nm_add_vpc_prot_grp_again
- name: Verify add_vpc_prot_grp_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_vpc_prot_grp is changed
- nm_add_vpc_prot_grp is changed
@@ -91,7 +91,7 @@
register: nm_add_vpc_prot_grp_pol_again
- name: Verify add_vpc_prot_grp_pol
- assert:
+ ansible.builtin.assert:
that:
- cm_add_vpc_prot_grp_pol is changed
- nm_add_vpc_prot_grp_pol is changed
@@ -110,7 +110,7 @@
register: nm_add_vpc_prot_grp_again_no_pol
- name: Verify add_vpc_prot_grp_again_no_pol
- assert:
+ ansible.builtin.assert:
that:
- cm_add_vpc_prot_grp_again_no_pol is not changed
- nm_add_vpc_prot_grp_again_no_pol is not changed
@@ -135,7 +135,7 @@
register: nm_query_all_vpc_prot_grps
- name: Verify query_all_vpc_prot_grps
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_vpc_prot_grps is not changed
- nm_query_all_vpc_prot_grps is not changed
@@ -157,7 +157,7 @@
register: nm_query_vpc_prot_grp
- name: Verify query_vpc_prot_grp
- assert:
+ ansible.builtin.assert:
that:
- cm_query_vpc_prot_grp is not changed
- nm_query_vpc_prot_grp is not changed
@@ -184,7 +184,7 @@
register: nm_remove_vpc_prot_grp_again
- name: Verify remove_vpc_prot_grp
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_vpc_prot_grp is changed
- nm_remove_vpc_prot_grp is changed
@@ -207,7 +207,7 @@
register: nm_query_non_vpc_prot_grp
- name: Verify query_non_vpc_prot_grp
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_vpc_prot_grp is not changed
- nm_query_non_vpc_prot_grp is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_group/tasks/main.yml
index f80ca35d2..34a2ddf63 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_group/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -67,7 +67,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: Verify that ansible_syslog_group has been created with correct attributes (version > 4)
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_group.current.0.syslogGroup.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group"
- add_syslog_group.current.0.syslogGroup.attributes.name == "ansible_syslog_group"
@@ -78,7 +78,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: Verify that ansible_syslog_group has been created with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_group_32.current.0.syslogGroup.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group"
- add_syslog_group_32.current.0.syslogGroup.attributes.name == "ansible_syslog_group"
@@ -88,7 +88,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: Verify that ansible_syslog_group children have correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_group.current.0.syslogGroup.children.0.syslogConsole.attributes.adminState == "enabled"
- add_syslog_group.current.0.syslogGroup.children.0.syslogConsole.attributes.severity == "critical"
@@ -98,7 +98,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: Verify that ansible_syslog_group children have correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_group_32.current.0.syslogGroup.children.0.syslogConsole.attributes.adminState == "enabled"
- add_syslog_group_32.current.0.syslogGroup.children.0.syslogConsole.attributes.severity == "critical"
@@ -121,13 +121,13 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: Verify that ansible_syslog_group stays the same (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_group_again is not changed
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: Verify that ansible_syslog_group stays the same (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_group_again_32 is not changed
when: version.current.0.topSystem.attributes.version is version('4', '<')
@@ -165,7 +165,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: Verify that ansible_syslog_group has been updated with correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_syslog_group.current.0.syslogGroup.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group"
- update_syslog_group.current.0.syslogGroup.attributes.name == "ansible_syslog_group"
@@ -175,7 +175,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: Verify that ansible_syslog_group has been updated with correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_syslog_group_32.current.0.syslogGroup.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group"
- update_syslog_group_32.current.0.syslogGroup.attributes.name == "ansible_syslog_group"
@@ -184,7 +184,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '<')
- name: Verify that ansible_syslog_group children have correct attributes (version >= 4)
- assert:
+ ansible.builtin.assert:
that:
- update_syslog_group.current.0.syslogGroup.children.0.syslogConsole.attributes.adminState == "disabled"
- update_syslog_group.current.0.syslogGroup.children.0.syslogConsole.attributes.severity == "emergencies"
@@ -194,7 +194,7 @@
when: version.current.0.topSystem.attributes.version is version('4', '>=')
- name: Verify that ansible_syslog_group children have correct attributes (version < 4)
- assert:
+ ansible.builtin.assert:
that:
- update_syslog_group_32.current.0.syslogGroup.children.0.syslogConsole.attributes.adminState == "disabled"
- update_syslog_group_32.current.0.syslogGroup.children.0.syslogConsole.attributes.severity == "emergencies"
@@ -212,7 +212,7 @@
register: query_syslog_group
- name: Verify the attributes under query_syslog_group
- assert:
+ ansible.builtin.assert:
that:
- query_syslog_group is not changed
- query_syslog_group.current.0.syslogGroup.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group"
@@ -225,7 +225,7 @@
register: query_syslog_group_all
- name: Verify query_syslog_group_all
- assert:
+ ansible.builtin.assert:
that:
- query_syslog_group_all is not changed
@@ -238,7 +238,7 @@
register: remove_syslog_group
- name: Verify remove_syslog_group
- assert:
+ ansible.builtin.assert:
that:
- remove_syslog_group is changed
- remove_syslog_group.previous.0.syslogGroup.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_remote_dest/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_remote_dest/tasks/main.yml
index 82839ddf7..73fddc6f7 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_remote_dest/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_remote_dest/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,7 +22,7 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_syslog_src if it already exists
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
group: ansible_syslog_group
destination: "10.20.30.40"
@@ -30,7 +30,7 @@
# ADD syslog group
- name: Add syslog group
- aci_syslog_group:
+ cisco.aci.aci_syslog_group:
<<: *aci_info
name: ansible_syslog_group
admin_state: enabled
@@ -38,7 +38,7 @@
# ADD syslog remote destination
- name: Add syslog remote destination
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
group: ansible_syslog_group
destination: "10.20.30.40"
@@ -53,7 +53,7 @@
register: add_syslog_remote_dest
- name: Verify that ansible_syslog_src has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_remote_dest.current.0.syslogRemoteDest.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group/rdst-10.20.30.40"
- add_syslog_remote_dest.current.0.syslogRemoteDest.attributes.name == "remote_destination_name"
@@ -69,7 +69,7 @@
# ADD syslog remote dest again to check idempotency
- name: Add syslog remote dest
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
group: ansible_syslog_group
destination: "10.20.30.40"
@@ -84,13 +84,13 @@
register: add_syslog_remote_dest_again
- name: Verify that ansible_syslog_remote_dest stays the same
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_remote_dest_again is not changed
# MODIFY syslog remote destination
- name: Update the syslog remote destination
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
group: ansible_syslog_group
destination: "10.20.30.40"
@@ -106,7 +106,7 @@
register: update_syslog_remote_dest
- name: Verify that ansible_syslog_src has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_syslog_remote_dest.current.0.syslogRemoteDest.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group/rdst-10.20.30.40"
- update_syslog_remote_dest.current.0.syslogRemoteDest.attributes.name == "new_remote_destination_name"
@@ -119,13 +119,13 @@
- update_syslog_remote_dest.current.0.syslogRemoteDest.attributes.severity == "information"
- name: Verify that ansible_syslog_remote_dest children have correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_syslog_remote_dest.current.0.syslogRemoteDest.children.0.fileRsARemoteHostToEpg.attributes.tDn == "uni/tn-mgmt/mgmtp-default/oob-default"
# QUERY syslog source
- name: Query the syslog source
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
group: ansible_syslog_group
destination: "10.20.30.40"
@@ -133,7 +133,7 @@
register: query_syslog_remote_dest
- name: Verify the attributes under query_syslog_src
- assert:
+ ansible.builtin.assert:
that:
- query_syslog_remote_dest is not changed
- query_syslog_remote_dest.current.0.syslogRemoteDest.attributes.dn == "uni/fabric/slgroup-ansible_syslog_group/rdst-10.20.30.40"
@@ -147,19 +147,19 @@
- query_syslog_remote_dest.current.0.syslogRemoteDest.attributes.severity == "information"
- name: Query all syslog remote destinations
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
state: query
register: query_syslog_remote_dest_all
- name: Verify query_syslog_remote_dest_all
- assert:
+ ansible.builtin.assert:
that:
- query_syslog_remote_dest_all is not changed
# DELETE syslog remote destination
- name: Remove the syslog remote dest
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
group: ansible_syslog_group
destination: "10.20.30.40"
@@ -167,7 +167,7 @@
register: remove_syslog_remote_dest
- name: Verify remove_syslog_remote_dest
- assert:
+ ansible.builtin.assert:
that:
- remove_syslog_remote_dest is changed
- remove_syslog_remote_dest.current == []
@@ -175,7 +175,7 @@
# DELETE syslog remote destination again to test idempotence
- name: Remove the syslog remote dest again
- aci_syslog_remote_dest:
+ cisco.aci.aci_syslog_remote_dest:
<<: *aci_info
group: ansible_syslog_group
destination: "10.20.30.40"
@@ -183,13 +183,13 @@
register: remove_syslog_remote_dest_again
- name: Verify remove_syslog_remote_dest idempotence
- assert:
+ ansible.builtin.assert:
that:
- remove_syslog_remote_dest_again is not changed
# DELETE syslog group
- name: Remove syslog group
- aci_syslog_group:
+ cisco.aci.aci_syslog_group:
<<: *aci_info
name: ansible_syslog_group
admin_state: enabled
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_source/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_source/tasks/main.yml
index a7180649f..b2c7bd866 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_source/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_syslog_source/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,14 +22,14 @@
# CLEAN ENVIRONMENT
- name: Remove ansible_syslog_src if it already exists
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
name: ansible_syslog_src
state: absent
# ADD syslog group
- name: Add syslog group
- aci_syslog_group:
+ cisco.aci.aci_syslog_group:
<<: *aci_info
name: ansible_syslog_group
admin_state: enabled
@@ -37,7 +37,7 @@
# ADD syslog source
- name: Add syslog source
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
name: ansible_syslog_src
min_severity: errors
@@ -46,7 +46,7 @@
register: add_syslog_src
- name: Verify that ansible_syslog_src has been created with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_src.current.0.syslogSrc.attributes.dn == "uni/fabric/moncommon/slsrc-ansible_syslog_src"
- add_syslog_src.current.0.syslogSrc.attributes.name == "ansible_syslog_src"
@@ -55,13 +55,13 @@
- add_syslog_src.current.0.syslogSrc.attributes.annotation == 'orchestrator:ansible'
- name: Verify that ansible_syslog_src children have correct attributes
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_src.current.0.syslogSrc.children.0.syslogRsDestGroup.attributes.tDn == "uni/fabric/slgroup-ansible_syslog_group"
# ADD syslog source again to check idempotency
- name: Add syslog source
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
name: ansible_syslog_src
min_severity: errors
@@ -70,13 +70,13 @@
register: add_syslog_src_again
- name: Verify that ansible_syslog_src stays the same
- assert:
+ ansible.builtin.assert:
that:
- add_syslog_src_again is not changed
# MODIFY syslog source
- name: Update the syslog source
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
name: ansible_syslog_src
include:
@@ -89,7 +89,7 @@
register: update_syslog_src
- name: Verify that ansible_syslog_src has been updated with correct attributes
- assert:
+ ansible.builtin.assert:
that:
- update_syslog_src.current.0.syslogSrc.attributes.dn == "uni/fabric/moncommon/slsrc-ansible_syslog_src"
- update_syslog_src.current.0.syslogSrc.attributes.name == "ansible_syslog_src"
@@ -98,14 +98,14 @@
# QUERY syslog source
- name: Query the syslog source
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
name: ansible_syslog_src
state: query
register: query_syslog_src
- name: Verify the attributes under query_syslog_src
- assert:
+ ansible.builtin.assert:
that:
- query_syslog_src is not changed
- query_syslog_src.current.0.syslogSrc.attributes.dn == "uni/fabric/moncommon/slsrc-ansible_syslog_src"
@@ -114,26 +114,26 @@
- query_syslog_src.current.0.syslogSrc.attributes.minSev == "information"
- name: Query all syslog sources
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
state: query
register: query_syslog_src_all
- name: Verify query_syslog_src_all
- assert:
+ ansible.builtin.assert:
that:
- query_syslog_src_all is not changed
# DELETE syslog source
- name: Remove the syslog source
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
name: ansible_syslog_src
state: absent
register: remove_syslog_src
- name: Verify remove_syslog_src
- assert:
+ ansible.builtin.assert:
that:
- remove_syslog_src is changed
- remove_syslog_src.current == []
@@ -142,20 +142,20 @@
# DELETE syslog source again to test idempotence
- name: Remove the syslog source
- aci_syslog_source:
+ cisco.aci.aci_syslog_source:
<<: *aci_info
name: ansible_syslog_src
state: absent
register: remove_syslog_src_again
- name: Verify remove_syslog_src idempotence
- assert:
+ ansible.builtin.assert:
that:
- remove_syslog_src_again is not changed
# DELETE syslog group
- name: Remove syslog group
- aci_syslog_group:
+ cisco.aci.aci_syslog_group:
<<: *aci_info
name: ansible_syslog_group
admin_state: enabled
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_system/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_system/tasks/main.yml
index 6be69c245..21555c224 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_system/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_system/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,13 +22,13 @@
# QUERY OBJECTS
- name: Query all controllers system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
state: query
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.topSystem.attributes.id == "1"
@@ -36,28 +36,28 @@
- name: Query a specific controller system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: query_controller
- name: Verify query_controller
- assert:
+ ansible.builtin.assert:
that:
- query_controller is not changed
- query_controller.current.0.topSystem.attributes.id == "1"
- '"version" in query_controller.current.0.topSystem.attributes'
- name: Query non_existing controller
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 99
state: query
register: query_non_existing
- name: Verify query_non_existing
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing is not changed
- query_non_existing.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_system_banner/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_system_banner/tasks/main.yml
index 5b9cb96f0..7e750af42 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_system_banner/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_system_banner/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_system_endpoint_controls/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_system_endpoint_controls/tasks/main.yml
index fa98657f6..8b480175d 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_system_endpoint_controls/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_system_endpoint_controls/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will skip execution for cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_system_global_aes_passphrase_encryption/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_system_global_aes_passphrase_encryption/tasks/main.yml
index 732a4d4f3..2fdebe23b 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_system_global_aes_passphrase_encryption/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_system_global_aes_passphrase_encryption/tasks/main.yml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -22,7 +22,7 @@
output_level: '{{ aci_output_level | default("info") }}'
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will skip execution for cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_taboo_contract/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_taboo_contract/tasks/main.yml
index 8a5bb5911..19304b8fe 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_taboo_contract/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_taboo_contract/tasks/main.yml
@@ -52,7 +52,7 @@
register: nm_add_taboo_contract
- name: Verify add_taboo_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_add_taboo_contract is changed
- nm_add_taboo_contract is changed
@@ -76,7 +76,7 @@
register: nm_add_taboo_contract_again
- name: Verify add_taboo_contract_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_taboo_contract_again is not changed
- nm_add_taboo_contract_again is not changed
@@ -98,7 +98,7 @@
register: nm_add_taboo_contract_descr
- name: Verify add_taboo_contract_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_taboo_contract_descr is changed
- nm_add_taboo_contract_descr is changed
@@ -124,7 +124,7 @@
register: nm_add_taboo_contract_descr_again
- name: Verify add_taboo_contract_descr_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_taboo_contract_descr_again is not changed
- nm_add_taboo_contract_descr_again is not changed
@@ -142,7 +142,7 @@
register: nm_add_taboo_contract_again_no_descr
- name: Verify add_taboo_contract_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_taboo_contract_again_no_descr is not changed
- nm_add_taboo_contract_again_no_descr is not changed
@@ -168,7 +168,7 @@
register: nm_query_all_taboo_contracts
- name: Verify query_all_taboo_contracts
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_taboo_contracts is not changed
- nm_query_all_taboo_contracts is not changed
@@ -193,7 +193,7 @@
register: nm_query_taboo_contract
- name: Verify query_taboo_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_query_taboo_contract is not changed
- nm_query_taboo_contract is not changed
@@ -214,7 +214,7 @@
register: nm_remove_taboo_contract
- name: Verify remove_taboo_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_taboo_contract is changed
- nm_remove_taboo_contract is changed
@@ -233,7 +233,7 @@
register: nm_remove_taboo_contract_again
- name: Verify remove_taboo_contract_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_taboo_contract_again is not changed
- nm_remove_taboo_contract_again is not changed
@@ -261,7 +261,7 @@
# TODO: Implement more tests
- name: Verify query_non_taboo_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_taboo_contract is not changed
- nm_query_non_taboo_contract is not changed
@@ -284,7 +284,7 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "state is present but all of the following are missing: tenant, taboo_contract"'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tag/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tag/tasks/main.yml
index e5a13ba7b..14d145dcf 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tag/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tag/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,7 +20,7 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Remove tenant to cleanup
cisco.aci.aci_tenant:
@@ -36,7 +36,7 @@
register: query_result
- name: Get DN
- set_fact:
+ ansible.builtin.set_fact:
dn: "{{ query_result.current[0].fvTenant.attributes.dn }}"
- name: Annotation Create tag (check_mode)
@@ -57,7 +57,7 @@
register: nm_annotation_create
- name: Annotation tag created
- assert:
+ ansible.builtin.assert:
that:
- cm_annotation_create is changed
- cm_annotation_create.proposed.tagAnnotation.attributes.value == "bar"
@@ -79,7 +79,7 @@
register: nm_annotation_create_again
- name: Annotation tag create again
- assert:
+ ansible.builtin.assert:
that:
- cm_annotation_create_again is not changed
- cm_annotation_create_again.current.0.tagAnnotation.attributes.key == "foo"
@@ -95,7 +95,7 @@
register: annotation_query_result
- name: Annotation tag query verification
- assert:
+ ansible.builtin.assert:
that:
- annotation_query_result is not changed
- annotation_query_result.current.0.tagAnnotation.attributes.key == "foo"
@@ -110,12 +110,12 @@
register: annotation_query_all
- name: Annotation tag query verification
- assert:
+ ansible.builtin.assert:
that:
- annotation_query_all is not changed
- name: Annotation tag query verification (continued)
- assert:
+ ansible.builtin.assert:
that:
- annotation_query_all.current.0.tagAnnotation.attributes.key == "foo"
- annotation_query_all.current.0.tagAnnotation.attributes.value == "bar"
@@ -136,7 +136,7 @@
register: nm_annotation_delete
- name: Annotation tag deleted
- assert:
+ ansible.builtin.assert:
that:
- cm_annotation_delete is changed
- nm_annotation_delete is changed
@@ -161,7 +161,7 @@
register: nm_annotation_delete_again
- name: Annotation tag deleted again
- assert:
+ ansible.builtin.assert:
that:
- cm_annotation_delete_again is not changed
- nm_annotation_delete_again is not changed
@@ -187,7 +187,7 @@
register: nm_instance_create
- name: Instance tag created
- assert:
+ ansible.builtin.assert:
that:
- cm_instance_create is changed
- nm_instance_create is changed
@@ -207,7 +207,7 @@
register: nm_instance_create_again
- name: Instance tag create again
- assert:
+ ansible.builtin.assert:
that:
- cm_instance_create_again is not changed
- cm_instance_create_again.current.0.tagInst.attributes.name == "foo"
@@ -221,7 +221,7 @@
register: instance_query_result
- name: Instance tag query verification
- assert:
+ ansible.builtin.assert:
that:
- instance_query_result is not changed
- instance_query_result.current.0.tagInst.attributes.name == "foo"
@@ -235,12 +235,12 @@
register: instance_query_all
- name: Instance tag query verification
- assert:
+ ansible.builtin.assert:
that:
- instance_query_all is not changed
- name: Instance tag query verification (continued)
- assert:
+ ansible.builtin.assert:
that:
- instance_query_all.current.0.tagInst.attributes.name == "foo"
when: query_cloud.current == [] # This condition will skip execution for cloud sites
@@ -260,7 +260,7 @@
register: nm_instance_delete
- name: Instance tag deleted
- assert:
+ ansible.builtin.assert:
that:
- cm_instance_delete is changed
- nm_instance_delete is changed
@@ -283,7 +283,7 @@
register: nm_instance_delete_again
- name: Instance tag deleted again
- assert:
+ ansible.builtin.assert:
that:
- cm_instance_delete_again is not changed
- nm_instance_delete_again is not changed
@@ -310,7 +310,7 @@
register: nm_tag_create
- name: Tag tag created
- assert:
+ ansible.builtin.assert:
that:
- cm_tag_create is changed
- cm_tag_create.proposed.tagTag.attributes.value == "bar"
@@ -332,7 +332,7 @@
register: nm_tag_create_again
- name: Tag tag create again
- assert:
+ ansible.builtin.assert:
that:
- cm_tag_create_again is not changed
- cm_tag_create_again.current.0.tagTag.attributes.key == "foo"
@@ -348,7 +348,7 @@
register: tag_query_result
- name: Tag tag query verification
- assert:
+ ansible.builtin.assert:
that:
- tag_query_result is not changed
- tag_query_result.current.0.tagTag.attributes.key == "foo"
@@ -363,12 +363,12 @@
register: tag_query_all
- name: Tag tag query verification
- assert:
+ ansible.builtin.assert:
that:
- tag_query_all is not changed
- name: Tag tag query verification (continued)
- assert:
+ ansible.builtin.assert:
that:
- tag_query_all.current.0.tagTag.attributes.key == "foo"
- tag_query_all.current.0.tagTag.attributes.value == "bar"
@@ -389,7 +389,7 @@
register: nm_tag_delete
- name: Tag tag deleted
- assert:
+ ansible.builtin.assert:
that:
- cm_tag_delete is changed
- nm_tag_delete is changed
@@ -414,7 +414,7 @@
register: nm_tag_delete_again
- name: Tag tag deleted again
- assert:
+ ansible.builtin.assert:
that:
- cm_tag_delete_again is not changed
- nm_tag_delete_again is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/httpapi_connection.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/httpapi_connection.yml
index 214f55fe2..885ff3f9a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/httpapi_connection.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/httpapi_connection.yml
@@ -1,7 +1,7 @@
## Tests HTTTP Connection when a list of host are provided
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -35,7 +35,7 @@
ansible_command_timeout: 5
- name: Run aci_aaa_user_certificate through the plugin
- include_tasks: ../../../../../../integration/targets/aci_aaa_user_certificate/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_aaa_user_certificate/tasks/main.yml
- name: Add user certificate to be used later in the test
cisco.aci.aci_aaa_user_certificate:
@@ -103,7 +103,7 @@
no_username_flattened: "{{ no_username.httpapi_logs | flatten }}"
- name: Verify XML operation and HTTP error returned by APIC
- assert:
+ ansible.builtin.assert:
that:
- tenant_xml_plugin.status == 200
- '"Received response from {{ aci_hostname }} for POST operation with HTTP: 400" in ap_non_existent_tenant_flattened'
@@ -160,7 +160,7 @@
op18_flattened_task_pwd_add_ap: "{{ op18_task_pwd_add_ap.httpapi_logs | flatten }}"
- name: Verify forbidden error 403
- assert:
+ ansible.builtin.assert:
that:
- op17_task_pwd_add_tenant is changed
- op18_task_pwd_add_ap is changed
@@ -169,7 +169,7 @@
- '"Connection to {{ aci_hostname }} was successful" in op18_flattened_task_pwd_add_ap'
- name: reset connection to test other scenarios
- meta: reset_connection
+ ansible.builtin.meta: reset_connection
# Precedence test
- name: Delete Tenant with password and private key in the task (private_key takes precedence)
@@ -246,7 +246,7 @@
op4_flattened_inventory_pwd_add_tenant: "{{ op4_inventory_pwd_add_tenant.httpapi_logs | flatten }}"
- name: Verify Precedence
- assert:
+ ansible.builtin.assert:
that:
- '"Provided Hosts: [''{{ aci_hostname }}'']" in op1_flattened_task_private_key_delete_tenant'
- '"Initializing operation on {{ aci_hostname }}" in op1_flattened_task_private_key_delete_tenant'
@@ -270,7 +270,7 @@
- '"Connection to {{ aci_hostname }} was successful" not in op4_flattened_inventory_pwd_add_tenant'
- name: reset connection to test other scenarios
- meta: reset_connection
+ ansible.builtin.meta: reset_connection
# Switching of hosts test with the password in the task
- name: Delete Tenant with only password in the task (Check for successful operation on the last host)
@@ -295,7 +295,7 @@
op5_flattened_task_pwd_add_tenant: "{{ op5_task_pwd_add_tenant.httpapi_logs | flatten }}"
- name: Verify switching of hosts with the password in the task
- assert:
+ ansible.builtin.assert:
that:
- op5_task_pwd_delete_tenant is changed
- op5_flattened_task_pwd_delete_tenant | regex_search('Switching host from [0-9]+(?:\.[0-9]+){3} to {{ aci_hostname }}') is not none
@@ -327,7 +327,7 @@
op6_flattened_task_pwd_add_tenant: "{{ op6_task_pwd_add_tenant.httpapi_logs | flatten }}"
- name: Verify continuation of the operations on the connected host with the password in the task
- assert:
+ ansible.builtin.assert:
that:
- op6_task_pwd_delete_tenant is changed
- '"Connected host {{ aci_hostname }} found in the provided hosts. Continuing with it." in op6_flattened_task_pwd_delete_tenant'
@@ -353,7 +353,7 @@
register: op7_task_pwd_add_tenant
- name: Verify failure when no hosts are active
- assert:
+ ansible.builtin.assert:
that:
- op7_task_pwd_delete_tenant.error.text | regex_search('No hosts left in the cluster to continue operation! Error on final host [0-9]+(?:\.[0-9]+){3}') is not none
- op7_task_pwd_add_tenant is not changed
@@ -383,7 +383,7 @@
op8_flattened_inventory_pwd_add_tenant: "{{ op8_inventory_pwd_add_tenant.httpapi_logs | flatten }}"
- name: Verify switching of hosts with the password in the inventory
- assert:
+ ansible.builtin.assert:
that:
- op8_inventory_pwd_delete_tenant is changed
- op8_flattened_inventory_pwd_delete_tenant | regex_search('Switching host from [0-9]+(?:\.[0-9]+){3} to {{ aci_hostname }}') is not none
@@ -417,7 +417,7 @@
op9_flattened_inventory_pwd_add_tenant: "{{ op9_inventory_pwd_add_tenant.httpapi_logs | flatten }}"
- name: Verify switching of hosts with the password in the inventory
- assert:
+ ansible.builtin.assert:
that:
- op9_inventory_pwd_delete_tenant is changed
- op9_flattened_inventory_pwd_delete_tenant | regex_search('Switching host from [0-9]+(?:\.[0-9]+){3} to {{ aci_hostname }}') is not none
@@ -440,7 +440,7 @@
ignore_errors: True
- name: Verify failure when no hosts are active in the inventory
- assert:
+ ansible.builtin.assert:
that:
- op10_inventory_pwd_delete_tenant.error.text | regex_search('No hosts left in the cluster to continue operation! Error on final host [0-9]+(?:\.[0-9]+){3}') is not none
@@ -469,7 +469,7 @@
op11_flattened_task_private_key_add_tenant: "{{ op11_task_private_key_add_tenant.httpapi_logs | flatten }}"
- name: Verify switching of hosts with the private key in the task
- assert:
+ ansible.builtin.assert:
that:
- op11_task_private_key_delete_tenant is changed
- op11_flattened_task_private_key_delete_tenant | regex_search('Switching host from [0-9]+(?:\.[0-9]+){3} to {{ aci_hostname }}') is not none
@@ -503,7 +503,7 @@
op12_flattened_task_private_key_add_tenant: "{{ op12_task_private_key_add_tenant.httpapi_logs | flatten }}"
- name: Verify continuation of the operations on the connected host with the password in the task
- assert:
+ ansible.builtin.assert:
that:
- op12_task_private_key_delete_tenant is changed
- '"Connected host {{ aci_hostname }} found in the provided hosts. Continuing with it." in op12_flattened_task_private_key_delete_tenant'
@@ -531,7 +531,7 @@
register: op13_task_private_key_add_tenant
- name: Verify failure when no hosts are active in the task
- assert:
+ ansible.builtin.assert:
that:
- op13_task_private_key_delete_tenant.error.text | regex_search('No hosts left in the cluster to continue operation! Error on final host [0-9]+(?:\.[0-9]+){3}') is not none
- op13_task_private_key_add_tenant is not changed
@@ -562,7 +562,7 @@
op14_flattened_inventory_session_key_add_tenant: "{{ op14_inventory_session_key_add_tenant.httpapi_logs | flatten }}"
- name: Verify switching of hosts with the session key in the inventory
- assert:
+ ansible.builtin.assert:
that:
- op14_inventory_session_key_delete_tenant is changed
- op14_flattened_inventory_session_key_delete_tenant | regex_search('Switching host from [0-9]+(?:\.[0-9]+){3} to {{ aci_hostname }}') is not none
@@ -596,7 +596,7 @@
op15_flattened_inventory_session_key_add_tenant: "{{ op15_inventory_session_key_add_tenant.httpapi_logs | flatten }}"
- name: Verify switching of hosts with the session key in the inventory
- assert:
+ ansible.builtin.assert:
that:
- op15_inventory_session_key_delete_tenant is changed
- op15_flattened_inventory_session_key_delete_tenant | regex_search('Switching host from [0-9]+(?:\.[0-9]+){3} to {{ aci_hostname }}') is not none
@@ -619,7 +619,7 @@
ignore_errors: True
- name: Verify failure when no hosts are active in the inventory
- assert:
+ ansible.builtin.assert:
that:
- op16_inventory_session_key_delete_tenant.error.text | regex_search('No hosts left in the cluster to continue operation! Error on final host [0-9]+(?:\.[0-9]+){3}') is not none
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/main.yml
index b8a7a310f..4208676ca 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant/tasks/main.yml
@@ -1,11 +1,12 @@
# Test code for the ACI modules
# Copyright: (c) 2017, Dag Wieers (@dagwieers) <dag@wieers.com>
# Copyright: (c) 2020, Lionel Hercot (@lhercot) <lhercot@cisco.com>
+# Copyright: (c) 2024, Samita Bhattacharjee (@samiib) <samitab@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -13,7 +14,7 @@
tags: httpapi_connection
- name: Delete old log files to clean test directory
- file:
+ ansible.builtin.file:
path: "{{ item }}"
state: absent
with_items:
@@ -63,7 +64,7 @@
register: cm_add_tenant
- name: Dump content of files
- debug:
+ ansible.builtin.debug:
msg: "{{ lookup('file', aci_hostname +'_cm_add_tenant.json')}}"
- name: Add tenant (normal mode)
@@ -86,19 +87,19 @@
register: nm_add_tenant_again
- name: Dump content of files
- debug:
+ ansible.builtin.debug:
msg: "{{ lookup('file', aci_hostname + '_cm_add_tenant.json')}}"
- name: Store file content on variables for create object
- set_fact:
+ ansible.builtin.set_fact:
fc_cm_add_tenant: "{{ lookup('file', aci_hostname + '_cm_add_tenant.json') | from_json }}"
fc_nm_add_tenant: "{{ lookup('file', aci_hostname + '_nm_add_tenant.json') | from_json }}"
fc_cm_add_tenant_again: "{{ lookup('file', aci_hostname + '_cm_add_tenant_again.json') }}"
fc_nm_add_tenant_again: "{{ lookup('file', aci_hostname + '_nm_add_tenant_again.json') }}"
- name: Log file content verification for create object
- assert:
+ ansible.builtin.assert:
that:
- fc_cm_add_tenant.0.fvTenant.attributes.name == 'ansible_test'
- fc_cm_add_tenant.0.fvTenant.attributes.dn == 'uni/tn-ansible_test'
@@ -108,7 +109,7 @@
- fc_nm_add_tenant_again == ''
- name: Verify add_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- nm_add_tenant is changed
@@ -165,14 +166,14 @@
register: nm_add_tenant_descr_again
- name: Store file content on variables for update object
- set_fact:
+ ansible.builtin.set_fact:
fc_cm_add_tenant_descr: "{{ lookup('file', aci_hostname + '_cm_add_tenant_descr.json') | from_json }}"
fc_nm_add_tenant_descr: "{{ lookup('file', aci_hostname + '_nm_add_tenant_descr.json') | from_json }}"
fc_cm_add_tenant_descr_again: "{{ lookup('file', aci_hostname + '_cm_add_tenant_descr_again.json') }}"
fc_nm_add_tenant_descr_again: "{{ lookup('file', aci_hostname + '_nm_add_tenant_descr_again.json') }}"
- name: Log file content verification for update object
- assert:
+ ansible.builtin.assert:
that:
- fc_cm_add_tenant_descr.0.fvTenant.attributes.descr == 'Ansible test tenant'
- fc_nm_add_tenant_descr.0.fvTenant.attributes.descr == 'Ansible test tenant'
@@ -180,7 +181,7 @@
- fc_nm_add_tenant_descr_again == ''
- name: Verify add_tenant_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant_descr is changed
- nm_add_tenant_descr is changed
@@ -219,11 +220,80 @@
register: nm_add_tenant_again_no_descr
- name: Verify add_tenant_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant_again_no_descr is not changed
- nm_add_tenant_again_no_descr is not changed
+# TEST NO VERIFICATION
+- name: Create tenant with no verification (check mode)
+ cisco.aci.aci_tenant: &aci_tenant_no_verify
+ <<: *tenant_present
+ tenant: anstest-no-verify
+ description: Ansible Test
+ no_verification: true
+ check_mode: true
+ register: tenant_present_no_verify_cm
+
+- name: Create tenant with no verification
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_no_verify
+ register: tenant_present_no_verify
+
+- name: Create tenant with no verification again
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_no_verify
+ register: tenant_present_no_verify_again
+
+- name: Update tenant with no verification
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_no_verify
+ description: Ansible Test No Verify
+ register: update_tenant_present_no_verify
+
+- name: Delete tenant with no verification
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_no_verify
+ state: absent
+ register: delete_tenant_present_no_verify
+
+- name: Delete tenant with no verification again
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_no_verify
+ state: absent
+ register: delete_tenant_present_no_verify_again
+
+- name: No verification asserts
+ ansible.builtin.assert:
+ that:
+ - tenant_present_no_verify_cm is changed
+ - tenant_present_no_verify_cm.current_verified == false
+ - tenant_present_no_verify_cm.current.0 == tenant_present_no_verify_cm.proposed
+ - tenant_present_no_verify is changed
+ - tenant_present_no_verify.current_verified == false
+ - tenant_present_no_verify.current.0 == tenant_present_no_verify.proposed
+ - tenant_present_no_verify.previous == []
+ - tenant_present_no_verify_again is not changed
+ - tenant_present_no_verify_again.current_verified == true
+ - tenant_present_no_verify_again.current.0.fvTenant.attributes.name == "anstest-no-verify"
+ - tenant_present_no_verify_again.current.0.fvTenant.attributes.descr == "Ansible Test"
+ - tenant_present_no_verify_again.previous.0.fvTenant.attributes.name == "anstest-no-verify"
+ - tenant_present_no_verify_again.previous.0.fvTenant.attributes.descr == "Ansible Test"
+ - update_tenant_present_no_verify is changed
+ - update_tenant_present_no_verify.current_verified == false
+ - update_tenant_present_no_verify.current.0 == update_tenant_present_no_verify.proposed
+ - update_tenant_present_no_verify.previous.0.fvTenant.attributes.name == "anstest-no-verify"
+ - update_tenant_present_no_verify.previous.0.fvTenant.attributes.descr == "Ansible Test"
+ - delete_tenant_present_no_verify is changed
+ - delete_tenant_present_no_verify.current_verified == false
+ - delete_tenant_present_no_verify.current.0 == delete_tenant_present_no_verify.proposed
+ - delete_tenant_present_no_verify.previous.0.fvTenant.attributes.name == "anstest-no-verify"
+ - delete_tenant_present_no_verify.previous.0.fvTenant.attributes.descr == "Ansible Test No Verify"
+ - delete_tenant_present_no_verify_again is not changed
+ - delete_tenant_present_no_verify_again.current_verified == true
+ - delete_tenant_present_no_verify_again.current == []
+ - delete_tenant_present_no_verify_again.previous == []
+ - delete_tenant_present_no_verify_again.proposed == {}
# QUERY ALL TENANTS
- name: Query all tenants (check_mode)
@@ -244,7 +314,7 @@
register: nm_query_all_tenants
- name: Verify query_all_tenants
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_tenants is not changed
- nm_query_all_tenants is not changed
@@ -267,7 +337,7 @@
register: nm_query_tenant
- name: Verify query_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_query_tenant is not changed
- nm_query_tenant is not changed
@@ -287,7 +357,7 @@
register: default_annotation
- name: Assertion check for update tenant with default annotation
- assert:
+ ansible.builtin.assert:
that:
- default_annotation is changed
- default_annotation.current.0.fvTenant.attributes.annotation == 'orchestrator:ansible'
@@ -320,14 +390,14 @@
register: nm_remove_tenant_again
- name: Store file content on variables for delete object
- set_fact:
+ ansible.builtin.set_fact:
fc_cm_remove_tenant: "{{ lookup('file', aci_hostname + '_cm_remove_tenant.json') | from_json }}"
fc_nm_remove_tenant: "{{ lookup('file', aci_hostname + '_nm_remove_tenant.json') | from_json }}"
fc_cm_remove_tenant_again: "{{ lookup('file', aci_hostname + '_cm_remove_tenant_again.json') }}"
fc_nm_remove_tenant_again: "{{ lookup('file', aci_hostname + '_nm_remove_tenant_again.json') }}"
- name: Log file content verification for delete object
- assert:
+ ansible.builtin.assert:
that:
- fc_cm_remove_tenant.0.fvTenant.attributes.status == 'deleted'
- fc_cm_remove_tenant.0.fvTenant.attributes.dn == 'uni/tn-ansible_test'
@@ -336,7 +406,7 @@
- fc_nm_remove_tenant_again == ''
- name: Verify remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_tenant is changed
- nm_remove_tenant is changed
@@ -360,7 +430,7 @@
# TODO: Implement more tests
- name: Verify query_non_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_tenant is not changed
- nm_query_non_tenant is not changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_action_rule_profile/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_action_rule_profile/tasks/main.yml
index b993b0e33..7531863e0 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_action_rule_profile/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_action_rule_profile/tasks/main.yml
@@ -1,15 +1,17 @@
# Test code for the ACI modules
+# Copyright: (c) 2023, Dag Wieers (@dagwieers)
+# Copyright: (c) 2023, Tim Cragg (@timcragg) <tcragg@cisco.com>
# Copyright: (c) 2023, Gaspard Micol (@gmicol) <gmicol@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -19,115 +21,266 @@
use_proxy: '{{ aci_use_proxy | default(true) }}'
output_level: debug
+# CLEAN ENVIRONMENT
+- name: Remove the ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- # Clean Environment
- name: create tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_test
state: present
- name: Ensure first action rule profile does not exist
- aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_absent
+ cisco.aci.aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_absent
<<: *aci_tenant_present
name: anstest
description: test for action rule profile
+ set_preference: 100
+ set_route_tag: 100
+ set_weight: 100
+ set_metric: 100
+ set_metric_type: ospf_type_1
+ set_next_hop: 1.1.1.1
+ set_community:
+ community: no-advertise
+ criteria: replace
+ set_dampening:
+ half_life: 10
+ reuse: 1
+ suppress: 10
+ max_suppress_time: 100
state: absent
- - name: Ensure second action rule profile does not exist
- aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_2_absent
+ - name: Ensure second action rule profile does not exist - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_2_5_absent
+ <<: *aci_tenant_present
+ name: anstest_2
+ set_next_hop: 1.1.1.2
+ next_hop_propagation: true
+ multipath: true
+ state: absent
+
+ - name: Ensure second action rule profile does not exist - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_2_absent
<<: *aci_tenant_present
name: anstest_2
+ set_next_hop: 1.1.1.2
state: absent
- name: Create first action rule profile (check_mode)
- aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_present
+ cisco.aci.aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_present
<<: *aci_tenant_action_rule_profile_absent
state: present
check_mode: true
register: cm_add_tenant_action_rule_profile_1
- name: Create first action rule profile (normal_mode)
- aci_tenant_action_rule_profile:
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_tenant_action_rule_profile_present
register: nm_add_tenant_action_rule_profile_1
- name: Create first action rule profile again - testing idempotency
- aci_tenant_action_rule_profile:
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_tenant_action_rule_profile_present
register: idempotency_add_tenant_action_rule_profile_1
- - name: Create second action rule profile
- aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_2_present
+ - name: Create second action rule profile - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_2_5_present
+ <<: *aci_tenant_action_rule_profile_2_5_absent
+ state: present
+ register: nm_add_tenant_action_rule_profile_2_5
+
+ - name: Create second action rule profile - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_2_present
<<: *aci_tenant_action_rule_profile_2_absent
state: present
register: nm_add_tenant_action_rule_profile_2
- - name: Asserts for creation tasks
- assert:
+ - name: Asserts for creation tasks for action rule profile 1
+ ansible.builtin.assert:
that:
- cm_add_tenant_action_rule_profile_1 is changed
- cm_add_tenant_action_rule_profile_1.previous == []
- cm_add_tenant_action_rule_profile_1.current == []
- nm_add_tenant_action_rule_profile_1 is changed
- nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.attributes.name == "anstest"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.0.rtctrlSetWeight.attributes.weight == "100"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.halfLife == "10"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.maxSuppressTime == "100"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.reuse == "1"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.suppress == "10"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.2.rtctrlSetRtMetricType.attributes.metricType == "ospf-type1"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.3.rtctrlSetNh.attributes.addr == "1.1.1.1"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.4.rtctrlSetPref.attributes.localPref == "100"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.5.rtctrlSetRtMetric.attributes.metric == "100"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.6.rtctrlSetComm.attributes.community == "no-advertise"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.6.rtctrlSetComm.attributes.setCriteria == "replace"
+ - nm_add_tenant_action_rule_profile_1.current.0.rtctrlAttrP.children.7.rtctrlSetTag.attributes.tag == "100"
- idempotency_add_tenant_action_rule_profile_1 is not changed
+
+ - name: Asserts for creation tasks for action rule profile 2 - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ ansible.builtin.assert:
+ that:
+ - nm_add_tenant_action_rule_profile_2_5 is changed
+ - nm_add_tenant_action_rule_profile_2_5.current.0.rtctrlAttrP.attributes.name == "anstest_2"
+ - nm_add_tenant_action_rule_profile_2_5.current.0.rtctrlAttrP.children.0.rtctrlSetRedistMultipath.attributes.descr == ""
+ - nm_add_tenant_action_rule_profile_2_5.current.0.rtctrlAttrP.children.1.rtctrlSetNhUnchanged.attributes.descr == ""
+ - nm_add_tenant_action_rule_profile_2_5.current.0.rtctrlAttrP.children.2.rtctrlSetNh.attributes.addr == "1.1.1.2"
+
+ - name: Asserts for creation tasks for action rule profile 2 - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ ansible.builtin.assert:
+ that:
- nm_add_tenant_action_rule_profile_2 is changed
- nm_add_tenant_action_rule_profile_2.current.0.rtctrlAttrP.attributes.name == "anstest_2"
+ - nm_add_tenant_action_rule_profile_2.current.0.rtctrlAttrP.children.0.rtctrlSetNh.attributes.addr == "1.1.1.2"
- name: Query all action rule profiles
- aci_tenant_action_rule_profile:
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_info
state: query
register: query_all_tenant_action_rule_profile
- name: Query first action rule profile
- aci_tenant_action_rule_profile:
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_tenant_action_rule_profile_present
state: query
register: query_first_tenant_action_rule_profile
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_tenant_action_rule_profile is not changed
- query_all_tenant_action_rule_profile.current | length >= 2
- '"class/rtctrlAttrP.json" in query_all_tenant_action_rule_profile.url'
- query_first_tenant_action_rule_profile is not changed
- query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.attributes.name == "anstest"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.0.rtctrlSetWeight.attributes.weight == "100"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.halfLife == "10"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.maxSuppressTime == "100"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.reuse == "1"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.1.rtctrlSetDamp.attributes.suppress == "10"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.2.rtctrlSetRtMetricType.attributes.metricType == "ospf-type1"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.3.rtctrlSetNh.attributes.addr == "1.1.1.1"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.4.rtctrlSetPref.attributes.localPref == "100"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.5.rtctrlSetRtMetric.attributes.metric == "100"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.6.rtctrlSetComm.attributes.community == "no-advertise"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.6.rtctrlSetComm.attributes.setCriteria == "replace"
+ - query_first_tenant_action_rule_profile.current.0.rtctrlAttrP.children.7.rtctrlSetTag.attributes.tag == "100"
+
+ - name: Delete children for first action rule profile (check_mode)
+ cisco.aci.aci_tenant_action_rule_profile: &aci_tenant_action_rule_profile_children_deleted
+ <<: *aci_tenant_action_rule_profile_present
+ set_preference: ""
+ set_route_tag: ""
+ set_weight: ""
+ set_metric: ""
+ set_metric_type: ""
+ set_next_hop: ""
+ set_community: {}
+ set_dampening: {}
+ check_mode: true
+ register: cm_delete_children_tenant_action_rule_profile_1
+
+ - name: Delete children for first action rule profile (normal_mode)
+ cisco.aci.aci_tenant_action_rule_profile:
+ <<: *aci_tenant_action_rule_profile_children_deleted
+ register: nm_delete_children_tenant_action_rule_profile_1
+
+ - name: Delete children for first action rule profile again - testing idempotency
+ cisco.aci.aci_tenant_action_rule_profile:
+ <<: *aci_tenant_action_rule_profile_children_deleted
+ register: idempotency_delete_children_tenant_action_rule_profile_1
+
+ - name: Delete children for second action rule profile - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_tenant_action_rule_profile:
+ <<: *aci_tenant_action_rule_profile_2_5_present
+ set_next_hop: ""
+ next_hop_propagation: false
+ multipath: false
+ register: nm_delete_children_tenant_action_rule_profile_2_5
+
+ - name: Delete children for second action rule profile - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_tenant_action_rule_profile:
+ <<: *aci_tenant_action_rule_profile_2_present
+ set_next_hop: ""
+ register: nm_delete_children_tenant_action_rule_profile_2
+
+ - name: Asserts for deletion tasks for action rule profile 1
+ ansible.builtin.assert:
+ that:
+ - cm_delete_children_tenant_action_rule_profile_1 is changed
+ - cm_delete_children_tenant_action_rule_profile_1.current == cm_delete_children_tenant_action_rule_profile_1.previous
+ - nm_delete_children_tenant_action_rule_profile_1 is changed
+ - nm_delete_children_tenant_action_rule_profile_1.current.0.rtctrlAttrP | length == 1
+ - idempotency_delete_children_tenant_action_rule_profile_1 is not changed
+
+ - name: Asserts for deletion tasks for action rule profile 2 - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ ansible.builtin.assert:
+ that:
+ - nm_delete_children_tenant_action_rule_profile_2_5 is changed
+ - nm_delete_children_tenant_action_rule_profile_2_5.current.0.rtctrlAttrP | length == 1
+
+ - name: Asserts for deletion tasks for action rule profile 2 - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ ansible.builtin.assert:
+ that:
+ - nm_delete_children_tenant_action_rule_profile_2 is changed
+ - nm_delete_children_tenant_action_rule_profile_2.current.0.rtctrlAttrP | length == 1
- name: Delete first action rule profile (check_mode)
- aci_tenant_action_rule_profile:
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_tenant_action_rule_profile_present
state: absent
check_mode: true
register: cm_delete_tenant_action_rule_profile_1
- name: Delete first action rule profile (normal_mode)
- aci_tenant_action_rule_profile:
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_tenant_action_rule_profile_present
state: absent
register: nm_delete_tenant_action_rule_profile_1
- name: Delete first action rule profile again - testing idempotency
- aci_tenant_action_rule_profile:
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_tenant_action_rule_profile_present
state: absent
register: idempotency_delete_tenant_action_rule_profile_1
- - name: Delete second action rule profile (normal_mode)
- aci_tenant_action_rule_profile:
+ - name: Delete second action rule profile - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ cisco.aci.aci_tenant_action_rule_profile:
+ <<: *aci_tenant_action_rule_profile_2_5_present
+ state: absent
+ register: nm_delete_tenant_action_rule_profile_2_5
+
+ - name: Delete second action rule profile - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ cisco.aci.aci_tenant_action_rule_profile:
<<: *aci_tenant_action_rule_profile_2_present
state: absent
register: nm_delete_tenant_action_rule_profile_2
- - name: Asserts for deletion tasks
- assert:
+ - name: Asserts for deletion tasks for action rule profile 1
+ ansible.builtin.assert:
that:
- cm_delete_tenant_action_rule_profile_1 is changed
- cm_delete_tenant_action_rule_profile_1.proposed == {}
@@ -136,11 +289,24 @@
- nm_delete_tenant_action_rule_profile_1.current == []
- idempotency_delete_tenant_action_rule_profile_1 is not changed
- idempotency_delete_tenant_action_rule_profile_1.previous == []
+
+ - name: Asserts for deletion tasks for action rule profile 2 - APIC version >= 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '>=')
+ ansible.builtin.assert:
+ that:
+ - nm_delete_tenant_action_rule_profile_2_5 is changed
+ - nm_delete_tenant_action_rule_profile_2_5.previous != []
+ - nm_delete_tenant_action_rule_profile_2_5.current == []
+
+ - name: Asserts for deletion tasks for action rule profile 2 - APIC version < 5.0
+ when: version.current.0.topSystem.attributes.version is version('5', '<')
+ ansible.builtin.assert:
+ that:
- nm_delete_tenant_action_rule_profile_2 is changed
- nm_delete_tenant_action_rule_profile_2.previous != []
- nm_delete_tenant_action_rule_profile_2.current == []
- - name: Delete tenant - clean up the environment
- aci_tenant:
+ - name: Delete tenant - cleanup before ending tests
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_ep_retention_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_ep_retention_policy/tasks/main.yml
index 96ba34077..29b45938f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_ep_retention_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_ep_retention_policy/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -20,20 +20,20 @@
output_level: debug
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
# Clean Environment
- name: create tenant
- aci_tenant: &aci_tenant_present
+ cisco.aci.aci_tenant: &aci_tenant_present
<<: *aci_info
tenant: ansible_test
state: present
- name: Ensure first EP retention protocol policy does not exist
- aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_absent
+ cisco.aci.aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_absent
<<: *aci_tenant_present
name: ep_policy_anstest
description: test for EP retention protocol policy
@@ -46,7 +46,7 @@
state: absent
- name: Ensure second EP retention protocol policy does not exist
- aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_2_absent
+ cisco.aci.aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_2_absent
<<: *aci_tenant_present
name: ep_policy_anstest_2
bounce_age: 0
@@ -56,65 +56,65 @@
state: absent
- name: Create first EP retention protocol policy (check_mode)
- aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_present
+ cisco.aci.aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_present
<<: *aci_tenant_ep_retention_policy_absent
state: present
check_mode: true
register: cm_add_tenant_ep_retention_policy_1
- name: Create first EP retention protocol policy (normal_mode)
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
register: nm_add_tenant_ep_retention_policy_1
- name: Create first EP retention protocol policy again - testing idempotency
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
register: idempotency_add_tenant_ep_retention_policy_1
- name: Create second EP retention protocol policy
- aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_2_present
+ cisco.aci.aci_tenant_ep_retention_policy: &aci_tenant_ep_retention_policy_2_present
<<: *aci_tenant_ep_retention_policy_2_absent
state: present
register: nm_add_tenant_ep_retention_policy_2
- name: Modify EP retention protocol policy bounce age - testing failure message
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
bounce_age: 100
ignore_errors: true
register: Modify_tenant_ep_retention_policy_bounce_age
- name: Modify EP retention protocol policy hold interval - testing failure message
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
hold_interval: 4
ignore_errors: true
register: Modify_tenant_ep_retention_policy_hold_interval
- name: Modify EP retention protocol policy move frequency - testing failure message
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
move_frequency: 65540
ignore_errors: true
register: Modify_tenant_ep_retention_policy_move_frequency
- name: Modify EP retention protocol policy local ep interval - testing failure message
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
local_ep_interval: 119
ignore_errors: true
register: Modify_tenant_ep_retention_policy_local_ep_interval
- name: Modify EP retention protocol policy remote ep interval - testing failure message
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
remote_ep_interval: 119
ignore_errors: true
register: Modify_tenant_ep_retention_policy_remote_ep_interval
- name: Asserts for creation tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant_ep_retention_policy_1 is changed
- cm_add_tenant_ep_retention_policy_1.previous == []
@@ -143,19 +143,19 @@
- Modify_tenant_ep_retention_policy_remote_ep_interval.msg == "The remote_ep_interval must be a value of 0 or between 120 and 65535"
- name: Query all EP retention protocol policies
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_info
state: query
register: query_all_tenant_ep_retention_policy
- name: Query first EP retention protocol policy
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
state: query
register: query_first_tenant_ep_retention_policy
- name: Asserts for query tasks
- assert:
+ ansible.builtin.assert:
that:
- query_all_tenant_ep_retention_policy is not changed
- query_all_tenant_ep_retention_policy.current | length >= 2
@@ -170,32 +170,32 @@
- query_first_tenant_ep_retention_policy.current.0.fvEpRetPol.attributes.remoteEpAgeIntvl == "600"
- name: Delete first EP retention protocol policy (check_mode)
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
state: absent
check_mode: true
register: cm_delete_tenant_ep_retention_policy_1
- name: Delete first EP retention protocol policy (normal_mode)
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
state: absent
register: nm_delete_tenant_ep_retention_policy_1
- name: Delete first EP retention protocol policy again - testing idempotency
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_present
state: absent
register: idempotency_delete_tenant_ep_retention_policy_1
- name: Delete second EP retention protocol policy (normal_mode)
- aci_tenant_ep_retention_policy:
+ cisco.aci.aci_tenant_ep_retention_policy:
<<: *aci_tenant_ep_retention_policy_2_present
state: absent
register: nm_delete_tenant_ep_retention_policy_2
- name: Asserts for deletion tasks
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_tenant_ep_retention_policy_1 is changed
- cm_delete_tenant_ep_retention_policy_1.proposed == {}
@@ -209,6 +209,6 @@
- nm_delete_tenant_ep_retention_policy_2.current == []
- name: Delete tenant - clean up the environment
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_tenant_present
state: absent \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_dst_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_dst_group/tasks/main.yml
index 543a25cd5..6b27dcb27 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_dst_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_dst_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -21,27 +21,27 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
block: # block specifies execution of tasks within, based on conditions
- name: Add a new tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
description: Ansible tenant
state: present
- name: Add span ansible_group
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
destination_group: ansible_group
description: Test span
@@ -62,7 +62,7 @@
register: add_span1
- name: Verify add span
- assert:
+ ansible.builtin.assert:
that:
- add_span1 is changed
- add_span1.current.0.spanDestGrp.attributes.name == "ansible_group"
@@ -80,7 +80,7 @@
- add_span1.current.0.spanDestGrp.attributes.annotation == 'orchestrator:ansible'
- name: Add span ansible_group again
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
destination_group: ansible_group
description: Test span
@@ -101,12 +101,12 @@
register: add_span1_again
- name: Verify add span again
- assert:
+ ansible.builtin.assert:
that:
- add_span1_again is not changed
- name: Change span ansible_group's src ip
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
destination_group: ansible_group2
description: Test span
@@ -127,7 +127,7 @@
register: change_span1_ip
- name: Change span ansible_group's dscp
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
destination_group: ansible_group2
description: Test span
@@ -148,13 +148,13 @@
register: change_span1_dscp
- name: Verify changes in span
- assert:
+ ansible.builtin.assert:
that:
- change_span1_ip.current.0.spanDestGrp.children.0.spanDest.children.0.spanRsDestEpg.attributes.ip == "10.0.0.2"
- change_span1_dscp.current.0.spanDestGrp.children.0.spanDest.children.0.spanRsDestEpg.attributes.dscp == "VA"
- name: Add span ansible_group2
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
destination_group: ansible_group2
description: Test span
@@ -175,7 +175,7 @@
register: add_span2
- name: Verify addition of second span
- assert:
+ ansible.builtin.assert:
that:
- add_span2 is changed
- add_span2.current.0.spanDestGrp.attributes.name == "ansible_group2"
@@ -192,7 +192,7 @@
- add_span2.current.0.spanDestGrp.children.0.spanDest.children.0.spanRsDestEpg.attributes.ttl == "2"
- name: Query span ansible_group
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
tenant: ansible_tenant
destination_group: ansible_group
@@ -200,13 +200,13 @@
register: query_span_ansible_group
- name: Query all span dest groups
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
state: query
register: query_all_span
- name: Verify Query of span
- assert:
+ ansible.builtin.assert:
that:
- query_span_ansible_group is not changed
- query_span_ansible_group.current.0.spanDestGrp.attributes.name == "ansible_group"
@@ -224,7 +224,7 @@
- query_all_span | length >= 2
- name: Remove span ansible_group
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
tenant: ansible_tenant
destination_group: ansible_group
@@ -232,7 +232,7 @@
register: remove_span1
- name: Remove span ansible_group2
- aci_tenant_span_dst_group:
+ cisco.aci.aci_tenant_span_dst_group:
<<: *aci_info
tenant: ansible_tenant
destination_group: ansible_group2
@@ -240,7 +240,7 @@
register: remove_span2
- name: Verify Remove of span
- assert:
+ ansible.builtin.assert:
that:
- remove_span1 is changed
- remove_span1.current == []
@@ -249,7 +249,7 @@
# CLEAN ENVIRONMENT
- name: Remove the ansible_tenant
- aci_tenant:
+ cisco.aci.aci_tenant:
<<: *aci_info
tenant: ansible_tenant
state: absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group/tasks/main.yml
index 9f83d0344..06b78e596 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -27,7 +27,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_src/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_src/tasks/main.yml
index 65b8722f9..7c4f5d708 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_src/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_src/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -27,7 +27,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_to_dst_group/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_to_dst_group/tasks/main.yml
index e9dac612d..6a3b87016 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_to_dst_group/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_tenant_span_src_group_to_dst_group/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -27,7 +27,7 @@
state: absent
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/dynamic.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/dynamic.yml
index 0469210f8..6453552c1 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/dynamic.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/dynamic.yml
@@ -39,7 +39,7 @@
register: nm_add_dynamic_vlan_pool
- name: Verify add_dynamic_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dynamic_vlan_pool is changed
- nm_add_dynamic_vlan_pool is changed
@@ -66,7 +66,7 @@
register: nm_add_dynamic_vlan_pool_again
- name: Verify add_dynamic_vlan_pool_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dynamic_vlan_pool_again is not changed
- nm_add_dynamic_vlan_pool_again is not changed
@@ -88,7 +88,7 @@
register: nm_add_dynamic_vlan_pool_descr
- name: Verify add_dynamic_vlan_pool_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dynamic_vlan_pool_descr is changed
- nm_add_dynamic_vlan_pool_descr is changed
@@ -116,7 +116,7 @@
register: nm_add_dynamic_vlan_pool_descr_again
- name: Verify add_dynamic_vlan_pool_descr_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dynamic_vlan_pool_descr_again is not changed
- nm_add_dynamic_vlan_pool_descr_again is not changed
@@ -134,7 +134,7 @@
register: nm_add_dynamic_vlan_pool_again_no_descr
- name: Verify add_dynamic_vlan_pool_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dynamic_vlan_pool_again_no_descr is not changed
- nm_add_dynamic_vlan_pool_again_no_descr is not changed
@@ -160,7 +160,7 @@
register: nm_query_all_dynamic_vlan_pools
- name: Verify query_all_dynamic_vlan_pools
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_dynamic_vlan_pools is not changed
- nm_query_all_dynamic_vlan_pools is not changed
@@ -185,7 +185,7 @@
register: nm_query_dynamic_vlan_pool
- name: Verify query_dynamic_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_query_dynamic_vlan_pool is not changed
- nm_query_dynamic_vlan_pool is not changed
@@ -207,7 +207,7 @@
register: nm_remove_dynamic_vlan_pool
- name: Verify remove_dynamic_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_dynamic_vlan_pool is changed
- nm_remove_dynamic_vlan_pool is changed
@@ -227,7 +227,7 @@
register: nm_remove_dynamic_vlan_pool_again
- name: Verify remove_dynamic_vlan_pool_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_dynamic_vlan_pool_again is not changed
- nm_remove_dynamic_vlan_pool_again is not changed
@@ -255,7 +255,7 @@
# TODO: Implement more tests
- name: Verify query_non_dynamic_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_dynamic_vlan_pool is not changed
- nm_query_non_dynamic_vlan_pool is not changed
@@ -278,7 +278,7 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "state is present but all of the following are missing: pool"'
@@ -298,7 +298,7 @@
register: error_on_missing_together_param
- name: Verify error_on_missing_together_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_together_param is failed
- error_on_missing_together_param.msg == "ACI requires the 'pool_allocation_mode' when 'pool' is provided"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/main.yml
index 0bac9032c..21d769f61 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/static.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/static.yml
index 3ddae4c47..de35cba16 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/static.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool/tasks/static.yml
@@ -38,7 +38,7 @@
register: nm_add_static_vlan_pool
- name: Verify add_static_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_add_static_vlan_pool is changed
- nm_add_static_vlan_pool is changed
@@ -65,7 +65,7 @@
register: nm_add_static_vlan_pool_again
- name: Verify add_static_vlan_pool_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_static_vlan_pool_again is not changed
- nm_add_static_vlan_pool_again is not changed
@@ -87,7 +87,7 @@
register: nm_add_static_vlan_pool_descr
- name: Verify add_static_vlan_pool_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_static_vlan_pool_descr is changed
- nm_add_static_vlan_pool_descr is changed
@@ -115,7 +115,7 @@
register: nm_add_static_vlan_pool_descr_again
- name: Verify add_static_vlan_pool_descr_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_static_vlan_pool_descr_again is not changed
- nm_add_static_vlan_pool_descr_again is not changed
@@ -133,7 +133,7 @@
register: nm_add_static_vlan_pool_again_no_descr
- name: Verify add_static_vlan_pool_again_no_descr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_static_vlan_pool_again_no_descr is not changed
- nm_add_static_vlan_pool_again_no_descr is not changed
@@ -159,7 +159,7 @@
register: nm_query_all_static_vlan_pools
- name: Verify query_all_static_vlan_pools
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_static_vlan_pools is not changed
- nm_query_all_static_vlan_pools is not changed
@@ -184,7 +184,7 @@
register: nm_query_static_vlan_pool
- name: Verify query_static_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_query_static_vlan_pool is not changed
- nm_query_static_vlan_pool is not changed
@@ -206,7 +206,7 @@
register: nm_remove_static_vlan_pool
- name: Verify remove_static_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_static_vlan_pool is changed
- nm_remove_static_vlan_pool is changed
@@ -226,7 +226,7 @@
register: nm_remove_static_vlan_pool_again
- name: Verify remove_static_vlan_pool_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_static_vlan_pool_again is not changed
- nm_remove_static_vlan_pool_again is not changed
@@ -254,7 +254,7 @@
# TODO: Implement more tests
- name: Verify query_non_static_vlan_pool
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_static_vlan_pool is not changed
- nm_query_non_static_vlan_pool is not changed
@@ -277,7 +277,7 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "state is present but all of the following are missing: pool"'
@@ -297,7 +297,7 @@
register: error_on_missing_together_param
- name: Verify error_on_missing_together_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_together_param is failed
- error_on_missing_together_param.msg == "ACI requires the 'pool_allocation_mode' when 'pool' is provided"
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool_encap_block/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool_encap_block/tasks/main.yml
index 5ccf8bfbf..125d210a9 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool_encap_block/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vlan_pool_encap_block/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an aci apic host, aci username and aci password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will execute only non-cloud sites
@@ -58,7 +58,7 @@
register: encap_block_present_check_mode
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_present_check_mode is changed
- encap_block_present_check_mode.sent.fvnsEncapBlk.attributes.allocMode == 'inherit'
@@ -73,7 +73,7 @@
register: encap_block_present
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_present is changed
- encap_block_present.previous == []
@@ -87,7 +87,7 @@
register: encap_block_present_idempotent
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_present_idempotent is not changed
- encap_block_present_idempotent.previous.0.fvnsEncapBlk.attributes.name == "anstest"
@@ -100,7 +100,7 @@
register: encap_block_present_update
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_present_update is changed
- encap_block_present_update.previous != []
@@ -115,7 +115,7 @@
register: encap_block_present_2
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_present_2 is changed
- encap_block_present_2.previous == []
@@ -128,7 +128,7 @@
register: encap_block_start_low
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_start_low is failed
- encap_block_start_low.msg == "vlan pools must have 'block_start' and 'block_end' values between 1 and 4094"
@@ -141,7 +141,7 @@
register: encap_block_start_high
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_start_high is failed
- encap_block_start_high.msg == "vlan pools must have 'block_start' and 'block_end' values between 1 and 4094"
@@ -154,7 +154,7 @@
register: encap_block_end_low
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_end_low is failed
- encap_block_end_low.msg == "vlan pools must have 'block_start' and 'block_end' values between 1 and 4094"
@@ -167,7 +167,7 @@
register: encap_block_end_high
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_end_high is failed
- encap_block_end_high.msg == "vlan pools must have 'block_start' and 'block_end' values between 1 and 4094"
@@ -180,7 +180,7 @@
register: encap_block_start_end
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_start_end is failed
- encap_block_start_end.msg == "The 'block_start' must be less than or equal to the 'block_end'"
@@ -192,7 +192,7 @@
register: encap_block_present_missing_param
- name: Present assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_present_missing_param is failed
- 'encap_block_present_missing_param.msg == "state is present but all of the following are missing: block_end, block_start"'
@@ -204,7 +204,7 @@
register: encap_block_query
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query is not changed
- encap_block_query.url.endswith("infra/vlanns-[anstest]-static/from-[vlan-20]-to-[vlan-40].json")
@@ -219,7 +219,7 @@
register: encap_block_query_from_to_name
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query_from_to_name is not changed
- encap_block_query_from_to_name.url.endswith("class/fvnsEncapBlk.json")
@@ -237,7 +237,7 @@
register: encap_block_query_from_name
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query_from_name is not changed
- encap_block_query_from_name.url.endswith("class/fvnsEncapBlk.json")
@@ -253,7 +253,7 @@
register: encap_block_query_to_name
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query_to_name is not changed
- encap_block_query_to_name.url.endswith("class/fvnsEncapBlk.json")
@@ -270,7 +270,7 @@
register: encap_block_query_name
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query_name is not changed
- encap_block_query_name.url.endswith("class/fvnsEncapBlk.json")
@@ -284,7 +284,7 @@
register: encap_block_query_from_to
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query_from_to is not changed
- encap_block_query_from_to.url.endswith("class/fvnsEncapBlk.json")
@@ -301,7 +301,7 @@
register: encap_block_query_pool
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query_pool is not changed
- encap_block_query_pool.current | length == 1
@@ -318,7 +318,7 @@
register: encap_block_query_all
- name: Query assertions
- assert:
+ ansible.builtin.assert:
that:
- encap_block_query_all is not changed
- encap_block_query_all.current | length > 1
@@ -332,7 +332,7 @@
register: delete_range
- name: Absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_range is changed
- delete_range.proposed == {}
@@ -346,7 +346,7 @@
register: delete_check_mode
- name: Absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_check_mode is changed
- delete_check_mode.previous != []
@@ -357,7 +357,7 @@
register: delete_encap_block_2
- name: Absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_encap_block_2 is changed
- delete_encap_block_2.previous == delete_check_mode.previous
@@ -368,7 +368,7 @@
register: delete_idempotent
- name: Absent assertions
- assert:
+ ansible.builtin.assert:
that:
- delete_idempotent is not changed
- delete_idempotent.previous == []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_controller/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_controller/tasks/main.yml
index 7a02169b0..820d03e75 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_controller/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_controller/tasks/main.yml
@@ -1,11 +1,12 @@
# Test code for the ACI modules
# Copyright: (c) 2021, Anvitha Jain (@anvitha-jain) <anvjain@cisco.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -31,7 +32,7 @@
- openstack
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will skip execution for cloud sites
@@ -52,12 +53,12 @@
- openstack
- name: Verify VMM add_domain
- assert:
+ ansible.builtin.assert:
that:
- nm_add_domain is changed
- name: Add controller to VMware VMM domain
- aci_vmm_controller: &add_controller
+ cisco.aci.aci_vmm_controller: &add_controller
<<: *aci_info
domain: vmm_dom
name: vCenter1
@@ -69,7 +70,7 @@
register: nm_add_controller
- name: Verify VMM add_controller
- assert:
+ ansible.builtin.assert:
that:
- nm_add_controller is changed
- nm_add_controller.sent.vmmCtrlrP.attributes.name == 'vCenter1'
@@ -80,7 +81,7 @@
- nm_add_controller.current.0.vmmCtrlrP.attributes.annotation == 'orchestrator:ansible'
- name: Add another controller to all VMM domain
- aci_vmm_controller:
+ cisco.aci.aci_vmm_controller:
<<: *add_controller
name: vCenter2
credentials: vCenterCredentials1
@@ -96,12 +97,12 @@
- openstack
- name: Verify another VMM add_controller
- assert:
+ ansible.builtin.assert:
that:
- add_controller is changed
- name: Add controller to VMware VMM domain again
- aci_vmm_controller:
+ cisco.aci.aci_vmm_controller:
<<: *add_controller
name: vCenter2
controller_hostname: 10.10.1.1
@@ -109,12 +110,12 @@
register: add_controller_again
- name: Verify another VMM add_controller again
- assert:
+ ansible.builtin.assert:
that:
- add_controller_again is not changed
- name: Query controller
- aci_vmm_controller:
+ cisco.aci.aci_vmm_controller:
<<: *aci_info
domain: vmm_dom
name: vCenter1
@@ -123,41 +124,96 @@
register: query_controller
- name: Verify VMM query_controller
- assert:
+ ansible.builtin.assert:
that:
- query_controller is not changed
- query_controller.current.0.vmmCtrlrP.attributes.dn == 'uni/vmmp-VMware/dom-vmm_dom/ctrlr-vCenter1'
- query_controller.current.0.vmmCtrlrP.attributes.name == 'vCenter1'
- - name: Query all controllers
- aci_vmm_controller:
+ - name: Query controller ( only vm_provider set )
+ cisco.aci.aci_vmm_controller:
+ <<: *aci_info
+ vm_provider: vmware
+ state: query
+ register: query_controller_vm_provider
+
+ - name: Query controller ( only domain set )
+ cisco.aci.aci_vmm_controller:
<<: *aci_info
domain: vmm_dom
+ state: query
+ register: query_controller_domain
+
+ - name: Query controller ( only name set )
+ cisco.aci.aci_vmm_controller:
+ <<: *aci_info
+ name: vCenter2
+ state: query
+ register: query_controller_name
+
+ - name: Query controller ( only vm_provider and domain set )
+ cisco.aci.aci_vmm_controller:
+ <<: *aci_info
vm_provider: vmware
+ domain: vmm_dom
state: query
- register: query_controller
+ register: query_controller_vm_provider_domain
+
+ - name: Query controller ( only vm_provider and name set )
+ cisco.aci.aci_vmm_controller:
+ <<: *aci_info
+ vm_provider: vmware
+ name: vCenter2
+ state: query
+ register: query_controller_vm_provider_name
+
+ - name: Query controller ( only domain and name set )
+ cisco.aci.aci_vmm_controller:
+ <<: *aci_info
+ domain: vmm_dom
+ name: vCenter2
+ state: query
+ register: query_controller_domain_name
+
+ - name: Query all controllers
+ cisco.aci.aci_vmm_controller:
+ <<: *aci_info
+ state: query
+ register: query_controller_all
- name: Verify VMM query_controller
- assert:
+ ansible.builtin.assert:
that:
- - query_controller is not changed
+ - query_controller_vm_provider is not changed
+ - query_controller_vm_provider.current.0.vmmProvP.attributes.dn == "uni/vmmp-VMware"
+ - query_controller_domain is not changed
+ - query_controller_domain.current.0.vmmDomP.attributes.dn == "uni/vmmp-VMware/dom-vmm_dom"
+ - query_controller_name is not changed
+ - query_controller_name.current.0.vmmCtrlrP.attributes.dn == "uni/vmmp-VMware/dom-vmm_dom/ctrlr-vCenter2"
+ - query_controller_vm_provider_domain is not changed
+ - query_controller_vm_provider_domain.current.0.vmmDomP.attributes.dn == "uni/vmmp-VMware/dom-vmm_dom"
+ - query_controller_vm_provider_name is not changed
+ - query_controller_vm_provider_name.current.0.vmmCtrlrP.attributes.dn == "uni/vmmp-VMware/dom-vmm_dom/ctrlr-vCenter2"
+ - query_controller_domain_name is not changed
+ - query_controller_domain_name.current.0.vmmDomP.attributes.dn == "uni/vmmp-VMware/dom-vmm_dom"
+ - query_controller_all is not changed
- name: Delete controllers
- aci_vmm_controller:
+ cisco.aci.aci_vmm_controller:
<<: *add_controller
name: vCenter1
state: absent
register: remove_controller
- name: Delete controllers
- aci_vmm_controller:
+ cisco.aci.aci_vmm_controller:
<<: *add_controller
name: vCenter2
state: absent
register: remove_controller_2
- name: Verify VMM remove_controller
- assert:
+ ansible.builtin.assert:
that:
- remove_controller is changed
- remove_controller_2 is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/main.yml
index b76c4563a..f88676dd8 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/vmware.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/vmware.yml
index 262ecf33c..c56d62c6c 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/vmware.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_credential/tasks/vmware.yml
@@ -5,7 +5,7 @@
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -26,7 +26,7 @@
register: nm_remove_domain
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will skip execution for cloud sites
@@ -42,7 +42,7 @@
register: nm_add_domain
- name: Verify add_domain
- assert:
+ ansible.builtin.assert:
that:
- nm_add_domain is changed
@@ -65,7 +65,7 @@
register: nm_remove_credential
- name: Verify remove_credential
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_credential is not changed
- nm_remove_credential is not changed
@@ -96,7 +96,7 @@
register: cm_add_credential_again
- name: Verify add_credential
- assert:
+ ansible.builtin.assert:
that:
- cm_add_credential is changed
- nm_add_credential is changed
@@ -132,7 +132,7 @@
register: nm_mod_credential
- name: Verify mod_credential
- assert:
+ ansible.builtin.assert:
that:
- cm_mod_credential is changed
- nm_mod_credential is changed
@@ -182,7 +182,7 @@
register: nm_query_all_credential
- name: Verify query_credential
- assert:
+ ansible.builtin.assert:
that:
- cm_query_credential is not changed
- nm_query_credential is not changed
@@ -209,7 +209,7 @@
register: nm_remove_credential_final
- name: Verify remove_credential
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_credential_again is changed
- nm_remove_credential_again is changed
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink/tasks/main.yml
index 1e7b6a6cf..8d627c730 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,14 +22,14 @@
# PERFORM TESTS ONLY ON SUPPORTED APICS
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when:
@@ -38,7 +38,7 @@
block:
# CLEAN ENVIRONMENT
- name: Remove ansible_domain if it already exists
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_domain
domain_type: vmm
@@ -47,7 +47,7 @@
# CREATE VMWARE DOMAIN
- name: Create ansible_domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_domain
domain_type: vmm
@@ -56,7 +56,7 @@
# CREATE VMWARE UPLINK CONTAINER
- name: Create VMWare Uplink Container
- aci_vmm_uplink_container:
+ cisco.aci.aci_vmm_uplink_container:
<<: *aci_info
domain: ansible_domain
num_of_uplinks: 1
@@ -73,7 +73,7 @@
register: create_uplink
- name: Verify Uplink Creation
- assert:
+ ansible.builtin.assert:
that:
- create_uplink.current.0.vmmUplinkP.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont/uplinkp-1"
- create_uplink.current.0.vmmUplinkP.attributes.uplinkId == "1"
@@ -91,7 +91,7 @@
register: create_uplink_again
- name: Verify Uplink Creation idempotence
- assert:
+ ansible.builtin.assert:
that:
- create_uplink_again is not changed
- create_uplink_again.current.0.vmmUplinkP.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont/uplinkp-1"
@@ -109,7 +109,7 @@
register: update_uplink
- name: Verify Uplink update
- assert:
+ ansible.builtin.assert:
that:
- update_uplink is changed
- update_uplink.current.0.vmmUplinkP.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont/uplinkp-1"
@@ -126,7 +126,7 @@
register: query_uplink
- name: Verify Uplink query
- assert:
+ ansible.builtin.assert:
that:
- query_uplink is not changed
- query_uplink.current.0.vmmUplinkP.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont/uplinkp-1"
@@ -143,7 +143,7 @@
register: remove_uplink
- name: Verify VMWare Uplink deletion
- assert:
+ ansible.builtin.assert:
that:
- remove_uplink is changed
- remove_uplink.current == []
@@ -161,13 +161,13 @@
register: remove_uplink_again
- name: Verify VMWare Uplink deletion idempotence
- assert:
+ ansible.builtin.assert:
that:
- remove_uplink_again is not changed
# CLEAN UP
- name: Remove ansible_domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_domain
domain_type: vmm
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink_container/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink_container/tasks/main.yml
index 0ddbe2174..7839728a9 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink_container/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_uplink_container/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
# GET Credentials from the inventory
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -22,14 +22,14 @@
# PERFORM TESTS ONLY ON SUPPORTED APICS
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
register: version
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when:
@@ -38,7 +38,7 @@
block:
# CLEAN ENVIRONMENT
- name: Remove ansible_domain if it already exists
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_domain
domain_type: vmm
@@ -47,7 +47,7 @@
# CREATE VMWARE DOMAIN
- name: Create ansible_domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_domain
domain_type: vmm
@@ -56,7 +56,7 @@
# CREATE VMWARE UPLINK CONTAINER
- name: Create VMWare Uplink Container
- aci_vmm_uplink_container:
+ cisco.aci.aci_vmm_uplink_container:
<<: *aci_info
domain: ansible_domain
num_of_uplinks: 2
@@ -64,7 +64,7 @@
register: create_container
- name: Verify Uplink Container Creation
- assert:
+ ansible.builtin.assert:
that:
- create_container.current.0.vmmUplinkPCont.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont"
- create_container.current.0.vmmUplinkPCont.attributes.numOfUplinks == "2"
@@ -72,7 +72,7 @@
# CREATE VMWARE UPLINK CONTAINER AGAIN TO CHECK IDEMPOTENCE
- name: Create VMWare Uplink Container again
- aci_vmm_uplink_container:
+ cisco.aci.aci_vmm_uplink_container:
<<: *aci_info
domain: ansible_domain
num_of_uplinks: 2
@@ -80,7 +80,7 @@
register: create_container_again
- name: Verify Uplink Container Creation Idempotence
- assert:
+ ansible.builtin.assert:
that:
- create_container_again is not changed
- create_container_again.current.0.vmmUplinkPCont.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont"
@@ -88,7 +88,7 @@
# MODIFY VMWARE UPLINK CONTAINER
- name: Update VMWare Uplink Container
- aci_vmm_uplink_container:
+ cisco.aci.aci_vmm_uplink_container:
<<: *aci_info
domain: ansible_domain
num_of_uplinks: 3
@@ -96,7 +96,7 @@
register: update_container
- name: Verify Uplink Container is updated
- assert:
+ ansible.builtin.assert:
that:
- update_container is changed
- update_container.current.0.vmmUplinkPCont.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont"
@@ -104,14 +104,14 @@
# QUERY VMWARE UPLINK CONTAINER
- name: Update VMWare Uplink Container
- aci_vmm_uplink_container:
+ cisco.aci.aci_vmm_uplink_container:
<<: *aci_info
domain: ansible_domain
state: query
register: query_container
- name: Verify Uplink Container Query
- assert:
+ ansible.builtin.assert:
that:
- query_container is not changed
- query_container.current.0.vmmUplinkPCont.attributes.dn == "uni/vmmp-VMware/dom-ansible_domain/uplinkpcont"
@@ -119,14 +119,14 @@
# DELETE VMWARE UPLINK CONTAINER
- name: Remove Uplink Container
- aci_vmm_uplink_container:
+ cisco.aci.aci_vmm_uplink_container:
<<: *aci_info
domain: ansible_domain
state: absent
register: delete_container
- name: Verify Uplink Container removal
- assert:
+ ansible.builtin.assert:
that:
- delete_container is changed
- delete_container.current == []
@@ -135,20 +135,20 @@
# DELETE VMWARE UPLINK CONTAINER AGAIN TO TEST IDEMPOTENCE
- name: Remove Uplink Container again
- aci_vmm_uplink_container:
+ cisco.aci.aci_vmm_uplink_container:
<<: *aci_info
domain: ansible_domain
state: absent
register: delete_container_again
- name: Verify Uplink Container removal idempotence
- assert:
+ ansible.builtin.assert:
that:
- delete_container_again is not changed
# CLEAN UP
- name: Remove ansible_domain
- aci_domain:
+ cisco.aci.aci_domain:
<<: *aci_info
domain: ansible_domain
domain_type: vmm
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_vswitch_policy/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_vswitch_policy/tasks/main.yml
index 371137af4..3038ff30a 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_vswitch_policy/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vmm_vswitch_policy/tasks/main.yml
@@ -5,7 +5,7 @@
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: "{{ aci_hostname }}"
username: "{{ aci_username }}"
@@ -16,7 +16,7 @@
output_level: '{{ aci_output_level | default("debug") }}'
- name: Query system information
- aci_system:
+ cisco.aci.aci_system:
<<: *aci_info
id: 1
state: query
@@ -37,7 +37,7 @@
- { domain: 'microsoft_dom', provider: 'microsoft' }
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when: query_cloud.current == [] # This condition will skip execution for cloud sites
@@ -57,12 +57,12 @@
- { domain: 'microsoft_dom', provider: 'microsoft' }
- name: Verify VMM add_domain
- assert:
+ ansible.builtin.assert:
that:
- nm_add_domain is changed
- name: Add a vSwitch policy to vmware domain
- aci_vmm_vswitch_policy: &add_vmware_policies
+ cisco.aci.aci_vmm_vswitch_policy: &add_vmware_policies
<<: *aci_info
domain: vmm_dom
vm_provider: vmware
@@ -73,7 +73,7 @@
register: add_vmware_policy
- name: Verify VMM add_vmware_policy
- assert:
+ ansible.builtin.assert:
that:
- add_vmware_policy is changed
- add_vmware_policy.previous == []
@@ -84,7 +84,7 @@
- add_vmware_policy.current.0.vmmVSwitchPolicyCont.attributes.annotation == 'orchestrator:ansible'
- name: Add a vSwitch policy to vmware domain
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *add_vmware_policies
netflow_exporter:
name: Netflow_Exporter_policy
@@ -94,7 +94,7 @@
register: add_vmware_policy_2
- name: Verify VMM add_vmware_policy_2
- assert:
+ ansible.builtin.assert:
that:
- add_vmware_policy_2 is changed
- add_vmware_policy_2.current.0.vmmVSwitchPolicyCont.attributes.dn == 'uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont'
@@ -105,7 +105,7 @@
- add_vmware_policy_2.current.0.vmmVSwitchPolicyCont.children.4.vmmRsVswitchOverrideLldpIfPol.attributes.tDn == 'uni/infra/lldpIfP-LLDP_policy'
- name: Add MTU policy to vmware domain when version is >= 4.2
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *add_vmware_policies
mtu_policy: MTU_policy
state: present
@@ -113,7 +113,7 @@
when: version.current.0.topSystem.attributes.version is version('4.2', '>=')
- name: Verify VMM add_vmware_mtu_policy
- assert:
+ ansible.builtin.assert:
that:
- add_vmware_mtu_policy is changed
- add_vmware_mtu_policy.current.0.vmmVSwitchPolicyCont.attributes.dn == 'uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont'
@@ -121,7 +121,7 @@
when: version.current.0.topSystem.attributes.version is version('4.2', '>=')
- name: Add a vSwitch policy to microsoft domain
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *aci_info
domain: vmm_dom
vm_provider: microsoft
@@ -132,7 +132,7 @@
register: add_microsoft_policy
- name: Verify VMM add_microsoft_policy
- assert:
+ ansible.builtin.assert:
that:
- add_microsoft_policy is changed
- add_microsoft_policy.previous == []
@@ -142,7 +142,7 @@
- add_microsoft_policy.current.0.vmmVSwitchPolicyCont.children.2.vmmRsVswitchOverrideLldpIfPol.attributes.tDn == 'uni/infra/lldpIfP-ms_LLDP_policy'
- name: Add STP vSwitch policy to another microsoft domain
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *aci_info
domain: microsoft_dom
vm_provider: microsoft
@@ -151,7 +151,7 @@
register: add_microsoft_stp_policy
- name: Verify VMM add_microsoft_stp_policy
- assert:
+ ansible.builtin.assert:
that:
- add_microsoft_stp_policy is changed
- add_microsoft_stp_policy.previous == []
@@ -159,25 +159,25 @@
- add_microsoft_stp_policy.current.0.vmmVSwitchPolicyCont.children.0.vmmRsVswitchOverrideStpPol.attributes.tDn == 'uni/infra/ifPol-ms_STP_policy'
- name: Query all the vSwitch policy
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *aci_info
state: query
register: query_all_vmware
- name: Query all the vSwitch policy of the VMWare domain
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *aci_info
state: query
register: query_all_microsoft
- name: Verify Query all tasks for vmware and microsoft domain
- assert:
+ ansible.builtin.assert:
that:
- query_all_vmware is not changed
- query_all_microsoft is not changed
- name: Query vSwitch policies of VMWare domain
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *aci_info
domain: vmm_dom
vm_provider: vmware
@@ -185,13 +185,13 @@
register: query_vmware
- name: Verify Query vSwitch policy of the VMWare domain
- assert:
+ ansible.builtin.assert:
that:
- query_vmware is not changed
- query_vmware.current.0.vmmVSwitchPolicyCont.attributes.dn == 'uni/vmmp-VMware/dom-vmm_dom/vswitchpolcont'
- name: Remove vSwitch Policy from VMware VMM domain
- aci_vmm_vswitch_policy:
+ cisco.aci.aci_vmm_vswitch_policy:
<<: *aci_info
domain: vmm_dom
vm_provider: vmware
@@ -199,7 +199,7 @@
register: remove_vmware_vSwitch_policy
- name: Verify remove_vmware_vSwitch_policy
- assert:
+ ansible.builtin.assert:
that:
- remove_vmware_vSwitch_policy is changed
- remove_vmware_vSwitch_policy.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf/tasks/main.yml
index 695f40fe7..6903b3c71 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
@@ -73,7 +73,7 @@
register: vrf_present_missing_param
- name: present asserts
- assert:
+ ansible.builtin.assert:
that:
- vrf_present_check_mode is changed
- vrf_present_check_mode.sent.fvCtx.attributes.descr == 'Ansible Test'
@@ -126,7 +126,7 @@
register: query_vrf
- name: query asserts
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length > 1
@@ -177,7 +177,7 @@
register: vrf_absent_missing_param
- name: asserts for deletion task
- assert:
+ ansible.builtin.assert:
that:
- vrf_absent_check_mode is changed
- vrf_absent_check_mode.previous != []
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_leak_internal_subnet/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_leak_internal_subnet/tasks/main.yml
index 2455f24e4..33df4b78f 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_leak_internal_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_leak_internal_subnet/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI APIC host, ACI username and ACI password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
- name: Verify Cloud and Non-Cloud Sites in use.
- include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
+ ansible.builtin.include_tasks: ../../../../../../integration/targets/aci_cloud_provider/tasks/main.yml
- name: Execute tasks only for non-cloud sites
when:
@@ -17,7 +17,7 @@
- version.current.0.topSystem.attributes.version is version('5', '>=')
block: # block specifies execution of tasks within, based on conditions
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -113,7 +113,7 @@
attributes_list_present: "{{ leak_sub_present.current.0.leakInternalSubnet.children | map(attribute='leakTo.attributes') | list | sort(attribute='ctxName') }}"
- name: present asserts
- assert:
+ ansible.builtin.assert:
that:
- vrf_present is changed
- leak_sub_check_mode is changed
@@ -166,7 +166,7 @@
attributes_list_query: "{{ query.current.0.leakInternalSubnet.children | map(attribute='leakTo.attributes') | list | sort(attribute='ctxName') }}"
- name: query asserts
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query is not changed
@@ -215,7 +215,7 @@
register: leak_sub_delete_idempotency
- name: delete asserts
- assert:
+ ansible.builtin.assert:
that:
- leak_sub_delete_check_mode is changed
- leak_sub_delete_check_mode.current.0.leakInternalSubnet.children.0.leakTo.attributes.ctxName == 'test3'
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/aliases b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/aliases
new file mode 100644
index 000000000..209b793f9
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/aliases
@@ -0,0 +1,2 @@
+# No ACI simulator yet, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/tasks/main.yml
new file mode 100644
index 000000000..7b2991bd5
--- /dev/null
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vrf_multicast/tasks/main.yml
@@ -0,0 +1,1133 @@
+# Test code for the ACI modules
+# Copyright: (c) 2023, Tim Cragg (@timcragg)
+# Copyright: (c) 2023, Akini Ross (@akinross)
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI APIC host, ACI username and ACI password
+ ansible.builtin.fail:
+ msg: 'Please define the following variables: aci_hostname, aci_username and aci_password.'
+ when: aci_hostname is not defined or aci_username is not defined or aci_password is not defined
+
+# SET VARS
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: '{{ aci_hostname }}'
+ username: '{{ aci_username }}'
+ password: '{{ aci_password }}'
+ validate_certs: '{{ aci_validate_certs | default(false) }}'
+ use_ssl: '{{ aci_use_ssl | default(true) }}'
+ use_proxy: '{{ aci_use_proxy | default(true) }}'
+ output_level: '{{ aci_output_level | default("info") }}'
+
+# CLEAN ENVIRONMENT
+
+- name: Remove ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant_absent
+ <<: *aci_info
+ tenant: ansible_tenant
+ state: absent
+
+- name: Create ansible_tenant
+ cisco.aci.aci_tenant: &aci_tenant
+ <<: *aci_tenant_absent
+ state: present
+
+- name: Create ansible_vrf
+ cisco.aci.aci_vrf: &aci_ansible_vrf_1
+ <<: *aci_tenant
+ vrf: ansible_vrf_1
+ state: present
+
+- name: Create ansible_second_vrf
+ cisco.aci.aci_vrf: &aci_ansible_vrf_2
+ <<: *aci_tenant
+ vrf: ansible_vrf_2
+ state: present
+
+# ENABLE MULTICAST
+
+- name: Enable multicast on VRF 1 (check mode)
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ check_mode: yes
+ register: cm_enable_multicast
+
+- name: Enable multicast on VRF 1 (normal mode)
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ register: nm_enable_multicast
+
+- name: Enable multicast on VRF 1 again
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ register: nm_enable_multicast_again
+
+- name: Verify create multicast VRF 1
+ ansible.builtin.assert:
+ that:
+ - cm_enable_multicast is changed
+ - cm_enable_multicast.current == []
+ - cm_enable_multicast.previous == []
+ - cm_enable_multicast.proposed.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - cm_enable_multicast.proposed.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - cm_enable_multicast.proposed.pimCtxP.children.0.pimResPol.children == []
+ - cm_enable_multicast.proposed.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.children == []
+ - cm_enable_multicast.proposed.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.children == []
+ - cm_enable_multicast.proposed.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.children == []
+ - cm_enable_multicast.proposed.pimCtxP.children.2.pimSSMPatPol.children.0.pimSSMRangePol.children == []
+ - nm_enable_multicast is changed
+ - nm_enable_multicast.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_enable_multicast.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_enable_multicast.current.0.pimCtxP.attributes.mtu == "1500"
+ - nm_enable_multicast.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_enable_multicast.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_enable_multicast.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_enable_multicast.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_enable_multicast.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_enable_multicast.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_enable_multicast.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_enable_multicast.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_enable_multicast.previous == []
+ - nm_enable_multicast_again is not changed
+ - nm_enable_multicast_again.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_enable_multicast_again.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_enable_multicast_again.current.0.pimCtxP.attributes.mtu == "1500"
+ - nm_enable_multicast_again.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_enable_multicast_again.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_enable_multicast_again.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_enable_multicast_again.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_enable_multicast_again.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_enable_multicast_again.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_enable_multicast_again.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_enable_multicast_again.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_enable_multicast_again.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_enable_multicast_again.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_enable_multicast_again.previous.0.pimCtxP.attributes.mtu == "1500"
+ - nm_enable_multicast_again.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_enable_multicast_again.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_enable_multicast_again.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_enable_multicast_again.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_enable_multicast_again.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_enable_multicast_again.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_enable_multicast_again.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_enable_multicast_again.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+
+# UPDATE MULTICAST SETTINGS
+
+- name: Update pim setting on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ pim_setting:
+ mtu: 2000
+ control_state: [ fast, strict ]
+ register: nm_update_pim_setting
+
+- name: Remove control_state from pim setting on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ pim_setting:
+ control_state: []
+ register: nm_update_pim_setting_remove_control_state
+
+- name: Verify update pim setting on VRF 1
+ ansible.builtin.assert:
+ that:
+ - nm_update_pim_setting is changed
+ - nm_update_pim_setting.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_pim_setting.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_pim_setting.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_pim_setting.current.0.pimCtxP.attributes.ctrl == "fast-conv,strict-rfc-compliant"
+ - nm_update_pim_setting.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_pim_setting.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_pim_setting.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_pim_setting.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_pim_setting.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_pim_setting.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_pim_setting.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_pim_setting.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_pim_setting.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_pim_setting.previous.0.pimCtxP.attributes.mtu == "1500"
+ - nm_update_pim_setting.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_pim_setting.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_pim_setting.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_pim_setting.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_pim_setting.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_pim_setting.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_pim_setting.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_pim_setting.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_pim_setting_remove_control_state is changed
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_pim_setting_remove_control_state.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.attributes.ctrl == "fast-conv,strict-rfc-compliant"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_pim_setting_remove_control_state.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+
+# UPDATE MULTICAST RESOURCE POLICY
+
+- name: Update resource policy on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ maximum_limit: 100
+ register: nm_update_resource_policy
+
+- name: Add a routemap to resource policy on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ reserved_multicast_entries: 10
+ reserved_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ register: nm_update_resource_policy_add_route_map
+
+- name: Update maximum limit from resource policy with routemap on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ maximum_limit: 50
+ register: nm_update_resource_policy_with_route_map
+
+- name: Remove maximum limit from resource policy on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ maximum_limit: 0
+ register: nm_update_resource_policy_with_route_map_remove_maximum_limit
+
+- name: Update reserved multicast entries from resource policy on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ reserved_multicast_entries: 20
+ reserved_route_map: uni/tn-ansible_test/rtmap-ansible_test_changed
+ register: nm_update_resource_policy_change_reserved_multicast_entries
+
+- name: Remove a routemap from resource policy on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ reserved_route_map: ""
+ register: nm_update_resource_policy_remove_route_map
+
+- name: Remove a routemap from resource policy on VRF 1 again
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ reserved_route_map: ""
+ register: nm_update_resource_policy_remove_route_map_again
+
+- name: Verify update resource policy on VRF 1
+ ansible.builtin.assert:
+ that:
+ - nm_update_resource_policy is changed
+ - nm_update_resource_policy.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy.current.0.pimCtxP.children.2.pimResPol.attributes.max == "100"
+ - nm_update_resource_policy.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_resource_policy.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_resource_policy.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_resource_policy_add_route_map is changed
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "100"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "10"
+ - nm_update_resource_policy_add_route_map.current.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "100"
+ - nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - "'children' not in nm_update_resource_policy_add_route_map.previous.0.pimCtxP.children.2.pimResPol"
+ - nm_update_resource_policy_with_route_map is changed
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "50"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "10"
+ - nm_update_resource_policy_with_route_map.current.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "100"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "10"
+ - nm_update_resource_policy_with_route_map.previous.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit is changed
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "10"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.current.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "50"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "10"
+ - nm_update_resource_policy_with_route_map_remove_maximum_limit.previous.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_resource_policy_change_reserved_multicast_entries is changed
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "20"
+ - nm_update_resource_policy_change_reserved_multicast_entries.current.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test_changed"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "10"
+ - nm_update_resource_policy_change_reserved_multicast_entries.previous.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_resource_policy_remove_route_map is changed
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - "'children' not in nm_update_resource_policy_remove_route_map.current.0.pimCtxP.children.2.pimResPol"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "20"
+ - nm_update_resource_policy_remove_route_map.previous.0.pimCtxP.children.2.pimResPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test_changed"
+ - nm_update_resource_policy_remove_route_map_again is not changed
+
+# UPDATE MULTICAST ASM
+
+- name: Add a shared range routemap to any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ shared_range_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ register: nm_update_any_source_multicast_add_shared_range_route_map
+
+- name: Remove a shared range routemap from any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ shared_range_route_map: ""
+ register: nm_update_any_source_multicast_remove_shared_range_route_map
+
+- name: Remove a shared range routemap from any source multicast on VRF 1 again
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ shared_range_route_map: ""
+ register: nm_update_any_source_multicast_remove_shared_range_route_map_again
+
+- name: Update expiry seconds for any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ expiry: 500
+ register: nm_update_any_source_multicast_expiry_seconds
+
+- name: Remove expiry seconds for any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ expiry: 0
+ register: nm_update_any_source_multicast_remove_expiry_seconds
+
+- name: Add a source group expiry routemap to any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ source_group_expiry_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ register: nm_update_any_source_multicast_add_source_group_expiry_route_map
+
+- name: Remove a source group expiry routemap from any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ source_group_expiry_route_map: ""
+ register: nm_update_any_source_multicast_remove_source_group_expiry_route_map
+
+- name: Remove a source group expiry routemap from any source multicast on VRF 1 again
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ source_group_expiry_route_map: ""
+ register: nm_update_any_source_multicast_remove_source_group_expiry_route_map_again
+
+- name: Update max rate for any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ max_rate: 64000
+ register: nm_update_any_source_multicast_max_rate
+
+- name: Remove max rate for any source multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ any_source_multicast:
+ source_ip: 1.1.1.1
+ register: nm_update_any_source_multicast_ip
+
+- name: Verify update any source multicast on VRF 1
+ ansible.builtin.assert:
+ that:
+ - nm_update_any_source_multicast_add_shared_range_route_map is changed
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_add_shared_range_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - "'children' not in nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_add_shared_range_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_shared_range_route_map is changed
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - "'children' not in nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_remove_shared_range_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_shared_range_route_map_again is not changed
+ - nm_update_any_source_multicast_expiry_seconds is changed
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "500"
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_expiry_seconds.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_expiry_seconds.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_expiry_seconds is changed
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_remove_expiry_seconds.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "500"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_remove_expiry_seconds.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map is changed
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - "'children' not in nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_add_source_group_expiry_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map is changed
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - "'children' not in nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_remove_source_group_expiry_route_map_again is not changed
+ - nm_update_any_source_multicast_max_rate is changed
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_max_rate.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "65535"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_max_rate.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_ip is changed
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_ip.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "0.0.0.0"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_any_source_multicast_ip.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+
+# UPDATE MULTICAST SSM
+
+- name: Add a routemap to source specific multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ source_specific_multicast:
+ group_range_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ register: nm_update_source_specific_multicast_add_route_map
+
+- name: Remove a routemap from source specific multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ source_specific_multicast:
+ group_range_route_map: ""
+ register: nm_update_source_specific_multicast_remove_route_map
+
+- name: Remove a routemap from source specific multicast on VRF 1 again
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ source_specific_multicast:
+ group_range_route_map: ""
+ register: nm_update_source_specific_multicast_remove_route_map_again
+
+- name: Verify update source specific multicast on VRF 1
+ ansible.builtin.assert:
+ that:
+ - nm_update_source_specific_multicast_add_route_map is changed
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_source_specific_multicast_add_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - "'children' not in nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_source_specific_multicast_add_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_source_specific_multicast_remove_route_map is changed
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - "'children' not in nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_source_specific_multicast_remove_route_map.current.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_source_specific_multicast_remove_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_source_specific_multicast_remove_route_map_again is not changed
+
+# UPDATE MULTICAST BOOTSTRAP ROUTER (BSR)
+
+- name: Add a routemap to bootstrap router on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ bootstrap_router:
+ bsr_filter: uni/tn-ansible_test/rtmap-ansible_test
+ register: nm_update_bootstrap_router_add_route_map
+
+- name: Remove a routemap to bootstrap router on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ bootstrap_router:
+ bsr_filter: ""
+ register: nm_update_bootstrap_router_remove_route_map
+
+- name: Update bootstrap router on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ bootstrap_router:
+ rp_updates: [ forward, listen ]
+ register: nm_update_bootstrap_router
+
+- name: Remove rp_updates for bootstrap router on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ bootstrap_router:
+ rp_updates: []
+ register: nm_update_bootstrap_router_remove_rp_updates
+
+- name: Verify update bootstrap router on VRF 1
+ ansible.builtin.assert:
+ that:
+ - nm_update_bootstrap_router_add_route_map is changed
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.3.pimBSRPPol.children.0.pimBSRFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_bootstrap_router_add_route_map.current.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children.2.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router_add_route_map.previous.0.pimCtxP.children | length == 3
+ - nm_update_bootstrap_router_remove_route_map is changed
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - "'children' not in nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.3.pimBSRPPol.children.0.pimBSRFilterPol"
+ - nm_update_bootstrap_router_remove_route_map.current.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.3.pimBSRPPol.children.0.pimBSRFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_bootstrap_router_remove_route_map.previous.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_bootstrap_router is changed
+ - nm_update_bootstrap_router.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_bootstrap_router.current.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == "forward,listen"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_bootstrap_router.previous.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_bootstrap_router_remove_rp_updates is changed
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_bootstrap_router_remove_rp_updates.current.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_bootstrap_router_remove_rp_updates.previous.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == "forward,listen"
+
+# UPDATE MULTICAST AUTO-RP
+
+- name: Add a routemap to auro-rp on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ auto_rp:
+ ma_filter: uni/tn-ansible_test/rtmap-ansible_test
+ register: nm_update_auto_rp_add_route_map
+
+- name: Remove a routemap to auro-rp on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ auto_rp:
+ ma_filter: ""
+ register: nm_update_auto_rp_remove_route_map
+
+- name: Update auro-rp on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ auto_rp:
+ rp_updates: [ forward, listen ]
+ register: nm_update_auto_rp
+
+- name: Remove rp_updates for auro-rp on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ auto_rp:
+ rp_updates: []
+ register: nm_update_auto_rp_remove_rp_updates
+
+- name: Verify update auro-rp on VRF 1
+ ansible.builtin.assert:
+ that:
+ - nm_update_auto_rp_add_route_map is changed
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_add_route_map.current.0.pimCtxP.children.4.pimAutoRPPol.children.0.pimMAFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.attributes.annotation == "orchestrator:ansible"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.1.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.1.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.2.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children.3.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_add_route_map.previous.0.pimCtxP.children | length == 4
+ - nm_update_auto_rp_remove_route_map is changed
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - "'children' not in nm_update_auto_rp_remove_route_map.current.0.pimCtxP.children.4.pimAutoRPPol.children.0.pimMAFilterPol"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_route_map.previous.0.pimCtxP.children.4.pimAutoRPPol.children.0.pimMAFilterPol.children.0.rtdmcRsFilterToRtMapPol.attributes.tDn == "uni/tn-ansible_test/rtmap-ansible_test"
+ - nm_update_auto_rp is changed
+ - nm_update_auto_rp.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp.current.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp.current.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp.current.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp.current.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == "forward,listen"
+ - nm_update_auto_rp.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp.previous.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp.previous.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp.previous.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp.previous.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_rp_updates is changed
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp_remove_rp_updates.current.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_update_auto_rp_remove_rp_updates.previous.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == "forward,listen"
+
+# QUERY MULTICAST SETTINGS
+
+- name: Enable multicast on VRF 2
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_2
+ register: nm_update_resource_policy
+
+- name: Query multicast on VRF 1
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ state: query
+ register: query_one
+
+- name: Query multicast on all VRFs
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_info
+ state: query
+ register: query_all
+
+- name: Verify multicast VRF queries
+ ansible.builtin.assert:
+ that:
+ - query_one is not changed
+ - query_one.current | length == 1
+ - query_one.current.0.fvCtx.children.0.pimCtxP.attributes.rn == "pimctxp"
+ - query_one.current.0.fvCtx.children.0.pimCtxP.attributes.mtu == "2000"
+ - query_one.current.0.fvCtx.children.0.pimCtxP.attributes.ctrl == ""
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - query_one.current.0.fvCtx.children.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - query_all is not changed
+ - query_all.current | length > 1
+
+# DISABLE MULTICAST
+
+- name: Disable multicast on VRF
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ state: absent
+ check_mode: true
+ register: cm_disable_multicast
+
+- name: Disable multicast on VRF
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ state: absent
+ register: nm_disable_multicast
+
+- name: Disable multicast on VRF again
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ state: absent
+ register: nm_disable_multicast_again
+
+- name: Verify disable multicast on VRF
+ ansible.builtin.assert:
+ that:
+ - cm_disable_multicast is changed
+ - cm_disable_multicast.proposed == {}
+ - cm_disable_multicast.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - cm_disable_multicast.previous.0.pimCtxP.attributes.mtu == "2000"
+ - cm_disable_multicast.previous.0.pimCtxP.attributes.ctrl == ""
+ - cm_disable_multicast.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - cm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - cm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - cm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - cm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - cm_disable_multicast.previous.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - cm_disable_multicast.previous.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - cm_disable_multicast.previous.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - cm_disable_multicast.previous.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - nm_disable_multicast is changed
+ - nm_disable_multicast.current == []
+ - nm_disable_multicast.previous.0.pimCtxP.attributes.dn == "uni/tn-ansible_tenant/ctx-ansible_vrf_1/pimctxp"
+ - nm_disable_multicast.previous.0.pimCtxP.attributes.mtu == "2000"
+ - nm_disable_multicast.previous.0.pimCtxP.attributes.ctrl == ""
+ - nm_disable_multicast.previous.0.pimCtxP.children.0.pimSSMPatPol.children.0.pimSSMRangePol.attributes.name == ""
+ - nm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.0.pimSharedRangePol.attributes.name == ""
+ - nm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.1.pimSGRangeExpPol.attributes.sgExpItvl == "default-timeout"
+ - nm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.maxRate == "64000"
+ - nm_disable_multicast.previous.0.pimCtxP.children.1.pimASMPatPol.children.2.pimRegTrPol.attributes.srcIp == "1.1.1.1"
+ - nm_disable_multicast.previous.0.pimCtxP.children.2.pimBSRPPol.attributes.ctrl == ""
+ - nm_disable_multicast.previous.0.pimCtxP.children.3.pimResPol.attributes.max == "unlimited"
+ - nm_disable_multicast.previous.0.pimCtxP.children.3.pimResPol.attributes.rsvd == "undefined"
+ - nm_disable_multicast.previous.0.pimCtxP.children.4.pimAutoRPPol.attributes.ctrl == ""
+ - nm_disable_multicast_again is not changed
+ - nm_disable_multicast_again.current == []
+ - nm_disable_multicast_again.previous == []
+
+# ERRORS
+
+- name: Mutually exclusive parameters resource_policy (error)
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ reserved_multicast_entries: 10
+ ignore_errors: true
+ register: err_mutually_exclusive_resource_policy
+
+- name: Entries is 0 when routemap provided (error)
+ cisco.aci.aci_vrf_multicast:
+ <<: *aci_ansible_vrf_1
+ resource_policy:
+ reserved_route_map: uni/tn-ansible_test/rtmap-ansible_test
+ reserved_multicast_entries: 0
+ ignore_errors: true
+ register: err_reserved_multicast_entries_is_0
+
+- name: Verify errors
+ ansible.builtin.assert:
+ that:
+ - err_mutually_exclusive_resource_policy is failed
+ - err_mutually_exclusive_resource_policy.msg == "parameters are mutually exclusive{{':'}} reserved_route_map|reserved_multicast_entries"
+ - err_reserved_multicast_entries_is_0 is failed
+ - err_reserved_multicast_entries_is_0.msg == "C(reserved_multicast_entries) must be provided and greater than 0 when C(reserved_route_map) is provided"
+
+# CLEAN ENVIRONMENT
+
+- name: Remove ansible_tenant
+ cisco.aci.aci_tenant:
+ <<: *aci_tenant_absent
diff --git a/ansible_collections/cisco/aci/tests/integration/targets/aci_vzany_to_contract/tasks/main.yml b/ansible_collections/cisco/aci/tests/integration/targets/aci_vzany_to_contract/tasks/main.yml
index 65e6f1278..11c4d4e86 100644
--- a/ansible_collections/cisco/aci/tests/integration/targets/aci_vzany_to_contract/tasks/main.yml
+++ b/ansible_collections/cisco/aci/tests/integration/targets/aci_vzany_to_contract/tasks/main.yml
@@ -3,7 +3,7 @@
# SET VARS
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
aci_info: &aci_info
host: '{{ aci_hostname }}'
username: '{{ aci_username }}'
@@ -77,7 +77,7 @@
register: nm_vzany_prov
- name: Verify vzany_prov
- assert:
+ ansible.builtin.assert:
that:
- cm_vzany_prov is changed
- nm_vzany_prov is changed
@@ -91,7 +91,7 @@
register: add_prov_again
- name: Verify add_prov_again
- assert:
+ ansible.builtin.assert:
that:
- add_prov_again is not changed
@@ -123,7 +123,7 @@
register: query_all_provs
- name: Verify query_all_provs
- assert:
+ ansible.builtin.assert:
that:
- query_all_provs is not changed
- query_all_provs.current|length >= 2
@@ -136,7 +136,7 @@
register: query_spec_bind
- name: Verify query_spec_bind
- assert:
+ ansible.builtin.assert:
that:
- query_spec_bind is not changed
- query_spec_bind.current|length == 1
@@ -161,7 +161,7 @@
register: del_cif
- name: Verify remove_intf
- assert:
+ ansible.builtin.assert:
that:
- del_prov is changed
- del_cons is changed
diff --git a/ansible_collections/cisco/aci/tests/unit/compat/builtins.py b/ansible_collections/cisco/aci/tests/unit/compat/builtins.py
index bfc8adfbe..43f88203a 100644
--- a/ansible_collections/cisco/aci/tests/unit/compat/builtins.py
+++ b/ansible_collections/cisco/aci/tests/unit/compat/builtins.py
@@ -19,16 +19,3 @@
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/ansible_collections/cisco/aci/tests/unit/mock/loader.py b/ansible_collections/cisco/aci/tests/unit/mock/loader.py
index 524870cfa..2caea2883 100644
--- a/ansible_collections/cisco/aci/tests/unit/mock/loader.py
+++ b/ansible_collections/cisco/aci/tests/unit/mock/loader.py
@@ -30,7 +30,7 @@ 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
+ assert isinstance(file_mapping, dict)
super(DictDataLoader, self).__init__()
diff --git a/ansible_collections/cisco/aci/tests/unit/module_utils/test_aci.py b/ansible_collections/cisco/aci/tests/unit/module_utils/test_aci.py
index a1e07ed24..0305ee4c3 100644
--- a/ansible_collections/cisco/aci/tests/unit/module_utils/test_aci.py
+++ b/ansible_collections/cisco/aci/tests/unit/module_utils/test_aci.py
@@ -40,8 +40,6 @@ aci = AltACIModule()
try:
from lxml import etree
- if sys.version_info >= (2, 7):
- from xmljson import cobra
except ImportError:
pytestmark = pytest.mark.skip("ACI Ansible modules require the lxml and xmljson Python libraries")
diff --git a/ansible_collections/cisco/dnac/.github/workflows/docs.yml b/ansible_collections/cisco/dnac/.github/workflows/docs.yml
index 1f69ba0d6..46ab0dbc2 100644
--- a/ansible_collections/cisco/dnac/.github/workflows/docs.yml
+++ b/ansible_collections/cisco/dnac/.github/workflows/docs.yml
@@ -6,21 +6,21 @@ on:
- v[0-9]+.[0-9]+.[0-9]+
branches:
- main
-
+ workflow_dispatch:
jobs:
docs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: configure git
run: |
git config user.name "${GITHUB_ACTOR}"
git config user.email "${GITHUB_ACTOR}@bots.github.com"
git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/*
- name: Set up Python
- uses: actions/setup-python@v2
+ uses: actions/setup-python@v5
with:
- python-version: "3.7"
+ python-version: "3.11"
- name: Install dependencies
run: make doc-setup
- name: Build docs
diff --git a/ansible_collections/cisco/dnac/.github/workflows/sanity_tests.yml b/ansible_collections/cisco/dnac/.github/workflows/sanity_tests.yml
index 32d46d478..e974d81c7 100644
--- a/ansible_collections/cisco/dnac/.github/workflows/sanity_tests.yml
+++ b/ansible_collections/cisco/dnac/.github/workflows/sanity_tests.yml
@@ -5,22 +5,30 @@ on:
pull_request:
schedule:
- cron: '0 6 * * *'
+ workflow_dispatch:
env:
NAMESPACE: cisco
COLLECTION_NAME: dnac
jobs:
+ # https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix
+ # 2.14 supports Python 3.9-3.11
+ # 2.15 supports Python 3.9-3.11
+ # 2.16 supports Python 3.10-3.12
+ # https://docs.ansible.com/ansible/devel/roadmap/ROADMAP_2_17.html
+ # milestone is 2.17 until after 2.17 branches from devel
+ # devel is 2.17 until 2024-04-01
sanity:
name: Sanity (Ⓐ${{ matrix.ansible }})
strategy:
matrix:
ansible:
- - stable-2.14
- stable-2.15
- - devel
- runs-on: ubuntu-20.04
+ - stable-2.16
+ - stable-2.17
+ runs-on: ubuntu-22.04
steps:
- name: Check out code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
path: cisco-en-programmability/dnacenter-ansible
- name: Create directory
@@ -28,9 +36,9 @@ jobs:
- name: Move repository
run: mv ./cisco-en-programmability/dnacenter-ansible ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}
- name: Set up Python
- uses: actions/setup-python@v3
+ uses: actions/setup-python@v5
with:
- python-version: '3.10'
+ python-version: '3.11'
- name: Install ansible-base (${{ matrix.ansible }})
run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check
- name: Run sanity tests
diff --git a/ansible_collections/cisco/dnac/.github/workflows/sanity_tests_devel.yml b/ansible_collections/cisco/dnac/.github/workflows/sanity_tests_devel.yml
new file mode 100644
index 000000000..98b549491
--- /dev/null
+++ b/ansible_collections/cisco/dnac/.github/workflows/sanity_tests_devel.yml
@@ -0,0 +1,32 @@
+name: CI Devel
+on:
+ workflow_dispatch:
+env:
+ NAMESPACE: cisco
+ COLLECTION_NAME: dnac
+jobs:
+ sanity:
+ name: Sanity (Ⓐ${{ matrix.ansible }})
+ strategy:
+ matrix:
+ ansible:
+ - devel
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ path: cisco-en-programmability/dnacenter-ansible
+ - name: Create directory
+ run: mkdir -p ./ansible_collections/${{env.NAMESPACE}}
+ - name: Move repository
+ run: mv ./cisco-en-programmability/dnacenter-ansible ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.11'
+ - name: Install ansible-base (${{ matrix.ansible }})
+ run: pip install https://github.com/ansible/ansible/archive/${{ matrix.ansible }}.tar.gz --disable-pip-version-check
+ - name: Run sanity tests
+ run: ansible-test sanity --docker -v --color
+ working-directory: ./ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}
diff --git a/ansible_collections/cisco/dnac/FILES.json b/ansible_collections/cisco/dnac/FILES.json
index 3986f5776..7286b9cd5 100644
--- a/ansible_collections/cisco/dnac/FILES.json
+++ b/ansible_collections/cisco/dnac/FILES.json
@@ -2818,7 +2818,7 @@
"name": "plugins/module_utils/dnac.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1e4ec066734657d8a31d57fdf241dfb7b21e88d042db1fea1f65f2f09b7ff24",
+ "chksum_sha256": "f36fc397baecb8b3936be4de24ebb50c5fc2c7bc3b3ed76d5cde908b715fd0bd",
"format": 1
},
{
@@ -2832,1085 +2832,1085 @@
"name": "plugins/modules/tag_member.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "203c909628aff2179480a93f6e37ab0a16e075db1c288c024e61455242e7dc81",
+ "chksum_sha256": "34fdb2053f4dbe10ec14ed19fa2207895d307dba5ea319dff4ec631cd71c589c",
"format": 1
},
{
"name": "plugins/modules/disasterrecovery_system_operationstatus_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "169d958c1852cf2c344f64539855c6a6b189217d00aaae488df74651596ab5b4",
+ "chksum_sha256": "338fc2d9fb90e5a71ac2d4c6f8cf7d28dc25869f5d2ef6fdf5757e23b38edb4b",
"format": 1
},
{
"name": "plugins/modules/network_device_by_serial_number_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "454e39903902ff3ca060d8fde9d8f63109351e9012a6409e9cda63eb018de397",
+ "chksum_sha256": "333d4019c7c97edb935b5edc2dbf6f31ac01a9fb85edbcc4970cdf10838abf54",
"format": 1
},
{
"name": "plugins/modules/wireless_enterprise_ssid_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de5ae304337527808b45223ee75b92ac6e44a745594986860c8dbf534cafe4a0",
+ "chksum_sha256": "77347253283a1530cd0fad6437990a9fc4324810cd8b32ec6f9eb938d3d9d156",
"format": 1
},
{
"name": "plugins/modules/sda_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b3abf7c124506adb650e100e25ff93095e8d44f88970edeac372829f37b301b",
+ "chksum_sha256": "bb754d9e70ec973e1a807c5725d33c0eda80eb8c5c92cede20dfa29865f90822",
"format": 1
},
{
"name": "plugins/modules/network_device_custom_prompt.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f4ffb70cfcad7ccda83fe1adbc105a687ff29f84158b2eafd310560404ba6cc",
+ "chksum_sha256": "80d8f21b58d669ec05a6f5d3e9a0cffa4a9acb12497202d5d7f73fa6f178326a",
"format": 1
},
{
"name": "plugins/modules/configuration_template_deploy_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb7d0b67ea6d91f6e65a11b06df6b9ea0b3836814e6cb3d4ffa1e769deff4ffa",
+ "chksum_sha256": "08013512def343c074bf7c61562eb19f7d032e068c9c7490a75ef4f056a745af",
"format": 1
},
{
"name": "plugins/modules/file_namespaces_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c317859717dac84425184ebf9b11f48f6cfec9d6104b8a5e09f7fa02d22d7b4f",
+ "chksum_sha256": "f4321c28883bf4ef2f5c2e2138ba553eef2449a64af6fec22f70f942fd185a10",
"format": 1
},
{
"name": "plugins/modules/syslog_config_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "252947ca52152d098f82596a66adaba99f8a26c96aa5f746eb07d42d99b11a1a",
+ "chksum_sha256": "64fab4d7ca2e088eec6df77a7b34dad99413db65e0d1e2dc1bc1df087a03f958",
"format": 1
},
{
"name": "plugins/modules/buildings_planned_access_points_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "904446f88544bfed37ab92855b5b3f05ab0dafad096689e6a45cbaea631d55c6",
+ "chksum_sha256": "913eac273b931f533e656c155798c8cb6f6470cb162d11ee99b4bc8da3494970",
"format": 1
},
{
"name": "plugins/modules/reports_view_group_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6d99b212f111603c01bcc4c7f1bff2ff589825f2e583c8e2559dad43055a0c85",
+ "chksum_sha256": "851bf33899e8784e2d86d5c1cfb2bdb5694001ee71acb73e0a8386720e2eb399",
"format": 1
},
{
"name": "plugins/modules/wireless_provision_ssid_create_provision.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bcc7b579d54ffc26c1def2f4196367b2eb758d18c143249122fb43a9529dd89c",
+ "chksum_sha256": "cded1c74ad3da8fc10d9ada27632cdd8cc36d904fb1fb8150754160d6539dbf3",
"format": 1
},
{
"name": "plugins/modules/pnp_device_claim.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a6371657e6f9fe7e968d118d7a7f5e5bb1da056535daaef24e441b78d381bf16",
+ "chksum_sha256": "602231c84933ddd1e3ee06b665a6732c14d2789ceed318ab2a45cc7b1d37c554",
"format": 1
},
{
"name": "plugins/modules/snmpv2_read_community_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cbe2cebcfc426a79bb8ddf73979d1f089d4c09ce7fac9f98009d4ee9c17bfdca",
+ "chksum_sha256": "233bb1488321b2efad2aac315fccb11a4ab4ff577638f6a13f368e776346960f",
"format": 1
},
{
"name": "plugins/modules/snmp_properties.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19254d3864bc2b7c3b902d500b9dea3c18b394ddcc751ed74f2e3f16fa176f8a",
+ "chksum_sha256": "696f1758dcdb3a1d7baf721a1d3116f0d1708179ea191a11a3a156e4206234d1",
"format": 1
},
{
"name": "plugins/modules/wireless_profile_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "02d3c53adadf11257d89c1b9e1d616459358fbac84e6e476070984e9b7b466ee",
+ "chksum_sha256": "c7b6af622e5a439f772afff88f0d4a08b643539de664e06e04236eadd4947fc8",
"format": 1
},
{
"name": "plugins/modules/network_device_config_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "05ada1ef97871761da405e8ce7582f2ad7fb743e0c0c6540421e94baa94c9d6a",
+ "chksum_sha256": "35f355bdab72a72b05cccd892b9f9746aca19892ae563b3d2ae7ba34801baf24",
"format": 1
},
{
"name": "plugins/modules/tag_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "91a490365698f866a3a5ff9e8ec155137f2cd24b7e197628cb67f16a17cc0a44",
+ "chksum_sha256": "572dbeaf9d5419df7af96b1d25e4acf37aafafc515b144eb5e2f1718e5e48a5d",
"format": 1
},
{
"name": "plugins/modules/site_assign_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0c6afa5b7e46cf956f8bd6d030b5f16e38675a7fe78d84f2f265dcf1a744d419",
+ "chksum_sha256": "a24bf8e37412386945e0a1285f305c3d00c3dfe546693451cd0eaaf09ea58fbf",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_control_plane_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "81d97f3aa30c6dd3aec636bfee7aeaaa8b3c7e0579ef437917a2c7963f5f460e",
+ "chksum_sha256": "9e1fc3c6997610fb5eb58da1ff86cac1c2f12fe29f570b04c21f221d8eff08c0",
"format": 1
},
{
"name": "plugins/modules/profiling_rules_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bca7cbc7c41b1ba80975b3d23fe4c05d42908852a4b81b56461e2342c3db9f99",
+ "chksum_sha256": "d7ec7710c2e4481aa1380b07cffe76c8d5c5563c6e45b7592a6cad08d3fe71b8",
"format": 1
},
{
"name": "plugins/modules/roles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d62bd99d36a17041da882dcfb46a8c59b9394bf6c794b93d8e63d1a9777f5fcb",
+ "chksum_sha256": "de94f18450380a4392ddf55fe23341d727d5c38401e9e4bb145768f1f549d312",
"format": 1
},
{
"name": "plugins/modules/task_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e5444016cfeb218c4b6e19d04d0d91094d22d5955f30b412628f030ac91c634",
+ "chksum_sha256": "c939839ee83d08e2568d652d43cc2dd043f7f4bc45bdf6b643593990b318f5f9",
"format": 1
},
{
"name": "plugins/modules/wireless_sensor_test_results_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "453c901bb4c12bee21a750e0ef18fd8b031d15ab2c4d26d819c5a23ecf3b1f75",
+ "chksum_sha256": "2aba1ead06b80720d76b8d2ab036fdda406b4c85bf12520413d3bdfc07b9401a",
"format": 1
},
{
"name": "plugins/modules/wireless_dynamic_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6375d7e2d6845946accc418fcdaa8dcfc99df04f8a663df722b023b51ca497c7",
+ "chksum_sha256": "060b815aa82c2113c3ce30c15d309e5ca171dc20bc8e03b451e758b5804f717a",
"format": 1
},
{
"name": "plugins/modules/nfv_provision_detail_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fb031a00e038a41b28c3f79eb4ce5b15d00d45587342ae4b47b55b8ae6165027",
+ "chksum_sha256": "f22479fd4fd40caef85c62bef81ee9f9d95ec8a38d7fb4d356d333ca9790e148",
"format": 1
},
{
"name": "plugins/modules/interface_operation_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a6a58a9012fabb20547a7773a84cc4272b7528e870a77928949e13cc0699b50d",
+ "chksum_sha256": "752c7f20ff323991e808abe801061cbb02fbc322ab7c1291707a5689c87c9bcc",
"format": 1
},
{
"name": "plugins/modules/tag_member_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a191cc31927b7aeeddc64eaa65eee654178e1b04d52296e93deee41d4bfe7b06",
+ "chksum_sha256": "8ed423053ce775e469f32b9082d8fd6a5b4c2a72e122bceca773e2196c5c3b80",
"format": 1
},
{
"name": "plugins/modules/lan_automation_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "94adddc8a9a3631e0f823a5eebf6c79b35dc847863d3d623c4635f4b70915cc0",
+ "chksum_sha256": "ca3459c865c3cfd1300abbbe00327ad89370e0171dc9db54ceea74bafc69649e",
"format": 1
},
{
"name": "plugins/modules/endpoint_analytics_profiling_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d2ccc3c8e87787793ab67415146ab0c593d8d4fc9b4c9930ccaa366806fda0b8",
+ "chksum_sha256": "0ee09af1955e780d336f71e53f5aade0fef05319a22c0a056a07dd5230c157a4",
"format": 1
},
{
"name": "plugins/modules/event_syslog_config_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5ceec8de938e398ad905706ced95bae8f98b372805637b9d095351e57bfb222c",
+ "chksum_sha256": "97fa31b07f0261b63564720aae6185620f35e7fc86a5a154a8580c497c35c7c6",
"format": 1
},
{
"name": "plugins/modules/business_sda_wireless_controller_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e53deeff2c7302fababc9cb81cd82bb303e745946a70029ea825e1e55f417cf",
+ "chksum_sha256": "9005bf199793e794b60b820b8a3c35e37d460facfbb78eeac939899ebeb5953d",
"format": 1
},
{
"name": "plugins/modules/user.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "15816f3c76bdd77734d55c36d2aaf6af8894d63e5191e21f78e1e9cfe4b8a207",
+ "chksum_sha256": "fc5b1bd717058796844b4c90dbe087fe9b5161b3addd2b73d52bd52f98e29766",
"format": 1
},
{
"name": "plugins/modules/associate_site_to_network_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0678189c515d58820a676a89f138a0d114a598a8058da9d43808587fc2ad1d9",
+ "chksum_sha256": "602abf01696377306e1a74e83b6fc749a3438adeb6531133a2a57ecfa7325e70",
"format": 1
},
{
"name": "plugins/modules/compliance_check_run.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c45f742ec63b5dccfc99b521fa209e5de0751bd3b31dad01112196b122f4912a",
+ "chksum_sha256": "72ff23d614916219c240716a8201b6db09a5948defa6ca3f84b90bcc74c619d8",
"format": 1
},
{
"name": "plugins/modules/pnp_device_unclaim.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4ff71f21b9da847e293450033954de0ed0214c1bf81405dc8a84211e1a8b1941",
+ "chksum_sha256": "c4bff9d9b35533a014fa68451e2d3ebe6ab2c7298b1c629ab49f78214e0169bc",
"format": 1
},
{
"name": "plugins/modules/interface_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "44124a84201011dd914c4442137dd4ff17eecd755086f9e959cc930371e0975f",
+ "chksum_sha256": "9d154bfc41b0268be60fc3bfe934d162d6d3c7889f4212c138238fdb59beec62",
"format": 1
},
{
"name": "plugins/modules/lan_automation_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3f59906e42a06d33bb7f50a9ef71e42b8f9ebed3272d3c021e8cf9857ae7f20",
+ "chksum_sha256": "01ce3ce65cc63c09db01ed03b67ec8c6b3a617e9cc47aa6c1cf6315ae3ac7a60",
"format": 1
},
{
"name": "plugins/modules/pnp_device_authorize.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0e2b62b5ead00baef86df268bcff38b458e171e2835303261b80d9b8208fbe25",
+ "chksum_sha256": "48371d790ad877e32f1397e82d42245bc66da1558dade583eca97e303d6f4f2b",
"format": 1
},
{
"name": "plugins/modules/task_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5ebbd9c4361b97087aa51846b2806e3122704818b96a6cf5fa2db3b9ff7a328",
+ "chksum_sha256": "96121154401e39130b0faf0da4714179d91fac8c54ac7b7e0e742a2e4f3bb3c7",
"format": 1
},
{
"name": "plugins/modules/app_policy_intent_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "abb3f3e155c35a773565ea043a23a02e449c3b8d4f09bdd276173cb2721129ae",
+ "chksum_sha256": "c62d8cfc4d50b9dad0c73184b3e10acfab20ef9267cbde21dd20ade5f913e98a",
"format": 1
},
{
"name": "plugins/modules/pnp_device_import.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4af97e486e34b84e313106034f9975fc662621f333dd146e82e70d5213d57ffb",
+ "chksum_sha256": "60538898d31429714400e1bee616715662a6dc0868c10fe642aaf2c4d8804411",
"format": 1
},
{
"name": "plugins/modules/authentication_import_certificate_p12.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be9370de13872b64e89aa4688f426207ad7cb36260c67ae838a6f8e0939188f8",
+ "chksum_sha256": "cddda97a5a8bb76dfb9913c6ced565b770c5c95b33375e626eeab2f1b588be94",
"format": 1
},
{
"name": "plugins/modules/sp_profile_delete_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2db4c0b1df0fb25326f24d9c60c0fe2dbba094d38e355bf96b1f65ecf8ac8c45",
+ "chksum_sha256": "0111f60a0dd6a58af385bf585064db9679166cf1f2636cb820308791ed2797d1",
"format": 1
},
{
"name": "plugins/modules/topology_network_health_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf2fb1801951e493fba7308a4274be2241b4df4cfb195753b88d1f2749f649ec",
+ "chksum_sha256": "85f8527871c7e42a00295658f92bb184d284a5755b1e5ee4f21c4d9a3f8b449d",
"format": 1
},
{
"name": "plugins/modules/wireless_provision_device_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19c1799fc23fbf3fd97a2f3a3ad749d6031931575136fc01637fa855b49b47e8",
+ "chksum_sha256": "097a942722519fd081a35577b59dd618719156d3cae7b1020e4c089d7836c191",
"format": 1
},
{
"name": "plugins/modules/discovery_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "08b06425c4819419c08b077df7e8f66066357a54be2364c8888b25a3a06db5b2",
+ "chksum_sha256": "dd2feb16fbcfe5032e7e1728e28bf8b350ee9db828d94c5aaf55c4e9a92b4e57",
"format": 1
},
{
"name": "plugins/modules/device_reboot_apreboot_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a1b9e994c90c4ade0c9b87e530cc0d090d5df93eef287dbbb8c979deef9f599",
+ "chksum_sha256": "e22d725706aba70caefdc1734ffd4fc84f98dd4b8f06813147ae00589bd973e1",
"format": 1
},
{
"name": "plugins/modules/discovery_device_range_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1f2f3fdb22c9cf5c909dbcdb1475d6b54f82a4a6ea233c3e3fb896e026a300df",
+ "chksum_sha256": "5849703f79a8c63a95508fd8cc76c37fdbd7ddd554f2d446077f17f06f80ea03",
"format": 1
},
{
"name": "plugins/modules/event_subscription_email.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1b2d71eb95c5bb7161305eb06427fc780814251ff09ef7e3640155e04128ed79",
+ "chksum_sha256": "b20e8d01d362ea518177479564b41475bb22390529bd9e146a43d0b3574cc7f3",
"format": 1
},
{
"name": "plugins/modules/sensor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "92ebd09304b9d1a42d2e011fa9b4abfd9bad86382dd8945993bfa7d22d4d483d",
+ "chksum_sha256": "61a1f62c0323db3cd354dab37154431035575c4d30f56de9526fdfa0e8e95282",
"format": 1
},
{
"name": "plugins/modules/integration_settings_instances_itsm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f69b1536b8496c66d7aba8ad2e681c6e41762106b63a1567e051416ec7e1768f",
+ "chksum_sha256": "4447c1484dad5ad8b0c6e581a5a79e8a00cd25d5c919960c83a7bc8ec73f0c70",
"format": 1
},
{
"name": "plugins/modules/site_design_floormap.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "83fe70f63be605e69b1e808223942566a24c6dcffd78c1f008ba3dc9d20d9aa8",
+ "chksum_sha256": "d602258e6a2793627b1288a73251242d9ffd1ad8e50a0a61414295ea4c77a53b",
"format": 1
},
{
"name": "plugins/modules/pnp_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aa8f6e21144259fab986674b6c92acf78b620297976704f4a93b43a265b67f08",
+ "chksum_sha256": "01319e51ca12527ac93fff93abecbfe9466a2dc2e9e97517c172a1d3e2d4b7ee",
"format": 1
},
{
"name": "plugins/modules/global_pool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7d49cd0161314e7e14177fa026c94262dc23f43be0490272d7d1ee1e0ecba399",
+ "chksum_sha256": "e3b5942ca9610d638861c899a28b7edff86176ef90ffb6aa84c74d07398cc12c",
"format": 1
},
{
"name": "plugins/modules/device_interface_by_ip_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "12100e56b2e3b321eed3abbd9da9a1b7b72bc382828de29a1b44a95e973e5272",
+ "chksum_sha256": "247b37667e6600267377a09c95d468f263cf393c9269cc3fe7352a86391d7b96",
"format": 1
},
{
"name": "plugins/modules/network_device_chassis_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9022f3da91c1718d963b207de578bdc23e936e317d8e9c7d6b89e5ec8ff3bffd",
+ "chksum_sha256": "61e6ae2c6c39475d4e508591966135ac0715bf438868fa6f2421738e3d460899",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_authentication_profile_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "edbe6c125b774da02e2ddaec0d1209954677a3802c60fde88850b85f71fa7ce0",
+ "chksum_sha256": "ba207e06e273caafae8ee2031bf163b960f08dfbde7e5211489ea78dafd1d1f5",
"format": 1
},
{
"name": "plugins/modules/client_detail_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f114628126b5e913083b833c521fa086ef784fc24e7879cf1d74cb663bd7a4be",
+ "chksum_sha256": "50d9012553e45a39231c185123ed81d2bc273ff0440f9231f88578efe4ab301a",
"format": 1
},
{
"name": "plugins/modules/license_term_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4f520a32196e272e231ce166b08afcb91472631a779e8a7fa7e03bacf66682b3",
+ "chksum_sha256": "93698c9894a43757eef2431a0db6c00ad611440dc70aec7169ebca0cf5875f61",
"format": 1
},
{
"name": "plugins/modules/license_device_deregistration.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eeeab2bd24a92035122df2d90216837ea1c661b074b8ef6659ad9f52ebc7cac0",
+ "chksum_sha256": "ddeed833b64145c5d88b04421115f39d30effab218656bdedeb828c869c50764",
"format": 1
},
{
"name": "plugins/modules/device_interface_ospf_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b0060a5eb9b34449bed92581966ea6aa8064594543280d845386250fbeaed033",
+ "chksum_sha256": "ed30d8d2a7ee30d254452ca157bad1f22117a286d37fe9bef525dbd5582c35f9",
"format": 1
},
{
"name": "plugins/modules/sda_virtual_network_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e0789344a1291f94ae02145fc6b12069ef843f83db8ad235a2ec2a0084c79e7",
+ "chksum_sha256": "35c830cba1f0a91954ae39b856aecd01ad51dc0d5c1d10d891671af5ed6e4c6e",
"format": 1
},
{
"name": "plugins/modules/discovery_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2b86177971e4457bb94184fcaa7f18c7f79eabd14f7874e25dfc32768ac910db",
+ "chksum_sha256": "9503c3fbb9a27e54e0b290ef82ac1255de261218561abdf11ff0204bd7f4517f",
"format": 1
},
{
"name": "plugins/modules/business_sda_hostonboarding_ssid_ippool_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cf348fcaecb559dbca49ce5b5d9e540e48812b696f575c192676474c23b46da8",
+ "chksum_sha256": "02000c3c68ecb37e768d5938da1bb59a84df7a7e252684dc80f5adb287df972c",
"format": 1
},
{
"name": "plugins/modules/swim_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1e32599b2c25efd5a1be3e66e8ea1bf0b6871218bde74b2e4e828c67d1bf994",
+ "chksum_sha256": "70b080cb6316ab39cdc8e1d6ace2ff128760698778c49a134c576947c942e515",
"format": 1
},
{
"name": "plugins/modules/execute_suggested_actions_commands.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19844c72afef6beaa1d1b72bff597f7a80e73b09ba3a68ea2c5ad042f0c16662",
+ "chksum_sha256": "f66085b17d99d7819eda3961cf0cfcb7b9dbbc317908c0f01dd61898236f203f",
"format": 1
},
{
"name": "plugins/modules/business_sda_wireless_controller_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "84f5b496f3795549f66eb8a40401e8151e0e0334b3a0ab81afe9833db612a216",
+ "chksum_sha256": "b08d11477f17e38c0b2227c8ce36413c494d9a50a6a076ae12859cc504d4abee",
"format": 1
},
{
"name": "plugins/modules/network_settings_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0a00e9cece5905436095add9b58a97e5292f9f941df31af8bd5f77e5a665352",
+ "chksum_sha256": "e72eded9f5e28624682f928bc3791f830e6964f28d4bb57b76fe8671d44f5fe0",
"format": 1
},
{
"name": "plugins/modules/wireless_provision_device_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "12136ddb30e224adc6d3291346817097d4446fba99bb5eb7e747d8a3d1585a92",
+ "chksum_sha256": "9db7025f8f65a52d3f0752e767c2c1c9613a80f8007b4e78315fa70e945c6d28",
"format": 1
},
{
"name": "plugins/modules/network_device_sync.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "70d9cffd145e26f9506673554dcd917054d0514d5876d7e13307c88b290669d3",
+ "chksum_sha256": "78f9ceb7e7b4371e85c3cd52f71c6e6b307ffd23cdfd37111b544928422757ab",
"format": 1
},
{
"name": "plugins/modules/wireless_rf_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4327a68c352ee3a396e3dbf795daf7ed3be99c0b95101d2c0cfb06883c27344e",
+ "chksum_sha256": "5472514c55110035ba8c47f60313201f8b49b0bf9c2b2bbac47c7c5dc08c5cbf",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_site_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "78bf22da9023c2d264ac803a007557f506822dea4daab444662366cf56da0f33",
+ "chksum_sha256": "508c83e7ef73c711338d199b4b05eda7e94bfc4831958ca8f1fcfd62a77f8b5f",
"format": 1
},
{
"name": "plugins/modules/event_subscription_syslog_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f00b770e9beaa154270e9f6484a76a2cd9bab29c121ad80cccf9239a23bf65a",
+ "chksum_sha256": "37591b77c22a26b1ce79bba87f94dc5e1c96a94da9ac5dd797a74960a646bb05",
"format": 1
},
{
"name": "plugins/modules/configuration_template_import_project.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "84adb47b58a6d3a6783475832347ad2168d329157d34e3ca2be8ed20c8014a69",
+ "chksum_sha256": "99a2b7ba0b8cff781db383abcd667cd23d02d1991b27deada9c2802f56870bd7",
"format": 1
},
{
"name": "plugins/modules/topology_vlan_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "db096d3fd5525976db78b3c4a91e7ca8b7d51f69413daadab850cd4ab7fa04c9",
+ "chksum_sha256": "70aaf59cc3a489a2f4aa5d0b052d7aeb89c09fc4435c0513beeafffeaa0e99de",
"format": 1
},
{
"name": "plugins/modules/lan_automation_log_by_serial_number_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fc24198351f08f730bbd6af533d2cee6fcfd8602fb1ffa46cfe79c8cd7105dbb",
+ "chksum_sha256": "205f22f0ec447a840cafa8b219e22b88636967ae405420cbfc99a99d9c64bbd5",
"format": 1
},
{
"name": "plugins/modules/service_provider_v2_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fb76e209b0560eae94118f3145de3459fea00f3ea869b44fd2fd987889f821e8",
+ "chksum_sha256": "7887050a78e4710122fa71fa4f758063a83b3ea50b6286541dc4c7cef6bed68a",
"format": 1
},
{
"name": "plugins/modules/site_health_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4993391714d00efd42500ca81834ecce34a31b559fdee18ec149693528920dd1",
+ "chksum_sha256": "9b20f00dd0a3fdd8e623c90781e001de3488e082ff7f78d3d0c2a78c2e8cb7dc",
"format": 1
},
{
"name": "plugins/modules/event_series_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f7bff6806a626c0a80c6440ead86d4136386cac6a166015f145d6d1c1a762ee2",
+ "chksum_sha256": "e8ccee65b615913c707e66532d126931f8bcac3fbdea044d97151642c57d5423",
"format": 1
},
{
"name": "plugins/modules/configuration_template_clone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "476d838d47b3997dc18a371395ff3cb6cce7168726c025cd1c76dab8165f7352",
+ "chksum_sha256": "7d717330707d9fe6eea2482a6108756b83227fc12c89d0be6133015f5cda28d9",
"format": 1
},
{
"name": "plugins/modules/swim_image_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cfca9340b6a13a2bd5a087ff3c6e14c4a23c766477e5d31a900deaf0791f882b",
+ "chksum_sha256": "bdb0d985b3d8e3e87099c574b5c06770159c6b937f86d6aeda7e7d1b6b80cb94",
"format": 1
},
{
"name": "plugins/modules/sda_provision_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c2739b9dca50d41ea851746d65d3f497974991d2cebad4c5a63f5c14b68bbd5e",
+ "chksum_sha256": "c368e9b1b79763ca9c1c0ac900b575b13b40463165301e4a50d2505c46cfa4b8",
"format": 1
},
{
"name": "plugins/modules/pnp_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "46895eac51c54b6786d2d15fabe55a7fe4c38db13f6be4701876ad0db8ca1693",
+ "chksum_sha256": "63951047324164840c1b84ad51e6861d3015a7cb1d247024a43d725251ddca69",
"format": 1
},
{
"name": "plugins/modules/system_performance_historical_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "580525d7d40982c76a858fd37f62a9a17cb605eaab0b12f01a68ba007490bd6e",
+ "chksum_sha256": "db43d9616769582ea8ac005948a39665f274157f4f8e165361f2541a9635de43",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_control_plane_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1e486a19e64166bba9aa986e01c9a0627c0b384760f24bfd412e7131a12e42a",
+ "chksum_sha256": "a01c251bfa7e2011ccd7d311d4dd0c85428790ea78cb3180f878004d22551241",
"format": 1
},
{
"name": "plugins/modules/eox_status_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7978f697c8a208f25b7fecd54ec1e9fef590d25dac54f0f31b12db93584d3b1",
+ "chksum_sha256": "64980b0ccb39275f2b8dd625f90fdd001625be11fb2d4342f60e2fe420af8df9",
"format": 1
},
{
"name": "plugins/modules/threat_detail.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff998c518ece001129362b6e239b1d043d377b6bde90d2dde7899f838d1ffa0c",
+ "chksum_sha256": "865c8e83860d3a399ae0420597636dc67ae83c826d1ca2f2d40eddcc4c130def",
"format": 1
},
{
"name": "plugins/modules/configuration_template_version_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d187096538d665d3630c1ed3edae1adf425d093b552e9dc179050ea1f8a53414",
+ "chksum_sha256": "c1b7aa1f6a2ec4ed5ade524168e4c6804d0694e29f5cbf9acab3502ee4e7ad0c",
"format": 1
},
{
"name": "plugins/modules/syslog_config_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "31516b0a94c60248bb48e8521d6e3f11a52b9465fa4fb76212142d711cfcf6f1",
+ "chksum_sha256": "26816bb5140d94d96173d69a16b49a0132e6febbb3ff3eb1e856746a77eca271",
"format": 1
},
{
"name": "plugins/modules/nfv_provision_details.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fd9f58a5a78e6cf3b9ef4a18828bfd3d3c71bf9067bddeb0f21cbd6257d960e7",
+ "chksum_sha256": "8d59bcb7f9b05d8a5268472ee86786c1dfe55d168c22f05bb08eb66fb32ceb53",
"format": 1
},
{
"name": "plugins/modules/event_subscription_details_rest_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "12dc1a8fabe5dae7f1d74727d8c9bb9f0084c774d33131083b32a175c4eb6608",
+ "chksum_sha256": "39f3ded1e5b9d76cf7e0ea7a54e73bea15bcc76a90ebdfbb78c5295ad86c19d5",
"format": 1
},
{
"name": "plugins/modules/discovery_range_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8ba689381e0b1232ccf4d48f2635e19e96b2d217ec30f0d460f21becf1991b93",
+ "chksum_sha256": "584f18f492f252b82331acf732253ea92bb96fd989cfe2545a73884106fedc4b",
"format": 1
},
{
"name": "plugins/modules/site_design_floormap_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "16a61115901f52e2c0486eecff5fae808a20a5b5165b451f345c151cec3c02ff",
+ "chksum_sha256": "22f432894c23601c08b42da3f77b42ca341e3a8075c249c83a046ab97e999404",
"format": 1
},
{
"name": "plugins/modules/discovery_job_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74fa4b86bce115c77937388bf8c30dd1c212c51c9359bfb30a22ea347cbe228c",
+ "chksum_sha256": "f623ef881ce3592e32ea25604dbd075d837b9a5c1e8c1997178bd0474c425cb2",
"format": 1
},
{
"name": "plugins/modules/global_pool_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c135645efbd68ff6b09096ba7f37bce0049bcf344133060f5c05a2e58a7c0000",
+ "chksum_sha256": "b377a33bab9641cb9756c14252cef50419eb6b49f131cf7cb57195a40a1d096a",
"format": 1
},
{
"name": "plugins/modules/pnp_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8f235117077b827547ba282ab803569826a3995bd54181520595f11dcdf0ccb",
+ "chksum_sha256": "69fd7b9a578ff1b2aa1a3832a5b15caa0f53794a28881e2dd210cb8d2a54544e",
"format": 1
},
{
"name": "plugins/modules/device_replacement.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c32f6b4a2041ea18f9c199868c982a5a5f4d9c0c857ab95b77ea044f9b925b49",
+ "chksum_sha256": "76619f7b6f994527b0048eb03b6f197872ae889bb692fd6c5a67ce373610d405",
"format": 1
},
{
"name": "plugins/modules/sensor_test_template_duplicate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "94b795d09e7eb4e147aa0d43def6667526f92ae82d09d0826242899df7573721",
+ "chksum_sha256": "bdcbee1705c8ac319ba71af6725dad6164a78605bdb0da4ebe833539701f196c",
"format": 1
},
{
"name": "plugins/modules/wireless_dynamic_interface_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "256ec24d864d6e46e1379dd40e292a558a509cc4abb3948af7730a5d01256365",
+ "chksum_sha256": "47d74bea911de6d0409ee28fdc3a86dd205102460acf1dbe0dc057ccdf09babc",
"format": 1
},
{
"name": "plugins/modules/discovery.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f5200ccf2fe958bf6ea1b31e49ca942e561f763352a8b858a8e86a5058a7319",
+ "chksum_sha256": "831619571aa2f0c113400c8fa930b69f305fda6fbb8621dcb8dbcd871cd0a279",
"format": 1
},
{
"name": "plugins/modules/wireless_accespoint_configuration.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b8289bbf4a1b7aa90fd2b0c3e3f178558a61e5aa5cbe86ee0ab2323c1a96bea6",
+ "chksum_sha256": "141d3a2c603c8b4f62466e0e6db45672bae260ae1a12f487cfe2c20026dff748",
"format": 1
},
{
"name": "plugins/modules/qos_device_interface_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7c8c372defb3175519a0ed18ab65de12f7cdb7d6c42a83096022a163ea1843e8",
+ "chksum_sha256": "d3a84c0cb694ca3c097b9ff30bc976aa135a2ac91181afe2e38d5b187cb8530d",
"format": 1
},
{
"name": "plugins/modules/provision_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1edf799c5bace445ba47dd5ab7edac249819cded67c0c02c86fec3c6573aaf47",
+ "chksum_sha256": "eee5fd64e6ab7543062b2ec3750196a24c128bbda13be65068d0bd74750bc3d1",
"format": 1
},
{
"name": "plugins/modules/pnp_workflow_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "51b76732895b15f2c0b44f86a4e4779a7857003a67d61327c375e7c3217bfd97",
+ "chksum_sha256": "40f26611c60bf2ec8533a82785eee65bb2a247be209105a002f1cb1dcf7081b4",
"format": 1
},
{
"name": "plugins/modules/license_smart_account_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3445ec738f2b098332069e43a52018612f20776e07fc7180d6a2756a4d67b6c0",
+ "chksum_sha256": "dd3bffa15d967017ca8313b2e75fa3c467b9282da5baaaac7360b5be9319a5c5",
"format": 1
},
{
"name": "plugins/modules/network_device_module_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d3c2dc6102957c2786d7eef87a7125df8a1c6cc6232cc054bcd6701c073cab9d",
+ "chksum_sha256": "d99ee768d2564d3283b7693b1a9f9ffb30bba6647022d1d4cb41daf1b37cfac0",
"format": 1
},
{
"name": "plugins/modules/assign_device_to_site.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "66692e2cf30951ef15947042093c7609a875642c8b31559d0653ec95c0834cfc",
+ "chksum_sha256": "96e597a643befd67693dba086d91ae2fbae6986a98d2956ed112b8dc47ad6378",
"format": 1
},
{
"name": "plugins/modules/event_config_connector_types_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "534789a3e5be6ce3b9bdf8207b6f59fd2014db754d3a5e5941bd098b46d09f43",
+ "chksum_sha256": "0cddf97005b6d88a1880b132aecb16ea2e11cd52e1a6fb198f39028a3b961aa2",
"format": 1
},
{
"name": "plugins/modules/network_device_inventory_insight_link_mismatch_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "314220c437622968514032d5c5e995f9c2685135aab4efc15aabe5112d9e1363",
+ "chksum_sha256": "4d9fc23291299a4966e404b79d9df1bf8c30b038637111640b565c854a486d7c",
"format": 1
},
{
"name": "plugins/modules/task_operation_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c03bb12584fd9811458a83fb3ce3be39d604e5098fa0936e0173caa6f4a0b7ba",
+ "chksum_sha256": "2ada3350d24c3f06eb24f7878a6d47145d565b9d87dfb5474da61a7c5e592828",
"format": 1
},
{
"name": "plugins/modules/site_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "54ad0d4f3f891b4ebdf0f568834b356ce3fae3a977d8707fefae8b7ae9681338",
+ "chksum_sha256": "a8389054876e4e0d52709b43e47a559882e808cfae93b3ece582d2854d7ceaa9",
"format": 1
},
{
"name": "plugins/modules/credential_to_site_by_siteid_create_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fe62a0861858da8c5534313962518b666bc95b9a9e2e931a29f815faceb16811",
+ "chksum_sha256": "6fd1eb16206ca007172456bf66824edf8cc86a7a9c21cd40a4497f2ee15347ca",
"format": 1
},
{
"name": "plugins/modules/sda_virtual_network_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ef032aeeb0615651230b4170cd3570ed98e1b02fcac89eb7ed1f1c0a5fb6ba62",
+ "chksum_sha256": "de5463a3e5a8c767a4620f2b0d6959f03e615c1662d9d1277e421df577515ffa",
"format": 1
},
{
"name": "plugins/modules/network_device_by_ip_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9ac509acdc4c762cb3e857dfd580416711971ce107996a436319507b1c7cfa5d",
+ "chksum_sha256": "753ed26c0934c1cca81a58079b45b8a57e3987f8f7428c722ee906b8ffc35d76",
"format": 1
},
{
"name": "plugins/modules/network_device_lexicographically_sorted_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "94ef35daae89197a574ddc16ce3d40af9fee355571cb60c567d2d789615adb2e",
+ "chksum_sha256": "1ffa1d43fdac74ed390659d347cd2914d48e622ad97edf07136caf763d9bdeb3",
"format": 1
},
{
"name": "plugins/modules/pnp_workflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5f6d1953dfc0f6c6e9888e743d725a644936e5a1dbc104638aa7b407d9493767",
+ "chksum_sha256": "3c927bafdeaeabcee4b03392cb8f833cee992c06df87392bc9850424a9a36f23",
"format": 1
},
{
"name": "plugins/modules/event_subscription_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38b483efd2cbf485c0e7cf897d00e2d7bed3301ae35b7e7f2fe4735eef9a088a",
+ "chksum_sha256": "e3726450f73d3d9a369f6e13df3dfef8da2e6d13aad9070a8bf8101f3353f5ba",
"format": 1
},
{
"name": "plugins/modules/topology_layer_3_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3be4779df4aca09518d8964f4031591abfd39fdd700b8a01375a9f77f5385cb6",
+ "chksum_sha256": "763bc8e38e403d4bf06b8168c4eb875928478eba61089dc829de0e0d91160895",
"format": 1
},
{
"name": "plugins/modules/device_credential_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "88f138a794dc5a42197fc455246f35a747fc5733fdecfec34d510813274a6509",
+ "chksum_sha256": "7d82073fb51ff17af9d0e94ae606ca0a20cad4bad8d0ccdd1fa308a4b4cbfbd8",
"format": 1
},
{
"name": "plugins/modules/snmpv2_write_community_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "66d40b380a308d0c4d463e6c2afbd7e511401995c5ec6cbb8383c04850171174",
+ "chksum_sha256": "cd7292c2440f6f5053ef12fbf76b0a1b27989ec6263c20f2664504f88d867582",
"format": 1
},
{
"name": "plugins/modules/global_credential_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5a29fab81c5dcc34942e0520555106d407c1d5be5ad2350ebe5bb2e3517246dc",
+ "chksum_sha256": "7eefe1e65619a4de2b2075074b53053b0c99dfa795c1142b28069d4fa71826d2",
"format": 1
},
{
"name": "plugins/modules/wireless_rf_profile_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "008c3081fa5cdfea7ec1c7c55005006cbd38ec279db7405d9e324fe4c50f3616",
+ "chksum_sha256": "a6ca9ea355c4df2052d03af05e398cf2d13b971aa7cb492c9fe69069d5fa16db",
"format": 1
},
{
"name": "plugins/modules/applications_health_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "daa4f710c924bb7cef9c5094f875555c9b805122f8897964e71fc4a685dd8630",
+ "chksum_sha256": "463b0623e0e944947016aef514f897154ab1eb1848c1b91f9a9a73c122757c50",
"format": 1
},
{
"name": "plugins/modules/sensor_test_template_edit.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c61fd70d849e2635aabe7ee0681de73480c563c156852e93e3d6e49706cfe94b",
+ "chksum_sha256": "4274322757ed2a99ba127d28c92e6cda2f49f4cf031af6e97422a3a2783170d8",
"format": 1
},
{
"name": "plugins/modules/network_device_stack_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28232e8cbfbc70dca83dd34983d61a61c07710425b037a846553e5102e3e1d03",
+ "chksum_sha256": "c55fd06561816f1bf354e19c0f8ef97fc2de5d21fe57d30e9953b7caac320df6",
"format": 1
},
{
"name": "plugins/modules/site_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d691b4d29437329a12425232c52a9027819b496ccd47e80e19a44fffcbdafc42",
+ "chksum_sha256": "4c0530303d930f81006f318ad9e9df5569163153476b53ba4c0a0fcffacb2b1f",
"format": 1
},
{
"name": "plugins/modules/global_credential_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5635804686b6c1dcbfdd600187002f55c99a6bb2ce33909b1b20754e773f0698",
+ "chksum_sha256": "87ca0d16efa2b308878513ca6be96c9d13bfc99c9f5218ca3742ddbb8b83fb60",
"format": 1
},
{
"name": "plugins/modules/sda_multicast.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "289d7dee1f62e05d7669940ea71920b41ed28aebd07dac84b53503d7c0e7c9cd",
+ "chksum_sha256": "399e17ea2b5769b4096df6b0a13a2cc0ffc7de4a4f2f75afd7f3240a3750884d",
"format": 1
},
{
"name": "plugins/modules/sda_device_role_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f181e587c723787107c7b28b62249b768c61c6b660095bf72e8de1b2b156126e",
+ "chksum_sha256": "2060f3f260e3c7fca652b67872a6232ab819ba5d773c8a6c4d7036aac7de39eb",
"format": 1
},
{
"name": "plugins/modules/pnp_virtual_account_devices_sync.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "534814958e8c3ea6fc935dbd08d60571f10ee8ec64f234877a0c36334088b27f",
+ "chksum_sha256": "f1c8fed58d9c4d513773b7948e03b27765aeceff9a45a74759c07b14af8c4bc1",
"format": 1
},
{
"name": "plugins/modules/eox_status_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3596d5ae0791f33cf9f002543a5183b639fce9e502620a5f8ee08145d4c23961",
+ "chksum_sha256": "5a28ed446010d97b1f21516a3253120c0f0099619c7d033ca97071b20acd7988",
"format": 1
},
{
"name": "plugins/modules/accesspoint_configuration_details_by_task_id_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba466bb29584fc099e2839a25cd635b4807920d2ac6b5032bf5b62678b96ae92",
+ "chksum_sha256": "b5d2c060f6664ccbf75f82150a414c8a6b18a6eb801346041b3233bffe6f97f6",
"format": 1
},
{
"name": "plugins/modules/applications.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c687ea107d2c34cb1eed2256c3beaf1ec0bc93e9498b860b0260a2903bf4ff9",
+ "chksum_sha256": "426447a41c87ed84cfbd9c3ae0830ddafcdaa68a3c6aa732c74a27026e936daf",
"format": 1
},
{
"name": "plugins/modules/itsm_integration_events_failed_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f2236cbf493a04f2b417951e8fd6c9aa12221a42489679b7b8b6a7afd23458b2",
+ "chksum_sha256": "407fc6cb6189f1403844e652bc64ff03cbcea66f0eadd3775185b7487f3f986e",
"format": 1
},
{
"name": "plugins/modules/network_device_user_defined_field.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0c8f47c86bbb2e877ffe5c6c91c5e717650f66d4f2e86e641cc767c8d2a64d51",
+ "chksum_sha256": "a3357526777edc63c0663320959ec9c1d087e5602793111abdcb2d0b8602b4b1",
"format": 1
},
{
"name": "plugins/modules/configuration_template_export_project.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f077d02ea1cfd2971e35cc6b7e8338e5115f7f6ccaef66d001bdfcd701e0b645",
+ "chksum_sha256": "58a0750f67b1831b04ad09fb602f4c47c264b817ff995c0c8ca468f3dfe1e2b9",
"format": 1
},
{
"name": "plugins/modules/reserve_ip_subpool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "40e4454daa55dc0975a3d1edb6192132274686870f7a30d4e3b78ed746920faf",
+ "chksum_sha256": "b11c7cc628c5b50c93abca9d675e14acc91074183dd68e6eb4ecedcc093d1747",
"format": 1
},
{
"name": "plugins/modules/network_device_interface_neighbor_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "859bee561489a592e76de54057ebbc7c566a6c8740051c442d8dd329b67e20f5",
+ "chksum_sha256": "53b55d54fc692e05378ff615c491c2a4c25fa58520ad616af7fa18831011036c",
"format": 1
},
{
"name": "plugins/modules/device_credential_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f2a4e13de9da183ced28ef4ff11c9036c76fcd474b760af56f4d40caa449f16d",
+ "chksum_sha256": "1f9eab5ed7aa33debf4b7652aa0b117b7b6786d538c550bb2999878cdd85d29c",
"format": 1
},
{
"name": "plugins/modules/network_device_polling_interval_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c1c47c56f5d792bd03e85ddde3e0a2538a01f31aba0814c34074438aee07255",
+ "chksum_sha256": "6a8f3d47966abc700d31c6ca0834ec60f94cad60422f3fcbc8d43e7e13ae620c",
"format": 1
},
{
"name": "plugins/modules/network_v2_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29b1e3bd4541c270be72ac7819940415855965505e5254723cc5e438835db48c",
+ "chksum_sha256": "5a831b1065c921dc1a98ab5fff748a83b6322e1ff1d7bf51f4adddd921ea9440",
"format": 1
},
{
"name": "plugins/modules/tag_membership.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d5ec68b09e4009577498372d660f5d7b2e597cd0cad41017553061a1c2cf405",
+ "chksum_sha256": "85e2d7164b26e761166d4f04343289d331610d2bc62665b1c2521354415a7893",
"format": 1
},
{
"name": "plugins/modules/profiling_rules_in_bulk_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4dedbb18660f9611d8de15bd78df9b0bff8263e74d67fb5d5f8cb9c6e9bd605c",
+ "chksum_sha256": "3e79aa1f0409bfdd17aa57ed69a7626daa52c510ebee3a500f760983a4723e25",
"format": 1
},
{
"name": "plugins/modules/event_artifact_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6c3f785d839db3db95af4cae1e5a5698bede3dccbb89d69ff9783a37f80121e",
+ "chksum_sha256": "6121fe9593a6fef7f9870a196e4a201cd138337b90c1726e20a0056cc82552ba",
"format": 1
},
{
"name": "plugins/modules/network_device_module_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d7ebf4dd462a77b11d973103227958da46700fae8d9617747297a65a8acc2af",
+ "chksum_sha256": "988dd211b76c628305d21acdbb3a4f1a59e716d819d3ea5773f1994b79823859",
"format": 1
},
{
"name": "plugins/modules/global_credential_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a49f82933150a1a09572081a72c7d2325b29e195b71da8b89f843c83156c59ed",
+ "chksum_sha256": "bbeb591b1502b1f63b91404301e266e4b66bd157ed4b03934ea77ba4ee096d66",
"format": 1
},
{
"name": "plugins/modules/pnp_server_profile_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2da8840d0a28503a26353de3b410390f4d65fd6c8980d611dd45e491daa1b7b7",
+ "chksum_sha256": "1e88323ee47995da579c9263e3442833b08fe47c68de3e86b8d66e3d3e38b2f1",
"format": 1
},
{
"name": "plugins/modules/projects_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2ab5f34c01ee5d2655d2c5136c12033914c3fab2726dfb8437ee0de5af571aaf",
+ "chksum_sha256": "8291f865748dab5754228e60da5e2321ca6a1fe8cfb14463b51df1e16427f3b6",
"format": 1
},
{
"name": "plugins/modules/authentication_policy_servers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d82fcf066d29e5d6b758d72a23e9cef7a91ac5f1c631cb77e0ed469b41a2b120",
+ "chksum_sha256": "1551391c2a66ef1bbad5408128dca9846f792337a583af80269237b310933101",
"format": 1
},
{
"name": "plugins/modules/pnp_device_claim_to_site.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a16e99cea123c0bf32450cc3153a826723b95523946f9a293dcb98130fc1f522",
+ "chksum_sha256": "1362012e0e6134286e284fdbd89fd8493b4fcf6271089de7c40a307340131789",
"format": 1
},
{
"name": "plugins/modules/applications_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "48b9d8878343b80673ab59b4e95b98a6fd1cc79567f04b5e05c810f848746f4f",
+ "chksum_sha256": "a821bb44a947903868c0d3fa718b64e09d87825e856aa8512bea8295d55b6b20",
"format": 1
},
{
"name": "plugins/modules/network_device_wireless_lan_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e68d7e70c4570b17440581639eea6b46945d54bef49deccf2edf881fb096838e",
+ "chksum_sha256": "0a5b00d3249e3bf2691cb50f8e6edf843fad6e3a0cdae63a57bf5cd72f33d15b",
"format": 1
},
{
"name": "plugins/modules/pnp_device_config_preview.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8e32fb6de985448dc5a125315550f0ee8d8fd2c08d3f9e232782e944d57a4b08",
+ "chksum_sha256": "019be448c8f8e4a283e68e46cd79aa30a826bd9b83eef9280c60ae617696cf76",
"format": 1
},
{
"name": "plugins/modules/path_trace.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9ba78935fec396d6574c33755dd9ff6562f1868a5e49ed80d2bfc844e33a0a0b",
+ "chksum_sha256": "99068699100cf4e24c2dfaf1caa2d8d6fe150a9762a6bf318af532574ac56148",
"format": 1
},
{
@@ -3924,1722 +3924,1722 @@
"name": "plugins/modules/device_replacement_deploy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7d292b3e8eefaa09cc699f47c6d8dafbbd30ea35397a4b5f31a0ab5bc6cb9548",
+ "chksum_sha256": "ecdce508fbb0473d0784e3c159cd76ff6b07cdeb999d54c825ed2b25cea9a0d7",
"format": 1
},
{
"name": "plugins/modules/system_health_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8006a53552f482b3f3f97188885c6374861761702f5aaebecd8f1e317eeee1d8",
+ "chksum_sha256": "1f325dcf5afc01848e3d7b1619a670d01c12d0624c7a1ca8db4c2e4a535748ce",
"format": 1
},
{
"name": "plugins/modules/app_policy_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c208b9ec193ffe33c13897aec059032575aabb44c8760379a4896a420e7333e",
+ "chksum_sha256": "7b625c39fb2a224fe7dd3b91b30646ec3d12b2bd697083fbe05e43271c7081ca",
"format": 1
},
{
"name": "plugins/modules/event_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d2cf1e4bffddc28c9b92529804c9384b8e64fe4635ebdc7ca8dc4f98cab4d8a4",
+ "chksum_sha256": "8e3591a1fb3519b884c967564907eb4af42118c1f6c8c91afd311afde2165c41",
"format": 1
},
{
"name": "plugins/modules/client_proximity_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "074df4c86da99d225d3ebd2d85347c57d9e9d27054d7de171c018cffa286c721",
+ "chksum_sha256": "9bbbdb160591c895f91d752f917ba887c17f298a6c3f4248af59cd5b09cc8696",
"format": 1
},
{
"name": "plugins/modules/tag_member_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7906513bcf9e12ae42e8a036e4e7cbeafb95cef6912212f9d0a46aede30ffd21",
+ "chksum_sha256": "411390492f0e57f70f66d25bdcf722016ff30f769f6afdd849ed2cfbeb67d6d4",
"format": 1
},
{
"name": "plugins/modules/network_device_global_polling_interval_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c2d226f1d292ef76f50bcdfa9d41b76f6c052df80eb4b8419f1264705a282f91",
+ "chksum_sha256": "67732485524ac9a2b11fb8cfa118cfb4b66fcb191fc69d3f372b5c5c49161593",
"format": 1
},
{
"name": "plugins/modules/application_sets_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "87e9f963c750e336fad6c6044849fd70e2ff7657b154d0ea0023df9a3287c6ad",
+ "chksum_sha256": "829d68acb8ef33ae1eaad98e5391fdb71696b9785f5800779e603a1e4e0c7680",
"format": 1
},
{
"name": "plugins/modules/wireless_provision_access_point.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f49c90192930f8c36a2cf691e1fb1fd7fbad63692fcbd0573b51f8d91a151186",
+ "chksum_sha256": "ad1add88dd3f16ca410cde9be6c97e4f62053ef92fb5b0743fa31227d9b6a473",
"format": 1
},
{
"name": "plugins/modules/site_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71b93dad486934d8706d7d854b303fabb9f36316536e1e3b7341303ec2aaa684",
+ "chksum_sha256": "a51b7f98adbe7d53bb7ca70b73b059ed10c1f1dca1b01677375b506be41a18f1",
"format": 1
},
{
"name": "plugins/modules/pnp_global_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab1409f92e774337e260796212688bddd73804a4f87da25ac5050cc5c15456ce",
+ "chksum_sha256": "724999fb1b00383d5ade1f29a5ee65c66f9462a26afc04636bf17689b4be6699",
"format": 1
},
{
"name": "plugins/modules/planned_access_points_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d8eeae0466c7d4abd531085860fcec1544dff0be9bf6707c2ce133081322d484",
+ "chksum_sha256": "5425befb5c57fc61d2a57040fb4328b4cc9f208704a1d53d336d4dde18158138",
"format": 1
},
{
"name": "plugins/modules/event_subscription.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ca27b7a6a525a197cbf24d682e839a372c988520297d2406093fa1b23269d993",
+ "chksum_sha256": "8f94beb2a6d694ecceb446365140c0a98b53532947f417eae5a506ca772c9ffb",
"format": 1
},
{
"name": "plugins/modules/disassociate_site_to_network_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a57099910d732a1081521b0586f14ba568f38b56f18cdf9f84d7726a25fc6b78",
+ "chksum_sha256": "9e719471dd45977103c51c3adea0b01296b0952f8229abccb9da232af87fb5c7",
"format": 1
},
{
"name": "plugins/modules/security_advisories_per_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "510a8d32961299a16d6901f64f7a0e4830efb08196d08cd633b1ae4d80595418",
+ "chksum_sha256": "7b8e497ab8f7a2c4ffc741c01c97b24294c0368afab2ea6a497a1c733f8f5aad",
"format": 1
},
{
"name": "plugins/modules/wireless_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bbd0d63fdc3b88a7382790da0d74397f1dbec93156adcf730459d94060bdad90",
+ "chksum_sha256": "b9a3286b939cee7d41e926459c389371eb71712704f2cc80cc62d5d4c030e12c",
"format": 1
},
{
"name": "plugins/modules/authentication_import_certificate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95ba72943a0e100576a8dca2f24b42024451108d1570e63a01a241274f6e88b8",
+ "chksum_sha256": "f25ff63970622b3ca833b8d9417934f11ff1a3ce0c67ab48c094f8679c440d2c",
"format": 1
},
{
"name": "plugins/modules/sda_port_assignment_for_user_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2003691a23f90ba8c744a45d2652c60b9bf2296a61203c1d14cea140f31ecb0f",
+ "chksum_sha256": "0c5b6bb1caa7a59337c0d2cf2f7189dd89d6d75af96aedda38735d4a57addc17",
"format": 1
},
{
"name": "plugins/modules/site_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7f87362a1180c33a0958bd3cc6a9b5282acd363eee262c988470b1b6bdb0aa89",
+ "chksum_sha256": "136244729cba0e4ee3c153b5f21b303450f51775a19424b9f4ae5e698b827f56",
"format": 1
},
{
"name": "plugins/modules/nfv_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fa6d9b1c6d23a665849933dae5d506fbf2f12977d538afe65defd166e7945176",
+ "chksum_sha256": "a925b77fe717b8b23909239509a9afc244f7df072c5c010207d2a83d8b7bee65",
"format": 1
},
{
"name": "plugins/modules/network_device_range_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a4d0a3e5d09e7a1101073a7f8f77bd740df06fdb9b3156e533fd83edc598475",
+ "chksum_sha256": "8ea25e0bc3e101c707b72dc2caf814118f067175f3dd28c8dd7c630daf834f23",
"format": 1
},
{
"name": "plugins/modules/network_device_custom_prompt_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "925594e1d3ab4d227f727dd2ff4f6071ddf7fa3ba370ef89012e727dd03c5b5f",
+ "chksum_sha256": "ca6368c4d89bdf14c64cb4e719cd206d0758038e3ff50db8ac29c7e7ea037cde",
"format": 1
},
{
"name": "plugins/modules/pnp_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0315da3f9fc9553e61cd089e24427ca21a4571f93c6903dcdd7eca94de895a26",
+ "chksum_sha256": "87b4e7b1a8100d3b3165455e59e9a80bb82790ed58167253d8e893abda8292a0",
"format": 1
},
{
"name": "plugins/modules/license_virtual_account_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a14f345427186acd7cd817934f77ac1b9a220b9d8b999d747c03f8595d85bac",
+ "chksum_sha256": "0fd065702a56e2130a33816c8e4fc626cdce32c14785b1c06a20605498c21bd6",
"format": 1
},
{
"name": "plugins/modules/device_credential_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e871368c6d1375f33f853132e5f5653d1d25ca48fdb7cb5d5580df72ce197a97",
+ "chksum_sha256": "73611279350c75b42fb90582f76fefff1ab74f85656f49b715c412cd9eacbeb4",
"format": 1
},
{
"name": "plugins/modules/topology_layer_2_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f29d376c210c83aca735d11614f22ed9a4c9ca3fc97998d65b6b84fb95a1d4e7",
+ "chksum_sha256": "9dea8f1c6b0b8319a453be363cc0162ca525538b313d05c03e5cb8139d4b5ba4",
"format": 1
},
{
"name": "plugins/modules/threat_detail_count.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6d4604c1629ee70e899f9907aad240e7698f1895e5ea0d12b4ddb8b466d3981",
+ "chksum_sha256": "42588fff16510897afde5d58916f13e4201dc8dbfa0918b01004b96785d6fd95",
"format": 1
},
{
"name": "plugins/modules/device_credential_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd2fb6aaee258088a4be03ce7b497590c53079a30d97897665a483001de952c3",
+ "chksum_sha256": "277c1c63c75d3ed29a244a143e5aca494b04346a27e56692c180f810d4fe43ae",
"format": 1
},
{
"name": "plugins/modules/device_credential_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "66fa8406e7af3248eef9be43a7e2ce267d81eb478ea00755b9531461aca0d961",
+ "chksum_sha256": "9c7b1a9f78eac8b641fb6360e573adbd30e4703f93f0d79a994429d425076c7b",
"format": 1
},
{
"name": "plugins/modules/site_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "81af801ed37704ab603d8d0531a78bef58a8ca2994e4ef0f09d6ab6fd88e97a5",
+ "chksum_sha256": "b1faa8cc81d9795cc1f818b0af82b399b096d6e1271af4152f9c83ac7ea6e98f",
"format": 1
},
{
"name": "plugins/modules/site_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e1d4b175913d5f99f4a24e42672c98918d8c524750e97ba97d633d1aaaab0f77",
+ "chksum_sha256": "73ab43253acb3ae2b8e09d59724d762048c28945898d998f69df3d73610fc6c3",
"format": 1
},
{
"name": "plugins/modules/network_device_user_defined_field_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "97ac775b499496379b6591c51d6d5ee1dbb3510715234ec127df1935be15ed47",
+ "chksum_sha256": "c8510f70069c4aea3bb52a4aaa1a5ca8c1aa55d4e31efdb93a9f5c9e12853c36",
"format": 1
},
{
"name": "plugins/modules/http_read_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f974bce513629e3badc474d280670460b34b945815c1dfec75874846c72cec1",
+ "chksum_sha256": "a9a2195ab6cdb6dc40a885de01e3601ac7553a503a6cf118bd4d0dc1e8d81ba7",
"format": 1
},
{
"name": "plugins/modules/compliance_device_details_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8883b487fb7f4e894814db5c066ea8d62bcb9bab6eab77c1e65f8f41dcf59dad",
+ "chksum_sha256": "94fd67bee2ce423dd2be0429769caa55a9ce461541108767f66b44e76a81b4ef",
"format": 1
},
{
"name": "plugins/modules/swim_import_local.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8f56e87c5847d17450511876f9b1030e8cd0e389e4fcd26d8197531e649672ef",
+ "chksum_sha256": "fe5f9c42b91c809caad535b1e7070e531d246018b17bd37122ac2f165d547712",
"format": 1
},
{
"name": "plugins/modules/dnac_packages_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d255616ea04f1d4f2d0d3a756b5345a3a76846e07a4fce3939f68e214a7c4e7e",
+ "chksum_sha256": "78752569cf03879b371c78c9c16803553171fdcc3deaef98505cc77752414ade",
"format": 1
},
{
"name": "plugins/modules/configuration_template_export_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e035fcfb51ca192b8d1e4b7658e78ee2c336371b02b7ec9f5011819bbb4b73dd",
+ "chksum_sha256": "5ede848070ed4d186baac3dda19d2a89dbe84221bb4d44d3dee857e1c718034f",
"format": 1
},
{
"name": "plugins/modules/transit_peer_network_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "feec3917cfa16d8a5d36ca23b0bba5e94347a8d73bcc35647d6c02166bf7a02e",
+ "chksum_sha256": "563a9bdf5c6166c9e5abf1a8433376eca11180c07f544b302928b3be534dddd9",
"format": 1
},
{
"name": "plugins/modules/wireless_provision_ssid_delete_reprovision.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a3fec6fc6428f9488499b493a82f5b511f608229c4d6bf744fd786764045ff8e",
+ "chksum_sha256": "1c3750918a721cc0820f4a20d127c944952a770968ecbe3dbc64a00d5b559832",
"format": 1
},
{
"name": "plugins/modules/sda_virtual_network_v2_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1b0b6479857fbe6389b251c011365a9835d6978b9b773bc2d97a11aed13413bb",
+ "chksum_sha256": "c50256d12da60d7e78fd69bedbdcb5997616ad8b47f5d326124af10b9d49947f",
"format": 1
},
{
"name": "plugins/modules/event_subscription_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "32494ddbb9d39f85db2be63c47229e3b05528c542375e51ccf956faced80797b",
+ "chksum_sha256": "d716dceb1475a191a63d5ccb8d6897102a5bd5d3f345c1fab109fd7056f478be",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_authentication_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f369c0441b9669962ed4004da63dd8f917b39d17755d68c1a755d40f6fdc4246",
+ "chksum_sha256": "0f400cdcf47e1f8a7767554424e50fd5573b8d58fe3c218b54d27ae3f93eecb2",
"format": 1
},
{
"name": "plugins/modules/discovery_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5d4d5d62ed389c1286fcbc13ecbb47790cff49e0c7ae12b8ae0dd313963bfd7e",
+ "chksum_sha256": "9d917e426c5ab41b8346699d99d920e4764d687992add75011f21be9326eee38",
"format": 1
},
{
"name": "plugins/modules/command_runner_run_command.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6693edbedb0428d946372c9013ad5e347aed94992308d5617fa1a4cfcc76fb45",
+ "chksum_sha256": "5eb5992001e9431eb08775d3845169a2062b842aff1b3735a41dcaf470c201aa",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_edge_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c78801500b503cbed50ca503b398dcbc0e2329f22be2fc9e8a8abf2c33fed07",
+ "chksum_sha256": "997a913eae617e9210e6db7efe98cd81284a81bf23f5c3909297c7f389f7c955",
"format": 1
},
{
"name": "plugins/modules/client_enrichment_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fa48ef333815f9c0d2c1cc17d98c980359463ea002eff33dcfa7858f6ded2329",
+ "chksum_sha256": "2dcfc9666186dd28a0758aecce6e8ef4c8261f85f4d312b7d9874df8b70ab181",
"format": 1
},
{
"name": "plugins/modules/discovery_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e4e1f1c128ca5334ed627854e7af56a330e09f7fa7bfd2e20605ad215879e25",
+ "chksum_sha256": "7dcecd303f5b7e180e64e220ec5c1289e0e97f7257f28292f4863a10174741fd",
"format": 1
},
{
"name": "plugins/modules/event_syslog_config.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0e275395b5ae661de22e64c9c21bc10f0f3bc07c88dd0299560d2bdb6e3c2a73",
+ "chksum_sha256": "0bde247c5caa064449e0633732bbd312497e3e0f69aaede6f9c15f155016e214",
"format": 1
},
{
"name": "plugins/modules/sda_provision_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "285f1ddeca25ad12bf753ee7b7e3ba5ce8749e652da0549a87cc6477b148c8d7",
+ "chksum_sha256": "16c231a9de2ccbc861b11a5ac41c8e438669a06cd0988eb9db8a406c870d7fe7",
"format": 1
},
{
"name": "plugins/modules/interface_network_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad46cfa858fb72bbd15702cc70ccf3d59c2960b601062e2cb1448d5c947d8d05",
+ "chksum_sha256": "7151fb0da471791cf5ce401fcb5c7779376f045a1e77415752c75f6281b7e700",
"format": 1
},
{
"name": "plugins/modules/reserve_ip_subpool_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fb6c6f881f932f4955b0d52a5393dccd1fa1a7f3570f2ccf5219dc0c72fb1fad",
+ "chksum_sha256": "0e23957ae461ad94694930f6dbcee49f15a66e33a5482b7260c77f0f548a72e2",
"format": 1
},
{
"name": "plugins/modules/configuration_template_version_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c729bdf17c3f58fe8cb07c05abe38b6eb7212f54b780ef862a9613768ea52aa",
+ "chksum_sha256": "6db9c81a5e9cd3a66121eecc8e5b87b4265cb9a410bfafa294cd080d338ae6a6",
"format": 1
},
{
"name": "plugins/modules/dna_command_runner_keywords_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "43318675e447145e40a85a72914d396af2d0a28f50e973d04452fc7e74e91866",
+ "chksum_sha256": "65e79488afa4ef3820aab5e915a0aab9e578bbf7a31a2bbcf908772bbde354f1",
"format": 1
},
{
"name": "plugins/modules/tag_member_type_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a27fd34a02e877fbcba7fd2391212254f28990401fdd87de10662b669ca6219d",
+ "chksum_sha256": "e03ef4a4e4b6b6c4eee059129aeb0a87d675065c9f3289923b3b9db6d8888142",
"format": 1
},
{
"name": "plugins/modules/cli_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "94eb8979f9fcb0bb622e23ee6d689f4dd067d70e5f92f369f79e5fb270845d98",
+ "chksum_sha256": "ae8078d2bc7f17fa3946400f9d9f91cbac2122cb0af50814581524065edb4983",
"format": 1
},
{
"name": "plugins/modules/event_webhook_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cf60d61cae706455b9af76ab05c54186e1dd50ae6f5e0e11f63d642e75179ffa",
+ "chksum_sha256": "3327f4d0facc8deca05dcf652187bce2e0b853d251febe9a45a6532204d3b54c",
"format": 1
},
{
"name": "plugins/modules/license_device_license_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2a77dab6f909264faa05dfbe955a80d85f6f7bd7fc8fc0d903138ac581352e34",
+ "chksum_sha256": "03459e80c875ce7f99aed01d53b079418711565ff526edf4a4aaaac686a8641e",
"format": 1
},
{
"name": "plugins/modules/role_permissions_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "58174ea096129749a9c9cdd3659fd71434154e4fb988ae66f556835b286241cf",
+ "chksum_sha256": "53d012b05cc0d04388db377e9f987708362162becba7af1dbb233502fe8147e2",
"format": 1
},
{
"name": "plugins/modules/device_interface_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fa5e221ac6a7c0df2c6ef63401b0457b5647c3aa69ae4b8ae21ddc9bc506a8a1",
+ "chksum_sha256": "90eacd9d08fd01b5d978f44fcda0d499c6921292a159447b81800c5d17eec4fc",
"format": 1
},
{
"name": "plugins/modules/disasterrecovery_system_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "92f315efa7b89279e8f7b192c09ff8a88289fac4b59cc7691a2e105a69216b0c",
+ "chksum_sha256": "79a90ecec047649cac72b3f47f3311c4c9f31967bb50d8719e2f995377fcd2fd",
"format": 1
},
{
"name": "plugins/modules/device_replacement_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "33735267f9937053587282f65594631dedfc3fd9fefcb36736d80f0495507f1c",
+ "chksum_sha256": "72ffc7e99647b8d75827d26f188dcf5ac046d25205bdfa4f378dc948362de367",
"format": 1
},
{
"name": "plugins/modules/pnp_virtual_account_deregister.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e8a6700ff0d2530ea16147dc5e64040202f2ee8e66d953cd8ee05375a3b6e442",
+ "chksum_sha256": "cc1ec82c0edaa6b470c3b047c52521e927b7b8ce2127802656ccb5cf7a056ff3",
"format": 1
},
{
"name": "plugins/modules/configuration_template_import_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5667f04a13569fbd8a4b026e6e3f97c4ee2d40928a96fefb560c3e37bc22de8e",
+ "chksum_sha256": "1f3afd88bfc842a3254fd93bd5c5ac2f77bb3d42e36ced80809454885c54c290",
"format": 1
},
{
"name": "plugins/modules/pnp_device_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea228c564b4efc6c40fc9dccf20d8911ac984a954ffd9a6fb9f1d45da7693214",
+ "chksum_sha256": "05e9933ab8d49d305e4eb8cd975eda7201d0a7907a22fad8c41aa1792e0ec3b0",
"format": 1
},
{
"name": "plugins/modules/event_series_audit_logs_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c9e1a8d9825781f9def1f39c11306f0f9ee54d6edcc9ec797f698ac276d2855",
+ "chksum_sha256": "83db2fba5b867f93003eef05e77dc06cae596077d8031cb8e4786412835b09ab",
"format": 1
},
{
"name": "plugins/modules/service_provider_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0c7c9630a8057f22c4e21b28165db903ab8437dda7d8980158a6feb7b32d907e",
+ "chksum_sha256": "7d17180dc4cd643a09611991cf2043425189cb9a73c6f59065981d8281b3ae87",
"format": 1
},
{
"name": "plugins/modules/event_email_config_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "967f7df7906c17e63a36b6389de1778caf882fd7ec68bd2848047503734d81cf",
+ "chksum_sha256": "a2abdfc66a3d67f00d17e810ee2d13570ca3539a9ba9a9720bd472194317d31d",
"format": 1
},
{
"name": "plugins/modules/endpoint_analytics_profiling_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cbd6b5f88a5e9f37a80e02b713ebddd6d493d451370323bfb1b6dbf7a5b1b579",
+ "chksum_sha256": "1cf4ab1ba574bb96b930fa6d10bfee4a8144bb410ea1411a57a009907e7c273e",
"format": 1
},
{
"name": "plugins/modules/system_health_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5fafcf66ef848c98360eae0deefb190fcfc26b65332e7285f11d6b31bfef862f",
+ "chksum_sha256": "bc062d3bcd58caca91751be0e30e482f8922ab7b740a95dfabcb3617abc3eb7b",
"format": 1
},
{
"name": "plugins/modules/tag_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2b4ef16e18f7349df46dbf9d5ad0ddab34dcc3243d591021c19e363ce1fa45d3",
+ "chksum_sha256": "84b58cb1ff6b7051130a080d0cc358d184ee463049814ebecdf4b87f0d13c3a8",
"format": 1
},
{
"name": "plugins/modules/template_preview.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5e0dbff7da5368bb3e8cddf549478e1a017d3436dce0c7d2eabd6946aaaa64dc",
+ "chksum_sha256": "0767e4f700a883074575115d80e90a55eca61ecd684f7a581f6a3e449892ecd3",
"format": 1
},
{
"name": "plugins/modules/sda_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a1863286578d1d7058c66030f5196c6d0d5c31da4b1a769b4c0d86fa6350fc93",
+ "chksum_sha256": "9ceca94ff68b9cce8a259c9a202302eccabcfb1a6624406cb19d669a8134eaf1",
"format": 1
},
{
"name": "plugins/modules/network_device_equipment_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "41828a661d23590cc8f7859f8a9cabd4a450ecd413871feaac70cf6a9f080b1d",
+ "chksum_sha256": "a894f8ad27d154d6bfbb8457a9925bd20efca3313133dce4a6a4f50d3e692a23",
"format": 1
},
{
"name": "plugins/modules/sda_virtual_network_ip_pool_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "06e5e7b4126e3f5ec10d5beafc32c625c57468272102dc7ace67fb658ec7e993",
+ "chksum_sha256": "a8ef7391bb0d784b2959a69bad9a6415fee524d07b7088f218d11d9e61ae386e",
"format": 1
},
{
"name": "plugins/modules/lan_automation_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a1c5fc9af9d3a406faacfd220afe0551f229cd79c11a749d10ed70c07f0a6ee",
+ "chksum_sha256": "fbeb1f2b815cc579dcc630713ccfb5b1683195d17c0002303d9929e73a5d3aa3",
"format": 1
},
{
"name": "plugins/modules/app_policy_default_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7bf88c2b9746391d9e7f43dc96ad6dcc1d874426c718031d3eb97d6d97267d3e",
+ "chksum_sha256": "046a8cc036a2f26035e3f993e5f576648e1bfcb59f651a2f74e724c7bf292395",
"format": 1
},
{
"name": "plugins/modules/swim_import_via_url.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d017455247056b195a47ea156a9d6cff5d37f9d77876109af39b64e9f56f2db1",
+ "chksum_sha256": "5d9113ffafc2a9fcf72f4aa671f970b5b86383e6e582eee1d02c00ccd4d2518c",
"format": 1
},
{
"name": "plugins/modules/business_sda_hostonboarding_ssid_ippool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6bbf473a0e595e7c35cd39b42268bd3a1527160e7badf498a7c4f71d9dad392d",
+ "chksum_sha256": "5c0381440528dbfc720d6914c6f68260a7ebf3d5aabd832fec9baf3bf4a048fa",
"format": 1
},
{
"name": "plugins/modules/event_snmp_config_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a35d4a47816981688a1c29e20d6c979a96bc4c7dfceb39ec0c03f34489067b6",
+ "chksum_sha256": "8526121f3e913a218cd02fa7c4e1b03933c00ddf54695823e555db7e4790f15c",
"format": 1
},
{
"name": "plugins/modules/snmp_properties_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67fa7347d7fa944367c449e70a381b6b7985d70ebb1d6af1b4b9c04f750b1f23",
+ "chksum_sha256": "dca676e7508f5ecbe4760a4d25fd75a388cb7088ea113a4368e19af0807cfb16",
"format": 1
},
{
"name": "plugins/modules/event_email_config_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ddb249265a519600ff736f4aba950bcc74cb19d028a931003fd646a48f9b1f8e",
+ "chksum_sha256": "5857874a63efdf544c3bd4cfb5a23506e4da8080c05b18ce624086f3286d3e10",
"format": 1
},
{
"name": "plugins/modules/swim_trigger_activation.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a73de0abe28f85f254f25b162a90bf6257ce1aad5919d0926c3ea4858bcf4b41",
+ "chksum_sha256": "6fe55c5f2ba712ff8405ac65db4eebabfe1fbf783eb2384878a93ab9803e2c9a",
"format": 1
},
{
"name": "plugins/modules/event_artifact_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b17b5412689f0ba4a9110408bf017008239bbbe59a79ec69090832d2808b1afe",
+ "chksum_sha256": "0add74d4a9abc68435cfd8f2b2b0a2b12e1e41083734982e74e697c8b10e272e",
"format": 1
},
{
"name": "plugins/modules/template_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9caa9ab726bc593d6f485fbc3ef43c41b614feb8328f91cac1d8367be9fdc49d",
+ "chksum_sha256": "b1b8ec891e44e539d660034f5f3edd7caf85de970139b74f93addf8e82031f99",
"format": 1
},
{
"name": "plugins/modules/discovery_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29aa559fd96e7578de9db42769f08911f4c1efc84caf93e217b6572cf9bf7571",
+ "chksum_sha256": "db50b48430f478eeefcb50eaf426a91bc350069fd637a6fabcca8aaab30970f2",
"format": 1
},
{
"name": "plugins/modules/nfv_provision.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b175e23ebc0049879fa5359073468dea940d2a6a3489224346616af87daec898",
+ "chksum_sha256": "5e161b58a0aae21985735aa16f1c51aaca68993bd7cac8496ccce7caf119bf6a",
"format": 1
},
{
"name": "plugins/modules/wireless_psk_override.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab739b1e46a232a91712806b019ac0dce02cd0fa555e4033c88229b80ae2d334",
+ "chksum_sha256": "699f9ea5227ec33456bdb9d0f1f87394f8b59962d2668134a4bb69e6088abf20",
"format": 1
},
{
"name": "plugins/modules/network_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a59bf7039e1388d3ff8cac28791369851aba21465d55c1910663424a3d62daca",
+ "chksum_sha256": "d84c316a8dceab645376ca2a12c460fc08c131fbe8cd7a09c08442c1e6b707a7",
"format": 1
},
{
"name": "plugins/modules/event_subscription_rest_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1f973f0e7a43dced562bfd266f68e66045fe2dd4d14523b5e542c5573728c0e1",
+ "chksum_sha256": "c183256389b8cd164b134c25172db6fdcd71e87da6e0793fe08c6d7b87afa656",
"format": 1
},
{
"name": "plugins/modules/reports_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "480d17d062b11d8f274124495b1ebf9b244ba521065b876a25ee402856649055",
+ "chksum_sha256": "2b8e90dcac98a407cf1f544cd4d204b9f8bb2f6716124f66e915734f3fd90803",
"format": 1
},
{
"name": "plugins/modules/lan_automation_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c6dcf7b0a91d4cdb01270b635b87bb130b0f27e29505c90571437c8819a1ca3a",
+ "chksum_sha256": "ef5c835136ea31887795cb4ae057f13b305d34d5cee5fc83e29a4d77d6305e31",
"format": 1
},
{
"name": "plugins/modules/http_write_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb124c888769059679d8464d8ff965d5252ee901c2d054508c9068358280b864",
+ "chksum_sha256": "a8a0f2c951bf025923aec39680fa8617abac532db668ad2627bed2937dc8084c",
"format": 1
},
{
"name": "plugins/modules/device_interface_isis_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "931764d35f07b5508e4be6fceb914e7b95fd920e14d7fb3a24aaa95a564563eb",
+ "chksum_sha256": "297b2c6a01e75055f148b270fef9ec1e3811b1caa4db452a069a1090bb3f7683",
"format": 1
},
{
"name": "plugins/modules/sda_multicast_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f20dc250d7217a17a6d59764cc1b8900235beb4aada68965d9563eb3fa7d9a12",
+ "chksum_sha256": "8625b54c14c546a997b89d8b19b760f53b56acf941c7283786220ea0cf790e3b",
"format": 1
},
{
"name": "plugins/modules/topology_physical_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95278a7cf5f0e98e9a4c0ad56e129f4b6703c06ed6fa42f09d51b692687694b0",
+ "chksum_sha256": "21ea3828b12100cb2d63cca9a180288f62a1bbd7c5dd4bef18317f7f04136210",
"format": 1
},
{
"name": "plugins/modules/users_external_servers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7276641ce82a3f1b92e1411603569c75668d1693e3d3c2af4cdccf4ffc594e4",
+ "chksum_sha256": "188dbd8a8d337ac460723c1a0d54b4771acf9185668793df472e3ae123662584",
"format": 1
},
{
"name": "plugins/modules/security_advisories_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dd688ec7abba9d0d478735c0881f4939a616107a230993322e5e0037174635f2",
+ "chksum_sha256": "40b7ac64401d1b2501ee2520c04da1cddbca62562bb6a1be4c4495a092fd417c",
"format": 1
},
{
"name": "plugins/modules/configuration_template_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "96c81ca8e425485289a75311a12658afd145d6d76b17da98d2bcd0e461e9c171",
+ "chksum_sha256": "cbedabf444a6db5481f4cba8e0f9c15f7785437bcdccd5119364dd2fad886879",
"format": 1
},
{
"name": "plugins/modules/event_subscription_details_email_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5497dd36f9a56b8e55392e856e8f8ec26d6dd189e5d0b9668bef5920a1c1ee60",
+ "chksum_sha256": "405d6770ef140baba4df7d621a67ba686df209a008a7d3b4e8684749f4cb9168",
"format": 1
},
{
"name": "plugins/modules/lan_automation_log_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95b934b5426f0046a5033e590f7f55b6240753ac21dbcfa015a75792518b15e3",
+ "chksum_sha256": "5b3f1532b6effb7aef33e95b0700dbe67df967bb3bd20805410c3854a17269bb",
"format": 1
},
{
"name": "plugins/modules/network_device_supervisor_card_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9afaa51020eb5fa74db87da8d19d40112445afc0655a6f1246c23e9987307e69",
+ "chksum_sha256": "c04d35500ec069592a814f98f6d2d3866b2bb3451e5d466981d76e2cc8d763e0",
"format": 1
},
{
"name": "plugins/modules/global_credential_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bebf050a44a44da823ae7e260c7373dbe014fd31110497369b11bb2210f95468",
+ "chksum_sha256": "1f72234ee753cfe8541ceb94f386cf5b1660541161115a36be6c8d966b9fb1c2",
"format": 1
},
{
"name": "plugins/modules/event_email_config.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55edb414f78a0465fe21bb8d7df2dcddd790ac166f6a5a3f7c6c32e43fdd8872",
+ "chksum_sha256": "f757d98a432913e6ffceacb593eb9677f0fa028d7cee487f98dd59fc95734308",
"format": 1
},
{
"name": "plugins/modules/network_device_interface_poe_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9114611840309a068f060a6c00005af4d0ce04b5e65b50b2ca1fddb5c1f3e4b9",
+ "chksum_sha256": "390f24f6873f8f88d0a84fd61f5f804523293b5c9d5a427f1116219e5b676080",
"format": 1
},
{
"name": "plugins/modules/wireless_enterprise_ssid.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e1fa4a975fe2bb4cfa7e150851a5daf7e4dddb3cec5bc47f07166d4471f492b6",
+ "chksum_sha256": "89ae9237888c63505ba6494775d57957c92fe6975112aa4920181be6b4c83812",
"format": 1
},
{
"name": "plugins/modules/event_email_config_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aeff0928803c45a51f05d548da3ef7d1e8f90787451f548908ab83365eed8015",
+ "chksum_sha256": "90fc2f8a4e52bac735eeebd13f2c441389eee28567aaeddccdd3aa0b2d0911fd",
"format": 1
},
{
"name": "plugins/modules/threat_summary.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76428992312bc00fd67ce567a21d3cbd16328add3f7dd4b4e92945a78441fb8e",
+ "chksum_sha256": "af2181ffaf29afff92bda27e6ac26918f6996a709335ccdf452ef247c444061a",
"format": 1
},
{
"name": "plugins/modules/network_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1eaa6bd3a1404450e2cce31639e0a4fb8f21a1770785485af7286e03683bf545",
+ "chksum_sha256": "1c2c7db40bb76890878a5bbb8eaae4a0bd086ae05440c308e8a2b1ee27db775d",
"format": 1
},
{
"name": "plugins/modules/network_device_poe_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95b3e8a26f5cdb60290f3950c51b04388b818752b499dd96e6c2f79b63979091",
+ "chksum_sha256": "0b3cd9983e422fb5201601e8aa3df0534dea843b7ef390a7ed369afc9ac2aa62",
"format": 1
},
{
"name": "plugins/modules/pnp_virtual_account_sync_result_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3780c4c09e88efd6c4683ea5b1d04111c50174274a8e90c642cffbb987c05b69",
+ "chksum_sha256": "6ceb61016327b35bc8fdb49515026520d78fb2c4cd559d8967c2bb95a287fc91",
"format": 1
},
{
"name": "plugins/modules/configuration_template_project.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fcd9a13996f48b4feab768e13b2925575acf73280abf313581235bfa8527366e",
+ "chksum_sha256": "027056a2cf1ecd0bb2e91caec83465584c0b360bd4921d195f4c0078dc3c2815",
"format": 1
},
{
"name": "plugins/modules/sda_fabric.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "366eec6b367133778bd16fcd2d0dd59a266886a0909b3090bfbccc6907a8c662",
+ "chksum_sha256": "01d1c96f6b7ec3b4fc82def191d4bb3ad80cd0d0db695e942f7976843b07db11",
"format": 1
},
{
"name": "plugins/modules/network_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "daacc64a56ac3033476537951d3303ebe7a27c7dc7d8c8dbe15930aa144a65e5",
+ "chksum_sha256": "ccc7f8825f7e7dc5447051acbd4a2897d07d0a0c3ea34481d2dc18b31ae8f48d",
"format": 1
},
{
"name": "plugins/modules/network_device_meraki_organization_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "40160dc893da16f8c56619f25dc0fa91e777160cef7a11afc42521ed1f004aba",
+ "chksum_sha256": "501b32fad7f0ccc8d12dd4a4ddd19f62e5f5f45414d2c7a4ef9bab388c7936a2",
"format": 1
},
{
"name": "plugins/modules/event_subscription_email_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fb1c02841bffb25b95dddac13578bcff433f457fbb07763e1ce4704f72690136",
+ "chksum_sha256": "6d10e11f72b43f0bdd6f6e0db5bae48d207d43c64822e9270447cdf270415012",
"format": 1
},
{
"name": "plugins/modules/event_webhook_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "47d4b730290b9e01588bdc9a62499d2b9e437b4f117d4ac1c52559f1d08ae548",
+ "chksum_sha256": "cb5eb2a7db3bd583bc200f3665fdacc2eaa7307463d0727602e06e4bc1e357ec",
"format": 1
},
{
"name": "plugins/modules/discovery_device_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cd4c79c576ac4e75b87e664fa027d1771802246cfc18d8c0c06455f6ba09fd7c",
+ "chksum_sha256": "cc143f6f80d9acc2dc9a2f6bbe88b6dc63e37037584752a9c6b97e2d24b469a7",
"format": 1
},
{
"name": "plugins/modules/dnacaap_management_execution_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7db3814a2dda68a74feaacf7002a854b1c27772745ae22c5fa4f206d35a61b41",
+ "chksum_sha256": "5ec0a31b09ac3740c66e541cfe4b596db90132248cb0b10e99da48468227bc17",
"format": 1
},
{
"name": "plugins/modules/network_device_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fa3aae8a6b2321f03a1b8f9e8baea70bcb43ba39533109e8c7dc3094237b1e34",
+ "chksum_sha256": "6b6c01df03b984a409eca09ac1507a3f670e44b244ee049bafe485247dd22430",
"format": 1
},
{
"name": "plugins/modules/device_reboot_apreboot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "471dd65f4bace5e6315fc451b9707b852675ab5ddb07269d39f1434052c6fa7f",
+ "chksum_sha256": "44ad5748789d0ab4ec27188c2303b649696853c831c85bf41a31964a4880b037",
"format": 1
},
{
"name": "plugins/modules/reports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "337408d4cec040a2addff74f30a07e69e606ddf58e2e909639b4c1843ab346d7",
+ "chksum_sha256": "b2546d138a874a33e91ed9f70e87f2236c28fa3c9161daf31fbc472876e4c294",
"format": 1
},
{
"name": "plugins/modules/reports_view_group_view_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "752ebeabef80910863a3d0985b2a17b2aca65b3d7a5420087e8c841fb182aded",
+ "chksum_sha256": "f89203d7479c24ccea06961c58fa87ca9e0e8d39aa61016aad069fb040d93d3a",
"format": 1
},
{
"name": "plugins/modules/event_subscription_details_syslog_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "34a78d1be492cb4c226c40e73edc50f80f5e49882475210fa620c2cefb9ede18",
+ "chksum_sha256": "0d5bf1e319f86e92fbb96e9787aa7ecd6ca539f42c43d24bb09c1915f46d580c",
"format": 1
},
{
"name": "plugins/modules/license_device_license_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d8469dc9759c5d864d6ad27a882dff4e6c2be3b943f104ee1e2af8b0797aacc6",
+ "chksum_sha256": "edfae10160a1ff5072ca86e0a10e0043ff22031507bd78f680b5f52537d30470",
"format": 1
},
{
"name": "plugins/modules/path_trace_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "037be41aee7d682bc0aa8820a2fadce1f4427449685a2d9e3f2f0af22aba25ea",
+ "chksum_sha256": "505ef505a81ef65b7e3317bc4598f429f39bbdc26cf396f24b7f4a8368307397",
"format": 1
},
{
"name": "plugins/modules/site_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e678d7592b61991bf88589300a8296c0875e4fb4904b296958c885347a510781",
+ "chksum_sha256": "a159cab1c0c05979e19a2204e3f8f4f80b28b73b10e58f5ad016fed8eff40858",
"format": 1
},
{
"name": "plugins/modules/site_membership_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b1a79242232ff34a88ff9eb277c2dfe7df517f1e5c636a468eed0ff09e07d684",
+ "chksum_sha256": "c9a7691fb7b4e10cd29df359bc551dab79fc88f78395ccaabf2a0aa5413d5d3b",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_border_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ae419fcf754093fc399ec8044392411ac06fe535a71219d279a15d3fc23bfc31",
+ "chksum_sha256": "8c9ee7371b672a4b05e84d8fdad023c028bd7fda42c9c291e8c8c0b8468cbbcc",
"format": 1
},
{
"name": "plugins/modules/inventory_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "902aaf3d5251b10cd002f1f24710bd0fd076d5caa203fd64966bbbdd14274d2e",
+ "chksum_sha256": "4f2eac3c3da7c44477646bb5d283b84381c68b7ddff0f5374e505dd8d5f0506d",
"format": 1
},
{
"name": "plugins/modules/global_credential_v2_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba55055a3bb5e88f63f6f57c2d36573960f09565920eec799cd52c7b2b4bde42",
+ "chksum_sha256": "4370b9bece6cec8f15fbd34a42a2b06d059f5dd227876d462dce87b10243e0df",
"format": 1
},
{
"name": "plugins/modules/event_subscription_syslog.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6834ae5a13322cfecdcb7ca29c9b49923d1d2ac49b9d34c02b12b0ee7df97db6",
+ "chksum_sha256": "d296e1664e4008d17b54f7e56909c76ec480fafeaa47987956b0b4b7a9205a3b",
"format": 1
},
{
"name": "plugins/modules/user_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7d6202b171f91705f0f0b78b0f04293510e3964a05e667a107847d3a26b2b2fe",
+ "chksum_sha256": "14550e1a3958db5cffe0926f05ff81490e3744077015d5adb31d80af9ede4334",
"format": 1
},
{
"name": "plugins/modules/device_interface_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76da700b3f3e632bd6ca6eb0ab8e8cc371a430b1caf6807aeb2c4f8a5303d3d2",
+ "chksum_sha256": "9b87a231ea5513907e7ac5a11ae6689f63443851999b5ae73a07536863065f52",
"format": 1
},
{
"name": "plugins/modules/event_api_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d602f7466b50c0fd14d86d13018055ce549f2f362e88b1be736f1724378b1f45",
+ "chksum_sha256": "cbec81ca521399d416024b473f3eeb1fdfcaef7823790529d0fd59e58a3c38d4",
"format": 1
},
{
"name": "plugins/modules/event_series_audit_logs_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7dfde6593bc7b750abdd145838eca057fecad629f457dcebda76febaf5bfa192",
+ "chksum_sha256": "789ee39e43d4f396e82c434df8e2dcb2d35d0490a0fc270a198fc4743816be8f",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_border_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82cd6ccd601872de901fd2842fbad89bcd2470701667a38eb95f0f1bf26a54de",
+ "chksum_sha256": "514a9818da32a1b17c218013dfec643b731adf5f9c6b43f503841d906ad9f8c3",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_site.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ffc413261e353627541ec37b6c4b89c043864937bc6a46da3289d4369bebe8be",
+ "chksum_sha256": "4a8ed49cebc8ff4bc66d42e6fffec8ed468a4946f3b0e27810fb6b8f1b356bff",
"format": 1
},
{
"name": "plugins/modules/application_sets.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38d2b9077e0aa11c2909ad60982c3e8e98c7baf89889235c23b10adc7b468fa3",
+ "chksum_sha256": "192769a8af1b5c7f3f336ec63211d092a919039b1654abb98cc0182f83d89e32",
"format": 1
},
{
"name": "plugins/modules/interface_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "354d7d8448d181aed69034971f105e106319f244291a0f9c1aaf11f705c49c8b",
+ "chksum_sha256": "a17f013992aab461cc87547571bc824dcbaedf5a535005bb60f9ff8d17376821",
"format": 1
},
{
"name": "plugins/modules/configuration_template_deploy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "90dcd2f6eddebc69a201447994e512cebb4c841edd8553949a4137f75e3c8d25",
+ "chksum_sha256": "25716a8304f6d3d2cf71687dc7fa67a970476462dbd150b197869dd8d79252ce",
"format": 1
},
{
"name": "plugins/modules/application_sets_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "98fc9a92f6d0c3c7e577566422b026881cfdaf6036d934e5270c5afdae983f18",
+ "chksum_sha256": "2dd82f908f43a7a9c18e60a76a2e5fff93c5f0f7f2e88dc33580ffc1ab22589d",
"format": 1
},
{
"name": "plugins/modules/device_family_identifiers_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "af0f77c84835c541f674fda8f5e5aec7870509f852f3762a890866fbb9c66969",
+ "chksum_sha256": "bea4d4ef7a733abe83abcadcd8f3f638aa38f83ebcc53d8c69abf61a0a699144",
"format": 1
},
{
"name": "plugins/modules/compliance_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e5f5aa666609204c911a9185974570eb25291ad7885dc0b475bc83258f42512c",
+ "chksum_sha256": "68d11400c2a1460502bf973e8f34d63e8cf668b3158ee0d18332926623fbe908",
"format": 1
},
{
"name": "plugins/modules/device_configurations_export.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "038af8d5122dee1aa0bcac5eb8fd3eea96d3a1e4da5a5c9fa18dafc8e9cbdc9e",
+ "chksum_sha256": "1b1bea127f011c75e212a406bec66e6027e9091338f02e4ed63655cb45009953",
"format": 1
},
{
"name": "plugins/modules/pnp_device_reset.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b84251ad7277742f47d76491d0e97622ff4ff73cee04a6de7cdb6246671cec3b",
+ "chksum_sha256": "18f72f928ff064c8be1ffe100036b6e511c6cf4d61341795a5ae44fd25273ce2",
"format": 1
},
{
"name": "plugins/modules/pnp_device_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63f4e90acc242174dce7f56ad2c47c552d979da967c9ecd23d07a2d7aee5db2c",
+ "chksum_sha256": "732bf747504e5438618fc356c4c0304a630241f2d66c60e4525c713ff3066725",
"format": 1
},
{
"name": "plugins/modules/task_tree_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6211a3d60cbf50d88033d72e71840da812111b698fc28207fcbe308270746a1e",
+ "chksum_sha256": "59893d9359af8cc27e151b5ed20f645cf7a8b6b638db999ae6fac7c3f48d9a97",
"format": 1
},
{
"name": "plugins/modules/network_device_vlan_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8765806aa1b2c2180cae25d4575938df40df8d3bb28d6f18d15cad1222fa699b",
+ "chksum_sha256": "5930cc396ca55b4d45bd55be12ff4217ce39a7a128cf57086e81a08fe3e4911e",
"format": 1
},
{
"name": "plugins/modules/itsm_cmdb_sync_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "79ace219b614472c6a7d6fea59a45451fad0440136ee94b347f16bf267461fa1",
+ "chksum_sha256": "2bdc11fb3544154af2c2cc7c6b4a9440c148cbd83dd71b0406cc8b473f7d81cf",
"format": 1
},
{
"name": "plugins/modules/file_import.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "60d334559e19014077c1548244ef0bcbf69b122fe53bdfca9682c061eeb67e68",
+ "chksum_sha256": "b50500ed9705cc9aab6d449087985ae9a15b58912610d7d43031171dde180380",
"format": 1
},
{
"name": "plugins/modules/app_policy_queuing_profile_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "89b90def6f4573f56b789007c885a93fb2e6cb0ee7195f586b0ed32549082053",
+ "chksum_sha256": "764f46f16e0b00ff41d2fadd5b330dd93da4c7b973be4dcedd0403139d94ebcf",
"format": 1
},
{
"name": "plugins/modules/license_device_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38bad78c0bad7272ef23adafd9d25adc94ed8e01b9bb587436a044513735157c",
+ "chksum_sha256": "73b123592b5032b2bf01a1a3d07309c3bd72e00babea6a57cec23e4d88770a73",
"format": 1
},
{
"name": "plugins/modules/sda_port_assignment_for_access_point.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63fdaa25b5ab63e4413c1429cc4dbd125cd011cdbff3d7ab1b91ce4310f58f39",
+ "chksum_sha256": "0083dc63ec58196ea6e35b8090c3f0e6129f32a822d22444230b8c908954ea74",
"format": 1
},
{
"name": "plugins/modules/nfv_profile_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3deb80367d65aac4b198aea936beb4ab3734348660b53bfff6466b3bfde9e019",
+ "chksum_sha256": "c221b4a09bd70a6967d2d8112dc9a2b686e06096015ca32f87ff5d946cd0efbc",
"format": 1
},
{
"name": "plugins/modules/sensor_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c27aa720f87ca297af307a213cda6c328fa7bbdde8603338c71471b0653d8c70",
+ "chksum_sha256": "86bf44ebb2ecaeb88dc8c0f38b1aa579fab91f4b4c2d0befbbe0ad25c2fa8456",
"format": 1
},
{
"name": "plugins/modules/discovery_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea537d263922e9274123283489d1900a22189508f0732745c50f77cc8b78c835",
+ "chksum_sha256": "e427e86af18d037d23dbe7ba001fdc804209faa0a3db0d95a66306cac9703c47",
"format": 1
},
{
"name": "plugins/modules/reserve_ip_subpool_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e8d7eeca847a7f7aec15c40fa59359f38dbf117bc270a781ceea2a8fb40453d4",
+ "chksum_sha256": "2c496cdf70d115f1a5eb9aa9d27ca58a914b4e1afdce1e9ed4039c167c5c96c5",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_edge_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0ade5a67024b69d30c659db3dfa5464b139b8231c665c32f89ace415516237d4",
+ "chksum_sha256": "da4b7c0c2189805b12502ffee36f981e43f66b64c11d72e9114b44e3dc36ea32",
"format": 1
},
{
"name": "plugins/modules/issues_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3552fe99cef7550c3b8e8f0a071eb0864fc63259c2126aeb89facf8cf86ccc94",
+ "chksum_sha256": "3233a808e2a38a5dcff1c5ac5dae05c3c234ef3867ea579b4325c6308644fee4",
"format": 1
},
{
"name": "plugins/modules/reserve_ip_subpool_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "84d4aeebbf3ae99ad5704beb229edc2dcdd26013ba963c54edd4eb686efe94d4",
+ "chksum_sha256": "be838faad1e1cc2132456eef16a45989490e303cf472101662e899ff746d3471",
"format": 1
},
{
"name": "plugins/modules/system_performance_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ce0e3e28ad1703d22bd5bba859f83bbfe0160b0587fb9335f6688e4d2ce08675",
+ "chksum_sha256": "94b84d09630e63de3e78fb401d831c1b575f2b67ab203a9630e73a249e414c23",
"format": 1
},
{
"name": "plugins/modules/pnp_virtual_accounts_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d3d000a260fa55c450387c04b85fb4f6f38e231b29797280a5323bf7c7edb913",
+ "chksum_sha256": "4da458d6f6900281ce72fb7d35efdafce5726c2a7b1ed1fceb96013e39df2a2c",
"format": 1
},
{
"name": "plugins/modules/qos_device_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b1ed49412c7738a1f931e74444b0389393c63f046304fdd2eb165f25c12e286",
+ "chksum_sha256": "345a0c8ba2460447514eaadd9a4c6c06437a41dd523ac0ee242b438bc5b6fa7d",
"format": 1
},
{
"name": "plugins/modules/wireless_accesspoint_configuration_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9cb2a083446c1e18ed6244b83c2202c4e16a6676cc19c18fac3179b564588f99",
+ "chksum_sha256": "476d76a1dae5fb65ec437614086f4330345337c4a8016143bb4c0e35e70f5394",
"format": 1
},
{
"name": "plugins/modules/platform_nodes_configuration_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dffe10b5ee55feb154d6cf7928d528a6973cc82a796f26b65587dedbb7a3aa53",
+ "chksum_sha256": "425dc1675cc14df2e1a1f106ba82b015efea4dad660efd30e90a85513544fe6e",
"format": 1
},
{
"name": "plugins/modules/license_usage_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "39f4e084e20c4647d22510532eeefc7cf905aed4cae0ff816a4e42679d305d42",
+ "chksum_sha256": "b4cd3c33a245ad781ca91ed701162be7f153a784fc5074510e6653ffd37eea58",
"format": 1
},
{
"name": "plugins/modules/swim_trigger_distribution.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7a5653bebd2c34a0714a01f3d51b99b05410f365e1eede791c20d0cbef500689",
+ "chksum_sha256": "05301b58c6bd53db105787507b8d95f9146e876c04517da24a2ed7ce93e5ca9e",
"format": 1
},
{
"name": "plugins/modules/network_device_config_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1bc10f975659b61c052672f75aa014afcee5d50527a77733aa7d65bf269d33d4",
+ "chksum_sha256": "fdcbd52016db5111340cbe50b352689233b74841792b2ac6e26baee1962dec7e",
"format": 1
},
{
"name": "plugins/modules/golden_tag_image_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "af30f6bb7ef5288c45378e2bf84c95083b6cc24c78b4a3cd4cb0d2927a260fe0",
+ "chksum_sha256": "fa5190a562a76348af1a487b0fedfeebcdf38420faac0273a0f4c4d7c2d6cb9f",
"format": 1
},
{
"name": "plugins/modules/app_policy_queuing_profile_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5db47e0ca40ec28b5e44446ca95ae502b086663fe74e7f230280603ff5fb93d8",
+ "chksum_sha256": "7901bb6d68d20beacf33d98102b5f4c9a60d04363823ad08eed7199ce413a49c",
"format": 1
},
{
"name": "plugins/modules/device_enrichment_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d025fb5a1fac7cc308fea73147e225741f80872de1f8a3244431838a5f60ac36",
+ "chksum_sha256": "573bbc37a473a66dd6917c421cb88b41893400becba54c7445e1c74141854444",
"format": 1
},
{
"name": "plugins/modules/file_namespace_files_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b56ee6140cf2f73c2f68c49c93c1271edbcf8483747c5932454a3cc995ec70f1",
+ "chksum_sha256": "b4b92d8ffd4657da74f40eb67135e126835805a45ccf56b10a734f913dcb14f1",
"format": 1
},
{
"name": "plugins/modules/service_provider_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df3d1a7041cf1f997b84d85529e3d286910b51586dd1b99f1121c6d587bc10f0",
+ "chksum_sha256": "01cdb05b3612adcf7492d4c05b7bf341129e6bf945ca8d6e1a7d0c98df1c70e6",
"format": 1
},
{
"name": "plugins/modules/swim_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a8b6020f943c3d565d60d2644acd609a03aebe0c4cd8b08799c09c9f13b9745b",
+ "chksum_sha256": "2496669e06e0ff4439abcb47e8befc98e803b204c75aeec972991ae2216d070a",
"format": 1
},
{
"name": "plugins/modules/license_device_registration.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c8a029903f8e77e904867dd24d4e0537ba08208b6158867447ec5f54a593df36",
+ "chksum_sha256": "8911294bbab15816cf933fa3c99fb99fcc5d59a70a98353e993a5df1fa61913a",
"format": 1
},
{
"name": "plugins/modules/configuration_template_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6fcbd071c4834217eb670ef057c6ff73b1b74852e902e7f20e7b9c8ae09da7a7",
+ "chksum_sha256": "d4329e504a1f1ae60ea74b216f842bc3b1f7425e666f6eab3643f3a01499c275",
"format": 1
},
{
"name": "plugins/modules/topology_site_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "db630236845f02e3509240826214f5128dccf05d85e8973d09a4161b099119df",
+ "chksum_sha256": "8013a0732ee984bd7779b6e2fc10eac4a1dd833e8d39bb37161857ae0a9191c5",
"format": 1
},
{
"name": "plugins/modules/network_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fc87f5d7778a2fd653e5cab539eddcac1fb16c4b13c1c5df68cf3e75961ddc59",
+ "chksum_sha256": "f84233f884fb03d3a49de190b30e1dc254fecce2ce839143fc2b21c259ff3141",
"format": 1
},
{
"name": "plugins/modules/network_device_functional_capability_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "927c87255cacc9d32ffee2930f01925605380a47c0216a545190bfc59cbdf3fc",
+ "chksum_sha256": "2c970dd0ad71174f2f57047aa0361be3a6cad21743b0d15e1ea944944d5d492e",
"format": 1
},
{
"name": "plugins/modules/business_sda_virtual_network_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3d0639bad3ee9594380c5f3ab116df124b4fad607652958e41cb740aa83af4df",
+ "chksum_sha256": "f0961a8523eec413b3ea8e505b823d54dc47eee05900cd1b5e2aacc04fab8161",
"format": 1
},
{
"name": "plugins/modules/sda_virtual_network_ip_pool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cf15ac131559830c1e130d24b486d8b1e540f7816ac80deb83248084d8c0cb7d",
+ "chksum_sha256": "30c2f462463ccca7ebb154d7112289b6e4b5dc7b84dbb16184c05946ef545f48",
"format": 1
},
{
"name": "plugins/modules/sda_port_assignment_for_access_point_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f756e843fb2f7626eb41a17caf18890c9b86c8810fbd2ff3ec4869a94a07b995",
+ "chksum_sha256": "36b20fa02a78d3856fc637637ef790a4c6d9fde70df05ba64b6d507833e70033",
"format": 1
},
{
"name": "plugins/modules/snmpv3_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a89b8c6e527f99286892d6da87131e4579e68fb056f4b64b1c1370995530394c",
+ "chksum_sha256": "4986e2f6eb85ab186ec1dba19172866c46c914d89a53fa703e4dcaef2a2002b0",
"format": 1
},
{
"name": "plugins/modules/configuration_template_deploy_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "86e6e7345b4cfd309247fd956e8ac1b914267dd72bd38389d7a8a14983995e0e",
+ "chksum_sha256": "cd81da364978b6b07c8b740866b2f0ec5158ec7c121405cdda89b9ccf9827304",
"format": 1
},
{
"name": "plugins/modules/applications_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13ffffb6e7bfd438badf41dab65af8d3422f1bcbef8d826c7a9420b8e77ab63b",
+ "chksum_sha256": "95631698e329c64d12a016b29dbcf4503e15142a399d35c865f4a67af9ebb6e1",
"format": 1
},
{
"name": "plugins/modules/sda_virtual_network.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aa2981517a9fab531d9f2a31c516be5c127e43deefd2076c3e93f8807647ad92",
+ "chksum_sha256": "0a9db2f68811fa69d9bc436fd4e2f811d72046610895ab77077c1b3cd40317ff",
"format": 1
},
{
"name": "plugins/modules/interface_network_device_detail_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29dec8355faf383532a649f73821328951ccff1d10f779ba816130ed33baf308",
+ "chksum_sha256": "5180c047f70c067118628a41c0b39cb35a8809aa144d39d69e5fa26f93bde66b",
"format": 1
},
{
"name": "plugins/modules/security_advisories_ids_per_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5fb0cc73606fa28b9146277c1b89830a9b54abd125a6ae1c28d04e711679bf83",
+ "chksum_sha256": "ec65ad9dc89bf2383064373c81a8eb380176512b855df4af9a30e37abed9d3b2",
"format": 1
},
{
"name": "plugins/modules/platform_release_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "58b717afbca97a58833054b8714e07b0aec0cf548146d3479664fb3ee6a985a7",
+ "chksum_sha256": "8d8908b473417711a0b340aa89c684182c453e0c992780c67d4054ea006404b2",
"format": 1
},
{
"name": "plugins/modules/network_device_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "982923a1bf449cd464aae865f0e9ec778c0fdf9c3f72020acf09ab39043cd81f",
+ "chksum_sha256": "2c5d2866eb86e0b1b66454231d5f4f97051b69503a9396c5f239e964a08771c0",
"format": 1
},
{
"name": "plugins/modules/event_series_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9850fb6a1eae09f739e3c8f066e18c6dafc4b7d7690c79425a1367dbbe4f2ada",
+ "chksum_sha256": "b6a358d02719db2e816a63eceb647f47065f4bc850417ce3be6cbcd251b52199",
"format": 1
},
{
"name": "plugins/modules/app_policy_queuing_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a945521dc0a36557324ba8f735b5319a2362f2803616a6431680aaaf9410229e",
+ "chksum_sha256": "0a2f9c2eec211c62f7e7e3805c7d79a1bf0487a7c5af795c084366806812ff2b",
"format": 1
},
{
"name": "plugins/modules/service_provider_profile_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2b5a0c8eece9d627b97da82ab3b601fc310cf7263731c976120d11541c030876",
+ "chksum_sha256": "ad7c00fc5747b64f421bb56bf49d69e2a7c602bcde375da4903581fdd9f4f733",
"format": 1
},
{
"name": "plugins/modules/service_provider_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "511825ebbdcd1ad32fbdfdef704bc8018dec865c2c93b16f298cfa4c5c592fd8",
+ "chksum_sha256": "fcf85ee32ff93d2d080a05983bf9ad5c84e9208186b49cfd2e99fd960e7d6071",
"format": 1
},
{
"name": "plugins/modules/network_device_update_role.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb6c54d7ba3e18879bb08fdf2bc5777f2542bdc880b05b9aeb3512c65cec193b",
+ "chksum_sha256": "5527bd9efd7c373b2f2bef0c7d9769178dd03da2214d9ec0d8327c75605c9b5a",
"format": 1
},
{
"name": "plugins/modules/sda_port_assignment_for_user_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "943e70b6745a6ab45a025e0f46cbccc3d3d23dcfaad3f8fe1ee013d092f1a559",
+ "chksum_sha256": "3dae9e1a13f2ef7c64599173440a257c981aa1973e521b2a21ecb19777a4f420",
"format": 1
},
{
"name": "plugins/modules/transit_peer_network.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7d244b17c6c387309ba41609218b233d808ff5f4bdc76ddcddd0d610058c2c7",
+ "chksum_sha256": "753a85064c256636c3d572a0d95745615caf59d3467d23640c0dfa67609e8508",
"format": 1
},
{
"name": "plugins/modules/device_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "05ba1ddfe43be06e27d2e5c1b50bc0eba78d9af58183b2f1133df1143640e371",
+ "chksum_sha256": "6edf275ba5c5101305b745ab1da31394f4921ddc7273390dd6d7d9ba68443f71",
"format": 1
},
{
"name": "plugins/modules/device_replacement_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c58f1db9957c2bc925cebe668fdc10b4bfb2f12edf674910b886ea35f5f1dad",
+ "chksum_sha256": "ec372d22e552b584051564f4b2350201d6f100dd15d9d3b8ceec092d7f3662e3",
"format": 1
},
{
"name": "plugins/modules/service_provider_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "83b487a8fb0060e51894e3969051013ca6fa68c85c69a5d2af459ad15ac0792a",
+ "chksum_sha256": "0e08a7b59aad648e9080fceae08654318c57de7b3103c49f832938dad61f1e4b",
"format": 1
},
{
"name": "plugins/modules/sensor_test_run.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d9ef6a8aecadeae78590a9e9a92d74a288d759617fa004f89a7b32e6cb192a0a",
+ "chksum_sha256": "fdc7503849a10f9f5250efe5aff1762230f36c307dbb2b9525269dff88741562",
"format": 1
},
{
"name": "plugins/modules/event_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e6c8fbfdf60b1cbf35e4ef163250b0ccd13f218ec7b4d35ef358334102ce0ca8",
+ "chksum_sha256": "d9e1da13a438a4aa0e9789bd0b8a8dd2a62d744a74219d52bdffcf54babe7a90",
"format": 1
},
{
"name": "plugins/modules/device_health_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "791677d81789ebbed706d0a781a8364f3c236a1a27879d76775e53ac6f11fe7e",
+ "chksum_sha256": "f9dd5499ad6dbdec5e399ccbde4b4a341d487e2c25abeef9db15c8a822764f38",
"format": 1
},
{
"name": "plugins/modules/netconf_credential.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3cc0b590cea4d7911d9f7a4c01c4a04dfcf56cfc52d12525d64cf3f8df8c6d04",
+ "chksum_sha256": "042123c962929ad1cd28b34d332c32c3762f34b6da174aa9016a5d5076026a1e",
"format": 1
},
{
"name": "plugins/modules/network_device_register_for_wsa_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a51c888d705368497962a078aa815be28e390682a020bbd2169f442a839b1ab1",
+ "chksum_sha256": "90f6f71069aa7cc1ae69ce29872ac0de4abd18f00b3938451440a10e2f9aaf56",
"format": 1
},
{
"name": "plugins/modules/client_health_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "857c1660250039a5c1741d22b4ade73cfd657eca042dbcf94af746e928ddf26f",
+ "chksum_sha256": "f19acdcc18536cc0d1481d2f1e599470b2452f535e9a7875fcc561cbd24a3af8",
"format": 1
},
{
"name": "plugins/modules/provision_workflow_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea01d7479f375bd14749bd5b429060015d6749db77c8cdabce553102a87d0001",
+ "chksum_sha256": "b4022bae7d5a73a4f04189450ed124ec797c1d074188ae2448f781838cca65cf",
"format": 1
},
{
"name": "plugins/modules/interface_network_device_range_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19b7c1e2995808459fafb6c690e3f8bc0a64d0bfae83f2e2ec6fa623ff730eed",
+ "chksum_sha256": "9c0d0e2edb7feb9baae0fea938aa582bb5e12fb5d43ae1e8b073fdfb2f8a3a55",
"format": 1
},
{
"name": "plugins/modules/inventory_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3e32ad491d38e58f18dc8f8f91fa6ba179a66486560b0af6b478b77ac7a0d17d",
+ "chksum_sha256": "ece57506e288379d5617d21514aa1511a81e33a5797c1965ed32edb945c46829",
"format": 1
},
{
"name": "plugins/modules/compliance_device_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "35443e54b6c214c49019c9fab77d82613e933953647a3374403a2cb12184e149",
+ "chksum_sha256": "dd1ff0a6119295b29da46673213a0a532d43b69fa99dd2350e379aa4211a710f",
"format": 1
},
{
"name": "plugins/modules/discovery_range_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba13da77c7f892c1c399c6c958d1dc6af70093781b233bc76e1b129cf8366fdd",
+ "chksum_sha256": "57dcb52ea8cb6564b792c1858e50f4c101fd7c200c8e93848963f6d07ed5ba57",
"format": 1
},
{
"name": "plugins/modules/pnp_workflow_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "41f823ef28a342294d766f9522bff57ffe9211a741a62f18dc77681880451b66",
+ "chksum_sha256": "b510f57488ce208d9b3d50a4228efe565ed55013b2e2fa4a439cdf217a51dd28",
"format": 1
},
{
"name": "plugins/modules/network_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f02d1b6a2bc7d29c324751ee16f25f3c03738e7b331eb928808e4198299e61e6",
+ "chksum_sha256": "5745ffb093995318488363a512a318b47e8f5fe848eb29735e01593d4ea4c4d9",
"format": 1
},
{
"name": "plugins/modules/network_device_export.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "39eb919e626e7499b8673e34a7f09cfef626a25b57b37b1dea12692375bc0c35",
+ "chksum_sha256": "9fdb9952b2c82440a6d7621254e07990602c70579bbd4c49a9a234e83233a933",
"format": 1
},
{
"name": "plugins/modules/templates_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "80961a246d11701c7960328d29cc92e521e2b7e043fd6afd174e37f6ef70fdfb",
+ "chksum_sha256": "99c2b3a5172cb9fe26133dca84865f6dba2fb2f663ecc97dd9530141931574e0",
"format": 1
},
{
"name": "plugins/modules/event_series_audit_logs_parent_records_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e52bb2cb28598a48a229fef52d69cc9bd3f4a384ce38a92c48c1081c2df88061",
+ "chksum_sha256": "cc6b6acb562cb233d3073e4d8d9a8fd5947c05feebe45d447270626c887f263d",
"format": 1
},
{
"name": "plugins/modules/network_device_with_snmp_v3_des_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e3f6be580ff6aef59ca86668367bb517cff2e1e9523fc67df92e5098f17c136",
+ "chksum_sha256": "9680badfaa131c3e8402ed585e1f9f078b24fb0188c87565a3ee5f94c4134587",
"format": 1
},
{
"name": "plugins/modules/license_virtual_account_change.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f959b44edf5561390ce868113ac8798bd3fdb62b6a8f813a2af96dacfaef7758",
+ "chksum_sha256": "c50583679b1731041148b0ba9d5426b6d9f6d22de366ee1d81617be686bb8394",
"format": 1
},
{
"name": "plugins/modules/compliance_device_by_id_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "99092cfa9ef9757a242cfacfe72bbd4930a5b62cff286c0f3922ae29957a0554",
+ "chksum_sha256": "2b7d3287a9ebdec1a9e0a3247bb0d26645c810db6188be6a6e019816096fd099",
"format": 1
},
{
"name": "plugins/modules/pnp_virtual_account_add.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e3b97f7bf0ed8a871c8abb93526c139f82a106537cabfa8690ebe05106555cd1",
+ "chksum_sha256": "f4310f4e30db9d98de59b39284f4399711f959d5f9f5a7ed91170b3e22e9abd1",
"format": 1
},
{
"name": "plugins/modules/template_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "90ad608b3f5bc90983bc7bc913a7faac8179061d5f16d8375d43db5fa8e1129e",
+ "chksum_sha256": "7ad39ee74214a8463839de83532758e62d11b82196dc9da4ee79090e008fbfb1",
"format": 1
},
{
"name": "plugins/modules/tag.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28abf9ac9cd0f7582a16458a2efe213ddefbc0c742ce0cebbf4700dbf53e366b",
+ "chksum_sha256": "599cb4070ae8d04cdb5c7aa40230cabd02434dd1781fe0cb30edd53f96c91aa7",
"format": 1
},
{
"name": "plugins/modules/reports_executions_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "49a10ab49f8b0a56e5e83749f6c828406d882fcf61f2cc74bda28ee879fe7bdc",
+ "chksum_sha256": "8d8d4e2cc1aa4e7eb5cfde98efa1d0c0fd815e0732e25c88052832fec71bad4e",
"format": 1
},
{
"name": "plugins/modules/sda_fabric_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "567d8c20183935c551e0112032274d9f40f1e0e7d1f12a7729f241e5b324fdc9",
+ "chksum_sha256": "21d8b6a152f6cf176f988135c026a332e0207dbf527c2d8ce8e4f91fb3a29ce6",
"format": 1
},
{
"name": "plugins/modules/device_credential_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19434098bb531f5645cc9dd7ec3ef060fc62eaf8505a4a1afaccb4e4f7a4cd56",
+ "chksum_sha256": "32c77e4f8bbce95b669e7b633cb634c0ce90f8bc90aa5ba05d88378c1c72b7b4",
"format": 1
},
{
"name": "plugins/modules/file_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4cb5ac356f530f121a40f993997abbc4cb011c4fc6336577789315426f79b4f2",
+ "chksum_sha256": "be00fb30acf461ef13d6f53e64d6566e3373854c4f4b814a068705795ed1466e",
"format": 1
},
{
"name": "plugins/modules/event_subscription_rest.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c947933ec1bc1405766e8a4d8dfef9d21343fdfd4ac6600c38b17335a8c4d34d",
+ "chksum_sha256": "781ca61ab98e39bc744c37e1a49c67cb4145ef0d2ab0ea5d5b72f29053166a8a",
"format": 1
},
{
"name": "plugins/modules/security_advisories_summary_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc882aebe138607d0b303827e205b6697f05bd986071c0d7d49548781b32271a",
+ "chksum_sha256": "d2427fda49247b452d0a814c785608c30798a6411ab8556a9af5c8fcff2d501d",
"format": 1
},
{
"name": "plugins/modules/network_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "572dadf002c013b3d9b528bbf1e24e94f29aadfb0eb33e0caf42712fd1f77260",
+ "chksum_sha256": "230805a1eb0dd3ee97a3310492d877cd6782682c785487f62b05d0c392fa3617",
"format": 1
},
{
"name": "plugins/modules/integration_settings_instances_itsm_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "09265bbe02e7bbcae7fe4d7202d9c0ab97d2e68e24581c238d6bfadd65e91e78",
+ "chksum_sha256": "d62bb9050400c5eb96b1086e303eafea81a553acd984f837a7f37fa807c078b2",
"format": 1
},
{
"name": "plugins/modules/pnp_smart_account_domains_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "894a1ce5ae2d4500837070af6d35bfbd0c7cb18ac709e9ff0f8726407bc37b0f",
+ "chksum_sha256": "d1d5cc0723495f018e760b2307f0a562cb82784ec0a94f9fcdc698570ea2cb48",
"format": 1
},
{
"name": "plugins/modules/security_advisories_devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "09e0461d3ce4c1a16932b8c32bd0bbd387cec9e69e31a256032c2558b7d2338b",
+ "chksum_sha256": "c46d4671ba23a245e1e394231f7be2aee9431c7b1075beaae8c61b87974bf3a3",
"format": 1
},
{
"name": "plugins/modules/reserve_ip_subpool_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c3ac587db4e5fed02cb076ffd58554834ad7077d8a0718d41985059b896469e",
+ "chksum_sha256": "6a196f4b903c9f46fe96bcb9f413e781b3ff54e6804e498b253f3a4e72059098",
"format": 1
},
{
"name": "plugins/modules/network_settings_intent.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "85003b655194a3dfdcd2fe1e7780475d8f0d75f602325be07fbc6fd8b5b71988",
+ "chksum_sha256": "3fb788c847df332d6938200b8e1085e06efb9a52a03eafd6f1bf57ad4cfcd9f7",
"format": 1
},
{
"name": "plugins/modules/itsm_integration_events_retry.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2bf7e87de8923919e3b20a4752769ba67b4c74769acf40221405ad386e66c3da",
+ "chksum_sha256": "b5fff2a26a1bff3739f193a1c8d97bbcfa6b858b0e6724c485decb12848ecade",
"format": 1
},
{
"name": "plugins/modules/user_enrichment_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7638a42d626129b870405537665e64ee9f9d1215b087ffea389a58ce4b9e1aaa",
+ "chksum_sha256": "8e9e53d0be84ff2313ade25053b67ef7aff8e10b0494d3a588d2b0bcd3376745",
"format": 1
},
{
"name": "plugins/modules/site_assign_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fc61bcf87db49d5ab5088e8378c3e7ff4a350c6c175cb63693d430f61fd4c7b5",
+ "chksum_sha256": "6ea9d0392351b4c14adf24902b22fb610b12eab49398a314a6dcc73fb30641c1",
"format": 1
},
{
"name": "plugins/modules/golden_tag_image_delete.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b227ca6d6948a108ff4eaf9335ccc49b19a602f95f784b7dc6cb33fe09edab66",
+ "chksum_sha256": "9cc5242bf78cac68ab06a508aa7046d6d20de4c3e1d0658f9893e21ddb6a39fc",
"format": 1
},
{
"name": "plugins/modules/network_device_linecard_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b408a876eefa5939ca6c7b0a05d5aab4fbeab243aa0dff400083bb0e8612f7a6",
+ "chksum_sha256": "ec2124d0f33ed574f0135698679be01794cab7c5610052899579266dc7994860",
"format": 1
},
{
"name": "plugins/modules/issues_enrichment_details_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1a6d4e1e484ffdc78c6227b1f41ceefab0cefcf7ff214f2dfd59b33a1db3f022",
+ "chksum_sha256": "9ac8965247e64c864374eb781b66398c38deb4e24f366c232c4a04e52dc2e59f",
"format": 1
},
{
"name": "plugins/modules/golden_image_create.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b4c425e6a3760f8a0d1ef1e09a71d3bc1d9bbb549593ed358ebae02e70f0062a",
+ "chksum_sha256": "b7a030e84fb8bfdae750f3b26e44a3ad5a69e6f977ce205ae2c3647065ad70b8",
"format": 1
},
{
"name": "plugins/modules/qos_device_interface_info_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "68de3c82502965a33cb10bcf2b3dc71d0e120e8214ac5905f84ac66acc267e06",
+ "chksum_sha256": "367f38405567a693e4948efb26b11bcf2c4cf8cc17141c848d96b32f0c39c4fb",
"format": 1
},
{
"name": "plugins/modules/compliance_device_status_count_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71ec2207cd2f09326400af3e3336313fff273a6d338a88fe1fe009228ecc2741",
+ "chksum_sha256": "cc118928a2bf1982387666dbc9f518b089e12d01af303100583072a0da87b383",
"format": 1
},
{
"name": "plugins/modules/configuration_template_project_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ceba30f1dc4cc1ea29ab78e89039fc46e4cb25097ff92d75f9fb46102adadb31",
+ "chksum_sha256": "0628463b729978f221dad948cdf77316e9564dd2f9cdaa7a299a2970658c312e",
"format": 1
},
{
"name": "plugins/modules/pnp_global_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5917ba9cf862f97b5973d06d69cfd0585f3a8d9504038a14575da30394c84833",
+ "chksum_sha256": "42bee25376c6dfcb9043b0e59fc9b104bcb2cfa23a2e150a10dd900c08df0153",
"format": 1
},
{
"name": "plugins/modules/configuration_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b5f8797ce134751a5ad59294ad30d1c859fbe7f0255352fad4a3bb45799c981",
+ "chksum_sha256": "f4ea58c333f46cfbbc93da9bdd06331d9497625009c9d82faf6d384516212adc",
"format": 1
},
{
@@ -5828,7 +5828,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e182a22d58fcfbca71fbef1992147e1cd87fc67648750e62b5955ec72521520",
+ "chksum_sha256": "720f48707e16c8707f33f2bc22bbd53207b492502669c2649547d652b5f99dcd",
"format": 1
},
{
@@ -5856,7 +5856,7 @@
"name": "playbooks/PnP_Workflow_Manager_Playbook.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "376cbea818770893c8c6eb980dcc8a64817ed71fc89808e1877cbbb0d262e810",
+ "chksum_sha256": "08b8fff76f4d14cb3667114120016e281ea732d831274e1d3b48df1203e6a840",
"format": 1
},
{
@@ -5891,7 +5891,7 @@
"name": "playbooks/device_provision_workflow.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28bd738eea40bad4819ae44803c03830e448ae3b750d795572e3872b42bb43cd",
+ "chksum_sha256": "d7824efea5e33a458e49665dbe08e87acc2978da4925d834592808c495b9e3fc",
"format": 1
},
{
@@ -5940,7 +5940,7 @@
"name": "playbooks/PnP.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0ace6a2cfb7cadc96e527dea4dad9616c35769151456271248cdea3c39a6c1df",
+ "chksum_sha256": "e580e727c566addb668411df8e6f0e8c694b1749f7f77078aad5366a133d18ba",
"format": 1
},
{
@@ -5968,7 +5968,7 @@
"name": "playbooks/device_details.template",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "92ccdcdfe15f46252c522238c97e5158d18676eccddd3a85f23a8f497b4e0c0d",
+ "chksum_sha256": "18175a2f86c3e2f5757bab3dcba655146e84383e24c39feb1b1f1404a25aee61",
"format": 1
},
{
@@ -6129,7 +6129,7 @@
"name": "playbooks/template_workflow_manager.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1097e1586a9408998c3a1d513ad70492849e26d052b20816e27ebb60b8ee1d94",
+ "chksum_sha256": "dee57171b4a8bfd5f27f90921febf88baa6ee52f34bf9e88290da2b496ba87cb",
"format": 1
},
{
@@ -6283,14 +6283,14 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bcad14cdf9a6044c9347400ea1cbd6432ddd38c4b5b12e78a54bca57fa96355a",
+ "chksum_sha256": "0471f143c1a2248a79e6252e9ab2b902aa90ce8c49bade17d94c7840c109a871",
"format": 1
},
{
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f1c14af9aa1e4bf92f028daab559d8912231284b04beeb34459404d0cc085ef1",
+ "chksum_sha256": "a22c72a870f94ee00f2b75ea7c907e3bc93d43c3479c8d56841b2bba927ce5db",
"format": 1
},
{
@@ -6315,17 +6315,24 @@
"format": 1
},
{
+ "name": ".github/workflows/sanity_tests_devel.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6c41a530b4e23f25d25005770db0857d676bf605a83386b6d9dbc6d16ce3740a",
+ "format": 1
+ },
+ {
"name": ".github/workflows/sanity_tests.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5f73c04a8f73f124035ead77d2dfa8418bea6af501ffc3ddaf20eb04abac3bd6",
+ "chksum_sha256": "54f5ab1ffdbf3ad7f8992fb1f46398304ddaccaeca0ff885bad53be768af855f",
"format": 1
},
{
"name": ".github/workflows/docs.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d8611ee91073e25e678934a5f53609f26282966c77c50c38527065bc467eb344",
+ "chksum_sha256": "f0a547c256a584df7a0a12f1f14604f37775b81f01cca623667a811c9d6ed6af",
"format": 1
},
{
diff --git a/ansible_collections/cisco/dnac/MANIFEST.json b/ansible_collections/cisco/dnac/MANIFEST.json
index 4d4e0c65d..7c31dde5d 100644
--- a/ansible_collections/cisco/dnac/MANIFEST.json
+++ b/ansible_collections/cisco/dnac/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "cisco",
"name": "dnac",
- "version": "6.13.1",
+ "version": "6.13.3",
"authors": [
"Rafael Campos <rcampos@altus.cr>",
"William Astorga <wastorga@altus.cr>",
@@ -31,7 +31,7 @@
"license": [],
"license_file": "LICENSE",
"dependencies": {
- "ansible.utils": ">=2.0.0,<4.0"
+ "ansible.utils": ">=2.0.0,<5.0"
},
"repository": "https://github.com/cisco-en-programmability/dnacenter-ansible",
"documentation": "https://cisco-en-programmability.github.io/dnacenter-ansible/",
@@ -42,7 +42,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5e6e6d846a1d245059dfee01ac8ee7dbd3af1e69fda28f415a6d670fb8bdbd93",
+ "chksum_sha256": "d5808375079300aef903ebc6a1308b5535b15fc6d726ea535ee8ff83f05aa969",
"format": 1
},
"format": 1
diff --git a/ansible_collections/cisco/dnac/README.md b/ansible_collections/cisco/dnac/README.md
index 2492d75b9..4d2835f33 100644
--- a/ansible_collections/cisco/dnac/README.md
+++ b/ansible_collections/cisco/dnac/README.md
@@ -15,11 +15,11 @@ The following table shows the supported versions.
| Cisco DNA Center version | Ansible "cisco.dnac" version | Python "dnacentersdk" version |
|--------------------------|------------------------------|-------------------------------|
-| 2.1.1 | 3.0.0 | 2.2.5 |
-| 2.2.2.3 | 3.3.1 | 2.3.3 |
-| 2.2.3.3 | 6.4.0 | 2.4.11 |
-| 2.3.3.0 | 6.6.4 | 2.5.5 |
-| 2.3.5.3 | 6.13.0 | 2.6.0 |
+| 2.1.1 | 3.0.0 | 2.2.5 |
+| 2.2.2.3 | 3.3.1 | 2.3.3 |
+| 2.2.3.3 | 6.4.0 | 2.4.11 |
+| 2.3.3.0 | 6.6.4 | 2.5.5 |
+| 2.3.5.3 | ^6.13.0 | ^2.6.0 |
If your Ansible collection is older please consider updating it first.
@@ -44,9 +44,9 @@ ansible-galaxy collection install cisco.dnac:3.3.1
```
## Requirements
-- Ansible >= 2.9
-- [Python DNA Center SDK](https://github.com/cisco-en-programmability/dnacentersdk) v2.4.7 or newer
-- Python >= 3.6, as the DNA Center SDK doesn't support Python version 2.x
+- Ansible >= 2.15
+- [Python DNA Center SDK](https://github.com/cisco-en-programmability/dnacentersdk) v2.6.0 or newer
+- Python >= 3.9, as the DNA Center SDK doesn't support Python version 2.x
## Install
Ansible must be installed ([Install guide](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html))
diff --git a/ansible_collections/cisco/dnac/changelogs/changelog.yaml b/ansible_collections/cisco/dnac/changelogs/changelog.yaml
index a3408e7e5..81e4f4348 100644
--- a/ansible_collections/cisco/dnac/changelogs/changelog.yaml
+++ b/ansible_collections/cisco/dnac/changelogs/changelog.yaml
@@ -849,3 +849,20 @@ releases:
- Added attributes 'dnac_api_task_timeout' and 'dnac_task_poll_interval' in intent and workflow_manager modules.
- inventory_workflow_manager - Added attributes 'add_user_defined_field', 'update_interface_details', 'export_device_list' and 'admin_status'
- inventory_workflow_manager - Removed attributes 'provision_wireless_device', 'reprovision_wired_device'
+ 6.13.2:
+ release_date: "2024-04-03"
+ changes:
+ release_summary: Enhancements in discovery, site, swim and inventory workflow manager modules.
+ minor_changes:
+ - Added the op_modifies=True when calling SDK APIs in the workflow manager modules.
+ - Added a method to validate IP addresses.
+ - Fixed a minor issue in the site workflow manager module.
+ - Updating galaxy.yml ansible.utils dependencies.
+ 6.13.3:
+ release_date: "2024-04-08"
+ changes:
+ release_summary: Enhancements in discovery, template, swim and inventory workflow manager modules.
+ minor_changes:
+ - Adding support to importing a template using JSON file
+ - Changes in discovery workflow manager modules relating to different states of the discovery job
+ - Changes in inventory and swim workflow manager modules.
diff --git a/ansible_collections/cisco/dnac/meta/runtime.yml b/ansible_collections/cisco/dnac/meta/runtime.yml
index bcb6dcedc..9912f4a7d 100644
--- a/ansible_collections/cisco/dnac/meta/runtime.yml
+++ b/ansible_collections/cisco/dnac/meta/runtime.yml
@@ -1,2 +1,2 @@
---
-requires_ansible: '>=2.14.0' \ No newline at end of file
+requires_ansible: '>=2.15.0' \ No newline at end of file
diff --git a/ansible_collections/cisco/dnac/playbooks/PnP.yml b/ansible_collections/cisco/dnac/playbooks/PnP.yml
index 63bad68e0..31cb11f9b 100644
--- a/ansible_collections/cisco/dnac/playbooks/PnP.yml
+++ b/ansible_collections/cisco/dnac/playbooks/PnP.yml
@@ -66,7 +66,7 @@
template_name: "Ansible_PNP_Switch"
image_name: cat9k_iosxe_npe.17.03.07.SPA.bin
project_name: Onboarding Configuration
- template_details:
+ template_params:
hostname: SJC-Switch-1
interface: TwoGigabitEthernet1/0/2
device_info:
@@ -108,4 +108,4 @@
- device_info:
- serial_number: QD2425L8M7 #Will get deleted
- serial_number: FTC2320E0HA #Doesn't exist in the inventory
- - serial_number: FKC2310E0HB #Doesn't exist in the inventory \ No newline at end of file
+ - serial_number: FKC2310E0HB #Doesn't exist in the inventory
diff --git a/ansible_collections/cisco/dnac/playbooks/PnP_Workflow_Manager_Playbook.yml b/ansible_collections/cisco/dnac/playbooks/PnP_Workflow_Manager_Playbook.yml
index 846ebf3a7..0f1ff25c1 100644
--- a/ansible_collections/cisco/dnac/playbooks/PnP_Workflow_Manager_Playbook.yml
+++ b/ansible_collections/cisco/dnac/playbooks/PnP_Workflow_Manager_Playbook.yml
@@ -66,7 +66,7 @@
template_name: "Ansible_PNP_Switch"
image_name: cat9k_iosxe_npe.17.03.07.SPA.bin
project_name: Onboarding Configuration
- template_details:
+ template_params:
hostname: SJC-Switch-1
interface: TwoGigabitEthernet1/0/2
device_info:
diff --git a/ansible_collections/cisco/dnac/playbooks/device_details.template b/ansible_collections/cisco/dnac/playbooks/device_details.template
index 38c95c627..bdf58ab61 100644
--- a/ansible_collections/cisco/dnac/playbooks/device_details.template
+++ b/ansible_collections/cisco/dnac/playbooks/device_details.template
@@ -19,25 +19,7 @@ template_details:
import_template:
do_version: false
project_name: 'Onboarding Configuration'
- payload:
- - name: 'Platinum-Onboarding-Template-J21'
- device_types:
- - product_family: 'Switches and Hubs'
- productSeries: 'Cisco Catalyst 9300 Series Switches'
- software_type: 'IOS'
- language: 'JINJA'
- - name: 'Platinum-Onboarding-Template-J22'
- device_types:
- - product_family: 'Switches and Hubs'
- productSeries: 'Cisco Catalyst 9300 Series Switches'
- software_type: 'IOS'
- language: 'JINJA'
- - name: 'Platinum-Onboarding-Template-J23'
- device_types:
- - product_family: 'Switches and Hubs'
- productSeries: 'Cisco Catalyst 9300 Series Switches'
- software_type: 'IOS'
- language: 'JINJA'
+ template_file: 'JSON template file'
device_details:
- site_name: 'Global/Chennai/Trill'
diff --git a/ansible_collections/cisco/dnac/playbooks/device_provision_workflow.yml b/ansible_collections/cisco/dnac/playbooks/device_provision_workflow.yml
index 362556a09..acb3249a5 100644
--- a/ansible_collections/cisco/dnac/playbooks/device_provision_workflow.yml
+++ b/ansible_collections/cisco/dnac/playbooks/device_provision_workflow.yml
@@ -16,23 +16,23 @@
dnac_port: "{{ dnac_port }}"
dnac_version: "{{ dnac_version }}"
dnac_debug: "{{ dnac_debug }}"
-
+
tasks:
- name: Provision a wired device to a site
- cisco.dnac.workflow_manager:
+ cisco.dnac.provision_workflow_manager:
<<: *dnac_login
dnac_log: True
state: merged
config_verify: True
config:
- site_name_hierarchy: Global/USA/San Francisco/BGL_18
- management_ip_address: 204.1.1.1
+ management_ip_address: 204.1.2.2
- name: Unprovision a wired device from a site
- cisco.dnac.workflow_manager:
+ cisco.dnac.provision_workflow_manager:
<<: *dnac_login
dnac_log: True
state: deleted
config:
- - management_ip_address: 204.1.1.1
+ - management_ip_address: 204.1.2.2
diff --git a/ansible_collections/cisco/dnac/playbooks/template_workflow_manager.yml b/ansible_collections/cisco/dnac/playbooks/template_workflow_manager.yml
index 25b0ec797..3cfed07e7 100644
--- a/ansible_collections/cisco/dnac/playbooks/template_workflow_manager.yml
+++ b/ansible_collections/cisco/dnac/playbooks/template_workflow_manager.yml
@@ -13,7 +13,11 @@
dnac_password: "{{ dnac_password }}"
dnac_verify: "{{ dnac_verify }}"
dnac_debug: "{{ dnac_debug }}"
- dnac_log: true
+ dnac_log: True
+ dnac_log_level: DEBUG
+ dnac_log_append: True
+ dnac_log_file_path: "{{ dnac_log_file_path }}"
+ validate_response_schema: False
state: "merged"
config_verify: true
#ignore_errors: true #Enable this to continue execution even the task fails
@@ -28,6 +32,16 @@
software_variant: "{{ item.variant }}"
device_types:
- product_family: "{{ item.family }}"
+ export:
+ project:
+ - Ansible_project
+ - Sample Velocity Templates
+ template:
+ - project_name: Onboarding Configuration
+ template_name: AP_Onboarding
+ import:
+ project: "{{ item.import_project }}"
+ template: "{{ item.import_template }}"
register: template_result
with_items: '{{ template_details }}'
tags:
diff --git a/ansible_collections/cisco/dnac/plugins/module_utils/dnac.py b/ansible_collections/cisco/dnac/plugins/module_utils/dnac.py
index a12e7eaf4..1d4b804cd 100644
--- a/ansible_collections/cisco/dnac/plugins/module_utils/dnac.py
+++ b/ansible_collections/cisco/dnac/plugins/module_utils/dnac.py
@@ -27,6 +27,7 @@ import json
# import datetime
import inspect
import re
+import socket
class DnacBase():
@@ -485,6 +486,66 @@ class DnacBase():
return new_config
+ def is_valid_ipv4(self, ip_address):
+ """
+ Validates an IPv4 address.
+
+ Parameters:
+ ip_address - String denoting the IPv4 address passed.
+
+ Returns:
+ bool - Returns true if the passed IP address value is correct or it returns
+ false if it is incorrect
+ """
+
+ try:
+ socket.inet_aton(ip_address)
+ octets = ip_address.split('.')
+ if len(octets) != 4:
+ return False
+ for octet in octets:
+ if not 0 <= int(octet) <= 255:
+ return False
+ return True
+ except socket.error:
+ return False
+
+ def is_path_exists(self, file_path):
+ """
+ Check if the file path 'file_path' exists or not.
+
+ Parameters:
+ file_path (string) - Path of the provided file.
+
+ Returns:
+ True/False (bool) - True if the file path exists, else False.
+ """
+
+ if not os.path.exists(file_path):
+ return False
+
+ return True
+
+ def is_json(self, file_path):
+ """
+ Check if the file in the file path is JSON or not.
+
+ Parameters:
+ file_path (string) - Path of the provided file.
+
+ Returns:
+ True/False (bool) - True if the file is in JSON format, else False.
+ """
+
+ try:
+ with open(file_path, 'r') as file:
+ json.load(file)
+ return True
+
+ except (ValueError, FileNotFoundError):
+ self.log("The provided file '{0}' is not in JSON format".format(file_path), "CRITICAL")
+ return False
+
def is_list_complex(x):
return isinstance(x[0], dict) or isinstance(x[0], list)
diff --git a/ansible_collections/cisco/dnac/plugins/modules/accesspoint_configuration_details_by_task_id_info.py b/ansible_collections/cisco/dnac/plugins/modules/accesspoint_configuration_details_by_task_id_info.py
index 63bf5df7e..642034e5c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/accesspoint_configuration_details_by_task_id_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/accesspoint_configuration_details_by_task_id_info.py
@@ -24,8 +24,8 @@ options:
- Task_id path parameter. Task id information of ap config.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless GetAccessPointConfigurationTaskResult
description: Complete reference of the GetAccessPointConfigurationTaskResult API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/app_policy_default_info.py b/ansible_collections/cisco/dnac/plugins/modules/app_policy_default_info.py
index 3ad0878fb..921f7a095 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/app_policy_default_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/app_policy_default_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplicationPolicyDefault
description: Complete reference of the GetApplicationPolicyDefault API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/app_policy_info.py b/ansible_collections/cisco/dnac/plugins/modules/app_policy_info.py
index d70d8fd44..3479d1ede 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/app_policy_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/app_policy_info.py
@@ -24,8 +24,8 @@ options:
- PolicyScope query parameter. Policy scope name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplicationPolicy
description: Complete reference of the GetApplicationPolicy API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/app_policy_intent_create.py b/ansible_collections/cisco/dnac/plugins/modules/app_policy_intent_create.py
index 6c1b46832..fd487ca0c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/app_policy_intent_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/app_policy_intent_create.py
@@ -226,8 +226,8 @@ options:
type: dict
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy ApplicationPolicyIntent
description: Complete reference of the ApplicationPolicyIntent API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile.py b/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile.py
index 769e87fc1..9260ffbf5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile.py
@@ -89,8 +89,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy CreateApplicationPolicyQueuingProfile
description: Complete reference of the CreateApplicationPolicyQueuingProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_count_info.py
index 5f814ac1d..2a3b2c4df 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplicationPolicyQueuingProfileCount
description: Complete reference of the GetApplicationPolicyQueuingProfileCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_info.py b/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_info.py
index 860545f2c..bb89873a6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/app_policy_queuing_profile_info.py
@@ -24,8 +24,8 @@ options:
- Name query parameter. Queuing profile name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplicationPolicyQueuingProfile
description: Complete reference of the GetApplicationPolicyQueuingProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/application_sets.py b/ansible_collections/cisco/dnac/plugins/modules/application_sets.py
index 1210f90d6..b4c5dd14c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/application_sets.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/application_sets.py
@@ -29,8 +29,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy CreateApplicationSet
description: Complete reference of the CreateApplicationSet API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/application_sets_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/application_sets_count_info.py
index b71923719..bd6336fb7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/application_sets_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/application_sets_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplicationSetsCount
description: Complete reference of the GetApplicationSetsCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/application_sets_info.py b/ansible_collections/cisco/dnac/plugins/modules/application_sets_info.py
index 844341de0..168674c87 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/application_sets_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/application_sets_info.py
@@ -32,8 +32,8 @@ options:
- Name query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplicationSets
description: Complete reference of the GetApplicationSets API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/applications.py b/ansible_collections/cisco/dnac/plugins/modules/applications.py
index 22c309bd4..43c18a12b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/applications.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/applications.py
@@ -133,8 +133,8 @@ options:
type: list
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy CreateApplication
description: Complete reference of the CreateApplication API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/applications_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/applications_count_info.py
index 1c725cb14..cf4eb7d8d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/applications_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/applications_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplicationsCount
description: Complete reference of the GetApplicationsCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/applications_health_info.py b/ansible_collections/cisco/dnac/plugins/modules/applications_health_info.py
index 4bc998401..883fd5398 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/applications_health_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/applications_health_info.py
@@ -64,8 +64,8 @@ options:
- ApplicationName query parameter. The name of the application to get information on.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Applications Applications
description: Complete reference of the Applications API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/applications_info.py b/ansible_collections/cisco/dnac/plugins/modules/applications_info.py
index 431d62e37..6570ca75d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/applications_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/applications_info.py
@@ -32,8 +32,8 @@ options:
- Name query parameter. Application's name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetApplications
description: Complete reference of the GetApplications API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/assign_device_to_site.py b/ansible_collections/cisco/dnac/plugins/modules/assign_device_to_site.py
index fbd3cec3d..c1da97fe9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/assign_device_to_site.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/assign_device_to_site.py
@@ -31,8 +31,8 @@ options:
description: SiteId path parameter. Site id to which site the device to assign.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for AssignDevicesToSite
description: Complete reference of the AssignDevicesToSite API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/associate_site_to_network_profile.py b/ansible_collections/cisco/dnac/plugins/modules/associate_site_to_network_profile.py
index 7a2aab8e5..b01851556 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/associate_site_to_network_profile.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/associate_site_to_network_profile.py
@@ -23,8 +23,8 @@ options:
description: SiteId path parameter. Site Id to be associated.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design Associate
description: Complete reference of the Associate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate.py b/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate.py
index 7cfca0c47..15cb6d2b6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate.py
@@ -30,8 +30,8 @@ options:
description: PkPassword query parameter. Private Key Passsword.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Authentication Management ImportCertificate
description: Complete reference of the ImportCertificate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate_p12.py b/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate_p12.py
index ab19906f7..23d98d277 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate_p12.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/authentication_import_certificate_p12.py
@@ -30,8 +30,8 @@ options:
description: PkPassword query parameter. Private Key Passsword.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Authentication Management ImportCertificateP12
description: Complete reference of the ImportCertificateP12 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/authentication_policy_servers_info.py b/ansible_collections/cisco/dnac/plugins/modules/authentication_policy_servers_info.py
index cb5124de7..d0366ecc2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/authentication_policy_servers_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/authentication_policy_servers_info.py
@@ -32,8 +32,8 @@ options:
- Role query parameter. Authentication and Policy Server Role (Example primary, secondary).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for System Settings GetAuthenticationAndPolicyServers
description: Complete reference of the GetAuthenticationAndPolicyServers API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/buildings_planned_access_points_info.py b/ansible_collections/cisco/dnac/plugins/modules/buildings_planned_access_points_info.py
index 07dda3ca9..20aaae21a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/buildings_planned_access_points_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/buildings_planned_access_points_info.py
@@ -36,8 +36,8 @@ options:
- Radios query parameter. Inlcude planned radio details.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetPlannedAccessPointsForBuilding
description: Complete reference of the GetPlannedAccessPointsForBuilding API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool.py b/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool.py
index daa0bbc00..53a47bdc9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool.py
@@ -34,8 +34,8 @@ options:
description: VLAN Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Fabric Wireless AddSSIDToIPPoolMapping
description: Complete reference of the AddSSIDToIPPoolMapping API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool_info.py b/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool_info.py
index 6ecfdd80f..7de5bd47f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/business_sda_hostonboarding_ssid_ippool_info.py
@@ -28,8 +28,8 @@ options:
- SiteNameHierarchy query parameter. Site Name Heirarchy.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Fabric Wireless GetSSIDToIPPoolMapping
description: Complete reference of the GetSSIDToIPPoolMapping API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/business_sda_virtual_network_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/business_sda_virtual_network_summary_info.py
index 941822ad5..beb749da6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/business_sda_virtual_network_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/business_sda_virtual_network_summary_info.py
@@ -24,8 +24,8 @@ options:
- SiteNameHierarchy query parameter. Complete fabric siteNameHierarchy Path.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for GetVirtualNetworkSummary
description: Complete reference of the GetVirtualNetworkSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_create.py b/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_create.py
index 1d9993a6c..9b1619f90 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_create.py
@@ -23,8 +23,8 @@ options:
description: Site Name Hierarchy.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Fabric Wireless AddWLCToFabricDomain
description: Complete reference of the AddWLCToFabricDomain API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_delete.py b/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_delete.py
index 4ca615500..3231a6e23 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/business_sda_wireless_controller_delete.py
@@ -23,8 +23,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Fabric Wireless RemoveWLCFromFabricDomain
description: Complete reference of the RemoveWLCFromFabricDomain API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/cli_credential.py b/ansible_collections/cisco/dnac/plugins/modules/cli_credential.py
index d7b542962..9a7c0e489 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/cli_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/cli_credential.py
@@ -45,8 +45,8 @@ options:
description: Cli Credential's username.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateCLICredentials
description: Complete reference of the CreateCLICredentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/client_detail_info.py b/ansible_collections/cisco/dnac/plugins/modules/client_detail_info.py
index a823da7b5..5cc6ca6d9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/client_detail_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/client_detail_info.py
@@ -28,8 +28,8 @@ options:
- MacAddress query parameter. MAC Address of the client.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Clients GetClientDetail
description: Complete reference of the GetClientDetail API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/client_enrichment_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/client_enrichment_details_info.py
index da1fd47d2..54be2389a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/client_enrichment_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/client_enrichment_details_info.py
@@ -22,8 +22,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Clients GetClientEnrichmentDetails
description: Complete reference of the GetClientEnrichmentDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/client_health_info.py b/ansible_collections/cisco/dnac/plugins/modules/client_health_info.py
index 2def53c98..f036bb5bd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/client_health_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/client_health_info.py
@@ -24,8 +24,8 @@ options:
- Timestamp query parameter. Epoch time(in milliseconds) when the Client health data is required.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Clients GetOverallClientHealth
description: Complete reference of the GetOverallClientHealth API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/client_proximity_info.py b/ansible_collections/cisco/dnac/plugins/modules/client_proximity_info.py
index d65c51e09..7d30d7542 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/client_proximity_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/client_proximity_info.py
@@ -40,8 +40,8 @@ options:
with a minimum 5 minutes.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Clients ClientProximity
description: Complete reference of the ClientProximity API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/command_runner_run_command.py b/ansible_collections/cisco/dnac/plugins/modules/command_runner_run_command.py
index 34222b28f..5b12002ed 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/command_runner_run_command.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/command_runner_run_command.py
@@ -34,8 +34,8 @@ options:
description: Command Runner Run Command's timeout.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Command Runner RunReadOnlyCommandsOnDevicesToGetTheirRealTimeConfiguration
description: Complete reference of the RunReadOnlyCommandsOnDevicesToGetTheirRealTimeConfiguration API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/compliance_check_run.py b/ansible_collections/cisco/dnac/plugins/modules/compliance_check_run.py
index 6d9a5c6bc..c244f41f8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/compliance_check_run.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/compliance_check_run.py
@@ -28,8 +28,8 @@ options:
description: TriggerFull flag.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Compliance RunCompliance
description: Complete reference of the RunCompliance API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_by_id_info.py b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_by_id_info.py
index 92e2f73bb..99d967c02 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_by_id_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_by_id_info.py
@@ -46,8 +46,8 @@ options:
- Value query parameter. Extended attribute value.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Compliance ComplianceDetailsOfDevice
description: Complete reference of the ComplianceDetailsOfDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_count_info.py
index 2bc29a305..a51939ed4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_count_info.py
@@ -32,8 +32,8 @@ options:
'IN_PROGRESS', 'NOT_AVAILABLE', 'NOT_APPLICABLE', 'ERROR'.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Compliance GetComplianceDetailCount
description: Complete reference of the GetComplianceDetailCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_info.py
index 9eb00777b..bc06458f2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_details_info.py
@@ -44,8 +44,8 @@ options:
- Limit query parameter. Number of records to be retrieved.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Compliance GetComplianceDetail
description: Complete reference of the GetComplianceDetail API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_info.py
index d256f41d8..38eaafb12 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_info.py
@@ -40,8 +40,8 @@ options:
- Limit query parameter. Number of records to be retrieved.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Compliance DeviceComplianceStatus
description: Complete reference of the DeviceComplianceStatus API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_status_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_status_count_info.py
index ef33aae08..6c7897f94 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/compliance_device_status_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/compliance_device_status_count_info.py
@@ -26,8 +26,8 @@ options:
'IN_PROGRESS', 'NOT_AVAILABLE', 'NOT_APPLICABLE', 'ERROR'.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Compliance GetComplianceStatusCount
description: Complete reference of the GetComplianceStatusCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template.py
index 35dc21ac5..05e7acf35 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template.py
@@ -512,8 +512,8 @@ options:
description: Current version of template.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates DeletesTheTemplate
description: Complete reference of the DeletesTheTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_clone.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_clone.py
index be0a5c1cb..c21257ba4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_clone.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_clone.py
@@ -28,8 +28,8 @@ options:
description: TemplateId path parameter. UUID of the template to clone it.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates CreatesACloneOfTheGivenTemplate
description: Complete reference of the CreatesACloneOfTheGivenTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_create.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_create.py
index 4bb6a9a7b..f5beee649 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_create.py
@@ -508,8 +508,8 @@ options:
description: Current version of template.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates CreateTemplate
description: Complete reference of the CreateTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy.py
index 537fa850c..a1b1b5265 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy.py
@@ -55,8 +55,8 @@ options:
description: UUID of template to be provisioned.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates DeployTemplate
description: Complete reference of the DeployTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_status_info.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_status_info.py
index 21fd83a51..46c7439eb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_status_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_status_info.py
@@ -24,8 +24,8 @@ options:
- DeploymentId path parameter. UUID of deployment to retrieve template deployment status.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates StatusOfTemplateDeployment
description: Complete reference of the StatusOfTemplateDeployment API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_v2.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_v2.py
index 399441706..af7f1094d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_v2.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_deploy_v2.py
@@ -55,8 +55,8 @@ options:
description: UUID of template to be provisioned.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates DeployTemplateV2
description: Complete reference of the DeployTemplateV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_project.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_project.py
index 377f4fbeb..f41475005 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_project.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_project.py
@@ -21,8 +21,8 @@ options:
elements: dict
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates ExportsTheProjectsForAGivenCriteria
description: Complete reference of the ExportsTheProjectsForAGivenCriteria API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_template.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_template.py
index df4a58323..d460cef40 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_template.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_export_template.py
@@ -21,8 +21,8 @@ options:
elements: dict
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates ExportsTheTemplatesForAGivenCriteria
description: Complete reference of the ExportsTheTemplatesForAGivenCriteria API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_project.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_project.py
index 284665863..37b2096e4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_project.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_project.py
@@ -23,8 +23,8 @@ options:
fails with 'Template already exists' error.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates ImportsTheProjectsProvided
description: Complete reference of the ImportsTheProjectsProvided API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_template.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_template.py
index fc612c50f..7f9cf31f6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_template.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_import_template.py
@@ -523,8 +523,8 @@ options:
project.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates ImportsTheTemplatesProvided
description: Complete reference of the ImportsTheTemplatesProvided API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_info.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_info.py
index 993d2e0b5..ad9e264cf 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_info.py
@@ -76,8 +76,8 @@ options:
- LatestVersion query parameter. LatestVersion flag to get the latest versioned template.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates GetsDetailsOfAGivenTemplate
description: Complete reference of the GetsDetailsOfAGivenTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project.py
index 518ac61f9..7678e283c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project.py
@@ -546,8 +546,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates CreateProject
description: Complete reference of the CreateProject API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project_info.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project_info.py
index d5d60407f..f200203db 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_project_info.py
@@ -34,8 +34,8 @@ options:
- ProjectId path parameter. ProjectId(UUID) of project to get project details.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates GetsAListOfProjects
description: Complete reference of the GetsAListOfProjects API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_create.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_create.py
index b3210a7c4..d0317ea84 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_create.py
@@ -23,8 +23,8 @@ options:
description: UUID of template.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates VersionTemplate
description: Complete reference of the VersionTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_info.py b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_info.py
index 0f6956651..0dfdb8a93 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/configuration_template_version_info.py
@@ -24,8 +24,8 @@ options:
- TemplateId path parameter. TemplateId(UUID) to get list of versioned templates.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates GetsAllTheVersionsOfAGivenTemplate
description: Complete reference of the GetsAllTheVersionsOfAGivenTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/credential_to_site_by_siteid_create_v2.py b/ansible_collections/cisco/dnac/plugins/modules/credential_to_site_by_siteid_create_v2.py
index 44f2a99db..1ee9e33a9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/credential_to_site_by_siteid_create_v2.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/credential_to_site_by_siteid_create_v2.py
@@ -38,8 +38,8 @@ options:
description: SNMPv3 Credential Id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings AssignDeviceCredentialToSiteV2
description: Complete reference of the AssignDeviceCredentialToSiteV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_configurations_export.py b/ansible_collections/cisco/dnac/plugins/modules/device_configurations_export.py
index 8f761afc2..4d7ba14db 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_configurations_export.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_configurations_export.py
@@ -24,8 +24,8 @@ options:
description: Password.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Archive ExportDeviceConfigurations
description: Complete reference of the ExportDeviceConfigurations API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_credential_create.py b/ansible_collections/cisco/dnac/plugins/modules/device_credential_create.py
index d5732808b..b26ec83a0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_credential_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_credential_create.py
@@ -120,8 +120,8 @@ options:
type: list
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings CreateDeviceCredentials
description: Complete reference of the CreateDeviceCredentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_credential_delete.py b/ansible_collections/cisco/dnac/plugins/modules/device_credential_delete.py
index 42cd7bf9a..73d144997 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_credential_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_credential_delete.py
@@ -20,8 +20,8 @@ options:
description: Id path parameter. Global credential id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings DeleteDeviceCredential
description: Complete reference of the DeleteDeviceCredential API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_credential_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_credential_info.py
index 184d82056..27175a669 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_credential_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_credential_info.py
@@ -24,8 +24,8 @@ options:
- SiteId query parameter. Site id to retrieve the credential details associated with the site.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings GetDeviceCredentialDetails
description: Complete reference of the GetDeviceCredentialDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_credential_intent.py b/ansible_collections/cisco/dnac/plugins/modules/device_credential_intent.py
index 8e2f41384..3b887aa8d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_credential_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_credential_intent.py
@@ -298,8 +298,8 @@ options:
description: snmp_v3 Credential Id. Use Description or Id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateGlobalCredentialsV2
description: Complete reference of the CreateGlobalCredentialsV2 API.
@@ -881,6 +881,7 @@ class DnacCredential(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": site_name},
)
self.log("Received API response from 'get_site': {0}".format(response), "DEBUG")
@@ -891,9 +892,9 @@ class DnacCredential(DnacBase):
_id = response.get("response")[0].get("id")
self.log("Site ID for the site name {0}: {1}".format(site_name, _id), "INFO")
- except Exception as exec:
+ except Exception as e:
self.log("Exception occurred while getting site_id from the site_name: {0}"
- .format(exec), "CRITICAL")
+ .format(e), "CRITICAL")
return None
return _id
@@ -917,9 +918,9 @@ class DnacCredential(DnacBase):
global_credentials = global_credentials.get("response")
self.log("All global device credentials details: {0}"
.format(global_credentials), "DEBUG")
- except Exception as exec:
+ except Exception as e:
self.log("Exception occurred while getting global device credentials: {0}"
- .format(exec), "CRITICAL")
+ .format(e), "CRITICAL")
return None
return global_credentials
@@ -2209,6 +2210,7 @@ class DnacCredential(DnacBase):
response = self.dnac._exec(
family="discovery",
function='create_global_credentials_v2',
+ op_modifies=True,
params=credential_params,
)
self.log("Received API response from 'create_global_credentials_v2': {0}"
@@ -2273,6 +2275,7 @@ class DnacCredential(DnacBase):
response = self.dnac._exec(
family="discovery",
function='update_global_credentials_v2',
+ op_modifies=True,
params=credential_params,
)
self.log("Received API response for 'update_global_credentials_v2': {0}"
@@ -2328,6 +2331,7 @@ class DnacCredential(DnacBase):
response = self.dnac._exec(
family="network_settings",
function='assign_device_credential_to_site_v2',
+ op_modifies=True,
params=credential_params,
)
self.log("Received API response for 'assign_device_credential_to_site_v2': {0}"
@@ -2414,6 +2418,7 @@ class DnacCredential(DnacBase):
response = self.dnac._exec(
family="discovery",
function="delete_global_credential_v2",
+ op_modifies=True,
params={"id": _id},
)
self.log("Received API response for 'delete_global_credential_v2': {0}"
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_credential_update.py b/ansible_collections/cisco/dnac/plugins/modules/device_credential_update.py
index f17c18fbd..7c5cafd5b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_credential_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_credential_update.py
@@ -132,8 +132,8 @@ options:
type: dict
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings UpdateDeviceCredentials
description: Complete reference of the UpdateDeviceCredentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_credential_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/device_credential_workflow_manager.py
index 3db97ce05..a6d188de4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_credential_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_credential_workflow_manager.py
@@ -298,8 +298,8 @@ options:
description: snmp_v3 Credential Id. Use Description or Id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco Catalyst Center documentation for Discovery CreateGlobalCredentialsV2
description: Complete reference of the CreateGlobalCredentialsV2 API.
@@ -880,6 +880,7 @@ class DeviceCredential(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": site_name},
)
self.log("Received API response from 'get_site': {0}".format(response), "DEBUG")
@@ -890,9 +891,9 @@ class DeviceCredential(DnacBase):
_id = response.get("response")[0].get("id")
self.log("Site ID for the site name {0}: {1}".format(site_name, _id), "INFO")
- except Exception as exec:
+ except Exception as e:
self.log("Exception occurred while getting site_id from the site_name: {0}"
- .format(exec), "CRITICAL")
+ .format(e), "CRITICAL")
return None
return _id
@@ -916,9 +917,9 @@ class DeviceCredential(DnacBase):
global_credentials = global_credentials.get("response")
self.log("All global device credentials details: {0}"
.format(global_credentials), "DEBUG")
- except Exception as exec:
+ except Exception as e:
self.log("Exception occurred while getting global device credentials: {0}"
- .format(exec), "CRITICAL")
+ .format(e), "CRITICAL")
return None
return global_credentials
@@ -2208,6 +2209,7 @@ class DeviceCredential(DnacBase):
response = self.dnac._exec(
family="discovery",
function='create_global_credentials_v2',
+ op_modifies=True,
params=credential_params,
)
self.log("Received API response from 'create_global_credentials_v2': {0}"
@@ -2272,6 +2274,7 @@ class DeviceCredential(DnacBase):
response = self.dnac._exec(
family="discovery",
function='update_global_credentials_v2',
+ op_modifies=True,
params=credential_params,
)
self.log("Received API response for 'update_global_credentials_v2': {0}"
@@ -2327,6 +2330,7 @@ class DeviceCredential(DnacBase):
response = self.dnac._exec(
family="network_settings",
function='assign_device_credential_to_site_v2',
+ op_modifies=True,
params=credential_params,
)
self.log("Received API response for 'assign_device_credential_to_site_v2': {0}"
@@ -2413,6 +2417,7 @@ class DeviceCredential(DnacBase):
response = self.dnac._exec(
family="discovery",
function="delete_global_credential_v2",
+ op_modifies=True,
params={"id": _id},
)
self.log("Received API response for 'delete_global_credential_v2': {0}"
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_details_info.py
index 108be2c42..05793acd2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_details_info.py
@@ -32,8 +32,8 @@ options:
- Identifier query parameter. One of keywords macAddress or uuid or nwDeviceName.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceDetail
description: Complete reference of the GetDeviceDetail API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_enrichment_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_enrichment_details_info.py
index c0be8c613..37a46f792 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_enrichment_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_enrichment_details_info.py
@@ -22,8 +22,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceEnrichmentDetails
description: Complete reference of the GetDeviceEnrichmentDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_family_identifiers_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_family_identifiers_details_info.py
index 515a0d94a..97736aa74 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_family_identifiers_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_family_identifiers_details_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) GetDeviceFamilyIdentifiers
description: Complete reference of the GetDeviceFamilyIdentifiers API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_health_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_health_info.py
index 9b329a7ab..7b0775f33 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_health_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_health_info.py
@@ -50,8 +50,8 @@ options:
- Offset query parameter. The offset of the first device in the returned data.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices Devices
description: Complete reference of the Devices API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_interface_by_ip_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_interface_by_ip_info.py
index 7d5d984f5..df7223b15 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_interface_by_ip_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_interface_by_ip_info.py
@@ -24,8 +24,8 @@ options:
- IpAddress path parameter. IP address of the interface.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetInterfaceByIP
description: Complete reference of the GetInterfaceByIP API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_interface_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_interface_count_info.py
index 24e0290a6..01d3361fb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_interface_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_interface_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceInterfaceCount
description: Complete reference of the GetDeviceInterfaceCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_interface_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_interface_info.py
index 5f484a520..31b2bc4c6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_interface_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_interface_info.py
@@ -42,8 +42,8 @@ options:
- Id path parameter. Interface ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetAllInterfaces
description: Complete reference of the GetAllInterfaces API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_interface_isis_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_interface_isis_info.py
index 242344a18..798c47821 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_interface_isis_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_interface_isis_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetISISInterfaces
description: Complete reference of the GetISISInterfaces API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_interface_ospf_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_interface_ospf_info.py
index 759f4584a..ed87a4b0c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_interface_ospf_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_interface_ospf_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetOSPFInterfaces
description: Complete reference of the GetOSPFInterfaces API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot.py b/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot.py
index 78a33dfd4..92e7c41ee 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot.py
@@ -21,8 +21,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless RebootAccessPoints
description: Complete reference of the RebootAccessPoints API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot_info.py
index 09203ba5e..c4e500062 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_reboot_apreboot_info.py
@@ -24,8 +24,8 @@ options:
- ParentTaskId query parameter. Task id of ap reboot request.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless GetAccessPointRebootTaskResult
description: Complete reference of the GetAccessPointRebootTaskResult API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_replacement.py b/ansible_collections/cisco/dnac/plugins/modules/device_replacement.py
index e6ec8cbdc..a5353ddd0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_replacement.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_replacement.py
@@ -65,8 +65,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Replacement MarkDeviceForReplacement
description: Complete reference of the MarkDeviceForReplacement API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_replacement_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_replacement_count_info.py
index c15cf18df..8aae86979 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_replacement_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_replacement_count_info.py
@@ -27,8 +27,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Replacement ReturnReplacementDevicesCount
description: Complete reference of the ReturnReplacementDevicesCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_replacement_deploy.py b/ansible_collections/cisco/dnac/plugins/modules/device_replacement_deploy.py
index 14f591d2d..81dfc9251 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_replacement_deploy.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_replacement_deploy.py
@@ -25,8 +25,8 @@ options:
description: Device Replacement Deploy's replacementDeviceSerialNumber.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Replacement DeployDeviceReplacementWorkflow
description: Complete reference of the DeployDeviceReplacementWorkflow API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/device_replacement_info.py b/ansible_collections/cisco/dnac/plugins/modules/device_replacement_info.py
index 91977952a..4dd9756d5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/device_replacement_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/device_replacement_info.py
@@ -71,8 +71,8 @@ options:
- Limit query parameter.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Replacement ReturnListOfReplacementDevicesWithReplacementDetails
description: Complete reference of the ReturnListOfReplacementDevicesWithReplacementDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/disassociate_site_to_network_profile.py b/ansible_collections/cisco/dnac/plugins/modules/disassociate_site_to_network_profile.py
index de80f579b..2972ac7f2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/disassociate_site_to_network_profile.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/disassociate_site_to_network_profile.py
@@ -23,8 +23,8 @@ options:
description: SiteId path parameter. Site Id to be associated.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design Disassociate
description: Complete reference of the Disassociate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_operationstatus_info.py b/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_operationstatus_info.py
index 8e05a778e..1c6621afe 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_operationstatus_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_operationstatus_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
disaster_recovery.DisasterRecovery.disaster_recovery_operational_status,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_status_info.py b/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_status_info.py
index 40356c0f7..f1c3c318c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_status_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/disasterrecovery_system_status_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
disaster_recovery.DisasterRecovery.disaster_recovery_status,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery.py b/ansible_collections/cisco/dnac/plugins/modules/discovery.py
index 10e7e37a9..94fca37e0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery.py
@@ -214,8 +214,8 @@ options:
description: Discovery's userNameList.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery StartDiscovery
description: Complete reference of the StartDiscovery API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_count_info.py
index 6622742f7..59f92499a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetCountOfAllDiscoveryJobs
description: Complete reference of the GetCountOfAllDiscoveryJobs API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_device_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_device_count_info.py
index b258a513d..51da8df80 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_device_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_device_count_info.py
@@ -30,8 +30,8 @@ options:
- TaskId query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetDevicesDiscoveredById
description: Complete reference of the GetDevicesDiscoveredById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_device_info.py
index 345000ca0..2bc42ae22 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_device_info.py
@@ -30,8 +30,8 @@ options:
- TaskId query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetDiscoveredNetworkDevicesByDiscoveryId
description: Complete reference of the GetDiscoveredNetworkDevicesByDiscoveryId API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_device_range_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_device_range_info.py
index 47dcb0871..ade1f2828 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_device_range_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_device_range_info.py
@@ -38,8 +38,8 @@ options:
- TaskId query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetDiscoveredDevicesByRange
description: Complete reference of the GetDiscoveredDevicesByRange API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_info.py
index 689226938..68d1cc74f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_info.py
@@ -24,8 +24,8 @@ options:
- Id path parameter. Discovery ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetDiscoveryById
description: Complete reference of the GetDiscoveryById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_intent.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_intent.py
index 96759bb9c..a71ef6be8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_intent.py
@@ -59,7 +59,8 @@ options:
pass a list with single element like - 10.197.156.22. For CIDR based discovery, we should pass a list with
single element like - 10.197.156.22/22. For RANGE based discovery, we should pass a list with single element
and range like - 10.197.156.1-10.197.156.100. For MULTI RANGE based discovery, we should pass a list with multiple
- elementd like - 10.197.156.1-10.197.156.100 and in next line - 10.197.157.1-10.197.157.100.
+ elementd like - 10.197.156.1-10.197.156.100 and in next line - 10.197.157.1-10.197.157.100. Maximum of 8 IP address ranges
+ are allowed.
type: list
elements: str
required: true
@@ -328,7 +329,7 @@ options:
default: False
requirements:
- dnacentersdk == 2.6.10
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
discovery.Discovery.get_all_global_credentials_v2,
@@ -721,6 +722,43 @@ class Discovery(DnacBase):
self.status = "success"
return self
+ def validate_ip4_address_list(self):
+ """
+ Validates each ip adress paased in the IP_address_list passed by the user before preprocessing it
+ """
+
+ ip_address_list = self.validated_config[0].get('ip_address_list')
+ for ip in ip_address_list:
+ if '/' in ip:
+ ip = ip.split("/")[0]
+ if '-' in ip:
+ if len(ip.split('-')) == 2:
+ ip1, ip2 = ip.split('-')
+ if self.is_valid_ipv4(ip1) is False:
+ msg = "IP address {0} is not valid".format(ip1)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ if self.is_valid_ipv4(ip2) is False:
+ msg = "IP address {0} is not valid".format(ip2)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ ip1_parts = list(map(int, ip1.split('.')))
+ ip2_parts = list(map(int, ip2.split('.')))
+ for part in range(4):
+ if ip1_parts[part] > ip2_parts[part]:
+ msg = "Incorrect range passed: {0}. Please pass correct IP address range".format(ip)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ else:
+ msg = "Provided range '{0}' is incorrect. IP address range should have only upper and lower limit values".format(ip)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ if self.is_valid_ipv4(ip) is False and '-' not in ip:
+ msg = "IP address {0} is not valid".format(ip)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ self.log("All the IP addresses passed are correct", "INFO")
+
def get_creds_ids_list(self):
"""
Retrieve the list of credentials IDs associated with class instance.
@@ -934,6 +972,7 @@ class Discovery(DnacBase):
family="discovery",
function='get_all_global_credentials_v2',
params=self.validated_config[0].get('headers'),
+ op_modifies=True
)
response = response.get('response')
self.log("The Global credentials response from 'get all global credentials v2' API is {0}".format(str(response)), "DEBUG")
@@ -1022,6 +1061,10 @@ class Discovery(DnacBase):
else:
self.preprocess_device_discovery_handle_error()
else:
+ if len(ip_address_list) > 8:
+ msg = "Maximum of 8 IP ranges are allowed."
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
new_ip_collected = []
for ip in ip_address_list:
if len(str(ip).split("-")) != 2:
@@ -1267,11 +1310,11 @@ class Discovery(DnacBase):
self.log("Task Id of the API task created is {0}".format(result.response.get('taskId')), "INFO")
return result.response.get('taskId')
- def get_task_status(self, task_id=None):
+ def get_merged_task_status(self, task_id=None):
"""
- Monitor the status of a task in the Cisco Catalyst Center. It checks the task
- status periodically until the task is no longer 'In Progress'.
- If the task encounters an error or fails, it immediately fails the
+ Monitor the status of a task of creation of dicovery in the Cisco Catalyst Center.
+ It checks the task status periodically until the task is no longer 'In Progress'
+ or other states. If the task encounters an error or fails, it immediately fails the
module and returns False.
Parameters:
@@ -1288,9 +1331,10 @@ class Discovery(DnacBase):
family="task",
function='get_task_by_id',
params=params,
+ op_modifies=True,
)
response = response.response
- self.log("Task status for the task id {0} is {1}".format(str(task_id), str(response)), "INFO")
+ self.log("Task status for the task id {0} is {1}, is_error: {2}".format(str(task_id), str(response), str(response.get('isError'))), "INFO")
if response.get('isError') or re.search(
'failed', response.get('progress'), flags=re.IGNORECASE
):
@@ -1299,17 +1343,62 @@ class Discovery(DnacBase):
self.log(msg, "CRITICAL")
self.module.fail_json(msg=msg)
return False
+
self.log("Task status for the task id (before checking status) {0} is {1}".format(str(task_id), str(response)), "INFO")
progress = response.get('progress')
- if progress in ('In Progress', 'Inventory service initiating discovery'):
+ try:
+ progress_value = int(progress)
+ result = True
+ self.log("The discovery process is completed", "INFO")
+ self.result.update(dict(discovery_task=response))
+ return result
+ except Exception:
+ self.log("The progress status is {0}, continue to check the status after 3 seconds. Putting into sleep for 3 seconds".format(progress))
time.sleep(3)
- continue
- else:
+
+ def get_deleted_task_status(self, task_id=None):
+ """
+ Monitor the status of a task of deletion of dicovery in the Cisco Catalyst Center.
+ It checks the itask status periodically until the task is 'Discovery deleted successfully'.
+ If the task encounters an error or fails, it immediately fails the module and returns False.
+
+ Parameters:
+ - task_id: The ID of the task to monitor.
+
+ Returns:
+ - result: True if the task completed successfully, False otherwise.
+ """
+
+ result = False
+ params = dict(task_id=task_id)
+ while True:
+ response = self.dnac_apply['exec'](
+ family="task",
+ function='get_task_by_id',
+ params=params,
+ op_modifies=True,
+ )
+ response = response.response
+ self.log("Task status for the task id {0} is {1}, is_error: {2}".format(str(task_id), str(response), str(response.get('isError'))), "INFO")
+ if response.get('isError') or re.search(
+ 'failed', response.get('progress'), flags=re.IGNORECASE
+ ):
+ msg = 'Discovery task with id {0} has not completed - Reason: {1}'.format(
+ task_id, response.get("failureReason"))
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ return False
+
+ self.log("Task status for the task id (before checking status) {0} is {1}".format(str(task_id), str(response)), "INFO")
+ progress = response.get('progress')
+ if re.search('Discovery deleted successfully.', response.get('progress')):
result = True
- self.log("The Process is completed", "INFO")
- break
- self.result.update(dict(discovery_task=response))
- return result
+ self.log("The discovery process is completed", "INFO")
+ self.result.update(dict(discovery_task=response))
+ return result
+
+ self.log("The progress status is {0}, continue to check the status after 3 seconds. Putting into sleep for 3 seconds".format(progress))
+ time.sleep(3)
def lookup_discovery_by_range_via_name(self):
"""
@@ -1336,7 +1425,8 @@ class Discovery(DnacBase):
response_part = self.dnac_apply['exec'](
family="discovery",
function='get_discoveries_by_range',
- params=params
+ params=params,
+ op_modifies=True,
)
response["response"].extend(response_part["response"])
else:
@@ -1349,7 +1439,8 @@ class Discovery(DnacBase):
response = self.dnac_apply['exec'](
family="discovery",
function='get_discoveries_by_range',
- params=params
+ params=params,
+ op_modifies=True,
)
self.log("Response of the get discoveries via range API is {0}".format(str(response)), "DEBUG")
@@ -1373,6 +1464,7 @@ class Discovery(DnacBase):
"""
result = False
+ aborted = False
discovery = self.lookup_discovery_by_range_via_name()
if not discovery:
@@ -1383,17 +1475,25 @@ class Discovery(DnacBase):
while True:
discovery = self.lookup_discovery_by_range_via_name()
- if discovery.get('discoveryCondition') == 'Complete':
+ discovery_condition = discovery.get('discoveryCondition')
+ if discovery_condition == 'Complete':
result = True
break
-
+ elif discovery_condition == 'Aborted':
+ aborted = True
+ break
time.sleep(3)
if not result:
- msg = 'Cannot find any discovery task with name {0} -- Discovery result: {1}'.format(
- str(self.validated_config[0].get("discovery_name")), str(discovery))
- self.log(msg, "CRITICAL")
- self.module.fail_json(msg=msg)
+ if aborted is True:
+ msg = 'Discovery with name {0} is aborted by the user on the GUI'.format(str(self.validated_config[0].get("discovery_name")))
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ else:
+ msg = 'Cannot find any discovery task with name {0} -- Discovery result: {1}'.format(
+ str(self.validated_config[0].get("discovery_name")), str(discovery))
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
self.result.update(dict(discovery_range=discovery))
return discovery
@@ -1425,6 +1525,7 @@ class Discovery(DnacBase):
family="discovery",
function='get_discovered_network_devices_by_discovery_id',
params=params,
+ op_modifies=True,
)
devices = response.response
@@ -1495,6 +1596,7 @@ class Discovery(DnacBase):
family="discovery",
function="delete_discovery_by_id",
params=params,
+ op_modifies=True,
)
self.log("Response collected from API 'delete_discovery_by_id': {0}".format(str(response)), "DEBUG")
@@ -1513,17 +1615,18 @@ class Discovery(DnacBase):
- self: The instance of the class with updated attributes.
"""
+ self.validate_ip4_address_list()
devices_list_info = self.get_devices_list_info()
ip_address_list = self.preprocess_device_discovery(devices_list_info)
exist_discovery = self.get_exist_discovery()
if exist_discovery:
params = dict(id=exist_discovery.get('id'))
discovery_task_id = self.delete_exist_discovery(params=params)
- complete_discovery = self.get_task_status(task_id=discovery_task_id)
+ complete_discovery = self.get_deleted_task_status(task_id=discovery_task_id)
discovery_task_id = self.create_discovery(
ip_address_list=ip_address_list)
- complete_discovery = self.get_task_status(task_id=discovery_task_id)
+ complete_discovery = self.get_merged_task_status(task_id=discovery_task_id)
discovery_task_info = self.get_discoveries_by_range_until_success()
result = self.get_discovery_device_info(discovery_id=discovery_task_info.get('id'))
self.result["changed"] = True
@@ -1576,7 +1679,7 @@ class Discovery(DnacBase):
params = dict(id=exist_discovery.get('id'))
discovery_task_id = self.delete_exist_discovery(params=params)
- complete_discovery = self.get_task_status(task_id=discovery_task_id)
+ complete_discovery = self.get_deleted_task_status(task_id=discovery_task_id)
self.result["changed"] = True
self.result['msg'] = "Successfully deleted discovery"
self.result['diff'] = self.validated_config
@@ -1611,7 +1714,8 @@ class Discovery(DnacBase):
response = self.dnac_apply['exec'](
family="discovery",
function='get_discovery_by_id',
- params=params
+ params=params,
+ op_modifies=True,
)
discovery_name = config.get('discovery_name')
if response:
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_job_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_job_info.py
index 202f57c80..2e6de4f14 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_job_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_job_info.py
@@ -44,8 +44,8 @@ options:
- Id path parameter. Discovery ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetDiscoveryJobsByIP
description: Complete reference of the GetDiscoveryJobsByIP API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_range_delete.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_range_delete.py
index 07c380a17..876881242 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_range_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_range_delete.py
@@ -23,8 +23,8 @@ options:
description: StartIndex path parameter. Start index.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery DeleteDiscoveryBySpecifiedRange
description: Complete reference of the DeleteDiscoveryBySpecifiedRange API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_range_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_range_info.py
index c08902f8b..c4fc60ba7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_range_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_range_info.py
@@ -28,8 +28,8 @@ options:
- RecordsToReturn path parameter. Number of records to return.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetDiscoveriesByRange
description: Complete reference of the GetDiscoveriesByRange API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_summary_info.py
index bd8e6dcf6..9cff8b3ee 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_summary_info.py
@@ -68,8 +68,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetNetworkDevicesFromDiscovery
description: Complete reference of the GetNetworkDevicesFromDiscovery API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/discovery_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/discovery_workflow_manager.py
index 88ce124a3..758d3cc75 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/discovery_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/discovery_workflow_manager.py
@@ -59,7 +59,8 @@ options:
pass a list with single element like - 10.197.156.22. For CIDR based discovery, we should pass a list with
single element like - 10.197.156.22/22. For RANGE based discovery, we should pass a list with single element
and range like - 10.197.156.1-10.197.156.100. For MULTI RANGE based discovery, we should pass a list with multiple
- elementd like - 10.197.156.1-10.197.156.100 and in next line - 10.197.157.1-10.197.157.100.
+ elementd like - 10.197.156.1-10.197.156.100 and in next line - 10.197.157.1-10.197.157.100. Maximum of 8 IP address ranges
+ are allowed.
type: list
elements: str
required: true
@@ -328,7 +329,7 @@ options:
default: False
requirements:
- dnacentersdk == 2.6.10
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
discovery.Discovery.get_all_global_credentials_v2,
@@ -721,6 +722,43 @@ class Discovery(DnacBase):
self.status = "success"
return self
+ def validate_ip4_address_list(self):
+ """
+ Validates each ip adress paased in the IP_address_list passed by the user before preprocessing it
+ """
+
+ ip_address_list = self.validated_config[0].get('ip_address_list')
+ for ip in ip_address_list:
+ if '/' in ip:
+ ip = ip.split("/")[0]
+ if '-' in ip:
+ if len(ip.split('-')) == 2:
+ ip1, ip2 = ip.split('-')
+ if self.is_valid_ipv4(ip1) is False:
+ msg = "IP address {0} is not valid".format(ip1)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ if self.is_valid_ipv4(ip2) is False:
+ msg = "IP address {0} is not valid".format(ip2)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ ip1_parts = list(map(int, ip1.split('.')))
+ ip2_parts = list(map(int, ip2.split('.')))
+ for part in range(4):
+ if ip1_parts[part] > ip2_parts[part]:
+ msg = "Incorrect range passed: {0}. Please pass correct IP address range".format(ip)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ else:
+ msg = "Provided range '{0}' is incorrect. IP address range should have only upper and lower limit values".format(ip)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ if self.is_valid_ipv4(ip) is False and '-' not in ip:
+ msg = "IP address {0} is not valid".format(ip)
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ self.log("All the IP addresses passed are correct", "INFO")
+
def get_creds_ids_list(self):
"""
Retrieve the list of credentials IDs associated with class instance.
@@ -934,6 +972,7 @@ class Discovery(DnacBase):
family="discovery",
function='get_all_global_credentials_v2',
params=self.validated_config[0].get('headers'),
+ op_modifies=True
)
response = response.get('response')
self.log("The Global credentials response from 'get all global credentials v2' API is {0}".format(str(response)), "DEBUG")
@@ -1022,6 +1061,10 @@ class Discovery(DnacBase):
else:
self.preprocess_device_discovery_handle_error()
else:
+ if len(ip_address_list) > 8:
+ msg = "Maximum of 8 IP ranges are allowed."
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
new_ip_collected = []
for ip in ip_address_list:
if len(str(ip).split("-")) != 2:
@@ -1267,11 +1310,11 @@ class Discovery(DnacBase):
self.log("Task Id of the API task created is {0}".format(result.response.get('taskId')), "INFO")
return result.response.get('taskId')
- def get_task_status(self, task_id=None):
+ def get_merged_task_status(self, task_id=None):
"""
- Monitor the status of a task in the Cisco Catalyst Center. It checks the task
- status periodically until the task is no longer 'In Progress'.
- If the task encounters an error or fails, it immediately fails the
+ Monitor the status of a task of creation of dicovery in the Cisco Catalyst Center.
+ It checks the task status periodically until the task is no longer 'In Progress'
+ or other states. If the task encounters an error or fails, it immediately fails the
module and returns False.
Parameters:
@@ -1288,9 +1331,10 @@ class Discovery(DnacBase):
family="task",
function='get_task_by_id',
params=params,
+ op_modifies=True,
)
response = response.response
- self.log("Task status for the task id {0} is {1}".format(str(task_id), str(response)), "INFO")
+ self.log("Task status for the task id {0} is {1}, is_error: {2}".format(str(task_id), str(response), str(response.get('isError'))), "INFO")
if response.get('isError') or re.search(
'failed', response.get('progress'), flags=re.IGNORECASE
):
@@ -1299,17 +1343,62 @@ class Discovery(DnacBase):
self.log(msg, "CRITICAL")
self.module.fail_json(msg=msg)
return False
+
self.log("Task status for the task id (before checking status) {0} is {1}".format(str(task_id), str(response)), "INFO")
progress = response.get('progress')
- if progress in ('In Progress', 'Inventory service initiating discovery'):
+ try:
+ progress_value = int(progress)
+ result = True
+ self.log("The discovery process is completed", "INFO")
+ self.result.update(dict(discovery_task=response))
+ return result
+ except Exception:
+ self.log("The progress status is {0}, continue to check the status after 3 seconds. Putting into sleep for 3 seconds".format(progress))
time.sleep(3)
- continue
- else:
+
+ def get_deleted_task_status(self, task_id=None):
+ """
+ Monitor the status of a task of deletion of dicovery in the Cisco Catalyst Center.
+ It checks the itask status periodically until the task is 'Discovery deleted successfully'.
+ If the task encounters an error or fails, it immediately fails the module and returns False.
+
+ Parameters:
+ - task_id: The ID of the task to monitor.
+
+ Returns:
+ - result: True if the task completed successfully, False otherwise.
+ """
+
+ result = False
+ params = dict(task_id=task_id)
+ while True:
+ response = self.dnac_apply['exec'](
+ family="task",
+ function='get_task_by_id',
+ params=params,
+ op_modifies=True,
+ )
+ response = response.response
+ self.log("Task status for the task id {0} is {1}, is_error: {2}".format(str(task_id), str(response), str(response.get('isError'))), "INFO")
+ if response.get('isError') or re.search(
+ 'failed', response.get('progress'), flags=re.IGNORECASE
+ ):
+ msg = 'Discovery task with id {0} has not completed - Reason: {1}'.format(
+ task_id, response.get("failureReason"))
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ return False
+
+ self.log("Task status for the task id (before checking status) {0} is {1}".format(str(task_id), str(response)), "INFO")
+ progress = response.get('progress')
+ if re.search('Discovery deleted successfully.', response.get('progress')):
result = True
- self.log("The Process is completed", "INFO")
- break
- self.result.update(dict(discovery_task=response))
- return result
+ self.log("The discovery process is completed", "INFO")
+ self.result.update(dict(discovery_task=response))
+ return result
+
+ self.log("The progress status is {0}, continue to check the status after 3 seconds. Putting into sleep for 3 seconds".format(progress))
+ time.sleep(3)
def lookup_discovery_by_range_via_name(self):
"""
@@ -1336,7 +1425,8 @@ class Discovery(DnacBase):
response_part = self.dnac_apply['exec'](
family="discovery",
function='get_discoveries_by_range',
- params=params
+ params=params,
+ op_modifies=True,
)
response["response"].extend(response_part["response"])
else:
@@ -1349,7 +1439,8 @@ class Discovery(DnacBase):
response = self.dnac_apply['exec'](
family="discovery",
function='get_discoveries_by_range',
- params=params
+ params=params,
+ op_modifies=True,
)
self.log("Response of the get discoveries via range API is {0}".format(str(response)), "DEBUG")
@@ -1373,6 +1464,7 @@ class Discovery(DnacBase):
"""
result = False
+ aborted = False
discovery = self.lookup_discovery_by_range_via_name()
if not discovery:
@@ -1383,17 +1475,25 @@ class Discovery(DnacBase):
while True:
discovery = self.lookup_discovery_by_range_via_name()
- if discovery.get('discoveryCondition') == 'Complete':
+ discovery_condition = discovery.get('discoveryCondition')
+ if discovery_condition == 'Complete':
result = True
break
-
+ elif discovery_condition == 'Aborted':
+ aborted = True
+ break
time.sleep(3)
if not result:
- msg = 'Cannot find any discovery task with name {0} -- Discovery result: {1}'.format(
- str(self.validated_config[0].get("discovery_name")), str(discovery))
- self.log(msg, "CRITICAL")
- self.module.fail_json(msg=msg)
+ if aborted is True:
+ msg = 'Discovery with name {0} is aborted by the user on the GUI'.format(str(self.validated_config[0].get("discovery_name")))
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
+ else:
+ msg = 'Cannot find any discovery task with name {0} -- Discovery result: {1}'.format(
+ str(self.validated_config[0].get("discovery_name")), str(discovery))
+ self.log(msg, "CRITICAL")
+ self.module.fail_json(msg=msg)
self.result.update(dict(discovery_range=discovery))
return discovery
@@ -1425,6 +1525,7 @@ class Discovery(DnacBase):
family="discovery",
function='get_discovered_network_devices_by_discovery_id',
params=params,
+ op_modifies=True,
)
devices = response.response
@@ -1495,6 +1596,7 @@ class Discovery(DnacBase):
family="discovery",
function="delete_discovery_by_id",
params=params,
+ op_modifies=True,
)
self.log("Response collected from API 'delete_discovery_by_id': {0}".format(str(response)), "DEBUG")
@@ -1513,17 +1615,18 @@ class Discovery(DnacBase):
- self: The instance of the class with updated attributes.
"""
+ self.validate_ip4_address_list()
devices_list_info = self.get_devices_list_info()
ip_address_list = self.preprocess_device_discovery(devices_list_info)
exist_discovery = self.get_exist_discovery()
if exist_discovery:
params = dict(id=exist_discovery.get('id'))
discovery_task_id = self.delete_exist_discovery(params=params)
- complete_discovery = self.get_task_status(task_id=discovery_task_id)
+ complete_discovery = self.get_deleted_task_status(task_id=discovery_task_id)
discovery_task_id = self.create_discovery(
ip_address_list=ip_address_list)
- complete_discovery = self.get_task_status(task_id=discovery_task_id)
+ complete_discovery = self.get_merged_task_status(task_id=discovery_task_id)
discovery_task_info = self.get_discoveries_by_range_until_success()
result = self.get_discovery_device_info(discovery_id=discovery_task_info.get('id'))
self.result["changed"] = True
@@ -1576,7 +1679,7 @@ class Discovery(DnacBase):
params = dict(id=exist_discovery.get('id'))
discovery_task_id = self.delete_exist_discovery(params=params)
- complete_discovery = self.get_task_status(task_id=discovery_task_id)
+ complete_discovery = self.get_deleted_task_status(task_id=discovery_task_id)
self.result["changed"] = True
self.result['msg'] = "Successfully deleted discovery"
self.result['diff'] = self.validated_config
@@ -1611,7 +1714,8 @@ class Discovery(DnacBase):
response = self.dnac_apply['exec'](
family="discovery",
function='get_discovery_by_id',
- params=params
+ params=params,
+ op_modifies=True,
)
discovery_name = config.get('discovery_name')
if response:
diff --git a/ansible_collections/cisco/dnac/plugins/modules/dna_command_runner_keywords_info.py b/ansible_collections/cisco/dnac/plugins/modules/dna_command_runner_keywords_info.py
index dee8c3ff2..1e63e6b13 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/dna_command_runner_keywords_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/dna_command_runner_keywords_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Command Runner GetAllKeywordsOfCLIsAcceptedByCommandRunner
description: Complete reference of the GetAllKeywordsOfCLIsAcceptedByCommandRunner API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/dnac_packages_info.py b/ansible_collections/cisco/dnac/plugins/modules/dnac_packages_info.py
index 2d0a0e0dd..ebc2481a5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/dnac_packages_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/dnac_packages_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Platform CiscoDNACenterPackagesSummary
description: Complete reference of the CiscoDNACenterPackagesSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/dnacaap_management_execution_status_info.py b/ansible_collections/cisco/dnac/plugins/modules/dnacaap_management_execution_status_info.py
index 1afb01dff..3fc122f4d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/dnacaap_management_execution_status_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/dnacaap_management_execution_status_info.py
@@ -24,8 +24,8 @@ options:
- ExecutionId path parameter. Execution Id of API.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Task GetBusinessAPIExecutionDetails
description: Complete reference of the GetBusinessAPIExecutionDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules.py b/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules.py
index 38e2f47ec..43633824b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules.py
@@ -114,8 +114,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
policy.Policy.create_a_profiling_rule,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules_info.py b/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules_info.py
index 9c42ee1ea..1e3ca88c2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/endpoint_analytics_profiling_rules_info.py
@@ -60,8 +60,8 @@ options:
- RuleId path parameter. Unique rule identifier.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
policy.Policy.get_details_of_a_single_profiling_rule,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/eox_status_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/eox_status_device_info.py
index 6843843e8..dc1073450 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/eox_status_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/eox_status_device_info.py
@@ -26,8 +26,8 @@ options:
- DeviceId path parameter. Device instance UUID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for EoX GetEoXDetailsPerDevice
description: Complete reference of the GetEoXDetailsPerDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/eox_status_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/eox_status_summary_info.py
index 0ec817750..26dc6d99d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/eox_status_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/eox_status_summary_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for EoX GetEoXSummary
description: Complete reference of the GetEoXSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_api_status_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_api_status_info.py
index 4ddaaca0a..8c6cf8d13 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_api_status_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_api_status_info.py
@@ -24,8 +24,8 @@ options:
- ExecutionId path parameter. Execution ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetStatusAPIForEvents
description: Complete reference of the GetStatusAPIForEvents API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_artifact_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_artifact_count_info.py
index f34e77fe8..fb7d3ab7d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_artifact_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_artifact_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management EventArtifactCount
description: Complete reference of the EventArtifactCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_artifact_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_artifact_info.py
index 6e4f14b6a..196b1233c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_artifact_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_artifact_info.py
@@ -48,8 +48,8 @@ options:
- Search query parameter. Findd matches in name, description, eventId, type, category.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetEventArtifacts
description: Complete reference of the GetEventArtifacts API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_config_connector_types_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_config_connector_types_info.py
index 8c0958e7e..b30a9659a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_config_connector_types_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_config_connector_types_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetConnectorTypes
description: Complete reference of the GetConnectorTypes API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_count_info.py
index 131712342..864364655 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_count_info.py
@@ -28,8 +28,8 @@ options:
- Tags query parameter. The registered Tags should be provided.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CountOfEvents
description: Complete reference of the CountOfEvents API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_email_config.py b/ansible_collections/cisco/dnac/plugins/modules/event_email_config.py
index 3b9de49a1..fd5fdb882 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_email_config.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_email_config.py
@@ -62,8 +62,8 @@ options:
description: To Email.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateEmailDestination
description: Complete reference of the CreateEmailDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_email_config_create.py b/ansible_collections/cisco/dnac/plugins/modules/event_email_config_create.py
index b207dde21..4be4ec362 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_email_config_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_email_config_create.py
@@ -61,8 +61,8 @@ options:
description: To Email.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateEmailDestination
description: Complete reference of the CreateEmailDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_email_config_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_email_config_info.py
index 6aa855855..272118cd7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_email_config_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_email_config_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetEmailDestination
description: Complete reference of the GetEmailDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_email_config_update.py b/ansible_collections/cisco/dnac/plugins/modules/event_email_config_update.py
index 2234ae907..c471ff807 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_email_config_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_email_config_update.py
@@ -61,8 +61,8 @@ options:
description: To Email.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management UpdateEmailDestination
description: Complete reference of the UpdateEmailDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_info.py
index ac34fbf25..a3eafb297 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_info.py
@@ -44,8 +44,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetEvents
description: Complete reference of the GetEvents API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_info.py
index dbb7b5320..b5fa297d9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_info.py
@@ -122,8 +122,8 @@ options:
values asc, desc.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetAuditLogRecords
description: Complete reference of the GetAuditLogRecords API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_parent_records_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_parent_records_info.py
index 6f6a2b616..26bd96d29 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_parent_records_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_parent_records_info.py
@@ -118,8 +118,8 @@ options:
values asc, desc.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetAuditLogParentRecords
description: Complete reference of the GetAuditLogParentRecords API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_summary_info.py
index ee2063fa0..2e0d2e133 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_series_audit_logs_summary_info.py
@@ -106,8 +106,8 @@ options:
mandatory).
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetAuditLogSummary
description: Complete reference of the GetAuditLogSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_series_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_series_count_info.py
index 6fd07cf4a..ebd6576f0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_series_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_series_count_info.py
@@ -56,8 +56,8 @@ options:
- Source query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CountOfNotifications
description: Complete reference of the CountOfNotifications API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_series_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_series_info.py
index 523e5a708..982aa0cbc 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_series_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_series_info.py
@@ -84,8 +84,8 @@ options:
- SiteId query parameter. Site Id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetNotifications
description: Complete reference of the GetNotifications API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_snmp_config_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_snmp_config_info.py
index 6ae23c7f3..b87081672 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_snmp_config_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_snmp_config_info.py
@@ -40,8 +40,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetSNMPDestination
description: Complete reference of the GetSNMPDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription.py
index 38c2899ae..0aca4d2db 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription.py
@@ -94,8 +94,8 @@ options:
description: Subscriptions query parameter. List of EventSubscriptionId's for removal.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateEventSubscriptions
description: Complete reference of the CreateEventSubscriptions API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_count_info.py
index e9eb3e432..daf1a6fdf 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_count_info.py
@@ -24,8 +24,8 @@ options:
- EventIds query parameter. List of subscriptions related to the respective eventIds.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CountOfEventSubscriptions
description: Complete reference of the CountOfEventSubscriptions API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_email_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_email_info.py
index 7109b1ac1..b6487d13f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_email_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_email_info.py
@@ -44,8 +44,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetEmailSubscriptionDetails
description: Complete reference of the GetEmailSubscriptionDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_rest_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_rest_info.py
index cde6348bf..ee793eff1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_rest_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_rest_info.py
@@ -48,8 +48,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetRestWebhookSubscriptionDetails
description: Complete reference of the GetRestWebhookSubscriptionDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_syslog_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_syslog_info.py
index 2d3676759..18e68fa77 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_syslog_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_details_syslog_info.py
@@ -46,8 +46,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetSyslogSubscriptionDetails
description: Complete reference of the GetSyslogSubscriptionDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email.py
index 56b82b4a8..13dc4cfe8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email.py
@@ -106,8 +106,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateEmailEventSubscription
description: Complete reference of the CreateEmailEventSubscription API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email_info.py
index 5d20ef478..3eab8992b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_email_info.py
@@ -62,8 +62,8 @@ options:
- Name query parameter. List of email subscriptions related to the respective name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetEmailEventSubscriptions
description: Complete reference of the GetEmailEventSubscriptions API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_info.py
index 7655d9676..9349d81e7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_info.py
@@ -40,8 +40,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetEventSubscriptions
description: Complete reference of the GetEventSubscriptions API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest.py
index acfc5f9e4..81eea1f2e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest.py
@@ -90,8 +90,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateRestWebhookEventSubscription
description: Complete reference of the CreateRestWebhookEventSubscription API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest_info.py
index a26bf7473..06e8dab61 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_rest_info.py
@@ -60,8 +60,8 @@ options:
- Name query parameter. List of subscriptions related to the respective name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetRestWebhookEventSubscriptions
description: Complete reference of the GetRestWebhookEventSubscriptions API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog.py
index 802664038..aeff30dd3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog.py
@@ -90,8 +90,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateSyslogEventSubscription
description: Complete reference of the CreateSyslogEventSubscription API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog_info.py
index dcd077007..ef6ffb044 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_subscription_syslog_info.py
@@ -60,8 +60,8 @@ options:
- Name query parameter. List of subscriptions related to the respective name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetSyslogEventSubscriptions
description: Complete reference of the GetSyslogEventSubscriptions API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config.py b/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config.py
index a59316f39..11c6d9508 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config.py
@@ -36,8 +36,8 @@ options:
description: Protocol.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateSyslogDestination
description: Complete reference of the CreateSyslogDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config_info.py b/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config_info.py
index 2c2617128..a2e6009c8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_syslog_config_info.py
@@ -48,8 +48,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management GetSyslogDestination
description: Complete reference of the GetSyslogDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_webhook_create.py b/ansible_collections/cisco/dnac/plugins/modules/event_webhook_create.py
index b9c585ee9..2859b7615 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_webhook_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_webhook_create.py
@@ -52,8 +52,8 @@ options:
description: Required only for update webhook configuration.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateWebhookDestination
description: Complete reference of the CreateWebhookDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/event_webhook_update.py b/ansible_collections/cisco/dnac/plugins/modules/event_webhook_update.py
index 91d70839b..0c50462ed 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/event_webhook_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/event_webhook_update.py
@@ -52,8 +52,8 @@ options:
description: Required only for update webhook configuration.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management UpdateWebhookDestination
description: Complete reference of the UpdateWebhookDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/execute_suggested_actions_commands.py b/ansible_collections/cisco/dnac/plugins/modules/execute_suggested_actions_commands.py
index 51df59677..43fce3203 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/execute_suggested_actions_commands.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/execute_suggested_actions_commands.py
@@ -27,8 +27,8 @@ options:
description: Contains the actual value for the entity type that has been defined.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Issues ExecuteSuggestedActionsCommands
description: Complete reference of the ExecuteSuggestedActionsCommands API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/file_import.py b/ansible_collections/cisco/dnac/plugins/modules/file_import.py
index f82598e0c..f9909eddd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/file_import.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/file_import.py
@@ -23,8 +23,8 @@ options:
description: NameSpace path parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for File UploadFile
description: Complete reference of the UploadFile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/file_info.py b/ansible_collections/cisco/dnac/plugins/modules/file_info.py
index bf07d1072..b9bdba4b9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/file_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/file_info.py
@@ -36,8 +36,8 @@ options:
- The filename used to save the download file.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for File DownloadAFileByFileId
description: Complete reference of the DownloadAFileByFileId API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/file_namespace_files_info.py b/ansible_collections/cisco/dnac/plugins/modules/file_namespace_files_info.py
index e28b10c8f..0e16dbc1a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/file_namespace_files_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/file_namespace_files_info.py
@@ -24,8 +24,8 @@ options:
- NameSpace path parameter. A listing of fileId's.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for File GetListOfFiles
description: Complete reference of the GetListOfFiles API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/file_namespaces_info.py b/ansible_collections/cisco/dnac/plugins/modules/file_namespaces_info.py
index a0fc5682f..849268111 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/file_namespaces_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/file_namespaces_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for File GetListOfAvailableNamespaces
description: Complete reference of the GetListOfAvailableNamespaces API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/global_credential_delete.py b/ansible_collections/cisco/dnac/plugins/modules/global_credential_delete.py
index 13c9630c3..3dd9ad1d1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/global_credential_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/global_credential_delete.py
@@ -20,8 +20,8 @@ options:
description: GlobalCredentialId path parameter. ID of global-credential.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery DeleteGlobalCredentialsById
description: Complete reference of the DeleteGlobalCredentialsById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/global_credential_info.py b/ansible_collections/cisco/dnac/plugins/modules/global_credential_info.py
index 4fe317b6f..2d46ca10f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/global_credential_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/global_credential_info.py
@@ -40,8 +40,8 @@ options:
- Id path parameter. Global Credential ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetCredentialSubTypeByCredentialId
description: Complete reference of the GetCredentialSubTypeByCredentialId API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/global_credential_update.py b/ansible_collections/cisco/dnac/plugins/modules/global_credential_update.py
index 127504846..8f2ea144a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/global_credential_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/global_credential_update.py
@@ -24,8 +24,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery UpdateGlobalCredentials
description: Complete reference of the UpdateGlobalCredentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2.py b/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2.py
index 0679fed86..2d27cca33 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2.py
@@ -137,8 +137,8 @@ options:
type: str
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateGlobalCredentialsV2
description: Complete reference of the CreateGlobalCredentialsV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2_info.py b/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2_info.py
index c746964cb..6b0bffd4d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/global_credential_v2_info.py
@@ -22,8 +22,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetAllGlobalCredentialsV2
description: Complete reference of the GetAllGlobalCredentialsV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/global_pool.py b/ansible_collections/cisco/dnac/plugins/modules/global_pool.py
index 3c94f9c58..f52c316d6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/global_pool.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/global_pool.py
@@ -48,8 +48,8 @@ options:
type: list
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings CreateGlobalPool
description: Complete reference of the CreateGlobalPool API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/global_pool_info.py b/ansible_collections/cisco/dnac/plugins/modules/global_pool_info.py
index ed95446be..4d95ba9ea 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/global_pool_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/global_pool_info.py
@@ -28,8 +28,8 @@ options:
- Limit query parameter. No of Global Pools to be retrieved.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings GetGlobalPool
description: Complete reference of the GetGlobalPool API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/golden_image_create.py b/ansible_collections/cisco/dnac/plugins/modules/golden_image_create.py
index 1f176f172..95385c59d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/golden_image_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/golden_image_create.py
@@ -30,8 +30,8 @@ options:
description: SiteId in uuid format. For Global Site "-1" to be used.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) TagAsGoldenImage
description: Complete reference of the TagAsGoldenImage API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_delete.py b/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_delete.py
index 8191e4915..392165663 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_delete.py
@@ -32,8 +32,8 @@ options:
Global site.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) RemoveGoldenTagForImage
description: Complete reference of the RemoveGoldenTagForImage API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_details_info.py
index 9d41a7610..c92ed9503 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/golden_tag_image_details_info.py
@@ -38,8 +38,8 @@ options:
- ImageId path parameter. Image Id in uuid format.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) GetGoldenTagStatusOfAnImage
description: Complete reference of the GetGoldenTagStatusOfAnImage API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/http_read_credential.py b/ansible_collections/cisco/dnac/plugins/modules/http_read_credential.py
index 63c19d5c4..89a5f7f47 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/http_read_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/http_read_credential.py
@@ -48,8 +48,8 @@ options:
description: Http Read Credential's username.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateHTTPReadCredentials
description: Complete reference of the CreateHTTPReadCredentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/http_write_credential.py b/ansible_collections/cisco/dnac/plugins/modules/http_write_credential.py
index 2db38bb61..611f40716 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/http_write_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/http_write_credential.py
@@ -48,8 +48,8 @@ options:
description: Http Write Credential's username.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateHTTPWriteCredentials
description: Complete reference of the CreateHTTPWriteCredentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm.py b/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm.py
index 1bc569d9f..86fa8bd76 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm.py
@@ -48,8 +48,8 @@ options:
description: Name of the setting instance.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for ITSM Integration CreateITSMIntegrationSetting
description: Complete reference of the CreateITSMIntegrationSetting API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm_info.py b/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm_info.py
index fc6a5de7a..0519f5e5a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/integration_settings_instances_itsm_info.py
@@ -24,8 +24,8 @@ options:
- InstanceId path parameter. Instance Id of the Integration setting instance.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for ITSM Integration GetITSMIntegrationSettingById
description: Complete reference of the GetITSMIntegrationSettingById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/interface_info.py b/ansible_collections/cisco/dnac/plugins/modules/interface_info.py
index 02d4dd14e..a6f0706ad 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/interface_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/interface_info.py
@@ -24,8 +24,8 @@ options:
- InterfaceUuid path parameter. Interface ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices LegitOperationsForInterface
description: Complete reference of the LegitOperationsForInterface API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_detail_info.py b/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_detail_info.py
index 344f22a2f..81a3203d6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_detail_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_detail_info.py
@@ -28,8 +28,8 @@ options:
- Name query parameter. Interface name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetInterfaceDetailsByDeviceIdAndInterfaceName
description: Complete reference of the GetInterfaceDetailsByDeviceIdAndInterfaceName API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_info.py
index 8fdc0e226..62bb64e03 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_info.py
@@ -24,8 +24,8 @@ options:
- DeviceId path parameter. Device ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetInterfaceInfoById
description: Complete reference of the GetInterfaceInfoById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_range_info.py b/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_range_info.py
index 0a3f1448b..2f2e3a6ea 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_range_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/interface_network_device_range_info.py
@@ -32,8 +32,8 @@ options:
- RecordsToReturn path parameter. Number of records to return.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceInterfacesBySpecifiedRange
description: Complete reference of the GetDeviceInterfacesBySpecifiedRange API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/interface_operation_create.py b/ansible_collections/cisco/dnac/plugins/modules/interface_operation_create.py
index 98995c1dc..1bc065c31 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/interface_operation_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/interface_operation_create.py
@@ -33,8 +33,8 @@ options:
description: Payload.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices ClearMacAddressTable
description: Complete reference of the ClearMacAddressTable API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/interface_update.py b/ansible_collections/cisco/dnac/plugins/modules/interface_update.py
index 20d7435e4..261703d48 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/interface_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/interface_update.py
@@ -39,8 +39,8 @@ options:
description: Voice Vlan Id.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices UpdateInterfaceDetails
description: Complete reference of the UpdateInterfaceDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/inventory_intent.py b/ansible_collections/cisco/dnac/plugins/modules/inventory_intent.py
index 675c11c91..af2572486 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/inventory_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/inventory_intent.py
@@ -307,8 +307,8 @@ options:
version_added: 6.12.0
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco Catalyst Center documentation for Devices AddDevice2
description: Complete reference of the AddDevice2 API.
@@ -522,7 +522,7 @@ EXAMPLES = r"""
- device_ip: "1.1.1.1"
site_name: "Global/USA/San Francisco/BGL_18/floor_pnp"
resync_retry_count: 200
- resync_interval: 2
+ resync_retry_interval: 2
- device_ip: "2.2.2.2"
site_name: "Global/USA/San Francisco/BGL_18/floor_test"
resync_retry_count: 200
@@ -913,6 +913,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_all_user_defined_fields',
+ op_modifies=True,
params={"name": field_name},
)
@@ -943,6 +944,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='create_user_defined_field',
+ op_modifies=True,
params=udf,
)
self.log("Received API response from 'create_user_defined_field': {0}".format(str(response)), "DEBUG")
@@ -986,6 +988,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='add_user_defined_field_to_device',
+ op_modifies=True,
params=udf_param_dict,
)
self.log("Received API response from 'add_user_defined_field_to_device': {0}".format(str(response)), "DEBUG")
@@ -1226,6 +1229,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response', [])
@@ -1360,6 +1364,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')
@@ -1905,6 +1910,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_all_user_defined_fields',
+ op_modifies=True,
params={"name": field_name},
)
self.log("Received API response from 'get_all_user_defined_fields': {0}".format(str(response)), "DEBUG")
@@ -1918,11 +1924,12 @@ class DnacDevice(DnacBase):
return udf_id
- def mandatory_parameter(self):
+ def mandatory_parameter(self, device_to_add_in_ccc):
"""
Check for and validate mandatory parameters for adding network devices in Cisco Catalyst Center.
Parameters:
self (object): An instance of a class used for interacting with Cisco Cisco Catalyst Center.
+ device_to_add_in_ccc(list): List to device ip addresses to be added in Cisco Catalyst Center.
Returns:
dict: The input `config` dictionary if all mandatory parameters are present.
Description:
@@ -1947,12 +1954,12 @@ class DnacDevice(DnacBase):
if mandatory_params_absent:
self.status = "failed"
- self.msg = "Required parameters {0} for adding devices are not present".format(str(mandatory_params_absent))
+ self.msg = "Required parameters {0} for adding devices '{1}' are not present".format(str(mandatory_params_absent), str(device_to_add_in_ccc))
self.result['msg'] = self.msg
self.log(self.msg, "ERROR")
else:
self.status = "success"
- self.msg = "Required parameter for Adding the devices in Inventory are present."
+ self.msg = "Required parameters for adding the devices '{0}' to inventory are present.".format(str(device_to_add_in_ccc))
self.log(self.msg, "INFO")
return self
@@ -2091,6 +2098,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
@@ -2127,6 +2135,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"hostname": hostname}
)
if response:
@@ -2161,6 +2170,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"serialNumber": serial_number}
)
if response:
@@ -2195,6 +2205,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"macAddress": mac_address}
)
if response:
@@ -2233,6 +2244,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_interface_details',
+ op_modifies=True,
params=interface_detail_params
)
self.log("Received API response from 'get_interface_details': {0}".format(str(response)), "DEBUG")
@@ -2246,44 +2258,44 @@ class DnacDevice(DnacBase):
return interface_id
except Exception as e:
- error_message = "Error while fetching interface id for interface({0}) from Cisco Catalyst Center: {1}".format(interface_name, str(e))
- self.log(error_message, "ERROR")
- self.msg = error_message
self.status = "failed"
+ self.msg = "Failed to retrieve interface ID for interface({0}) from Cisco Catalyst Center: {1}".format(interface_name, str(e))
+ self.log(self.msg, "ERROR")
return self
- def get_interface_from_ip(self, device_ip):
- """
- Get the interface ID for a device in Cisco Catalyst Center based on its IP address.
- Parameters:
- self (object): An instance of a class used for interacting with Cisco Catalyst Center.
- device_ip (str): The IP address of the device.
- Returns:
- str: The interface ID for the specified device.
- Description:
- The function sends a request to Cisco Catalyst Center to retrieve the interface information
- for the device with the provided IP address and extracts the interface ID from the
- response, and returns the interface ID.
- """
+ def get_interface_from_ip(self, device_ip):
+ """
+ Get the interface ID for a device in Cisco Catalyst Center based on its IP address.
+ Parameters:
+ self (object): An instance of a class used for interacting with Cisco Catalyst Center.
+ device_ip (str): The IP address of the device.
+ Returns:
+ str: The interface ID for the specified device.
+ Description:
+ The function sends a request to Cisco Catalyst Center to retrieve the interface information
+ for the device with the provided IP address and extracts the interface ID from the
+ response, and returns the interface ID.
+ """
- try:
- response = self.dnac._exec(
- family="devices",
- function='get_interface_by_ip',
- params={"ip_address": device_ip}
- )
- self.log("Received API response from 'get_interface_by_ip': {0}".format(str(response)), "DEBUG")
- response = response.get("response")
+ try:
+ response = self.dnac._exec(
+ family="devices",
+ function='get_interface_by_ip',
+ op_modifies=True,
+ params={"ip_address": device_ip}
+ )
+ self.log("Received API response from 'get_interface_by_ip': {0}".format(str(response)), "DEBUG")
+ response = response.get("response")
- if response:
- interface_id = response[0]["id"]
- self.log("Fetch Interface Id for device '{0}' successfully !!".format(device_ip))
- return interface_id
+ if response:
+ interface_id = response[0]["id"]
+ self.log("Successfully retrieved Interface Id '{0}' for device '{1}'.".format(interface_id, device_ip), "DEBUG")
+ return interface_id
- except Exception as e:
- error_message = "Error while fetching Interface Id for device '{0}' from Cisco Catalyst Center: {1}".format(device_ip, str(e))
- self.log(error_message, "ERROR")
- raise Exception(error_message)
+ except Exception as e:
+ error_message = "Error while fetching Interface Id for device '{0}' from Cisco Catalyst Center: {1}".format(device_ip, str(e))
+ self.log(error_message, "ERROR")
+ raise Exception(error_message)
def get_device_response(self, device_ip):
"""
@@ -2302,6 +2314,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')[0]
@@ -2360,6 +2373,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_interface_details',
+ op_modifies=True,
params=interface_detail_params
)
self.log("Received API response from 'get_interface_details': {0}".format(str(response)), "DEBUG")
@@ -2555,12 +2569,23 @@ class DnacDevice(DnacBase):
"""
# Call the Get interface details by device IP API and fetch the interface Id
+ is_update_occurred = False
+ response_list = []
for device_ip in device_to_update:
interface_params = self.config[0].get('update_interface_details')
interface_names_list = interface_params.get('interface_name')
for interface_name in interface_names_list:
device_id = self.get_device_ids([device_ip])
- interface_id = self.get_interface_from_id_and_name(device_id[0], interface_name)
+ interface_details = self.get_interface_from_id_and_name(device_id[0], interface_name)
+ # Check if interface_details is None or does not contain the 'id' key.
+ if interface_details is None or not interface_details.get('id'):
+ self.status = "failed"
+ self.msg = """Failed to retrieve interface details or the 'id' is missing for the device with identifier
+ '{0}' and interface '{1}'""".format(device_id[0], interface_name)
+ self.log(self.msg, "WARNING")
+ return self
+
+ interface_id = interface_details['id']
self.check_return_status()
# Now we call update interface details api with required parameter
@@ -2574,11 +2599,11 @@ class DnacDevice(DnacBase):
if response.get('role').upper() != "ACCESS":
self.msg = "The action to clear the MAC Address table is only supported for devices with the ACCESS role."
self.log(self.msg, "WARNING")
- self.result['response'] = self.msg
+ response_list.append(self.msg)
+ self.result['changed'] = False
else:
deploy_mode = interface_params.get('deployment_mode', 'Deploy')
- self.clear_mac_address(interface_id, deploy_mode, interface_name)
- self.check_return_status()
+ self.clear_mac_address(interface_id, deploy_mode, interface_name).check_return_status()
temp_params = {
'description': interface_params.get('description', ''),
@@ -2591,6 +2616,25 @@ class DnacDevice(DnacBase):
if value is not None:
payload_params[key] = value
+ # Check if interface need update or not here
+ interface_needs_update = False
+ for key, value in payload_params.items():
+ if key == "voiceVlanId":
+ if str(value) != interface_details['voiceVlan']:
+ interface_needs_update = True
+ else:
+ if str(value) != str(interface_details.get(key)):
+ interface_needs_update = True
+
+ if not interface_needs_update:
+ self.status = "success"
+ self.result['changed'] = False
+ self.msg = """Interface details for the given interface '{0}' are already updated in the Cisco Catalyst Center for the
+ device '{1}'.""".format(interface_name, device_ip)
+ self.log(self.msg, "INFO")
+ self.result['response'] = self.msg
+ continue
+
update_interface_params = {
'payload': payload_params,
'interface_uuid': interface_id,
@@ -2605,16 +2649,23 @@ class DnacDevice(DnacBase):
self.log("Received API response from 'update_interface_details': {0}".format(str(response)), "DEBUG")
if response and isinstance(response, dict):
- task_id = response.get('response').get('taskId')
+ response = response.get('response')
+ if not response:
+ self.status = "failed"
+ self.msg = "Failed to update the interface because the 'update_interface_details' API returned an empty response."
+ self.log(self.msg, "ERROR")
+ continue
+
+ task_id = response.get('taskId')
while True:
execution_details = self.get_task_details(task_id)
if 'SUCCESS' in execution_details.get("progress"):
self.status = "success"
- self.result['changed'] = True
- self.result['response'] = execution_details
- self.msg = "Updated Interface Details for device '{0}' successfully".format(device_ip)
+ is_update_occurred = True
+ self.msg = "Successfully updated the Interface Details for device '{0}'.".format(device_ip)
+ response_list.append(self.msg)
self.log(self.msg, "INFO")
break
elif execution_details.get("isError"):
@@ -2634,6 +2685,10 @@ class DnacDevice(DnacBase):
self.result['changed'] = False
self.msg = "Port actions are only supported on user facing/access ports as it's not allowed or No Updation required"
self.log(self.msg, "INFO")
+ response_list.append(self.msg)
+
+ self.result['changed'] = is_update_occurred
+ self.result['response'] = response_list
return self
@@ -2711,8 +2766,8 @@ class DnacDevice(DnacBase):
elif execution_details.get("endTime"):
self.status = "success"
self.result['changed'] = True
- self.result['response'] = execution_details
self.msg = "Device '{0}' present in Cisco Catalyst Center and have been updated successfully".format(device_ip)
+ self.result['response'] = self.msg
self.log(self.msg, "INFO")
break
@@ -2737,6 +2792,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')
@@ -2924,7 +2980,8 @@ class DnacDevice(DnacBase):
device_params.pop('snmpPrivPassphrase', None)
device_params.pop('snmpPrivProtocol', None)
- self.mandatory_parameter().check_return_status()
+ device_to_add_in_ccc = device_params['ipAddress']
+ self.mandatory_parameter(device_to_add_in_ccc).check_return_status()
try:
response = self.dnac._exec(
family="devices",
@@ -2982,6 +3039,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')[0]
@@ -3161,6 +3219,15 @@ class DnacDevice(DnacBase):
if not playbook_params['snmpROCommunity']:
playbook_params['snmpROCommunity'] = device_data.get('snmp_community', None)
+ if not playbook_params['snmpRWCommunity']:
+ playbook_params['snmpRWCommunity'] = device_data.get('snmp_write_community', None)
+
+ if not playbook_params['httpUserName']:
+ playbook_params['httpUserName'] = device_data.get('http_config_username', None)
+ if not playbook_params['httpPassword']:
+ playbook_params['httpPassword'] = device_data.get('http_config_password', None)
+ if not playbook_params['httpPort']:
+ playbook_params['httpPort'] = device_data.get('http_port', None)
try:
if playbook_params['updateMgmtIPaddressList']:
@@ -3306,6 +3373,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='delete_user_defined_field',
+ op_modifies=True,
params={"id": udf_id},
)
if response and isinstance(response, dict):
@@ -3356,6 +3424,7 @@ class DnacDevice(DnacBase):
prov_respone = self.dnac._exec(
family="sda",
function='get_provisioned_wired_device',
+ op_modifies=True,
params=provision_params,
)
@@ -3363,6 +3432,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="sda",
function='delete_provisioned_wired_device',
+ op_modifies=True,
params=provision_params,
)
executionid = response.get("executionId")
@@ -3389,6 +3459,7 @@ class DnacDevice(DnacBase):
response = self.dnac._exec(
family="devices",
function='delete_device_by_id',
+ op_modifies=True,
params=delete_params,
)
diff --git a/ansible_collections/cisco/dnac/plugins/modules/inventory_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/inventory_workflow_manager.py
index 3eda0e2cc..17f63f475 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/inventory_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/inventory_workflow_manager.py
@@ -307,8 +307,8 @@ options:
version_added: 6.12.0
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco Catalyst Center documentation for Devices AddDevice2
description: Complete reference of the AddDevice2 API.
@@ -522,7 +522,7 @@ EXAMPLES = r"""
- device_ip: "1.1.1.1"
site_name: "Global/USA/San Francisco/BGL_18/floor_pnp"
resync_retry_count: 200
- resync_interval: 2
+ resync_retry_interval: 2
- device_ip: "2.2.2.2"
site_name: "Global/USA/San Francisco/BGL_18/floor_test"
resync_retry_count: 200
@@ -752,7 +752,7 @@ class Inventory(DnacBase):
'mac_address_list': {'type': 'list', 'elements': 'str'},
'netconf_port': {'type': 'str'},
'password': {'type': 'str'},
- 'serial_number': {'type': 'str'},
+ 'serial_number_list': {'type': 'list', 'elements': 'str'},
'snmp_auth_passphrase': {'type': 'str'},
'snmp_auth_protocol': {'default': "SHA", 'type': 'str'},
'snmp_mode': {'type': 'str'},
@@ -912,6 +912,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_all_user_defined_fields',
+ op_modifies=True,
params={"name": field_name},
)
@@ -942,6 +943,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='create_user_defined_field',
+ op_modifies=True,
params=udf,
)
self.log("Received API response from 'create_user_defined_field': {0}".format(str(response)), "DEBUG")
@@ -984,6 +986,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='add_user_defined_field_to_device',
+ op_modifies=True,
params=udf_param_dict,
)
self.log("Received API response from 'add_user_defined_field_to_device': {0}".format(str(response)), "DEBUG")
@@ -1224,6 +1227,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response', [])
@@ -1358,6 +1362,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')
@@ -1897,6 +1902,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_all_user_defined_fields',
+ op_modifies=True,
params={"name": field_name},
)
self.log("Received API response from 'get_all_user_defined_fields': {0}".format(str(response)), "DEBUG")
@@ -1910,11 +1916,12 @@ class Inventory(DnacBase):
return udf_id
- def mandatory_parameter(self):
+ def mandatory_parameter(self, device_to_add_in_ccc):
"""
Check for and validate mandatory parameters for adding network devices in Cisco Catalyst Center.
Parameters:
self (object): An instance of a class used for interacting with Cisco Cisco Catalyst Center.
+ device_to_add_in_ccc(list): List to device ip addresses to be added in Cisco Catalyst Center.
Returns:
dict: The input `config` dictionary if all mandatory parameters are present.
Description:
@@ -1939,12 +1946,12 @@ class Inventory(DnacBase):
if mandatory_params_absent:
self.status = "failed"
- self.msg = "Required parameters {0} for adding devices are not present".format(str(mandatory_params_absent))
+ self.msg = "Required parameters {0} for adding devices '{1}' are not present".format(str(mandatory_params_absent), str(device_to_add_in_ccc))
self.result['msg'] = self.msg
self.log(self.msg, "ERROR")
else:
self.status = "success"
- self.msg = "Required parameter for Adding the devices in Inventory are present."
+ self.msg = "Required parameters for adding the devices '{0}' to inventory are present.".format(str(device_to_add_in_ccc))
self.log(self.msg, "INFO")
return self
@@ -2044,7 +2051,6 @@ class Inventory(DnacBase):
"httpSecure": params.get("http_secure"),
"httpUserName": params.get("http_username"),
"netconfPort": params.get("netconf_port"),
- "serialNumber": params.get("serial_number"),
"snmpVersion": params.get("snmp_version"),
"type": params.get("type"),
"updateMgmtIPaddressList": params.get("update_mgmt_ipaddresslist"),
@@ -2084,6 +2090,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
@@ -2120,6 +2127,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"hostname": hostname}
)
if response:
@@ -2154,6 +2162,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"serialNumber": serial_number}
)
if response:
@@ -2188,6 +2197,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"macAddress": mac_address}
)
if response:
@@ -2226,6 +2236,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_interface_details',
+ op_modifies=True,
params=interface_detail_params
)
self.log("Received API response from 'get_interface_details': {0}".format(str(response)), "DEBUG")
@@ -2236,47 +2247,47 @@ class Inventory(DnacBase):
interface_id = response["id"]
self.log("""Successfully fetched interface ID ({0}) by using device id {1} and interface name {2}."""
.format(interface_id, device_id, interface_name), "INFO")
- return interface_id
+ return response
except Exception as e:
- error_message = "Error while fetching interface id for interface({0}) from Cisco Catalyst Center: {1}".format(interface_name, str(e))
- self.log(error_message, "ERROR")
- self.msg = error_message
self.status = "failed"
+ self.msg = "Failed to retrieve interface ID for interface({0}) from Cisco Catalyst Center: {1}".format(interface_name, str(e))
+ self.log(self.msg, "ERROR")
return self
- def get_interface_from_ip(self, device_ip):
- """
- Get the interface ID for a device in Cisco Catalyst Center based on its IP address.
- Parameters:
- self (object): An instance of a class used for interacting with Cisco Catalyst Center.
- device_ip (str): The IP address of the device.
- Returns:
- str: The interface ID for the specified device.
- Description:
- The function sends a request to Cisco Catalyst Center to retrieve the interface information
- for the device with the provided IP address and extracts the interface ID from the
- response, and returns the interface ID.
- """
+ def get_interface_from_ip(self, device_ip):
+ """
+ Get the interface ID for a device in Cisco Catalyst Center based on its IP address.
+ Parameters:
+ self (object): An instance of a class used for interacting with Cisco Catalyst Center.
+ device_ip (str): The IP address of the device.
+ Returns:
+ str: The interface ID for the specified device.
+ Description:
+ The function sends a request to Cisco Catalyst Center to retrieve the interface information
+ for the device with the provided IP address and extracts the interface ID from the
+ response, and returns the interface ID.
+ """
- try:
- response = self.dnac._exec(
- family="devices",
- function='get_interface_by_ip',
- params={"ip_address": device_ip}
- )
- self.log("Received API response from 'get_interface_by_ip': {0}".format(str(response)), "DEBUG")
- response = response.get("response")
+ try:
+ response = self.dnac._exec(
+ family="devices",
+ function='get_interface_by_ip',
+ op_modifies=True,
+ params={"ip_address": device_ip}
+ )
+ self.log("Received API response from 'get_interface_by_ip': {0}".format(str(response)), "DEBUG")
+ response = response.get("response")
- if response:
- interface_id = response[0]["id"]
- self.log("Fetch Interface Id for device '{0}' successfully !!".format(device_ip))
- return interface_id
+ if response:
+ interface_id = response[0]["id"]
+ self.log("Successfully retrieved Interface Id '{0}' for device '{1}'.".format(interface_id, device_ip), "DEBUG")
+ return interface_id
- except Exception as e:
- error_message = "Error while fetching Interface Id for device '{0}' from Cisco Catalyst Center: {1}".format(device_ip, str(e))
- self.log(error_message, "ERROR")
- raise Exception(error_message)
+ except Exception as e:
+ error_message = "Error while fetching Interface Id for device '{0}' from Cisco Catalyst Center: {1}".format(device_ip, str(e))
+ self.log(error_message, "ERROR")
+ raise Exception(error_message)
def get_device_response(self, device_ip):
"""
@@ -2295,6 +2306,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')[0]
@@ -2353,6 +2365,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_interface_details',
+ op_modifies=True,
params=interface_detail_params
)
self.log("Received API response from 'get_interface_details': {0}".format(str(response)), "DEBUG")
@@ -2548,12 +2561,23 @@ class Inventory(DnacBase):
"""
# Call the Get interface details by device IP API and fetch the interface Id
+ is_update_occurred = False
+ response_list = []
for device_ip in device_to_update:
interface_params = self.config[0].get('update_interface_details')
interface_names_list = interface_params.get('interface_name')
for interface_name in interface_names_list:
device_id = self.get_device_ids([device_ip])
- interface_id = self.get_interface_from_id_and_name(device_id[0], interface_name)
+ interface_details = self.get_interface_from_id_and_name(device_id[0], interface_name)
+ # Check if interface_details is None or does not contain the 'id' key.
+ if interface_details is None or not interface_details.get('id'):
+ self.status = "failed"
+ self.msg = """Failed to retrieve interface details or the 'id' is missing for the device with identifier
+ '{0}' and interface '{1}'""".format(device_id[0], interface_name)
+ self.log(self.msg, "WARNING")
+ return self
+
+ interface_id = interface_details['id']
self.check_return_status()
# Now we call update interface details api with required parameter
@@ -2567,11 +2591,11 @@ class Inventory(DnacBase):
if response.get('role').upper() != "ACCESS":
self.msg = "The action to clear the MAC Address table is only supported for devices with the ACCESS role."
self.log(self.msg, "WARNING")
- self.result['response'] = self.msg
+ response_list.append(self.msg)
+ self.result['changed'] = False
else:
deploy_mode = interface_params.get('deployment_mode', 'Deploy')
- self.clear_mac_address(interface_id, deploy_mode, interface_name)
- self.check_return_status()
+ self.clear_mac_address(interface_id, deploy_mode, interface_name).check_return_status()
temp_params = {
'description': interface_params.get('description', ''),
@@ -2584,6 +2608,25 @@ class Inventory(DnacBase):
if value is not None:
payload_params[key] = value
+ # Check if interface need update or not here
+ interface_needs_update = False
+ for key, value in payload_params.items():
+ if key == "voiceVlanId":
+ if str(value) != interface_details['voiceVlan']:
+ interface_needs_update = True
+ else:
+ if str(value) != str(interface_details.get(key)):
+ interface_needs_update = True
+
+ if not interface_needs_update:
+ self.status = "success"
+ self.result['changed'] = False
+ self.msg = """Interface details for the given interface '{0}' are already updated in the Cisco Catalyst Center for the
+ device '{1}'.""".format(interface_name, device_ip)
+ self.log(self.msg, "INFO")
+ response_list.append(self.msg)
+ continue
+
update_interface_params = {
'payload': payload_params,
'interface_uuid': interface_id,
@@ -2598,16 +2641,23 @@ class Inventory(DnacBase):
self.log("Received API response from 'update_interface_details': {0}".format(str(response)), "DEBUG")
if response and isinstance(response, dict):
- task_id = response.get('response').get('taskId')
+ response = response.get('response')
+ if not response:
+ self.status = "failed"
+ self.msg = "Failed to update the interface because the 'update_interface_details' API returned an empty response."
+ self.log(self.msg, "ERROR")
+ continue
+
+ task_id = response.get('taskId')
while True:
execution_details = self.get_task_details(task_id)
if 'SUCCESS' in execution_details.get("progress"):
self.status = "success"
- self.result['changed'] = True
- self.result['response'] = execution_details
- self.msg = "Updated Interface Details for device '{0}' successfully".format(device_ip)
+ is_update_occurred = True
+ self.msg = "Successfully updated the Interface Details for device '{0}'.".format(device_ip)
+ response_list.append(self.msg)
self.log(self.msg, "INFO")
break
elif execution_details.get("isError"):
@@ -2627,6 +2677,10 @@ class Inventory(DnacBase):
self.result['changed'] = False
self.msg = "Port actions are only supported on user facing/access ports as it's not allowed or No Updation required"
self.log(self.msg, "INFO")
+ response_list.append(self.msg)
+
+ self.result['changed'] = is_update_occurred
+ self.result['response'] = response_list
return self
@@ -2704,8 +2758,8 @@ class Inventory(DnacBase):
elif execution_details.get("endTime"):
self.status = "success"
self.result['changed'] = True
- self.result['response'] = execution_details
self.msg = "Device '{0}' present in Cisco Catalyst Center and have been updated successfully".format(device_ip)
+ self.result['response'] = self.msg
self.log(self.msg, "INFO")
break
@@ -2730,6 +2784,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')
@@ -2916,7 +2971,8 @@ class Inventory(DnacBase):
device_params.pop('snmpPrivPassphrase', None)
device_params.pop('snmpPrivProtocol', None)
- self.mandatory_parameter().check_return_status()
+ device_to_add_in_ccc = device_params['ipAddress']
+ self.mandatory_parameter(device_to_add_in_ccc).check_return_status()
try:
response = self.dnac._exec(
family="devices",
@@ -2974,6 +3030,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"managementIpAddress": device_ip}
)
response = response.get('response')[0]
@@ -3154,6 +3211,15 @@ class Inventory(DnacBase):
if not playbook_params['snmpROCommunity']:
playbook_params['snmpROCommunity'] = device_data.get('snmp_community', None)
+ if not playbook_params['snmpRWCommunity']:
+ playbook_params['snmpRWCommunity'] = device_data.get('snmp_write_community', None)
+
+ if not playbook_params['httpUserName']:
+ playbook_params['httpUserName'] = device_data.get('http_config_username', None)
+ if not playbook_params['httpPassword']:
+ playbook_params['httpPassword'] = device_data.get('http_config_password', None)
+ if not playbook_params['httpPort']:
+ playbook_params['httpPort'] = device_data.get('http_port', None)
try:
if playbook_params['updateMgmtIPaddressList']:
@@ -3299,6 +3365,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='delete_user_defined_field',
+ op_modifies=True,
params={"id": udf_id},
)
if response and isinstance(response, dict):
@@ -3349,6 +3416,7 @@ class Inventory(DnacBase):
prov_respone = self.dnac._exec(
family="sda",
function='get_provisioned_wired_device',
+ op_modifies=True,
params=provision_params,
)
@@ -3356,6 +3424,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="sda",
function='delete_provisioned_wired_device',
+ op_modifies=True,
params=provision_params,
)
executionid = response.get("executionId")
@@ -3383,6 +3452,7 @@ class Inventory(DnacBase):
response = self.dnac._exec(
family="devices",
function='delete_device_by_id',
+ op_modifies=True,
params=delete_params,
)
diff --git a/ansible_collections/cisco/dnac/plugins/modules/issues_enrichment_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/issues_enrichment_details_info.py
index e81d3f2d9..58d5c787c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/issues_enrichment_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/issues_enrichment_details_info.py
@@ -22,8 +22,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Issues GetIssueEnrichmentDetails
description: Complete reference of the GetIssueEnrichmentDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/issues_info.py b/ansible_collections/cisco/dnac/plugins/modules/issues_info.py
index b94e0f1cf..f6131d2b8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/issues_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/issues_info.py
@@ -58,8 +58,8 @@ options:
- IssueStatus query parameter. The issue's status value (One of ACTIVE, IGNORED, RESOLVED).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Issues Issues
description: Complete reference of the Issues API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/itsm_cmdb_sync_status_info.py b/ansible_collections/cisco/dnac/plugins/modules/itsm_cmdb_sync_status_info.py
index ba5721124..2b3a47ea2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/itsm_cmdb_sync_status_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/itsm_cmdb_sync_status_info.py
@@ -34,8 +34,8 @@ options:
- Date query parameter. Provide date in "YYYY-MM-DD" format.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for ITSM GetCMDBSyncStatus
description: Complete reference of the GetCMDBSyncStatus API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_failed_info.py b/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_failed_info.py
index b02e8dc1d..c2a6dca63 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_failed_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_failed_info.py
@@ -24,8 +24,8 @@ options:
- InstanceId query parameter. Instance Id of the failed event as in the Runtime Dashboard.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for ITSM GetFailedITSMEvents
description: Complete reference of the GetFailedITSMEvents API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_retry.py b/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_retry.py
index 201f6891d..64c97fe80 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_retry.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/itsm_integration_events_retry.py
@@ -24,8 +24,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for ITSM RetryIntegrationEvents
description: Complete reference of the RetryIntegrationEvents API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_count_info.py
index d172a752c..e275eaf2c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for LAN Automation LANAutomationSessionCount
description: Complete reference of the LANAutomationSessionCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_create.py b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_create.py
index e87775b94..b9c04f38d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_create.py
@@ -63,8 +63,8 @@ options:
type: bool
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for LAN Automation LANAutomationStart
description: Complete reference of the LANAutomationStart API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_delete.py b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_delete.py
index d4a8a6651..d31484c67 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_delete.py
@@ -20,8 +20,8 @@ options:
description: Id path parameter. LAN Automation id can be obtained from /dna/intent/api/v1/lan-automation/status.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for LAN Automation LANAutomationStop
description: Complete reference of the LANAutomationStop API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_by_serial_number_info.py b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_by_serial_number_info.py
index c81f24292..fa75bec89 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_by_serial_number_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_by_serial_number_info.py
@@ -37,8 +37,8 @@ options:
the remaining logs, please leave the query parameter blank.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for LAN Automation LANAutomationLogsForIndividualDevices
description: Complete reference of the LANAutomationLogsForIndividualDevices API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_info.py b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_info.py
index ede147df9..6a8aa1291 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_log_info.py
@@ -34,8 +34,8 @@ options:
- Id path parameter. LAN Automation session identifier.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for LAN Automation LANAutomationLog
description: Complete reference of the LANAutomationLog API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_status_info.py b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_status_info.py
index 62ad0a371..3680a97eb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/lan_automation_status_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/lan_automation_status_info.py
@@ -34,8 +34,8 @@ options:
- Id path parameter. LAN Automation session identifier.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for LAN Automation LANAutomationStatus
description: Complete reference of the LANAutomationStatus API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_device_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/license_device_count_info.py
index efee0085a..0ec3976ac 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_device_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_device_count_info.py
@@ -40,8 +40,8 @@ options:
- Smart_account_id query parameter. Smart account id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses DeviceCountDetails2
description: Complete reference of the DeviceCountDetails2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_device_deregistration.py b/ansible_collections/cisco/dnac/plugins/modules/license_device_deregistration.py
index aeceb3470..ddf70df11 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_device_deregistration.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_device_deregistration.py
@@ -21,8 +21,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses DeviceDeregistration2
description: Complete reference of the DeviceDeregistration2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_device_license_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/license_device_license_details_info.py
index 5410196ca..965c577e3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_device_license_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_device_license_details_info.py
@@ -24,8 +24,8 @@ options:
- Device_uuid path parameter. Id of device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses DeviceLicenseDetails2
description: Complete reference of the DeviceLicenseDetails2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_device_license_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/license_device_license_summary_info.py
index ae872d095..c2806d39a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_device_license_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_device_license_summary_info.py
@@ -60,8 +60,8 @@ options:
- Device_uuid query parameter. Id of device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses DeviceLicenseSummary2
description: Complete reference of the DeviceLicenseSummary2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_device_registration.py b/ansible_collections/cisco/dnac/plugins/modules/license_device_registration.py
index 6d7f5b955..de878f790 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_device_registration.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_device_registration.py
@@ -24,8 +24,8 @@ options:
description: Virtual_account_name path parameter. Name of virtual account.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses DeviceRegistration2
description: Complete reference of the DeviceRegistration2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_smart_account_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/license_smart_account_details_info.py
index b70fa56c0..70685c2ed 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_smart_account_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_smart_account_details_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses SmartAccountDetails
description: Complete reference of the SmartAccountDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_term_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/license_term_details_info.py
index bdf26471d..d0bf73d4d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_term_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_term_details_info.py
@@ -34,8 +34,8 @@ options:
- Device_type query parameter. Type of device like router, switch, wireless or ise.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses LicenseTermDetails2
description: Complete reference of the LicenseTermDetails2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_usage_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/license_usage_details_info.py
index d315848c9..3fd4d5466 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_usage_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_usage_details_info.py
@@ -34,8 +34,8 @@ options:
- Device_type query parameter. Type of device like router, switch, wireless or ise.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses LicenseUsageDetails2
description: Complete reference of the LicenseUsageDetails2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_change.py b/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_change.py
index 9e647aefc..762e01540 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_change.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_change.py
@@ -27,8 +27,8 @@ options:
description: Virtual_account_name path parameter. Name of target virtual account.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses ChangeVirtualAccount2
description: Complete reference of the ChangeVirtualAccount2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_details_info.py
index 476f58758..72a2f1041 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/license_virtual_account_details_info.py
@@ -24,8 +24,8 @@ options:
- Smart_account_id path parameter. Id of smart account.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Licenses VirtualAccountDetails2
description: Complete reference of the VirtualAccountDetails2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/netconf_credential.py b/ansible_collections/cisco/dnac/plugins/modules/netconf_credential.py
index a8cec0942..d75908aa6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/netconf_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/netconf_credential.py
@@ -39,8 +39,8 @@ options:
description: Netconf Credential's netconfPort.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateNetconfCredentials
description: Complete reference of the CreateNetconfCredentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_create.py b/ansible_collections/cisco/dnac/plugins/modules/network_create.py
index 9c7abda29..8bf553aba 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_create.py
@@ -134,8 +134,8 @@ options:
the network settings.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings CreateNetwork
description: Complete reference of the CreateNetwork API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device.py b/ansible_collections/cisco/dnac/plugins/modules/network_device.py
index e103dbbf1..2fca16035 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device.py
@@ -117,8 +117,8 @@ options:
description: Network Device's userName.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices AddDevice2
description: Complete reference of the AddDevice2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_by_ip_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_by_ip_info.py
index 151347c57..502db8ba4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_by_ip_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_by_ip_info.py
@@ -24,8 +24,8 @@ options:
- IpAddress path parameter. Device IP address.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetNetworkDeviceByIP
description: Complete reference of the GetNetworkDeviceByIP API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_by_serial_number_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_by_serial_number_info.py
index 4248aee8c..d40497b17 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_by_serial_number_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_by_serial_number_info.py
@@ -24,8 +24,8 @@ options:
- SerialNumber path parameter. Device serial number.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceBySerialNumber
description: Complete reference of the GetDeviceBySerialNumber API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_chassis_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_chassis_details_info.py
index 6d540eae8..c5b34a498 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_chassis_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_chassis_details_info.py
@@ -24,8 +24,8 @@ options:
- DeviceId path parameter. Device ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetChassisDetailsForDevice
description: Complete reference of the GetChassisDetailsForDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_config_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_config_count_info.py
index e2b2a2449..3d2c900b0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_config_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_config_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceConfigCount
description: Complete reference of the GetDeviceConfigCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_config_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_config_info.py
index b2832bb77..6810fd6db 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_config_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_config_info.py
@@ -26,8 +26,8 @@ options:
- NetworkDeviceId path parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceConfigById
description: Complete reference of the GetDeviceConfigById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_count_info.py
index 3a865dacb..cdcf87b7c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_count_info.py
@@ -28,8 +28,8 @@ options:
- DeviceId path parameter. Device ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceCount2
description: Complete reference of the GetDeviceCount2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt.py
index ab60bde8b..38fbc4eaa 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt.py
@@ -25,8 +25,8 @@ options:
description: Username Prompt.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for System Settings CustomPromptPOSTAPI
description: Complete reference of the CustomPromptPOSTAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt_info.py
index 96a9c74bc..cd3d02bdd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_custom_prompt_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for System Settings CustomPromptSupportGETAPI
description: Complete reference of the CustomPromptSupportGETAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_equipment_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_equipment_info.py
index 0e5cd5c64..7bc3a6733 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_equipment_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_equipment_info.py
@@ -30,8 +30,8 @@ options:
If no type is mentioned, All equipments are fetched for the device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices ReturnPowerSupplyFanDetailsForTheGivenDevice
description: Complete reference of the ReturnPowerSupplyFanDetailsForTheGivenDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_export.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_export.py
index 93bb723e6..c1bf8d245 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_export.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_export.py
@@ -34,8 +34,8 @@ options:
description: Network Device Export's password.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices ExportDeviceList
description: Complete reference of the ExportDeviceList API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_functional_capability_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_functional_capability_info.py
index 60d2c04b2..1d88047ab 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_functional_capability_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_functional_capability_info.py
@@ -37,8 +37,8 @@ options:
- Id path parameter. Functional Capability UUID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetFunctionalCapabilityById
description: Complete reference of the GetFunctionalCapabilityById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_global_polling_interval_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_global_polling_interval_info.py
index 4d1df2f6e..41bced4d1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_global_polling_interval_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_global_polling_interval_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetPollingIntervalForAllDevices
description: Complete reference of the GetPollingIntervalForAllDevices API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_info.py
index 49d427c07..7dae65a3f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_info.py
@@ -190,8 +190,8 @@ options:
- Limit query parameter. 1 <= limit <= 500 max. No. Of devices to be returned in the result.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceByID
description: Complete reference of the GetDeviceByID API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_neighbor_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_neighbor_info.py
index 9b34f8a98..da4550a9e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_neighbor_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_neighbor_info.py
@@ -28,8 +28,8 @@ options:
- InterfaceUuid path parameter. Instanceuuid of interface.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetConnectedDeviceDetail
description: Complete reference of the GetConnectedDeviceDetail API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_poe_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_poe_info.py
index 3da01e141..2c525456f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_poe_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_interface_poe_info.py
@@ -31,8 +31,8 @@ options:
- InterfaceNameList query parameter. Comma seperated interface names.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices ReturnsPOEInterfaceDetailsForTheDevice
description: Complete reference of the ReturnsPOEInterfaceDetailsForTheDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_inventory_insight_link_mismatch_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_inventory_insight_link_mismatch_info.py
index 23f7c6c57..ee282e771 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_inventory_insight_link_mismatch_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_inventory_insight_link_mismatch_info.py
@@ -44,8 +44,8 @@ options:
- Order query parameter. Order. Value can be asc or desc. Default value is asc.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices InventoryInsightDeviceLinkMismatchAPI
description: Complete reference of the InventoryInsightDeviceLinkMismatchAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_lexicographically_sorted_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_lexicographically_sorted_info.py
index 04e1ebfce..cd7473692 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_lexicographically_sorted_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_lexicographically_sorted_info.py
@@ -108,8 +108,8 @@ options:
- Limit query parameter.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceValuesThatMatchFullyOrPartiallyAnAttribute
description: Complete reference of the GetDeviceValuesThatMatchFullyOrPartiallyAnAttribute API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_linecard_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_linecard_details_info.py
index a2267a752..6ec120ded 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_linecard_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_linecard_details_info.py
@@ -24,8 +24,8 @@ options:
- DeviceUuid path parameter. Instanceuuid of device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetLinecardDetails
description: Complete reference of the GetLinecardDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_meraki_organization_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_meraki_organization_info.py
index a9bde346e..a8bc1ddeb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_meraki_organization_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_meraki_organization_info.py
@@ -24,8 +24,8 @@ options:
- Id path parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetOrganizationListForMeraki
description: Complete reference of the GetOrganizationListForMeraki API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_module_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_module_count_info.py
index 6bddca67e..5969b346e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_module_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_module_count_info.py
@@ -44,8 +44,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetModuleCount
description: Complete reference of the GetModuleCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_module_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_module_info.py
index d9924fc15..be3bd1a55 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_module_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_module_info.py
@@ -58,8 +58,8 @@ options:
- Id path parameter. Module id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetModuleInfoById
description: Complete reference of the GetModuleInfoById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_poe_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_poe_info.py
index ca99bdd37..4f78d1e70 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_poe_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_poe_info.py
@@ -24,8 +24,8 @@ options:
- DeviceUuid path parameter. Uuid of the device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices POEDetails
description: Complete reference of the POEDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_polling_interval_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_polling_interval_info.py
index 36bfbce02..fc4707d26 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_polling_interval_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_polling_interval_info.py
@@ -24,8 +24,8 @@ options:
- Id path parameter. Device ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetPollingIntervalById
description: Complete reference of the GetPollingIntervalById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_range_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_range_info.py
index 2aa2f9e80..5ea4572f4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_range_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_range_info.py
@@ -30,8 +30,8 @@ options:
- RecordsToReturn path parameter. Number of records to return 1<= recordsToReturn <= 500.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetNetworkDeviceByPaginationRange
description: Complete reference of the GetNetworkDeviceByPaginationRange API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_register_for_wsa_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_register_for_wsa_info.py
index 7997fa15f..29c483aa2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_register_for_wsa_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_register_for_wsa_info.py
@@ -30,8 +30,8 @@ options:
- Macaddress query parameter. Mac addres of the device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDevicesRegisteredForWSANotification
description: Complete reference of the GetDevicesRegisteredForWSANotification API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_stack_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_stack_details_info.py
index 4f8912bc9..5cdaf55ad 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_stack_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_stack_details_info.py
@@ -24,8 +24,8 @@ options:
- DeviceId path parameter. Device ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetStackDetailsForDevice
description: Complete reference of the GetStackDetailsForDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_summary_info.py
index 4aa0c2940..3096ba1cf 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_summary_info.py
@@ -24,8 +24,8 @@ options:
- Id path parameter. Device ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceSummary
description: Complete reference of the GetDeviceSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_supervisor_card_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_supervisor_card_details_info.py
index f4547f295..f9db5bdd7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_supervisor_card_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_supervisor_card_details_info.py
@@ -24,8 +24,8 @@ options:
- DeviceUuid path parameter. Instanceuuid of device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetSupervisorCardDetail
description: Complete reference of the GetSupervisorCardDetail API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_sync.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_sync.py
index 255d81e12..526b8d239 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_sync.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_sync.py
@@ -27,8 +27,8 @@ options:
elements: dict
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices SyncDevices
description: Complete reference of the SyncDevices API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_update_role.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_update_role.py
index 16972e2ee..14ded7ec1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_update_role.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_update_role.py
@@ -26,8 +26,8 @@ options:
description: Network Device Update Role's roleSource.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices UpdateDeviceRole
description: Complete reference of the UpdateDeviceRole API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field.py
index b350e69dd..8d0ddc17e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field.py
@@ -28,8 +28,8 @@ options:
description: Name of UDF.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices CreateUserDefinedField
description: Complete reference of the CreateUserDefinedField API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field_info.py
index d72f5955e..967114272 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_user_defined_field_info.py
@@ -30,8 +30,8 @@ options:
- Name query parameter. Comma-seperated name(s) used for search/filtering.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetAllUserDefinedFields
description: Complete reference of the GetAllUserDefinedFields API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_vlan_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_vlan_info.py
index d236beee3..132c102c7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_vlan_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_vlan_info.py
@@ -28,8 +28,8 @@ options:
- InterfaceType query parameter. Vlan assocaited with sub-interface.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetDeviceInterfaceVLANs
description: Complete reference of the GetDeviceInterfaceVLANs API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_wireless_lan_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_wireless_lan_info.py
index 29615e66d..f08b1bcca 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_wireless_lan_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_wireless_lan_info.py
@@ -24,8 +24,8 @@ options:
- Id path parameter. Device ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetWirelessLanControllerDetailsById
description: Complete reference of the GetWirelessLanControllerDetailsById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_device_with_snmp_v3_des_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_device_with_snmp_v3_des_info.py
index 4fd5157c5..b3b6a55d6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_device_with_snmp_v3_des_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_device_with_snmp_v3_des_info.py
@@ -42,8 +42,8 @@ options:
- Order query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices ReturnsDevicesAddedToCiscoDNACenterWithSnmpV3DES
description: Complete reference of the ReturnsDevicesAddedToCiscoDNACenterWithSnmpV3DES API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_info.py
index 682a9b5b1..0aa99bde5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_info.py
@@ -24,8 +24,8 @@ options:
- SiteId query parameter. Site id to get the network settings associated with the site.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings GetNetwork
description: Complete reference of the GetNetwork API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_settings_intent.py b/ansible_collections/cisco/dnac/plugins/modules/network_settings_intent.py
index 49d6fa5d4..a86d342cf 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_settings_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_settings_intent.py
@@ -318,7 +318,7 @@ options:
type: str
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
network_settings.NetworkSettings.create_global_pool,
@@ -705,6 +705,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": site_name},
)
self.log("Received API response from 'get_site': {0}".format(response), "DEBUG")
@@ -856,6 +857,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function='get_network_v2',
+ op_modifies=True,
params={"site_id": site_id}
)
self.log("Received API response from 'get_network_v2': {0}".format(response), "DEBUG")
@@ -1061,6 +1063,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="get_reserve_ip_subpool",
+ op_modifies=True,
params={"siteId": site_id}
)
if not isinstance(response, dict):
@@ -1748,6 +1751,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="create_global_pool",
+ op_modifies=True,
params=pool_params,
)
self.check_execution_response_status(response).check_return_status()
@@ -1793,6 +1797,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="update_global_pool",
+ op_modifies=True,
params=pool_params,
)
@@ -1836,6 +1841,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="reserve_ip_subpool",
+ op_modifies=True,
params=reserve_params,
)
self.check_execution_response_status(response).check_return_status()
@@ -1868,6 +1874,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="update_reserve_ip_subpool",
+ op_modifies=True,
params=reserve_params,
)
self.check_execution_response_status(response).check_return_status()
@@ -1915,6 +1922,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function='update_network_v2',
+ op_modifies=True,
params=net_params,
)
self.log("Received API response of 'update_network_v2': {0}".format(response), "DEBUG")
@@ -1978,6 +1986,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="release_reserve_ip_subpool",
+ op_modifies=True,
params={"id": _id},
)
self.check_execution_response_status(response).check_return_status()
@@ -2014,6 +2023,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="delete_global_ip_pool",
+ op_modifies=True,
params={"id": self.have.get("globalPool").get("id")},
)
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_settings_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/network_settings_workflow_manager.py
index bbae36463..cdf7b0634 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_settings_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_settings_workflow_manager.py
@@ -318,7 +318,7 @@ options:
type: str
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
network_settings.NetworkSettings.create_global_pool,
@@ -701,6 +701,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": site_name},
)
self.log("Received API response from 'get_site': {0}".format(response), "DEBUG")
@@ -852,6 +853,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function='get_network_v2',
+ op_modifies=True,
params={"site_id": site_id}
)
self.log("Received API response from 'get_network_v2': {0}".format(response), "DEBUG")
@@ -1057,6 +1059,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="get_reserve_ip_subpool",
+ op_modifies=True,
params={"siteId": site_id}
)
if not isinstance(response, dict):
@@ -1733,6 +1736,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="create_global_pool",
+ op_modifies=True,
params=pool_params,
)
self.check_execution_response_status(response).check_return_status()
@@ -1778,6 +1782,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="update_global_pool",
+ op_modifies=True,
params=pool_params,
)
@@ -1821,6 +1826,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="reserve_ip_subpool",
+ op_modifies=True,
params=reserve_params,
)
self.check_execution_response_status(response).check_return_status()
@@ -1853,6 +1859,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="update_reserve_ip_subpool",
+ op_modifies=True,
params=reserve_params,
)
self.check_execution_response_status(response).check_return_status()
@@ -1900,6 +1907,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function='update_network_v2',
+ op_modifies=True,
params=net_params,
)
self.log("Received API response of 'update_network_v2': {0}".format(response), "DEBUG")
@@ -1963,6 +1971,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="release_reserve_ip_subpool",
+ op_modifies=True,
params={"id": _id},
)
self.check_execution_response_status(response).check_return_status()
@@ -1999,6 +2008,7 @@ class NetworkSettings(DnacBase):
response = self.dnac._exec(
family="network_settings",
function="delete_global_ip_pool",
+ op_modifies=True,
params={"id": self.have.get("globalPool").get("id")},
)
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_update.py b/ansible_collections/cisco/dnac/plugins/modules/network_update.py
index be67025b8..42b2eec0f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_update.py
@@ -131,8 +131,8 @@ options:
is associated with the site.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings UpdateNetwork
description: Complete reference of the UpdateNetwork API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_v2.py b/ansible_collections/cisco/dnac/plugins/modules/network_v2.py
index 14ca5c286..faa1b85c9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_v2.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_v2.py
@@ -134,8 +134,8 @@ options:
the network settings.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings CreateNetworkV2
description: Complete reference of the CreateNetworkV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/network_v2_info.py b/ansible_collections/cisco/dnac/plugins/modules/network_v2_info.py
index f3b03cb76..096b27bbd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/network_v2_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/network_v2_info.py
@@ -24,8 +24,8 @@ options:
- SiteId query parameter. Site Id to get the network settings associated with the site.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings GetNetworkV2
description: Complete reference of the GetNetworkV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/nfv_profile.py b/ansible_collections/cisco/dnac/plugins/modules/nfv_profile.py
index 409c937d4..37ce59101 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/nfv_profile.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/nfv_profile.py
@@ -147,8 +147,8 @@ options:
description: Name of the profile to create NFV profile.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design CreateNFVProfile
description: Complete reference of the CreateNFVProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/nfv_profile_info.py b/ansible_collections/cisco/dnac/plugins/modules/nfv_profile_info.py
index 946879359..7deb4f7be 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/nfv_profile_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/nfv_profile_info.py
@@ -36,8 +36,8 @@ options:
- Name query parameter. Name of network profile to be retrieved.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design GetNFVProfile
description: Complete reference of the GetNFVProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/nfv_provision.py b/ansible_collections/cisco/dnac/plugins/modules/nfv_provision.py
index 23f4269f0..e242de7f5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/nfv_provision.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/nfv_provision.py
@@ -375,8 +375,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design ProvisionNFV
description: Complete reference of the ProvisionNFV API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_detail_info.py b/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_detail_info.py
index 8ad7287ad..2a0f85a5a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_detail_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_detail_info.py
@@ -24,8 +24,8 @@ options:
- DeviceIp query parameter. Device to which the provisioning detail has to be retrieved.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design GetDeviceDetailsByIP
description: Complete reference of the GetDeviceDetailsByIP API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_details.py b/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_details.py
index 6f8bc7308..af9792e72 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_details.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/nfv_provision_details.py
@@ -23,8 +23,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design NFVProvisioningDetail
description: Complete reference of the NFVProvisioningDetail API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/path_trace.py b/ansible_collections/cisco/dnac/plugins/modules/path_trace.py
index a2b5519a6..055db2d56 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/path_trace.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/path_trace.py
@@ -49,8 +49,8 @@ options:
description: Source Port.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Path Trace InitiateANewPathtrace
description: Complete reference of the InitiateANewPathtrace API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/path_trace_info.py b/ansible_collections/cisco/dnac/plugins/modules/path_trace_info.py
index a160114ef..d305183c1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/path_trace_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/path_trace_info.py
@@ -86,8 +86,8 @@ options:
- FlowAnalysisId path parameter. Flow analysis request id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Path Trace RetrievesPreviousPathtrace
description: Complete reference of the RetrievesPreviousPathtrace API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/planned_access_points_info.py b/ansible_collections/cisco/dnac/plugins/modules/planned_access_points_info.py
index df323c577..bed5d8656 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/planned_access_points_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/planned_access_points_info.py
@@ -36,8 +36,8 @@ options:
- Radios query parameter. Inlcude planned radio details.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Devices GetPlannedAccessPointsForFloor
description: Complete reference of the GetPlannedAccessPointsForFloor API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/platform_nodes_configuration_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/platform_nodes_configuration_summary_info.py
index 9e4bad79e..d06ecb029 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/platform_nodes_configuration_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/platform_nodes_configuration_summary_info.py
@@ -23,8 +23,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Platform Configuration CiscoDNACenterNodesConfigurationSummary
description: Complete reference of the CiscoDNACenterNodesConfigurationSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/platform_release_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/platform_release_summary_info.py
index 7af697e95..b37caefc0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/platform_release_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/platform_release_summary_info.py
@@ -22,8 +22,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Platform Configuration CiscoDNACenterReleaseSummary
description: Complete reference of the CiscoDNACenterReleaseSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device.py
index 0f6a736a5..a3451edeb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device.py
@@ -823,8 +823,8 @@ options:
type: str
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) AddDevice
description: Complete reference of the AddDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_authorize.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_authorize.py
index c6aa96590..2a033f504 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_authorize.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_authorize.py
@@ -21,8 +21,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for AuthorizeDevice
description: Complete reference of the AuthorizeDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim.py
index 3a6c668f5..4ce1b3389 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim.py
@@ -77,8 +77,8 @@ options:
description: Pnp Device Claim's workflowId.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) ClaimDevice
description: Complete reference of the ClaimDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim_to_site.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim_to_site.py
index 397dc9f95..2e3bdd0a5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim_to_site.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_claim_to_site.py
@@ -80,8 +80,8 @@ options:
description: For Catalyst 9800 WLC.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) ClaimADeviceToASite
description: Complete reference of the ClaimADeviceToASite API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_config_preview.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_config_preview.py
index 7007ba3bb..24d1ae219 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_config_preview.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_config_preview.py
@@ -26,8 +26,8 @@ options:
description: Pnp Device Config Preview's type.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) PreviewConfig
description: Complete reference of the PreviewConfig API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_count_info.py
index 5b98a91e5..94dc35fa2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_count_info.py
@@ -89,8 +89,8 @@ options:
- LastContact query parameter. Device Has Contacted lastContact > 0.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetDeviceCount
description: Complete reference of the GetDeviceCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_history_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_history_info.py
index 662cc694b..781a2f035 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_history_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_history_info.py
@@ -33,8 +33,8 @@ options:
- SortOrder query parameter. Sort Order Ascending (asc) or Descending (des).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetDeviceHistory
description: Complete reference of the GetDeviceHistory API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_import.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_import.py
index 78ff2aada..ed0802a80 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_import.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_import.py
@@ -823,8 +823,8 @@ options:
type: dict
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) ImportDevicesInBulk
description: Complete reference of the ImportDevicesInBulk API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_info.py
index 3f0b11bee..06500ec52 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_info.py
@@ -126,8 +126,8 @@ options:
- Id path parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetDeviceById
description: Complete reference of the GetDeviceById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_reset.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_reset.py
index 97d079c49..df5a7fe15 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_reset.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_reset.py
@@ -59,8 +59,8 @@ options:
description: Pnp Device Reset's workflowId.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) ResetDevice
description: Complete reference of the ResetDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_unclaim.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_unclaim.py
index a1212a688..81ac6a27b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_device_unclaim.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_device_unclaim.py
@@ -21,8 +21,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) UnClaimDevice
description: Complete reference of the UnClaimDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings.py
index fa5ff41b8..b7bd4f09e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings.py
@@ -158,8 +158,8 @@ options:
description: Pnp Global Settings's version.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) UpdatePnPGlobalSettings
description: Complete reference of the UpdatePnPGlobalSettings API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings_info.py
index 9347be595..e9c124ec5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_global_settings_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetPnPGlobalSettings
description: Complete reference of the GetPnPGlobalSettings API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_intent.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_intent.py
index 3c71046a9..15d00b0dc 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_intent.py
@@ -158,7 +158,7 @@ options:
- TYPICAL
requirements:
- dnacentersdk == 2.6.10
- - python >= 3.5
+ - python >= 3.9
notes:
- SDK Method used are device_onboarding_pnp.DeviceOnboardingPnp.add_device,
device_onboarding_pnp.DeviceOnboardingPnp.get_device_list,
@@ -429,6 +429,7 @@ class PnP(DnacBase):
family="sites",
function='get_site',
params={"name": self.want.get("site_name")},
+ op_modifies=True,
)
except Exception:
self.log("Exception occurred as site \
@@ -467,6 +468,7 @@ class PnP(DnacBase):
family="sites",
function='get_site',
params={"name": self.want.get("site_name")},
+ op_modifies=True,
)
except Exception:
self.log("Exception occurred as \
@@ -632,7 +634,7 @@ class PnP(DnacBase):
self.pnp_cred_failure(msg=msg)
claim_params["rfProfile"] = self.validated_config[0]["rf_profile"]
- self.log("Paramters used for claiming are {0}".format(str(claim_params)), "INFO")
+ self.log("Parameters used for claiming are {0}".format(str(claim_params)), "INFO")
return claim_params
def get_reset_params(self):
@@ -698,7 +700,8 @@ class PnP(DnacBase):
device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": self.want.get("serial_number")}
+ params={"serial_number": self.want.get("serial_number")},
+ op_modifies=True,
)
self.log("Device details for the device with serial \
number '{0}': {1}".format(self.want.get("serial_number"), str(device_response)), "DEBUG")
@@ -721,6 +724,7 @@ class PnP(DnacBase):
family="software_image_management_swim",
function='get_software_image_details',
params=self.want.get("image_params"),
+ op_modifies=True,
)
image_list = image_response.get("response")
self.log("Image details obtained from the API 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -730,13 +734,15 @@ class PnP(DnacBase):
family="configuration_templates",
function='gets_the_templates_available',
params={"project_names": self.want.get("project_name")},
+ op_modifies=True,
)
self.log("List of templates under the project '{0}': {1}".format(self.want.get("project_name"), str(template_list)), "DEBUG")
dev_details_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function="get_device_by_id",
- params={"id": device_response[0].get("id")}
+ params={"id": device_response[0].get("id")},
+ op_modifies=True,
)
self.log("Device details retrieved after calling the 'get_device_by_id' API: {0}".format(str(dev_details_response)), "DEBUG")
install_mode = dev_details_response.get("deviceInfo").get("mode")
@@ -899,7 +905,8 @@ class PnP(DnacBase):
multi_device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
self.log("Device details for serial number {0} \
obtained from the API 'get_device_list': {1}".format(device["deviceInfo"]["serialNumber"], str(multi_device_response)), "DEBUG")
@@ -1034,7 +1041,8 @@ class PnP(DnacBase):
dev_details_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function="get_device_by_id",
- params={"id": self.have["device_id"]}
+ params={"id": self.have["device_id"]},
+ op_modifies=True,
)
self.log("Response from 'get_device_by_id' API for device details: {0}".format(str(dev_details_response)), "DEBUG")
@@ -1133,7 +1141,8 @@ class PnP(DnacBase):
multi_device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
self.log("Response from 'get_device_list' API for claiming: {0}".format(str(multi_device_response)), "DEBUG")
if multi_device_response and len(multi_device_response) == 1:
@@ -1190,7 +1199,8 @@ class PnP(DnacBase):
device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
if (device_response and (len(device_response) == 1)):
msg = (
@@ -1230,7 +1240,8 @@ class PnP(DnacBase):
device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
if not (device_response and (len(device_response) == 1)):
msg = (
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_server_profile_update.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_server_profile_update.py
index b6528b96b..ee90a6978 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_server_profile_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_server_profile_update.py
@@ -99,8 +99,8 @@ options:
description: Pnp Server Profile Update's virtualAccountId.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) UpdatePnPServerProfile
description: Complete reference of the UpdatePnPServerProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_smart_account_domains_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_smart_account_domains_info.py
index 6f57ce11d..bc612723a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_smart_account_domains_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_smart_account_domains_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetSmartAccountList
description: Complete reference of the GetSmartAccountList API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_add.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_add.py
index 0f8140822..7a3ceef87 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_add.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_add.py
@@ -100,8 +100,8 @@ options:
description: Pnp Virtual Account Add's virtualAccountId.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) AddVirtualAccount
description: Complete reference of the AddVirtualAccount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_deregister.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_deregister.py
index 8f0d9d432..06af57d3b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_deregister.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_deregister.py
@@ -26,8 +26,8 @@ options:
description: Name query parameter. Virtual Account Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) DeregisterVirtualAccount
description: Complete reference of the DeregisterVirtualAccount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_devices_sync.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_devices_sync.py
index 6a1c0da09..208bd3352 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_devices_sync.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_devices_sync.py
@@ -99,8 +99,8 @@ options:
description: Pnp Virtual Account Devices Sync's virtualAccountId.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) SyncVirtualAccountDevices
description: Complete reference of the SyncVirtualAccountDevices API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_sync_result_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_sync_result_info.py
index e3c37abe0..61a07cb79 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_sync_result_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_account_sync_result_info.py
@@ -28,8 +28,8 @@ options:
- Name path parameter. Virtual Account Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetSyncResultForVirtualAccount
description: Complete reference of the GetSyncResultForVirtualAccount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_accounts_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_accounts_info.py
index 40ed3ac75..635a189d5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_accounts_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_virtual_accounts_info.py
@@ -24,8 +24,8 @@ options:
- Domain path parameter. Smart Account Domain.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetVirtualAccountList
description: Complete reference of the GetVirtualAccountList API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow.py
index 5a5850959..d8658e0ea 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow.py
@@ -128,8 +128,8 @@ options:
description: Pnp Workflow's version.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) AddAWorkflow
description: Complete reference of the AddAWorkflow API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_count_info.py
index 215330a78..3c835c119 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_count_info.py
@@ -25,8 +25,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetWorkflowCount
description: Complete reference of the GetWorkflowCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_info.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_info.py
index 7a00e17bc..d91ea342b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_info.py
@@ -55,8 +55,8 @@ options:
- Id path parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Device Onboarding (PnP) GetWorkflowById
description: Complete reference of the GetWorkflowById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_manager.py
index e1b334f71..909670645 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/pnp_workflow_manager.py
@@ -158,7 +158,7 @@ options:
- TYPICAL
requirements:
- dnacentersdk == 2.6.10
- - python >= 3.5
+ - python >= 3.9
notes:
- SDK Method used are device_onboarding_pnp.DeviceOnboardingPnp.add_device,
device_onboarding_pnp.DeviceOnboardingPnp.get_device_list,
@@ -429,6 +429,7 @@ class PnP(DnacBase):
family="sites",
function='get_site',
params={"name": self.want.get("site_name")},
+ op_modifies=True,
)
except Exception:
self.log("Exception occurred as site \
@@ -467,6 +468,7 @@ class PnP(DnacBase):
family="sites",
function='get_site',
params={"name": self.want.get("site_name")},
+ op_modifies=True,
)
except Exception:
self.log("Exception occurred as \
@@ -632,7 +634,7 @@ class PnP(DnacBase):
self.pnp_cred_failure(msg=msg)
claim_params["rfProfile"] = self.validated_config[0]["rf_profile"]
- self.log("Paramters used for claiming are {0}".format(str(claim_params)), "INFO")
+ self.log("Parameters used for claiming are {0}".format(str(claim_params)), "INFO")
return claim_params
def get_reset_params(self):
@@ -698,7 +700,8 @@ class PnP(DnacBase):
device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": self.want.get("serial_number")}
+ params={"serial_number": self.want.get("serial_number")},
+ op_modifies=True,
)
self.log("Device details for the device with serial \
number '{0}': {1}".format(self.want.get("serial_number"), str(device_response)), "DEBUG")
@@ -721,6 +724,7 @@ class PnP(DnacBase):
family="software_image_management_swim",
function='get_software_image_details',
params=self.want.get("image_params"),
+ op_modifies=True,
)
image_list = image_response.get("response")
self.log("Image details obtained from the API 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -730,13 +734,15 @@ class PnP(DnacBase):
family="configuration_templates",
function='gets_the_templates_available',
params={"project_names": self.want.get("project_name")},
+ op_modifies=True,
)
self.log("List of templates under the project '{0}': {1}".format(self.want.get("project_name"), str(template_list)), "DEBUG")
dev_details_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function="get_device_by_id",
- params={"id": device_response[0].get("id")}
+ params={"id": device_response[0].get("id")},
+ op_modifies=True,
)
self.log("Device details retrieved after calling the 'get_device_by_id' API: {0}".format(str(dev_details_response)), "DEBUG")
install_mode = dev_details_response.get("deviceInfo").get("mode")
@@ -899,7 +905,8 @@ class PnP(DnacBase):
multi_device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
self.log("Device details for serial number {0} \
obtained from the API 'get_device_list': {1}".format(device["deviceInfo"]["serialNumber"], str(multi_device_response)), "DEBUG")
@@ -1034,7 +1041,8 @@ class PnP(DnacBase):
dev_details_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function="get_device_by_id",
- params={"id": self.have["device_id"]}
+ params={"id": self.have["device_id"]},
+ op_modifies=True,
)
self.log("Response from 'get_device_by_id' API for device details: {0}".format(str(dev_details_response)), "DEBUG")
@@ -1133,7 +1141,8 @@ class PnP(DnacBase):
multi_device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
self.log("Response from 'get_device_list' API for claiming: {0}".format(str(multi_device_response)), "DEBUG")
if multi_device_response and len(multi_device_response) == 1:
@@ -1190,7 +1199,8 @@ class PnP(DnacBase):
device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
if (device_response and (len(device_response) == 1)):
msg = (
@@ -1230,7 +1240,8 @@ class PnP(DnacBase):
device_response = self.dnac_apply['exec'](
family="device_onboarding_pnp",
function='get_device_list',
- params={"serial_number": device["deviceInfo"]["serialNumber"]}
+ params={"serial_number": device["deviceInfo"]["serialNumber"]},
+ op_modifies=True,
)
if not (device_response and (len(device_response) == 1)):
msg = (
diff --git a/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_count_info.py
index a3181b3c6..461adba26 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_count_info.py
@@ -29,8 +29,8 @@ options:
- IncludeDeleted query parameter. Flag to indicate whether deleted rules should be part of the records fetched.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
policy.Policy.get_count_of_profiling_rules,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_in_bulk_create.py b/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_in_bulk_create.py
index 8e5b49c2d..ec2bfc306 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_in_bulk_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/profiling_rules_in_bulk_create.py
@@ -121,8 +121,8 @@ options:
type: list
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
policy.Policy.import_profiling_rules_in_bulk,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/projects_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/projects_details_info.py
index 704c881e2..2185060fd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/projects_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/projects_details_info.py
@@ -40,8 +40,8 @@ options:
- SortOrder query parameter. Sort Order Ascending (asc) or Descending (dsc).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates GetProjectsDetails
description: Complete reference of the GetProjectsDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/provision_intent.py b/ansible_collections/cisco/dnac/plugins/modules/provision_intent.py
index 4a3c8a228..1c19ed0c7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/provision_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/provision_intent.py
@@ -74,7 +74,7 @@ options:
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Methods used are
sites.Sites.get_site,
@@ -246,7 +246,8 @@ class Dnacprovision(DnacBase):
dev_response = self.dnac_apply['exec'](
family="devices",
function='get_network_device_by_ip',
- params={"ip_address": self.validated_config[0]["management_ip_address"]}
+ params={"ip_address": self.validated_config[0]["management_ip_address"]},
+ op_modifies=True
)
dev_dict = dev_response.get("response")
@@ -282,6 +283,7 @@ class Dnacprovision(DnacBase):
family="task",
function='get_task_by_id',
params=params,
+ op_modifies=True
)
response = response.response
if response.get('isError') or re.search(
@@ -321,6 +323,7 @@ class Dnacprovision(DnacBase):
family="sites",
function='get_site',
params={"name": site_name},
+ op_modifies=True
)
except Exception:
self.module.fail_json(msg="Site not found", response=[])
@@ -403,7 +406,8 @@ class Dnacprovision(DnacBase):
response = self.dnac_apply['exec'](
family="devices",
function='get_network_device_by_ip',
- params={"management_ip_address": self.validated_config[0]["management_ip_address"]}
+ params={"management_ip_address": self.validated_config[0]["management_ip_address"]},
+ op_modifies=True
)
wireless_params[0]["deviceName"] = response.get("response")[0].get("hostname")
diff --git a/ansible_collections/cisco/dnac/plugins/modules/provision_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/provision_workflow_manager.py
index 27ae58141..cd99f3de6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/provision_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/provision_workflow_manager.py
@@ -75,7 +75,7 @@ options:
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Methods used are
sites.Sites.get_site,
@@ -251,7 +251,8 @@ class Provision(DnacBase):
dev_response = self.dnac_apply['exec'](
family="devices",
function='get_network_device_by_ip',
- params={"ip_address": self.validated_config[0]["management_ip_address"]}
+ params={"ip_address": self.validated_config[0]["management_ip_address"]},
+ op_modifies=True
)
self.log("The device response from 'get_network_device_by_ip' API is {0}".format(str(dev_response)), "DEBUG")
@@ -289,6 +290,7 @@ class Provision(DnacBase):
family="task",
function='get_task_by_id',
params=params,
+ op_modifies=True
)
self.log("Response collected from 'get_task_by_id' API is {0}".format(str(response)), "DEBUG")
response = response.response
@@ -330,6 +332,7 @@ class Provision(DnacBase):
family="sites",
function='get_site',
params={"name": site_name_hierarchy},
+ op_modifies=True
)
except Exception:
self.log("Exception occurred as \
@@ -418,7 +421,8 @@ class Provision(DnacBase):
response = self.dnac_apply['exec'](
family="devices",
function='get_network_device_by_ip',
- params={"management_ip_address": self.validated_config[0]["management_ip_address"]}
+ params={"management_ip_address": self.validated_config[0]["management_ip_address"]},
+ op_modifies=True
)
self.log("Response collected from 'get_network_device_by_ip' is:{0}".format(str(response)), "DEBUG")
@@ -475,17 +479,14 @@ class Provision(DnacBase):
device_type = self.want.get("device_type")
if device_type == "wired":
- try:
- status_response = self.dnac_apply['exec'](
- family="sda",
- function="get_provisioned_wired_device",
- op_modifies=True,
- params={
- "device_management_ip_address": self.validated_config[0]["management_ip_address"]
- },
- )
- except Exception:
- status_response = {}
+ status_response = self.dnac_apply['exec'](
+ family="sda",
+ function="get_provisioned_wired_device",
+ op_modifies=True,
+ params={
+ "device_management_ip_address": self.validated_config[0]["management_ip_address"]
+ },
+ )
self.log("Wired device's status Response collected from 'get_provisioned_wired_device' API is:{0}".format(str(status_response)), "DEBUG")
status = status_response.get("status")
self.log("The provisioned status of the wired device is {0}".format(status), "INFO")
diff --git a/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface.py b/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface.py
index 2c7881cb7..e9b67c760 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface.py
@@ -70,8 +70,8 @@ options:
type: list
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy CreateQosDeviceInterfaceInfo
description: Complete reference of the CreateQosDeviceInterfaceInfo API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info.py b/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info.py
index 98f070c58..ad7bb2bbe 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info.py
@@ -24,8 +24,8 @@ options:
- NetworkDeviceId query parameter. Network device id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetQosDeviceInterfaceInfo
description: Complete reference of the GetQosDeviceInterfaceInfo API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info_count_info.py
index fd872ab6e..f77c2ce31 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/qos_device_interface_info_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Application Policy GetQosDeviceInterfaceInfoCount
description: Complete reference of the GetQosDeviceInterfaceInfoCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reports.py b/ansible_collections/cisco/dnac/plugins/modules/reports.py
index 039746e73..3e7eab25c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reports.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reports.py
@@ -103,8 +103,8 @@ options:
description: Version of viewgroup for the report.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Reports CreateOrScheduleAReport
description: Complete reference of the CreateOrScheduleAReport API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reports_executions_info.py b/ansible_collections/cisco/dnac/plugins/modules/reports_executions_info.py
index 2002682db..f12cd7caa 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reports_executions_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reports_executions_info.py
@@ -44,8 +44,8 @@ options:
- The filename used to save the download file.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Reports DownloadReportContent
description: Complete reference of the DownloadReportContent API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reports_info.py b/ansible_collections/cisco/dnac/plugins/modules/reports_info.py
index 963b6bb16..aed7e10df 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reports_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reports_info.py
@@ -34,8 +34,8 @@ options:
- ReportId path parameter. ReportId of report.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Reports GetAScheduledReport
description: Complete reference of the GetAScheduledReport API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_info.py b/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_info.py
index 71fd405a9..76b131718 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_info.py
@@ -28,8 +28,8 @@ options:
- ViewGroupId path parameter. ViewGroupId of viewgroup.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Reports GetAllViewGroups
description: Complete reference of the GetAllViewGroups API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_view_info.py b/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_view_info.py
index 791e4a0d6..11889bac9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_view_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reports_view_group_view_info.py
@@ -30,8 +30,8 @@ options:
- ViewId path parameter. View id of view.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Reports GetViewDetailsForAGivenViewGroup_View
description: Complete reference of the GetViewDetailsForAGivenViewGroup_View API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool.py b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool.py
index 8d0d75295..507b0e078 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool.py
@@ -94,8 +94,8 @@ options:
description: Type of the reserve ip sub pool.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings ReserveIPSubpool
description: Complete reference of the ReserveIPSubpool API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_create.py b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_create.py
index ad78c5f91..699e7c96c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_create.py
@@ -88,8 +88,8 @@ options:
description: Type of the reserve ip sub pool.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings ReserveIPSubpool
description: Complete reference of the ReserveIPSubpool API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_delete.py b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_delete.py
index d4471c2a9..65ecd4733 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_delete.py
@@ -20,8 +20,8 @@ options:
description: Id path parameter. Id of reserve ip subpool to be deleted.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings ReleaseReserveIPSubpool
description: Complete reference of the ReleaseReserveIPSubpool API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_info.py b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_info.py
index ab1a52955..ec3c76d16 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_info.py
@@ -32,8 +32,8 @@ options:
- Limit query parameter. No of Global Pools to be retrieved.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings GetReserveIPSubpool
description: Complete reference of the GetReserveIPSubpool API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_update.py b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_update.py
index 3e960395f..4bf71c42c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/reserve_ip_subpool_update.py
@@ -72,8 +72,8 @@ options:
description: Slaac Support.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings UpdateReserveIPSubpool
description: Complete reference of the UpdateReserveIPSubpool API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/role_permissions_info.py b/ansible_collections/cisco/dnac/plugins/modules/role_permissions_info.py
index 3f520a697..51957ed06 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/role_permissions_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/role_permissions_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for User and Roles GetPermissionsAPI
description: Complete reference of the GetPermissionsAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/roles_info.py b/ansible_collections/cisco/dnac/plugins/modules/roles_info.py
index 3e719be1a..a8ce30ddf 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/roles_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/roles_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for User and Roles GetRolesAPI
description: Complete reference of the GetRolesAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_count_info.py
index a80b1d359..d942591c1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_count_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
sda.Sda.get_sda_fabric_count,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_device_info.py
index db40c572b..22029fe55 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_device_info.py
@@ -24,8 +24,8 @@ options:
- DeviceManagementIpAddress query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetDeviceInfoFromSDAFabric
description: Complete reference of the GetDeviceInfoFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_device_role_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_device_role_info.py
index 2a857d803..b06a698a1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_device_role_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_device_role_info.py
@@ -24,8 +24,8 @@ options:
- DeviceManagementIpAddress query parameter. Device Management IP Address.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetDeviceRoleInSDAFabric
description: Complete reference of the GetDeviceRoleInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric.py
index 158e6f1e6..f068b0e1e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric.py
@@ -21,8 +21,8 @@ options:
description: FabricName query parameter. Fabric Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
sda.Sda.add_fabric,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile.py
index 51b32887b..925e28fa1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile.py
@@ -34,8 +34,8 @@ options:
description: SiteNameHierarchy query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddDefaultAuthenticationTemplateInSDAFabric
description: Complete reference of the AddDefaultAuthenticationTemplateInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile_info.py
index 7d810bb81..619af5f01 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_authentication_profile_info.py
@@ -29,8 +29,8 @@ options:
- AuthenticateTemplateName query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetDefaultAuthenticationProfileFromSDAFabric
description: Complete reference of the GetDefaultAuthenticationProfileFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device.py
index 960e9d7cd..e2441daf8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device.py
@@ -125,8 +125,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddBorderDeviceInSDAFabric
description: Complete reference of the AddBorderDeviceInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device_info.py
index 329040201..c4318cd73 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_border_device_info.py
@@ -25,8 +25,8 @@ options:
- DeviceManagementIpAddress query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetBorderDeviceDetailFromSDAFabric
description: Complete reference of the GetBorderDeviceDetailFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device.py
index 2f7189b35..ff3ecf449 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device.py
@@ -31,8 +31,8 @@ options:
type: str
version_added: 4.0.0
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddControlPlaneDeviceInSDAFabric
description: Complete reference of the AddControlPlaneDeviceInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device_info.py
index 837a4d543..9267a7014 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_control_plane_device_info.py
@@ -25,8 +25,8 @@ options:
- DeviceManagementIpAddress query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetControlPlaneDeviceFromSDAFabric
description: Complete reference of the GetControlPlaneDeviceFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device.py
index 800ca6d3c..9bcde0422 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device.py
@@ -26,8 +26,8 @@ options:
type: str
version_added: 4.0.0
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddEdgeDeviceInSDAFabric
description: Complete reference of the AddEdgeDeviceInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device_info.py
index 7d94ac466..a4f6eecc2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_edge_device_info.py
@@ -24,8 +24,8 @@ options:
- DeviceManagementIpAddress query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetEdgeDeviceFromSDAFabric
description: Complete reference of the GetEdgeDeviceFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_info.py
index c0e49de7d..c44290025 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_info.py
@@ -24,8 +24,8 @@ options:
- FabricName query parameter. Fabric Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
sda.Sda.get_sda_fabric_info,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site.py
index 2b7e6f8d4..eed71ad48 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site.py
@@ -31,8 +31,8 @@ options:
description: SiteNameHierarchy query parameter. Site Name Hierarchy.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddSiteInSDAFabric
description: Complete reference of the AddSiteInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site_info.py
index c0c115828..bd2e8c177 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_fabric_site_info.py
@@ -24,8 +24,8 @@ options:
- SiteNameHierarchy query parameter. Site Name Hierarchy.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetSiteFromSDAFabric
description: Complete reference of the GetSiteFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_multicast.py b/ansible_collections/cisco/dnac/plugins/modules/sda_multicast.py
index 4ee828f02..6e1045c5d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_multicast.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_multicast.py
@@ -56,8 +56,8 @@ options:
description: Full path of sda Fabric Site.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddMulticastInSDAFabric
description: Complete reference of the AddMulticastInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_multicast_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_multicast_info.py
index 959c9ed2f..2f4ae1218 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_multicast_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_multicast_info.py
@@ -24,8 +24,8 @@ options:
- SiteNameHierarchy query parameter. Fabric site name hierarchy.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetMulticastDetailsFromSDAFabric
description: Complete reference of the GetMulticastDetailsFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point.py b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point.py
index 39b7df6e5..c8280407d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point.py
@@ -41,8 +41,8 @@ options:
type: str
version_added: 4.0.0
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddPortAssignmentForAccessPointInSDAFabric
description: Complete reference of the AddPortAssignmentForAccessPointInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point_info.py
index 45dc1ea39..3cdb7cd3a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_access_point_info.py
@@ -29,8 +29,8 @@ options:
- InterfaceName query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetPortAssignmentForAccessPointInSDAFabric
description: Complete reference of the GetPortAssignmentForAccessPointInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device.py b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device.py
index 15c389ce6..58664b8e2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device.py
@@ -54,8 +54,8 @@ options:
type: str
version_added: 4.0.0
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddPortAssignmentForUserDeviceInSDAFabric
description: Complete reference of the AddPortAssignmentForUserDeviceInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device_info.py
index e62e9ae3c..2fdbee046 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_port_assignment_for_user_device_info.py
@@ -28,8 +28,8 @@ options:
- InterfaceName query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetPortAssignmentForUserDeviceInSDAFabric
description: Complete reference of the GetPortAssignmentForUserDeviceInSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device.py b/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device.py
index 97c12fae0..5940634b8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device.py
@@ -26,8 +26,8 @@ options:
description: SiteNameHierarchy of the provisioned device.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA ProvisionWiredDevice
description: Complete reference of the ProvisionWiredDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device_info.py
index a57d73303..ae78549ec 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_provision_device_info.py
@@ -24,8 +24,8 @@ options:
- DeviceManagementIpAddress query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetProvisionedWiredDevice
description: Complete reference of the GetProvisionedWiredDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network.py b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network.py
index 5231d8b95..09d01e5ed 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network.py
@@ -24,8 +24,8 @@ options:
description: VirtualNetworkName query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddVNInFabric
description: Complete reference of the AddVNInFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_info.py
index 073937177..560c9179f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_info.py
@@ -28,8 +28,8 @@ options:
- SiteNameHierarchy query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetVNFromSDAFabric
description: Complete reference of the GetVNFromSDAFabric API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool.py b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool.py
index c0242821c..71bdf744f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool.py
@@ -83,8 +83,8 @@ options:
type: str
version_added: 4.0.0
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddIPPoolInSDAVirtualNetwork
description: Complete reference of the AddIPPoolInSDAVirtualNetwork API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool_info.py
index 205199cf5..35de542c6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_ip_pool_info.py
@@ -34,8 +34,8 @@ options:
- IpPoolName query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetIPPoolFromSDAVirtualNetwork
description: Complete reference of the GetIPPoolFromSDAVirtualNetwork API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2.py b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2.py
index 37e862ae5..27bffd8d9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2.py
@@ -32,8 +32,8 @@ options:
description: Virtual Network Name to be assigned at global level.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA AddVirtualNetworkWithScalableGroups
description: Complete reference of the AddVirtualNetworkWithScalableGroups API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2_info.py b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2_info.py
index b1b408c08..fc73454d1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sda_virtual_network_v2_info.py
@@ -24,8 +24,8 @@ options:
- VirtualNetworkName query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for SDA GetVirtualNetworkWithScalableGroups
description: Complete reference of the GetVirtualNetworkWithScalableGroups API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_devices_info.py b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_devices_info.py
index 0a0bf0c90..977fe48cd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_devices_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_devices_info.py
@@ -24,8 +24,8 @@ options:
- AdvisoryId path parameter. Advisory ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Security Advisories GetDevicesPerAdvisory
description: Complete reference of the GetDevicesPerAdvisory API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_ids_per_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_ids_per_device_info.py
index 8bf7638d9..47f2db396 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_ids_per_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_ids_per_device_info.py
@@ -24,8 +24,8 @@ options:
- DeviceId path parameter. Device instance UUID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Security Advisories GetAdvisoryIDsPerDevice
description: Complete reference of the GetAdvisoryIDsPerDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_info.py b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_info.py
index b0b551cd9..a2d860316 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Security Advisories GetAdvisoriesList
description: Complete reference of the GetAdvisoriesList API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_per_device_info.py b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_per_device_info.py
index 54735ee13..486bb4654 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_per_device_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_per_device_info.py
@@ -24,8 +24,8 @@ options:
- DeviceId path parameter. Device instance UUID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Security Advisories GetAdvisoriesPerDevice
description: Complete reference of the GetAdvisoriesPerDevice API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_summary_info.py
index 4709ca6b9..88440aceb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/security_advisories_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/security_advisories_summary_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Security Advisories GetAdvisoriesSummary
description: Complete reference of the GetAdvisoriesSummary API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sensor.py b/ansible_collections/cisco/dnac/plugins/modules/sensor.py
index 4ac0fc8bd..c98887c45 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sensor.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sensor.py
@@ -87,8 +87,8 @@ options:
description: TemplateName query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sensors CreateSensorTestTemplate
description: Complete reference of the CreateSensorTestTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sensor_info.py b/ansible_collections/cisco/dnac/plugins/modules/sensor_info.py
index 20bbeae04..2955ceac1 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sensor_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sensor_info.py
@@ -24,8 +24,8 @@ options:
- SiteId query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sensors Sensors
description: Complete reference of the Sensors API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sensor_test_run.py b/ansible_collections/cisco/dnac/plugins/modules/sensor_test_run.py
index ac13177e0..cb800c968 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sensor_test_run.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sensor_test_run.py
@@ -20,8 +20,8 @@ options:
description: Template Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sensors RunNowSensorTest
description: Complete reference of the RunNowSensorTest API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_duplicate.py b/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_duplicate.py
index 513178c5e..85cad96d2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_duplicate.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_duplicate.py
@@ -23,8 +23,8 @@ options:
description: Template Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sensors DuplicateSensorTestTemplate
description: Complete reference of the DuplicateSensorTestTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_edit.py b/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_edit.py
index aa993bd10..b8bf3f3b4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_edit.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sensor_test_template_edit.py
@@ -83,8 +83,8 @@ options:
description: Template Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sensors EditSensorTestTemplate
description: Complete reference of the EditSensorTestTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/service_provider_create.py b/ansible_collections/cisco/dnac/plugins/modules/service_provider_create.py
index 44ef4888b..2ce62b664 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/service_provider_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/service_provider_create.py
@@ -35,8 +35,8 @@ options:
type: list
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings CreateSPProfile
description: Complete reference of the CreateSPProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/service_provider_info.py b/ansible_collections/cisco/dnac/plugins/modules/service_provider_info.py
index 6444f7978..d2bc282f3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/service_provider_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/service_provider_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings GetServiceProviderDetails
description: Complete reference of the GetServiceProviderDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/service_provider_profile_delete.py b/ansible_collections/cisco/dnac/plugins/modules/service_provider_profile_delete.py
index ec7330c64..0d076885e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/service_provider_profile_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/service_provider_profile_delete.py
@@ -20,8 +20,8 @@ options:
description: SpProfileName path parameter. Sp profile name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings DeleteSPProfile
description: Complete reference of the DeleteSPProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/service_provider_update.py b/ansible_collections/cisco/dnac/plugins/modules/service_provider_update.py
index f3c9a6d35..3ec3fcde9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/service_provider_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/service_provider_update.py
@@ -38,8 +38,8 @@ options:
type: list
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings UpdateSPProfile
description: Complete reference of the UpdateSPProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2.py b/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2.py
index 3a804288f..5dcf4f367 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2.py
@@ -36,8 +36,8 @@ options:
type: list
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings CreateSPProfileV2
description: Complete reference of the CreateSPProfileV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2_info.py b/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2_info.py
index 50635cc29..2641b9bdb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/service_provider_v2_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings GetServiceProviderDetailsV2
description: Complete reference of the GetServiceProviderDetailsV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_assign_credential.py b/ansible_collections/cisco/dnac/plugins/modules/site_assign_credential.py
index 5cbb53684..b21a5ca77 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_assign_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_assign_credential.py
@@ -41,8 +41,8 @@ options:
description: Snmp V3 Id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings AssignDeviceCredentialToSite
description: Complete reference of the AssignDeviceCredentialToSite API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_assign_device.py b/ansible_collections/cisco/dnac/plugins/modules/site_assign_device.py
index d0bdd2268..1c080cba4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_assign_device.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_assign_device.py
@@ -28,8 +28,8 @@ options:
description: SiteId path parameter. Site id to which site the device to assign.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
sites.Sites.assign_device_to_site,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/site_count_info.py
index 85b57d946..c4a5dbd96 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_count_info.py
@@ -24,8 +24,8 @@ options:
- SiteId query parameter. Site id to retrieve site count.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sites GetSiteCount
description: Complete reference of the GetSiteCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_create.py b/ansible_collections/cisco/dnac/plugins/modules/site_create.py
index 31f357aea..6b690ac25 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_create.py
@@ -84,8 +84,8 @@ options:
description: Type of site to create (eg area, building, floor).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sites CreateSite
description: Complete reference of the CreateSite API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_delete.py b/ansible_collections/cisco/dnac/plugins/modules/site_delete.py
index d36690ef4..6c52cc343 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_delete.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_delete.py
@@ -20,8 +20,8 @@ options:
description: SiteId path parameter. Site id to which site details to be deleted.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sites DeleteSite
description: Complete reference of the DeleteSite API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap.py b/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap.py
index a5f868383..0948930f3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap.py
@@ -24,8 +24,8 @@ options:
description: Site Design Floormap's payload
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
site_design.SiteDesign.create_floormap,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap_info.py b/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap_info.py
index ee1fa87bf..c427e42bb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_design_floormap_info.py
@@ -26,8 +26,8 @@ options:
- FloorId path parameter. Group Id of the specified floormap.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
site_design.SiteDesign.get_floormap,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_health_info.py b/ansible_collections/cisco/dnac/plugins/modules/site_health_info.py
index 9614b6eb8..cbb91dcd6 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_health_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_health_info.py
@@ -36,8 +36,8 @@ options:
- Limit query parameter. The max number of sites in the returned data set. Default is 25, and max at 50.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sites GetSiteHealth
description: Complete reference of the GetSiteHealth API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_info.py b/ansible_collections/cisco/dnac/plugins/modules/site_info.py
index 49bdf393c..be914d2e2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_info.py
@@ -40,8 +40,8 @@ options:
- Limit query parameter. Number of sites to be retrieved. The default value is 500.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sites GetSite
description: Complete reference of the GetSite API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_intent.py b/ansible_collections/cisco/dnac/plugins/modules/site_intent.py
index 751d520be..39d708730 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_intent.py
@@ -120,7 +120,7 @@ options:
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
sites.Sites.create_site,
@@ -489,6 +489,7 @@ class DnacSite(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": self.want.get("site_name")},
)
@@ -807,12 +808,18 @@ class DnacSite(DnacBase):
else:
# Creating New Site
site_params = self.want.get("site_params")
- if site_params['site']['building']:
- building_details = {}
- for key, value in site_params['site']['building'].items():
- if value is not None:
- building_details[key] = value
- site_params['site']['building'] = building_details
+ try:
+ if site_params['site']['building']:
+ building_details = {}
+ for key, value in site_params['site']['building'].items():
+ if value is not None:
+ building_details[key] = value
+ site_params['site']['building'] = building_details
+ except Exception as e:
+ site_type = site_params['type']
+ site_name = site_params['site'][site_type]['name']
+ self.log("""The site '{0}' is not categorized as a building; hence, there is no need to filter out 'None'
+ values from the 'site_params' dictionary.""".format(site_name), "INFO")
response = self.dnac._exec(
family="sites",
@@ -877,6 +884,7 @@ class DnacSite(DnacBase):
response = self.dnac._exec(
family="sites",
function="delete_site",
+ op_modifies=True,
params={"site_id": site_id},
)
@@ -941,6 +949,7 @@ class DnacSite(DnacBase):
mem_response = self.dnac._exec(
family="sites",
function="get_membership",
+ op_modifies=True,
params={"site_id": site_id},
)
site_response = mem_response.get("site").get("response")
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_membership_info.py b/ansible_collections/cisco/dnac/plugins/modules/site_membership_info.py
index d38f3844e..bc28ba3f3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_membership_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_membership_info.py
@@ -40,8 +40,8 @@ options:
- SerialNumber query parameter. Device serial number.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sites GetMembership
description: Complete reference of the GetMembership API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_update.py b/ansible_collections/cisco/dnac/plugins/modules/site_update.py
index 4a97a6ede..86c54a60b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_update.py
@@ -78,8 +78,8 @@ options:
description: Type.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Sites UpdateSite
description: Complete reference of the UpdateSite API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/site_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/site_workflow_manager.py
index 1ae28afd8..81c6a974e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/site_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/site_workflow_manager.py
@@ -120,7 +120,7 @@ options:
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
sites.Sites.create_site,
@@ -488,6 +488,7 @@ class Site(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": self.want.get("site_name")},
)
@@ -806,12 +807,18 @@ class Site(DnacBase):
else:
# Creating New Site
site_params = self.want.get("site_params")
- if site_params['site']['building']:
- building_details = {}
- for key, value in site_params['site']['building'].items():
- if value is not None:
- building_details[key] = value
- site_params['site']['building'] = building_details
+ try:
+ if site_params['site']['building']:
+ building_details = {}
+ for key, value in site_params['site']['building'].items():
+ if value is not None:
+ building_details[key] = value
+ site_params['site']['building'] = building_details
+ except Exception as e:
+ site_type = site_params['type']
+ site_name = site_params['site'][site_type]['name']
+ self.log("""The site '{0}' is not categorized as a building; hence, there is no need to filter out 'None'
+ values from the 'site_params' dictionary.""".format(site_name), "INFO")
response = self.dnac._exec(
family="sites",
@@ -876,6 +883,7 @@ class Site(DnacBase):
response = self.dnac._exec(
family="sites",
function="delete_site",
+ op_modifies=True,
params={"site_id": site_id},
)
@@ -940,6 +948,7 @@ class Site(DnacBase):
mem_response = self.dnac._exec(
family="sites",
function="get_membership",
+ op_modifies=True,
params={"site_id": site_id},
)
site_response = mem_response.get("site").get("response")
diff --git a/ansible_collections/cisco/dnac/plugins/modules/snmp_properties.py b/ansible_collections/cisco/dnac/plugins/modules/snmp_properties.py
index 0ea733b2a..9cbcae16c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/snmp_properties.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/snmp_properties.py
@@ -37,8 +37,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateUpdateSNMPProperties
description: Complete reference of the CreateUpdateSNMPProperties API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/snmp_properties_info.py b/ansible_collections/cisco/dnac/plugins/modules/snmp_properties_info.py
index 9300eaa86..4f32fd28d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/snmp_properties_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/snmp_properties_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery GetSNMPProperties
description: Complete reference of the GetSNMPProperties API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/snmpv2_read_community_credential.py b/ansible_collections/cisco/dnac/plugins/modules/snmpv2_read_community_credential.py
index 69da389ea..0fd5ce8cb 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/snmpv2_read_community_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/snmpv2_read_community_credential.py
@@ -33,8 +33,8 @@ options:
description: SNMP read community. NO!$DATA!$ for no value change.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateSNMPReadCommunity
description: Complete reference of the CreateSNMPReadCommunity API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/snmpv2_write_community_credential.py b/ansible_collections/cisco/dnac/plugins/modules/snmpv2_write_community_credential.py
index 2fbfbbc66..00caf3e5b 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/snmpv2_write_community_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/snmpv2_write_community_credential.py
@@ -33,8 +33,8 @@ options:
description: SNMP write community. NO!$DATA!$ for no value change.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateSNMPWriteCommunity
description: Complete reference of the CreateSNMPWriteCommunity API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/snmpv3_credential.py b/ansible_collections/cisco/dnac/plugins/modules/snmpv3_credential.py
index d48c693d5..705d9e507 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/snmpv3_credential.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/snmpv3_credential.py
@@ -54,8 +54,8 @@ options:
description: Snmpv3 Credential's username.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Discovery CreateSNMPv3Credentials
description: Complete reference of the CreateSNMPv3Credentials API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/sp_profile_delete_v2.py b/ansible_collections/cisco/dnac/plugins/modules/sp_profile_delete_v2.py
index 1022d4de4..236a0ba49 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/sp_profile_delete_v2.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/sp_profile_delete_v2.py
@@ -20,8 +20,8 @@ options:
description: SpProfileName path parameter. Sp profile name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Network Settings DeleteSPProfileV2
description: Complete reference of the DeleteSPProfileV2 API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/swim_image_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/swim_image_details_info.py
index b9ed467ed..d41519382 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/swim_image_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/swim_image_details_info.py
@@ -92,8 +92,8 @@ options:
- Offset query parameter.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) GetSoftwareImageDetails
description: Complete reference of the GetSoftwareImageDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/swim_import_local.py b/ansible_collections/cisco/dnac/plugins/modules/swim_import_local.py
index 6ea0d9b9c..27966b4cd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/swim_import_local.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/swim_import_local.py
@@ -35,8 +35,8 @@ options:
description: ThirdPartyVendor query parameter. Third Party Vendor.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) ImportLocalSoftwareImage
description: Complete reference of the ImportLocalSoftwareImage API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/swim_import_via_url.py b/ansible_collections/cisco/dnac/plugins/modules/swim_import_via_url.py
index 3f86cc047..df217a30c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/swim_import_via_url.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/swim_import_via_url.py
@@ -49,8 +49,8 @@ options:
description: ScheduleOrigin query parameter. Originator of this call (Optional).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) ImportSoftwareImageViaURL
description: Complete reference of the ImportSoftwareImageViaURL API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/swim_intent.py b/ansible_collections/cisco/dnac/plugins/modules/swim_intent.py
index 08f78ac30..f1eadb5b4 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/swim_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/swim_intent.py
@@ -309,7 +309,7 @@ options:
type: bool
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
software_image_management_swim.SoftwareImageManagementSwim.import_software_image_via_url,
@@ -583,6 +583,7 @@ class DnacSwims(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": site_name},
)
except Exception as e:
@@ -617,6 +618,7 @@ class DnacSwims(DnacBase):
image_response = self.dnac._exec(
family="software_image_management_swim",
function='get_software_image_details',
+ op_modifies=True,
params={"image_name": name},
)
self.log("Received API response from 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -651,6 +653,7 @@ class DnacSwims(DnacBase):
image_response = self.dnac._exec(
family="software_image_management_swim",
function='get_software_image_details',
+ op_modifies=True,
params={"image_uuid": image_id},
)
self.log("Received API response from 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -686,6 +689,7 @@ class DnacSwims(DnacBase):
image_response = self.dnac._exec(
family="software_image_management_swim",
function='get_software_image_details',
+ op_modifies=True,
params={"image_name": name},
)
self.log("Received API response from 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -713,6 +717,7 @@ class DnacSwims(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params=params,
)
self.log("Received API response from 'get_device_list': {0}".format(str(response)), "DEBUG")
@@ -765,12 +770,18 @@ class DnacSwims(DnacBase):
"site_id": site_id,
"device_family": device_family
}
- response = self.dnac._exec(
- family="sites",
- function='get_membership',
- op_modifies=True,
- params=site_params,
- )
+
+ try:
+ response = self.dnac._exec(
+ family="sites",
+ function='get_membership',
+ op_modifies=True,
+ params=site_params,
+ )
+ except Exception as e:
+ self.log("Unable to fetch the device(s) associated to the site '{0}' due to '{1}'".format(site_name, str(e)), "WARNING")
+ return device_uuid_list
+
self.log("Received API response from 'get_membership': {0}".format(str(response)), "DEBUG")
response = response['device']
@@ -1305,6 +1316,7 @@ class DnacSwims(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"id": device_id}
)
self.log("Received API response from 'get_device_list': {0}".format(str(response)), "DEBUG")
diff --git a/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_activation.py b/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_activation.py
index ec9ca0e5b..5d7cae2b5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_activation.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_activation.py
@@ -49,8 +49,8 @@ options:
before schedule (Optional).
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) TriggerSoftwareImageActivation
description: Complete reference of the TriggerSoftwareImageActivation API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_distribution.py b/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_distribution.py
index cad143cb4..ce1b5e1fc 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_distribution.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/swim_trigger_distribution.py
@@ -30,8 +30,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Software Image Management (SWIM) TriggerSoftwareImageDistribution
description: Complete reference of the TriggerSoftwareImageDistribution API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/swim_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/swim_workflow_manager.py
index a147b4055..f7a1764fd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/swim_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/swim_workflow_manager.py
@@ -296,7 +296,7 @@ options:
type: bool
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
software_image_management_swim.SoftwareImageManagementSwim.import_software_image_via_url,
@@ -569,6 +569,7 @@ class Swim(DnacBase):
response = self.dnac._exec(
family="sites",
function='get_site',
+ op_modifies=True,
params={"name": site_name},
)
except Exception as e:
@@ -603,6 +604,7 @@ class Swim(DnacBase):
image_response = self.dnac._exec(
family="software_image_management_swim",
function='get_software_image_details',
+ op_modifies=True,
params={"image_name": name},
)
self.log("Received API response from 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -637,6 +639,7 @@ class Swim(DnacBase):
image_response = self.dnac._exec(
family="software_image_management_swim",
function='get_software_image_details',
+ op_modifies=True,
params={"image_uuid": image_id},
)
self.log("Received API response from 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -672,6 +675,7 @@ class Swim(DnacBase):
image_response = self.dnac._exec(
family="software_image_management_swim",
function='get_software_image_details',
+ op_modifies=True,
params={"image_name": name},
)
self.log("Received API response from 'get_software_image_details': {0}".format(str(image_response)), "DEBUG")
@@ -699,6 +703,7 @@ class Swim(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params=params,
)
self.log("Received API response from 'get_device_list': {0}".format(str(response)), "DEBUG")
@@ -751,12 +756,18 @@ class Swim(DnacBase):
"site_id": site_id,
"device_family": device_family
}
- response = self.dnac._exec(
- family="sites",
- function='get_membership',
- op_modifies=True,
- params=site_params,
- )
+
+ try:
+ response = self.dnac._exec(
+ family="sites",
+ function='get_membership',
+ op_modifies=True,
+ params=site_params,
+ )
+ except Exception as e:
+ self.log("Unable to fetch the device(s) associated to the site '{0}' due to '{1}'".format(site_name, str(e)), "WARNING")
+ return device_uuid_list
+
self.log("Received API response from 'get_membership': {0}".format(str(response)), "DEBUG")
response = response['device']
@@ -1291,6 +1302,7 @@ class Swim(DnacBase):
response = self.dnac._exec(
family="devices",
function='get_device_list',
+ op_modifies=True,
params={"id": device_id}
)
self.log("Received API response from 'get_device_list': {0}".format(str(response)), "DEBUG")
diff --git a/ansible_collections/cisco/dnac/plugins/modules/syslog_config_create.py b/ansible_collections/cisco/dnac/plugins/modules/syslog_config_create.py
index d9058d44e..c4804a3b3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/syslog_config_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/syslog_config_create.py
@@ -35,8 +35,8 @@ options:
description: Protocol.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management CreateSyslogDestination
description: Complete reference of the CreateSyslogDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/syslog_config_update.py b/ansible_collections/cisco/dnac/plugins/modules/syslog_config_update.py
index 79d319fea..653555ac9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/syslog_config_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/syslog_config_update.py
@@ -35,8 +35,8 @@ options:
description: Protocol.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Event Management UpdateSyslogDestination
description: Complete reference of the UpdateSyslogDestination API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/system_health_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/system_health_count_info.py
index b8e6b135c..bf9b72361 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/system_health_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/system_health_count_info.py
@@ -32,8 +32,8 @@ options:
here /dna/platform/app/consumer-portal/developer-toolkit/events.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Health and Performance SystemHealthCountAPI
description: Complete reference of the SystemHealthCountAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/system_health_info.py b/ansible_collections/cisco/dnac/plugins/modules/system_health_info.py
index c0d2ea881..01a23ee64 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/system_health_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/system_health_info.py
@@ -44,8 +44,8 @@ options:
- Offset query parameter.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Health and Performance SystemHealthAPI
description: Complete reference of the SystemHealthAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/system_performance_historical_info.py b/ansible_collections/cisco/dnac/plugins/modules/system_performance_historical_info.py
index 9cdbef7d6..11476ed6f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/system_performance_historical_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/system_performance_historical_info.py
@@ -36,8 +36,8 @@ options:
be fetched.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Health and Performance SystemPerformanceHistoricalAPI
description: Complete reference of the SystemPerformanceHistoricalAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/system_performance_info.py b/ansible_collections/cisco/dnac/plugins/modules/system_performance_info.py
index 8460d7265..41b14ccdd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/system_performance_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/system_performance_info.py
@@ -40,8 +40,8 @@ options:
be fetched.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Health and Performance SystemPerformanceAPI
description: Complete reference of the SystemPerformanceAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag.py b/ansible_collections/cisco/dnac/plugins/modules/tag.py
index 7630c2e61..0b26448c0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag.py
@@ -63,8 +63,8 @@ options:
description: SystemTag flag.
type: bool
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag CreateTag
description: Complete reference of the CreateTag API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/tag_count_info.py
index 4624d65ed..7562f71fc 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag_count_info.py
@@ -44,8 +44,8 @@ options:
- SystemTag query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag GetTagCount
description: Complete reference of the GetTagCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag_info.py b/ansible_collections/cisco/dnac/plugins/modules/tag_info.py
index bc09f0ba5..c7c32e7d5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag_info.py
@@ -72,8 +72,8 @@ options:
- Id path parameter. Tag ID.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag GetTag
description: Complete reference of the GetTag API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag_member.py b/ansible_collections/cisco/dnac/plugins/modules/tag_member.py
index 017fd1c23..2ffe6ce10 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag_member.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag_member.py
@@ -30,8 +30,8 @@ options:
description: Map of member type and member ids.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag AddMembersToTheTag
description: Complete reference of the AddMembersToTheTag API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag_member_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/tag_member_count_info.py
index 13bfd2c4c..82dbf33d0 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag_member_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag_member_count_info.py
@@ -36,8 +36,8 @@ options:
- Level query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag GetTagMemberCount
description: Complete reference of the GetTagMemberCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag_member_info.py b/ansible_collections/cisco/dnac/plugins/modules/tag_member_info.py
index 077114139..57401f152 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag_member_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag_member_info.py
@@ -50,8 +50,8 @@ options:
- Level query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag GetTagMembersById
description: Complete reference of the GetTagMembersById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag_member_type_info.py b/ansible_collections/cisco/dnac/plugins/modules/tag_member_type_info.py
index 4fcb8ca42..a7e4cd1c9 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag_member_type_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag_member_type_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag GetTagResourceTypes
description: Complete reference of the GetTagResourceTypes API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/tag_membership.py b/ansible_collections/cisco/dnac/plugins/modules/tag_membership.py
index e7516549e..9366e9ed2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/tag_membership.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/tag_membership.py
@@ -32,8 +32,8 @@ options:
description: Tag Membership's memberType.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Tag UpdatesTagMembership
description: Complete reference of the UpdatesTagMembership API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/task_count_info.py b/ansible_collections/cisco/dnac/plugins/modules/task_count_info.py
index bb95a22fc..a1eedd445 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/task_count_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/task_count_info.py
@@ -60,8 +60,8 @@ options:
- ParentId query parameter. Fetch tasks that have this parent Id.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Task GetTaskCount
description: Complete reference of the GetTaskCount API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/task_info.py b/ansible_collections/cisco/dnac/plugins/modules/task_info.py
index 9b2b19b01..9adaf195a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/task_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/task_info.py
@@ -82,8 +82,8 @@ options:
- TaskId path parameter. UUID of the Task.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Task GetTaskById
description: Complete reference of the GetTaskById API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/task_operation_info.py b/ansible_collections/cisco/dnac/plugins/modules/task_operation_info.py
index f5578940c..ea08f3306 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/task_operation_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/task_operation_info.py
@@ -34,8 +34,8 @@ options:
value is 1.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Task GetTaskByOperationId
description: Complete reference of the GetTaskByOperationId API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/task_tree_info.py b/ansible_collections/cisco/dnac/plugins/modules/task_tree_info.py
index bda7d8c51..9e80665b3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/task_tree_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/task_tree_info.py
@@ -24,8 +24,8 @@ options:
- TaskId path parameter. UUID of the Task.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Task GetTaskTree
description: Complete reference of the GetTaskTree API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/template_intent.py b/ansible_collections/cisco/dnac/plugins/modules/template_intent.py
index c6e3042de..53c42e0ce 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/template_intent.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/template_intent.py
@@ -1104,7 +1104,7 @@ options:
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
configuration_templates.ConfigurationTemplates.create_template,
@@ -1896,6 +1896,7 @@ class DnacTemplate(DnacBase):
items = self.dnac_apply['exec'](
family="configuration_templates",
function="get_template_details",
+ op_modifies=True,
params={"template_id": config.get("templateId")}
)
if items:
@@ -1980,6 +1981,7 @@ class DnacTemplate(DnacBase):
template_list = self.dnac_apply['exec'](
family="configuration_templates",
function="gets_the_templates_available",
+ op_modifies=True,
params={"projectNames": config.get("projectName")},
)
have_template["isCommitPending"] = True
@@ -2371,8 +2373,8 @@ class DnacTemplate(DnacBase):
response = self.dnac_apply['exec'](
family="configuration_templates",
function="update_template",
- params=template_params,
op_modifies=True,
+ params=template_params,
)
template_updated = True
self.log("Updating existing template '{0}'."
@@ -2442,6 +2444,7 @@ class DnacTemplate(DnacBase):
response = self.dnac._exec(
family="configuration_templates",
function='export_projects',
+ op_modifies=True,
params={"payload": export_project},
)
validation_string = "successfully exported project"
@@ -2458,6 +2461,7 @@ class DnacTemplate(DnacBase):
response = self.dnac._exec(
family="configuration_templates",
function='export_templates',
+ op_modifies=True,
params={"payload": self.export_template},
)
validation_string = "successfully exported template"
@@ -2501,6 +2505,7 @@ class DnacTemplate(DnacBase):
response = self.dnac._exec(
family="configuration_templates",
function='imports_the_projects_provided',
+ op_modifies=True,
params=_import_project,
)
validation_string = "successfully imported project"
@@ -2529,6 +2534,7 @@ class DnacTemplate(DnacBase):
response = self.dnac._exec(
family="configuration_templates",
function='imports_the_templates_provided',
+ op_modifies=True,
params=import_template,
)
validation_string = "successfully imported template"
@@ -2592,6 +2598,7 @@ class DnacTemplate(DnacBase):
response = self.dnac_apply['exec'](
family="configuration_templates",
function=deletion_value,
+ op_modifies=True,
params=params_key,
)
task_id = response.get("response").get("taskId")
@@ -2716,6 +2723,7 @@ class DnacTemplate(DnacBase):
template_list = self.dnac_apply['exec'](
family="configuration_templates",
function="gets_the_templates_available",
+ op_modifies=True,
params={"projectNames": config.get("projectName")},
)
if template_list and isinstance(template_list, list):
diff --git a/ansible_collections/cisco/dnac/plugins/modules/template_preview.py b/ansible_collections/cisco/dnac/plugins/modules/template_preview.py
index bcd466a54..cb1657ccc 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/template_preview.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/template_preview.py
@@ -29,8 +29,8 @@ options:
description: UUID of template to get template preview.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates PreviewTemplate
description: Complete reference of the PreviewTemplate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/template_workflow_manager.py b/ansible_collections/cisco/dnac/plugins/modules/template_workflow_manager.py
index 13e81da9a..fbd91685e 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/template_workflow_manager.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/template_workflow_manager.py
@@ -47,382 +47,385 @@ options:
required: true
suboptions:
configuration_templates:
- description: Create/Update/Delete template.
+ description: Perform operations such as Create/Update/Delete on a template.
type: dict
suboptions:
author:
- description: Author of template.
+ description: Identifies the creator of the template.
type: str
composite:
- description: Is it composite template.
+ description: Specifies if the template is composite.
type: bool
containing_templates:
- description: Configuration Template Create's containingTemplates.
+ description:
+ - Refer to a set of templates within the main template to define more complex or modular configurations.
+ - This is particularly useful in systems that support hierarchical or nested templates.
+ - Here parent templates may contain child templates to form a complete configuration.
suboptions:
composite:
- description: Is it composite template.
+ description: Specifies if the template is composite.
type: bool
description:
- description: Description of template.
+ description: Provides a description of the template.
type: str
device_types:
- description: deviceTypes on which templates would be applied.
+ description: List of dictionaries details the types of devices that the templates can be applied to.
type: list
elements: dict
suboptions:
product_family:
- description: Device family.
+ description: Denotes the family to which the device belongs.
type: str
product_series:
- description: Device series.
+ description: Specifies the series classification of the device.
type: str
product_type:
- description: Device type.
+ description: Describes the exact type of the device.
type: str
id:
- description: UUID of template.
+ description: Unique identifier for the template, represented as a UUID.
type: str
language:
- description: Template language
+ description: Programming language used for templating. Options are 'JINJA' for Jinja templating or 'VELOCITY' for Apache Velocity.
choices:
- JINJA
- VELOCITY
type: str
name:
- description: Name of template.
+ description: Designation of the template, serving as its unique name.
type: str
project_name:
- description: Name of the project under which templates are managed.
+ description: Title of the project within which the template is categorized and managed.
type: str
project_description:
- description: Description of the project created.
+ description: Narrative that elaborates on the purpose and scope of the project.
type: str
rollback_template_params:
- description: Params required for template rollback.
+ description: A list of dictionaries defining parameters necessary for the rollback functionality of a template.
type: list
elements: dict
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Create's range.
+ description: Defines the permissible range for the parameter's value.
type: list
elements: dict
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Create's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
tags:
- description: Configuration Template Create's tags.
+ description: A list of dictionaries representing tags associated with the Configuration Template during creation.
suboptions:
id:
- description: UUID of tag.
+ description: The unique identifier for each tag, presented as a UUID.
type: str
name:
- description: Name of tag.
+ description: The descriptive label or name assigned to the tag.
type: str
type: list
elements: dict
template_content:
- description: Template content.
+ description: The actual script or code constituting the body of the template.
type: str
template_params:
- description: Configuration Template Create's templateParams.
+ description: The customization of the contents within the template.
elements: dict
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Create's range.
+ description: Defines the permissible range for the parameter's value.
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
type: list
elements: dict
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Create's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
type: list
version:
- description: Current version of template.
+ description: The current version of template.
type: str
type: list
elements: dict
create_time:
- description: Create time of template.
+ description: The creation time of the template refers to the initial development.
type: int
custom_params_order:
- description: Custom Params Order.
+ description: Specifies the sequence in which custom parameters or variables should be arranged within the template.
type: bool
template_description:
- description: Description of template.
+ description: Provides a overview of the template.
type: str
device_types:
- description: Configuration Template Create's deviceTypes. This field is mandatory to create a new template.
+ description: List of dictionaries details the types of devices that the templates can be applied to.
+ type: list
+ elements: dict
suboptions:
product_family:
- description: Device family.
+ description: Denotes the family to which the device belongs.
type: str
product_series:
- description: Device series.
+ description: Specifies the series classification of the device.
type: str
product_type:
- description: Device type.
+ description: Describes the exact type of the device.
type: str
- type: list
- elements: dict
failure_policy:
description: Define failure policy if template provisioning fails.
type: str
id:
- description: UUID of template.
+ description: A unique identifier, represented as a UUID.
type: str
language:
- description: Template language
+ description: Programming language used for templating. Options are 'JINJA' for Jinja templating or 'VELOCITY' for Apache Velocity.
choices:
- JINJA
- VELOCITY
type: str
last_update_time:
- description: Update time of template.
+ description: Indicates the most recent timestamp when the template was modified or revised.
type: int
latest_version_time:
- description: Latest versioned template time.
+ description: Indicates when the most recent version of a template was released or updated.
type: int
template_name:
description: Name of template. This field is mandatory to create a new template.
type: str
parent_template_id:
- description: Parent templateID.
+ description: Refers to the unique identifier of a template from which another template derives.
type: str
project_id:
- description: Project UUID.
+ description: A unique identifier for the project, formatted as a UUID.
type: str
project_name:
- description: Project name.
+ description: Title of the project within which the template is categorized and managed.
type: str
project_description:
- description: Project Description.
+ description: Narrative that elaborates on the purpose and scope of the project.
type: str
rollback_template_content:
- description: Rollback template content.
+ description: Refers to the process of reverting the content of a template back to a previous version or state.
type: str
rollback_template_params:
- description: Configuration Template Create's rollbackTemplateParams.
+ description: A list of dictionaries defining parameters necessary for the rollback functionality of a template.
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Create's range.
+ description: Defines the permissible range for the parameter's value.
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
type: list
elements: dict
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Create's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
type: list
@@ -431,143 +434,143 @@ options:
description: Applicable device software type. This field is mandatory to create a new template.
type: str
software_variant:
- description: Applicable device software variant.
+ description: Refers to a version or edition of a software application that differs from the main or standard release.
type: str
software_version:
description: Applicable device software version.
type: str
template_tag:
- description: Configuration Template Create's tags.
+ description: Refers to a keyword, label, or metadata assigned to a template.
suboptions:
id:
- description: UUID of tag.
+ description: A unique identifier for the tag, represented as a UUID.
type: str
name:
- description: Name of tag.
+ description: The name of the tag.
type: str
type: list
elements: dict
template_content:
- description: Template content.
+ description: The actual script or code constituting the body of the template.
type: str
template_params:
- description: Configuration Template Create's templateParams.
+ description: The customization of the contents within the template.
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Create's range.
+ description: Defines the permissible range for the parameter's value.
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
type: list
elements: dict
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Create's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
type: list
elements: dict
validation_errors:
- description: Configuration Template Create's validationErrors.
+ description: Refer to issues or discrepancies identified during the validation process.
suboptions:
rollback_template_errors:
description: Validation or design conflicts errors of rollback template.
elements: dict
type: list
template_errors:
- description: Validation or design conflicts errors.
+ description: Refer to issues or discrepancies encountered during the processing of a template within a software application.
elements: dict
type: list
template_id:
- description: UUID of template.
+ description: A unique identifier for the template, represented as a UUID.
type: str
template_version:
- description: Current version of template.
+ description: The current version of validation process in the template.
type: str
type: dict
version:
- description: Current version of template.
+ description: The current version of template.
type: str
version_description:
description: Template version comments.
type: str
export:
- description: Export the project/template details.
+ description: Perform export on the projects and templates.
type: dict
suboptions:
project:
- description: Export the project.
+ description: Export the project(s) details.
type: list
elements: str
template:
- description: Export the template.
+ description: Export the template(s) details.
type: list
elements: dict
suboptions:
@@ -575,14 +578,14 @@ options:
description: Name of the project under the template available.
type: str
template_name:
- description: Name of the template which we need to export
+ description: Name of the template which we need to be exported.
type: str
import:
- description: Import the project/template details.
+ description: Perform import on the projects and templates.
type: dict
suboptions:
project:
- description: Import the project details.
+ description: Import the projects.
type: dict
suboptions:
do_version:
@@ -592,7 +595,7 @@ options:
fails with 'Template already exists' error.
type: bool
template:
- description: Import the template details.
+ description: Import the templates.
type: dict
suboptions:
do_version:
@@ -601,502 +604,524 @@ options:
exists. " If false and if template already exists, then operation
fails with 'Template already exists' error.
type: bool
+ template_file:
+ description:
+ - Specifies the path to a JSON file that contains an import template.
+ - If both 'template_file' and 'payload' are provided, the 'template_file' will be given priority.
+ type: str
payload:
- description: Configuration Template Import Template's payload.
+ description:
+ - The payload parameter is used to directly import configuration data into the system.
+ - The payload provides an alternative way to import configurations without the need to reference an external file.
+ - If both 'template_file' and 'payload' are provided, the 'template_file' will be given priority.
+ type: list
elements: dict
suboptions:
author:
- description: Author of template.
+ description: Identifies the creator of the template.
type: str
composite:
- description: Is it composite template.
+ description: Specifies if the template is composite.
type: bool
containing_templates:
- description: Configuration Template Import Template's containingTemplates.
- elements: dict
+ description:
+ - Refer to a set of templates within the main template to define more complex or modular configurations.
+ - This is particularly useful in systems that support hierarchical or nested templates.
+ - Here parent templates may contain child templates to form a complete configuration.
suboptions:
composite:
- description: Is it composite template.
+ description: Specifies if the template is composite.
type: bool
description:
- description: Description of template.
+ description: Provides a description of the template.
type: str
device_types:
- description: Configuration Template Import Template's deviceTypes.
+ description: List of dictionaries details the types of devices that the templates can be applied to.
+ type: list
elements: dict
suboptions:
product_family:
- description: Device family.
+ description: Denotes the family to which the device belongs.
type: str
product_series:
- description: Device series.
+ description: Specifies the series classification of the device.
type: str
product_type:
- description: Device type.
+ description: Describes the exact type of the device.
type: str
- type: list
id:
- description: UUID of template.
+ description: Unique identifier for the template, represented as a UUID.
type: str
language:
- description: Template language (JINJA or VELOCITY).
+ description: Programming language used for templating. Options are 'JINJA' for Jinja templating or 'VELOCITY' for Apache Velocity.
+ choices:
+ - JINJA
+ - VELOCITY
type: str
name:
- description: Name of template.
+ description: Designation of the template, serving as its unique name.
type: str
project_name:
- description: Project name.
+ description: Title of the project within which the template is categorized and managed.
type: str
rollback_template_params:
- description: Configuration Template Import Template's rollbackTemplateParams.
+ description: A list of dictionaries defining parameters necessary for the rollback functionality of a template.
+ type: list
elements: dict
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Import Template's range.
+ description: Defines the permissible range for the parameter's value.
+ type: list
elements: dict
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
- type: list
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Import Template's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
- type: list
tags:
- description: Configuration Template Import Template's tags.
- elements: dict
+ description: A list of dictionaries representing tags associated with the Configuration Template during creation.
suboptions:
id:
- description: UUID of tag.
+ description: The unique identifier for each tag, presented as a UUID.
type: str
name:
- description: Name of tag.
+ description: The descriptive label or name assigned to the tag.
type: str
type: list
+ elements: dict
template_content:
- description: Template content.
+ description: The actual script or code constituting the body of the template.
type: str
template_params:
- description: Configuration Template Import Template's templateParams.
+ description: The customization of the contents within the template.
elements: dict
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Import Template's range.
- elements: dict
+ description: Defines the permissible range for the parameter's value.
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
type: list
+ elements: dict
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Import Template's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
type: list
version:
- description: Current version of template.
+ description: The current version of template.
type: str
type: list
+ elements: dict
create_time:
- description: Create time of template.
+ description: The creation time of the template refers to the initial development.
type: int
custom_params_order:
- description: Custom Params Order.
+ description: Specifies the sequence in which custom parameters or variables should be arranged within the template.
type: bool
- description:
- description: Description of template.
+ template_description:
+ description: Provides a overview of the template.
type: str
device_types:
- description: Configuration Template Import Template's deviceTypes.
+ description: List of dictionaries details the types of devices that the templates can be applied to.
+ type: list
elements: dict
suboptions:
product_family:
- description: Device family.
+ description: Denotes the family to which the device belongs.
type: str
product_series:
- description: Device series.
+ description: Specifies the series classification of the device.
type: str
product_type:
- description: Device type.
+ description: Describes the exact type of the device.
type: str
- type: list
failure_policy:
description: Define failure policy if template provisioning fails.
type: str
id:
- description: UUID of template.
+ description: A unique identifier, represented as a UUID.
type: str
language:
- description: Template language (JINJA or VELOCITY).
+ description: Programming language used for templating. Options are 'JINJA' for Jinja templating or 'VELOCITY' for Apache Velocity.
+ choices:
+ - JINJA
+ - VELOCITY
type: str
last_update_time:
- description: Update time of template.
+ description: Indicates the most recent timestamp when the template was modified or revised.
type: int
latest_version_time:
- description: Latest versioned template time.
+ description: Indicates when the most recent version of a template was released or updated.
type: int
- name:
- description: Name of template.
+ template_name:
+ description: Name of template. This field is mandatory to create a new template.
type: str
parent_template_id:
- description: Parent templateID.
+ description: Refers to the unique identifier of a template from which another template derives.
type: str
project_id:
- description: Project UUID.
+ description: A unique identifier for the project, formatted as a UUID.
type: str
project_name:
- description: Project name.
+ description: Title of the project within which the template is categorized and managed.
+ type: str
+ project_description:
+ description: Narrative that elaborates on the purpose and scope of the project.
type: str
rollback_template_content:
- description: Rollback template content.
+ description: Refers to the process of reverting the content of a template back to a previous version or state.
type: str
rollback_template_params:
- description: Configuration Template Import Template's rollbackTemplateParams.
- elements: dict
+ description: A list of dictionaries defining parameters necessary for the rollback functionality of a template.
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Import Template's range.
- elements: dict
+ description: Defines the permissible range for the parameter's value.
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
type: list
+ elements: dict
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Import Template's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
type: list
+ elements: dict
software_type:
- description: Applicable device software type.
+ description: Applicable device software type. This field is mandatory to create a new template.
type: str
software_variant:
- description: Applicable device software variant.
+ description: Refers to a version or edition of a software application that differs from the main or standard release.
type: str
software_version:
description: Applicable device software version.
type: str
- tags:
- description: Configuration Template Import Template's tags.
- elements: dict
+ template_tag:
+ description: Refers to a keyword, label, or metadata assigned to a template.
suboptions:
id:
- description: UUID of tag.
+ description: A unique identifier for the tag, represented as a UUID.
type: str
name:
- description: Name of tag.
+ description: The name of the tag.
type: str
type: list
+ elements: dict
template_content:
- description: Template content.
+ description: The actual script or code constituting the body of the template.
type: str
template_params:
- description: Configuration Template Import Template's templateParams.
- elements: dict
+ description: The customization of the contents within the template.
suboptions:
binding:
- description: Bind to source.
+ description: Associates the parameter with its source.
type: str
custom_order:
- description: CustomOrder of template param.
+ description: Specifies a user-defined ordering for the parameter.
type: int
data_type:
- description: Datatype of template param.
+ description: Identifies the data type of the parameter (e.g., string, integer, boolean).
type: str
default_value:
- description: Default value of template param.
+ description: Establishes a default value for the parameter, used if no other value is provided.
type: str
description:
- description: Description of template param.
+ description: Provides a descriptive explanation of the parameter's purpose.
type: str
display_name:
- description: Display name of param.
+ description: The name of the parameter as displayed to users.
type: str
group:
- description: Group.
+ description: Categorizes the parameter into a named group for organizational purposes.
type: str
id:
- description: UUID of template param.
+ description: A unique identifier for the parameter, formatted as a UUID.
type: str
instruction_text:
- description: Instruction text for param.
+ description: Gives guidance or instructions regarding the parameter's use.
type: str
key:
- description: Key.
+ description: A unique key that identifies the parameter within the template.
type: str
not_param:
- description: Is it not a variable.
+ description: Indicates whether the entry is not to be treated as a parameter.
type: bool
order:
- description: Order of template param.
+ description: Determines the sequence in which the parameter appears relative to others.
type: int
param_array:
- description: Is it an array.
+ description: Specifies if the parameter should be treated as an array.
type: bool
parameter_name:
- description: Name of template param.
+ description: The name of the parameter.
type: str
provider:
- description: Provider.
+ description: Denotes the provider associated with the parameter.
type: str
range:
- description: Configuration Template Import Template's range.
- elements: dict
+ description: Defines the permissible range for the parameter's value.
suboptions:
id:
- description: UUID of range.
+ description: Unique identifier for the range, represented as a UUID.
type: str
max_value:
- description: Max value of range.
+ description: Specifies the maximum allowable value for the parameter.
type: int
min_value:
- description: Min value of range.
+ description: Specifies the minimum allowable value for the parameter.
type: int
type: list
+ elements: dict
required:
- description: Is param required.
+ description: Dictates whether the parameter is mandatory for template operations.
type: bool
selection:
- description: Configuration Template Import Template's selection.
+ description: Contains options for parameter selection when a choice is available.
suboptions:
default_selected_values:
- description: Default selection values.
+ description: Lists the default values that are preselected.
elements: str
type: list
id:
- description: UUID of selection.
+ description: A unique identifier for the selection entity, represented as a UUID.
type: str
selection_type:
- description: Type of selection(SINGLE_SELECT or MULTI_SELECT).
+ description: Specifies the type of selection, such as 'SINGLE_SELECT' or 'MULTI_SELECT'.
type: str
selection_values:
- description: Selection values.
+ description: A dictionary of available values for selection.
type: dict
type: dict
type: list
+ elements: dict
validation_errors:
- description: Configuration Template Import Template's validationErrors.
+ description: Refer to issues or discrepancies identified during the validation process.
suboptions:
rollback_template_errors:
- description: Validation or design conflicts errors of rollback template.
- type: dict
+ description: Refer to errors or issues encountered during the process of reverting a template to a previous version or state.
+ elements: dict
+ type: list
template_errors:
- description: Validation or design conflicts errors.
- type: dict
+ description: Refer to issues or discrepancies encountered during the processing of a template within a software application.
+ elements: dict
+ type: list
template_id:
- description: UUID of template.
+ description: A unique identifier for the template, represented as a UUID.
type: str
template_version:
- description: Current version of template.
+ description: The current version of validation process in the template.
type: str
type: dict
version:
- description: Current version of template.
+ description: The current version of template.
type: str
- type: list
project_name:
description: ProjectName path parameter. Project name to create template under the
project.
@@ -1104,7 +1129,7 @@ options:
requirements:
- dnacentersdk == 2.4.5
-- python >= 3.5
+- python >= 3.9
notes:
- SDK Method used are
configuration_templates.ConfigurationTemplates.create_template,
@@ -1239,6 +1264,26 @@ EXAMPLES = r"""
- name: string
- name: string
+- name: Import the Templates.
+ cisco.dnac.template_workflow_manager:
+ dnac_host: "{{dnac_host}}"
+ dnac_username: "{{dnac_username}}"
+ dnac_password: "{{dnac_password}}"
+ dnac_verify: "{{dnac_verify}}"
+ dnac_port: "{{dnac_port}}"
+ dnac_version: "{{dnac_version}}"
+ dnac_debug: "{{dnac_debug}}"
+ dnac_log: True
+ dnac_log_level: "{{dnac_log_level}}"
+ state: merged
+ config_verify: True
+ config:
+ import:
+ template:
+ do_version: false
+ project_name: string
+ template_file: string
+
"""
RETURN = r"""
@@ -1312,6 +1357,7 @@ response_5:
"""
import copy
+import json
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.dnac.plugins.module_utils.dnac import (
DnacBase,
@@ -1331,7 +1377,11 @@ class Template(DnacBase):
self.supported_states = ["merged", "deleted"]
self.accepted_languages = ["JINJA", "VELOCITY"]
self.export_template = []
- self.result['response'].append({})
+ self.result['response'] = [
+ {"configurationTemplate": {"response": {}, "msg": {}}},
+ {"export": {"response": {}}},
+ {"import": {"response": {}}}
+ ]
def validate_input(self):
"""
@@ -1367,7 +1417,7 @@ class Template(DnacBase):
'containing_templates': {'type': 'list'},
'create_time': {'type': 'int'},
'custom_params_order': {'type': 'bool'},
- 'description': {'type': 'str'},
+ 'template_description': {'type': 'str'},
'device_types': {
'type': 'list',
'elements': 'dict',
@@ -1394,8 +1444,7 @@ class Template(DnacBase):
'template_params': {'type': 'list'},
'template_name': {'type': 'str'},
'validation_errors': {'type': 'dict'},
- 'version': {'type': 'str'},
- 'version_description': {'type': 'str'}
+ 'version': {'type': 'str'}
},
'export': {
'type': 'dict',
@@ -1425,7 +1474,7 @@ class Template(DnacBase):
'containing_templates': {'type': 'list'},
'create_time': {'type': 'int'},
'custom_params_order': {'type': 'bool'},
- 'description': {'type': 'str'},
+ 'template_description': {'type': 'str'},
'device_types': {
'type': 'list',
'elements': 'dict',
@@ -1857,7 +1906,6 @@ class Template(DnacBase):
"""
self.log("Template params playbook details: {0}".format(params), "DEBUG")
- self.log(str(params))
temp_params = {
"tags": self.get_tags(params.get("template_tag")),
"author": params.get("author"),
@@ -1917,7 +1965,7 @@ class Template(DnacBase):
self.status = "failed"
return self.check_return_status()
- temp_params.update({"project_name": projectName})
+ temp_params.update({"projectName": projectName})
softwareType = params.get("software_type")
if not softwareType:
@@ -1932,7 +1980,6 @@ class Template(DnacBase):
for item in copy_temp_params:
if temp_params[item] is None:
del temp_params[item]
- self.log(str(temp_params))
return temp_params
def get_template(self, config):
@@ -1950,13 +1997,14 @@ class Template(DnacBase):
items = self.dnac_apply['exec'](
family="configuration_templates",
function="get_template_details",
+ op_modifies=True,
params={"template_id": config.get("templateId")}
)
if items:
result = items
self.log("Received API response from 'get_template_details': {0}".format(items), "DEBUG")
- self.result['response'] = items
+ self.result['response'][0].get("configurationTemplate").update({"items": items})
return result
def get_have_project(self, config):
@@ -2034,6 +2082,7 @@ class Template(DnacBase):
template_list = self.dnac_apply['exec'](
family="configuration_templates",
function="gets_the_templates_available",
+ op_modifies=True,
params={"projectNames": config.get("projectName")},
)
have_template["isCommitPending"] = True
@@ -2290,8 +2339,6 @@ class Template(DnacBase):
# Mandate fields required for creating a new template.
# Store it with other template parameters.
- self.log(str(template_params))
- self.log(str(self.have_project))
template_params["projectId"] = self.have_project.get("id")
template_params["project_id"] = self.have_project.get("id")
# Update language,deviceTypes and softwareType if not provided for existing template.
@@ -2419,7 +2466,7 @@ class Template(DnacBase):
if is_template_found:
if not self.requires_update():
# Template does not need update
- self.result.update({
+ self.result['response'][0].get("configurationTemplate").update({
'response': self.have_template.get("template"),
'msg': "Template does not need update"
})
@@ -2433,8 +2480,8 @@ class Template(DnacBase):
response = self.dnac_apply['exec'](
family="configuration_templates",
function="update_template",
- params=template_params,
op_modifies=True,
+ params=template_params,
)
template_updated = True
self.log("Updating existing template '{0}'."
@@ -2466,12 +2513,12 @@ class Template(DnacBase):
return self
task_details = self.get_task_details(task_id)
self.result['changed'] = True
- self.result['msg'] = task_details.get('progress')
- self.result['diff'] = configuration_templates
+ self.result['response'][0].get("configurationTemplate")['msg'] = task_details.get('progress')
+ self.result['response'][0].get("configurationTemplate")['diff'] = configuration_templates
self.log("Task details for 'version_template': {0}".format(task_details), "DEBUG")
- self.result['response'] = task_details if task_details else response
+ self.result['response'][0].get("configurationTemplate")['response'] = task_details if task_details else response
- if not self.result.get('msg'):
+ if not self.result['response'][0].get("configurationTemplate").get('msg'):
self.msg = "Error while versioning the template"
self.status = "failed"
return self
@@ -2494,16 +2541,16 @@ class Template(DnacBase):
response = self.dnac._exec(
family="configuration_templates",
function='export_projects',
+ op_modifies=True,
params={
"payload": export_project,
- "active_validation": False,
},
)
validation_string = "successfully exported project"
self.check_task_response_status(response,
validation_string,
True).check_return_status()
- self.result['response'][0].update({"exportProject": self.msg})
+ self.result['response'][1].get("export").get("response").update({"exportProject": self.msg})
export_values = export.get("template")
if export_values:
@@ -2513,16 +2560,16 @@ class Template(DnacBase):
response = self.dnac._exec(
family="configuration_templates",
function='export_templates',
+ op_modifies=True,
params={
"payload": self.export_template,
- "active_validation": False,
},
)
validation_string = "successfully exported template"
self.check_task_response_status(response,
validation_string,
True).check_return_status()
- self.result['response'][0].update({"exportTemplate": self.msg})
+ self.result['response'][1].get("export").get("response").update({"exportTemplate": self.msg})
return self
@@ -2558,7 +2605,6 @@ class Template(DnacBase):
_import_project = {
"do_version": do_version,
"payload": final_payload,
- "active_validation": False,
}
self.log("Importing project details from the playbook: {0}"
.format(_import_project), "DEBUG")
@@ -2566,14 +2612,15 @@ class Template(DnacBase):
response = self.dnac._exec(
family="configuration_templates",
function='imports_the_projects_provided',
+ op_modifies=True,
params=_import_project,
)
validation_string = "successfully imported project"
self.check_task_response_status(response, validation_string).check_return_status()
- self.result['response'][0].update({"importProject": validation_string})
+ self.result['response'][2].get("import").get("response").update({"importProject": validation_string})
else:
self.msg = "Projects '{0}' already available.".format(payload)
- self.result['response'][0].update({
+ self.result['response'][2].get("import").get("response").update({
"importProject": "Projects '{0}' already available.".format(payload)
})
@@ -2582,39 +2629,71 @@ class Template(DnacBase):
do_version = _import_template.get("do_version")
if not do_version:
do_version = False
+
+ project_name = _import_template.get("project_name")
if not _import_template.get("project_name"):
self.msg = "Mandatory parameter project_name is not found under import template"
self.status = "failed"
return self
- if not _import_template.get("payload"):
- self.msg = "Mandatory parameter payload is not found under import template"
+ is_project_exists = self.get_project_details(project_name)
+ if not is_project_exists:
+ self.msg = "Project '{0}' is not found.".format(project_name)
self.status = "failed"
return self
payload = _import_template.get("payload")
- final_payload = []
- for item in payload:
- self.log(str(item))
- final_payload.append(self.get_template_params(item))
- self.log(str(final_payload))
+ template_file = _import_template.get("template_file")
+ if not (payload or template_file):
+ self.msg = "Mandatory parameter 'payload' or 'template_file' is not found under import template"
+ self.status = "failed"
+ return self
+
+ final_payload = None
+ if template_file:
+ is_path_exists = self.is_path_exists(template_file)
+ if not is_path_exists:
+ self.msg = "Import template file path '{0}' does not exist.".format(template_file)
+ self.status = "failed"
+ return self
+
+ is_json = self.is_json(template_file)
+ if not is_json:
+ self.msg = "Import template file '{0}' is not in JSON format".format(template_file)
+ self.status = "failed"
+ return self
+ try:
+ with open(template_file, 'r') as file:
+ json_data = file.read()
+ json_template = json.loads(json_data)
+ final_payload = json_template
+ except Exception as msg:
+ self.msg = "An unexpected error occurred while processing the file '{0}': {1}".format(template_file, msg)
+ self.status = "failed"
+ return self
+
+ elif payload:
+ final_payload = []
+ for item in payload:
+ final_payload.append(self.get_template_params(item))
import_template = {
- "do_version": _import_template.get("do_version"),
- "project_name": _import_template.get("project_name"),
+ "do_version": do_version,
+ "project_name": project_name,
"payload": final_payload,
- "active_validation": False,
}
self.log("Import template details from the playbook: {0}"
- .format(_import_template), "DEBUG")
+ .format(import_template), "DEBUG")
if _import_template:
response = self.dnac._exec(
family="configuration_templates",
function='imports_the_templates_provided',
+ op_modifies=True,
params=import_template
)
validation_string = "successfully imported template"
self.check_task_response_status(response, validation_string).check_return_status()
- self.result['response'][0].update({"importTemplate": validation_string})
+ self.result['response'][2].get("import").get("response") \
+ .update({"importTemplate": "Successfully imported the templates"})
return self
@@ -2679,19 +2758,20 @@ class Template(DnacBase):
response = self.dnac_apply['exec'](
family="configuration_templates",
function=deletion_value,
+ op_modifies=True,
params=params_key,
)
task_id = response.get("response").get("taskId")
if task_id:
task_details = self.get_task_details(task_id)
self.result['changed'] = True
- self.result['msg'] = task_details.get('progress')
- self.result['diff'] = config.get("configuration_templates")
+ self.result['response'][0].get("configurationTemplate")['msg'] = task_details.get('progress')
+ self.result['response'][0].get("configurationTemplate")['diff'] = config.get("configuration_templates")
self.log("Task details for '{0}': {1}".format(deletion_value, task_details), "DEBUG")
- self.result['response'] = task_details if task_details else response
- if not self.result['msg']:
- self.result['msg'] = "Error while deleting {name} : "
+ self.result['response'][0].get("configurationTemplate")['response'] = task_details if task_details else response
+ if not self.result['response'][0].get("configurationTemplate")['msg']:
+ self.result['response'][0].get("configurationTemplate")['msg'] = "Error while deleting {name} : "
self.status = "failed"
return self
@@ -2774,11 +2854,11 @@ class Template(DnacBase):
"softwareVariant", "templateContent"]
for item in template_params:
if self.have_template.get("template").get(item) != self.want.get("template_params").get(item):
- self.msg = " Configuration Template config is not applied to the Cisco Catalyst Center."
+ self.msg = "Configuration Template config is not applied to the Cisco Catalyst Center."
self.status = "failed"
return self
self.log("Successfully validated the Template in the Catalyst Center.", "INFO")
- self.result.get("response").update({"Validation": "Success"})
+ self.result['response'][0].get("configurationTemplate").get("response").update({"Validation": "Success"})
self.msg = "Successfully validated the Configuration Templates."
self.status = "success"
@@ -2803,6 +2883,7 @@ class Template(DnacBase):
template_list = self.dnac_apply['exec'](
family="configuration_templates",
function="gets_the_templates_available",
+ op_modifies=True,
params={"projectNames": config.get("projectName")},
)
if template_list and isinstance(template_list, list):
@@ -2816,7 +2897,7 @@ class Template(DnacBase):
return self
self.log("Successfully validated absence of template in the Catalyst Center.", "INFO")
- self.result.get("response").update({"Validation": "Success"})
+ self.result['response'][0].get("configurationTemplate").get("response").update({"Validation": "Success"})
self.msg = "Successfully validated the absence of Template in the Cisco Catalyst Center."
self.status = "success"
@@ -2841,24 +2922,25 @@ class Template(DnacBase):
def main():
""" main entry point for module execution"""
- element_spec = {'dnac_host': {'required': True, 'type': 'str'},
- 'dnac_port': {'type': 'str', 'default': '443'},
- 'dnac_username': {'type': 'str', 'default': 'admin', 'aliases': ['user']},
- 'dnac_password': {'type': 'str', 'no_log': True},
- 'dnac_verify': {'type': 'bool', 'default': 'True'},
- 'dnac_version': {'type': 'str', 'default': '2.2.3.3'},
- 'dnac_debug': {'type': 'bool', 'default': False},
- 'dnac_log': {'type': 'bool', 'default': False},
- "dnac_log_level": {"type": 'str', "default": 'WARNING'},
- "dnac_log_file_path": {"type": 'str', "default": 'dnac.log'},
- "dnac_log_append": {"type": 'bool', "default": True},
- 'validate_response_schema': {'type': 'bool', 'default': True},
- "config_verify": {"type": 'bool', "default": False},
- 'dnac_api_task_timeout': {'type': 'int', "default": 1200},
- 'dnac_task_poll_interval': {'type': 'int', "default": 2},
- 'config': {'required': True, 'type': 'list', 'elements': 'dict'},
- 'state': {'default': 'merged', 'choices': ['merged', 'deleted']}
- }
+ element_spec = {
+ 'dnac_host': {'required': True, 'type': 'str'},
+ 'dnac_port': {'type': 'str', 'default': '443'},
+ 'dnac_username': {'type': 'str', 'default': 'admin', 'aliases': ['user']},
+ 'dnac_password': {'type': 'str', 'no_log': True},
+ 'dnac_verify': {'type': 'bool', 'default': 'True'},
+ 'dnac_version': {'type': 'str', 'default': '2.2.3.3'},
+ 'dnac_debug': {'type': 'bool', 'default': False},
+ 'dnac_log': {'type': 'bool', 'default': False},
+ "dnac_log_level": {"type": 'str', "default": 'WARNING'},
+ "dnac_log_file_path": {"type": 'str', "default": 'dnac.log'},
+ "dnac_log_append": {"type": 'bool', "default": True},
+ 'validate_response_schema': {'type': 'bool', 'default': True},
+ "config_verify": {"type": 'bool', "default": False},
+ 'dnac_api_task_timeout': {'type': 'int', "default": 1200},
+ 'dnac_task_poll_interval': {'type': 'int', "default": 2},
+ 'config': {'required': True, 'type': 'list', 'elements': 'dict'},
+ 'state': {'default': 'merged', 'choices': ['merged', 'deleted']}
+ }
module = AnsibleModule(argument_spec=element_spec,
supports_check_mode=False)
ccc_template = Template(module)
diff --git a/ansible_collections/cisco/dnac/plugins/modules/templates_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/templates_details_info.py
index d8d2b0704..f2f45271c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/templates_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/templates_details_info.py
@@ -89,8 +89,8 @@ options:
- Limit query parameter. Limits number of results.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Configuration Templates GetTemplatesDetails
description: Complete reference of the GetTemplatesDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/threat_detail.py b/ansible_collections/cisco/dnac/plugins/modules/threat_detail.py
index 685b60b15..0bcfac62c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/threat_detail.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/threat_detail.py
@@ -44,8 +44,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
devices.Devices.threat_details,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/threat_detail_count.py b/ansible_collections/cisco/dnac/plugins/modules/threat_detail_count.py
index fab706a16..7a21cd1ad 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/threat_detail_count.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/threat_detail_count.py
@@ -44,8 +44,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
devices.Devices.threat_detail_count,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/threat_summary.py b/ansible_collections/cisco/dnac/plugins/modules/threat_summary.py
index e3f3742bb..635b0c43c 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/threat_summary.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/threat_summary.py
@@ -35,8 +35,8 @@ options:
elements: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
notes:
- SDK Method used are
devices.Devices.threat_summary,
diff --git a/ansible_collections/cisco/dnac/plugins/modules/topology_layer_2_info.py b/ansible_collections/cisco/dnac/plugins/modules/topology_layer_2_info.py
index 2d9324000..2ba3667e2 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/topology_layer_2_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/topology_layer_2_info.py
@@ -24,8 +24,8 @@ options:
- VlanID path parameter. Vlan Name for e.g Vlan1, Vlan23 etc.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Topology GetTopologyDetails
description: Complete reference of the GetTopologyDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/topology_layer_3_info.py b/ansible_collections/cisco/dnac/plugins/modules/topology_layer_3_info.py
index fc09e3f56..008b5d1ac 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/topology_layer_3_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/topology_layer_3_info.py
@@ -24,8 +24,8 @@ options:
- TopologyType path parameter. Type of topology(OSPF,ISIS,etc).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Topology GetL3TopologyDetails
description: Complete reference of the GetL3TopologyDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/topology_network_health_info.py b/ansible_collections/cisco/dnac/plugins/modules/topology_network_health_info.py
index 907a87c5f..b9c856316 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/topology_network_health_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/topology_network_health_info.py
@@ -26,8 +26,8 @@ options:
- Timestamp query parameter. Epoch time(in milliseconds) when the Network health data is required.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Topology GetOverallNetworkHealth
description: Complete reference of the GetOverallNetworkHealth API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/topology_physical_info.py b/ansible_collections/cisco/dnac/plugins/modules/topology_physical_info.py
index 89afc87f2..6a9573d57 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/topology_physical_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/topology_physical_info.py
@@ -24,8 +24,8 @@ options:
- NodeType query parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Topology GetPhysicalTopology
description: Complete reference of the GetPhysicalTopology API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/topology_site_info.py b/ansible_collections/cisco/dnac/plugins/modules/topology_site_info.py
index 034c84c96..d63661b43 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/topology_site_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/topology_site_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Topology GetSiteTopology
description: Complete reference of the GetSiteTopology API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/topology_vlan_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/topology_vlan_details_info.py
index c8585d26a..555b5b9d8 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/topology_vlan_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/topology_vlan_details_info.py
@@ -20,8 +20,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Topology GetVLANDetails
description: Complete reference of the GetVLANDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network.py b/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network.py
index 29c9889c1..38125e4d3 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network.py
@@ -49,8 +49,8 @@ options:
description: Transit Peer Network Type.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for AddTransitPeerNetwork
description: Complete reference of the AddTransitPeerNetwork API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network_info.py b/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network_info.py
index ef9ecac22..75ca07d7a 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/transit_peer_network_info.py
@@ -24,8 +24,8 @@ options:
- TransitPeerNetworkName query parameter. Transit or Peer Network Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for GetTransitPeerNetworkInfo
description: Complete reference of the GetTransitPeerNetworkInfo API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/user.py b/ansible_collections/cisco/dnac/plugins/modules/user.py
index 21769bb83..4567de33d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/user.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/user.py
@@ -40,8 +40,8 @@ options:
description: Username.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for User and Roles AddUserAPI
description: Complete reference of the AddUserAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/user_enrichment_details_info.py b/ansible_collections/cisco/dnac/plugins/modules/user_enrichment_details_info.py
index 246dd7a83..bcffca746 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/user_enrichment_details_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/user_enrichment_details_info.py
@@ -22,8 +22,8 @@ options:
description: Additional headers.
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Users GetUserEnrichmentDetails
description: Complete reference of the GetUserEnrichmentDetails API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/user_info.py b/ansible_collections/cisco/dnac/plugins/modules/user_info.py
index f00e1d66e..d4c20af69 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/user_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/user_info.py
@@ -24,8 +24,8 @@ options:
- InvokeSource query parameter. The source that invokes this API.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for User and Roles GetUsersAPI
description: Complete reference of the GetUsersAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/users_external_servers_info.py b/ansible_collections/cisco/dnac/plugins/modules/users_external_servers_info.py
index 536f958c8..0373d2c85 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/users_external_servers_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/users_external_servers_info.py
@@ -24,8 +24,8 @@ options:
- InvokeSource query parameter. The source that invokes this API.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for User and Roles GetExternalAuthenticationServersAPI
description: Complete reference of the GetExternalAuthenticationServersAPI API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_accespoint_configuration.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_accespoint_configuration.py
index 94dee6c5d..6a1cf2946 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_accespoint_configuration.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_accespoint_configuration.py
@@ -238,8 +238,8 @@ options:
type: str
type: dict
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless ConfigureAccessPoints
description: Complete reference of the ConfigureAccessPoints API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_accesspoint_configuration_summary_info.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_accesspoint_configuration_summary_info.py
index 3c2130868..ba43fe052 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_accesspoint_configuration_summary_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_accesspoint_configuration_summary_info.py
@@ -24,8 +24,8 @@ options:
- Key query parameter. The ethernet MAC address of Access point.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless GetAccessPointConfiguration
description: Complete reference of the GetAccessPointConfiguration API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface.py
index ea48c7970..ed933a268 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface.py
@@ -27,8 +27,8 @@ options:
description: Vlan Id.
type: int
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless CreateUpdateDynamicInterface
description: Complete reference of the CreateUpdateDynamicInterface API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface_info.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface_info.py
index d1736fb20..152b1c339 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_dynamic_interface_info.py
@@ -26,8 +26,8 @@ options:
will be retrieved.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless GetDynamicInterface
description: Complete reference of the GetDynamicInterface API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid.py
index eb8790381..f288aaada 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid.py
@@ -81,8 +81,8 @@ options:
description: Traffic Type Enum (voicedata or data ).
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless CreateEnterpriseSSID
description: Complete reference of the CreateEnterpriseSSID API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid_info.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid_info.py
index 8abacd832..b277d03bd 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_enterprise_ssid_info.py
@@ -26,8 +26,8 @@ options:
enterprise SSIDs will be retrieved.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless GetEnterpriseSSID
description: Complete reference of the GetEnterpriseSSID API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_profile.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_profile.py
index 4c696f0d6..7c837cca7 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_profile.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_profile.py
@@ -68,8 +68,8 @@ options:
description: WirelessProfileName path parameter. Wireless Profile Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless CreateWirelessProfile
description: Complete reference of the CreateWirelessProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_profile_info.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_profile_info.py
index f88760c14..fb175dedf 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_profile_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_profile_info.py
@@ -24,8 +24,8 @@ options:
- ProfileName query parameter. Wireless Network Profile Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless GetWirelessProfile
description: Complete reference of the GetWirelessProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_access_point.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_access_point.py
index f8db0233c..d4651745f 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_access_point.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_access_point.py
@@ -47,8 +47,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless APProvision
description: Complete reference of the APProvision API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_create.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_create.py
index d626052a7..84622d990 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_create.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_create.py
@@ -55,8 +55,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless Provision
description: Complete reference of the Provision API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_update.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_update.py
index 07e983f30..c76487739 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_update.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_device_update.py
@@ -55,8 +55,8 @@ options:
type: list
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless ProvisionUpdate
description: Complete reference of the ProvisionUpdate API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_create_provision.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_create_provision.py
index 5a7322ea9..a0627c125 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_create_provision.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_create_provision.py
@@ -78,8 +78,8 @@ options:
description: SSID Type.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless CreateAndProvisionSSID
description: Complete reference of the CreateAndProvisionSSID API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_delete_reprovision.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_delete_reprovision.py
index fed3cb2ca..8d713ce13 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_delete_reprovision.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_provision_ssid_delete_reprovision.py
@@ -26,8 +26,8 @@ options:
description: SsidName path parameter.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless DeleteSSIDAndProvisionItToDevices
description: Complete reference of the DeleteSSIDAndProvisionItToDevices API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_psk_override.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_psk_override.py
index 0afada7c5..163ea45b5 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_psk_override.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_psk_override.py
@@ -34,8 +34,8 @@ options:
type: str
type: list
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless PSKOverride
description: Complete reference of the PSKOverride API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile.py
index 4aa97f651..86c7ad953 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile.py
@@ -130,8 +130,8 @@ options:
*non-custom RF profile cannot be deleted.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless CreateOrUpdateRFProfile
description: Complete reference of the CreateOrUpdateRFProfile API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile_info.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile_info.py
index 722ddfc40..281f87b6d 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_rf_profile_info.py
@@ -24,8 +24,8 @@ options:
- Rf-profile-name query parameter. RF Profile Name.
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless RetrieveRFProfiles
description: Complete reference of the RetrieveRFProfiles API.
diff --git a/ansible_collections/cisco/dnac/plugins/modules/wireless_sensor_test_results_info.py b/ansible_collections/cisco/dnac/plugins/modules/wireless_sensor_test_results_info.py
index 41d727dd5..f316a4602 100644
--- a/ansible_collections/cisco/dnac/plugins/modules/wireless_sensor_test_results_info.py
+++ b/ansible_collections/cisco/dnac/plugins/modules/wireless_sensor_test_results_info.py
@@ -36,8 +36,8 @@ options:
- TestFailureBy query parameter. Obtain failure statistics group by "area", "building", or "floor".
type: str
requirements:
-- dnacentersdk >= 2.5.5
-- python >= 3.5
+- dnacentersdk >= 2.6.0
+- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Wireless SensorTestResults
description: Complete reference of the SensorTestResults API.
diff --git a/ansible_collections/cisco/intersight/CHANGELOG.md b/ansible_collections/cisco/intersight/CHANGELOG.md
index 20035122b..1ed1a5e3e 100644
--- a/ansible_collections/cisco/intersight/CHANGELOG.md
+++ b/ansible_collections/cisco/intersight/CHANGELOG.md
@@ -1,5 +1,8 @@
# cisco.intersight Ansible Collection Changelog
+## Version 2.0.8
+- Fix issue #111 to allow User Policy updates
+
## Version 2.0.7
- Fix issue #101 to support IMM Server Policies.
- Update deploy_server_profiles playbook to support Unassign
diff --git a/ansible_collections/cisco/intersight/FILES.json b/ansible_collections/cisco/intersight/FILES.json
index 32d2289e2..95315ee60 100644
--- a/ansible_collections/cisco/intersight/FILES.json
+++ b/ansible_collections/cisco/intersight/FILES.json
@@ -46,7 +46,7 @@
"name": "CHANGELOG.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e12da2fc549bdadafdd809c920214a67f6fb569d016359e3d81a514d575ded3f",
+ "chksum_sha256": "184c0ed03fe6bbd200481b356aab0a3e8c92fbb08bcf3ca6057c53fac6e65e1d",
"format": 1
},
{
@@ -116,7 +116,7 @@
"name": "plugins/modules/intersight_server_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "957fd1ca38a9a759a24e6b8f0a245be48f711f4ffce14b816799ea06cf2924c8",
+ "chksum_sha256": "4de9635cc96bb2469e78e7b0be17fa85a4692ee3821f3b7d490d9d2376fef6e3",
"format": 1
},
{
@@ -151,7 +151,7 @@
"name": "plugins/modules/intersight_local_user_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7113b95de82882c33ca13674cc7210db4e9d11ffb753a53776dd3f8ced8ab4cd",
+ "chksum_sha256": "37256848d5a123bcae5204c7fcdde7aba8a4eb0f3ca117473cce0a6a418e2373",
"format": 1
},
{
diff --git a/ansible_collections/cisco/intersight/MANIFEST.json b/ansible_collections/cisco/intersight/MANIFEST.json
index 6b211f2c6..990405175 100644
--- a/ansible_collections/cisco/intersight/MANIFEST.json
+++ b/ansible_collections/cisco/intersight/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "cisco",
"name": "intersight",
- "version": "2.0.7",
+ "version": "2.0.8",
"authors": [
"David Soper (@dsoper2)"
],
@@ -27,7 +27,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0a61cf97c55cb7fea120fa4d211ada5f4c5929bd8b617b9213d7b19cc3302c68",
+ "chksum_sha256": "7958d8bc5047610831777f3a56171c17f505aff4bd24acfe861039c60da2c771",
"format": 1
},
"format": 1
diff --git a/ansible_collections/cisco/intersight/plugins/modules/intersight_local_user_policy.py b/ansible_collections/cisco/intersight/plugins/modules/intersight_local_user_policy.py
index 9bb58065d..1124da980 100644
--- a/ansible_collections/cisco/intersight/plugins/modules/intersight_local_user_policy.py
+++ b/ansible_collections/cisco/intersight/plugins/modules/intersight_local_user_policy.py
@@ -197,14 +197,28 @@ def main():
)
intersight = IntersightModule(module)
+ organization_moid = None
+ # get Organization Moid
+ intersight.get_resource(
+ resource_path='/organization/Organizations',
+ query_params={
+ '$filter': "Name eq '" + intersight.module.params['organization'] + "'",
+ '$select': 'Moid',
+ },
+ )
+ if intersight.result['api_response'].get('Moid'):
+ # resource exists and moid was returned
+ organization_moid = intersight.result['api_response']['Moid']
intersight.result['api_response'] = {}
intersight.result['trace_id'] = ''
# get the current state of the resource
+ filter_str = "Name eq '" + intersight.module.params['name'] + "'"
+ filter_str += "and Organization.Moid eq '" + organization_moid + "'"
intersight.get_resource(
resource_path='/iam/EndPointUserPolicies',
query_params={
- '$filter': "Name eq '" + intersight.module.params['name'] + "'",
+ '$filter': filter_str,
'$expand': 'EndPointUserRoles($expand=EndPointRole,EndPointUser),Organization',
},
)
@@ -269,34 +283,18 @@ def main():
'EnablePasswordExpiry': intersight.module.params['enable_password_expiry'],
'PasswordHistory': intersight.module.params['password_history'],
},
+ 'Organization': {
+ 'Moid': organization_moid
+ },
}
- organization_moid = None
- if not user_policy_moid or module.params['purge']:
- # get Organization Moid which is needed when resources are created
- saved_response = intersight.result['api_response']
- intersight.get_resource(
- resource_path='/organization/Organizations',
- query_params={
- '$filter': "Name eq '" + intersight.module.params['organization'] + "'",
- '$select': 'Moid',
- },
- )
- if intersight.result['api_response'].get('Moid'):
- # resource exists and moid was returned
- organization_moid = intersight.result['api_response']['Moid']
- intersight.result['api_response'] = saved_response
- if not user_policy_moid:
- # Initial create: Organization must be set, but can't be changed after initial POST
- intersight.api_body['Organization'] = {
- 'Moid': organization_moid,
- }
- elif module.params['purge']:
- # update existing resource and purge any existing users
- for end_point_user_role in intersight.result['api_response']['EndPointUserRoles']:
- intersight.delete_resource(
- moid=end_point_user_role['Moid'],
- resource_path='/iam/EndPointUserRoles',
- )
+
+ if module.params['purge']:
+ # update existing resource and purge any existing users
+ for end_point_user_role in intersight.result['api_response']['EndPointUserRoles']:
+ intersight.delete_resource(
+ moid=end_point_user_role['Moid'],
+ resource_path='/iam/EndPointUserRoles',
+ )
# configure the top-level policy resource
intersight.result['api_response'] = {}
intersight.configure_resource(
diff --git a/ansible_collections/cisco/intersight/plugins/modules/intersight_server_profile.py b/ansible_collections/cisco/intersight/plugins/modules/intersight_server_profile.py
index 49cdb61b6..8746bdc31 100644
--- a/ansible_collections/cisco/intersight/plugins/modules/intersight_server_profile.py
+++ b/ansible_collections/cisco/intersight/plugins/modules/intersight_server_profile.py
@@ -330,15 +330,15 @@ def main():
if moid and intersight.module.params['boot_order_policy']:
post_profile_to_policy(intersight, moid, resource_path='/boot/PrecisionPolicies', policy_name=intersight.module.params['boot_order_policy'])
if moid and intersight.module.params['certificate_policy']:
- post_profile_to_policy(intersight, moid, resource_path='/security/CertificatePolicies', policy_name=intersight.module.params['certificate_policy'])
+ post_profile_to_policy(intersight, moid, resource_path='/certificatemanagement/Policies', policy_name=intersight.module.params['certificate_policy'])
if moid and intersight.module.params['drive_security_policy']:
- post_profile_to_policy(intersight, moid, resource_path='/security/DriveSecurityPolicies', policy_name=intersight.module.params['drive_security_policy'])
+ post_profile_to_policy(intersight, moid, resource_path='/storage/DriveSecurityPolicies', policy_name=intersight.module.params['drive_security_policy'])
if moid and intersight.module.params['firmware_policy']:
post_profile_to_policy(intersight, moid, resource_path='/firmware/Policies', policy_name=intersight.module.params['firmware_policy'])
if moid and intersight.module.params['imc_access_policy']:
post_profile_to_policy(intersight, moid, resource_path='/access/Policies', policy_name=intersight.module.params['imc_access_policy'])
if moid and intersight.module.params['ipmi_over_lan_policy']:
- post_profile_to_policy(intersight, moid, resource_path='/ipmi/Policies', policy_name=intersight.module.params['ipmi_over_lan_policy'])
+ post_profile_to_policy(intersight, moid, resource_path='/ipmioverlan/Policies', policy_name=intersight.module.params['ipmi_over_lan_policy'])
if moid and intersight.module.params['lan_connectivity_policy']:
post_profile_to_policy(intersight, moid, resource_path='/vnic/LanConnectivityPolicies', policy_name=intersight.module.params['lan_connectivity_policy'])
if moid and intersight.module.params['local_user_policy']:
@@ -348,7 +348,7 @@ def main():
if moid and intersight.module.params['san_connectivity_policy']:
post_profile_to_policy(intersight, moid, resource_path='/vnic/SanConnectivityPolicies', policy_name=intersight.module.params['san_connectivity_policy'])
if moid and intersight.module.params['serial_over_lan_policy']:
- post_profile_to_policy(intersight, moid, resource_path='/serial/Policies', policy_name=intersight.module.params['serial_over_lan_policy'])
+ post_profile_to_policy(intersight, moid, resource_path='/sol/Policies', policy_name=intersight.module.params['serial_over_lan_policy'])
if moid and intersight.module.params['snmp_policy']:
post_profile_to_policy(intersight, moid, resource_path='/snmp/Policies', policy_name=intersight.module.params['snmp_policy'])
if moid and intersight.module.params['storage_policy']:
diff --git a/ansible_collections/cisco/ise/.DS_Store b/ansible_collections/cisco/ise/.DS_Store
deleted file mode 100644
index f79cfc1f5..000000000
--- a/ansible_collections/cisco/ise/.DS_Store
+++ /dev/null
Binary files differ
diff --git a/ansible_collections/cisco/ise/.vscode/launch.json b/ansible_collections/cisco/ise/.vscode/launch.json
deleted file mode 100644
index 306f58eb3..000000000
--- a/ansible_collections/cisco/ise/.vscode/launch.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- // Use IntelliSense to learn about possible attributes.
- // Hover to view descriptions of existing attributes.
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": [
- {
- "name": "Python: Current File",
- "type": "python",
- "request": "launch",
- "program": "${file}",
- "console": "integratedTerminal",
- "justMyCode": true
- }
- ]
-} \ No newline at end of file
diff --git a/ansible_collections/cisco/ise/.vscode/settings.json b/ansible_collections/cisco/ise/.vscode/settings.json
deleted file mode 100644
index 4f6146612..000000000
--- a/ansible_collections/cisco/ise/.vscode/settings.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "esbonio.sphinx.confDir": "",
- "ansible.python.interpreterPath": "/usr/local/bin/python3.10",
- "workbench.colorCustomizations": {
- "activityBar.activeBackground": "#65c89b",
- "activityBar.background": "#65c89b",
- "activityBar.foreground": "#15202b",
- "activityBar.inactiveForeground": "#15202b99",
- "activityBarBadge.background": "#945bc4",
- "activityBarBadge.foreground": "#e7e7e7",
- "commandCenter.border": "#15202b99",
- "sash.hoverBorder": "#65c89b",
- "statusBar.background": "#42b883",
- "statusBar.foreground": "#15202b",
- "statusBarItem.hoverBackground": "#359268",
- "statusBarItem.remoteBackground": "#42b883",
- "statusBarItem.remoteForeground": "#15202b",
- "titleBar.activeBackground": "#42b883",
- "titleBar.activeForeground": "#15202b",
- "titleBar.inactiveBackground": "#42b88399",
- "titleBar.inactiveForeground": "#15202b99"
- },
- "peacock.remoteColor": "#42b883"
-} \ No newline at end of file
diff --git a/ansible_collections/cisco/ise/FILES.json b/ansible_collections/cisco/ise/FILES.json
index 4c183e093..68d896522 100644
--- a/ansible_collections/cisco/ise/FILES.json
+++ b/ansible_collections/cisco/ise/FILES.json
@@ -8,13 +8,6 @@
"format": 1
},
{
- "name": ".DS_Store",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "437cf9da8611bcc8837aef2444e9e00fc44f8f071f750224be185a74168f2e5f",
- "format": 1
- },
- {
"name": "LICENSE",
"ftype": "file",
"chksum_type": "sha256",
@@ -36,13 +29,6 @@
"format": 1
},
{
- "name": "plugins/.DS_Store",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "389b6b15b162e5db97c1c6d4ddc0f1161590c016eb06e49734d10373aabc3c56",
- "format": 1
- },
- {
"name": "plugins/doc_fragments",
"ftype": "dir",
"chksum_type": null,
@@ -6269,7 +6255,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1193073224fb370f3d397b81858a7bda59568a510fa6c8e925f2b29479326d20",
+ "chksum_sha256": "46af54b2672389b7a9e635b04c480f0697afee607e2e84199b8c5777e1018017",
"format": 1
},
{
@@ -6280,6 +6266,13 @@
"format": 1
},
{
+ "name": "Pipfile",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "17a27a28cca40c85447113986ef3f6491f1e5cae1a17d460adfda229f5296969",
+ "format": 1
+ },
+ {
"name": ".gitignore",
"ftype": "file",
"chksum_type": "sha256",
@@ -6341,27 +6334,6 @@
"chksum_type": "sha256",
"chksum_sha256": "1f103c6a9dd07cd13a9a6f17ace6b813f47747eb9cb7e00488cb2073caaf91bb",
"format": 1
- },
- {
- "name": ".vscode",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
- "format": 1
- },
- {
- "name": ".vscode/settings.json",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "ff058b88424cd36c92374f3465470d0c24191746d224d3729d623881464c651e",
- "format": 1
- },
- {
- "name": ".vscode/launch.json",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "6a62b2b5cbd6e0edb4942e59fc4451e2e59f12472965990a24029ae24264fcb2",
- "format": 1
}
],
"format": 1
diff --git a/ansible_collections/cisco/ise/MANIFEST.json b/ansible_collections/cisco/ise/MANIFEST.json
index 81f5e1e9f..cd7253ccb 100644
--- a/ansible_collections/cisco/ise/MANIFEST.json
+++ b/ansible_collections/cisco/ise/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "cisco",
"name": "ise",
- "version": "2.8.0",
+ "version": "2.8.1",
"authors": [
"Rafael Campos <rcampos@altus.cr>",
"William Astorga <wastorga@altus.cr>",
@@ -21,7 +21,7 @@
"license": [],
"license_file": "LICENSE",
"dependencies": {
- "ansible.utils": ">=2.0.0,<4.0"
+ "ansible.utils": ">=2.0.0,<5.0"
},
"repository": "https://github.com/CiscoISE/ansible-ise",
"documentation": "https://ciscoise.github.io/ansible-ise/",
@@ -32,7 +32,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "43d93ef4489b0ae7fbc8e57931e7dece5b2d87c9e3cdbae66359cce957ce2875",
+ "chksum_sha256": "c0a3e92ae466e59573dc00981d4201e0f64a87340c6ddbbcbdd2a58ed18f8a0a",
"format": 1
},
"format": 1
diff --git a/ansible_collections/cisco/ise/Pipfile b/ansible_collections/cisco/ise/Pipfile
new file mode 100644
index 000000000..2bc8501b5
--- /dev/null
+++ b/ansible_collections/cisco/ise/Pipfile
@@ -0,0 +1,13 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+ciscoisesdk = ">=2.1.1"
+requests = ">=2.25.1"
+
+[dev-packages]
+
+[requires]
+python_version = "3.9"
diff --git a/ansible_collections/cisco/ise/changelogs/changelog.yaml b/ansible_collections/cisco/ise/changelogs/changelog.yaml
index 929f94bb5..6ecbe5f31 100644
--- a/ansible_collections/cisco/ise/changelogs/changelog.yaml
+++ b/ansible_collections/cisco/ise/changelogs/changelog.yaml
@@ -976,4 +976,10 @@ releases:
changes:
release_summary: Changes the minimum supported version of Ansible to v2.14.0
minor_changes:
- - Changes the minimum supported version from Ansible v2.9.10 to v2.14.0 \ No newline at end of file
+ - Changes the minimum supported version from Ansible v2.9.10 to v2.14.0
+ 2.8.1:
+ release_date: "2024-04-02"
+ changes:
+ release_summary: Changes the requirements of ansible.utils to allow > 4.0.0 versions.
+ bugfixes:
+ - ansible.utils changes to `">=2.0.0,<5.0"` in galaxy.yml dependencies. \ No newline at end of file
diff --git a/ansible_collections/cisco/ise/plugins/.DS_Store b/ansible_collections/cisco/ise/plugins/.DS_Store
deleted file mode 100644
index 874d3d2c6..000000000
--- a/ansible_collections/cisco/ise/plugins/.DS_Store
+++ /dev/null
Binary files differ
diff --git a/ansible_collections/cisco/meraki/.vscode/settings.json b/ansible_collections/cisco/meraki/.vscode/settings.json
deleted file mode 100644
index a7d0fc7b7..000000000
--- a/ansible_collections/cisco/meraki/.vscode/settings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "esbonio.sphinx.confDir": ""
-} \ No newline at end of file
diff --git a/ansible_collections/cisco/meraki/FILES.json b/ansible_collections/cisco/meraki/FILES.json
index 8de741f1a..b254fc063 100644
--- a/ansible_collections/cisco/meraki/FILES.json
+++ b/ansible_collections/cisco/meraki/FILES.json
@@ -109,7 +109,7 @@
"name": "plugins/action/devices_live_tools_ping_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1f55d548e09211d2af66832ca498eb5ec21c59c4828aa08ec9e62acd10204a7",
+ "chksum_sha256": "0305a1dbac1fd49c393527d3520ebc896f400f0375c05090f86c064426b92535",
"format": 1
},
{
@@ -123,14 +123,14 @@
"name": "plugins/action/networks_clients_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "91e2ab89a2bf528e5b1e23fe507761bcedda663fa52c0521aed035d48bfd07a8",
+ "chksum_sha256": "843d03abf712b294d979f07b2194405d60846d0b0ef40a2f47be0731a5b2d022",
"format": 1
},
{
"name": "plugins/action/devices_camera_wireless_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4be5ea964ca1145f37c501744ac2cfa367e1181e91182f1adf3f376467a12356",
+ "chksum_sha256": "777067a93b237d6eff35c1cf221b57caccbacebbdba0c3b66950e9040991c950",
"format": 1
},
{
@@ -144,7 +144,7 @@
"name": "plugins/action/networks_cellular_gateway_dhcp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dc6313fe7ff6e7650807fe49d1ed3f48912f9156a4f85d12827f9735e0a1a28c",
+ "chksum_sha256": "9daaf09d4cf66158843fced90e83b6b5770e3e69e11b7379cff004e2f367593f",
"format": 1
},
{
@@ -165,7 +165,7 @@
"name": "plugins/action/devices_switch_ports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "48fabca42a2d562cbab45f416fda7141eb993c8f7ccb30a656697a05b2120e3a",
+ "chksum_sha256": "dae2abc4c84fc075a87f97e1941c73d218d68428471980eb6319247281eaf839",
"format": 1
},
{
@@ -186,7 +186,7 @@
"name": "plugins/action/organizations_adaptive_policy_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5fc0c7c7b323aa1f3a9aa72e9a07e1e866421bc1c496c390d9d129375b0b58d2",
+ "chksum_sha256": "fcbd4d25d8db4c6b4f4e2cea0de85df6b99572a23ca581e100fcc648e95951d2",
"format": 1
},
{
@@ -242,14 +242,14 @@
"name": "plugins/action/networks_wireless_ssids_eap_override.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "75be7d33fe28f5279a2fc700f94416a21bbb1629aa187570f65f178dacb8b73d",
+ "chksum_sha256": "bb4f2d3f2cdd0696677c2631617428b45ca192254cb1160d3ce9470fbf43ede0",
"format": 1
},
{
"name": "plugins/action/networks_wireless_ssids_device_type_group_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a503d4061d1f8765e6277d1edbc1dc943d54e12da66318bcb3b5eef72566711",
+ "chksum_sha256": "32fbe5fde3de7c9c3244f1df792bc416f9e75f8954ea64859f8ac9892c5711cc",
"format": 1
},
{
@@ -263,7 +263,7 @@
"name": "plugins/action/devices_cellular_sims.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "345e4368244cb62e1ebf31dc4e2176d9a90d0ef27e4641eaec2e8ea747945b1c",
+ "chksum_sha256": "f9d27903b41dc552b75f048134a1dab27805b9a59498c94c4191715811c8c2fc",
"format": 1
},
{
@@ -288,6 +288,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_appliance_traffic_shaping_vpn_exclusions.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5a9a4db2b17ad98b95ebbbe026819160e16608bd0b919a976371b9ae76ff205e",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_summary_top_switches_by_energy_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -298,14 +305,14 @@
"name": "plugins/action/networks_appliance_vlans.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c7384adc08b6b6dd9f90feff6e01fbd6b7525f21c648cbd8caac891c649e6854",
+ "chksum_sha256": "c761dfdb7567afd656b5788e4370d50eb72b6a9e94932379a1042f357ca249d5",
"format": 1
},
{
"name": "plugins/action/networks_netflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "327806d70a79c91d0151f537f560862b4133e2cbd1163a6ca762c6425f4520c9",
+ "chksum_sha256": "5e45703f236953211adcf1a0567d2b304ad4ca12415a8c4564997dd7b42f280a",
"format": 1
},
{
@@ -351,6 +358,13 @@
"format": 1
},
{
+ "name": "plugins/action/devices_live_tools_throughput_test.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "71d02ad300aec8b1bd7313503a1fd0d7f1040507c7608c9eab028cc630ab9e8b",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_clients_bandwidth_usage_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -372,6 +386,13 @@
"format": 1
},
{
+ "name": "plugins/action/devices_live_tools_cable_test.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "79dac59cb5971ee77aa180a65edfc2860395b0babd61c84d6e244021ec33b068",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_licenses_overview_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -379,6 +400,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_wireless_ethernet_ports_profiles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e61420642f6322fc4fb8970183a95fbb6a76883b1f51036d68ad7209697d1c6d",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_vpn_bgp_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -389,7 +417,14 @@
"name": "plugins/action/networks_bind.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "61d1573547c60fcedaad4fd5a9ef27fdbe0a65e432ada54f3b4af7d482e097f1",
+ "chksum_sha256": "8a6b18d9f62d7da215dcfbc1b4b5ea08a49eba0dfd07dcc6a47cbb05693f6bd4",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/networks_wireless_ethernet_ports_profiles_set_default.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "756b1e454b52a886510d9a355daed1f92c81731a641aa290d5a2a414a06fca2b",
"format": 1
},
{
@@ -403,7 +438,7 @@
"name": "plugins/action/networks_traffic_analysis.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b204be704b7bbff6f6175f116facf5918fc840452d5dc57776a3ae9c4a93cea",
+ "chksum_sha256": "d390b9cbabc169966f2898f1ecefa475d42a0a6a22f1620669452e69e054409a",
"format": 1
},
{
@@ -445,7 +480,7 @@
"name": "plugins/action/networks_wireless_ssids.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f873d232d527b0b3f700a7e5dad3bbe5aa87c09a739bfd687e2c9bfdc847d77",
+ "chksum_sha256": "73d65b8e5f3dec87baf7749cc38cf7336e21df1e33dc93b1b4b8ea553f6ce5ec",
"format": 1
},
{
@@ -466,14 +501,14 @@
"name": "plugins/action/networks_firmware_upgrades_staged_events_rollbacks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d24d826b4e3d4dfd3117363264e43d722ebca07955bb6491fc18f92f2ac9285c",
+ "chksum_sha256": "4e002d75fcb479e6a5a5eae6f34df6b90d54187bffbd676d35624926a8840aec",
"format": 1
},
{
"name": "plugins/action/networks_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a56a03e8a399d3bcf4d9e4d11f672c636d36ac6b6780078265ad2a437cad6d42",
+ "chksum_sha256": "9710ed184638be99ab6db382fe1f55946710c7b1810c08d409f7a17a0ee4ff65",
"format": 1
},
{
@@ -494,14 +529,14 @@
"name": "plugins/action/networks_camera_quality_retention_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "60cee9e90932c52d4a8bcfdedb2144adc35e777152cb8849dff6c6c45eb64376",
+ "chksum_sha256": "13a0b1c9af236e07c7374806a24e7bc21821c982bf31b790de1ea4fffce3e4b6",
"format": 1
},
{
"name": "plugins/action/organizations_early_access_features_opt_ins.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d44b97307f31a3670ded279b646350185bcb2cda7a6c40899dbcd5984950b800",
+ "chksum_sha256": "5aca094ab1a817a0bc44a7e0ac788a331b0f58c1149c3d2f6202aa6ac935adfc",
"format": 1
},
{
@@ -515,21 +550,21 @@
"name": "plugins/action/devices_cellular_gateway_lan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a980fec69c4c3cbed2a54d377f94f41fd1a078e7b8c7834c51a363f84985aacb",
+ "chksum_sha256": "04b2352c171f904a0cc0e52208d8f9d9b1ce436e8935eb55c8e736cf0e23d872",
"format": 1
},
{
"name": "plugins/action/organizations_alerts_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "446f3e6c23a53f81310951278cfd923b337c3156789f5eff55d0b210e903a7ae",
+ "chksum_sha256": "2c27c697ee3ad4d902882482d857490b96b4c3d404d556f15ea1109f062e1e98",
"format": 1
},
{
"name": "plugins/action/networks_group_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "816083c2545087118d12104c57f51e23c34a27ee918ad811b808e1c28dc10435",
+ "chksum_sha256": "8c5586b9b6e188921139fbfcc67d6bff020bd454a34b0cb90a76acc634a065e6",
"format": 1
},
{
@@ -547,17 +582,24 @@
"format": 1
},
{
+ "name": "plugins/action/administered_licensing_subscription_subscriptions_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2cd49df297191ec6b00e7d750e1c68d7857ed8d40407e06dc4f25dea45b2297e",
+ "format": 1
+ },
+ {
"name": "plugins/action/devices_switch_routing_static_routes.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0777b51b7749d7d3860b011cdb077710c54c980956e777dd0304246d15b76d44",
+ "chksum_sha256": "c08a1eb5e12539535e65491b4ecf244e0d8bf88ec4ad1a9302e5d851633a1b46",
"format": 1
},
{
"name": "plugins/action/organizations_openapi_spec_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e0b214cd63d937c2ab16c8ec4bf1bd35f13ff36a29c2f78ac7eb489ac835399b",
+ "chksum_sha256": "ecb6affb8bc79d30cebf8f3b85583f5b0b4bb4ca1efb400cc50bd9e6ec49f11a",
"format": 1
},
{
@@ -613,7 +655,7 @@
"name": "plugins/action/networks_wireless_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "98f02332e0e8aa8cf8ae3cd757c324892a8c391a961fa8eb272164fc48a79cae",
+ "chksum_sha256": "ac806d38e4f3e222bbce3002fbc012b50d7000ebfd3a7ab6542ca597af332191",
"format": 1
},
{
@@ -627,14 +669,14 @@
"name": "plugins/action/networks_switch_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee6bbafb359c99d3948b376b027eb50c30ef4a97415499363f721a104ce5585b",
+ "chksum_sha256": "73864954874b2cbcb8cbeffef89d34b2f588148ed4a8cf41c50b6e61ec547d8b",
"format": 1
},
{
"name": "plugins/action/networks_switch_dhcp_server_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "393642e80f78628ce071ae196f48d76330e7051e8dbab6ddc32b7a429a0db1e4",
+ "chksum_sha256": "9582a8d31d544f395d5a50d0076185c5c0dd170b5924088b5f5cdd9f76154105",
"format": 1
},
{
@@ -676,14 +718,14 @@
"name": "plugins/action/networks_sm_devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd7f3792dd73ed21decdae15896d7ea8a60bbb8bd7f8a3cb3e8cef9858cf24a2",
+ "chksum_sha256": "407513c3d238200643e1400e5cf8456a2e7b8ea5552736fdf4ca88215164bcb8",
"format": 1
},
{
"name": "plugins/action/networks_wireless_bluetooth_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "30516cd8b037cb951c6a1dbc69fcac6e3a506aaef0edcfaca122175b08966a09",
+ "chksum_sha256": "0f0e3d19016c64f50fbe87ea01ba43558286602ffe9466f2f46c6e89c1a5b0fa",
"format": 1
},
{
@@ -715,6 +757,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_appliance_rf_profiles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "416f032fe7e639c3b017aee5196234c69f00bc4ba261bfff2a1e67e06737ee3a",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_saml_roles_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -767,7 +816,7 @@
"name": "plugins/action/networks_appliance_vpn_bgp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "285e41b4b628c5805f5f664e49473dac6ecdbd9d4a767a0862c9f30e8ba75c2b",
+ "chksum_sha256": "a63dde24c5b08eb8a4c473ebf04f22931e3b9da834389eaf44a899222d3eedb2",
"format": 1
},
{
@@ -781,7 +830,7 @@
"name": "plugins/action/devices_blink_leds.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28d16ffe598d82bb91b1fd84f46977d416921e4c5771333cd00a14fe4b598f69",
+ "chksum_sha256": "a16973cd9acab6937163aca421c64a561bc5069b986b9ef2192744f211ffeedf",
"format": 1
},
{
@@ -809,21 +858,21 @@
"name": "plugins/action/networks_wireless_rf_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76bbe3a233181d0984b708b5e974bf1f4d30efbc818b6ae89cd1cfac182c39d0",
+ "chksum_sha256": "a3991fc97a830ea6898fafe95f523c5bc0f8aab902866dbb6a5e5a83b7579d80",
"format": 1
},
{
"name": "plugins/action/devices_camera_sense.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19a130eebea23c61ed66eca4c2a75d1f2b2ecd4600451b6c5e58d3d908e1d952",
+ "chksum_sha256": "46e6eb26fd9babd5c5af3e9c969ee0c1ee8f7067106e339c671fed6892430831",
"format": 1
},
{
"name": "plugins/action/organizations_inventory_onboarding_cloud_monitoring_networks_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab0b0b788ad1a766e6c555772a0cb34d233d16a3a522f5793af2917e0ef92e9b",
+ "chksum_sha256": "03504cbbd26819a6e258ba9afee2d073cc0908291154c819821b6f853627b65e",
"format": 1
},
{
@@ -834,6 +883,13 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_camera_permissions_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "754da51029ac942d3930fe5e53ff50977278c917e79d7fe277edf509e7a61ef7",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_switch_ports_by_switch_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -844,7 +900,7 @@
"name": "plugins/action/networks_switch_alternate_management_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8bcf9922f13f03eebaef7af2ddd05c64a14e3b9cfd6a7f3d35f8beb58bfad97d",
+ "chksum_sha256": "5925677b320733154104c00b8ec7cc4a355eb41b508c55bf54431d5bd296f429",
"format": 1
},
{
@@ -904,10 +960,17 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_wireless_devices_packet_loss_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ad42c4c0af3d6fe409b20190e319e0e0b875d7aa70f6fffb150c081686a3bbaa",
+ "format": 1
+ },
+ {
"name": "plugins/action/devices_camera_generate_snapshot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28ff182ebdc9409322811d4215d98b63677fcc9fc354658e56f4b58113b7db84",
+ "chksum_sha256": "47100426ff418d7d14c6b86387bb1fc855de68766ec882a318758caae31d473a",
"format": 1
},
{
@@ -942,7 +1005,7 @@
"name": "plugins/action/networks_wireless_ssids_hotspot20.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c0ea0dab98a510c147ec75817befd02852428fec3c66d266c356177f17fab9e",
+ "chksum_sha256": "eed447ba0b5c6e2647a68288de2d03f9be927b7f6a3469e5130769bc3de926a7",
"format": 1
},
{
@@ -977,7 +1040,7 @@
"name": "plugins/action/networks_wireless_alternate_management_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "27345a94623c7200cc793377365b5240ae410f63ce3ea6e7efdcf82fca333f19",
+ "chksum_sha256": "f635b1ccefe9c05e1eb61326a946c4fc20077e8577746f085b4c2446b1acccf4",
"format": 1
},
{
@@ -991,7 +1054,7 @@
"name": "plugins/action/networks_sm_devices_move.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b93d6147029dc41ed78f8e7a4d5f29b9c67350d718f4a7fb3d079c648ac53af9",
+ "chksum_sha256": "3f84a597dcd9676e1f405e150f3fea914950dcaab6e7835e6c0e7529a82d3142",
"format": 1
},
{
@@ -1023,6 +1086,20 @@
"format": 1
},
{
+ "name": "plugins/action/devices_live_tools_cable_test_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "044ab01319420b7fb6f989a5435115918bd59fad7b6d705670ade10667efdc16",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_sm_sentry_policies_assignments.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "59bdc154ed08d86acb03078cd6f9f20bd69949ba85a2f3f60154f40aec8b5772",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_wireless_latency_stats_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1037,6 +1114,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_sm_devices_reboot.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3ef6b74c75867e6bd18e1d4312b42ac54fe776c31670041cefab403f202aaa36",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_wireless_ssids_firewall_l3_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1051,6 +1135,13 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2e053e8a6a83efd0b0ef268b16ed73880e4b0b788f447645ed8136052df4b02f",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1072,6 +1163,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_wireless_ethernet_ports_profiles_assign.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a30cb6d251c0d50c204699633bead086f9b1346ea852cf0acc75ab7ac6ded9bb",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_adaptive_policy_groups_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1082,7 +1180,7 @@
"name": "plugins/action/organizations_firmware_upgrades_by_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "86a29f2f63ff2e802d981239a781f2c31cebc52168814ac67ac16972f941f1f3",
+ "chksum_sha256": "ba836b95647f419df5343966a1dec6f02db423d9fd94ed1ff3669fbc992c50b5",
"format": 1
},
{
@@ -1117,14 +1215,14 @@
"name": "plugins/action/networks_switch_stacks_routing_static_routes.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "618ffc3af9c960daa0f8656389450a4d769d5a8f69552270eaae70b1761f5140",
+ "chksum_sha256": "3c14eebce4ac06b7599c626e81225cb8cd752cad26ea290540e4be5e9731d071",
"format": 1
},
{
"name": "plugins/action/networks_appliance_security_malware.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "caca343b6fa3ba13a8a0e8657cbf3e4d53946a46203f648e9bfa9218fa320c7c",
+ "chksum_sha256": "b389c716d51424a6cd25d265c4606c8c789e1d5b01f77beb25596eaa693e4ac2",
"format": 1
},
{
@@ -1152,7 +1250,7 @@
"name": "plugins/action/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "33189281debc8dff9a2799b8159b13ed803fd35c6a671fdb5b5cd4b71c6c377d",
+ "chksum_sha256": "83fb1385c92624d88cce83bc273654fc35d9c526bba17b8f32fbe5434afb9cc8",
"format": 1
},
{
@@ -1173,14 +1271,21 @@
"name": "plugins/action/organizations_saml_roles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6aaddd387d31bfac6f4c20358436aa8e3cd0915aa362d06c1da349834b73562",
+ "chksum_sha256": "484ebc0b239bacc37d64a8ddca1dd966848c31f3679d05f56b1d7784a028fbd5",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/networks_vlan_profiles_assignments_reassign.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7c965303108f4a8880cce3f608cb790b46c7df4bc4c32cceea48a4f111a3f83b",
"format": 1
},
{
"name": "plugins/action/networks_sm_devices_lock.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1eb87a04f06d3c5cfcdfea0415a6bccacc8d220ba5dfbbce2560b453587d7c3b",
+ "chksum_sha256": "c2087fed2683e46f6b642fce237067aa40ddc0d730d990f6cb1adaee83fec1ca",
"format": 1
},
{
@@ -1194,14 +1299,14 @@
"name": "plugins/action/networks_sm_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f1fde702fbe5f3ac739463087c647fc61b30ed8dec2acdac46edbe1e5d7aab98",
+ "chksum_sha256": "6c304c71e7dd2cf752cca86b9866f664ca7625a55af10fd1dce422df177b7275",
"format": 1
},
{
"name": "plugins/action/networks_wireless_ssids_vpn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f1df4f365093c1d959fe61ed1c0c1d75edae426f7a971eac2fe9ea24ceee81ba",
+ "chksum_sha256": "c5f61f99085ce6380a915f26db4d773c80f7ebb559d6c8048e28e317e94800c9",
"format": 1
},
{
@@ -1222,7 +1327,7 @@
"name": "plugins/action/networks_appliance_traffic_shaping_custom_performance_classes.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9dc16f38dcb94dab74df94ac706d5fbb5a57a7d40f31c5683ceb642f08a48ee7",
+ "chksum_sha256": "a5f5a03b7e558235143f968a9ded6c8b540791169077af55d10550c2ada59fb4",
"format": 1
},
{
@@ -1243,14 +1348,14 @@
"name": "plugins/action/networks_webhooks_http_servers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f7e5892e89af829437cb386299b555b6386a5f37a3e213d523aca9f81e8f1ff9",
+ "chksum_sha256": "2c361e2bbed0f92a7956c09dbd8f3db22cdf02712afb29a3406ec32622a6f4c2",
"format": 1
},
{
"name": "plugins/action/organizations_config_templates_switch_profiles_ports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cdc187dcb687420633a80777efa76f2cd413fa30f4772848f6d910365f7cc30c",
+ "chksum_sha256": "5680de144715e3b45d1a88d25c44d78d7063a4b8f537e829a17e5b78da0d593e",
"format": 1
},
{
@@ -1264,7 +1369,14 @@
"name": "plugins/action/organizations_inventory_onboarding_cloud_monitoring_export_events.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "66443417f8f2153e201139e8358788d28bbdc09f0bedb5f22ae03758aef8a6bb",
+ "chksum_sha256": "e26476935c85571d37f691d79a24873cc712232ab0f4913537c7370238b625df",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_camera_boundaries_areas_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "dd3670f3b5298a47f324b8184442f3f4677e04e695776aa2784416a0481320a6",
"format": 1
},
{
@@ -1292,35 +1404,42 @@
"name": "plugins/action/networks_appliance_traffic_shaping_uplink_selection.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82a4ff4d864a47c443301763130cd570c988f4ff87911d8c319e7344de9b855c",
+ "chksum_sha256": "5f394df5adcaea7d67b45a6a04ff4d175b7bf8a627b860768593a56f5b794917",
"format": 1
},
{
"name": "plugins/action/networks_sm_devices_wipe.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a5d0b9da224b9904cba2ea5922287414570ad7928f44f1067af591a49f525054",
+ "chksum_sha256": "0522106f60eafaa7010f9147ba29a12027b68476a2b5c5f9b61b023783b9301d",
"format": 1
},
{
"name": "plugins/action/networks_appliance_content_filtering.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cee24dee36495de5c8f7f7ebeff3278289d5b8a9e4a43bf50249347a1da57236",
+ "chksum_sha256": "c1df30fbb991becc3279f1adc45ad819bfff33e48774bf9562166ed6d8b17b64",
"format": 1
},
{
"name": "plugins/action/devices_switch_routing_interfaces.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "adc527362d40d1ba143f0abeaf564cd4952c20bebed859df5c391c1b2d9837f7",
+ "chksum_sha256": "b4d9cb0befc9aeb9f2ff6b248db60f066fe53e5626acdf00b6ffe6cd5322fe69",
"format": 1
},
{
"name": "plugins/action/networks_wireless_ssids_bonjour_forwarding.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5416e12dc36a39b5b5576ce36fbf0de83cdca996495da2e28022d3b0f7e55971",
+ "chksum_sha256": "5a20953c7aea7a955b2b652a9033448ece79e2863dc64384b2057aa1c231b978",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_camera_boundaries_lines_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "15e50b102e4dd509cf288d204e17a2a4cacf3df0c034f459f1fdece35e8eee04",
"format": 1
},
{
@@ -1397,7 +1516,7 @@
"name": "plugins/action/networks_switch_routing_ospf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04d9dfdbc320038b416600bd9a5153dea6b6fe0c9e8f379e3c82c6d5fc9271a7",
+ "chksum_sha256": "4f094f3881f5f2b9671a97f10a64fff80208185cf5d09dff61708b01526ccbc6",
"format": 1
},
{
@@ -1418,7 +1537,14 @@
"name": "plugins/action/organizations_branding_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc6d01f6590205772e571a73073f7d9b0848deebe1860c0bb4fa184bd5917a78",
+ "chksum_sha256": "31865e7abbcfd1a379687e302500d265dd534ce338a7ed0db2b3b90765febe6c",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_wireless_devices_packet_loss_by_client_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b90dfccc35f2739cbf4b803ccbef197377af320cbf9390316ee4b07bcd065292",
"format": 1
},
{
@@ -1432,7 +1558,7 @@
"name": "plugins/action/networks_cellular_gateway_subnet_pool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1dde15c4b309aa624bb77e22a0b6378584bb2cfe760b50d879ac87f071c0de4",
+ "chksum_sha256": "698c2073767ff9b45b5dadf364a6c6454e51e843fa7eec422d22d130720703c1",
"format": 1
},
{
@@ -1551,7 +1677,7 @@
"name": "plugins/action/networks_alerts_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "45f2db3b35096951b61847f3385fea34191886d7646f117019354cdb23664ac3",
+ "chksum_sha256": "b01670216f41a4ae23016026aa8e1581c6a86c7fae56fba935b9ad0ea37d6cb5",
"format": 1
},
{
@@ -1604,6 +1730,13 @@
"format": 1
},
{
+ "name": "plugins/action/administered_licensing_subscription_subscriptions_compliance_statuses_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5c92d3a89dbc02d5eff0be27a54a6b823954fcbc010c3f8c9cde684da310ba07",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_summary_top_clients_manufacturers_by_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1628,7 +1761,7 @@
"name": "plugins/action/devices_camera_custom_analytics.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c61b040eef23a19c4c923dd573f737c42e796089a9866889857e53eac5da8b35",
+ "chksum_sha256": "0210beaf6e41b8170f89505bed3cb2bac8e23cc4395142eae1369a6d9a825982",
"format": 1
},
{
@@ -1639,6 +1772,13 @@
"format": 1
},
{
+ "name": "plugins/action/administered_licensing_subscription_subscriptions_bind.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9d0848fc63669c2b22be3f24bb9655befb06dd94226a9f636a14708db17f121f",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_firewall_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1663,14 +1803,14 @@
"name": "plugins/action/organizations_saml_idps.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aebe2bf7b5b1688821632f814ff87161682b88afa7c94f65decd9a24d9b9196a",
+ "chksum_sha256": "f6c9cd71d955d453ee5a93a42952800be8cbb4c378602f040a6e7471925d7876",
"format": 1
},
{
"name": "plugins/action/organizations_config_templates.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d3585c841dfee532d3c14aaf270c0eea25d0eccb88c9117149d18c3fb5b3943b",
+ "chksum_sha256": "dfb94e7a2d31cf4cde7ce263393b54b809332b3694d15f9606ff9af949882935",
"format": 1
},
{
@@ -1712,7 +1852,7 @@
"name": "plugins/action/organizations_policy_objects_groups.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e8c0ef146477202f9234ccc68ef14031af671cfcd65f59ac87868a7f707991d",
+ "chksum_sha256": "eba12e7942d11ed86d4f0ce5cee4c152e7611a6e312bca29a87a255173fef4dc",
"format": 1
},
{
@@ -1740,7 +1880,7 @@
"name": "plugins/action/networks_switch_qos_rules_order.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee61133cd80644b44b9c6bc2b822cd0366de35d5ba5608f8f593331542ae12d7",
+ "chksum_sha256": "cf745cdab8e0411d902ef2083575945e41da6e68826edce49106af8bc0785235",
"format": 1
},
{
@@ -1754,14 +1894,21 @@
"name": "plugins/action/devices_live_tools_ping.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "34377f9169e9be60bb2e85649aa13c412d9bae99ac91a0696055e048c42cddda",
+ "chksum_sha256": "3693d9e35027a400d4413e60642dbd1b45c03bd4ea7f7e5551d1d791bee3d3b1",
"format": 1
},
{
"name": "plugins/action/networks_meraki_auth_users.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "594c78ccf4c0d793f306d36f0267e3911bb7a891f3afaba4c9f27f4fdd5f9fa9",
+ "chksum_sha256": "c30b5fa4503d7e62dc2ea8485d2b1ef8db2b13cf772494ab96ec913be56d9787",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_camera_roles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ca305cf3d96fc4ef3495ba70a5c356fc3d896cc285a7327e157afbc778c8899e",
"format": 1
},
{
@@ -1810,7 +1957,7 @@
"name": "plugins/action/networks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "316e6e25a0f1f5655e6e6e720c1dc910cbb237c51864d57518b42192994d7772",
+ "chksum_sha256": "060a0905a7a9f6d28732177152e285077e86478757f70891072ac4dd2a5663ac",
"format": 1
},
{
@@ -1828,6 +1975,13 @@
"format": 1
},
{
+ "name": "plugins/action/devices_live_tools_throughput_test_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "044ab01319420b7fb6f989a5435115918bd59fad7b6d705670ade10667efdc16",
+ "format": 1
+ },
+ {
"name": "plugins/action/devices_camera_sense_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1866,7 +2020,7 @@
"name": "plugins/action/networks_switch_stacks_routing_interfaces.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e537e725ae27c7c6ee1ad1fab3b2a85bd7ff3109d8ca48b94f1380bd82d9e4b1",
+ "chksum_sha256": "ff9ecb15042c54c28c2350a62960c65ca13201505f3beae3ea20eecf7b340fa6",
"format": 1
},
{
@@ -1908,7 +2062,7 @@
"name": "plugins/action/organizations_claim.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aaab0e0d170a43efcfa77009ee99707ac0d96cef2167d1031243f267685a50ce",
+ "chksum_sha256": "1bff3668070c43abec6348f989d2514b0812479c4897ac88c857bc468c42fd4d",
"format": 1
},
{
@@ -1926,10 +2080,17 @@
"format": 1
},
{
+ "name": "plugins/action/administered_licensing_subscription_subscriptions_claim.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c7cf4d0859068ab61b35cf8ab0c224b7f3647bd15e81b12629a76a152b737811",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_ssids.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2ae6f719332e436324ad99a1c167ebd7e7dc73d56c0c1622f94d28659710a2d9",
+ "chksum_sha256": "bd0325343811e3c23d4a7de7d869a65cf213c5682eec5829800727ae445e9620",
"format": 1
},
{
@@ -1947,6 +2108,13 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "804a2f13c4a38a6aa59f3179cc3d7545691581689ac06fd1a8b2818eb91ece4b",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_uplinks_statuses_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1954,10 +2122,17 @@
"format": 1
},
{
+ "name": "plugins/action/devices_wireless_alternate_management_interface_ipv6.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "135c68c6e13daf685d2b0a88972313e8c8b2529f55c8b3b7d48c90a214ea9f35",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_single_lan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9bb51fb3995a25a9fd9418067aa16d0733bcee21046604046257195f2642c4ed",
+ "chksum_sha256": "481e89b4146b20348a7c1ddb05014406417ea0b76d6388201fd4a7d4ad1e2277",
"format": 1
},
{
@@ -1978,7 +2153,7 @@
"name": "plugins/action/networks_switch_stacks_routing_interfaces_dhcp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "871a83e486415bef334f20bcc18e005c7e97269450b40a5317516454c8e43379",
+ "chksum_sha256": "7f88e1e6059c8e8f4dc0c46327851a0deca3dfb2a68cba5e814951044b5dbba1",
"format": 1
},
{
@@ -1992,7 +2167,7 @@
"name": "plugins/action/organizations_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5a17cb1555241fdd0af7d48a040394092825401c6b79edd999eae3607d8c642",
+ "chksum_sha256": "cceb95d07a5d9585021734e73ab798158eaba2728b1cb3d85d89c71531f21aa6",
"format": 1
},
{
@@ -2006,7 +2181,7 @@
"name": "plugins/action/organizations_adaptive_policy_acls.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "770fee0b3d5b9e131144e1e84bdc9d16e7702d4f41fd5e5520a02ef816326b95",
+ "chksum_sha256": "467f0a935221250788dfb2c9821610ef5098f5f3fe8e705db071140b3dfa30f7",
"format": 1
},
{
@@ -2041,14 +2216,14 @@
"name": "plugins/action/devices_wireless_bluetooth_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "26a76ea9fa8c1ae1ee281c17d6e4b2ca29b42d370dc2406cc79abe4cb0bbaef3",
+ "chksum_sha256": "5b08537ab472b899a49b31fb8425809b25b622a6417782c25460b378cf7b60d8",
"format": 1
},
{
"name": "plugins/action/networks_sensor_alerts_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "486dba6e745a9e7a9941e40de5f9d5c536392a80c903039517e141ea2f319c4e",
+ "chksum_sha256": "69da6dd0a4d3b8db0f3fb9881703cdf2a3af2762e840c1ea24f59b389ba3fd97",
"format": 1
},
{
@@ -2073,6 +2248,13 @@
"format": 1
},
{
+ "name": "plugins/action/devices_appliance_radio_settings_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e90fc927566badf06952b6d5d3f48200127ba95409be8f41513f9ce9372521c0",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_security_intrusion_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2108,6 +2290,13 @@
"format": 1
},
{
+ "name": "plugins/action/devices_live_tools_arp_table.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d562dfa28fc6a7085ad6d1359dbb5d7b9543c0c9e46c582635cf54096f1f3c4a",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_api_requests_overview_response_codes_by_interval_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2125,7 +2314,7 @@
"name": "plugins/action/networks_camera_wireless_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8b5e67e768d0ea1efe496a2193988e5099b3200fdaa43e5238228d284e1b71a2",
+ "chksum_sha256": "f835135bd7b060af41b3dc21366e9148040afe41293d75d9b44822796f221d4c",
"format": 1
},
{
@@ -2143,10 +2332,17 @@
"format": 1
},
{
+ "name": "plugins/action/networks_vlan_profiles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0593cbd6b69dd91e0610f67e768294bc2ac28fba166bdf162a30460887680440",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e78d416c6548f29f39ea2ca463a51cc4f1edb5d4eb85f6a6f81ed50acedfd8b",
+ "chksum_sha256": "985e4441a9d9018a20bde175c801602c9511cee40534d8745f54a4e517c0afbf",
"format": 1
},
{
@@ -2195,7 +2391,7 @@
"name": "plugins/action/organizations_inventory_claim.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd816af11d3c8a1cdf111377e8d07d12e8e42ee269ea68328e08f99c73ff7d97",
+ "chksum_sha256": "cb517b5f833ec6b32fa371b5c994b5333781cf80b75be6ac054b244c37081c37",
"format": 1
},
{
@@ -2251,7 +2447,7 @@
"name": "plugins/action/networks_switch_access_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab6b359e89b979ff14fea54328c16f58cda6c452ede041798b162ecfc9cc9f6e",
+ "chksum_sha256": "b182bee6b7fa31fe228bd026fa0867711abdaa1f745c0442fa1bc901b6aadf55",
"format": 1
},
{
@@ -2265,14 +2461,14 @@
"name": "plugins/action/networks_mqtt_brokers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "52372febb9a0c8008fff1cece130bed0d0595b3144280f9a363dc22dfcdcaf0d",
+ "chksum_sha256": "8dc380c3f6eb9bea43baa67e9c919721484ae6f3c67fdadc38515ce9b7832a57",
"format": 1
},
{
"name": "plugins/action/devices_camera_quality_and_retention.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4d8c304090222f19f677d4cdcc41cdd50795abf34ae8c5ed0a435c7229d17e54",
+ "chksum_sha256": "c658d0ff695c9fb3e9a12185788ad13d8f14f30c0c087254342ceecd0ee0c5a1",
"format": 1
},
{
@@ -2300,7 +2496,7 @@
"name": "plugins/action/networks_webhooks_payload_templates.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a3a8e080905d002f4070b84aeed14b382954590e90b70a0ac0c5762d65910fa7",
+ "chksum_sha256": "3b5adb1d1344bbe66fc3606cab076d34bb3664b394e3fd7c7cacd61c6fcf75cc",
"format": 1
},
{
@@ -2335,7 +2531,7 @@
"name": "plugins/action/organizations_login_security.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cfd253ac346ab0ec33d9a4b3eb576f157fe1f735c783927dffc1be2aefc81346",
+ "chksum_sha256": "631037db87ccdb1ad1f77584023d74bd3032727480bd58551f844822f2ec8349",
"format": 1
},
{
@@ -2363,7 +2559,14 @@
"name": "plugins/action/networks_appliance_ports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c8e5d786e3b68b40dfa7b6dc8b5b44cf893caae803d5e5fb968d1068433dd5d0",
+ "chksum_sha256": "12e9d244eefc958ca2785f5ffb1bf37d77be5132f6866fb2337d85c5419e1b2f",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_sm_sentry_policies_assignments_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ca3e36720f3008880ee6f19299f5c38b28e8b3fb3d6c4850a725d3e313d94569",
"format": 1
},
{
@@ -2377,7 +2580,7 @@
"name": "plugins/action/networks_floor_plans.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f956a6b69a341976f7d5fc84761b9b6eea8505572778335db76a106f1693c033",
+ "chksum_sha256": "33df6fc5e3bcb5e98a679f67fa74b0b4e97b67718373c5ae74c46ec7fcda8538",
"format": 1
},
{
@@ -2409,6 +2612,13 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_camera_roles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d8ff8755d3faaf8583dc6c6e9ef24a96487890a3e7f3076a7fe9d68e4b669d5e",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_summary_top_ssids_by_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2419,28 +2629,28 @@
"name": "plugins/action/networks_sm_devices_checkin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74cdcef4d2a12680b23e46fd1ee74c74946bb7dadd3c3bc64f02c008efdbe5d1",
+ "chksum_sha256": "247a9769c7b39f5329db326f07077d4d288bb7da3ec29ca2682981cfc9a2db63",
"format": 1
},
{
"name": "plugins/action/networks_wireless_ssids_splash_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "275c2fe6581c2591b8e3b9019bc6e210507b6670e85a50a4c98e9e660c687abb",
+ "chksum_sha256": "2c7710606ed84a26bd8886ac957ac979f98c86d832d411d42377274045f1d1b0",
"format": 1
},
{
"name": "plugins/action/organizations_networks_combine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cbd6c6ef4df423eb438caf5672f36dfea894ffa91afb1894fa6679403dd900fd",
+ "chksum_sha256": "4c474bf360fc5dc5d2c5055cb7a2096c360eb3d46439e0ed283406fa7941a6dc",
"format": 1
},
{
"name": "plugins/action/networks_firmware_upgrades_rollbacks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ce6b1d63da85f3573f015d976e12e6acb07c7c8546b3c17230000f48c6c231da",
+ "chksum_sha256": "3afd7e06aeb59d12dd7c53be4367b5fc76626306ba0bb2da97033813fda27fd1",
"format": 1
},
{
@@ -2451,6 +2661,27 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_appliance_uplinks_statuses_overview_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e3a8b1d43ccd71be33a4a0b751c3461b5a369856461e4f91f78302346126be7a",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_sm_admins_roles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f7f394cfc3acaaea7a159251e10433ad5fbf0fa7875eb0f23f68d97b4c7e20d2",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/networks_wireless_ethernet_ports_profiles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c3a15fe7559418b40bdc476ede9cbed4495815d7c592ee92621023c63aac4931",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_firewall_l7_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2475,7 +2706,7 @@
"name": "plugins/action/devices_wireless_radio_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "313df9379adeb7a7e819cc8373b34b3dacadb133550939bd603bdb79f656250a",
+ "chksum_sha256": "9f3ae078bf261f8898d32b6ab484b0c1a46889456f65c0e6a219d43f742d6ccb",
"format": 1
},
{
@@ -2486,17 +2717,24 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_camera_detections_history_by_boundary_by_interval_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ae05e9a249579de8d2362f291637cdfb7277a690ea0e06a62e80879dcaf09d05",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_admins.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cf3680a7aaac53c272ab5ccc5e2cfcc5ced17f02837c21b4d6516b9e87e3e912",
+ "chksum_sha256": "06445a9c8ab57ac007e210fdeb9beac54547e14d10d556a0cad1a163a17b21b9",
"format": 1
},
{
"name": "plugins/action/networks_firmware_upgrades.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7fa4122428d0608cc07735d12bf8ce33e3248303927088c49e2045711eb7071f",
+ "chksum_sha256": "ae0f20fa3d906b86bd60f53f48acf8efac8e3d4a96fcf10387ca412eb86a4290",
"format": 1
},
{
@@ -2517,7 +2755,14 @@
"name": "plugins/action/networks_sm_devices_modify_tags.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "52e1bea3137db4fe14973a2d3e443cbb31f31c5debd6f99004724cb4a68c3b66",
+ "chksum_sha256": "e37d1aa00b2fcc4cd2e477422ab9eef9a7f9f56672c50c9904b584f176780542",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/networks_vlan_profiles_assignments_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "018cfe7b6594a8b4f5c5588d0ffb63671c2689c94b0f1931be48ed659ee5ce4e",
"format": 1
},
{
@@ -2535,6 +2780,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_sm_devices_uninstall_apps.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0421dd3de6be540a00fb68ee4e79e2a7e84484b6f2b92fe42593de1b1d50cc0f",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_sensor_relationships_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2573,14 +2825,14 @@
"name": "plugins/action/organizations_adaptive_policy_groups.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "978180a036ff7b7f65783e030521574a4ece5409088612845fd2b7c989f055bc",
+ "chksum_sha256": "86582e2a08b5e8c0a74caea2520c4767ff876b660c35078e29f0363a5046dc27",
"format": 1
},
{
"name": "plugins/action/devices_cellular_gateway_port_forwarding_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "995e3f1f4548a1f80946c0df613933375784ff4b1260e33f4d96b656be716ac9",
+ "chksum_sha256": "674547a9cb6c604d18542e75160a17118932f41cc5b7926ff7b94ccb45f5cb26",
"format": 1
},
{
@@ -2594,14 +2846,14 @@
"name": "plugins/action/networks_sm_devices_fields.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3156d859b4a589458aaaf7fd0b1e04c4adee969d356759a9128e7ade83a08180",
+ "chksum_sha256": "9394c5d34283eee79086480ea1ed7e38a6da5460f909368cbdc6d319ce13aa87",
"format": 1
},
{
"name": "plugins/action/networks_firmware_upgrades_staged_events_defer.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b712f120025452e14464eced504aa1d6c40e18b89cb779efab387a8e12fe0261",
+ "chksum_sha256": "a56cefb5d2f1f092b15f8f3d10d8dd6777438de88b5841f62318af418e17774c",
"format": 1
},
{
@@ -2640,10 +2892,17 @@
"format": 1
},
{
+ "name": "plugins/action/devices_live_tools_wake_on_lan_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "044ab01319420b7fb6f989a5435115918bd59fad7b6d705670ade10667efdc16",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_action_batches.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "14a8f8be895e4ffbd5c0d24b67fbbbddb08f78ecc715592bce74caf84b43133d",
+ "chksum_sha256": "a55c1f3f347f97e832cf98e28e02325d73e748d89d3d893f80a974a1f4e289e3",
"format": 1
},
{
@@ -2675,6 +2934,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_appliance_rf_profiles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "721ff3750a984d2ea281aff97d5c5f614497143979484cdaaa90bb4b042f9980",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_inventory_devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2699,7 +2965,7 @@
"name": "plugins/action/organizations_snmp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea3b1e1ddfdeae21764c84ff7dcc15134149ce0746c4ad3eb0c0c12a2e6c25b7",
+ "chksum_sha256": "4f7a84704b643422e94a5accd864c4e32c62bef75f5fbf082e0603a3bcf0876d",
"format": 1
},
{
@@ -2734,7 +3000,7 @@
"name": "plugins/action/networks_wireless_ssids_identity_psks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3036c60b97d64d3e947f733e9c149198ee7737d409b93902387c607cd8b342f2",
+ "chksum_sha256": "898e3514a32b882f21c962a658f4df9cb4cc403b88ea68c34ec8299175266aef",
"format": 1
},
{
@@ -2752,6 +3018,13 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_devices_availabilities_change_history_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5d0ce0d3b822b91a583f622100be2aa2a4d9fc791cc3c8b58e237d03774eb86c",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_switch_link_aggregations_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2766,10 +3039,17 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_webhooks_callbacks_statuses_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "aff71d563627c0c9a9be7f1a2e40ee1767733d2239c55683fe1dfa034820a1cf",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_policy_objects.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29ff88c9b9f9957d2b582dfbe10a49f25b53a27eac6de75b28a68a2f65fdbb7c",
+ "chksum_sha256": "be6b760d260548174a6ad637cb1f3a6603d95d39f50ffc6aac3dcc90c9745c40",
"format": 1
},
{
@@ -2818,14 +3098,14 @@
"name": "plugins/action/devices.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4607055ecf8f4610c8d575503661ce5a6bd1ef15121f0516cf7c271d38925516",
+ "chksum_sha256": "6daea7367c799e68e173a897a79b05e747b1e2e7029f80bcaf61c67ef5a9c126",
"format": 1
},
{
"name": "plugins/action/devices_switch_routing_interfaces_dhcp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "73e3e2baac73397aef8ba76c4029395f956a2782c73698cc0b9851dcc13fde38",
+ "chksum_sha256": "3a413e27c68e0815e428443846fae68a4217c3d296eb1acf714b50cd9894b063",
"format": 1
},
{
@@ -2843,10 +3123,24 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_wireless_devices_channel_utilization_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "88b148ed18f89e7102dbdb4b3cc42f800115f171ba6619e05f0cfde3dac454cd",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_firmware_upgrades_staged_groups.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4c7f98976a2cfeb40f9ee108c6efc37863f9745006b291b6234c594136582281",
+ "chksum_sha256": "883c9c7b268f9d0f2e92fbd7909980d6c0ee076cd96402e681c75f0da697b374",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/devices_live_tools_wake_on_lan.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ae7d8392148b7bd6db4e7a1e76995ad2d5dc5d106191a27a7a310e3ffd226f96",
"format": 1
},
{
@@ -2857,6 +3151,13 @@
"format": 1
},
{
+ "name": "plugins/action/networks_vlan_profiles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "03d1e4b64729fa5061c49b634d440c891e6c76ae7b79e2bc5d090b37b098fe92",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_wireless_ssids_device_type_group_policies_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2888,7 +3189,7 @@
"name": "plugins/action/networks_appliance_security_intrusion.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c77d8a992b703ef9895f5966b9854fa7f60bc25b3dd1602fe80179aa5bc2d3b",
+ "chksum_sha256": "4c0c426b0cf27863af2837ae828093bdd70e803cbde36873d86f761ede1c392b",
"format": 1
},
{
@@ -2920,10 +3221,17 @@
"format": 1
},
{
+ "name": "plugins/action/networks_sm_devices_install_apps.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d8820f28e29821bc5b84585c4102e374a9e0967a1985d0031040b9d7aebd72a8",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_vpn_site_to_site_vpn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7f8fb0ad4ea0f917944faede8f1e993eea9c9cf0485aed275dbb3736f282701c",
+ "chksum_sha256": "c2bf09f1ee54c790be751d44379319a1250b91a1660b70f2438f99ac37f354ab",
"format": 1
},
{
@@ -2934,6 +3242,20 @@
"format": 1
},
{
+ "name": "plugins/action/devices_appliance_radio_settings.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "dd4c0ac86b9d7168e9170c3f0eabb21f1cb64bcb76ffe84f9008281668bbbee5",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/administered_licensing_subscription_subscriptions_claim_key_validate.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "23871bda767e642624098f6326b22f5664bb91103f4617a9a8a0c4aab5e7851e",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_cellular_gateway_connectivity_monitoring_destinations_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2944,7 +3266,7 @@
"name": "plugins/action/organizations_insight_monitored_media_servers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f00b291cac55218e154f1a616d54b7b161a62b2b3ecae8c8230d958083a5bf3d",
+ "chksum_sha256": "a78fee7f9173bbb09045f8f675da6ce0cc733032842d7f97bef5b0cfb216832a",
"format": 1
},
{
@@ -2962,6 +3284,13 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_summary_top_networks_by_status_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6ce90228e86212cc270de05fe2c7a403c0bfb037534238a9c2530f90c8aa3eb4",
+ "format": 1
+ },
+ {
"name": "plugins/action/organizations_clients_overview_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2976,10 +3305,31 @@
"format": 1
},
{
+ "name": "plugins/action/networks_sm_devices_shutdown.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "46d19f779864fdc4c9f74f9a350073a23ff0945a13f9f4ceca4ff1ff15a8ead1",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_wireless_devices_channel_utilization_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "da06645abd75fa702fcd6ecf30211b16c990927142e1d9a8043005bbba66ec37",
+ "format": 1
+ },
+ {
"name": "plugins/action/devices_sensor_relationships.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2956f9f0f457b7d670abc82b1f633c42371d7ebdb9600eb3571cdd762f056644",
+ "chksum_sha256": "107a7ad0473894d0fa7afe0813ebb626795779498dc3be76297c69c1caf25a29",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_sm_admins_roles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "03602a4d45ae50c8a9742a5d719dfa234164020683c264bc2596290250bebe8c",
"format": 1
},
{
@@ -3007,7 +3357,7 @@
"name": "plugins/action/organizations_firmware_upgrades_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f5dcac54482e2e3ff47346481ffdbde8a179da8d8637a9468ee8a885bf66b6ac",
+ "chksum_sha256": "71119f8dc746a01f0019f6cdb882b4458349df04dc8ff978f4613376f7da177c",
"format": 1
},
{
@@ -3025,6 +3375,13 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_devices_boots_history_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "54249b782c50e3eef484523465887645e39c2b479b5078907b8548fcdcad0569",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_sm_devices_performance_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -3039,10 +3396,17 @@
"format": 1
},
{
+ "name": "plugins/action/organizations_appliance_uplinks_usage_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3fda8166436a1c7e26e8e09377f3c6482e5132e0210d76f28bcf57d3a5202acb",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_wireless_ssids_traffic_shaping_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0177417ad2b9ae510bc38b81d5da6734fe1d5a9f42ad2d9fff268093cc647ae6",
+ "chksum_sha256": "390dea9b990264455f875ce633616b8b35523a383bfdcc0a270fadfafae27a19",
"format": 1
},
{
@@ -3063,7 +3427,14 @@
"name": "plugins/action/networks_appliance_prefixes_delegated_statics.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c786ae33e0a6909478edbead1bd5d33878e98dc406b91420c51f8c6b6cb38108",
+ "chksum_sha256": "a6c7e6b4997cd7e89e6f2f7c6f4a2c9476ea9a7b5a18382813210faa409b5f63",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c53d2d58d9236ade201e436ad3842d8a90e754ebb735f02b74b3a019ecf16120",
"format": 1
},
{
@@ -3081,6 +3452,27 @@
"format": 1
},
{
+ "name": "plugins/action/devices_live_tools_arp_table_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "044ab01319420b7fb6f989a5435115918bd59fad7b6d705670ade10667efdc16",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/administered_licensing_subscription_entitlements_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a3eb4ed3c8e8e0216dd043ab662f96a329c027ac1fed4fc85818dda971ed964d",
+ "format": 1
+ },
+ {
+ "name": "plugins/action/organizations_wireless_devices_packet_loss_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3fd18c0de2a06abb7835400c1ba03075e33a466110e24e3f1fc6d9a90208e2ad",
+ "format": 1
+ },
+ {
"name": "plugins/action/networks_appliance_vpn_site_to_site_vpn_info.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -3091,7 +3483,7 @@
"name": "plugins/action/networks_wireless_ssids_firewall_l3_firewall_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "92c117daef3804f8b320636d0033fcab63adbd6ad26c73f5f63db40af06e13d7",
+ "chksum_sha256": "32f8451c462ab02cb325d00b4df6d594a21d2a7b3473bff2f2aba30da6a36a9f",
"format": 1
},
{
@@ -3168,28 +3560,28 @@
"name": "plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7df2bec103e4b830144f422734362db10904629bc848f2b4939ce3ed1b322fa8",
+ "chksum_sha256": "b5e0a3d536e6ef9ae1326a867515b97af60a15385304e00f9e063c8db1e03240",
"format": 1
},
{
"name": "plugins/modules/organizations_sensor_readings_latest_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1b257b2b2381c0585e4d5be347a24bef2e250015070c04d0f74b381f92674339",
+ "chksum_sha256": "a5fc6bc7d92177d8a13ed17a567b34e94979bf5b26e26f1ac7d9bef6eebfd8c0",
"format": 1
},
{
"name": "plugins/modules/devices_live_tools_ping_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "064ebb292c3fc275b5fd6644d8aeefec943bc5168d4cfe25914114b0e38e3279",
+ "chksum_sha256": "30815d3067fe1b76fc5ddb55ee03b550888037f8c58736ac97c224e76e145d07",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_l7_firewall_rules_application_categories_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3a0dc4ef122c66a371b08fb4a3650be0a6604d6d168e225144f849e1a307fd7",
+ "chksum_sha256": "c26e417d22e8c8c26c5385ee588279ba25792527f9e85e87a441a0708047f437",
"format": 1
},
{
@@ -3203,14 +3595,14 @@
"name": "plugins/modules/networks_clients_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3936c7e542e66dfb06f95f26c16bcd0fbaea9eaa1d5d20ef08c670a94c124a48",
+ "chksum_sha256": "aa34c1a6a39e50d8a17a349b8682828e92907d14ef5ec1e12025f940f1dbc093",
"format": 1
},
{
"name": "plugins/modules/devices_camera_wireless_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2de73c2a35ce6cf130d487d5b117cdc910ef8d2d4fc5ada83e6b0d927085964a",
+ "chksum_sha256": "ebdd60e3fb8190d2f7f85cbafdf2b3b958ba25cd4618aecc54417412c2c04350",
"format": 1
},
{
@@ -3224,28 +3616,28 @@
"name": "plugins/modules/networks_cellular_gateway_dhcp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "867a6041d7b2caba7a3f32290e2c0e86ba14691ac44b0b873dbbe6a024d22641",
+ "chksum_sha256": "5edb81e13924d622e0420a4858c60e3b219afde0c8f13ed543ca95c199933e70",
"format": 1
},
{
"name": "plugins/modules/networks_cellular_gateway_subnet_pool_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a2a6c8e712a54557b4035eb36ccdaabc6c6117385888c2eab254bbafd71b1a4",
+ "chksum_sha256": "c9bc557aea3c7ada33d1039469728b0f8fc749bb6812430c4b3056658945a1ff",
"format": 1
},
{
"name": "plugins/modules/networks_cellular_gateway_uplink.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e51cda06b65459e25800d3b3cbc3fc98bd6c6618de07f7128e4a686bec9dd50f",
+ "chksum_sha256": "ffbf86bcef19753b584da12f802331c09f1ad02807efacd7706c68a5afa1fac2",
"format": 1
},
{
"name": "plugins/modules/devices_switch_ports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6513bb6d4730a2cd7c9481f306e4cd7636a52f47196ed4d9ea56ed65a7d07400",
+ "chksum_sha256": "e1fef2bf286954a8d045d77864b71f0d5e92e3508691df05b1573d0bbeeb925c",
"format": 1
},
{
@@ -3259,14 +3651,14 @@
"name": "plugins/modules/networks_clients_splash_authorization_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5cc27094b039827424d16121cb514252787b2124d7516caaaeb39dffc464340c",
+ "chksum_sha256": "bea4c21f2f0830debd77f5e731def5c119011d5f011154468a7b551c3d744e59",
"format": 1
},
{
"name": "plugins/modules/organizations_adaptive_policy_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ccb9c0de70ee8058488158e1afb8dc44b9aa843baebce5fd1de1fa1e3ae3da8b",
+ "chksum_sha256": "c08d72398b546992d34fe69030abac65e0c0533dee3bb5116632a7e03dbb9152",
"format": 1
},
{
@@ -3301,14 +3693,14 @@
"name": "plugins/modules/networks_switch_alternate_management_interface_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d174c4fb3a3c3157b9084f234a27351380e3f1668e88f3c304ec403123c98e49",
+ "chksum_sha256": "1f56af8a6a216e5ce37669a1a2f52afe7ab9ace252e3cad1ed2e9186b9f6d3ed",
"format": 1
},
{
"name": "plugins/modules/organizations_licenses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8f70362bda2a579e09d80864b8ff7eb81739713a13618132a158c9e5d34ec79b",
+ "chksum_sha256": "6fad4657e60f96a189b6453d3591ffded2384531035bed3513429829437c2ef3",
"format": 1
},
{
@@ -3322,14 +3714,14 @@
"name": "plugins/modules/organizations_licenses_renew_seats.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2b22ebb8ddcef19df781451ffb17edb9cd854e3abbac7940d0f6fea3d8a5209d",
+ "chksum_sha256": "7f237a7437dbb39cf9eb31badb5bd663c20615d5749433d7538fb7ee5038f546",
"format": 1
},
{
"name": "plugins/modules/organizations_devices_statuses_overview_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6a9ee1fe1069bee82210b00b8a414f2af69cef68bf51a1d535c907195031440",
+ "chksum_sha256": "fbd3d896033d72e4b2b8bdff36f3c3db4bef653e534d49803e3df262522e07e8",
"format": 1
},
{
@@ -3343,7 +3735,7 @@
"name": "plugins/modules/networks_wireless_ssids_eap_override.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7fef9eb732235cd74170006aace49c48b3a4ac5b46f06db44980a73c1968219",
+ "chksum_sha256": "defeb74b60a2b329cebf4085e1c8065163a31a67ccc700328f432973456ad871",
"format": 1
},
{
@@ -3357,63 +3749,70 @@
"name": "plugins/modules/devices_wireless_status_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76e902c04fc2ac9bf60d2d2325c13943fc0ac602b5719ca96994aef1ccd5e947",
+ "chksum_sha256": "19ba106396c3f4c34ebed0f4e01776686cb3db1aa20e4e7ebd2230830010cfb5",
"format": 1
},
{
"name": "plugins/modules/devices_cellular_sims.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "37e3ebd9ef4457d6f2ce2f3fdaeab1f74fd8b32d2935f777ceb09d107b6d9abb",
+ "chksum_sha256": "b4727fb73215d373ce418d1eccd5b3889b1b6773681da5d5a796d114a33939d7",
"format": 1
},
{
"name": "plugins/modules/devices_camera_analytics_live_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6ef5c25f9108fbb60436285fbe1fd8e89f6bf023249fe02276ebf4200db225e1",
+ "chksum_sha256": "b2772a55418f180a136e3ad34d6b9c02beed7ce510a4b7c895bb04702f2087d8",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fe812dacb16eea7f7e4c13b670c4362982b8fc890af16fe5a5bf98928b027dfe",
+ "chksum_sha256": "7fdf0cacea65467934b9faa98f78b3d4e244bca0ea8d9a538c75396c17ea97f4",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_data_rate_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aba8abd1927311639fb2971032b591e1b0786b95b4b133e53b0fc59489bb0777",
+ "chksum_sha256": "bce284b4577d976c4f56ac94ffea0756c972af75aa1dc3e67cce7f667fb1769d",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_appliance_traffic_shaping_vpn_exclusions.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3a59af68dbc67d323783507b32a01fc4a7bd52af961c61f7cfdee998da36c508",
"format": 1
},
{
"name": "plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9960307612af69edc2657dee80adb3c3f19b78bc381f7ddd690c64538d6c0ed0",
+ "chksum_sha256": "7f3ce4ff5f5bfbd88a3e9656e69d19697dd780889928405f88f098c919e686a4",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_vlans.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dfeec55f84d2d416589f229cbe617b4e0471066034405bd799aca97857b257af",
+ "chksum_sha256": "5d5d03426c7b66697d9687b25ffdb65b250f1f7be1f79d83ad24b5bae60db695",
"format": 1
},
{
"name": "plugins/modules/networks_netflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fe5058da451f0c4ef06c5ef8f3a2d2e1a467127be8259b0fa0d9a2e702ba0f3e",
+ "chksum_sha256": "155f81e842f0e629a7a1a1187ffee82ce90d21fdf86c204fc04c42de5381b47d",
"format": 1
},
{
"name": "plugins/modules/networks_traffic_shaping_application_categories_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e75797f3a11bfc017c02ee1e16b9ea26597f886811fa9088c50e54ca725011e2",
+ "chksum_sha256": "a86076b3df6886db7d567be394b40f10754d9f811f285f6dc9dcedea8f883f71",
"format": 1
},
{
@@ -3427,21 +3826,21 @@
"name": "plugins/modules/networks_appliance_content_filtering_categories_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "89fe66465c38b911395e5043a9d0ca16906f555b736b2e7f17ebeae1dc6fc2e2",
+ "chksum_sha256": "a045d4b8c67e6a2d0cf868c964b13587b6f3c430e3f2be09679a0907a0dbeb29",
"format": 1
},
{
"name": "plugins/modules/devices_appliance_uplinks_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "889c7a4046c8c7fe16ef599f5d9a7cd1e54075f21fd3d46abef6b6eab72e1640",
+ "chksum_sha256": "609c701feb4eca12ce7c64d353539e0f966ca529e3e878b338777244c7e31a2e",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_security_centers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e5eef605a55dbd8ed5b256f06347385636fcbf3803d8bf62e38ec16f7b3c5156",
+ "chksum_sha256": "60b80b9de9afaecd31f52d90ddb217284620db7adb7d5f6b1269af23358c5812",
"format": 1
},
{
@@ -3455,14 +3854,21 @@
"name": "plugins/modules/networks_firmware_upgrades_staged_stages.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "97b6a8858f074691a2713d34d90132a4886be486c44f9da90ac01034242c9dfd",
+ "chksum_sha256": "f6065aa8e69746a0b90c444520013884c249bb85988afcb7be129a166c692adf",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_live_tools_throughput_test.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3dfe810a698c866ee14aad49a261f9682abed00ccf34bc894a87557a28363feb",
"format": 1
},
{
"name": "plugins/modules/organizations_clients_bandwidth_usage_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "545948f2619a66dc6419fcbcd2160ed6c328e448e28933fc734cd45a16f21733",
+ "chksum_sha256": "a15a64ccc348b987f7ef9f81dc81c133f4035376a6f87c64732c12b800204671",
"format": 1
},
{
@@ -3487,17 +3893,31 @@
"format": 1
},
{
+ "name": "plugins/modules/devices_live_tools_cable_test.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "39a8e99a2a7ec51be413f8277973d04299f58d8efd222df61b241b8a3063746c",
+ "format": 1
+ },
+ {
"name": "plugins/modules/organizations_licenses_overview_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "375ecc6b128d234a077143778b32f914ac75b6530ef034e955dfa8e0407f7998",
+ "chksum_sha256": "9500fa7c99f9bf926acad172f8631802f1b62c68701dd3d28d5ee14cb53fd708",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_wireless_ethernet_ports_profiles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "00cd9b022d48762e9b80f8945d4227d8cd51509e66d643d483cd9825cd1aa1f6",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_vpn_bgp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e21328c96811b39332c7a258d40c69c76b434b7d7ce35d79cc29f6e8c13d403f",
+ "chksum_sha256": "c21655dee3e9f8ffa7ab356bf2531050d4212bbf3d2ebd66080afbbeccba79c9",
"format": 1
},
{
@@ -3511,21 +3931,28 @@
"name": "plugins/modules/networks_bind.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9fcc457b0ea731c339d622345af9030d30bc5f3e7e2a8232b2afa8a39b5fb381",
+ "chksum_sha256": "db217505920e8764a6f136db97ea4f23921280066d461598c18b4ade8659d135",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_wireless_ethernet_ports_profiles_set_default.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4c4df6f02d04d11d2b0ffe0b2ca628965b896bc4480a2cda664ad866eda4388b",
"format": 1
},
{
"name": "plugins/modules/organizations_licensing_coterm_licenses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2de4ba21bbf32aa94fd1ef5357738d00f4943db805201cf44d32a26d3bc540b0",
+ "chksum_sha256": "361bf5a304c690517eb269c037993ad11f040fa81a79cc20683f88ed249547e8",
"format": 1
},
{
"name": "plugins/modules/networks_traffic_analysis.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1dd8d49b466d529f3e88cee4f897e50ad2383c3efbff847791bf6824744620e",
+ "chksum_sha256": "dac9d4db2962afdb42e2010436ae9972fe7a30181b551ff23539dae70f91798d",
"format": 1
},
{
@@ -3539,28 +3966,28 @@
"name": "plugins/modules/networks_switch_routing_multicast_rendezvous_points_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2a61afecc1a6dea1ebaffc16b9c090cccc902112c73a1528b790ba1bf8991e8b",
+ "chksum_sha256": "326e893b5afc02ee02e67d82d3908a2a2992552cdf92b70a67c1ea42508dd944",
"format": 1
},
{
"name": "plugins/modules/devices_appliance_performance_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "660c01a047bc6723121ed254aacaa1e979a9e2d23b205866f6229ab48d1c4c48",
+ "chksum_sha256": "8ad6a4c6ef81e13e04fe5e151c6f61c4cfb425f1ad33e20b9a0e670fdaa92e1d",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "755fadd97b24e1f10304a249aee212cf09247ed54ab5f070013d80e27d5e41db",
+ "chksum_sha256": "84c0a49bd3ac6a31e90467a902f6a4cd04236c36c246614eccdbb31e6f742b30",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_failed_connections_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "883289ce69bb98f6e8cbfaf57b494ca727d61f77edb6a609ea4ee5d5be621ac8",
+ "chksum_sha256": "e293d89e440089153e257d5c6a1016aef0870aa868ad389a79fb647d9fceb0ff",
"format": 1
},
{
@@ -3574,35 +4001,35 @@
"name": "plugins/modules/networks_wireless_ssids.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d7a406df268cadfc35d4b9ea4d97fc5e01c2c96a41fad83ad69266691335ba04",
+ "chksum_sha256": "714458405ed8e12bc45014ebd7cbbcd9a9ec1b7d0df08485b2c2376411bf0c6b",
"format": 1
},
{
"name": "plugins/modules/networks_sensor_alerts_overview_by_metric_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a78016e2e3d36d3b9fd33f40cdffad8b87b4f313c706b6a839e9b7fec85e961",
+ "chksum_sha256": "a9eb579b01e033f7b205b527e0223192f54d67e6e6f35fd834457d5bf4022529",
"format": 1
},
{
"name": "plugins/modules/organizations_devices_uplinks_loss_and_latency_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "18b4daefb495331d4b50baeaa16d3bb2c8717c93c17f756d728be4f9a5ace92f",
+ "chksum_sha256": "3dfbbe744cf14a62419331c95267cabd74f52c78bb4b5b1c3d8e552fe3c07f05",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_staged_events_rollbacks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "615474b77d93c117aadbb69f4e0b1582098ce2e280b3940c0ba4df913962c90f",
+ "chksum_sha256": "f1da9dcc326317b8a8bc3188964c9b359f7a5624dc191465ff66c3b720764d25",
"format": 1
},
{
"name": "plugins/modules/networks_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5505ebd4ea1bda7c29b486608a82e8d8d11528e09893a6e02f4fbb812ef5b63a",
+ "chksum_sha256": "ba06af16df38a1efae925fdd5e22cd557de1a33a784cc16402e7e08d4662ab69",
"format": 1
},
{
@@ -3616,28 +4043,28 @@
"name": "plugins/modules/networks_appliance_firewall_cellular_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "341864a544e92da5b82d72ea2ca932d221efb82c3bb00e8deba8f55ef2b22ff2",
+ "chksum_sha256": "709c891b9174b6473f12773751a6092a163a22f5ea3f14b4c3a27dd481fa83fc",
"format": 1
},
{
"name": "plugins/modules/networks_camera_quality_retention_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dd774894772c982e80ecad28e555106a425f7175f907d7c0e37b74ccfe4128de",
+ "chksum_sha256": "89eb50683acae43db6435c8720dbef38524f0f8d759cd302a50ce3f6ef724bc1",
"format": 1
},
{
"name": "plugins/modules/organizations_early_access_features_opt_ins.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "57d8b5e730d3fb6947980ae75301535d31641597ffcdd6383ea394c14b819276",
+ "chksum_sha256": "c416ede7f6fbcc31576d7e1f2cd11d4907e924b82c9b973e37625dd3b14b62bc",
"format": 1
},
{
"name": "plugins/modules/networks_switch_stacks_routing_static_routes_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a20f07f3ba844d2ec5af68a85698520698ace8264a99db9c6b7b1517e46c0fe5",
+ "chksum_sha256": "eea5036419e65041c86713ab77e14346dab49f1ca654fa22f3f2be6a142e5d49",
"format": 1
},
{
@@ -3651,42 +4078,49 @@
"name": "plugins/modules/devices_cellular_gateway_lan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95ba149b3f24f5caaa0491587237d4cdaf98ac6deb6a6e8e64834fda1e35f056",
+ "chksum_sha256": "06ef3c8893d4f1342189bdb7b9f6aacfc000dd9ced92689fd77cd54c6576bd55",
"format": 1
},
{
"name": "plugins/modules/organizations_alerts_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b1b8b828f1be97a16b29e722a3ff11ff670ebe81c15fa5f0466d84f5081eb9d",
+ "chksum_sha256": "3ad9e1eefa64eb82d78d28c76ac52bc473eafebaf636b87b7127ce486a64d720",
"format": 1
},
{
"name": "plugins/modules/networks_group_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a802bd3ee92e312c14d9c8eb23a0b63d70c529836d9d61352e48e3941c3dedf",
+ "chksum_sha256": "8ac9f1c5cfba263076a0ae0a39cf39933e190ab040adcbec1a67a3bf10b92162",
"format": 1
},
{
"name": "plugins/modules/networks_sm_users_softwares_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a981d5850d034688011362e58c29627efc0b3bb522704ad38f78206e382b6643",
+ "chksum_sha256": "8ba4fe1b7e544aa07a5dea7371079737a37cd40a49a5e8fcb3589aa14721d390",
"format": 1
},
{
"name": "plugins/modules/organizations_camera_custom_analytics_artifacts.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f31ed4ac03a70fb7c6baa37a36692dabc2cd3f41f4cd29358103c7612720b85",
+ "chksum_sha256": "f2aebaf1f5a819ed163f6305cb0f83521a9012026a3d13de7182f35221be51ef",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/administered_licensing_subscription_subscriptions_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "cd0aa3fb04e2f5fce7381a527e15b58d705da42ab5b6e554b1f97036526eb7ce",
"format": 1
},
{
"name": "plugins/modules/devices_switch_routing_static_routes.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b800b9f10c1ae144afdb51eef92f4313a344d83ec5fc0b674970d16b359ee901",
+ "chksum_sha256": "d440a306761a3b5508222744c790bb9dbfb718ad2467afb3f06a3c5360573c31",
"format": 1
},
{
@@ -3700,21 +4134,21 @@
"name": "plugins/modules/organizations_openapi_spec_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f6bdedfdb362032d7352bf09ecc773490cb66c6b0d7d7686e52a5c0d578f068f",
+ "chksum_sha256": "c1655098628b4bf35d7f7a59423d360df3550fd1dd797d39abaf4e8b548caab6",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a72aa1fe2a0d2cff90ae5eb8856521641a7832c677fcf84492b802819c6d7699",
+ "chksum_sha256": "8575b766cb62f81cf555dbfcda6385a68174aee19d316565b404f4849b1cc19f",
"format": 1
},
{
"name": "plugins/modules/organizations_early_access_features_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1db0b91d80918225658932d4baf92fd924571d9fcc06f4775d17fcce66acaab5",
+ "chksum_sha256": "0c6c7c9b12e5741f9f548fb95d9d14bad7e62bb3167da00aaeb0fa7398dfa756",
"format": 1
},
{
@@ -3728,49 +4162,49 @@
"name": "plugins/modules/networks_switch_mtu.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f44626c6600d29b6db583d5bde6e3da95e4b03fd3f24f9b00c710e90fe5c3d5a",
+ "chksum_sha256": "37a82d27e208b2ef35a5405441977d90a5ae72ed7f659bb010c5f324814a0b4b",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_inbound_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a1ab2f33a06b43ec4119cf8ecd67c1dfba9366fb1b26a20c5f855e964d0ec590",
+ "chksum_sha256": "80b6a53439f8952633d68f6afd140546a8af8f4843fa985a4c4e1f1b08577a17",
"format": 1
},
{
"name": "plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e4b7ecd6c0cd100f5e6c26c573d25579bcfb7eaaf8cd92eeaeb50be9c865d259",
+ "chksum_sha256": "d2351293e2da3c17c50d51d94dad24c43629db41d79b69a46de325c4e49d0749",
"format": 1
},
{
"name": "plugins/modules/networks_switch_access_control_lists_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b32728927090bf1efa352f8d252bb98756b0a286b531caac98b9f3b8516b9f61",
+ "chksum_sha256": "539ae6c810b5b7d3d99db3c01072c4b999a2376f0f0bd397b5b69ad110cd6585",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d5b15fc55e4f6ebf1d5b5dbbf69f083c6a936169dcd3721d52a84ea26608219",
+ "chksum_sha256": "daa99531f49ed65db1c80b6863016d9c6aa9f7b57c2970181b7b4d7d6cdbdc40",
"format": 1
},
{
"name": "plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb4e4e1e6fb7af84425a8ea2616053ae84c75cde980ebdf17a62d452b408926a",
+ "chksum_sha256": "3521c9392f5b8e141120df4e37f65a27167726822530d8c9bc47b56f4ee11a32",
"format": 1
},
{
"name": "plugins/modules/networks_switch_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5ccb1ddfd538519f34098ca35da849c9d625c3d892103bebaa173bda73f6edfa",
+ "chksum_sha256": "1068f7ebc0381f0a941f5388931575c69c135bab254e7d4478c816c7cd76e299",
"format": 1
},
{
@@ -3784,7 +4218,7 @@
"name": "plugins/modules/networks_switch_dhcp_server_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2de12392f5cc7465d662eb7b648bc6e19b3729b32ba7372177bee60111975783",
+ "chksum_sha256": "b37c48ca51fc9ac0708afc8784c2eac1e8ab58937d7bab0871c80bd997f38c12",
"format": 1
},
{
@@ -3805,14 +4239,14 @@
"name": "plugins/modules/networks_switch_dhcp_v4_servers_seen_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f41db499cbb2d8f595f003201eacc7dbafd0a620938fcadee5839d9fec54303",
+ "chksum_sha256": "8a54a3f8851f219759dd55b3b74057e0bd765c12dc277b1d6c52d68a2f036837",
"format": 1
},
{
"name": "plugins/modules/organizations_config_templates_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f6e5888017a9c645a986628f7f1a6b3ff945c4a7fdb9622532ba7c89a2546ddf",
+ "chksum_sha256": "9f2ab9db92c9cc8f07e299bc496ebac20f26b9299a96209ec65523aa33d1f477",
"format": 1
},
{
@@ -3833,56 +4267,63 @@
"name": "plugins/modules/networks_sm_devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "94ae7310071d6eb23bb9afa243be30f1afb1333395641dc2a0b06ed0f21e2f2e",
+ "chksum_sha256": "870e32976e2c102885696b50f57b8d2e73c5d5101887fda44e6ead32122af10c",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_bluetooth_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7f7a61433d5f1a99e3e9dcf550720a490d25737664957a2f01b1120b531be9f7",
+ "chksum_sha256": "7e111eb0aec67fe655f65a2f3d70d5e2ac47859174c141a05f282974debbc066",
"format": 1
},
{
"name": "plugins/modules/devices_switch_warm_spare_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aa12c28233f9d550384bb1707927ab5ab8ba84f5c6e1667d2681425ad282b16c",
+ "chksum_sha256": "6d365c087d200ce1ba4054f7609960463fba0d8ac0771cc0e3c35ac32983e296",
"format": 1
},
{
"name": "plugins/modules/networks_events_event_types_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d6dfeae799a44c41e4db798c72892512649496aea92c6ac4c1d4473b2a0b0d2d",
+ "chksum_sha256": "50b4866c18ec67c8041cc86cdc8963c1cf62c90180365fdbc06dd9b77e84d8c4",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_billing_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b3cd0a8d09a348e6454b38a16db70b5baf3698b677a52898add5846ea1c28573",
+ "chksum_sha256": "7b1efef4c2adcb5dbec224bc7c0e9740ff90e02b5492156a0296ec99669d0049",
"format": 1
},
{
"name": "plugins/modules/networks_switch_routing_multicast_rendezvous_points.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "946cce1715cca52bdbb7edb9a926701c38cf048c3e15c05465731fcd7a7efb41",
+ "chksum_sha256": "45cf83c8279294f8932d4cdf2b1339d10f75e999063aebd7dae4ca6bf7baa178",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_appliance_rf_profiles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e817ff913da88bbdc0c622af20211578a7545cc608457600b52706280e113ae8",
"format": 1
},
{
"name": "plugins/modules/organizations_saml_roles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb76d341d13d43d0248f80496e793f5e935cb9d7d3c7c7114d4a3370a06cdf97",
+ "chksum_sha256": "91b1fd6f9c1d186a77861ae770eacd8ee0f7de7b195302f587947f8ae7a6661f",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_vlans_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b847f35ec2b6ae47dcc61308642666106a094cebae78cc271eb340d6f7fc3231",
+ "chksum_sha256": "10371f80191842928c9b367369e7404abafb194b115e6bec00632073d29e550b",
"format": 1
},
{
@@ -3896,21 +4337,21 @@
"name": "plugins/modules/networks_appliance_vlans_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d2ea80510ad942ad3ef496567096dff3a3f2ce4fdc2969a1395a08c9c646f469",
+ "chksum_sha256": "74a29f6b91b2f60d63d1ce5c1801fad46c1306fb26fb97cbcb402a40eafc1c44",
"format": 1
},
{
"name": "plugins/modules/organizations_devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c449e9d872dd09074ff99f931e400fa8891deb826483c4106953a0dacbb20105",
+ "chksum_sha256": "213435f8e5a5e5b4f823495b4df7a276fd6a5faa7aa2096233944756ecf1a9fa",
"format": 1
},
{
"name": "plugins/modules/networks_switch_link_aggregations.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb4f36261dba12d8ea2a8a4dce5301d2d815c1b76cd2d9b283b4b254959fa5ee",
+ "chksum_sha256": "e3d59ce4d4f894c31ad3f73f28f5d0c57f2126014929d04dc69e6594c7a50400",
"format": 1
},
{
@@ -3924,7 +4365,7 @@
"name": "plugins/modules/networks_appliance_vpn_bgp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fdd2f1e20b38593afda79ec186197dc7536905be85a69f955635fcb056c4cfd8",
+ "chksum_sha256": "5eec6f5864e46533427286cb747d7acf52e48c02769dad8cdfc30443cf4f6dce",
"format": 1
},
{
@@ -3938,49 +4379,49 @@
"name": "plugins/modules/devices_blink_leds.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9ef902307643fcd6dead557175949dcf371bfd9660963cd091eeb25c1668a83a",
+ "chksum_sha256": "56eedd6b9ba24889480061090dbdd5ec7916d03ff862606680ddca4dd905ffd2",
"format": 1
},
{
"name": "plugins/modules/networks_sensor_alerts_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0492b079ea59d6201255241f571e3cded4189027d531f30554646da43c948b1d",
+ "chksum_sha256": "c0a43e2204a15ac78f97d4cd8e73155c19a237fc984b3d98ef885f5601453908",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_clients_latency_stats_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "89887f8c959c16ebace0b07a5c0111187a2d3773b2b466837de5e9f6be71b6ee",
+ "chksum_sha256": "8483ef6700c130313caf5b73bb58f018bcfa178fc8db6d0af039e3d84e5b315b",
"format": 1
},
{
"name": "plugins/modules/devices_switch_ports_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "23630fad3078fb334a5ee257b9319fc65dd80ee3f1ea3efb05c77d865dccc558",
+ "chksum_sha256": "2b3d581e96b439c82d09118e278159a2135a18a946b24a254b34042ac4849b80",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_rf_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "54b5d61f4c3a6e84ab08726660eb201881666e4f6ef99ca2be627392cd164303",
+ "chksum_sha256": "f082fe4bc12b67c96ba6e67da13fac8652413dad5fffac7a232f6110dc54e2fd",
"format": 1
},
{
"name": "plugins/modules/devices_camera_sense.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b8422cbdaf9d49e7f50870a176928864d78b38dc0a987ab8a570eedb478fd0a2",
+ "chksum_sha256": "c4b6f938752218111b047692b65744510514b7675e2f83a1f882abfb8ccd040c",
"format": 1
},
{
"name": "plugins/modules/organizations_inventory_onboarding_cloud_monitoring_networks_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "293c8a4a046429833582a37624bdb9b45ef0830265a621d59622e0d8422dc877",
+ "chksum_sha256": "481bc0b87c3118fa781ac26caf5b1fa13d9d06b57de044d17b9c5bb57b9721ce",
"format": 1
},
{
@@ -3991,10 +4432,17 @@
"format": 1
},
{
+ "name": "plugins/modules/organizations_camera_permissions_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6b682d1645e72d9ea1bcc3193c52af7e85cf1917c49336ff20181d565bcfe7ef",
+ "format": 1
+ },
+ {
"name": "plugins/modules/organizations_switch_ports_by_switch_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "87e8bb538140fa5af88c461f9ade99cc5762834f6f0d4f001c70e9b375023356",
+ "chksum_sha256": "04e349aa44d9a9deb1cb59543b5dd8ab5688a6ba81745a571c409cd1c7099375",
"format": 1
},
{
@@ -4008,7 +4456,7 @@
"name": "plugins/modules/networks_snmp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4c4e8b2c6480cb7865be1fe2a8356e3ae780c84feef39e85486177cd36465988",
+ "chksum_sha256": "4d15124f195ee18f5fe076909ca40d4c495816142088c5b3a4084ec6445a5a9a",
"format": 1
},
{
@@ -4029,7 +4477,7 @@
"name": "plugins/modules/networks_switch_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "20104fc255c7318475f1ea66aaeb2dc1a569a3fccb88e0d8d837c7a22959c9a0",
+ "chksum_sha256": "0d5da453af0d124378f907d43d10f9a209fbd8fb906c22902122382f271c2239",
"format": 1
},
{
@@ -4043,7 +4491,7 @@
"name": "plugins/modules/networks_appliance_single_lan_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74efa315cbecb5cec315d769c7a4ed50a6d4f0f49eac45eec2937787a8fef1a3",
+ "chksum_sha256": "84aa8f8e6f1c97dac76868bab79b54b92cf60ae0c458c4a1704f4891ed96bfee",
"format": 1
},
{
@@ -4057,28 +4505,35 @@
"name": "plugins/modules/devices_wireless_bluetooth_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5d60b9b543ed55838e03a740cdb9646209b338fde7fdea82689be8abf68d0aba",
+ "chksum_sha256": "ff6c14166303ecde467c93a28b9377842063101938357266b62e9c3f871e8e22",
"format": 1
},
{
"name": "plugins/modules/organizations_adaptive_policy_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8c4ee7752da4b6c29b1315e8e98f117b1fb3016c03bc6b66e7bebd9ab309320b",
+ "chksum_sha256": "19f4443507e1aaa9042e1a0264415b3a6aa7fa5c217c2bad0f50fe036bdc1966",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_latency_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6557843bac9515c53f3409a9aa2ac1afd2b3b1667a4c9a78086e886c1b622e41",
+ "chksum_sha256": "8fd3b39a24635059fce2780fa33a5e2d3689b05987f668e86d4ae6f17aa7515e",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_wireless_devices_packet_loss_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "14d4fc50c16044bea465c10a1fc9f7a535f80a97bcf9ddfcedd5fa5df3e2658b",
"format": 1
},
{
"name": "plugins/modules/devices_camera_generate_snapshot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee3458fdf2d5bc56491b8d5e27809e5bfc8360bce8363a15dd325b8ebb161b6c",
+ "chksum_sha256": "c8eb4720ac5b4253336077706b82b331d149aff92c02b47b571a580c7d2684ba",
"format": 1
},
{
@@ -4099,21 +4554,21 @@
"name": "plugins/modules/organizations_action_batches_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ac8a51e0035df076cd4178764ea689c485212b4a87fa70182c97e5fb803c8c2b",
+ "chksum_sha256": "4910c64fe07dc4f20468fc7136c161fa5249fcae4d9a3f84cafbd2f6b9fc377b",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_rf_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d7ae8631ac65f588e348eacd4cf2bd88561453886345307ce31c4ae0461b9dcf",
+ "chksum_sha256": "99fc47b792a2232b4f934ae4cb075d45ae1a6600db556c0b3f4560a6641e603e",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_device_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "430094fb68eb8ae41196ac85f964865b7e1a0072214a5e2a8b3e5d2835fc5b8d",
+ "chksum_sha256": "d306a70b034fc3d93deda8f00b23cb2a0113c5be9b9dd8c0fb35d2e6b69b77ed",
"format": 1
},
{
@@ -4127,14 +4582,14 @@
"name": "plugins/modules/networks_snmp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "26fa59e32407ca7f222de0316d70e3632113e89f488078ef0f4d25926e3fe552",
+ "chksum_sha256": "bdb03e6591c435ed57d185c1b362bf5298331b14ecbfbc3d092f85b7931e2e21",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_connectivity_monitoring_destinations_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f81375a37d8b4fe1c9c39d6510186b1ffd1a1a36b3e79ae450ef581f0ac1d538",
+ "chksum_sha256": "1dcf80863351729d8751568090ca72ffa220808d1263ea87f84e6a9b2a443317",
"format": 1
},
{
@@ -4148,7 +4603,7 @@
"name": "plugins/modules/networks_switch_routing_ospf_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63a5ff2998f0d2cf348946685e2fa12e62261a1f6cc270a59576ba1ad0c5eab1",
+ "chksum_sha256": "eacf7bcecbe82c61c33a140b576f814ce6e8ea85330938d3a4c69d393d5c8f79",
"format": 1
},
{
@@ -4162,14 +4617,14 @@
"name": "plugins/modules/devices_switch_routing_interfaces_dhcp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38378f12279404c3946bfb5cfb1a59f395bf474a4829f8fddf1b8634d4e94f3c",
+ "chksum_sha256": "fcd699e1e7a2f720b2ca305f68e643a924657bc041ab816909084bad8a28a613",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_move.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d03654cf28ed7f46a81186b9c382126429bcace62a9e16bd4e561ce7c38d94f0",
+ "chksum_sha256": "637ab5634854df04a56b2d9304e7f224312f9d36d11a010e884988c726b80918",
"format": 1
},
{
@@ -4183,7 +4638,7 @@
"name": "plugins/modules/networks_wireless_ssids_bonjour_forwarding_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7867180b47780a831a326e934a7d3d855b602e091a78e422575cc2c91d1f0eca",
+ "chksum_sha256": "1cab1978cff41180453056cd1eb3ddaf6f94e4a2bf33a9c0036537c78384b90e",
"format": 1
},
{
@@ -4197,14 +4652,28 @@
"name": "plugins/modules/networks_switch_routing_multicast_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee6b6524474ba8da7ef3a881c2641a531ac2b991f4d4dde730f6cf894636379f",
+ "chksum_sha256": "cec6d994db8a1818635c980ebcd2557b5ea8cc4bcb9bf069930992a455c6e273",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_live_tools_cable_test_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b8e01d3884bb18a49855eb0c9c73f14997a09244a82a74ea430950af6c673390",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_sm_sentry_policies_assignments.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "896dc2b817f292d099607892632d2177c67b07bf8dcc3343636cab2872e85c4c",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_latency_stats_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b3697d439c81cf564e1c7443688c4d3d7aaefefa5b29678be1ab0d1dd26ef0ea",
+ "chksum_sha256": "1215db505f60275468bd690cb8c8e8eaebd697e0ec29b9d581526bcb474876cd",
"format": 1
},
{
@@ -4215,38 +4684,52 @@
"format": 1
},
{
+ "name": "plugins/modules/networks_sm_devices_reboot.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ea0a659b98cab35054afbd056c583c45d1f77eb7dbad680f47ad9d87293096b5",
+ "format": 1
+ },
+ {
"name": "plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "86d6276968a137897c50efd1017156443a515b64df0174c4b2dd60a8010d2a40",
+ "chksum_sha256": "d29657f846ed28565ad384f636d1d6ebb5898b483e371f8fff6ba32ae21d135e",
"format": 1
},
{
"name": "plugins/modules/networks_devices_claim_vmx.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cc077a5dd84eea2c62023f6b7c74dfc187960d55a120600a4c3b059f793c0d96",
+ "chksum_sha256": "7bb5b77819151a79a92008a7af2bfeae84b8e79d5cee8a5870a2a73eb22dd255",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3dad07bbc2498f4070c52de13181c7a81b861f8c20b45cea46321b48020f5b24",
"format": 1
},
{
"name": "plugins/modules/networks_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aab12a6ff15c96ad059f371ea6b9b3d0bb96d2b1a361d5518e21c4eeaa84bdc6",
+ "chksum_sha256": "3e9b580e9d7042f1d388fdd492ef46e65c876c85c71324ad3af4a3f289c492e4",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_one_to_many_nat_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cd2c164f01f039e5092493828345f552c886ea2a79cb82121bc3d6abd453c0ed",
+ "chksum_sha256": "b36508efee6f7d03414e02ea0c0e1f0f7e0a59049a68217c1470f08b2586b02a",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "23813319a6f137d1efee534c878c7927eb03a0c761ae438f06481b684d7f3ebb",
+ "chksum_sha256": "2e1e781a89af4e5a0652b5772ee81a9f86a12f9f3302f80c4b82ef4628a04ee7",
"format": 1
},
{
@@ -4257,24 +4740,31 @@
"format": 1
},
{
+ "name": "plugins/modules/networks_wireless_ethernet_ports_profiles_assign.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4b605946f3f9f886a2db6d4d64e5737ca006d5cfc08ca7edeefb6a6f89c4463b",
+ "format": 1
+ },
+ {
"name": "plugins/modules/organizations_adaptive_policy_groups_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aee60229119c810a82720ba7ef2c72d4b0de0523a9acc36f0be701e94ba59fdd",
+ "chksum_sha256": "e2903a2ce50c27ee59f45ae70daeda2158f9fc8192f6c4854b824c69d1d7e43a",
"format": 1
},
{
"name": "plugins/modules/organizations_firmware_upgrades_by_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1e82c7fae6c2a268ad90512798159aac30e96486d40f76a38997fef7e143a6a3",
+ "chksum_sha256": "f7b017553d6a6bb9f653ec7124d177da99b3156da92548079e13cad76a29995a",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_splash_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5a1140e12c14ea780d3a07ef68ce61269031203227f2443092c8f6267b63a897",
+ "chksum_sha256": "d63f8c0b351b6833132c54afee4ae77f329a803a6866a4c078ee7449fe6d60a4",
"format": 1
},
{
@@ -4302,70 +4792,70 @@
"name": "plugins/modules/devices_lldp_cdp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "98f4f6ec779c940300043ecb1f637222359207f20c078be857b4fb22f17534e8",
+ "chksum_sha256": "74ca5e7856aede38a9aea3a3c2af0cbd862a2d8f197dcf8fa01dbe719494dd80",
"format": 1
},
{
"name": "plugins/modules/networks_switch_stacks_routing_static_routes.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b2ab9f92c9cf5b89ddb4539f253c2c33c5c1f4b6b0d601e7321d203360772e92",
+ "chksum_sha256": "e33edffc190e40a58e4a425af2fb94d562be44ce84af11b690bbb419fcaf745f",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_security_malware.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "10846cefdb3843d456295ffa4949fd0133b4a9039d23094e422b9da37d5110ed",
+ "chksum_sha256": "17f8995ecd9ca30023673e08f192455fcd8406b62e30849633157aa3b7d3f3db",
"format": 1
},
{
"name": "plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_warnings_by_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5e44c9d2b84aaa575fef7b3c8975552531210ac324a6e3dd1aa41489b70b0e85",
+ "chksum_sha256": "3f6cae60e3bd473e8fc99a79198856bba1ce3d29168c2a984a271e3e8b944dbd",
"format": 1
},
{
"name": "plugins/modules/networks_clients_overview_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4452586026214676b6c43ab7a7cd217c7f96633f5149cb3c5bd83347b5d26274",
+ "chksum_sha256": "16025a08c4648a34bd9897793747b4fd3033fdff011b09e1afed8c461bc8555f",
"format": 1
},
{
"name": "plugins/modules/devices_cellular_gateway_port_forwarding_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6925ac9f999541153b08993354014823c52370d10371ad44cc2f3cdd234622c9",
+ "chksum_sha256": "376f466b278b23bf8121f46514966c9bf9938b03c430c994a60a661539571e47",
"format": 1
},
{
"name": "plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d551a027c41f86f27cc666a254f7cc8dde81e2a6d1d160fce405314bb608f437",
+ "chksum_sha256": "6113dcefb731bdc58134a9d3163e9b8278f9c7c0225837be088e61647ad9e173",
"format": 1
},
{
"name": "plugins/modules/networks_sm_target_groups_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "681175fdce3caa51878a8b8bf5902f006fb1aff2fe8f96d9994f88d3084676fa",
+ "chksum_sha256": "57fb8d5a92c2aacf97d96d6bc10b567ef98634c5ec3b6b2cb93ca56a7b31af76",
"format": 1
},
{
"name": "plugins/modules/organizations_adaptive_policy_overview_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4ddd3e2643154bab72ea6455d2fea5892f3b530ecf4364c963271d29ada146d5",
+ "chksum_sha256": "40dd304a36a38c0288e089bb7364e869fc1cda2362aca1292efca41544e7ea66",
"format": 1
},
{
"name": "plugins/modules/organizations_saml_roles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "017e596d5e2c299edea7569e4b014a8e50c2c340729e13f2890c142617061f1c",
+ "chksum_sha256": "6f4400141887e5eeeecdc8ce2250113de8d85618557c73c41cc4421b7367ff98",
"format": 1
},
{
@@ -4376,24 +4866,31 @@
"format": 1
},
{
+ "name": "plugins/modules/networks_vlan_profiles_assignments_reassign.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "74ada7cdeb62462c32a4f839187e4d2da96cbafb505ecfbc971cb69bf8bd58e8",
+ "format": 1
+ },
+ {
"name": "plugins/modules/networks_sm_devices_lock.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "49748bfba72e76c037d14667b202e78baf4e23a37b863d8e30d30ea32174ff3f",
+ "chksum_sha256": "e833a24754c18959f1cb95eb8b3a988e554015019633f444788d4112fc968864",
"format": 1
},
{
"name": "plugins/modules/networks_webhooks_http_servers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a66cc99b4ef501c293172312f2ba0dc57bfce2024ec9bff8be314d6a8bc86287",
+ "chksum_sha256": "2d07726669e12a782b98e8e2d4cabdb20fe340ef95f5512e0c9437530930f1ec",
"format": 1
},
{
"name": "plugins/modules/networks_sm_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "751811c0d7b8c037f3c5cc53794c7a0b688fe47543a410f6b27c5bc38d931e08",
+ "chksum_sha256": "ffb67d3148943a3653c341c1cc5cd249efceb70453f32efcce622e2738d17ff2",
"format": 1
},
{
@@ -4407,21 +4904,21 @@
"name": "plugins/modules/networks_switch_stacks_remove.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fe3cb0cebd918d26e93a49a98d580f9cd8402caf3e3381cff69c5032b282774d",
+ "chksum_sha256": "3f8965074ae7422cfaaee3fc52e68e89d441ffa4d7aa95c0dbabd61251948eee",
"format": 1
},
{
"name": "plugins/modules/organizations_clients_search_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c7cb68ccbca67bcb1adb452ae9577abd2fde169cc04990001c2aa376e6a07997",
+ "chksum_sha256": "a924efb8e72c53a68173732fc168e3e8d0478df3db5b3f27e6e6fe575733afe4",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_traffic_shaping_custom_performance_classes.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df36953bfc0d394a36dba7ba99ee01af177aa698347da9af8e8fa73d6c0f4bcd",
+ "chksum_sha256": "a0e4238c30186d891fcf6f12555de7a445116c2b61a854da6bd02bc7f55678f5",
"format": 1
},
{
@@ -4435,28 +4932,28 @@
"name": "plugins/modules/networks_wireless_alternate_management_interface_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "936a15f3c4d22a8cb0402b4a07c4bcb7fd27ef15bb027930b10c67ecd98aa38b",
+ "chksum_sha256": "68b5e1701e3fbad8093b390a644ada854fd29c7db57c284e80191e63f73283b8",
"format": 1
},
{
"name": "plugins/modules/networks_webhooks_http_servers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "79e54e69fef60d631ad2fa4a13b384e2ddd1681396a37897a7f9914bb670d184",
+ "chksum_sha256": "e8c67e04a2be2ca21acb669943fa681a95c85c775e4551067ebb0f3d73c095f0",
"format": 1
},
{
"name": "plugins/modules/organizations_config_templates_switch_profiles_ports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c9a56e543f5411737509b02afb5dc7644405de800920b4c45e88683cc88c33b",
+ "chksum_sha256": "4e23f9215bc7507b9b80c18d3ec65c597beeefa4caa65d999e1cf3f01091ddb9",
"format": 1
},
{
"name": "plugins/modules/devices_camera_video_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b9830c67e320da7dbdd67c653bf97c8a56fa1910400489cc01f6a0bd07401b67",
+ "chksum_sha256": "01d3e4a815355ce9f27d49dce73fb39950469bd27e0b850cbd40b0cbea6a3a2b",
"format": 1
},
{
@@ -4467,10 +4964,17 @@
"format": 1
},
{
+ "name": "plugins/modules/organizations_camera_boundaries_areas_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "14793761234efc01472d4933073f743928bff12f9e39333bbdf76f854bc703b5",
+ "format": 1
+ },
+ {
"name": "plugins/modules/organizations_early_access_features_opt_ins_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9bb6e8491e2dcbe1d299c01b731bfb6391286f8fa6d88eb1bf604d8ad1411529",
+ "chksum_sha256": "8e121e925c9eed38c4350ec641d87963322a3236820f242269b508d3911a6430",
"format": 1
},
{
@@ -4484,21 +4988,21 @@
"name": "plugins/modules/networks_wireless_mesh_statuses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8c5e51ac58d950cde23f81b90b2ba6d862cad86096db9e00330e44122016000c",
+ "chksum_sha256": "bacbb95a9869d3f0f9df4597e0fc2f1ecb95a707ac37c9386321192d4bc0beff",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f43c510b853ed5539069c1a0f3711dc28a75f3c98e8d16964d4a75cf95d0b9d7",
+ "chksum_sha256": "a2b272df4cf020fb08e66c5365da1a7170ca6a3f73d6e3a32b827460f0acecac",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_wipe.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8fc551e656e4a18d8a6a5a98525d28ef6766eadb3faf7a5b1ac6bad96d61f8b6",
+ "chksum_sha256": "7595f4f6547c159b831cc548a79951b0ea58e7fbaea052613802c53d60bacd12",
"format": 1
},
{
@@ -4512,21 +5016,28 @@
"name": "plugins/modules/devices_switch_routing_interfaces.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "98777571178be389bfb3d5315c63e5a041b46ba95d334d2f92ff6265d4ebc8a5",
+ "chksum_sha256": "3a4916f4922b5d03f9d4350184b43280bff343344eb0b62e1f64586c51176603",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_bonjour_forwarding.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1856a26af8e657a7caced76e85730349783cc987802c3a801f19e8832eaa60ba",
+ "chksum_sha256": "f1629e842bdd653d3ecf616e393a580fd76319c4a9c47bcc98ed79e30c7ee8ae",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_camera_boundaries_lines_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b71b911ac4363a33780dd64a0cad87be6f0ea2074b17ea3fe64a107cdd20b8bd",
"format": 1
},
{
"name": "plugins/modules/organizations_adaptive_policy_policies_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4115e20d8f9cd9a9940a0f05157da1822ced3cfcd283ef1a450679176223e9aa",
+ "chksum_sha256": "7a71b4520b803552613295aefa7a89280258f38ac1c045c3a9c03f02c20115ef",
"format": 1
},
{
@@ -4540,7 +5051,7 @@
"name": "plugins/modules/networks_split.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4fcaa28f4b81e9eb7caff90a607f1d9aeec17f817ce8e3af941454f56a5e4676",
+ "chksum_sha256": "5472f0460469275804fe8b366bdd2000f8f57eeeb8d1eaccb6103d5150756d2d",
"format": 1
},
{
@@ -4554,28 +5065,28 @@
"name": "plugins/modules/organizations_inventory_onboarding_cloud_monitoring_prepare.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cfefa4522938d41a07dfa8a8a774b99a9d634037c1bf545ae5d3166c96834344",
+ "chksum_sha256": "a6d279856c845f0015ea7d3594413924a272d901dc1943646807abe76b147914",
"format": 1
},
{
"name": "plugins/modules/networks_bluetooth_clients_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "42fd9dbcd146c383b6367d954a6f1c4cf0a3cb0488dd8e5dae320aad86dcd01c",
+ "chksum_sha256": "f1544b7a78f099c0403f72042a1176d64d195e2b0b53379c4ac11ee42de3639d",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_desktop_logs_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0287346b3adbf11769971a259fb4fdf2a3c79a4ea35d37980fd06c1db2d69850",
+ "chksum_sha256": "ef49fd089314a0a785175d6475683daa6a23d29b246bcc446b6ae83b693a6e28",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_traffic_shaping_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5e020bc9ca03c33c28acb2536bc6f267e0d387660693b971386c420b221694d1",
+ "chksum_sha256": "66e566bc7b1a692e462c3a30ac90d04e2728547505b2de5d4eac28ce140e7b5b",
"format": 1
},
{
@@ -4589,21 +5100,21 @@
"name": "plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "380196a73190e001b6482d1bc42ace339bfaa667b1710ac18c30d4435f830efa",
+ "chksum_sha256": "6f358d330e910d7e5e43a65740faacc81fab3c9bafa37e0a40ae88579bb1d425",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_clients_connection_stats_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67776161ff61f4404cc5fa5ae721ba7c521f5332d5ccaccfd27864a8649b21e5",
+ "chksum_sha256": "d5de135b9eb13c543b34d18ae8a5d9fa0d8645dc3de458c2509b0877cb0dd6a1",
"format": 1
},
{
"name": "plugins/modules/organizations_summary_top_clients_by_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "edc8ab3705a85acce648c64de4b1c5294fc163264f865e5a24cf56a35ee2d7c3",
+ "chksum_sha256": "1e52b21b661050f03a93c60dcb93e430021f3c29c2b99d54b2fc891ca50bc60e",
"format": 1
},
{
@@ -4624,28 +5135,35 @@
"name": "plugins/modules/networks_wireless_channel_utilization_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b7ed816c142653cef4977c41c27e133e54022119910950755e3871ce46277f6",
+ "chksum_sha256": "f259a09f68f644f978964b145cc00eae574138810f0b9f67f9501c26f6f06d8d",
"format": 1
},
{
"name": "plugins/modules/organizations_branding_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2f0c6e67f78ee5e35f640ec181f6378aad787cfa91bb3413acbcde42ee5b2f2",
+ "chksum_sha256": "e9df6bb20a8782fd8fb665ff7752980d2dde0df588e7b1df7c8e58fc964b2579",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_wireless_devices_packet_loss_by_client_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "34f4c55f9ea227ce10718a21efe8249732bbd012789b61de96cbf8a438694ec3",
"format": 1
},
{
"name": "plugins/modules/networks_clients_policy_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "470ddbdbedf596e494b3491a535daf29538d36d3e158b44a667fd8b4ccb7343b",
+ "chksum_sha256": "a17bbed12f9f9af892abb451ace258d46a68b997c9cd5ae7dcee328fa9f7e656",
"format": 1
},
{
"name": "plugins/modules/networks_cellular_gateway_subnet_pool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "61bf65ab9dba6fbaca67c2fa1e47b3c404b992e24cc2e9a4d2a70d661b46a85d",
+ "chksum_sha256": "8a0e9706fb011f9277f75e2841f647d5a361070058f12d5295599eaf0581c799",
"format": 1
},
{
@@ -4659,28 +5177,28 @@
"name": "plugins/modules/organizations_summary_top_devices_by_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f07a9e7dcd0764c5d99810d4d38ca70ff12b2c96e911127aec176394a6ac03b3",
+ "chksum_sha256": "5c808fdec2f9e7991fc892aabc9b698d636d60a96c1c11d3a1103131f28a7ab7",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_identity_psks_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f2a25a4bc32413f89c9f311ce672305ea0ec6f46aa0ddb562bb6d9a8d5807253",
+ "chksum_sha256": "646f5df95c9b8986b3afa65b578f7e6bfc9f4a0e095d669e7dd04a531dfeea88",
"format": 1
},
{
"name": "plugins/modules/organizations_camera_custom_analytics_artifacts_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0828135910c287a1e4b27e3aa4a17f0d3b2c0fb20ad752fac1d99ba54c8a0638",
+ "chksum_sha256": "7fba046945739c9a4ed14beee37ffd03f14cf8b8e5a1d85933048e40ec229035",
"format": 1
},
{
"name": "plugins/modules/organizations_admins_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f47ef023ac4f8b540d2f93e375a5007df1cf472a36d526d6c51f43bea7c7d23f",
+ "chksum_sha256": "e36532e2919a516852c709a7e78347b773e5a3d0d82e92dab1c7fad03f299fef",
"format": 1
},
{
@@ -4694,21 +5212,21 @@
"name": "plugins/modules/networks_policies_by_client_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b07ee388ad2788b64f5f2dc073ae42d17fc2992392d2502b95346cb65ced81bf",
+ "chksum_sha256": "088d69e143ab19cee336d1806a887e086707564b473b56d54b2adba99077a40a",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_device_command_logs_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a3d44eae2b64f299e8593980235037908c36f9e83242e84782f8b3f1de60a8d",
+ "chksum_sha256": "49f611999f1de22e4dea4b16ed3971b6ae104c4003a2fc78ffaa8c09df041d88",
"format": 1
},
{
"name": "plugins/modules/networks_alerts_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd728efd350e2497489c549e1d40ed19bdf1fa1284fb798a972768af51a4734f",
+ "chksum_sha256": "a4865146a64588dfbe2df2a10b83479b82bf6344104284dc7b0b416132fa63ad",
"format": 1
},
{
@@ -4722,63 +5240,63 @@
"name": "plugins/modules/devices_wireless_radio_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cb8b20babbc7b2d9142dec0caa623575584deca67ee0317cff47a5243df1b15f",
+ "chksum_sha256": "3cc1aabbfb001e011c79185aaa281aecfd303c9b95caac99921f9dc3191ff900",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_warm_spare_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "49e43aa22b709183026e375cdcd327c0962ad223b5e0e38d33e46f68aa70bbdc",
+ "chksum_sha256": "452223aa02320dc04fd71bd2a7d9f6c59b4b19e4f5e47c1b5cc008f7b6d0f44f",
"format": 1
},
{
"name": "plugins/modules/networks_switch_dhcp_server_policy_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9cf93056ae056637a8ad904abf330b7acac72906b8c608816cd3ac7d4a82a22f",
+ "chksum_sha256": "c681b3edbebf3b8477b4187346bc063cc1e1eccb4dbeeaac6f10f43dfbe53058",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_client_count_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "636cd3862b2ee877a3d56d3e43a020be5a1056e6798562b84d75a2b41625fc4b",
+ "chksum_sha256": "bcca66e9ff358948f8320caf2e7eb1e62a65d907f25eac0876637610748befa9",
"format": 1
},
{
"name": "plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8e4fbe927b0c6ccda76c8a6a0b5fffaaa15fa915197c1f223e2d6b1dfef2bebb",
+ "chksum_sha256": "8b79c87fd5b80d4dbff09f09f0c6aac309692b19c19299fe4d136ede3aacc342",
"format": 1
},
{
"name": "plugins/modules/devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5f3ce5d75286e16b0cb6fa79344363f3d44f2a0bad18382a3cef76ade9e6c54a",
+ "chksum_sha256": "334c7e7fdc880f316a6423a46aeeb7c97276988f7e7f8e199abe7a39fe46f55f",
"format": 1
},
{
"name": "plugins/modules/devices_appliance_uplinks_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4dc5e3e4c41b3f897fadec77c96cebb2fc503b66ea496a5166c7cb6a16ece283",
+ "chksum_sha256": "4323c8e9276b449ec4418df876b4b3a13dc354a67e34814e45ad7b64e2b04726",
"format": 1
},
{
"name": "plugins/modules/networks_alerts_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "07a2d6b24d2c35866e1326cd3a7e04a7cf068b972b7cd98819bf449cf32c32fb",
+ "chksum_sha256": "f55dea26b1f2ecebdd613fa1d1e5ec7a5b2934fc8e4c050e0e29fbc04b75dec0",
"format": 1
},
{
"name": "plugins/modules/networks_sm_trusted_access_configs_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "495fbadee85b4d0d986fab94401de3fb84d756352b12267184fb3ad11a1d4ba2",
+ "chksum_sha256": "3f4b6d3a47ae8588f20fff2a9a7dab12c2850ed941aa3d8e60dd3ea08a44de60",
"format": 1
},
{
@@ -4792,112 +5310,126 @@
"name": "plugins/modules/networks_switch_stp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5780ee51a6eb36b31bc9b1e83ded4f24e60d4593b55cece1f391a743fb50f0fe",
+ "chksum_sha256": "1ea4988dfdcb92cba570261b559971fa2894bc1bb57a376834952aa0f083d669",
"format": 1
},
{
"name": "plugins/modules/organizations_licensing_coterm_licenses_move.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "575035dbb40f7a4e78e1e35eb82af6e072b2d7f58192067b39cd28dfa26da106",
+ "chksum_sha256": "aecf0d50a5973d1b4a23e398a3be6e99388b4dc23fefcb43d9621bc035120450",
"format": 1
},
{
"name": "plugins/modules/networks_webhooks_webhook_tests_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fc6612df2282af8fe477be921526e8176d5d48cdf02043b8cc251e442fd20344",
+ "chksum_sha256": "8c65003ad9964aba51d5593e005aae7b8d60cb467f297f999d8e1ab35ed9289b",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_staged_stages_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7baa545e768680a35f8f932f29243d90a6daf1f591bd051b4034d45bf5b02a03",
+ "chksum_sha256": "de3dfa5e7f96b6ff0733a02f9c830c673085457d2f475beb55f233c460b88afb",
"format": 1
},
{
"name": "plugins/modules/organizations_login_security_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cacf70bfdc1f62e92e4d8393d2fca47aacb5e5458fa205a80823357d9fb2ed67",
+ "chksum_sha256": "45743ad76fcd4b1fd4665e1a6119c392cbe36298240ca400b7477f9aa08b85fb",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/administered_licensing_subscription_subscriptions_compliance_statuses_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8b9b15e216d8d9d796c1bcdadf902dee41523ae74d563053118f6b9bf3cab0cd",
"format": 1
},
{
"name": "plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "abb0197d8dfae662003e24c2fdfdf639f3e2726e781b1caba3ac680a62b14f02",
+ "chksum_sha256": "a4bd210bba505976dd37fcba59087accbed7714e105603e484a9fffd4c005bb5",
"format": 1
},
{
"name": "plugins/modules/devices_cellular_gateway_lan_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "350984a9b13325440f31e91efafda21f66b4047f0de970844c0c4e71caa66691",
+ "chksum_sha256": "14175bbd0dca4f364d2a95d46f044990a7db4586a634b4df15fe2efe5e6afd18",
"format": 1
},
{
"name": "plugins/modules/networks_sensor_alerts_current_overview_by_metric_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "203a6b56021cd0c10662b59d31bb8384613781d0f1f4bd757d2aeffc1c6660e7",
+ "chksum_sha256": "69a31868a14f793a75befa3b7c64654e060d4f01568608ab8adcd8f2854b5c89",
"format": 1
},
{
"name": "plugins/modules/devices_camera_custom_analytics.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2037c313b06f92a46b67b740ab459e962185859fa489766f06a753fa498b85e2",
+ "chksum_sha256": "25d00850e59d3f316565c9e8f4e4c1423a723984a15b92f4afbc60c0d65c6041",
"format": 1
},
{
"name": "plugins/modules/organizations_adaptive_policy_acls_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95c84605e2a7b19206b64821569e4e10a9bb4d682fdc73e0b6c190686b0fa7a3",
+ "chksum_sha256": "835feac90ee37a24ee62dfd086173b94b1d86a1fa3a4acff879ef65e15754704",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/administered_licensing_subscription_subscriptions_bind.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "134141674d881af00fc490349ea20e7a31184c598368d6867d6da7cf1931b401",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bbab1f08ef27465f2d982439a00cdd228eae958a1386fb15c260fba70b87e775",
+ "chksum_sha256": "31339aec5e0a77644cc1b13fc4026d014092b97651ad56dd25415811fe4038a0",
"format": 1
},
{
"name": "plugins/modules/networks_switch_mtu_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "12b6b0afc42ed9cc260039c1c1a5f93e83e7803d25b6574fa046854ee38b0cc9",
+ "chksum_sha256": "d24cd71b5df8b3963b1e7c1bfb9cbf527ee323cea25aba8657c3785e7b571dac",
"format": 1
},
{
"name": "plugins/modules/networks_netflow_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95d1a58f93b47952f3314b2973ff4867a5056f63c339be7ca85c58d348034311",
+ "chksum_sha256": "5826430d5b0f3bb9caa1bd3800c44701d7937e07f913189f71eb746509d98922",
"format": 1
},
{
"name": "plugins/modules/organizations_saml_idps.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "96c785a6c6c015a539197c4db9de55c115a91de02fffc923052168aea2e100e0",
+ "chksum_sha256": "f32ff9dbb000477470516b55e6bc1f450b4085dc447471f9c086d68b33903c7e",
"format": 1
},
{
"name": "plugins/modules/organizations_config_templates.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "652bfaf6f41532fceaec31025c3056a39119953209302aeca501db0731561f48",
+ "chksum_sha256": "224cc6bff7bf309348257058a8779a686bd91ada77261f8e50b0abd0643c4fdb",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_schedules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5ef03ec07400e013311eb0da7d593dad7a267bec5f02747f149a09889f742e09",
+ "chksum_sha256": "74217d5f666904654d992de9c17b8c8cf4c6975b0fc4cd933aa6e6579780179d",
"format": 1
},
{
@@ -4918,105 +5450,112 @@
"name": "plugins/modules/networks_switch_port_schedules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0d37dae408dc1ccc85964e89d424e16637386c87a3b17524feef1c19c65392ce",
+ "chksum_sha256": "53c9d55c55e7607b6bde9d98f248f6eb1393e6582d46197a860a81faf7431d66",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_devices_connection_stats_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "93d84387781f4d12b21612778c4e570abe5dee6303a36e43b1411cd744f7e40b",
+ "chksum_sha256": "808087abf6c73ad8c7b58986077aac05f7c3da07dde4535029cfa37c68b91018",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_prefixes_delegated_statics_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5090de65215835b66210179b1cf552094832bdec7ff222ac40a6867a8ccb4d7d",
+ "chksum_sha256": "f9462890460a6712ee2e323bc3e365119554ac2b0c81cefb155c3a161da84273",
"format": 1
},
{
"name": "plugins/modules/organizations_policy_objects_groups.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "49e96eb0efbc3ce4a2eae2adac7d01673626b7a2c9c0b0755fab3c498aa11cf0",
+ "chksum_sha256": "d1b5256e789f17265810ea32bd4b856963ace83341d08506aaaa4bd5fd991f94",
"format": 1
},
{
"name": "plugins/modules/organizations_sm_vpp_accounts_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1ee62f203fab6d26e761379f1a994d3ce60446cd14912004a043de5f65bf3681",
+ "chksum_sha256": "239685f7ef2caa0549a9320c296a2cff0310b9fb82176cd5f10edd0453e7eab1",
"format": 1
},
{
"name": "plugins/modules/networks_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e995f911b9b20b9abe417f5980f472c8544874e1a95a5bca9579fd7901476a2",
+ "chksum_sha256": "bed4b4a0cffbf7a0ac047e2ba69536c2a52fca418cc58c95818c4bffdb2bc151",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_ssids_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7043a6e3fe2d0f0f8a6fa9f53f6fb0fbae22486f5fcc241ce1527ce0f610765d",
+ "chksum_sha256": "07c642cbd4dea66e1d7f722e475df7b6a1f044bc87295f5a5d11eef772a32db5",
"format": 1
},
{
"name": "plugins/modules/networks_switch_qos_rules_order.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be0563b1a3d09201413b8894ba597bf71781923d49d30fae10c8c0318e9a1b1e",
+ "chksum_sha256": "0bd0f2f65f22e1a16f87266fc665a50d589522227b13d1220deaa5410c85d201",
"format": 1
},
{
"name": "plugins/modules/devices_camera_video_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0e86c3ebb48e126d12e7b6ff3cafa993d8c807ef907a1a4961be05b57c32f715",
+ "chksum_sha256": "e929514c4f6046f238eccb7850f965b6359f4b38730f2b5f661534f13205fd1a",
"format": 1
},
{
"name": "plugins/modules/devices_live_tools_ping.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2045bee53c6acdcaf7723d891d465cb35e946b84bf1423f612e00265d37ca3df",
+ "chksum_sha256": "15404bacd0aabadad171b09c4bd78fed50f9cb00646ecb4d81a6938788e72400",
"format": 1
},
{
"name": "plugins/modules/networks_meraki_auth_users.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8fd117bc475cb2d55951b9c5f6b410e68127a76a36263d837bc6582f30c2fd7b",
+ "chksum_sha256": "2f26b0bd8b2f08d2b39fcf89a793cd28717dabdaa901fcef0501079a6269ed7d",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_camera_roles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "377891dc86f896a73feaf9c05639f5e2c2d1209ed351e4055809fb9d88af807b",
"format": 1
},
{
"name": "plugins/modules/networks_unbind.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de17926db0161a0d8c7d8d07df67f425b5ab4b8bc07ba5bfa22f600f8c6b5844",
+ "chksum_sha256": "3be1c3b55f9e78d9ca88c3f49a6e4481407965fb3f2416806b67727393df90b9",
"format": 1
},
{
"name": "plugins/modules/organizations_config_templates_switch_profiles_ports_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f7757dc739f587b20c2ee53d739df18e8394df2da06ebaf2be34e0f2a725c51",
+ "chksum_sha256": "b8e5ea805a776fd52aa9b09b59b6be172901838972def856f6e2f17c18eed5ff",
"format": 1
},
{
"name": "plugins/modules/administered_identities_me_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6b064b33423a7fbd0fe8a22d0f7de8d581d57e62c12f0c25aa2d9f9a901a7895",
+ "chksum_sha256": "82bdcb003389a2eb700806ee649d15e6f64218abbe97e9b08fecc85e4ccc5396",
"format": 1
},
{
"name": "plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6c36e431e5e43635dffdcd536eccfe9b251f2374d39f08a3df340d4097d2d327",
+ "chksum_sha256": "bc2f3dca565538531e01eedd1658d8038ccf6da7e9ca9b3a429ab6a9f32661ca",
"format": 1
},
{
@@ -5030,7 +5569,7 @@
"name": "plugins/modules/organizations_summary_top_appliances_by_utilization_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7ed5a6c77e822f2ba851b97489c90b878180db6a3f3a194dee47a84387b09e9e",
+ "chksum_sha256": "cc3fb8493a2076d44b6aaed6ccac128cfd083e2b42445d76c7139dc291567bf7",
"format": 1
},
{
@@ -5058,21 +5597,28 @@
"name": "plugins/modules/networks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "97622672289623cc260df389f5b68ee0972fc929fa329ceba654af36d72635c3",
+ "chksum_sha256": "fa9dc3f8789bbc902df25241e24c4a468a8f60bf7ba0e2e0bb7587d00e0dd5fe",
"format": 1
},
{
"name": "plugins/modules/networks_insight_applications_health_by_time_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb08491bc17a5d19f74b8041d510af8c8122ffdff70381b54b2b539f08c25c46",
+ "chksum_sha256": "72f8552a442400df52e58e1dd9551463c7b4ddf076f2a7bfdfba73e3ef6fc2a6",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_security_malware_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "75c0fca25ea933a43f2b0f2283feda2566993a2ef2359a5ae22c99ced184a7a9",
+ "chksum_sha256": "9cdf917e9be2dfc9db0a8776c682bbaffd8071b258ea259eebdbf4de4954ec59",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_live_tools_throughput_test_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b220d780e4e7199ebe118c7240b673e1225b764d8b8d1d4f77a367f7f2b6a98e",
"format": 1
},
{
@@ -5086,7 +5632,7 @@
"name": "plugins/modules/devices_camera_sense_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1740cb529969e28725fa2f1f0a7e8e513a60fe42ca6bb45f7d2feeefd343827d",
+ "chksum_sha256": "246e40597ea41dcf8131e9c0683812b24b11fa63a70524c55bb9231d7b604773",
"format": 1
},
{
@@ -5100,7 +5646,7 @@
"name": "plugins/modules/networks_switch_stacks_routing_interfaces_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf3d8cad99b1c87b340a6c30059ecbf37ae6551dca889009b3da50e0569cd66e",
+ "chksum_sha256": "65a12c564870d7d595c6bb8579d24adb76caae48d5e105541027160a0f007dcc",
"format": 1
},
{
@@ -5114,35 +5660,35 @@
"name": "plugins/modules/networks_appliance_traffic_shaping_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29468156845d58bcc22976d13d527a2802f918b084644c1bca8196c2f7994e89",
+ "chksum_sha256": "32f96cc3017cc4e5f4cba4c8793d78b0a809d9b4ad8cc5d6b9ddbc1dc4e0fcbf",
"format": 1
},
{
"name": "plugins/modules/networks_switch_stacks_routing_interfaces.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cffc90e3bb443d67fb775a7bb38588fd1355a566fde226a87979007e59ef7852",
+ "chksum_sha256": "80c9c576519766a3598db5c95eb657ba7dd1682fc20d203387e97e494c34937e",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_ports_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "51cd4f92893b8117096b162cf9a19a9ca182763665a938a30a64e80822b5f04f",
+ "chksum_sha256": "75b9e41684dd633fded7fe759475980e3777b2bc379d5b9b27630ea2b117ae7d",
"format": 1
},
{
"name": "plugins/modules/organizations_config_templates_switch_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "15efa5f83e6597cf1818f2a8448fe6d6a54a4156b2cf47f0ca198a5ef62c2881",
+ "chksum_sha256": "2405617ec85a6ca92832037a9c3bba2e48930c2a759912f2531a173796535ee6",
"format": 1
},
{
"name": "plugins/modules/organizations_licenses_assign_seats.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fa896238aeb11010cc3d2b17363eb030d582c43016b06d39d6e89102bdbc9f5e",
+ "chksum_sha256": "02e27c187de27da8594e18c39e9f64278fe2733b8a002a0b7d93d267e3466408",
"format": 1
},
{
@@ -5156,49 +5702,56 @@
"name": "plugins/modules/networks_camera_quality_retention_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7ccf75dd55b222f453911cefde1ece1f7d0969c7e9273bca843790999e527c38",
+ "chksum_sha256": "d618f1519f05e5bb34e8593fa1985537dc914e2600aa5d1a037ac6239878f81b",
"format": 1
},
{
"name": "plugins/modules/organizations_claim.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "961e35df89916c35d2842eea40ed96eecf1056a2418b3f49364541f5e1ef69fc",
+ "chksum_sha256": "f2a8a6cbbaabc293323eee8765a32d46596e7df263ad808f5accea3e32323a34",
"format": 1
},
{
"name": "plugins/modules/networks_switch_stacks_routing_interfaces_dhcp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "94651618f7aca94b5c77e7023c9e3f0559233dcd8462ce1d6bb6bc9f428d683d",
+ "chksum_sha256": "05ee26c57d9e6625ddaf4a6d60d8a7b07e6434024f815a2ff84c0ec2f225b46d",
"format": 1
},
{
"name": "plugins/modules/organizations_sensor_readings_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3922bde87f94848bcf40d2fe226e923416195f13ecbefe6253bbaa74cd152b78",
+ "chksum_sha256": "61d8c43c50f2ebf905271f3da709f9628211f5fc6f516346f4da8ae28c453fcd",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/administered_licensing_subscription_subscriptions_claim.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "105070107bdb634df983a2c6b6f52da673e4142c024fdc42c1640aa5266659f2",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_ssids.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a5e5d8856bdbc4f660782df5db4ae255458a2989a6b33004a62c1503fc7aa21d",
+ "chksum_sha256": "80dca1690ad2869e0e2062c2636d85277059800335755579fc0cfd215a0d6a6b",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_traffic_shaping_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9a4fbcda9ed7ccbd8adbab30ab10b89a02499bce2ff2364decd4e8397ed063e7",
+ "chksum_sha256": "142d7145e4e9a169a44db8674b283fdaa640e79bd800b05a12062d4c28f571c5",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_eap_override_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "14ea69b8d0f79d7082b1221eab3f99f0be7889daa80eebe4c05e81b7b974cbc4",
+ "chksum_sha256": "9bd8ebfb889fad29461b282b6f6d2fe8de3a524e34dae6a7837498dd02d25ebe",
"format": 1
},
{
@@ -5209,38 +5762,52 @@
"format": 1
},
{
+ "name": "plugins/modules/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "dd9e5321f7de648af64a401957ad25aaf6ea2dbd7ee01f77a13538dba95032df",
+ "format": 1
+ },
+ {
"name": "plugins/modules/organizations_uplinks_statuses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "23e5a27a3764cd7a28fff1c943d9dec9b1b0269d5584d2ccc1325eba615d2f4c",
+ "chksum_sha256": "8c2a5d4e82fae15634fe560cbb94e6c2712c4746268e8dc03a2d907684c81a12",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_wireless_alternate_management_interface_ipv6.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "967de578dadcedce1d553303cad5f6169ca529f6231f667d5af0a3a9dac6895d",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_single_lan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ce4bf55601b3110749d4b792a0d389d23cc8e13a797ab0e5ca633fae625ae787",
+ "chksum_sha256": "db3e8a10f9e6e75e2c3bafba23b31b5adf1475d5cb552388d610072f7ed628e7",
"format": 1
},
{
"name": "plugins/modules/devices_switch_ports_statuses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a50f6a57ac1aae5a0b2e8e7f70efb268395de17a72f8a612fa3b0899814fcae9",
+ "chksum_sha256": "9aee4427bd15bce2cd8be88309bb3964be34803859dcf4b6751619ae175d2849",
"format": 1
},
{
"name": "plugins/modules/devices_switch_warm_spare.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f74d272ffd5fb8fd7aa932782b12154037b6461baad840de6071a9a0d5f948a",
+ "chksum_sha256": "53bc718beba268ede7d5654084ffcd05bbcc4f521bb163796d755fc4c149f3e0",
"format": 1
},
{
"name": "plugins/modules/networks_switch_stacks_routing_interfaces_dhcp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f5c51852fdd18de8c919f3b6af794413337819b882ac500e2d8fea8a788a8d34",
+ "chksum_sha256": "fbf3c112f74994b8ac8fe0cf3ca2b83b7f79a46b1e6404f2910064943dae6c06",
"format": 1
},
{
@@ -5254,28 +5821,28 @@
"name": "plugins/modules/organizations_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d2f589b106af09a4e95439facba44801d28ca1fc410f5369c4f5c8b11156a299",
+ "chksum_sha256": "9eb97539ba3e3b448084a6ff808a29fe091dd17fdd3e0a0e0d0f96b942fb522d",
"format": 1
},
{
"name": "plugins/modules/networks_pii_pii_keys_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b12b61a58c52953696d7aa6c2be3072b338d63e4cf7863f48b1c18222b4c0dd5",
+ "chksum_sha256": "a71a003cb7ecc509883290dc0bab4c20de66d710ade1c34e342fb12f667d2d44",
"format": 1
},
{
"name": "plugins/modules/organizations_adaptive_policy_acls.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d2377c89cfb3acef29f780594f4fcb045b6133993a741972ca6b5f72cfe50157",
+ "chksum_sha256": "846df6032216d47ee839f2c71854544f347debecadf8f0c371c9ca7f33bc4f12",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_vpn_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "01667df960887549f70a669a268125ab24fa305f6e7bb88ad43daad7faf15444",
+ "chksum_sha256": "60fe7f725e7c209faa5892b46a532fe8e4a80c09cd4dfe8c8fc056f29b6ef6fe",
"format": 1
},
{
@@ -5289,14 +5856,14 @@
"name": "plugins/modules/networks_topology_link_layer_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "42d668b3b02282628e8c7b4cca8057026bc33694315e431c7fb331ce54f661bd",
+ "chksum_sha256": "32c09902b6ec3baa220fe09644d851deacd86939cb1ea2633e2366674b7ed511",
"format": 1
},
{
"name": "plugins/modules/networks_switch_storm_control.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0b80877b6fe40fe193df8fac36529159ce4ee65e03209de9ce3b5681ce623b38",
+ "chksum_sha256": "cbf534d781c9fda390444ea25b0b3ea9b49a91688dd1829ec8faa9280fa2df7a",
"format": 1
},
{
@@ -5317,21 +5884,21 @@
"name": "plugins/modules/devices_wireless_bluetooth_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "98130360c2d0d5f29cec8fc3e62a7996f58999defe4e3e3b64ab55c841eca997",
+ "chksum_sha256": "b7ebc44dfd5bc20eea190c6152af333b16e1b98012cd3c1384ca7be8ed2990db",
"format": 1
},
{
"name": "plugins/modules/networks_sensor_alerts_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76e51ed167b7e5c460a6c928a7dca231de81674f5d29d7972b574bbffc87837f",
+ "chksum_sha256": "913ceae71a244c3e089649f1bb726500e183695b071e54ad7afecfffb05d2851",
"format": 1
},
{
"name": "plugins/modules/organizations_devices_uplinks_addresses_by_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "095b39c947deb7ca0b8be13fc3ad134f52dae0a66f548e27825979624800cc6c",
+ "chksum_sha256": "566422b1fceb614208dc9e0728359408a6c8af77c55c5f2e06394468341efc4b",
"format": 1
},
{
@@ -5345,42 +5912,49 @@
"name": "plugins/modules/networks_camera_wireless_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf9945e19c4a2f4e5df492e72b5c9ca3556c83c3ed33f33aabb3d677c2836e95",
+ "chksum_sha256": "ca28d56f97493f2b17d78dc145651194c136b428f34189112eeec03c40711119",
"format": 1
},
{
"name": "plugins/modules/networks_clients_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "15819be4a919d838a42da1131fe13af0c4f85e8fa09ebf5728c7ca6ed06bbdd3",
+ "chksum_sha256": "fa2ebf4c686158d71781335a4e40465618427ea3fb8588876635a5deafa1ca10",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_appliance_radio_settings_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "15053e07d1680b26638adce7e90a9e3cf28a0305455c605c0056bdcd60c4254f",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_security_intrusion_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "35c9c2fbd86b3d5076191701fbde8bcc65ddb11130d8a49aaf62c40b21666cc3",
+ "chksum_sha256": "3b78e531ebf403ede7965b9d302d621a0a2080f13d44a7a25be37aba2ccaab79",
"format": 1
},
{
"name": "plugins/modules/networks_floor_plans_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "34138121ef1ceac92a521681d2280d228fe60e2fc119a8f889e3a3bc0d798587",
+ "chksum_sha256": "e23787f16abf03ecdc848862e32bfe4d4495f33a5c2f75017967e1662596e572",
"format": 1
},
{
"name": "plugins/modules/organizations_snmp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55e35b87564469e4f97b6cc6eacd92b470ee00b5bfa9f4e765bc4856541eb0cf",
+ "chksum_sha256": "b10e7644caf23607df239db1b18ccb3b1800f311f188f05cd881ddc1689b3f4e",
"format": 1
},
{
"name": "plugins/modules/organizations_saml_idps_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6aa6d062f1534d5a3b77a9b493972340918ba42dfc7a59e202c6b91260a1c03c",
+ "chksum_sha256": "a1c018a21d8365e28670949fe491cf6f817def1237cf354a1cbf7c33ade6329c",
"format": 1
},
{
@@ -5391,10 +5965,17 @@
"format": 1
},
{
+ "name": "plugins/modules/devices_live_tools_arp_table.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "198239dac290c2b9b955239047ff3719ed582498d19144c7efcef166d1a8e229",
+ "format": 1
+ },
+ {
"name": "plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fd612c215b87d71f898828e4667f3e59f03330af839bfb7281020dca14ff6e65",
+ "chksum_sha256": "6a945e1bccfb84276528514b9d2ef947498ee004c87a06994ab25efe0ea0f206",
"format": 1
},
{
@@ -5408,28 +5989,35 @@
"name": "plugins/modules/networks_camera_wireless_profiles.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82fb4705248c5bb3fd7839e992808bcb6e32af432e87e8859ad3fcf6ddbbce06",
+ "chksum_sha256": "95c491c6bd8f22b2147983832bfeeb1f00b9bd7d4290beeceb273bfd84365e24",
"format": 1
},
{
"name": "plugins/modules/networks_sm_users_device_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b15fdfb0b4f3991e2bb3a40cb43e4d4b5f9ce1b279916c1e008abf727487c3a",
+ "chksum_sha256": "76386fc2fd2f09f1ec558d5389697da77b0a2613a986b5f4d9d178d202edc996",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_firewalled_services.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8f114910154797922f433576b2ce93d68815e6ef2dc2907d9a0f180e7c6f00f0",
+ "chksum_sha256": "ab9a4150682f3efdac21618756a35833e1dcfac3928dcb9ac6f7ad282e9d2c03",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_vlan_profiles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c3cf7d794ed002505151f58d22c3e35d622de6736a2af090d8f42b068b14d54d",
"format": 1
},
{
"name": "plugins/modules/organizations.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a092a85cdfc9527cde53179cb9f31b11b044a6afc98fc182fbcab75784dad7c6",
+ "chksum_sha256": "396910abbd856966ea57db60cc589f80efe689b50cb6d5160a909ed57bdc9f4f",
"format": 1
},
{
@@ -5443,21 +6031,21 @@
"name": "plugins/modules/networks_appliance_firewall_inbound_firewall_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b13c5cce1ef98d2e25a53e784c0ee66ac1fa2c4f394f2f3f5334bc6ccbf65266",
+ "chksum_sha256": "8ebdc98091ae5876883b711480893486bf3e909db58e6d1ef7b013a08da12910",
"format": 1
},
{
"name": "plugins/modules/devices_cellular_sims_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "248f292c530fb41de71d55ae1f4260b0e7e08bf68835e7de73e49bf5c364af65",
+ "chksum_sha256": "d0f270add5a7745b6265906ad121211adf50316b9500b53d1d0ec4154b38175a",
"format": 1
},
{
"name": "plugins/modules/networks_sensor_mqtt_brokers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6b4d3bb8cf89580125db674f77ed6026516404edb868143925f223d954255f99",
+ "chksum_sha256": "fd274a15d2211910b8efd7fa051d21e043830667812628fe6a04e8cc0cc1b11d",
"format": 1
},
{
@@ -5471,7 +6059,7 @@
"name": "plugins/modules/networks_appliance_content_filtering_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "11e580c4ec52ad685ceb4b0838752d678fb357fc109d7f9d307a09f06526b883",
+ "chksum_sha256": "8fd159c157a7f2396a65e4daf3747e1475fb074daa95b4a295346d69b22736b7",
"format": 1
},
{
@@ -5485,14 +6073,14 @@
"name": "plugins/modules/organizations_inventory_claim.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d200bf4ff0347004402dcd68a094b891aa5555c6c79887bd9523c8994f980404",
+ "chksum_sha256": "64f560dcc67a46ab8c2a5f1729a5fa7fa1457170cc226ae2cceefe92a1389cec",
"format": 1
},
{
"name": "plugins/modules/devices_sensor_relationships_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "00705b45ca934c8dba75d8a038eb561d74378862d9a47bda44212a4ca06e0f23",
+ "chksum_sha256": "22f3043c29589d4fb570f0a4153883f1609c807540b877d3e90c3a4531474b42",
"format": 1
},
{
@@ -5506,21 +6094,21 @@
"name": "plugins/modules/networks_wireless_usage_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5862604c9eb82cda6d303bb56c8d7abb348a50e582c4eb7812f6725603eee9ab",
+ "chksum_sha256": "6025943090b3d33bbdd3ec376deb1f62e6bcaf6cd96c50ecab46d23971aeeba4",
"format": 1
},
{
"name": "plugins/modules/networks_cellular_gateway_uplink_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "33da979ee7d1e8f3a7eea6ed046f64deac4d88c1a805ba1672b85be2800426b3",
+ "chksum_sha256": "09abbc31f0e6f6a2db875568c7f9d393a22a2e43184d33ed3163bd496ceaacac",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_port_forwarding_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d1fcec4d881272e40c665be310b63b3c779247a2fd2742d8fe4972df11ffb38",
+ "chksum_sha256": "8563d2718bbd236f9c24b9e42c52be85fb56f3f101a0186db39354a33c7c9883",
"format": 1
},
{
@@ -5534,7 +6122,7 @@
"name": "plugins/modules/networks_meraki_auth_users_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6a018eecf216a0c156625f7171412050e2a71db2021fcc273eae5181aa5760b2",
+ "chksum_sha256": "2448825e0c4b5648ff7c3df4797732d8dc32eed0a8362d9438b44b9aa3bbc04c",
"format": 1
},
{
@@ -5548,63 +6136,63 @@
"name": "plugins/modules/networks_switch_stp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "21015e581a2e7f08cea18aec492d3fed60d77effda018067911c69d6411c4004",
+ "chksum_sha256": "780c38bf2d8534501d4e5f4f31e0c9dc3a70cee9ba70d8a82c332efef75a6002",
"format": 1
},
{
"name": "plugins/modules/networks_switch_access_policies.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fffc1d3d2b168f765c89b550cba241d000acc7f558a98a9add038ea1f8604e19",
+ "chksum_sha256": "8da855c2cc9fe7ee18d3b4a4c5682e907c062d8e86002a85e7bd20e37eb27213",
"format": 1
},
{
"name": "plugins/modules/networks_switch_stacks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2fdcad8f53f7842aad16541fa40bf9cbf94e17e6edabfb8cb9ef05dffabd6cc7",
+ "chksum_sha256": "eb9b64de59a7fdb6234ba55b96e6cd151bfd1d716dbabb97cb35f7356ff707c0",
"format": 1
},
{
"name": "plugins/modules/networks_mqtt_brokers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff54fceeea4118c304ae385b211e81c5a0109e04026328815885cdd48a6264e7",
+ "chksum_sha256": "6fe88b51ecfd71e124208c50c01a54f95f1ea0a2d8e7cc4c5933204eadf8e136",
"format": 1
},
{
"name": "plugins/modules/devices_camera_quality_and_retention.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "14a0063c5c4eb8a04b290927eec97f70225c564df1fd4cbd6a31f9d55c52111b",
+ "chksum_sha256": "927e09d476993c0ffec31b9a651088d200cf78a4950240501c0b7b4bb7821d32",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_one_to_one_nat_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "72562b2d476968ee9452f7ee2a3c618b7e9f8f6b135a70591251a1323ed8b2dc",
+ "chksum_sha256": "2308bf8ac252df15dfe870bf49a38e5a30b92123bbe9b48561d158687ded8756",
"format": 1
},
{
"name": "plugins/modules/devices_management_interface_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "87fc37142e44edc1ec368fbfb8f187d1ed23657ca9a43cfdbb9aac3a1bd63ae9",
+ "chksum_sha256": "de0e958e8cdf2420c4d1c23f57f75d3819401fd9c16a050e043e575599fe2bb0",
"format": 1
},
{
"name": "plugins/modules/devices_live_tools_ping_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "536938d372f8e4218cd58e4084291d63b52f0d077f0a3b3578035750916df35e",
+ "chksum_sha256": "5cdb0143203410754598a375a57061b12805e05123634a607a55412b0bf7bd85",
"format": 1
},
{
"name": "plugins/modules/networks_webhooks_payload_templates.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f45ec96095fd04b9f89568b8492c31932072e87dde05601a0ede18d04ea075a",
+ "chksum_sha256": "3f7195e850e3b55f8e586195261d8519db49b10f66d993ed65eeeef279a346da",
"format": 1
},
{
@@ -5618,7 +6206,7 @@
"name": "plugins/modules/networks_sm_devices_certs_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3fc5ede16e7088a1741b4921895c51ca284012995b8553abbeac081e2cd0a5e9",
+ "chksum_sha256": "28d1e0aa8b9bf8fa677efea37975a0e6f317c71cad51c8a39681cee75825d3f8",
"format": 1
},
{
@@ -5632,63 +6220,70 @@
"name": "plugins/modules/networks_sm_target_groups.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0b65fd9bd8736317788ccf4cebf97cfe0cea6801e34787190c491b796e5d18c0",
+ "chksum_sha256": "9fe732d09aeff67b18a38c9f66720c887cf07013be8d661d2350c0a9e05e9722",
"format": 1
},
{
"name": "plugins/modules/organizations_insight_monitored_media_servers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6ccd2dfd1a3af5da931a2c63824e8c64a57cd21c0f7dc4f9ea058c174febd471",
+ "chksum_sha256": "49089ae525dee50332562762f2988dcd81f5e61aee33f7b7400a7898d4ab725f",
"format": 1
},
{
"name": "plugins/modules/organizations_login_security.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8bb31c1edcce4e485ca3e21abc381110f2413ca03a6ef22542613c87d234f40e",
+ "chksum_sha256": "1740f0a2ea5e22dc69905c42a3e784d4f038d95e78e48ca0054da32952c90b56",
"format": 1
},
{
"name": "plugins/modules/networks_group_policies_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be8f42494a88c3d46c31a46611fc51e705cfc44ed7d1752071594555b8de1abe",
+ "chksum_sha256": "e83306285b6c231afd6731205f93af595d3b348edaae746b4be5b981a31b34c3",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_bluetooth_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7ba64cfa15e134b1f0aaacf6a36472da7698ed7bdaaf16ffda185c3a27d46027",
+ "chksum_sha256": "0813b762763f88d050ddce766305f8205e80337b23330202a8920b29a4bb9830",
"format": 1
},
{
"name": "plugins/modules/networks_sm_user_access_devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b532f4847e315d8775d079de9c780dfb7caca3a496282d4e5191bec137bb017e",
+ "chksum_sha256": "3d474c0b1aaadf604803ddde1f87cfb1f89106439c25c845ef6fcb737be5a575",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_ports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82c044254b4c4863a9c90594cf8006ac9e7d3e8725c05f507b29ef5c8b7bf975",
+ "chksum_sha256": "4c461dbb4fd311ae2805bdfbfd34bba87aaef516d1f8744e92c50c01defdcff6",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_sm_sentry_policies_assignments_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "37c2918bc44903e54a7585200c7293c719c77f1591b504ac41e7bc3820ff5f4f",
"format": 1
},
{
"name": "plugins/modules/networks_switch_routing_multicast.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "51424794208e8307daf2e94ec72e60830c223e108bd5748d57f2951a8f14edd6",
+ "chksum_sha256": "d61f3ddd08a76f50abab4a1cb934cf6b1444ff2fce15a14800050fd34877ff16",
"format": 1
},
{
"name": "plugins/modules/networks_floor_plans.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "899df20c04f9364a065c038721bc73bacc8ad0e5bc88cb2fcd4db50dd4b943fb",
+ "chksum_sha256": "4180aeb60ccd216bde4f67204e8d587b612ec1b0b4cc5fa6dfba4651ee3cf505",
"format": 1
},
{
@@ -5702,28 +6297,35 @@
"name": "plugins/modules/devices_wireless_latency_stats_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "25dfd2b4731e259005bfa381eb8aa1aabe13bd0a0912e7f9e9d80b9d1ed456ea",
+ "chksum_sha256": "68cace03da14e83c75d223c13813b7ec4c4abca95ee1a386204a8d00e790c51a",
"format": 1
},
{
"name": "plugins/modules/networks_switch_port_schedules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5bddb4bfac9b4752f679bc311e74f7829af693735524f2411d1e96617a328f5f",
+ "chksum_sha256": "b23575c5ab4167d4d8143270e41f95ea343a2d41661f530ba1df9da4b5809564",
"format": 1
},
{
"name": "plugins/modules/networks_switch_access_policies_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0b3468245b9128a8a8094399d654bf1787cf759862b21235ba3b94a6c73bcfb2",
+ "chksum_sha256": "4b73980aeccd94ff5c75ae52a5d3a8ce1df8c178c168cd54e89aeefa965ac07c",
"format": 1
},
{
"name": "plugins/modules/organizations_licenses.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "34d2d9b82a75904b7aefe6c406880397fbae9d940a892f3d9be2cd527eb05933",
+ "chksum_sha256": "9ca8f5b8d16d98e18881d0a8f42133c6022eb82b8da2f40af53175945dcfbc6e",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_camera_roles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0cf695a9f8d76ffe1f060f1f9649d4c658145c3f51862563c04bf63ad19f211e",
"format": 1
},
{
@@ -5737,35 +6339,35 @@
"name": "plugins/modules/organizations_summary_top_ssids_by_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63dc94ef3fd832d106b5078990aa41d1565ba7bd7503d2500258d24181f4dd46",
+ "chksum_sha256": "635186dc03dcc0447a5041adba63053197fdd8d4a8928d1db8c9a189b44607f9",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_checkin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ec2d1c628d8b67566dcf26b153519eaf6531f7ebca06f6c5b6df50ac07bfd4b9",
+ "chksum_sha256": "13750dfa10ab16895e74db63c7840321556d9a80001395c922453888c000aca3",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_splash_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "33ef0404152cfdad515c1e8a65b1fdac44a68f1dfb3570e4f2228e7b7159e9d8",
+ "chksum_sha256": "7adf2bd20d9ec6195d7bc94f2aa02e312481ab3b9792e7804631241eb7d3d496",
"format": 1
},
{
"name": "plugins/modules/organizations_networks_combine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8cc5cb6a436eb67941c46d9fa5df6372ecdd10c4417ffbc8b7a0471b46296ceb",
+ "chksum_sha256": "f5ca3187ba014ef4687b0f212894970a0a86b0e908adca68a587685486fc3c96",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_rollbacks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a550e6abc098897d7200ee4f57d8c2720ac336a3742dcf74026283fdfdea9ef",
+ "chksum_sha256": "0c8266fddbf6003b9db265bfc99e4ba532534f14f0be3f52b404de8690a01dc9",
"format": 1
},
{
@@ -5779,91 +6381,133 @@
"name": "plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "14b960a68aa9eef5fcea207bca140321c417657b38e920a998a5c93cdc128fd1",
+ "chksum_sha256": "cb35d4db944ff9f4339a93b3cd214cced006fa9908c047dbdf81e8f2342a8189",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_appliance_uplinks_statuses_overview_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2b21ba0e01305b475556b7f6c3635fae0c71984a754357a38eb9f75c7adee395",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_sm_admins_roles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "cc08fa3539f847c0b55497a26d196e3e519bbf370de5f41e8de86ddbde7eb39d",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_wireless_ethernet_ports_profiles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "43a77fe915ebb73b4cc2ecdb978bf274caf6430e853a911b59e122fc289178da",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_l7_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df11cb034689b0768266880acf527ad75123d6f5302a6e380c5ccbae9ed6b0a0",
+ "chksum_sha256": "3e3a7fe5aa9229acd3db6d37c5ed06f3903c3c438861bf9d1eb54fc7d496b208",
"format": 1
},
{
"name": "plugins/modules/devices_switch_ports_cycle.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1a7e719b6a0dd04d4e2783c588c2ae9f0128af3252d0faf2becda3d71c094113",
+ "chksum_sha256": "239db3ae5d16bbfabe90d02f98ed118bf8234da086ce1c7d162c52c8ea7c4a1e",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_staged_groups_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "61529b98cfbb8f39e51faca00dd3ae54be4f340949658f9d783ac87efd9e5598",
+ "chksum_sha256": "4c0b48b086697e6b35062e07e12cabec6e6491c73df36b76c49fa1d2889ad5e8",
"format": 1
},
{
"name": "plugins/modules/devices_wireless_radio_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "963eafc4881b9a281e9440bd15648ea33e291c4814986bc5cc466d26c12240a7",
+ "chksum_sha256": "5004bb971521fd16b09579d601016c48844125f3eb3d796da4aa8ddafa901230",
"format": 1
},
{
"name": "plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f5a8d98879497ba2e170d07bff42f01eb18695663c4f03740222e7879ef96ee8",
+ "chksum_sha256": "1ad460c8a40aa67a90fe43e7d1fc46af98ce12d3fa1456d5310056390b4426f9",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_camera_detections_history_by_boundary_by_interval_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ada9e36c0233051d92c83fdb656fd971a45df362da0fb5c4c34ae93e1f0e4c2a",
"format": 1
},
{
"name": "plugins/modules/organizations_admins.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "44ff42ca9871ba0eca0d0d2dfa1d24fd1afadefa4f913eaa99057472416b3653",
+ "chksum_sha256": "8eda0bddeff2b97522e85b18336fdb766409cf552593250ea56da7a0ab81db25",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "224f29f05fe56fbf481265024e6bd233316bcf00524211abbc651000509778b7",
+ "chksum_sha256": "4abe6665758650fc4cad20835caf8c57a008902baaa1e33d912c7e1b72819e10",
"format": 1
},
{
"name": "plugins/modules/devices_management_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2ff9d3d92588c64f5acbcd4e9f3b17044f266d60dfba61f6f4ea8e4700475fa2",
+ "chksum_sha256": "d5f3430cfbc95ea11f84694ecc5c62be5599640ed7a886f03c06b5e12cc49463",
"format": 1
},
{
"name": "plugins/modules/networks_webhooks_payload_templates_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ae28dd6b544128b3ac7b2d9b380ec553a117aa8e19356a72b9e0e16a35519ad0",
+ "chksum_sha256": "3090c460a8849b3a50db7d884570ddd001dea900fc718bc7b7be7380c179677e",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_modify_tags.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4dd01dfb8ba6434505940d5e1ea897fbeb0b30866798a4ac34eb34bca78b7cba",
+ "chksum_sha256": "7cff3f276d1438ee32eca4c29d118a25cb40dd547f3a8bf8bd47d17350b36d72",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_vlan_profiles_assignments_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e8b7fb2624ac69e2ff2eb8da4a8e964dbd5a2816a3344859510d91b01058dc1e",
"format": 1
},
{
"name": "plugins/modules/networks_health_alerts_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "97673dd12f1bd1ab3b771437ca2092392d37618a1d436f032dd93503c4c9efe3",
+ "chksum_sha256": "640a47c57400cd94fb232fbabdd4aec34f6e03b4775a43e3d1e17eb7cb6b150e",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "40219cb1e87018913fc7de01b6f509088a1c4b71f72c71f011fc7d5165661d8e",
+ "chksum_sha256": "94cd4dab5bdef89485aadcd32d3f984f6ba3965ccb3f55aa8f576f1acee8d04f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_sm_devices_uninstall_apps.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5665160983b6d8d0453eccb4bc63aaa340a16673534971bfe662fefb32d8dd7a",
"format": 1
},
{
@@ -5877,28 +6521,28 @@
"name": "plugins/modules/networks_sensor_relationships_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e3bfdceb51d9fe195378043e257771d15a6da2aef90991a871c01705bbb7dfe",
+ "chksum_sha256": "beeb81e82633577df04a765f5c8fece25921fd902141a7769b2c6283b8fba1de",
"format": 1
},
{
"name": "plugins/modules/networks_sm_bypass_activation_lock_attempts_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b9d1297fb54f58c10b0296bea82994a84895f31b5de46a829a221519b5bd5228",
+ "chksum_sha256": "ef3aec73c06ada1e93c6149567ed59b52ffad0acf7f195da456aa86ae63cdc88",
"format": 1
},
{
"name": "plugins/modules/devices_live_tools_ping_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6b23ba02911fa649067bd3da1c593c28ed21340444bca0db4ef650157ee7430a",
+ "chksum_sha256": "ba2fa1ca8de82f57b4998a0b4827e6011ef7b67ccdf19e33180ad887384acd43",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_staged_events_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d33dc0e78d70e263324b41a5e6e9f6976ecb1615e0c2c2ca18e0d54fc60f8637",
+ "chksum_sha256": "b367965aa4928f89638bfd0f029db9173ea3f8568173deb1af6d8b4cd695c0d1",
"format": 1
},
{
@@ -5912,7 +6556,7 @@
"name": "plugins/modules/organizations_adaptive_policy_groups.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "30ef413f2648c1bc27c72e070c9a4fdf04617189a25b714aa9a220c448ba9d7e",
+ "chksum_sha256": "8350dcd369dcd773ed23a266b8b9827cd2e37e9af6b35eb759a1b7ce95914bb4",
"format": 1
},
{
@@ -5926,35 +6570,35 @@
"name": "plugins/modules/networks_wireless_billing.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "44d90276b1c173453a3c7e61c08eaf882af031cc93df4399240cbbd78c76458c",
+ "chksum_sha256": "aa7dfff2af46eb086f24145ba37de3f4f81a6cabaf05fa85ebf2805529a934ad",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_fields.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "780554e40bb9cf23e5acc5c01cab428a8df0e0ef68ebb7449352af86808022eb",
+ "chksum_sha256": "84c285a2e933f73428cada2f2266ea3af52386e6feb7aa0f594261f8bc08925a",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_staged_events_defer.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9cdfe2e2fe40b0ddc1ffc42b587ce19329f323a524a8cf574226d0be9a710463",
+ "chksum_sha256": "2719b1871f735804817502373809027149c9071170b8c77ad12cff725304ebeb",
"format": 1
},
{
"name": "plugins/modules/devices_camera_wireless_profiles_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4ba91479861271dc6c717edba053797932a1091b345b9d19f5ce01aa7540258b",
+ "chksum_sha256": "c50ccc0b145b31f5bdd8d6bfb4baebd38205f8449995f06a62e700c203f5181e",
"format": 1
},
{
"name": "plugins/modules/organizations_summary_top_devices_models_by_usage_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1e3934c4498f2d2f7e3485b7312d22a94483f33823a9f4960d02e6beb8a3fb34",
+ "chksum_sha256": "b8ac329fb9b35c492791623f805a9c55d04cbf07f2518d670951dc641aef20c9",
"format": 1
},
{
@@ -5968,98 +6612,112 @@
"name": "plugins/modules/organizations_appliance_security_intrusion_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de9384435bc38d35b9e72b8eb6cc237c24659cb002901c253ee2fc42113d6bdf",
+ "chksum_sha256": "2358fc76caeb42c63baca2a4738d20d42d09070fd9d51e7562db022878dcac06",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "16783220aa59c74e0fbf3d69f89e2310d048222bab436e845216e413aec32500",
+ "chksum_sha256": "bb7b3dde22389ece9e1466a5a15700ca1e1dcfb1edf81a5311bcd09b15e965e7",
"format": 1
},
{
"name": "plugins/modules/devices_wireless_connection_stats_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "313841ad709a50bf16fe29b23c1483ce0a6fede86345bab6afd941698bbc2f44",
+ "chksum_sha256": "d6032d52c0415c9cf951a0b0118cffd89a081ec3e5bd1ea70685a01961aa0d17",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_live_tools_wake_on_lan_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "276e3dc4200949fdaa46e83424b16e6d3b653c3ca9195d3e65bd8550c9acb977",
"format": 1
},
{
"name": "plugins/modules/organizations_action_batches.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b257caa0baed1b5b66bbc0b762d69c3f8428a8524c61147a56867597c416c7f",
+ "chksum_sha256": "1fed1789a0743b5b2dce98d23a9d2e5af683a708bedd3e8852731e915df10e58",
"format": 1
},
{
"name": "plugins/modules/networks_sensor_mqtt_brokers_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5404acd29944dae88b51965d57fa23e0161f0b7e9f39cacebfca6d2544fbe13b",
+ "chksum_sha256": "5ceb4c437ae1400cbb575f2efa54d3f670a18548ed34e7cb5359f388526f0b8a",
"format": 1
},
{
"name": "plugins/modules/organizations_inventory_release.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4b4801da8ebe1ba784efd1a6f482be63fcf55775f6115bf60227de9ae64b0301",
+ "chksum_sha256": "996779339c4b998b60d2425001f07218f4770c8bf3257e8b99f0ec8c3e867d92",
"format": 1
},
{
"name": "plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04eb110335491bc21d8a1a1bf9311a22312c8174da753364ef157e8314d4b1a7",
+ "chksum_sha256": "4f0ce1272d44dbd612f5f3b6d6b6c03897df304d93334b0fd6a06c51f922fd12",
"format": 1
},
{
"name": "plugins/modules/networks_pii_sm_devices_for_key_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "817d069ea86f758113126cb08e486c21a26f7c68ddd2d6f107fb5792d21213ef",
+ "chksum_sha256": "46caa80fe43734cc55dc45030cc6bc8e67927ccf50c2b9b88878749503af8cf7",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_appliance_rf_profiles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e782c70e550cd192b0199eb6a5fd127d69c7da7508abf0ec7d57988615844bf1",
"format": 1
},
{
"name": "plugins/modules/organizations_inventory_devices_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "645f6e7b61e9b8ef86f26cbf9c1e91cc2c8019b5a397bda8d12a92c8564d6940",
+ "chksum_sha256": "b5079e793415f40d8e0f9b10ae5464676668e355700ba2054040b107fcf9685b",
"format": 1
},
{
"name": "plugins/modules/networks_clients_provision.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "48d370481809ff8258e8e033382253171a8aa9f90b15d917a5598253f17bb591",
+ "chksum_sha256": "07c9bee641024fadcc775c1bb9978bdfb8219683c544cb4191fc111107f8fbdd",
"format": 1
},
{
"name": "plugins/modules/devices_switch_routing_interfaces_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e15bbe3401ff4d72b6892a51efee4239e9b9dc66f689db7ffbf1852e74bd322d",
+ "chksum_sha256": "d75a829380e3f371f80c39c4c4a83a275b83d9a708aa46a399f0ec7f2d1398f6",
"format": 1
},
{
"name": "plugins/modules/organizations_snmp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "158105f9310311e26aa7f8ebd2f06466b6446ae80ed8d912f1625dbff1753fab",
+ "chksum_sha256": "642113ab58f105c98200a645d8f04fd8e3bad47c9da8a62d7f8bcb5b19dc0a0a",
"format": 1
},
{
"name": "plugins/modules/devices_appliance_vmx_authentication_token.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2cac946fb65babee47478f3626f1c5ca74cda18d6d926b9a4da01018bd2a59e8",
+ "chksum_sha256": "d00b138480ad8392fb5429d94d1d264ba07187ace1c6588748a33e42c06b7759",
"format": 1
},
{
"name": "plugins/modules/networks_switch_access_control_lists.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6558841604fb0958f4f2057ced0608f84464c384fb8b64d06a9e80b4e45608b5",
+ "chksum_sha256": "1c5fac01f4651403823319163e5ce750b4b35f45a0bc1d339ea21777377ddcb3",
"format": 1
},
{
@@ -6073,42 +6731,49 @@
"name": "plugins/modules/networks_pii_sm_owners_for_key_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "898359948fd849d4b388a11c1678466f44722c27eab7dbe1a74ad76f57f12da7",
+ "chksum_sha256": "efb843d5902ca3554d47275531f33ac1e43b94dbdaf325e36481c310cfbb865e",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_staged_events.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3db0ae3618567bb63fca45d5fe3d4476ba546f9740a1ed2b2023cfb49689d058",
+ "chksum_sha256": "a2c3efb885a0d7c6515c9f1efe15c2eb66129d0c60f37ddd6ddbda6b26592100",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_identity_psks.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67feac0799d7c27b527230e0cea5fe0c1f2892aef0f762fd58d1eea1271160ac",
+ "chksum_sha256": "768192fea6c1b72a2504a95b035c053556e0705c8a513276de9e16de8bbed15a",
"format": 1
},
{
"name": "plugins/modules/networks_switch_dscp_to_cos_mappings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04e26bc9e6152ffc3d56b55cb17c65d15c128d36c919ba18dc7be1bfd27fe4d6",
+ "chksum_sha256": "0833b88f5083c731648498f8bc6a077abbe89eec122454c60b782a3b596ad0c9",
"format": 1
},
{
"name": "plugins/modules/networks_devices_claim.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2040d0caad9dceafbb7d3df8f3e15baac286fd0aec054f0ecbe15e9109732321",
+ "chksum_sha256": "ef3ebf24406fe573a33c2a2775130e5ce5a3641af198b4d572d39d6ac37f6772",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_devices_availabilities_change_history_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1c48bd116e6471f9358b768b3347a410a468367277448a56f6fdf6818772ea67",
"format": 1
},
{
"name": "plugins/modules/networks_switch_link_aggregations_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de6143688d2ad3f230fc33eda591e82fe0f3adf8936bb4a756b3c27006f37223",
+ "chksum_sha256": "9442121efff4ae2cc30457848f3b4fdde7bab4fef27bc47942ee1cff8def209b",
"format": 1
},
{
@@ -6122,14 +6787,21 @@
"name": "plugins/modules/organizations_policy_objects_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "647dd5e555536b962e015753d494046fc671b30e81056b63ac600d68ad051c04",
+ "chksum_sha256": "0af599f6efd13aa58884e30e8dc2649c66befc1d234d716440363c5fbf93ee69",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_webhooks_callbacks_statuses_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9ee835cda5753aad7e122c50047014942c9bc3f2b7662acec9bb88cf94cb5f09",
"format": 1
},
{
"name": "plugins/modules/organizations_policy_objects.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "011bf864532c358dc65072e5f62f4b75556f6affb79cf2ee74b0912e8dd046e7",
+ "chksum_sha256": "e8befa218614bd335df83761432382a13685bf369c276ef837c97cbc58cf0773",
"format": 1
},
{
@@ -6143,21 +6815,21 @@
"name": "plugins/modules/networks_events_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "97da99fb268666a45335331b1ab2666e371f7ee22c620eee62cb24f6b472dceb",
+ "chksum_sha256": "6f6e5168cd00b0e7332af70036cb829a484b08677c7f34cad676a6314d7070d0",
"format": 1
},
{
"name": "plugins/modules/networks_sm_users_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a5a0166b067f62cae2b405bea36e44ed90f27b2d45618c48cda738a151d76a56",
+ "chksum_sha256": "6b6fb76a8d753b7691019e1242140dae5252192aaf41ce87df432e89f3871081",
"format": 1
},
{
"name": "plugins/modules/organizations_devices_statuses_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5886b1be1f71c1839afdbbd4d5de4946da63c149e1199f6a68ad6512f61510a8",
+ "chksum_sha256": "efc58937ab5b63bd0a6a7a944a39d9ebb24e0feb41e0516056b163925080f738",
"format": 1
},
{
@@ -6171,63 +6843,84 @@
"name": "plugins/modules/networks_wireless_signal_quality_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f62df5c3b8dcf3bdf92b5e7972961088b74cbccb28dec4fd40620974076c55c3",
+ "chksum_sha256": "576c271c3bb4f5466cc16ec4060ab6a008bd93a5364417068ab9185bdeb40dec",
"format": 1
},
{
"name": "plugins/modules/devices.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ca1cf5ba5f312a2c9a8aa7af49e1dea28676febd9f9336c9417850be3f6e3496",
+ "chksum_sha256": "38a6c0e728f388963c8481ea5e12bd40bdea3692ece33b310925bb99349ac6b9",
"format": 1
},
{
"name": "plugins/modules/devices_switch_routing_interfaces_dhcp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6638bf22a6f7dd6e0a492625d43e9f16d912af5437175a5eccab2a866b67bdeb",
+ "chksum_sha256": "c4627a110eb6fb1fc7f9d4b01324b81d7ffa08ffd3fa201a2b7df59932fd79af",
"format": 1
},
{
"name": "plugins/modules/devices_camera_quality_and_retention_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee701e5de2b7e101d3f34942fc9bf4a29f6efd38fdbb4761c670654a5026d1fb",
+ "chksum_sha256": "bd3c482593ec55c85e4449d7d8ca7e1deadd9ea8ddea6a86a9a9fd25fbc70d18",
"format": 1
},
{
"name": "plugins/modules/organizations_policy_objects_groups_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0f9eaeab0278a7195da936d234ddd964a14017e631a24da73ecd5a38a4a477a4",
+ "chksum_sha256": "c5faffd239c2104b386c96fd1dd747202f6bd525dd1c37cb9c97ed62cb8f4371",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_wireless_devices_channel_utilization_by_device_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "80527b1e380603bce62738d73f06eb09ff816ed4ebaa03785e41d588f05d4a48",
"format": 1
},
{
"name": "plugins/modules/networks_firmware_upgrades_staged_groups.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "da5c41de3f1342da617a28ecd4e094a5176ac103582e4d2deee8feef5c9009e1",
+ "chksum_sha256": "040c78668b28a01e972aaa1d57de1ce7760658d9573710b67c21a5019729fc7d",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_live_tools_wake_on_lan.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "814ba53945f15a547a29f4ee05c0e14422cb4d817d67682a9ac6353f269d353e",
"format": 1
},
{
"name": "plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "45d7102023596d97c168016073fb53b625cc997251f14aedc730db280a372b68",
+ "chksum_sha256": "e1e5a1e51a073e259b7170208f1d5ae79fcf9acd3d0f69b80225b848382d1cc7",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_vlan_profiles_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e0656dfaa14b4ee5df74be73c5a7e4a85d485108018dad78aa2099327f55144d",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_device_type_group_policies_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3f9b6288b1839553613469ad6a7c3b8bf095c51de279f0a051f76f21e7393009",
+ "chksum_sha256": "5ca0847bdcf1e4806ea7aa05d8c18acfdf318f31c6d87906df23e1a9a0ca1904",
"format": 1
},
{
"name": "plugins/modules/networks_traffic_analysis_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a67a170aac02cd4d3e5c40dd9cb5968d53dbb4d0c2618963a06687fb5c2f54e",
+ "chksum_sha256": "a246a840a0c398b7c6ac828c1bb27beedd1047d947f224901d9be4e9918cdd7b",
"format": 1
},
{
@@ -6241,182 +6934,245 @@
"name": "plugins/modules/networks_wireless_ssids_hotspot20_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cc825fc113e0bd774b40a32affbe16094a8f3b7fb544bd2b66844b60029c9f99",
+ "chksum_sha256": "a09176608f2d5c06928dca76b183b4ed06f2f1b24462fb2dc270de15c9464eca",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_security_intrusion.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d85600f2ca06bd8484b086962947afedf0f87b6b7877f87490b50f351294f656",
+ "chksum_sha256": "3cbe6856cb38de39132b1df2866d0249467dd8f38c34068e62291ea32aa8bb4f",
"format": 1
},
{
"name": "plugins/modules/organizations_branding_policies_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2baae211ca1fec55ec7339fd269b62e9b575115c390014a4e7001de32af86ca0",
+ "chksum_sha256": "a021d8c1e8223470822dbf5f301be4dc85e6453b1296fa3a6f5335564efd47a2",
"format": 1
},
{
"name": "plugins/modules/networks_cellular_gateway_dhcp_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1245fac6dc0814b709687f0ccf4e5f79ef0a4d8d734ac7f26d6e22cd7da8ba1",
+ "chksum_sha256": "6f69e575d6ebf03f729bfcc25a0056e0e1bfb81e262d009538c9689faeb73ce5",
"format": 1
},
{
"name": "plugins/modules/networks_pii_requests_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e1a3712d761aeafddc07efe365bce1cf2e96f1cba27798f9b197d8d64879f469",
+ "chksum_sha256": "4a8dcbc3053a4e0d3d4f633d8486980aed417da797b6349226ac6c01608e322f",
"format": 1
},
{
"name": "plugins/modules/networks_switch_qos_rules_order_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "950fb368632dae6d28cb563cbbe16637ab29b1a7cb545c98ac51d7d020e86af2",
+ "chksum_sha256": "c29399575386fffba855d2de489f5620616b30cc2eabea6dc27a2d3008d10833",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_sm_devices_install_apps.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "81597c6830356fada3054d551dff43ef1be8da04dea0366df33822c67f00a9e0",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_vpn_site_to_site_vpn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "91882fc7c89240c5de0b904bf465e0faf0d5b9fedca9a008ec78fe692893a78a",
+ "chksum_sha256": "4c22bb1233ccc98d276aa748eabe05fcd0fc3289b937b3100bebad7a63c72dc6",
"format": 1
},
{
"name": "plugins/modules/organizations_insight_applications_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e362f8cd4efd599ef9152ac1dd4d05ce4390007003c9f5b3be9bc857e5459f7b",
+ "chksum_sha256": "6fca47ee77e8b54022648e0f98037c61759f89a88eaf7487eb8b5b4cb2bd4b4b",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_appliance_radio_settings.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f123c2658e619b94b26cc185f97df1912bc835de596f5edfd2c5a778b581031e",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/administered_licensing_subscription_subscriptions_claim_key_validate.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7745937c08df7049c6aaa49b58a0821a8b66b64a0e49418a23efad19455f8155",
"format": 1
},
{
"name": "plugins/modules/networks_cellular_gateway_connectivity_monitoring_destinations_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7c53f704d7de0d71ad9c67fb55219aadcf55cafa43e7ad2665509d32909524a6",
+ "chksum_sha256": "03745349388f756fb3f35db78ada46c244634becc82edb332ecfb4c4eaeca885",
"format": 1
},
{
"name": "plugins/modules/organizations_insight_monitored_media_servers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82b99cb733f0668e50c684209d92006323f64c6632188225f7b0aaabf2b53f26",
+ "chksum_sha256": "9dffb92e7a1bfb50313ac722c6ed3d41972d46909aa600ee8e0a659f40483472",
"format": 1
},
{
"name": "plugins/modules/devices_camera_custom_analytics_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a047db46f71b609056c409ca3b6995ab85bfce652db656d3a78f010c5e128bcc",
+ "chksum_sha256": "efa3aaacefb575f025a3939a9f718947df6e9e99d99919edc4a6b8a8999de330",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_l3_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "77a011e5db0e991e9ffba39e13b8300b30a898a7e6d52dbab49697ab1e984b9e",
+ "chksum_sha256": "183835761a813eac17655d792371a95dc1e7ad1f5ecac108b44c5e89a601ea11",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_summary_top_networks_by_status_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c3e5932826321db4d8ab2a3c03e9cc9a3442a896501c154b14db31cbad4b3d8c",
"format": 1
},
{
"name": "plugins/modules/organizations_clients_overview_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "acfb0ab72145201f2f41cfae6faa8308987846bba83d2f1e93f8ab6273f664eb",
+ "chksum_sha256": "6e9f3ebde3dfa37084c4be1ef3ff675b37ae210f6c951e19a8c9aa0b2c27ae7c",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_firewall_firewalled_services_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7360b8dde41408673bda6246fa2abf266bc56bd96920faa20d3194fc14db2033",
+ "chksum_sha256": "24121c0e04cf780b1249d96acb7da73958db7f766e8e608733c3496054c8f86d",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/networks_sm_devices_shutdown.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3032c249e5a5d14da1adade739cc2aed13485dbee959ce1497056b731eca8b1f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_wireless_devices_channel_utilization_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6adc91643f839ba62f1f9dc514f2a7dcabe98d0a0bcef6a6c66f974eee39c495",
"format": 1
},
{
"name": "plugins/modules/devices_sensor_relationships.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "752c8eacf10957da5e834192433e25ffea9b036620c45c9736fb2e0200418368",
+ "chksum_sha256": "1d818aa08d96fc11d5b982f886f7d43a6527adcd75dab7bb89b5cb8c53f20742",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_sm_admins_roles.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2e22e763e8cbf0137898739c0107cfb70024a41a53287194187d119f54fbbe6d",
"format": 1
},
{
"name": "plugins/modules/organizations_appliance_vpn_vpn_firewall_rules_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ec6e07678781178da8c3adcab4376f1da5e95dfcc81c0f540da3903c0115bf48",
+ "chksum_sha256": "7785d449681bcced79de511e4c2ceb07696db1bb1a100ba4b284b95845f7591e",
"format": 1
},
{
"name": "plugins/modules/devices_switch_routing_static_routes_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad5fe129e02e3f3fc52529ea021abd3034a072fa7ad512b1bdfafad262866c88",
+ "chksum_sha256": "1ec8b1d327d13b891f46f14107efebeb9458e0f62405e090fe01069136d83517",
"format": 1
},
{
"name": "plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "15ea7238f375b4328b75ffc8970b1e9ec5f10d2b692958a1ceccc7fa10d8f015",
+ "chksum_sha256": "3da09866fe5e3a7a184075141172cc0ccb4f869088e4a8dc090a572474c18865",
"format": 1
},
{
"name": "plugins/modules/organizations_firmware_upgrades_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eddf56ee33c700f885981fc32e36ebf832164a37649fcf4339daa33a32e00685",
+ "chksum_sha256": "e22b5ac77b711b3b71ed4610d2234daf6d4fd2d57ee9c4ae7d8cbcefc4ea7b70",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_unenroll.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a0f267dcd38f0d241fb9cc5761b2b7514c65eb5d330285c6f5386274530691a",
+ "chksum_sha256": "6da1b62f06e356ba1ef904beb4f479769a0b6e8f99bf649a0169a9f951532e4a",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_settings_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a55e0de93cff909b32f0d2398f866c187a744076160f64059c3b50742a6adde3",
+ "chksum_sha256": "3cfc73e417561e00d96e81bf78dc25ab66fbe0baec9843e2d43a3dcf52880e5f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_devices_boots_history_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "447b9674f6b05d458526355f256a59e985c58ada2b7f208f4730b31599030b24",
"format": 1
},
{
"name": "plugins/modules/networks_sm_devices_performance_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f906d2b6f38c3d808675bd9e85f0da4910ab2496397f3c035c2c114335fbac51",
+ "chksum_sha256": "5e6d926722465dd6abac1d2cc21478ec49e8e53819ae725cdeb2960053656214",
"format": 1
},
{
"name": "plugins/modules/networks_alerts_history_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71ae6240abd5acdd953b1576aebbff42ea3c25c6a0f54537250188b8510b0125",
+ "chksum_sha256": "774cd0811b0e370f4e52435d64977842ba261b5a122c2bb2b0e8e780ee4542cd",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_appliance_uplinks_usage_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f497177acabed7583022805ca2959b1924fd706d39e61681aa96a4ba43a68e1e",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_traffic_shaping_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63bea9bd6416b3ad1607de1f137bdd5befc6be4e7940d9dcfe44a87cef2bc1cc",
+ "chksum_sha256": "47ba82d790aea43e7aefde38af711fdf5870460b3b097a6968e7f1f34e77c35d",
"format": 1
},
{
"name": "plugins/modules/organizations_api_requests_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f11cab0cd2c66afd3712f8308dfac644ba7832d920d695c0a46320b3a80414dd",
+ "chksum_sha256": "467f12ec61ae15277244ab058bc237b8ede2bbbc9f77d6e047aa1c5c31b4444a",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_vlans_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "15f18f9667e879d8d2ad4f1b544f76b13bbdef53509acb2f32021ef7c6d65c17",
+ "chksum_sha256": "75192e944db45ba42596aaf0d915c606a2c1c1a8b9099a5976b6916ad8f5bfe5",
"format": 1
},
{
@@ -6437,7 +7193,14 @@
"name": "plugins/modules/networks_appliance_prefixes_delegated_statics.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fe325a87de497d8bdd59ec8c56214fb1e19d432732081342e25cb243dfe2385c",
+ "chksum_sha256": "e3463f0d31fa32d5d6cea87cf36c507cabbfc8cb7f398590d35e21032ed887d5",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "57dc58557af3a462983c137ced638bde4e8acc3e8de9190a0e7ef7390edc8a25",
"format": 1
},
{
@@ -6451,28 +7214,49 @@
"name": "plugins/modules/organizations_clone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f7cfb36b507c938466d275dcaf946560250fa2b8723b3a1b58f3822e65cb800e",
+ "chksum_sha256": "91eeea9eda6a632864e1b7a407b1552466568ddbc5a65c072f270ad076bba052",
"format": 1
},
{
"name": "plugins/modules/devices_camera_video_link_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dbeb7c2e68c830427412d62b9e9f32ac3ef922401a601d941c8a3432852f6f3e",
+ "chksum_sha256": "09d776c686f3d071ce68fac45efd5aa6e9bc543d37b703582d78ce6f60579b53",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/devices_live_tools_arp_table_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "182bb9cfacc809728b8fe0b8bf0c5238181d6a05433a64725e6c3baeadf7417b",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/administered_licensing_subscription_entitlements_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b15eaeb68a68c5bbe705447ea6bf9a7c3f17b122844e48a2c6150df31e4496a7",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/organizations_wireless_devices_packet_loss_by_network_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "40f8a34eb529cb996e620dc82cf8ff782b7ea154a42746a7ee3b95e5719abd58",
"format": 1
},
{
"name": "plugins/modules/networks_appliance_vpn_site_to_site_vpn_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "407e1e1d38217dfeea66ca8bef64d1b4a3458cccce51d47559d6ae7375759a48",
+ "chksum_sha256": "e3ab5ba7f7131ff3416fdddbd09517cf65a686a76a7e05574d9fc45c232cfe33",
"format": 1
},
{
"name": "plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "199581d1dac419fa4d01f24248b85b77455abf596f8cba5bf3c921b9cdb8422f",
+ "chksum_sha256": "2b09fe836ed03e3a1cc92c7e143cb7ea650399c4137c55206b576ca55a5fadb0",
"format": 1
},
{
@@ -8047,14 +8831,14 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "992bbdddaec70a154eb09d649be360f10f23855871b73e27593b113317aa56c8",
+ "chksum_sha256": "0edb9769be2615fbd836b0e2163b3f1ac4a6a5a5c1d26e21d073a68e3a3121cb",
"format": 1
},
{
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dab7eb97211ed7b3620fc89a9a52e8a5b6f910ebf5d9cee8684d8a6b3aebfcd0",
+ "chksum_sha256": "1783cef0d9bf0bc424d1cb9bf05cc3e6ead14b99c48a5cde79efdf46c11546e3",
"format": 1
},
{
@@ -8126,20 +8910,6 @@
"chksum_type": "sha256",
"chksum_sha256": "41eb770f555c1ae50051e7fd5d13cb7546eb134c1d95f6b7572c2ad397dca546",
"format": 1
- },
- {
- "name": ".vscode",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
- "format": 1
- },
- {
- "name": ".vscode/settings.json",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "d1be9315fe97520591ad6aca56c5b6ee625d3d2c84633de40f0f0afcc13a12a1",
- "format": 1
}
],
"format": 1
diff --git a/ansible_collections/cisco/meraki/MANIFEST.json b/ansible_collections/cisco/meraki/MANIFEST.json
index 5b4fc1a92..6f671e250 100644
--- a/ansible_collections/cisco/meraki/MANIFEST.json
+++ b/ansible_collections/cisco/meraki/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "cisco",
"name": "meraki",
- "version": "2.17.2",
+ "version": "2.18.0",
"authors": [
"Francisco Mu\u00f1oz <fmunoz@cloverhound.com>",
"Bryan Vargas <bvargas@cloverhound.com>",
@@ -22,7 +22,7 @@
"license": [],
"license_file": "LICENSE",
"dependencies": {
- "ansible.utils": ">=2.0.0,<4.0"
+ "ansible.utils": ">=2.0.0,<5.0"
},
"repository": "https://github.com/meraki/dashboard-api-ansible",
"documentation": "https://meraki.github.io/dashboard-api-ansible/",
@@ -33,7 +33,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "25a0e6b84e05b702fda09387109297a3491dd507f35fb966796b7f612b4a76af",
+ "chksum_sha256": "4c5636d16b861bfa135c614ab136a32cfe5ca9b0d639f5743d9136b2c3454ca8",
"format": 1
},
"format": 1
diff --git a/ansible_collections/cisco/meraki/README.md b/ansible_collections/cisco/meraki/README.md
index 56534396d..f7dc05f6a 100644
--- a/ansible_collections/cisco/meraki/README.md
+++ b/ansible_collections/cisco/meraki/README.md
@@ -1,117 +1,81 @@
-# Ansible Collection - cisco.meraki
+# Ansible Modules for Meraki
-## Ansible Modules for Meraki
+The Meraki-Ansible project provides an Ansible collection for managing and automating your Cisco Meraki environment. It consists of a set of modules and roles for performing tasks related to Meraki.
-The meraki-ansible project provides an Ansible collection for managing and automating your Cisco Meraki environment. It consists of a set of modules and roles for performing tasks related to Meraki.
+# Quick Start Guide
-This collection has been tested and supports Cisco Meraki v1.33.0
-
-*Note: This collection is not compatible with versions of Ansible before v2.14.*
-
-Other versions of this collection have support for previous Cisco Meraki versions. The recommended versions are listed below on the [Compatibility matrix](https://github.com/meraki/dashboard-api-ansible#compatibility-matrix).
-
-## Compatibility matrix
-
-| Cisco Meraki version | Ansible "cisco.meraki" version | Python "DashboardAPI" version |
-|--------------------------|------------------------------|-------------------------------|
-| 1.33.0 | 2.17.0 |1.33.0 |
-
-*Notes*:
-
-
-1. The "Python 'meraki' SDK version" column has the minimum recommended version used when testing the Ansible collection. This means you could use later versions of the Python "meraki" than those listed.
-2. The "Cisco Meraki version" column has the value of the `meraki_version` you should use for the Ansible collection.
-
-## Installing according to Compatibility Matrix
-
-For example, for Cisco Meraki 1.33.0, it is recommended to use Ansible "cisco.meraki" v1.0.0 and Python "meraki DashboardAPI" v1.33.0.
-
-To get the Python Meraki SDK v1.33.0 in a fresh development environment:
-```
-pip install meraki
-```
-
-To get the Ansible collection v1.0.0 in a fresh development environment:
-```
-ansible-galaxy collection install cisco.meraki -f
-```
-
-## Requirements
-- Ansible >= 2.9
-- [Python Meraki SDK](https://github.com/meraki/dashboard-api-python) v1.33.0 or newer
-- Python >= 3.6, as the Meraki SDK doesn't support Python version 2.x
-
-## Install
-Ansible must be installed ([Install guide](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html))
+## Installation
+1. Ansible must be installed ([Install guide](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html))
```
pip install ansible
```
-Python Meraki SDK must be installed
+2. Python Meraki SDK must be installed
```
pip install meraki
```
-Install the collection ([Galaxy link](https://galaxy.ansible.com/cisco/meraki))
+3. Install the collection ([Galaxy link](https://galaxy.ansible.com/cisco/meraki))
```
ansible-galaxy collection install cisco.meraki -f
```
-## Use
-First, your Meraki API key needs to be available for the playbook to use. You can leverage environment variables `export MERAKI_DASHBOARD_API_KEY=093b24e85df15a3e66f1fc359f4c48493eaa1b73`, or create a `credentials.yml` ([example](https://github.com/meraki/dashboard-api-ansible/blob/main/playbooks/credentials.yml) file.
+## Initial Configuration
+
+1. First, your Meraki API key needs to be available for the playbook to use. You can leverage environment variables `export MERAKI_DASHBOARD_API_KEY=6bec40cf957de430a6f1f2baa056b99a4fac9ea0`, or create a `credentials.yml` ([example](https://github.com/meraki/dashboard-api-ansible/blob/main/playbooks/credentials.yml) file.
**Note:** Storing your API key in an unencrypted text file is not recommended for security reasons.
-```
----
-meraki_api_key: "ABC"
-meraki_base_url: "https://api.meraki.com/api/v1"
-meraki_single_request_timeout: ""
-meraki_certificate_path: ""
-meraki_requests_proxy: True
-meraki_wait_on_rate_limit: 60
-meraki_nginx_429_retry_wait_time: 60
-meraki_action_batch_retry_wait_time: 60
-meraki_retry_4xx_error: False
-meraki_retry_4xx_error_wait_time: 60
-meraki_maximum_retries: 2
-meraki_output_log: True
-meraki_log_file_prefix: "meraki_api_"
-meraki_log_path: ""
-meraki_print_console: True
-meraki_suppress_logging: False
-meraki_simulate: False
-meraki_be_geo_id: ""
-meraki_caller: ""
-meraki_use_iterator_for_get_pages: False
-meraki_inherit_logging_config: False
-```
-
-Create a `hosts` ([example](https://github.com/meraki/dashboard-api-ansible/blob/main/playbooks/hosts)) file that uses `[meraki_servers]` with your Cisco Meraki Settings:
+2. Create a `hosts` ([example](https://github.com/meraki/dashboard-api-ansible/blob/main/playbooks/hosts)) file that uses `[meraki_servers]` with your Cisco Meraki Settings:
```
[meraki_servers]
meraki_server
```
-
-Then, create a playbook `myplaybook.yml` ([example](https://github.com/meraki/dashboard-api-ansible/blob/main/playbooks/who_am_i.yml)) referencing the variables in your credentials.yml file and specifying the full namespace path to the module, plugin and/or role:
+3. Running your first "Hello, world" in Ansible
+Create a playbook `who_am_i.yml` ([example](https://github.com/meraki/dashboard-api-ansible/blob/main/playbooks/who_am_i.yml)):
```
---
-- hosts: localhost
+- hosts: meraki_servers
gather_facts: false
tasks:
- - name: Get all administered _identities _me
+ - name: Get my administered identities
cisco.meraki.administered_identities_me_info:
- meraki_suppress_logging: true
register: result
+ - name: Show result
+ ansible.builtin.debug:
+ msg: "{{ result }}"
```
+This is a simple playbook that will (1) get the information about the Meraki admin user the API key belongs to and (2) print the information on the screen.
Execute the playbook:
```
-ansible-playbook -i hosts myplaybook.yml
+ansible-playbook -i hosts who_am_i.yml
```
-In the `playbooks` [directory](https://github.com/meraki/dashboard-api-ansible/blob/main/playbooks/) you can find more examples and use cases.
+4. Congratulations! You have just run your first Ansible playbook!
-### See Also:
+- - -
+# Detailed Information
-* [Ansible Using collections](https://docs.ansible.com/ansible/latest/user_guide/collections_using.html) for more details.
+This collection has been tested and supports Cisco Meraki Dashboard API v1.33.0
+
+*Note: This collection is not compatible with versions of Ansible before v2.14.*
+
+Other versions of this collection have support for previous Cisco Meraki versions. The recommended versions are listed below on the [Compatibility matrix](https://github.com/meraki/dashboard-api-ansible#compatibility-matrix).
+
+## Compatibility matrix
+
+| Cisco Meraki version | Ansible "cisco.meraki" version | Python "DashboardAPI" version |
+|--------------------------|------------------------------|-------------------------------|
+| 1.33.0 | 2.17.0 |1.33.0 |
+| 1.44.1 | 2.18.0 |1.44.1 |
+
+*Notes*:
+
+1. The "Python `meraki` SDK version" column has the minimum recommended version used when testing the Ansible collection. This means you could use later versions of the Python "meraki" than those listed.
+2. The "Cisco Meraki version" column has the value of the `meraki_version` you should use for the Ansible collection.
+
+## Requirements
+- Ansible >= 2.9
+- [Python Meraki SDK](https://github.com/meraki/dashboard-api-python) v1.33.0 or newer
+- Python >= 3.6, as the Meraki SDK doesn't support Python version 2.x
## Attention macOS users
@@ -128,6 +92,12 @@ If that's the case try setting this environment variable:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
```
+## Additional Resources
+1. [Meraki's Ansible Collection Documentation](https://docs.ansible.com/ansible/latest/collections/cisco/meraki/index.html)
+2. [Meraki Dashboard API Documentation](https://meraki.io/api)
+3. [DevNet Learning Lab](https://developer.cisco.com/learning/labs/meraki-dashboard-ansible/introduction/)
+4. [DevNet Sandbox](https://devnetsandbox.cisco.com/RM/Diagram/Index/a9487767-deef-4855-b3e3-880e7f39eadc?diagramType=Topology)
+
## Contributing to this collection
Ongoing development efforts and contributions to this collection are tracked as issues in this repository.
diff --git a/ansible_collections/cisco/meraki/changelogs/changelog.yaml b/ansible_collections/cisco/meraki/changelogs/changelog.yaml
index 53b0eabca..9909009fc 100644
--- a/ansible_collections/cisco/meraki/changelogs/changelog.yaml
+++ b/ansible_collections/cisco/meraki/changelogs/changelog.yaml
@@ -1003,4 +1003,64 @@ releases:
changes:
bugfixes:
- Adding `smartquotes = False` to `conf.py` and romoving `'` from rst files.
- release_date: '2023-12-19' \ No newline at end of file
+ release_date: '2023-12-19'
+ 2.18.0:
+ changes:
+ minor_changes:
+ - Ansible collection now support v1.44.1 of Dashboard Api.
+ - administered_licensing_subscription_entitlements_info - new plugin.
+ - administered_licensing_subscription_subscriptions_bind - new plugin.
+ - administered_licensing_subscription_subscriptions_claim_key_validate - new plugin.
+ - administered_licensing_subscription_subscriptions_claim - new plugin.
+ - administered_licensing_subscription_subscriptions_compliance_statuses_info - new plugin.
+ - administered_licensing_subscription_subscriptions_info - new plugin.
+ - devices_appliance_radio_settings_info - new plugin.
+ - devices_appliance_radio_settings - new plugin.
+ - devices_live_tools_arp_table_info - new plugin.
+ - devices_live_tools_arp_table - new plugin.
+ - devices_live_tools_cable_test_info - new plugin.
+ - devices_live_tools_cable_test - new plugin.
+ - devices_live_tools_throughput_test_info - new plugin.
+ - devices_live_tools_throughput_test - new plugin.
+ - devices_live_tools_wake_on_lan_info - new plugin.
+ - devices_live_tools_wake_on_lan - new plugin.
+ - devices_wireless_alternate_management_interface_ipv6 - new plugin.
+ - networks_appliance_rf_profiles_info - new plugin.
+ - networks_appliance_rf_profiles - new plugin.
+ - networks_appliance_traffic_shaping_vpn_exclusions - new plugin.
+ - networks_sm_devices_install_apps - new plugin.
+ - networks_sm_devices_reboot - new plugin.
+ - networks_sm_devices_shutdown - new plugin.
+ - networks_sm_devices_uninstall_apps - new plugin.
+ - networks_vlan_profiles_assignments_by_device_info - new plugin.
+ - networks_vlan_profiles_assignments_reassign - new plugin.
+ - networks_vlan_profiles_info - new plugin.
+ - networks_vlan_profiles - new plugin.
+ - networks_wireless_ethernet_ports_profiles_assign - new plugin.
+ - networks_wireless_ethernet_ports_profiles_info - new plugin.
+ - networks_wireless_ethernet_ports_profiles_set_default - new plugin.
+ - networks_wireless_ethernet_ports_profiles - new plugin.
+ - organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info - new plugin.
+ - organizations_appliance_uplinks_statuses_overview_info - new plugin.
+ - organizations_appliance_uplinks_usage_by_network_info - new plugin.
+ - organizations_camera_boundaries_areas_by_device_info - new plugin.
+ - organizations_camera_boundaries_lines_by_device_info - new plugin.
+ - organizations_camera_detections_history_by_boundary_by_interval_info - new plugin.
+ - organizations_camera_permissions_info - new plugin.
+ - organizations_camera_roles_info - new plugin.
+ - organizations_camera_roles - new plugin.
+ - organizations_devices_availabilities_change_history_info - new plugin.
+ - organizations_devices_boots_history_info - new plugin.
+ - organizations_sm_admins_roles_info - new plugin.
+ - organizations_sm_admins_roles - new plugin.
+ - organizations_sm_sentry_policies_assignments_by_network_info - new plugin.
+ - organizations_sm_sentry_policies_assignments - new plugin.
+ - organizations_summary_top_networks_by_status_info - new plugin.
+ - organizations_webhooks_callbacks_statuses_info - new plugin.
+ - organizations_wireless_devices_channel_utilization_by_device_info - new plugin.
+ - organizations_wireless_devices_channel_utilization_by_network_info - new plugin.
+ - organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info - new plugin.
+ - organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info - new plugin.
+ - organizations_wireless_devices_packet_loss_by_client_info - new plugin.
+ - organizations_wireless_devices_packet_loss_by_device_info - new plugin.
+ - organizations_wireless_devices_packet_loss_by_network_info - new plugin. \ No newline at end of file
diff --git a/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_entitlements_info.py b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_entitlements_info.py
new file mode 100644
index 000000000..b5af8055e
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_entitlements_info.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ skus=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("skus") is not None:
+ new_object["skus"] = params.get(
+ "skus")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="licensing",
+ function='getAdministeredLicensingSubscriptionEntitlements',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_bind.py b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_bind.py
new file mode 100644
index 000000000..e3cc7eba1
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_bind.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ networkIds=dict(type="list"),
+ subscriptionId=dict(type="str"),
+ validate=dict(type="bool"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ networkIds=params.get("networkIds"),
+ subscription_id=params.get("subscriptionId"),
+ validate=params.get("validate"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="licensing",
+ function='bindAdministeredLicensingSubscriptionSubscription',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim.py b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim.py
new file mode 100644
index 000000000..cf02a8ac6
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ claimKey=dict(type="str"),
+ description=dict(type="str"),
+ name=dict(type="str"),
+ organizationId=dict(type="str"),
+ validate=dict(type="bool"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ claimKey=params.get("claimKey"),
+ description=params.get("description"),
+ name=params.get("name"),
+ organizationId=params.get("organizationId"),
+ validate=params.get("validate"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="licensing",
+ function='claimAdministeredLicensingSubscriptionSubscriptions',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim_key_validate.py b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim_key_validate.py
new file mode 100644
index 000000000..9113049d7
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_claim_key_validate.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ claimKey=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ claimKey=params.get("claimKey"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="licensing",
+ function='validateAdministeredLicensingSubscriptionSubscriptionsClaimKey',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_compliance_statuses_info.py b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
new file mode 100644
index 000000000..ec2d035ab
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationIds=dict(type="list"),
+ subscriptionIds=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationIds") is not None:
+ new_object["organizationIds"] = params.get(
+ "organizationIds")
+ if params.get("subscriptionIds") is not None:
+ new_object["subscriptionIds"] = params.get(
+ "subscriptionIds")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="licensing",
+ function='getAdministeredLicensingSubscriptionSubscriptionsComplianceStatuses',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_info.py b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_info.py
new file mode 100644
index 000000000..8be76a060
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/administered_licensing_subscription_subscriptions_info.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ subscriptionIds=dict(type="list"),
+ organizationIds=dict(type="list"),
+ statuses=dict(type="list"),
+ productTypes=dict(type="list"),
+ startDate=dict(type="str"),
+ endDate=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("subscriptionIds") is not None:
+ new_object["subscriptionIds"] = params.get(
+ "subscriptionIds")
+ if params.get("organizationIds") is not None:
+ new_object["organizationIds"] = params.get(
+ "organizationIds")
+ if params.get("statuses") is not None:
+ new_object["statuses"] = params.get(
+ "statuses")
+ if params.get("productTypes") is not None:
+ new_object["productTypes"] = params.get(
+ "productTypes")
+ if params.get("startDate") is not None:
+ new_object["startDate"] = params.get(
+ "startDate")
+ if params.get("endDate") is not None:
+ new_object["endDate"] = params.get(
+ "endDate")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="licensing",
+ function='getAdministeredLicensingSubscriptionSubscriptions',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices.py b/ansible_collections/cisco/meraki/plugins/action/devices.py
index df0edfd10..49d41b1a7 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices.py
@@ -32,16 +32,15 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- name=dict(type="str"),
- tags=dict(type="list"),
+ address=dict(type="str"),
+ floorPlanId=dict(type="str"),
lat=dict(type="float"),
lng=dict(type="float"),
- address=dict(type="str"),
- notes=dict(type="str"),
moveMapMarker=dict(type="bool"),
+ name=dict(type="str"),
+ notes=dict(type="str"),
switchProfileId=dict(type="str"),
- floorPlanId=dict(type="str"),
- mac=dict(type="str"),
+ tags=dict(type="list"),
serial=dict(type="str"),
organizationId=dict(type="str"),
))
@@ -58,16 +57,15 @@ class Devices(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- tags=params.get("tags"),
+ address=params.get("address"),
+ floorPlanId=params.get("floorPlanId"),
lat=params.get("lat"),
lng=params.get("lng"),
- address=params.get("address"),
- notes=params.get("notes"),
moveMapMarker=params.get("moveMapMarker"),
+ name=params.get("name"),
+ notes=params.get("notes"),
switchProfileId=params.get("switchProfileId"),
- floorPlanId=params.get("floorPlanId"),
- mac=params.get("mac"),
+ tags=params.get("tags"),
serial=params.get("serial"),
organization_id=params.get("organizationId"),
)
@@ -130,36 +128,32 @@ class Devices(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
- new_object_params['tags'] = self.new_object.get('tags') or \
- self.new_object.get('tags')
+ if self.new_object.get('address') is not None or self.new_object.get('address') is not None:
+ new_object_params['address'] = self.new_object.get('address') or \
+ self.new_object.get('address')
+ if self.new_object.get('floorPlanId') is not None or self.new_object.get('floor_plan_id') is not None:
+ new_object_params['floorPlanId'] = self.new_object.get('floorPlanId') or \
+ self.new_object.get('floor_plan_id')
if self.new_object.get('lat') is not None or self.new_object.get('lat') is not None:
new_object_params['lat'] = self.new_object.get('lat') or \
self.new_object.get('lat')
if self.new_object.get('lng') is not None or self.new_object.get('lng') is not None:
new_object_params['lng'] = self.new_object.get('lng') or \
self.new_object.get('lng')
- if self.new_object.get('address') is not None or self.new_object.get('address') is not None:
- new_object_params['address'] = self.new_object.get('address') or \
- self.new_object.get('address')
+ if self.new_object.get('moveMapMarker') is not None or self.new_object.get('move_map_marker') is not None:
+ new_object_params['moveMapMarker'] = self.new_object.get('moveMapMarker')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('notes') is not None or self.new_object.get('notes') is not None:
new_object_params['notes'] = self.new_object.get('notes') or \
self.new_object.get('notes')
- if self.new_object.get('moveMapMarker') is not None or self.new_object.get('move_map_marker') is not None:
- new_object_params['moveMapMarker'] = self.new_object.get(
- 'moveMapMarker')
if self.new_object.get('switchProfileId') is not None or self.new_object.get('switch_profile_id') is not None:
new_object_params['switchProfileId'] = self.new_object.get('switchProfileId') or \
self.new_object.get('switch_profile_id')
- if self.new_object.get('floorPlanId') is not None or self.new_object.get('floor_plan_id') is not None:
- new_object_params['floorPlanId'] = self.new_object.get('floorPlanId') or \
- self.new_object.get('floor_plan_id')
- if self.new_object.get('mac') is not None or self.new_object.get('mac') is not None:
- new_object_params['mac'] = self.new_object.get('mac') or \
- self.new_object.get('mac')
+ if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
+ new_object_params['tags'] = self.new_object.get('tags') or \
+ self.new_object.get('tags')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -238,16 +232,15 @@ class Devices(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("tags", "tags"),
+ ("address", "address"),
+ ("floorPlanId", "floorPlanId"),
("lat", "lat"),
("lng", "lng"),
- ("address", "address"),
- ("notes", "notes"),
("moveMapMarker", "moveMapMarker"),
+ ("name", "name"),
+ ("notes", "notes"),
("switchProfileId", "switchProfileId"),
- ("floorPlanId", "floorPlanId"),
- ("mac", "mac"),
+ ("tags", "tags"),
("serial", "serial"),
("organizationId", "organizationId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings.py b/ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings.py
new file mode 100644
index 000000000..783ba4821
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings.py
@@ -0,0 +1,211 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+ get_dict_result,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present"]),
+ fiveGhzSettings=dict(type="dict"),
+ rfProfileId=dict(type="str"),
+ twoFourGhzSettings=dict(type="dict"),
+ serial=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["serial"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class DevicesApplianceRadioSettings(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ fiveGhzSettings=params.get("fiveGhzSettings"),
+ rfProfileId=params.get("rfProfileId"),
+ twoFourGhzSettings=params.get("twoFourGhzSettings"),
+ serial=params.get("serial"),
+ )
+
+ def get_all_params(self, name=None, id=None):
+ new_object_params = {}
+ if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
+ new_object_params['serial'] = self.new_object.get('serial')
+ return new_object_params
+
+ def update_all_params(self):
+ new_object_params = {}
+ if self.new_object.get('fiveGhzSettings') is not None or self.new_object.get('five_ghz_settings') is not None:
+ new_object_params['fiveGhzSettings'] = self.new_object.get('fiveGhzSettings') or \
+ self.new_object.get('five_ghz_settings')
+ if self.new_object.get('rfProfileId') is not None or self.new_object.get('rf_profile_id') is not None:
+ new_object_params['rfProfileId'] = self.new_object.get('rfProfileId') or \
+ self.new_object.get('rf_profile_id')
+ if self.new_object.get('twoFourGhzSettings') is not None or self.new_object.get('two_four_ghz_settings') is not None:
+ new_object_params['twoFourGhzSettings'] = self.new_object.get('twoFourGhzSettings') or \
+ self.new_object.get('two_four_ghz_settings')
+ if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
+ new_object_params['serial'] = self.new_object.get('serial') or \
+ self.new_object.get('serial')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name method, using get all
+ try:
+ items = self.meraki.exec_meraki(
+ family="appliance",
+ function="getDeviceApplianceRadioSettings",
+ params=self.get_all_params(name=name),
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = get_dict_result(items, 'name', name)
+ if result is None:
+ result = items
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ return result
+
+ def exists(self):
+ prev_obj = None
+ id_exists = False
+ name_exists = False
+ o_id = self.new_object.get("serial")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_name(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("fiveGhzSettings", "fiveGhzSettings"),
+ ("rfProfileId", "rfProfileId"),
+ ("twoFourGhzSettings", "twoFourGhzSettings"),
+ ("serial", "serial"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def update(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ result = None
+ result = self.meraki.exec_meraki(
+ family="appliance",
+ function="updateDeviceApplianceRadioSettings",
+ params=self.update_all_params(),
+ op_modifies=True,
+ )
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = DevicesApplianceRadioSettings(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = obj.update()
+ meraki.object_updated()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ meraki.fail_json(
+ "Object does not exists, plugin only has update")
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings_info.py b/ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings_info.py
new file mode 100644
index 000000000..2ac8e4768
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_appliance_radio_settings_info.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ serial=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("serial") is not None:
+ new_object["serial"] = params.get(
+ "serial")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="appliance",
+ function='getDeviceApplianceRadioSettings',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_blink_leds.py b/ansible_collections/cisco/meraki/plugins/action/devices_blink_leds.py
index d6e157172..010922bcd 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_blink_leds.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_blink_leds.py
@@ -26,8 +26,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
duration=dict(type="int"),
- period=dict(type="int"),
duty=dict(type="int"),
+ period=dict(type="int"),
serial=dict(type="str"),
))
@@ -68,8 +68,8 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
duration=params.get("duration"),
- period=params.get("period"),
duty=params.get("duty"),
+ period=params.get("period"),
serial=params.get("serial"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_camera_custom_analytics.py b/ansible_collections/cisco/meraki/plugins/action/devices_camera_custom_analytics.py
index 92f3aa3ae..7493fe9b4 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_camera_custom_analytics.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_camera_custom_analytics.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- enabled=dict(type="bool"),
artifactId=dict(type="str"),
+ enabled=dict(type="bool"),
parameters=dict(type="list"),
serial=dict(type="str"),
))
@@ -50,8 +50,8 @@ class DevicesCameraCustomAnalytics(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- enabled=params.get("enabled"),
artifactId=params.get("artifactId"),
+ enabled=params.get("enabled"),
parameters=params.get("parameters"),
serial=params.get("serial"),
)
@@ -64,11 +64,11 @@ class DevicesCameraCustomAnalytics(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('artifactId') is not None or self.new_object.get('artifact_id') is not None:
new_object_params['artifactId'] = self.new_object.get('artifactId') or \
self.new_object.get('artifact_id')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('parameters') is not None or self.new_object.get('parameters') is not None:
new_object_params['parameters'] = self.new_object.get('parameters') or \
self.new_object.get('parameters')
@@ -128,8 +128,8 @@ class DevicesCameraCustomAnalytics(object):
requested_obj = self.new_object
obj_params = [
- ("enabled", "enabled"),
("artifactId", "artifactId"),
+ ("enabled", "enabled"),
("parameters", "parameters"),
("serial", "serial"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_camera_generate_snapshot.py b/ansible_collections/cisco/meraki/plugins/action/devices_camera_generate_snapshot.py
index 8b7e68487..25f923011 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_camera_generate_snapshot.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_camera_generate_snapshot.py
@@ -25,8 +25,8 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- timestamp=dict(type="str"),
fullframe=dict(type="bool"),
+ timestamp=dict(type="str"),
serial=dict(type="str"),
))
@@ -66,8 +66,8 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- timestamp=params.get("timestamp"),
fullframe=params.get("fullframe"),
+ timestamp=params.get("timestamp"),
serial=params.get("serial"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_camera_quality_and_retention.py b/ansible_collections/cisco/meraki/plugins/action/devices_camera_quality_and_retention.py
index b7781783a..7b5056cf0 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_camera_quality_and_retention.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_camera_quality_and_retention.py
@@ -32,13 +32,13 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- profileId=dict(type="str"),
- motionBasedRetentionEnabled=dict(type="bool"),
audioRecordingEnabled=dict(type="bool"),
- restrictedBandwidthModeEnabled=dict(type="bool"),
+ motionBasedRetentionEnabled=dict(type="bool"),
+ motionDetectorVersion=dict(type="int"),
+ profileId=dict(type="str"),
quality=dict(type="str"),
resolution=dict(type="str"),
- motionDetectorVersion=dict(type="int"),
+ restrictedBandwidthModeEnabled=dict(type="bool"),
serial=dict(type="str"),
))
@@ -54,13 +54,13 @@ class DevicesCameraQualityAndRetention(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- profileId=params.get("profileId"),
- motionBasedRetentionEnabled=params.get("motionBasedRetentionEnabled"),
audioRecordingEnabled=params.get("audioRecordingEnabled"),
- restrictedBandwidthModeEnabled=params.get("restrictedBandwidthModeEnabled"),
+ motionBasedRetentionEnabled=params.get("motionBasedRetentionEnabled"),
+ motionDetectorVersion=params.get("motionDetectorVersion"),
+ profileId=params.get("profileId"),
quality=params.get("quality"),
resolution=params.get("resolution"),
- motionDetectorVersion=params.get("motionDetectorVersion"),
+ restrictedBandwidthModeEnabled=params.get("restrictedBandwidthModeEnabled"),
serial=params.get("serial"),
)
@@ -72,24 +72,24 @@ class DevicesCameraQualityAndRetention(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('audioRecordingEnabled') is not None or self.new_object.get('audio_recording_enabled') is not None:
+ new_object_params['audioRecordingEnabled'] = self.new_object.get('audioRecordingEnabled')
+ if self.new_object.get('motionBasedRetentionEnabled') is not None or self.new_object.get('motion_based_retention_enabled') is not None:
+ new_object_params['motionBasedRetentionEnabled'] = self.new_object.get('motionBasedRetentionEnabled')
+ if self.new_object.get('motionDetectorVersion') is not None or self.new_object.get('motion_detector_version') is not None:
+ new_object_params['motionDetectorVersion'] = self.new_object.get('motionDetectorVersion') or \
+ self.new_object.get('motion_detector_version')
if self.new_object.get('profileId') is not None or self.new_object.get('profile_id') is not None:
new_object_params['profileId'] = self.new_object.get('profileId') or \
self.new_object.get('profile_id')
- if self.new_object.get('motionBasedRetentionEnabled') is not None or self.new_object.get('motion_based_retention_enabled') is not None:
- new_object_params['motionBasedRetentionEnabled'] = self.new_object.get('motionBasedRetentionEnabled')
- if self.new_object.get('audioRecordingEnabled') is not None or self.new_object.get('audio_recording_enabled') is not None:
- new_object_params['audioRecordingEnabled'] = self.new_object.get('audioRecordingEnabled')
- if self.new_object.get('restrictedBandwidthModeEnabled') is not None or self.new_object.get('restricted_bandwidth_mode_enabled') is not None:
- new_object_params['restrictedBandwidthModeEnabled'] = self.new_object.get('restrictedBandwidthModeEnabled')
if self.new_object.get('quality') is not None or self.new_object.get('quality') is not None:
new_object_params['quality'] = self.new_object.get('quality') or \
self.new_object.get('quality')
if self.new_object.get('resolution') is not None or self.new_object.get('resolution') is not None:
new_object_params['resolution'] = self.new_object.get('resolution') or \
self.new_object.get('resolution')
- if self.new_object.get('motionDetectorVersion') is not None or self.new_object.get('motion_detector_version') is not None:
- new_object_params['motionDetectorVersion'] = self.new_object.get('motionDetectorVersion') or \
- self.new_object.get('motion_detector_version')
+ if self.new_object.get('restrictedBandwidthModeEnabled') is not None or self.new_object.get('restricted_bandwidth_mode_enabled') is not None:
+ new_object_params['restrictedBandwidthModeEnabled'] = self.new_object.get('restrictedBandwidthModeEnabled')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -146,13 +146,13 @@ class DevicesCameraQualityAndRetention(object):
requested_obj = self.new_object
obj_params = [
- ("profileId", "profileId"),
- ("motionBasedRetentionEnabled", "motionBasedRetentionEnabled"),
("audioRecordingEnabled", "audioRecordingEnabled"),
- ("restrictedBandwidthModeEnabled", "restrictedBandwidthModeEnabled"),
+ ("motionBasedRetentionEnabled", "motionBasedRetentionEnabled"),
+ ("motionDetectorVersion", "motionDetectorVersion"),
+ ("profileId", "profileId"),
("quality", "quality"),
("resolution", "resolution"),
- ("motionDetectorVersion", "motionDetectorVersion"),
+ ("restrictedBandwidthModeEnabled", "restrictedBandwidthModeEnabled"),
("serial", "serial"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_camera_sense.py b/ansible_collections/cisco/meraki/plugins/action/devices_camera_sense.py
index 3cc8dca92..c95304f52 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_camera_sense.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_camera_sense.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- senseEnabled=dict(type="bool"),
- mqttBrokerId=dict(type="str"),
audioDetection=dict(type="dict"),
detectionModelId=dict(type="str"),
+ mqttBrokerId=dict(type="str"),
+ senseEnabled=dict(type="bool"),
serial=dict(type="str"),
))
@@ -51,10 +51,10 @@ class DevicesCameraSense(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- senseEnabled=params.get("senseEnabled"),
- mqttBrokerId=params.get("mqttBrokerId"),
audioDetection=params.get("audioDetection"),
detectionModelId=params.get("detectionModelId"),
+ mqttBrokerId=params.get("mqttBrokerId"),
+ senseEnabled=params.get("senseEnabled"),
serial=params.get("serial"),
)
@@ -66,17 +66,17 @@ class DevicesCameraSense(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('senseEnabled') is not None or self.new_object.get('sense_enabled') is not None:
- new_object_params['senseEnabled'] = self.new_object.get('senseEnabled')
- if self.new_object.get('mqttBrokerId') is not None or self.new_object.get('mqtt_broker_id') is not None:
- new_object_params['mqttBrokerId'] = self.new_object.get('mqttBrokerId') or \
- self.new_object.get('mqtt_broker_id')
if self.new_object.get('audioDetection') is not None or self.new_object.get('audio_detection') is not None:
new_object_params['audioDetection'] = self.new_object.get('audioDetection') or \
self.new_object.get('audio_detection')
if self.new_object.get('detectionModelId') is not None or self.new_object.get('detection_model_id') is not None:
new_object_params['detectionModelId'] = self.new_object.get('detectionModelId') or \
self.new_object.get('detection_model_id')
+ if self.new_object.get('mqttBrokerId') is not None or self.new_object.get('mqtt_broker_id') is not None:
+ new_object_params['mqttBrokerId'] = self.new_object.get('mqttBrokerId') or \
+ self.new_object.get('mqtt_broker_id')
+ if self.new_object.get('senseEnabled') is not None or self.new_object.get('sense_enabled') is not None:
+ new_object_params['senseEnabled'] = self.new_object.get('senseEnabled')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -133,10 +133,10 @@ class DevicesCameraSense(object):
requested_obj = self.new_object
obj_params = [
- ("senseEnabled", "senseEnabled"),
- ("mqttBrokerId", "mqttBrokerId"),
("audioDetection", "audioDetection"),
("detectionModelId", "detectionModelId"),
+ ("mqttBrokerId", "mqttBrokerId"),
+ ("senseEnabled", "senseEnabled"),
("serial", "serial"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_camera_wireless_profiles.py b/ansible_collections/cisco/meraki/plugins/action/devices_camera_wireless_profiles.py
index 8153293df..f891d8c5b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_camera_wireless_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_camera_wireless_profiles.py
@@ -78,8 +78,8 @@ class DevicesCameraWirelessProfiles(object):
params=self.get_all_params(name=name),
)
if isinstance(items, dict):
- if 'response' in items:
- items = items.get('response')
+ if 'ids' in items:
+ items = items.get('ids')
result = get_dict_result(items, 'name', name)
if result is None:
result = items
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_lan.py b/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_lan.py
index ddb0b4d97..048e8a28b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_lan.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_lan.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- reservedIpRanges=dict(type="list"),
fixedIpAssignments=dict(type="list"),
+ reservedIpRanges=dict(type="list"),
serial=dict(type="str"),
))
@@ -49,8 +49,8 @@ class DevicesCellularGatewayLan(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- reservedIpRanges=params.get("reservedIpRanges"),
fixedIpAssignments=params.get("fixedIpAssignments"),
+ reservedIpRanges=params.get("reservedIpRanges"),
serial=params.get("serial"),
)
@@ -62,12 +62,12 @@ class DevicesCellularGatewayLan(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
- new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
- self.new_object.get('reserved_ip_ranges')
if self.new_object.get('fixedIpAssignments') is not None or self.new_object.get('fixed_ip_assignments') is not None:
new_object_params['fixedIpAssignments'] = self.new_object.get('fixedIpAssignments') or \
self.new_object.get('fixed_ip_assignments')
+ if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
+ new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
+ self.new_object.get('reserved_ip_ranges')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -124,8 +124,8 @@ class DevicesCellularGatewayLan(object):
requested_obj = self.new_object
obj_params = [
- ("reservedIpRanges", "reservedIpRanges"),
("fixedIpAssignments", "fixedIpAssignments"),
+ ("reservedIpRanges", "reservedIpRanges"),
("serial", "serial"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_port_forwarding_rules.py b/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_port_forwarding_rules.py
index 59a6ddf66..cb8693d61 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_port_forwarding_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_cellular_gateway_port_forwarding_rules.py
@@ -78,8 +78,8 @@ class DevicesCellularGatewayPortForwardingRules(object):
params=self.get_all_params(name=name),
)
if isinstance(items, dict):
- if 'response' in items:
- items = items.get('response')
+ if 'rules' in items:
+ items = items.get('rules')
result = get_dict_result(items, 'name', name)
if result is None:
result = items
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims.py b/ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims.py
index 93e187918..d00c47622 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_cellular_sims.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- sims=dict(type="list"),
simFailover=dict(type="dict"),
+ sims=dict(type="list"),
serial=dict(type="str"),
))
@@ -49,8 +49,8 @@ class DevicesCellularSims(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- sims=params.get("sims"),
simFailover=params.get("simFailover"),
+ sims=params.get("sims"),
serial=params.get("serial"),
)
@@ -62,12 +62,12 @@ class DevicesCellularSims(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('sims') is not None or self.new_object.get('sims') is not None:
- new_object_params['sims'] = self.new_object.get('sims') or \
- self.new_object.get('sims')
if self.new_object.get('simFailover') is not None or self.new_object.get('sim_failover') is not None:
new_object_params['simFailover'] = self.new_object.get('simFailover') or \
self.new_object.get('sim_failover')
+ if self.new_object.get('sims') is not None or self.new_object.get('sims') is not None:
+ new_object_params['sims'] = self.new_object.get('sims') or \
+ self.new_object.get('sims')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -83,8 +83,8 @@ class DevicesCellularSims(object):
params=self.get_all_params(name=name),
)
if isinstance(items, dict):
- if 'response' in items:
- items = items.get('response')
+ if 'sims' in items:
+ items = items.get('sims')
result = get_dict_result(items, 'name', name)
if result is None:
result = items
@@ -124,8 +124,8 @@ class DevicesCellularSims(object):
requested_obj = self.new_object
obj_params = [
- ("sims", "sims"),
("simFailover", "simFailover"),
+ ("sims", "sims"),
("serial", "serial"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table.py
new file mode 100644
index 000000000..3c80f50c5
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table.py
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present"]),
+ callback=dict(type="dict"),
+ serial=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["serial"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class DevicesLiveToolsArpTable(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ callback=params.get("callback"),
+ serial=params.get("serial"),
+ )
+
+ def create_params(self):
+ new_object_params = {}
+ if self.new_object.get('callback') is not None or self.new_object.get('callback') is not None:
+ new_object_params['callback'] = self.new_object.get('callback') or \
+ self.new_object.get('callback')
+ if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
+ new_object_params['serial'] = self.new_object.get('serial') or \
+ self.new_object.get('serial')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name and get all
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ return result
+
+ def exists(self):
+ prev_obj = None
+ id_exists = False
+ name_exists = False
+ o_id = self.new_object.get("serial")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_name(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("callback", "callback"),
+ ("serial", "serial"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def create(self):
+ result = self.meraki.exec_meraki(
+ family="devices",
+ function="createDeviceLiveToolsArpTable",
+ params=self.create_params(),
+ op_modifies=True,
+ )
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = DevicesLiveToolsArpTable(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = prev_obj
+ meraki.object_present_and_different()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ response = obj.create()
+ meraki.object_created()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table_info.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table_info.py
new file mode 100644
index 000000000..8e972db51
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_arp_table_info.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test.py
new file mode 100644
index 000000000..ec58e54fc
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test.py
@@ -0,0 +1,180 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present"]),
+ callback=dict(type="dict"),
+ ports=dict(type="list"),
+ serial=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["serial"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class DevicesLiveToolsCableTest(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ callback=params.get("callback"),
+ ports=params.get("ports"),
+ serial=params.get("serial"),
+ )
+
+ def create_params(self):
+ new_object_params = {}
+ if self.new_object.get('callback') is not None or self.new_object.get('callback') is not None:
+ new_object_params['callback'] = self.new_object.get('callback') or \
+ self.new_object.get('callback')
+ if self.new_object.get('ports') is not None or self.new_object.get('ports') is not None:
+ new_object_params['ports'] = self.new_object.get('ports') or \
+ self.new_object.get('ports')
+ if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
+ new_object_params['serial'] = self.new_object.get('serial') or \
+ self.new_object.get('serial')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name and get all
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ return result
+
+ def exists(self):
+ prev_obj = None
+ id_exists = False
+ name_exists = False
+ o_id = self.new_object.get("serial")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_name(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("callback", "callback"),
+ ("ports", "ports"),
+ ("serial", "serial"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def create(self):
+ result = self.meraki.exec_meraki(
+ family="devices",
+ function="createDeviceLiveToolsCableTest",
+ params=self.create_params(),
+ op_modifies=True,
+ )
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = DevicesLiveToolsCableTest(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = prev_obj
+ meraki.object_present_and_different()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ response = obj.create()
+ meraki.object_created()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test_info.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test_info.py
new file mode 100644
index 000000000..8e972db51
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_cable_test_info.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping.py
index ba5ef2d67..bd91ad77e 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping.py
@@ -31,8 +31,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- target=dict(type="str"),
+ callback=dict(type="dict"),
count=dict(type="int"),
+ target=dict(type="str"),
serial=dict(type="str"),
id=dict(type="str"),
))
@@ -49,8 +50,9 @@ class DevicesLiveToolsPing(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- target=params.get("target"),
+ callback=params.get("callback"),
count=params.get("count"),
+ target=params.get("target"),
serial=params.get("serial"),
id=params.get("id"),
)
@@ -65,12 +67,15 @@ class DevicesLiveToolsPing(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('target') is not None or self.new_object.get('target') is not None:
- new_object_params['target'] = self.new_object.get('target') or \
- self.new_object.get('target')
+ if self.new_object.get('callback') is not None or self.new_object.get('callback') is not None:
+ new_object_params['callback'] = self.new_object.get('callback') or \
+ self.new_object.get('callback')
if self.new_object.get('count') is not None or self.new_object.get('count') is not None:
new_object_params['count'] = self.new_object.get('count') or \
self.new_object.get('count')
+ if self.new_object.get('target') is not None or self.new_object.get('target') is not None:
+ new_object_params['target'] = self.new_object.get('target') or \
+ self.new_object.get('target')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -126,8 +131,9 @@ class DevicesLiveToolsPing(object):
requested_obj = self.new_object
obj_params = [
- ("target", "target"),
+ ("callback", "callback"),
("count", "count"),
+ ("target", "target"),
("serial", "serial"),
("id", "id"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device.py
index cb00a6c6b..4738511fb 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_ping_device.py
@@ -31,6 +31,7 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ callback=dict(type="dict"),
count=dict(type="int"),
serial=dict(type="str"),
id=dict(type="str"),
@@ -48,6 +49,7 @@ class DevicesLiveToolsPingDevice(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ callback=params.get("callback"),
count=params.get("count"),
serial=params.get("serial"),
id=params.get("id"),
@@ -63,6 +65,9 @@ class DevicesLiveToolsPingDevice(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('callback') is not None or self.new_object.get('callback') is not None:
+ new_object_params['callback'] = self.new_object.get('callback') or \
+ self.new_object.get('callback')
if self.new_object.get('count') is not None or self.new_object.get('count') is not None:
new_object_params['count'] = self.new_object.get('count') or \
self.new_object.get('count')
@@ -121,6 +126,7 @@ class DevicesLiveToolsPingDevice(object):
requested_obj = self.new_object
obj_params = [
+ ("callback", "callback"),
("count", "count"),
("serial", "serial"),
("id", "id"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test.py
new file mode 100644
index 000000000..50edfcffd
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test.py
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present"]),
+ callback=dict(type="dict"),
+ serial=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["serial"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class DevicesLiveToolsThroughputTest(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ callback=params.get("callback"),
+ serial=params.get("serial"),
+ )
+
+ def create_params(self):
+ new_object_params = {}
+ if self.new_object.get('callback') is not None or self.new_object.get('callback') is not None:
+ new_object_params['callback'] = self.new_object.get('callback') or \
+ self.new_object.get('callback')
+ if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
+ new_object_params['serial'] = self.new_object.get('serial') or \
+ self.new_object.get('serial')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name and get all
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ return result
+
+ def exists(self):
+ prev_obj = None
+ id_exists = False
+ name_exists = False
+ o_id = self.new_object.get("serial")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_name(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("callback", "callback"),
+ ("serial", "serial"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def create(self):
+ result = self.meraki.exec_meraki(
+ family="devices",
+ function="createDeviceLiveToolsThroughputTest",
+ params=self.create_params(),
+ op_modifies=True,
+ )
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = DevicesLiveToolsThroughputTest(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = prev_obj
+ meraki.object_present_and_different()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ response = obj.create()
+ meraki.object_created()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test_info.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test_info.py
new file mode 100644
index 000000000..8e972db51
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_throughput_test_info.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan.py
new file mode 100644
index 000000000..4fc6873e4
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan.py
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present"]),
+ callback=dict(type="dict"),
+ mac=dict(type="str"),
+ vlanId=dict(type="int"),
+ serial=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["serial"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class DevicesLiveToolsWakeOnLan(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ callback=params.get("callback"),
+ mac=params.get("mac"),
+ vlanId=params.get("vlanId"),
+ serial=params.get("serial"),
+ )
+
+ def create_params(self):
+ new_object_params = {}
+ if self.new_object.get('callback') is not None or self.new_object.get('callback') is not None:
+ new_object_params['callback'] = self.new_object.get('callback') or \
+ self.new_object.get('callback')
+ if self.new_object.get('mac') is not None or self.new_object.get('mac') is not None:
+ new_object_params['mac'] = self.new_object.get('mac') or \
+ self.new_object.get('mac')
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
+ new_object_params['vlanId'] = self.new_object.get('vlanId') or \
+ self.new_object.get('vlan_id')
+ if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
+ new_object_params['serial'] = self.new_object.get('serial') or \
+ self.new_object.get('serial')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name and get all
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ return result
+
+ def exists(self):
+ prev_obj = None
+ id_exists = False
+ name_exists = False
+ o_id = self.new_object.get("serial")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_name(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("callback", "callback"),
+ ("mac", "mac"),
+ ("vlanId", "vlanId"),
+ ("serial", "serial"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def create(self):
+ result = self.meraki.exec_meraki(
+ family="devices",
+ function="createDeviceLiveToolsWakeOnLan",
+ params=self.create_params(),
+ op_modifies=True,
+ )
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = DevicesLiveToolsWakeOnLan(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = prev_obj
+ meraki.object_present_and_different()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ response = obj.create()
+ meraki.object_created()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan_info.py b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan_info.py
new file mode 100644
index 000000000..8e972db51
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_live_tools_wake_on_lan_info.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_sensor_relationships.py b/ansible_collections/cisco/meraki/plugins/action/devices_sensor_relationships.py
index 75c20b830..b55f44b6e 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_sensor_relationships.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_sensor_relationships.py
@@ -78,8 +78,8 @@ class DevicesSensorRelationships(object):
params=self.get_all_params(name=name),
)
if isinstance(items, dict):
- if 'response' in items:
- items = items.get('response')
+ if 'livestream' in items:
+ items = items.get('livestream')
result = get_dict_result(items, 'name', name)
if result is None:
result = items
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_switch_ports.py b/ansible_collections/cisco/meraki/plugins/action/devices_switch_ports.py
index 659e6a4f8..44a238eb2 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_switch_ports.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_switch_ports.py
@@ -32,31 +32,31 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- name=dict(type="str"),
- tags=dict(type="list"),
- enabled=dict(type="bool"),
- poeEnabled=dict(type="bool"),
- type=dict(type="str"),
- vlan=dict(type="int"),
- voiceVlan=dict(type="int"),
+ accessPolicyNumber=dict(type="int"),
+ accessPolicyType=dict(type="str"),
+ adaptivePolicyGroupId=dict(type="str"),
allowedVlans=dict(type="str"),
+ daiTrusted=dict(type="bool"),
+ enabled=dict(type="bool"),
+ flexibleStackingEnabled=dict(type="bool"),
isolationEnabled=dict(type="bool"),
- rstpEnabled=dict(type="bool"),
- stpGuard=dict(type="str"),
linkNegotiation=dict(type="str"),
- portScheduleId=dict(type="str"),
- udld=dict(type="str"),
- accessPolicyType=dict(type="str"),
- accessPolicyNumber=dict(type="int"),
macAllowList=dict(type="list"),
+ name=dict(type="str"),
+ peerSgtCapable=dict(type="bool"),
+ poeEnabled=dict(type="bool"),
+ portScheduleId=dict(type="str"),
+ profile=dict(type="dict"),
+ rstpEnabled=dict(type="bool"),
stickyMacAllowList=dict(type="list"),
stickyMacAllowListLimit=dict(type="int"),
stormControlEnabled=dict(type="bool"),
- adaptivePolicyGroupId=dict(type="str"),
- peerSgtCapable=dict(type="bool"),
- flexibleStackingEnabled=dict(type="bool"),
- daiTrusted=dict(type="bool"),
- profile=dict(type="dict"),
+ stpGuard=dict(type="str"),
+ tags=dict(type="list"),
+ type=dict(type="str"),
+ udld=dict(type="str"),
+ vlan=dict(type="int"),
+ voiceVlan=dict(type="int"),
serial=dict(type="str"),
portId=dict(type="str"),
))
@@ -73,31 +73,31 @@ class DevicesSwitchPorts(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- tags=params.get("tags"),
- enabled=params.get("enabled"),
- poeEnabled=params.get("poeEnabled"),
- type=params.get("type"),
- vlan=params.get("vlan"),
- voiceVlan=params.get("voiceVlan"),
+ accessPolicyNumber=params.get("accessPolicyNumber"),
+ accessPolicyType=params.get("accessPolicyType"),
+ adaptivePolicyGroupId=params.get("adaptivePolicyGroupId"),
allowedVlans=params.get("allowedVlans"),
+ daiTrusted=params.get("daiTrusted"),
+ enabled=params.get("enabled"),
+ flexibleStackingEnabled=params.get("flexibleStackingEnabled"),
isolationEnabled=params.get("isolationEnabled"),
- rstpEnabled=params.get("rstpEnabled"),
- stpGuard=params.get("stpGuard"),
linkNegotiation=params.get("linkNegotiation"),
- portScheduleId=params.get("portScheduleId"),
- udld=params.get("udld"),
- accessPolicyType=params.get("accessPolicyType"),
- accessPolicyNumber=params.get("accessPolicyNumber"),
macAllowList=params.get("macAllowList"),
+ name=params.get("name"),
+ peerSgtCapable=params.get("peerSgtCapable"),
+ poeEnabled=params.get("poeEnabled"),
+ portScheduleId=params.get("portScheduleId"),
+ profile=params.get("profile"),
+ rstpEnabled=params.get("rstpEnabled"),
stickyMacAllowList=params.get("stickyMacAllowList"),
stickyMacAllowListLimit=params.get("stickyMacAllowListLimit"),
stormControlEnabled=params.get("stormControlEnabled"),
- adaptivePolicyGroupId=params.get("adaptivePolicyGroupId"),
- peerSgtCapable=params.get("peerSgtCapable"),
- flexibleStackingEnabled=params.get("flexibleStackingEnabled"),
- daiTrusted=params.get("daiTrusted"),
- profile=params.get("profile"),
+ stpGuard=params.get("stpGuard"),
+ tags=params.get("tags"),
+ type=params.get("type"),
+ udld=params.get("udld"),
+ vlan=params.get("vlan"),
+ voiceVlan=params.get("voiceVlan"),
serial=params.get("serial"),
port_id=params.get("portId"),
)
@@ -119,55 +119,47 @@ class DevicesSwitchPorts(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
- new_object_params['tags'] = self.new_object.get('tags') or \
- self.new_object.get('tags')
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
- if self.new_object.get('poeEnabled') is not None or self.new_object.get('poe_enabled') is not None:
- new_object_params['poeEnabled'] = self.new_object.get('poeEnabled')
- if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
- new_object_params['type'] = self.new_object.get('type') or \
- self.new_object.get('type')
- if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
- new_object_params['vlan'] = self.new_object.get('vlan') or \
- self.new_object.get('vlan')
- if self.new_object.get('voiceVlan') is not None or self.new_object.get('voice_vlan') is not None:
- new_object_params['voiceVlan'] = self.new_object.get('voiceVlan') or \
- self.new_object.get('voice_vlan')
+ if self.new_object.get('accessPolicyNumber') is not None or self.new_object.get('access_policy_number') is not None:
+ new_object_params['accessPolicyNumber'] = self.new_object.get('accessPolicyNumber') or \
+ self.new_object.get('access_policy_number')
+ if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
+ new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
+ self.new_object.get('access_policy_type')
+ if self.new_object.get('adaptivePolicyGroupId') is not None or self.new_object.get('adaptive_policy_group_id') is not None:
+ new_object_params['adaptivePolicyGroupId'] = self.new_object.get('adaptivePolicyGroupId') or \
+ self.new_object.get('adaptive_policy_group_id')
if self.new_object.get('allowedVlans') is not None or self.new_object.get('allowed_vlans') is not None:
new_object_params['allowedVlans'] = self.new_object.get('allowedVlans') or \
self.new_object.get('allowed_vlans')
+ if self.new_object.get('daiTrusted') is not None or self.new_object.get('dai_trusted') is not None:
+ new_object_params['daiTrusted'] = self.new_object.get('daiTrusted')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('flexibleStackingEnabled') is not None or self.new_object.get('flexible_stacking_enabled') is not None:
+ new_object_params['flexibleStackingEnabled'] = self.new_object.get('flexibleStackingEnabled')
if self.new_object.get('isolationEnabled') is not None or self.new_object.get('isolation_enabled') is not None:
- new_object_params['isolationEnabled'] = self.new_object.get(
- 'isolationEnabled')
- if self.new_object.get('rstpEnabled') is not None or self.new_object.get('rstp_enabled') is not None:
- new_object_params['rstpEnabled'] = self.new_object.get(
- 'rstpEnabled')
- if self.new_object.get('stpGuard') is not None or self.new_object.get('stp_guard') is not None:
- new_object_params['stpGuard'] = self.new_object.get('stpGuard') or \
- self.new_object.get('stp_guard')
+ new_object_params['isolationEnabled'] = self.new_object.get('isolationEnabled')
if self.new_object.get('linkNegotiation') is not None or self.new_object.get('link_negotiation') is not None:
new_object_params['linkNegotiation'] = self.new_object.get('linkNegotiation') or \
self.new_object.get('link_negotiation')
- if self.new_object.get('portScheduleId') is not None or self.new_object.get('port_schedule_id') is not None:
- new_object_params['portScheduleId'] = self.new_object.get('portScheduleId') or \
- self.new_object.get('port_schedule_id')
- if self.new_object.get('udld') is not None or self.new_object.get('udld') is not None:
- new_object_params['udld'] = self.new_object.get('udld') or \
- self.new_object.get('udld')
- if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
- new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
- self.new_object.get('access_policy_type')
- if self.new_object.get('accessPolicyNumber') is not None or self.new_object.get('access_policy_number') is not None:
- new_object_params['accessPolicyNumber'] = self.new_object.get('accessPolicyNumber') or \
- self.new_object.get('access_policy_number')
if self.new_object.get('macAllowList') is not None or self.new_object.get('mac_allow_list') is not None:
new_object_params['macAllowList'] = self.new_object.get('macAllowList') or \
self.new_object.get('mac_allow_list')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('peerSgtCapable') is not None or self.new_object.get('peer_sgt_capable') is not None:
+ new_object_params['peerSgtCapable'] = self.new_object.get('peerSgtCapable')
+ if self.new_object.get('poeEnabled') is not None or self.new_object.get('poe_enabled') is not None:
+ new_object_params['poeEnabled'] = self.new_object.get('poeEnabled')
+ if self.new_object.get('portScheduleId') is not None or self.new_object.get('port_schedule_id') is not None:
+ new_object_params['portScheduleId'] = self.new_object.get('portScheduleId') or \
+ self.new_object.get('port_schedule_id')
+ if self.new_object.get('profile') is not None or self.new_object.get('profile') is not None:
+ new_object_params['profile'] = self.new_object.get('profile') or \
+ self.new_object.get('profile')
+ if self.new_object.get('rstpEnabled') is not None or self.new_object.get('rstp_enabled') is not None:
+ new_object_params['rstpEnabled'] = self.new_object.get('rstpEnabled')
if self.new_object.get('stickyMacAllowList') is not None or self.new_object.get('sticky_mac_allow_list') is not None:
new_object_params['stickyMacAllowList'] = self.new_object.get('stickyMacAllowList') or \
self.new_object.get('sticky_mac_allow_list')
@@ -175,22 +167,25 @@ class DevicesSwitchPorts(object):
new_object_params['stickyMacAllowListLimit'] = self.new_object.get('stickyMacAllowListLimit') or \
self.new_object.get('sticky_mac_allow_list_limit')
if self.new_object.get('stormControlEnabled') is not None or self.new_object.get('storm_control_enabled') is not None:
- new_object_params['stormControlEnabled'] = self.new_object.get(
- 'stormControlEnabled')
- if self.new_object.get('adaptivePolicyGroupId') is not None or self.new_object.get('adaptive_policy_group_id') is not None:
- new_object_params['adaptivePolicyGroupId'] = self.new_object.get('adaptivePolicyGroupId') or \
- self.new_object.get('adaptive_policy_group_id')
- if self.new_object.get('peerSgtCapable') is not None or self.new_object.get('peer_sgt_capable') is not None:
- new_object_params['peerSgtCapable'] = self.new_object.get(
- 'peerSgtCapable')
- if self.new_object.get('flexibleStackingEnabled') is not None or self.new_object.get('flexible_stacking_enabled') is not None:
- new_object_params['flexibleStackingEnabled'] = self.new_object.get(
- 'flexibleStackingEnabled')
- if self.new_object.get('daiTrusted') is not None or self.new_object.get('dai_trusted') is not None:
- new_object_params['daiTrusted'] = self.new_object.get('daiTrusted')
- if self.new_object.get('profile') is not None or self.new_object.get('profile') is not None:
- new_object_params['profile'] = self.new_object.get('profile') or \
- self.new_object.get('profile')
+ new_object_params['stormControlEnabled'] = self.new_object.get('stormControlEnabled')
+ if self.new_object.get('stpGuard') is not None or self.new_object.get('stp_guard') is not None:
+ new_object_params['stpGuard'] = self.new_object.get('stpGuard') or \
+ self.new_object.get('stp_guard')
+ if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
+ new_object_params['tags'] = self.new_object.get('tags') or \
+ self.new_object.get('tags')
+ if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
+ new_object_params['type'] = self.new_object.get('type') or \
+ self.new_object.get('type')
+ if self.new_object.get('udld') is not None or self.new_object.get('udld') is not None:
+ new_object_params['udld'] = self.new_object.get('udld') or \
+ self.new_object.get('udld')
+ if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
+ new_object_params['vlan'] = self.new_object.get('vlan') or \
+ self.new_object.get('vlan')
+ if self.new_object.get('voiceVlan') is not None or self.new_object.get('voice_vlan') is not None:
+ new_object_params['voiceVlan'] = self.new_object.get('voiceVlan') or \
+ self.new_object.get('voice_vlan')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -269,31 +264,31 @@ class DevicesSwitchPorts(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("tags", "tags"),
- ("enabled", "enabled"),
- ("poeEnabled", "poeEnabled"),
- ("type", "type"),
- ("vlan", "vlan"),
- ("voiceVlan", "voiceVlan"),
+ ("accessPolicyNumber", "accessPolicyNumber"),
+ ("accessPolicyType", "accessPolicyType"),
+ ("adaptivePolicyGroupId", "adaptivePolicyGroupId"),
("allowedVlans", "allowedVlans"),
+ ("daiTrusted", "daiTrusted"),
+ ("enabled", "enabled"),
+ ("flexibleStackingEnabled", "flexibleStackingEnabled"),
("isolationEnabled", "isolationEnabled"),
- ("rstpEnabled", "rstpEnabled"),
- ("stpGuard", "stpGuard"),
("linkNegotiation", "linkNegotiation"),
- ("portScheduleId", "portScheduleId"),
- ("udld", "udld"),
- ("accessPolicyType", "accessPolicyType"),
- ("accessPolicyNumber", "accessPolicyNumber"),
("macAllowList", "macAllowList"),
+ ("name", "name"),
+ ("peerSgtCapable", "peerSgtCapable"),
+ ("poeEnabled", "poeEnabled"),
+ ("portScheduleId", "portScheduleId"),
+ ("profile", "profile"),
+ ("rstpEnabled", "rstpEnabled"),
("stickyMacAllowList", "stickyMacAllowList"),
("stickyMacAllowListLimit", "stickyMacAllowListLimit"),
("stormControlEnabled", "stormControlEnabled"),
- ("adaptivePolicyGroupId", "adaptivePolicyGroupId"),
- ("peerSgtCapable", "peerSgtCapable"),
- ("flexibleStackingEnabled", "flexibleStackingEnabled"),
- ("daiTrusted", "daiTrusted"),
- ("profile", "profile"),
+ ("stpGuard", "stpGuard"),
+ ("tags", "tags"),
+ ("type", "type"),
+ ("udld", "udld"),
+ ("vlan", "vlan"),
+ ("voiceVlan", "voiceVlan"),
("serial", "serial"),
("portId", "portId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces.py b/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces.py
index 774366850..c013c4bb5 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces.py
@@ -32,15 +32,15 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- subnet=dict(type="str"),
+ defaultGateway=dict(type="str"),
interfaceIp=dict(type="str"),
+ ipv6=dict(type="dict"),
multicastRouting=dict(type="str"),
- vlanId=dict(type="int"),
- defaultGateway=dict(type="str"),
+ name=dict(type="str"),
ospfSettings=dict(type="dict"),
ospfV3=dict(type="dict"),
- ipv6=dict(type="dict"),
+ subnet=dict(type="str"),
+ vlanId=dict(type="int"),
serial=dict(type="str"),
interfaceId=dict(type="str"),
))
@@ -58,15 +58,15 @@ class DevicesSwitchRoutingInterfaces(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- subnet=params.get("subnet"),
+ defaultGateway=params.get("defaultGateway"),
interfaceIp=params.get("interfaceIp"),
+ ipv6=params.get("ipv6"),
multicastRouting=params.get("multicastRouting"),
- vlanId=params.get("vlanId"),
- defaultGateway=params.get("defaultGateway"),
+ name=params.get("name"),
ospfSettings=params.get("ospfSettings"),
ospfV3=params.get("ospfV3"),
- ipv6=params.get("ipv6"),
+ subnet=params.get("subnet"),
+ vlanId=params.get("vlanId"),
serial=params.get("serial"),
interfaceId=params.get("interfaceId"),
)
@@ -88,33 +88,33 @@ class DevicesSwitchRoutingInterfaces(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
+ if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
+ new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
+ self.new_object.get('default_gateway')
if self.new_object.get('interfaceIp') is not None or self.new_object.get('interface_ip') is not None:
new_object_params['interfaceIp'] = self.new_object.get('interfaceIp') or \
self.new_object.get('interface_ip')
+ if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
+ new_object_params['ipv6'] = self.new_object.get('ipv6') or \
+ self.new_object.get('ipv6')
if self.new_object.get('multicastRouting') is not None or self.new_object.get('multicast_routing') is not None:
new_object_params['multicastRouting'] = self.new_object.get('multicastRouting') or \
self.new_object.get('multicast_routing')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
- new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id')
- if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
- new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
- self.new_object.get('default_gateway')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('ospfSettings') is not None or self.new_object.get('ospf_settings') is not None:
new_object_params['ospfSettings'] = self.new_object.get('ospfSettings') or \
self.new_object.get('ospf_settings')
if self.new_object.get('ospfV3') is not None or self.new_object.get('ospf_v3') is not None:
new_object_params['ospfV3'] = self.new_object.get('ospfV3') or \
self.new_object.get('ospf_v3')
- if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
- new_object_params['ipv6'] = self.new_object.get('ipv6') or \
- self.new_object.get('ipv6')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
+ new_object_params['vlanId'] = self.new_object.get('vlanId') or \
+ self.new_object.get('vlan_id')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -132,33 +132,33 @@ class DevicesSwitchRoutingInterfaces(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
+ if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
+ new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
+ self.new_object.get('default_gateway')
if self.new_object.get('interfaceIp') is not None or self.new_object.get('interface_ip') is not None:
new_object_params['interfaceIp'] = self.new_object.get('interfaceIp') or \
self.new_object.get('interface_ip')
+ if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
+ new_object_params['ipv6'] = self.new_object.get('ipv6') or \
+ self.new_object.get('ipv6')
if self.new_object.get('multicastRouting') is not None or self.new_object.get('multicast_routing') is not None:
new_object_params['multicastRouting'] = self.new_object.get('multicastRouting') or \
self.new_object.get('multicast_routing')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
- new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id')
- if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
- new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
- self.new_object.get('default_gateway')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('ospfSettings') is not None or self.new_object.get('ospf_settings') is not None:
new_object_params['ospfSettings'] = self.new_object.get('ospfSettings') or \
self.new_object.get('ospf_settings')
if self.new_object.get('ospfV3') is not None or self.new_object.get('ospf_v3') is not None:
new_object_params['ospfV3'] = self.new_object.get('ospfV3') or \
self.new_object.get('ospf_v3')
- if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
- new_object_params['ipv6'] = self.new_object.get('ipv6') or \
- self.new_object.get('ipv6')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
+ new_object_params['vlanId'] = self.new_object.get('vlanId') or \
+ self.new_object.get('vlan_id')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -236,15 +236,15 @@ class DevicesSwitchRoutingInterfaces(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("subnet", "subnet"),
+ ("defaultGateway", "defaultGateway"),
("interfaceIp", "interfaceIp"),
+ ("ipv6", "ipv6"),
("multicastRouting", "multicastRouting"),
- ("vlanId", "vlanId"),
- ("defaultGateway", "defaultGateway"),
+ ("name", "name"),
("ospfSettings", "ospfSettings"),
("ospfV3", "ospfV3"),
- ("ipv6", "ipv6"),
+ ("subnet", "subnet"),
+ ("vlanId", "vlanId"),
("serial", "serial"),
("interfaceId", "interfaceId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces_dhcp.py b/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces_dhcp.py
index 4fdb74e4e..39063de9f 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces_dhcp.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_interfaces_dhcp.py
@@ -32,17 +32,17 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ bootFileName=dict(type="str"),
+ bootNextServer=dict(type="str"),
+ bootOptionsEnabled=dict(type="bool"),
+ dhcpLeaseTime=dict(type="str"),
dhcpMode=dict(type="str"),
+ dhcpOptions=dict(type="list"),
dhcpRelayServerIps=dict(type="list"),
- dhcpLeaseTime=dict(type="str"),
- dnsNameserversOption=dict(type="str"),
dnsCustomNameservers=dict(type="list"),
- bootOptionsEnabled=dict(type="bool"),
- bootNextServer=dict(type="str"),
- bootFileName=dict(type="str"),
- dhcpOptions=dict(type="list"),
- reservedIpRanges=dict(type="list"),
+ dnsNameserversOption=dict(type="str"),
fixedIpAssignments=dict(type="list"),
+ reservedIpRanges=dict(type="list"),
serial=dict(type="str"),
interfaceId=dict(type="str"),
))
@@ -59,17 +59,17 @@ class DevicesSwitchRoutingInterfacesDhcp(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ bootFileName=params.get("bootFileName"),
+ bootNextServer=params.get("bootNextServer"),
+ bootOptionsEnabled=params.get("bootOptionsEnabled"),
+ dhcpLeaseTime=params.get("dhcpLeaseTime"),
dhcpMode=params.get("dhcpMode"),
+ dhcpOptions=params.get("dhcpOptions"),
dhcpRelayServerIps=params.get("dhcpRelayServerIps"),
- dhcpLeaseTime=params.get("dhcpLeaseTime"),
- dnsNameserversOption=params.get("dnsNameserversOption"),
dnsCustomNameservers=params.get("dnsCustomNameservers"),
- bootOptionsEnabled=params.get("bootOptionsEnabled"),
- bootNextServer=params.get("bootNextServer"),
- bootFileName=params.get("bootFileName"),
- dhcpOptions=params.get("dhcpOptions"),
- reservedIpRanges=params.get("reservedIpRanges"),
+ dnsNameserversOption=params.get("dnsNameserversOption"),
fixedIpAssignments=params.get("fixedIpAssignments"),
+ reservedIpRanges=params.get("reservedIpRanges"),
serial=params.get("serial"),
interface_id=params.get("interfaceId"),
)
@@ -85,38 +85,38 @@ class DevicesSwitchRoutingInterfacesDhcp(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('bootFileName') is not None or self.new_object.get('boot_file_name') is not None:
+ new_object_params['bootFileName'] = self.new_object.get('bootFileName') or \
+ self.new_object.get('boot_file_name')
+ if self.new_object.get('bootNextServer') is not None or self.new_object.get('boot_next_server') is not None:
+ new_object_params['bootNextServer'] = self.new_object.get('bootNextServer') or \
+ self.new_object.get('boot_next_server')
+ if self.new_object.get('bootOptionsEnabled') is not None or self.new_object.get('boot_options_enabled') is not None:
+ new_object_params['bootOptionsEnabled'] = self.new_object.get('bootOptionsEnabled')
+ if self.new_object.get('dhcpLeaseTime') is not None or self.new_object.get('dhcp_lease_time') is not None:
+ new_object_params['dhcpLeaseTime'] = self.new_object.get('dhcpLeaseTime') or \
+ self.new_object.get('dhcp_lease_time')
if self.new_object.get('dhcpMode') is not None or self.new_object.get('dhcp_mode') is not None:
new_object_params['dhcpMode'] = self.new_object.get('dhcpMode') or \
self.new_object.get('dhcp_mode')
+ if self.new_object.get('dhcpOptions') is not None or self.new_object.get('dhcp_options') is not None:
+ new_object_params['dhcpOptions'] = self.new_object.get('dhcpOptions') or \
+ self.new_object.get('dhcp_options')
if self.new_object.get('dhcpRelayServerIps') is not None or self.new_object.get('dhcp_relay_server_ips') is not None:
new_object_params['dhcpRelayServerIps'] = self.new_object.get('dhcpRelayServerIps') or \
self.new_object.get('dhcp_relay_server_ips')
- if self.new_object.get('dhcpLeaseTime') is not None or self.new_object.get('dhcp_lease_time') is not None:
- new_object_params['dhcpLeaseTime'] = self.new_object.get('dhcpLeaseTime') or \
- self.new_object.get('dhcp_lease_time')
- if self.new_object.get('dnsNameserversOption') is not None or self.new_object.get('dns_nameservers_option') is not None:
- new_object_params['dnsNameserversOption'] = self.new_object.get('dnsNameserversOption') or \
- self.new_object.get('dns_nameservers_option')
if self.new_object.get('dnsCustomNameservers') is not None or self.new_object.get('dns_custom_nameservers') is not None:
new_object_params['dnsCustomNameservers'] = self.new_object.get('dnsCustomNameservers') or \
self.new_object.get('dns_custom_nameservers')
- if self.new_object.get('bootOptionsEnabled') is not None or self.new_object.get('boot_options_enabled') is not None:
- new_object_params['bootOptionsEnabled'] = self.new_object.get('bootOptionsEnabled')
- if self.new_object.get('bootNextServer') is not None or self.new_object.get('boot_next_server') is not None:
- new_object_params['bootNextServer'] = self.new_object.get('bootNextServer') or \
- self.new_object.get('boot_next_server')
- if self.new_object.get('bootFileName') is not None or self.new_object.get('boot_file_name') is not None:
- new_object_params['bootFileName'] = self.new_object.get('bootFileName') or \
- self.new_object.get('boot_file_name')
- if self.new_object.get('dhcpOptions') is not None or self.new_object.get('dhcp_options') is not None:
- new_object_params['dhcpOptions'] = self.new_object.get('dhcpOptions') or \
- self.new_object.get('dhcp_options')
- if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
- new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
- self.new_object.get('reserved_ip_ranges')
+ if self.new_object.get('dnsNameserversOption') is not None or self.new_object.get('dns_nameservers_option') is not None:
+ new_object_params['dnsNameserversOption'] = self.new_object.get('dnsNameserversOption') or \
+ self.new_object.get('dns_nameservers_option')
if self.new_object.get('fixedIpAssignments') is not None or self.new_object.get('fixed_ip_assignments') is not None:
new_object_params['fixedIpAssignments'] = self.new_object.get('fixedIpAssignments') or \
self.new_object.get('fixed_ip_assignments')
+ if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
+ new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
+ self.new_object.get('reserved_ip_ranges')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -176,17 +176,17 @@ class DevicesSwitchRoutingInterfacesDhcp(object):
requested_obj = self.new_object
obj_params = [
+ ("bootFileName", "bootFileName"),
+ ("bootNextServer", "bootNextServer"),
+ ("bootOptionsEnabled", "bootOptionsEnabled"),
+ ("dhcpLeaseTime", "dhcpLeaseTime"),
("dhcpMode", "dhcpMode"),
+ ("dhcpOptions", "dhcpOptions"),
("dhcpRelayServerIps", "dhcpRelayServerIps"),
- ("dhcpLeaseTime", "dhcpLeaseTime"),
- ("dnsNameserversOption", "dnsNameserversOption"),
("dnsCustomNameservers", "dnsCustomNameservers"),
- ("bootOptionsEnabled", "bootOptionsEnabled"),
- ("bootNextServer", "bootNextServer"),
- ("bootFileName", "bootFileName"),
- ("dhcpOptions", "dhcpOptions"),
- ("reservedIpRanges", "reservedIpRanges"),
+ ("dnsNameserversOption", "dnsNameserversOption"),
("fixedIpAssignments", "fixedIpAssignments"),
+ ("reservedIpRanges", "reservedIpRanges"),
("serial", "serial"),
("interfaceId", "interfaceId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_routes.py b/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_routes.py
index e24a6e721..f146b8447 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_routes.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_switch_routing_static_routes.py
@@ -32,11 +32,11 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ advertiseViaOspfEnabled=dict(type="bool"),
name=dict(type="str"),
- subnet=dict(type="str"),
nextHopIp=dict(type="str"),
- advertiseViaOspfEnabled=dict(type="bool"),
preferOverOspfRoutesEnabled=dict(type="bool"),
+ subnet=dict(type="str"),
serial=dict(type="str"),
staticRouteId=dict(type="str"),
))
@@ -54,11 +54,11 @@ class DevicesSwitchRoutingStaticRoutes(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ advertiseViaOspfEnabled=params.get("advertiseViaOspfEnabled"),
name=params.get("name"),
- subnet=params.get("subnet"),
nextHopIp=params.get("nextHopIp"),
- advertiseViaOspfEnabled=params.get("advertiseViaOspfEnabled"),
preferOverOspfRoutesEnabled=params.get("preferOverOspfRoutesEnabled"),
+ subnet=params.get("subnet"),
serial=params.get("serial"),
staticRouteId=params.get("staticRouteId"),
)
@@ -80,19 +80,19 @@ class DevicesSwitchRoutingStaticRoutes(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
+ new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
if self.new_object.get('nextHopIp') is not None or self.new_object.get('next_hop_ip') is not None:
new_object_params['nextHopIp'] = self.new_object.get('nextHopIp') or \
self.new_object.get('next_hop_ip')
- if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
- new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('preferOverOspfRoutesEnabled') is not None or self.new_object.get('prefer_over_ospf_routes_enabled') is not None:
new_object_params['preferOverOspfRoutesEnabled'] = self.new_object.get('preferOverOspfRoutesEnabled')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -110,19 +110,19 @@ class DevicesSwitchRoutingStaticRoutes(object):
def update_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
+ new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
if self.new_object.get('nextHopIp') is not None or self.new_object.get('next_hop_ip') is not None:
new_object_params['nextHopIp'] = self.new_object.get('nextHopIp') or \
self.new_object.get('next_hop_ip')
- if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
- new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('preferOverOspfRoutesEnabled') is not None or self.new_object.get('prefer_over_ospf_routes_enabled') is not None:
new_object_params['preferOverOspfRoutesEnabled'] = self.new_object.get('preferOverOspfRoutesEnabled')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -200,11 +200,11 @@ class DevicesSwitchRoutingStaticRoutes(object):
requested_obj = self.new_object
obj_params = [
+ ("advertiseViaOspfEnabled", "advertiseViaOspfEnabled"),
("name", "name"),
- ("subnet", "subnet"),
("nextHopIp", "nextHopIp"),
- ("advertiseViaOspfEnabled", "advertiseViaOspfEnabled"),
("preferOverOspfRoutesEnabled", "preferOverOspfRoutesEnabled"),
+ ("subnet", "subnet"),
("serial", "serial"),
("staticRouteId", "staticRouteId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_wireless_alternate_management_interface_ipv6.py b/ansible_collections/cisco/meraki/plugins/action/devices_wireless_alternate_management_interface_ipv6.py
new file mode 100644
index 000000000..41447bb98
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_wireless_alternate_management_interface_ipv6.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ addresses=dict(type="list"),
+ serial=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ addresses=params.get("addresses"),
+ serial=params.get("serial"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='updateDeviceWirelessAlternateManagementInterfaceIpv6',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings.py b/ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings.py
index dd3712df6..f1f41d07c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_wireless_bluetooth_settings.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- uuid=dict(type="str"),
major=dict(type="int"),
minor=dict(type="int"),
+ uuid=dict(type="str"),
serial=dict(type="str"),
))
@@ -50,9 +50,9 @@ class DevicesWirelessBluetoothSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- uuid=params.get("uuid"),
major=params.get("major"),
minor=params.get("minor"),
+ uuid=params.get("uuid"),
serial=params.get("serial"),
)
@@ -64,15 +64,15 @@ class DevicesWirelessBluetoothSettings(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('uuid') is not None or self.new_object.get('uuid') is not None:
- new_object_params['uuid'] = self.new_object.get('uuid') or \
- self.new_object.get('uuid')
if self.new_object.get('major') is not None or self.new_object.get('major') is not None:
new_object_params['major'] = self.new_object.get('major') or \
self.new_object.get('major')
if self.new_object.get('minor') is not None or self.new_object.get('minor') is not None:
new_object_params['minor'] = self.new_object.get('minor') or \
self.new_object.get('minor')
+ if self.new_object.get('uuid') is not None or self.new_object.get('uuid') is not None:
+ new_object_params['uuid'] = self.new_object.get('uuid') or \
+ self.new_object.get('uuid')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -129,9 +129,9 @@ class DevicesWirelessBluetoothSettings(object):
requested_obj = self.new_object
obj_params = [
- ("uuid", "uuid"),
("major", "major"),
("minor", "minor"),
+ ("uuid", "uuid"),
("serial", "serial"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/devices_wireless_radio_settings.py b/ansible_collections/cisco/meraki/plugins/action/devices_wireless_radio_settings.py
index 72dad3f48..2fc35da7b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/devices_wireless_radio_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/devices_wireless_radio_settings.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ fiveGhzSettings=dict(type="dict"),
rfProfileId=dict(type="str"),
twoFourGhzSettings=dict(type="dict"),
- fiveGhzSettings=dict(type="dict"),
serial=dict(type="str"),
))
@@ -50,9 +50,9 @@ class DevicesWirelessRadioSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ fiveGhzSettings=params.get("fiveGhzSettings"),
rfProfileId=params.get("rfProfileId"),
twoFourGhzSettings=params.get("twoFourGhzSettings"),
- fiveGhzSettings=params.get("fiveGhzSettings"),
serial=params.get("serial"),
)
@@ -64,15 +64,15 @@ class DevicesWirelessRadioSettings(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('fiveGhzSettings') is not None or self.new_object.get('five_ghz_settings') is not None:
+ new_object_params['fiveGhzSettings'] = self.new_object.get('fiveGhzSettings') or \
+ self.new_object.get('five_ghz_settings')
if self.new_object.get('rfProfileId') is not None or self.new_object.get('rf_profile_id') is not None:
new_object_params['rfProfileId'] = self.new_object.get('rfProfileId') or \
self.new_object.get('rf_profile_id')
if self.new_object.get('twoFourGhzSettings') is not None or self.new_object.get('two_four_ghz_settings') is not None:
new_object_params['twoFourGhzSettings'] = self.new_object.get('twoFourGhzSettings') or \
self.new_object.get('two_four_ghz_settings')
- if self.new_object.get('fiveGhzSettings') is not None or self.new_object.get('five_ghz_settings') is not None:
- new_object_params['fiveGhzSettings'] = self.new_object.get('fiveGhzSettings') or \
- self.new_object.get('five_ghz_settings')
if self.new_object.get('serial') is not None or self.new_object.get('serial') is not None:
new_object_params['serial'] = self.new_object.get('serial') or \
self.new_object.get('serial')
@@ -129,9 +129,9 @@ class DevicesWirelessRadioSettings(object):
requested_obj = self.new_object
obj_params = [
+ ("fiveGhzSettings", "fiveGhzSettings"),
("rfProfileId", "rfProfileId"),
("twoFourGhzSettings", "twoFourGhzSettings"),
- ("fiveGhzSettings", "fiveGhzSettings"),
("serial", "serial"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks.py b/ansible_collections/cisco/meraki/plugins/action/networks.py
index 378b0bc0d..17904b9f8 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks.py
@@ -32,12 +32,12 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ copyFromNetworkId=dict(type="str"),
name=dict(type="str"),
+ notes=dict(type="str"),
productTypes=dict(type="list"),
tags=dict(type="list"),
timeZone=dict(type="str"),
- copyFromNetworkId=dict(type="str"),
- notes=dict(type="str"),
organizationId=dict(type="str"),
networkId=dict(type="str"),
enrollmentString=dict(type="str"),
@@ -56,12 +56,12 @@ class Networks(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ copyFromNetworkId=params.get("copyFromNetworkId"),
name=params.get("name"),
+ notes=params.get("notes"),
productTypes=params.get("productTypes"),
tags=params.get("tags"),
timeZone=params.get("timeZone"),
- copyFromNetworkId=params.get("copyFromNetworkId"),
- notes=params.get("notes"),
organizationId=params.get("organizationId"),
networkId=params.get("networkId"),
enrollmentString=params.get("enrollmentString"),
@@ -104,9 +104,15 @@ class Networks(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('copyFromNetworkId') is not None or self.new_object.get('copy_from_network_id') is not None:
+ new_object_params['copyFromNetworkId'] = self.new_object.get('copyFromNetworkId') or \
+ self.new_object.get('copy_from_network_id')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
+ if self.new_object.get('notes') is not None or self.new_object.get('notes') is not None:
+ new_object_params['notes'] = self.new_object.get('notes') or \
+ self.new_object.get('notes')
if self.new_object.get('productTypes') is not None or self.new_object.get('product_types') is not None:
new_object_params['productTypes'] = self.new_object.get('productTypes') or \
self.new_object.get('product_types')
@@ -116,12 +122,6 @@ class Networks(object):
if self.new_object.get('timeZone') is not None or self.new_object.get('time_zone') is not None:
new_object_params['timeZone'] = self.new_object.get('timeZone') or \
self.new_object.get('time_zone')
- if self.new_object.get('copyFromNetworkId') is not None or self.new_object.get('copy_from_network_id') is not None:
- new_object_params['copyFromNetworkId'] = self.new_object.get('copyFromNetworkId') or \
- self.new_object.get('copy_from_network_id')
- if self.new_object.get('notes') is not None or self.new_object.get('notes') is not None:
- new_object_params['notes'] = self.new_object.get('notes') or \
- self.new_object.get('notes')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -136,24 +136,21 @@ class Networks(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('timeZone') is not None or self.new_object.get('time_zone') is not None:
- new_object_params['timeZone'] = self.new_object.get('timeZone') or \
- self.new_object.get('time_zone')
- if self.new_object.get('productTypes') is not None or self.new_object.get('product_types') is not None:
- new_object_params['productTypes'] = self.new_object.get('productTypes') or \
- self.new_object.get('product_types')
- if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
- new_object_params['tags'] = self.new_object.get('tags') or \
- self.new_object.get('tags')
if self.new_object.get('enrollmentString') is not None or self.new_object.get('enrollment_string') is not None:
new_object_params['enrollmentString'] = self.new_object.get('enrollmentString') or \
self.new_object.get('enrollment_string')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('notes') is not None or self.new_object.get('notes') is not None:
new_object_params['notes'] = self.new_object.get('notes') or \
self.new_object.get('notes')
+ if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
+ new_object_params['tags'] = self.new_object.get('tags') or \
+ self.new_object.get('tags')
+ if self.new_object.get('timeZone') is not None or self.new_object.get('time_zone') is not None:
+ new_object_params['timeZone'] = self.new_object.get('timeZone') or \
+ self.new_object.get('time_zone')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -228,12 +225,12 @@ class Networks(object):
requested_obj = self.new_object
obj_params = [
+ ("copyFromNetworkId", "copyFromNetworkId"),
("name", "name"),
+ ("notes", "notes"),
("productTypes", "productTypes"),
("tags", "tags"),
("timeZone", "timeZone"),
- ("copyFromNetworkId", "copyFromNetworkId"),
- ("notes", "notes"),
("organizationId", "organizationId"),
("networkId", "networkId"),
("enrollmentString", "enrollmentString"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_alerts_settings.py b/ansible_collections/cisco/meraki/plugins/action/networks_alerts_settings.py
index 9389b5db1..6d0da8e32 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_alerts_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_alerts_settings.py
@@ -32,8 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- defaultDestinations=dict(type="dict"),
alerts=dict(type="list"),
+ defaultDestinations=dict(type="dict"),
+ muting=dict(type="dict"),
networkId=dict(type="str"),
))
@@ -49,8 +50,9 @@ class NetworksAlertsSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- defaultDestinations=params.get("defaultDestinations"),
alerts=params.get("alerts"),
+ defaultDestinations=params.get("defaultDestinations"),
+ muting=params.get("muting"),
network_id=params.get("networkId"),
)
@@ -63,12 +65,15 @@ class NetworksAlertsSettings(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('defaultDestinations') is not None or self.new_object.get('default_destinations') is not None:
- new_object_params['defaultDestinations'] = self.new_object.get('defaultDestinations') or \
- self.new_object.get('default_destinations')
if self.new_object.get('alerts') is not None or self.new_object.get('alerts') is not None:
new_object_params['alerts'] = self.new_object.get('alerts') or \
self.new_object.get('alerts')
+ if self.new_object.get('defaultDestinations') is not None or self.new_object.get('default_destinations') is not None:
+ new_object_params['defaultDestinations'] = self.new_object.get('defaultDestinations') or \
+ self.new_object.get('default_destinations')
+ if self.new_object.get('muting') is not None or self.new_object.get('muting') is not None:
+ new_object_params['muting'] = self.new_object.get('muting') or \
+ self.new_object.get('muting')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -125,8 +130,9 @@ class NetworksAlertsSettings(object):
requested_obj = self.new_object
obj_params = [
- ("defaultDestinations", "defaultDestinations"),
("alerts", "alerts"),
+ ("defaultDestinations", "defaultDestinations"),
+ ("muting", "muting"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_content_filtering.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_content_filtering.py
index 5cad13ae6..3f1144ee3 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_content_filtering.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_content_filtering.py
@@ -33,8 +33,8 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
allowedUrlPatterns=dict(type="list"),
- blockedUrlPatterns=dict(type="list"),
blockedUrlCategories=dict(type="list"),
+ blockedUrlPatterns=dict(type="list"),
urlCategoryListSize=dict(type="str"),
networkId=dict(type="str"),
))
@@ -52,8 +52,8 @@ class NetworksApplianceContentFiltering(object):
self.meraki = meraki
self.new_object = dict(
allowedUrlPatterns=params.get("allowedUrlPatterns"),
- blockedUrlPatterns=params.get("blockedUrlPatterns"),
blockedUrlCategories=params.get("blockedUrlCategories"),
+ blockedUrlPatterns=params.get("blockedUrlPatterns"),
urlCategoryListSize=params.get("urlCategoryListSize"),
network_id=params.get("networkId"),
)
@@ -70,12 +70,12 @@ class NetworksApplianceContentFiltering(object):
if self.new_object.get('allowedUrlPatterns') is not None or self.new_object.get('allowed_url_patterns') is not None:
new_object_params['allowedUrlPatterns'] = self.new_object.get('allowedUrlPatterns') or \
self.new_object.get('allowed_url_patterns')
- if self.new_object.get('blockedUrlPatterns') is not None or self.new_object.get('blocked_url_patterns') is not None:
- new_object_params['blockedUrlPatterns'] = self.new_object.get('blockedUrlPatterns') or \
- self.new_object.get('blocked_url_patterns')
if self.new_object.get('blockedUrlCategories') is not None or self.new_object.get('blocked_url_categories') is not None:
new_object_params['blockedUrlCategories'] = self.new_object.get('blockedUrlCategories') or \
self.new_object.get('blocked_url_categories')
+ if self.new_object.get('blockedUrlPatterns') is not None or self.new_object.get('blocked_url_patterns') is not None:
+ new_object_params['blockedUrlPatterns'] = self.new_object.get('blockedUrlPatterns') or \
+ self.new_object.get('blocked_url_patterns')
if self.new_object.get('urlCategoryListSize') is not None or self.new_object.get('url_category_list_size') is not None:
new_object_params['urlCategoryListSize'] = self.new_object.get('urlCategoryListSize') or \
self.new_object.get('url_category_list_size')
@@ -136,8 +136,8 @@ class NetworksApplianceContentFiltering(object):
obj_params = [
("allowedUrlPatterns", "allowedUrlPatterns"),
- ("blockedUrlPatterns", "blockedUrlPatterns"),
("blockedUrlCategories", "blockedUrlCategories"),
+ ("blockedUrlPatterns", "blockedUrlPatterns"),
("urlCategoryListSize", "urlCategoryListSize"),
("networkId", "networkId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports.py
index 1c57e3fb3..c6a4ddbfb 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ports.py
@@ -32,12 +32,12 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- enabled=dict(type="bool"),
+ accessPolicy=dict(type="str"),
+ allowedVlans=dict(type="str"),
dropUntaggedTraffic=dict(type="bool"),
+ enabled=dict(type="bool"),
type=dict(type="str"),
vlan=dict(type="int"),
- allowedVlans=dict(type="str"),
- accessPolicy=dict(type="str"),
networkId=dict(type="str"),
portId=dict(type="str"),
))
@@ -54,12 +54,12 @@ class NetworksAppliancePorts(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- enabled=params.get("enabled"),
+ accessPolicy=params.get("accessPolicy"),
+ allowedVlans=params.get("allowedVlans"),
dropUntaggedTraffic=params.get("dropUntaggedTraffic"),
+ enabled=params.get("enabled"),
type=params.get("type"),
vlan=params.get("vlan"),
- allowedVlans=params.get("allowedVlans"),
- accessPolicy=params.get("accessPolicy"),
network_id=params.get("networkId"),
port_id=params.get("portId"),
)
@@ -83,22 +83,22 @@ class NetworksAppliancePorts(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('accessPolicy') is not None or self.new_object.get('access_policy') is not None:
+ new_object_params['accessPolicy'] = self.new_object.get('accessPolicy') or \
+ self.new_object.get('access_policy')
+ if self.new_object.get('allowedVlans') is not None or self.new_object.get('allowed_vlans') is not None:
+ new_object_params['allowedVlans'] = self.new_object.get('allowedVlans') or \
+ self.new_object.get('allowed_vlans')
if self.new_object.get('dropUntaggedTraffic') is not None or self.new_object.get('drop_untagged_traffic') is not None:
new_object_params['dropUntaggedTraffic'] = self.new_object.get('dropUntaggedTraffic')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
new_object_params['type'] = self.new_object.get('type') or \
self.new_object.get('type')
if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
new_object_params['vlan'] = self.new_object.get('vlan') or \
self.new_object.get('vlan')
- if self.new_object.get('allowedVlans') is not None or self.new_object.get('allowed_vlans') is not None:
- new_object_params['allowedVlans'] = self.new_object.get('allowedVlans') or \
- self.new_object.get('allowed_vlans')
- if self.new_object.get('accessPolicy') is not None or self.new_object.get('access_policy') is not None:
- new_object_params['accessPolicy'] = self.new_object.get('accessPolicy') or \
- self.new_object.get('access_policy')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -176,12 +176,12 @@ class NetworksAppliancePorts(object):
requested_obj = self.new_object
obj_params = [
- ("enabled", "enabled"),
+ ("accessPolicy", "accessPolicy"),
+ ("allowedVlans", "allowedVlans"),
("dropUntaggedTraffic", "dropUntaggedTraffic"),
+ ("enabled", "enabled"),
("type", "type"),
("vlan", "vlan"),
- ("allowedVlans", "allowedVlans"),
- ("accessPolicy", "accessPolicy"),
("networkId", "networkId"),
("portId", "portId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics.py
index 0297ff01e..f0fdfec7c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_prefixes_delegated_statics.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- prefix=dict(type="str"),
- origin=dict(type="dict"),
description=dict(type="str"),
+ origin=dict(type="dict"),
+ prefix=dict(type="str"),
networkId=dict(type="str"),
staticDelegatedPrefixId=dict(type="str"),
))
@@ -52,9 +52,9 @@ class NetworksAppliancePrefixesDelegatedStatics(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- prefix=params.get("prefix"),
- origin=params.get("origin"),
description=params.get("description"),
+ origin=params.get("origin"),
+ prefix=params.get("prefix"),
networkId=params.get("networkId"),
staticDelegatedPrefixId=params.get("staticDelegatedPrefixId"),
)
@@ -78,15 +78,15 @@ class NetworksAppliancePrefixesDelegatedStatics(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('prefix') is not None or self.new_object.get('prefix') is not None:
- new_object_params['prefix'] = self.new_object.get('prefix') or \
- self.new_object.get('prefix')
- if self.new_object.get('origin') is not None or self.new_object.get('origin') is not None:
- new_object_params['origin'] = self.new_object.get('origin') or \
- self.new_object.get('origin')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
+ if self.new_object.get('origin') is not None or self.new_object.get('origin') is not None:
+ new_object_params['origin'] = self.new_object.get('origin') or \
+ self.new_object.get('origin')
+ if self.new_object.get('prefix') is not None or self.new_object.get('prefix') is not None:
+ new_object_params['prefix'] = self.new_object.get('prefix') or \
+ self.new_object.get('prefix')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -104,15 +104,15 @@ class NetworksAppliancePrefixesDelegatedStatics(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('prefix') is not None or self.new_object.get('prefix') is not None:
- new_object_params['prefix'] = self.new_object.get('prefix') or \
- self.new_object.get('prefix')
- if self.new_object.get('origin') is not None or self.new_object.get('origin') is not None:
- new_object_params['origin'] = self.new_object.get('origin') or \
- self.new_object.get('origin')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
+ if self.new_object.get('origin') is not None or self.new_object.get('origin') is not None:
+ new_object_params['origin'] = self.new_object.get('origin') or \
+ self.new_object.get('origin')
+ if self.new_object.get('prefix') is not None or self.new_object.get('prefix') is not None:
+ new_object_params['prefix'] = self.new_object.get('prefix') or \
+ self.new_object.get('prefix')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -190,9 +190,9 @@ class NetworksAppliancePrefixesDelegatedStatics(object):
requested_obj = self.new_object
obj_params = [
- ("prefix", "prefix"),
- ("origin", "origin"),
("description", "description"),
+ ("origin", "origin"),
+ ("prefix", "prefix"),
("networkId", "networkId"),
("staticDelegatedPrefixId", "staticDelegatedPrefixId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles.py
new file mode 100644
index 000000000..88a31b2d1
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles.py
@@ -0,0 +1,252 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+ get_dict_result,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present", "absent"]),
+ fiveGhzSettings=dict(type="dict"),
+ name=dict(type="str"),
+ perSsidSettings=dict(type="dict"),
+ twoFourGhzSettings=dict(type="dict"),
+ networkId=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["name", "networkId"], True),
+ ("state", "absent", ["name", "networkId"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class NetworksApplianceRfProfiles(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ fiveGhzSettings=params.get("fiveGhzSettings"),
+ name=params.get("name"),
+ perSsidSettings=params.get("perSsidSettings"),
+ twoFourGhzSettings=params.get("twoFourGhzSettings"),
+ networkId=params.get("networkId"),
+ )
+
+ def get_all_params(self, name=None, id=None):
+ new_object_params = {}
+ if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
+ new_object_params['networkId'] = self.new_object.get('networkId') or \
+ self.new_object.get('network_id')
+ return new_object_params
+
+ def create_params(self):
+ new_object_params = {}
+ if self.new_object.get('fiveGhzSettings') is not None or self.new_object.get('five_ghz_settings') is not None:
+ new_object_params['fiveGhzSettings'] = self.new_object.get('fiveGhzSettings') or \
+ self.new_object.get('five_ghz_settings')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('perSsidSettings') is not None or self.new_object.get('per_ssid_settings') is not None:
+ new_object_params['perSsidSettings'] = self.new_object.get('perSsidSettings') or \
+ self.new_object.get('per_ssid_settings')
+ if self.new_object.get('twoFourGhzSettings') is not None or self.new_object.get('two_four_ghz_settings') is not None:
+ new_object_params['twoFourGhzSettings'] = self.new_object.get('twoFourGhzSettings') or \
+ self.new_object.get('two_four_ghz_settings')
+ if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
+ new_object_params['networkId'] = self.new_object.get('networkId') or \
+ self.new_object.get('network_id')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name method or it is in another action
+ try:
+ items = self.meraki.exec_meraki(
+ family="appliance",
+ function="getNetworkApplianceRfProfiles",
+ params=self.get_all_params(name=name),
+ )
+ if isinstance(items, dict):
+ if 'assigned' in items:
+ items = items.get('assigned')
+ result = get_dict_result(items, 'name', name)
+ if result is None:
+ result = items
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ try:
+ items = self.meraki.exec_meraki(
+ family="appliance",
+ function="getNetworkApplianceRfProfiles",
+ params=self.get_all_params(id=id),
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = get_dict_result(items, 'id', id)
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def exists(self):
+ id_exists = False
+ name_exists = False
+ prev_obj = None
+ o_id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_id(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("fiveGhzSettings", "fiveGhzSettings"),
+ ("name", "name"),
+ ("perSsidSettings", "perSsidSettings"),
+ ("twoFourGhzSettings", "twoFourGhzSettings"),
+ ("networkId", "networkId"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (DNAC) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def create(self):
+ result = self.meraki.exec_meraki(
+ family="appliance",
+ function="createNetworkApplianceRfProfile",
+ params=self.create_params(),
+ op_modifies=True,
+ )
+ return result
+
+ def update(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ result = None
+ # NOTE: Does not have update method. What do we do?
+ return result
+
+ def delete(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ result = None
+ # NOTE: Does not have delete method. What do we do?
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = NetworksApplianceRfProfiles(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = obj.update()
+ meraki.object_updated()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ response = obj.create()
+ meraki.object_created()
+
+ elif state == "absent":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ response = obj.delete()
+ meraki.object_deleted()
+ else:
+ meraki.object_already_absent()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles_info.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles_info.py
new file mode 100644
index 000000000..863571233
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_rf_profiles_info.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ networkId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("networkId") is not None:
+ new_object["networkId"] = params.get(
+ "networkId")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="appliance",
+ function='getNetworkApplianceRfProfiles',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion.py
index 3449abf9c..6da952d48 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_intrusion.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- mode=dict(type="str"),
idsRulesets=dict(type="str"),
+ mode=dict(type="str"),
protectedNetworks=dict(type="dict"),
networkId=dict(type="str"),
))
@@ -50,8 +50,8 @@ class NetworksApplianceSecurityIntrusion(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- mode=params.get("mode"),
idsRulesets=params.get("idsRulesets"),
+ mode=params.get("mode"),
protectedNetworks=params.get("protectedNetworks"),
network_id=params.get("networkId"),
)
@@ -65,12 +65,12 @@ class NetworksApplianceSecurityIntrusion(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
- new_object_params['mode'] = self.new_object.get('mode') or \
- self.new_object.get('mode')
if self.new_object.get('idsRulesets') is not None or self.new_object.get('ids_rulesets') is not None:
new_object_params['idsRulesets'] = self.new_object.get('idsRulesets') or \
self.new_object.get('ids_rulesets')
+ if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
+ new_object_params['mode'] = self.new_object.get('mode') or \
+ self.new_object.get('mode')
if self.new_object.get('protectedNetworks') is not None or self.new_object.get('protected_networks') is not None:
new_object_params['protectedNetworks'] = self.new_object.get('protectedNetworks') or \
self.new_object.get('protected_networks')
@@ -130,8 +130,8 @@ class NetworksApplianceSecurityIntrusion(object):
requested_obj = self.new_object
obj_params = [
- ("mode", "mode"),
("idsRulesets", "idsRulesets"),
+ ("mode", "mode"),
("protectedNetworks", "protectedNetworks"),
("networkId", "networkId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_malware.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_malware.py
index 904889494..faef0ed12 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_malware.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_security_malware.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- mode=dict(type="str"),
- allowedUrls=dict(type="list"),
allowedFiles=dict(type="list"),
+ allowedUrls=dict(type="list"),
+ mode=dict(type="str"),
networkId=dict(type="str"),
))
@@ -50,9 +50,9 @@ class NetworksApplianceSecurityMalware(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- mode=params.get("mode"),
- allowedUrls=params.get("allowedUrls"),
allowedFiles=params.get("allowedFiles"),
+ allowedUrls=params.get("allowedUrls"),
+ mode=params.get("mode"),
network_id=params.get("networkId"),
)
@@ -65,15 +65,15 @@ class NetworksApplianceSecurityMalware(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
- new_object_params['mode'] = self.new_object.get('mode') or \
- self.new_object.get('mode')
- if self.new_object.get('allowedUrls') is not None or self.new_object.get('allowed_urls') is not None:
- new_object_params['allowedUrls'] = self.new_object.get('allowedUrls') or \
- self.new_object.get('allowed_urls')
if self.new_object.get('allowedFiles') is not None or self.new_object.get('allowed_files') is not None:
new_object_params['allowedFiles'] = self.new_object.get('allowedFiles') or \
self.new_object.get('allowed_files')
+ if self.new_object.get('allowedUrls') is not None or self.new_object.get('allowed_urls') is not None:
+ new_object_params['allowedUrls'] = self.new_object.get('allowedUrls') or \
+ self.new_object.get('allowed_urls')
+ if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
+ new_object_params['mode'] = self.new_object.get('mode') or \
+ self.new_object.get('mode')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -130,9 +130,9 @@ class NetworksApplianceSecurityMalware(object):
requested_obj = self.new_object
obj_params = [
- ("mode", "mode"),
- ("allowedUrls", "allowedUrls"),
("allowedFiles", "allowedFiles"),
+ ("allowedUrls", "allowedUrls"),
+ ("mode", "mode"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_single_lan.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_single_lan.py
index fd8219403..4254f631f 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_single_lan.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_single_lan.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- subnet=dict(type="str"),
applianceIp=dict(type="str"),
ipv6=dict(type="dict"),
mandatoryDhcp=dict(type="dict"),
+ subnet=dict(type="str"),
networkId=dict(type="str"),
))
@@ -51,10 +51,10 @@ class NetworksApplianceSingleLan(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- subnet=params.get("subnet"),
applianceIp=params.get("applianceIp"),
ipv6=params.get("ipv6"),
mandatoryDhcp=params.get("mandatoryDhcp"),
+ subnet=params.get("subnet"),
network_id=params.get("networkId"),
)
@@ -67,9 +67,6 @@ class NetworksApplianceSingleLan(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
if self.new_object.get('applianceIp') is not None or self.new_object.get('appliance_ip') is not None:
new_object_params['applianceIp'] = self.new_object.get('applianceIp') or \
self.new_object.get('appliance_ip')
@@ -79,6 +76,9 @@ class NetworksApplianceSingleLan(object):
if self.new_object.get('mandatoryDhcp') is not None or self.new_object.get('mandatory_dhcp') is not None:
new_object_params['mandatoryDhcp'] = self.new_object.get('mandatoryDhcp') or \
self.new_object.get('mandatory_dhcp')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -135,10 +135,10 @@ class NetworksApplianceSingleLan(object):
requested_obj = self.new_object
obj_params = [
- ("subnet", "subnet"),
("applianceIp", "applianceIp"),
("ipv6", "ipv6"),
("mandatoryDhcp", "mandatoryDhcp"),
+ ("subnet", "subnet"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ssids.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ssids.py
index cfe172d5a..364855692 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ssids.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_ssids.py
@@ -32,16 +32,17 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- name=dict(type="str"),
- enabled=dict(type="bool"),
- defaultVlanId=dict(type="int"),
authMode=dict(type="str"),
+ defaultVlanId=dict(type="int"),
+ dhcpEnforcedDeauthentication=dict(type="dict"),
+ dot11w=dict(type="dict"),
+ enabled=dict(type="bool"),
+ encryptionMode=dict(type="str"),
+ name=dict(type="str"),
psk=dict(type="str"),
radiusServers=dict(type="list"),
- encryptionMode=dict(type="str"),
- wpaEncryptionMode=dict(type="str"),
visible=dict(type="bool"),
- dhcpEnforcedDeauthentication=dict(type="dict"),
+ wpaEncryptionMode=dict(type="str"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -58,16 +59,17 @@ class NetworksApplianceSsids(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- enabled=params.get("enabled"),
- defaultVlanId=params.get("defaultVlanId"),
authMode=params.get("authMode"),
+ defaultVlanId=params.get("defaultVlanId"),
+ dhcpEnforcedDeauthentication=params.get("dhcpEnforcedDeauthentication"),
+ dot11w=params.get("dot11w"),
+ enabled=params.get("enabled"),
+ encryptionMode=params.get("encryptionMode"),
+ name=params.get("name"),
psk=params.get("psk"),
radiusServers=params.get("radiusServers"),
- encryptionMode=params.get("encryptionMode"),
- wpaEncryptionMode=params.get("wpaEncryptionMode"),
visible=params.get("visible"),
- dhcpEnforcedDeauthentication=params.get("dhcpEnforcedDeauthentication"),
+ wpaEncryptionMode=params.get("wpaEncryptionMode"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -90,34 +92,37 @@ class NetworksApplianceSsids(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
- if self.new_object.get('defaultVlanId') is not None or self.new_object.get('default_vlan_id') is not None:
- new_object_params['defaultVlanId'] = self.new_object.get('defaultVlanId') or \
- self.new_object.get('default_vlan_id')
if self.new_object.get('authMode') is not None or self.new_object.get('auth_mode') is not None:
new_object_params['authMode'] = self.new_object.get('authMode') or \
self.new_object.get('auth_mode')
+ if self.new_object.get('defaultVlanId') is not None or self.new_object.get('default_vlan_id') is not None:
+ new_object_params['defaultVlanId'] = self.new_object.get('defaultVlanId') or \
+ self.new_object.get('default_vlan_id')
+ if self.new_object.get('dhcpEnforcedDeauthentication') is not None or self.new_object.get('dhcp_enforced_deauthentication') is not None:
+ new_object_params['dhcpEnforcedDeauthentication'] = self.new_object.get('dhcpEnforcedDeauthentication') or \
+ self.new_object.get('dhcp_enforced_deauthentication')
+ if self.new_object.get('dot11w') is not None or self.new_object.get('dot11w') is not None:
+ new_object_params['dot11w'] = self.new_object.get('dot11w') or \
+ self.new_object.get('dot11w')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('encryptionMode') is not None or self.new_object.get('encryption_mode') is not None:
+ new_object_params['encryptionMode'] = self.new_object.get('encryptionMode') or \
+ self.new_object.get('encryption_mode')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('psk') is not None or self.new_object.get('psk') is not None:
new_object_params['psk'] = self.new_object.get('psk') or \
self.new_object.get('psk')
if self.new_object.get('radiusServers') is not None or self.new_object.get('radius_servers') is not None:
new_object_params['radiusServers'] = self.new_object.get('radiusServers') or \
self.new_object.get('radius_servers')
- if self.new_object.get('encryptionMode') is not None or self.new_object.get('encryption_mode') is not None:
- new_object_params['encryptionMode'] = self.new_object.get('encryptionMode') or \
- self.new_object.get('encryption_mode')
+ if self.new_object.get('visible') is not None or self.new_object.get('visible') is not None:
+ new_object_params['visible'] = self.new_object.get('visible')
if self.new_object.get('wpaEncryptionMode') is not None or self.new_object.get('wpa_encryption_mode') is not None:
new_object_params['wpaEncryptionMode'] = self.new_object.get('wpaEncryptionMode') or \
self.new_object.get('wpa_encryption_mode')
- if self.new_object.get('visible') is not None or self.new_object.get('visible') is not None:
- new_object_params['visible'] = self.new_object.get('visible')
- if self.new_object.get('dhcpEnforcedDeauthentication') is not None or self.new_object.get('dhcp_enforced_deauthentication') is not None:
- new_object_params['dhcpEnforcedDeauthentication'] = self.new_object.get('dhcpEnforcedDeauthentication') or \
- self.new_object.get('dhcp_enforced_deauthentication')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -195,16 +200,17 @@ class NetworksApplianceSsids(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("enabled", "enabled"),
- ("defaultVlanId", "defaultVlanId"),
("authMode", "authMode"),
+ ("defaultVlanId", "defaultVlanId"),
+ ("dhcpEnforcedDeauthentication", "dhcpEnforcedDeauthentication"),
+ ("dot11w", "dot11w"),
+ ("enabled", "enabled"),
+ ("encryptionMode", "encryptionMode"),
+ ("name", "name"),
("psk", "psk"),
("radiusServers", "radiusServers"),
- ("encryptionMode", "encryptionMode"),
- ("wpaEncryptionMode", "wpaEncryptionMode"),
("visible", "visible"),
- ("dhcpEnforcedDeauthentication", "dhcpEnforcedDeauthentication"),
+ ("wpaEncryptionMode", "wpaEncryptionMode"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_custom_performance_classes.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_custom_performance_classes.py
index 4331bc9b2..dd072c4c8 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_custom_performance_classes.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_custom_performance_classes.py
@@ -25,10 +25,10 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- name=dict(type="str"),
- maxLatency=dict(type="int"),
maxJitter=dict(type="int"),
+ maxLatency=dict(type="int"),
maxLossPercentage=dict(type="int"),
+ name=dict(type="str"),
networkId=dict(type="str"),
))
@@ -68,10 +68,10 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- name=params.get("name"),
- maxLatency=params.get("maxLatency"),
maxJitter=params.get("maxJitter"),
+ maxLatency=params.get("maxLatency"),
maxLossPercentage=params.get("maxLossPercentage"),
+ name=params.get("name"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection.py
index 79b737a1e..525ba5f77 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_uplink_selection.py
@@ -34,10 +34,10 @@ argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
activeActiveAutoVpnEnabled=dict(type="bool"),
defaultUplink=dict(type="str"),
- loadBalancingEnabled=dict(type="bool"),
failoverAndFailback=dict(type="dict"),
- wanTrafficUplinkPreferences=dict(type="list"),
+ loadBalancingEnabled=dict(type="bool"),
vpnTrafficUplinkPreferences=dict(type="list"),
+ wanTrafficUplinkPreferences=dict(type="list"),
networkId=dict(type="str"),
))
@@ -55,10 +55,10 @@ class NetworksApplianceTrafficShapingUplinkSelection(object):
self.new_object = dict(
activeActiveAutoVpnEnabled=params.get("activeActiveAutoVpnEnabled"),
defaultUplink=params.get("defaultUplink"),
- loadBalancingEnabled=params.get("loadBalancingEnabled"),
failoverAndFailback=params.get("failoverAndFailback"),
- wanTrafficUplinkPreferences=params.get("wanTrafficUplinkPreferences"),
+ loadBalancingEnabled=params.get("loadBalancingEnabled"),
vpnTrafficUplinkPreferences=params.get("vpnTrafficUplinkPreferences"),
+ wanTrafficUplinkPreferences=params.get("wanTrafficUplinkPreferences"),
network_id=params.get("networkId"),
)
@@ -76,17 +76,17 @@ class NetworksApplianceTrafficShapingUplinkSelection(object):
if self.new_object.get('defaultUplink') is not None or self.new_object.get('default_uplink') is not None:
new_object_params['defaultUplink'] = self.new_object.get('defaultUplink') or \
self.new_object.get('default_uplink')
- if self.new_object.get('loadBalancingEnabled') is not None or self.new_object.get('load_balancing_enabled') is not None:
- new_object_params['loadBalancingEnabled'] = self.new_object.get('loadBalancingEnabled')
if self.new_object.get('failoverAndFailback') is not None or self.new_object.get('failover_and_failback') is not None:
new_object_params['failoverAndFailback'] = self.new_object.get('failoverAndFailback') or \
self.new_object.get('failover_and_failback')
- if self.new_object.get('wanTrafficUplinkPreferences') is not None or self.new_object.get('wan_traffic_uplink_preferences') is not None:
- new_object_params['wanTrafficUplinkPreferences'] = self.new_object.get('wanTrafficUplinkPreferences') or \
- self.new_object.get('wan_traffic_uplink_preferences')
+ if self.new_object.get('loadBalancingEnabled') is not None or self.new_object.get('load_balancing_enabled') is not None:
+ new_object_params['loadBalancingEnabled'] = self.new_object.get('loadBalancingEnabled')
if self.new_object.get('vpnTrafficUplinkPreferences') is not None or self.new_object.get('vpn_traffic_uplink_preferences') is not None:
new_object_params['vpnTrafficUplinkPreferences'] = self.new_object.get('vpnTrafficUplinkPreferences') or \
self.new_object.get('vpn_traffic_uplink_preferences')
+ if self.new_object.get('wanTrafficUplinkPreferences') is not None or self.new_object.get('wan_traffic_uplink_preferences') is not None:
+ new_object_params['wanTrafficUplinkPreferences'] = self.new_object.get('wanTrafficUplinkPreferences') or \
+ self.new_object.get('wan_traffic_uplink_preferences')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -145,10 +145,10 @@ class NetworksApplianceTrafficShapingUplinkSelection(object):
obj_params = [
("activeActiveAutoVpnEnabled", "activeActiveAutoVpnEnabled"),
("defaultUplink", "defaultUplink"),
- ("loadBalancingEnabled", "loadBalancingEnabled"),
("failoverAndFailback", "failoverAndFailback"),
- ("wanTrafficUplinkPreferences", "wanTrafficUplinkPreferences"),
+ ("loadBalancingEnabled", "loadBalancingEnabled"),
("vpnTrafficUplinkPreferences", "vpnTrafficUplinkPreferences"),
+ ("wanTrafficUplinkPreferences", "wanTrafficUplinkPreferences"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_vpn_exclusions.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_vpn_exclusions.py
new file mode 100644
index 000000000..447231a08
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_traffic_shaping_vpn_exclusions.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ custom=dict(type="list"),
+ majorApplications=dict(type="list"),
+ networkId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ custom=params.get("custom"),
+ majorApplications=params.get("majorApplications"),
+ networkId=params.get("networkId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="appliance",
+ function='updateNetworkApplianceTrafficShapingVpnExclusions',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans.py
index ba4835a9d..48ebdb4ca 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vlans.py
@@ -32,29 +32,29 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- id=dict(type="str"),
- name=dict(type="str"),
- subnet=dict(type="str"),
applianceIp=dict(type="str"),
- groupPolicyId=dict(type="str"),
- templateVlanType=dict(type="str"),
cidr=dict(type="str"),
- mask=dict(type="int"),
+ groupPolicyId=dict(type="str"),
+ id=dict(type="str"),
ipv6=dict(type="dict"),
mandatoryDhcp=dict(type="dict"),
+ mask=dict(type="int"),
+ name=dict(type="str"),
+ subnet=dict(type="str"),
+ templateVlanType=dict(type="str"),
networkId=dict(type="str"),
vlanId=dict(type="str"),
- vpnNatSubnet=dict(type="str"),
+ dhcpBootFilename=dict(type="str"),
+ dhcpBootNextServer=dict(type="str"),
+ dhcpBootOptionsEnabled=dict(type="bool"),
dhcpHandling=dict(type="str"),
- dhcpRelayServerIps=dict(type="list"),
dhcpLeaseTime=dict(type="str"),
- dhcpBootOptionsEnabled=dict(type="bool"),
- dhcpBootNextServer=dict(type="str"),
- dhcpBootFilename=dict(type="str"),
+ dhcpOptions=dict(type="list"),
+ dhcpRelayServerIps=dict(type="list"),
+ dnsNameservers=dict(type="str"),
fixedIpAssignments=dict(type="dict"),
reservedIpRanges=dict(type="list"),
- dnsNameservers=dict(type="str"),
- dhcpOptions=dict(type="list"),
+ vpnNatSubnet=dict(type="str"),
))
required_if = [
@@ -70,29 +70,29 @@ class NetworksApplianceVlans(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- id=params.get("id"),
- name=params.get("name"),
- subnet=params.get("subnet"),
applianceIp=params.get("applianceIp"),
- groupPolicyId=params.get("groupPolicyId"),
- templateVlanType=params.get("templateVlanType"),
cidr=params.get("cidr"),
- mask=params.get("mask"),
+ groupPolicyId=params.get("groupPolicyId"),
+ id=params.get("id"),
ipv6=params.get("ipv6"),
mandatoryDhcp=params.get("mandatoryDhcp"),
+ mask=params.get("mask"),
+ name=params.get("name"),
+ subnet=params.get("subnet"),
+ templateVlanType=params.get("templateVlanType"),
networkId=params.get("networkId"),
vlanId=params.get("vlanId"),
- vpnNatSubnet=params.get("vpnNatSubnet"),
+ dhcpBootFilename=params.get("dhcpBootFilename"),
+ dhcpBootNextServer=params.get("dhcpBootNextServer"),
+ dhcpBootOptionsEnabled=params.get("dhcpBootOptionsEnabled"),
dhcpHandling=params.get("dhcpHandling"),
- dhcpRelayServerIps=params.get("dhcpRelayServerIps"),
dhcpLeaseTime=params.get("dhcpLeaseTime"),
- dhcpBootOptionsEnabled=params.get("dhcpBootOptionsEnabled"),
- dhcpBootNextServer=params.get("dhcpBootNextServer"),
- dhcpBootFilename=params.get("dhcpBootFilename"),
+ dhcpOptions=params.get("dhcpOptions"),
+ dhcpRelayServerIps=params.get("dhcpRelayServerIps"),
+ dnsNameservers=params.get("dnsNameservers"),
fixedIpAssignments=params.get("fixedIpAssignments"),
reservedIpRanges=params.get("reservedIpRanges"),
- dnsNameservers=params.get("dnsNameservers"),
- dhcpOptions=params.get("dhcpOptions"),
+ vpnNatSubnet=params.get("vpnNatSubnet"),
)
def get_all_params(self, name=None, id=None):
@@ -107,43 +107,43 @@ class NetworksApplianceVlans(object):
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None or self.new_object.get('id') is not None:
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id') or self.new_object.get('id')
+ self.new_object.get('vlan_id')
return new_object_params
def create_params(self):
new_object_params = {}
- if self.new_object.get('id') is not None or self.new_object.get('id') is not None:
- new_object_params['id'] = self.new_object.get('id') or \
- self.new_object.get('id')
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
if self.new_object.get('applianceIp') is not None or self.new_object.get('appliance_ip') is not None:
new_object_params['applianceIp'] = self.new_object.get('applianceIp') or \
self.new_object.get('appliance_ip')
- if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
- new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
- self.new_object.get('group_policy_id')
- if self.new_object.get('templateVlanType') is not None or self.new_object.get('template_vlan_type') is not None:
- new_object_params['templateVlanType'] = self.new_object.get('templateVlanType') or \
- self.new_object.get('template_vlan_type')
if self.new_object.get('cidr') is not None or self.new_object.get('cidr') is not None:
new_object_params['cidr'] = self.new_object.get('cidr') or \
self.new_object.get('cidr')
- if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
- new_object_params['mask'] = self.new_object.get('mask') or \
- self.new_object.get('mask')
+ if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
+ new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
+ self.new_object.get('group_policy_id')
+ if self.new_object.get('id') is not None or self.new_object.get('id') is not None:
+ new_object_params['id'] = self.new_object.get('id') or \
+ self.new_object.get('id')
if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
new_object_params['ipv6'] = self.new_object.get('ipv6') or \
self.new_object.get('ipv6')
if self.new_object.get('mandatoryDhcp') is not None or self.new_object.get('mandatory_dhcp') is not None:
new_object_params['mandatoryDhcp'] = self.new_object.get('mandatoryDhcp') or \
self.new_object.get('mandatory_dhcp')
+ if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
+ new_object_params['mask'] = self.new_object.get('mask') or \
+ self.new_object.get('mask')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
+ if self.new_object.get('templateVlanType') is not None or self.new_object.get('template_vlan_type') is not None:
+ new_object_params['templateVlanType'] = self.new_object.get('templateVlanType') or \
+ self.new_object.get('template_vlan_type')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -154,79 +154,78 @@ class NetworksApplianceVlans(object):
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None is not None or self.new_object.get('id') is not None:
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id') or self.new_object.get('id')
+ self.new_object.get('vlan_id')
return new_object_params
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
if self.new_object.get('applianceIp') is not None or self.new_object.get('appliance_ip') is not None:
new_object_params['applianceIp'] = self.new_object.get('applianceIp') or \
self.new_object.get('appliance_ip')
- if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
- new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
- self.new_object.get('group_policy_id')
- if self.new_object.get('vpnNatSubnet') is not None or self.new_object.get('vpn_nat_subnet') is not None:
- new_object_params['vpnNatSubnet'] = self.new_object.get('vpnNatSubnet') or \
- self.new_object.get('vpn_nat_subnet')
+ if self.new_object.get('cidr') is not None or self.new_object.get('cidr') is not None:
+ new_object_params['cidr'] = self.new_object.get('cidr') or \
+ self.new_object.get('cidr')
+ if self.new_object.get('dhcpBootFilename') is not None or self.new_object.get('dhcp_boot_filename') is not None:
+ new_object_params['dhcpBootFilename'] = self.new_object.get('dhcpBootFilename') or \
+ self.new_object.get('dhcp_boot_filename')
+ if self.new_object.get('dhcpBootNextServer') is not None or self.new_object.get('dhcp_boot_next_server') is not None:
+ new_object_params['dhcpBootNextServer'] = self.new_object.get('dhcpBootNextServer') or \
+ self.new_object.get('dhcp_boot_next_server')
+ if self.new_object.get('dhcpBootOptionsEnabled') is not None or self.new_object.get('dhcp_boot_options_enabled') is not None:
+ new_object_params['dhcpBootOptionsEnabled'] = self.new_object.get('dhcpBootOptionsEnabled')
if self.new_object.get('dhcpHandling') is not None or self.new_object.get('dhcp_handling') is not None:
new_object_params['dhcpHandling'] = self.new_object.get('dhcpHandling') or \
self.new_object.get('dhcp_handling')
- if self.new_object.get('dhcpRelayServerIps') is not None or self.new_object.get('dhcp_relay_server_ips') is not None:
- new_object_params['dhcpRelayServerIps'] = self.new_object.get('dhcpRelayServerIps') or \
- self.new_object.get('dhcp_relay_server_ips')
if self.new_object.get('dhcpLeaseTime') is not None or self.new_object.get('dhcp_lease_time') is not None:
new_object_params['dhcpLeaseTime'] = self.new_object.get('dhcpLeaseTime') or \
self.new_object.get('dhcp_lease_time')
- if self.new_object.get('dhcpBootOptionsEnabled') is not None or self.new_object.get('dhcp_boot_options_enabled') is not None:
- new_object_params['dhcpBootOptionsEnabled'] = self.new_object.get(
- 'dhcpBootOptionsEnabled')
- if self.new_object.get('dhcpBootNextServer') is not None or self.new_object.get('dhcp_boot_next_server') is not None:
- new_object_params['dhcpBootNextServer'] = self.new_object.get('dhcpBootNextServer') or \
- self.new_object.get('dhcp_boot_next_server')
- if self.new_object.get('dhcpBootFilename') is not None or self.new_object.get('dhcp_boot_filename') is not None:
- new_object_params['dhcpBootFilename'] = self.new_object.get('dhcpBootFilename') or \
- self.new_object.get('dhcp_boot_filename')
- if self.new_object.get('fixedIpAssignments') is not None or self.new_object.get('fixed_ip_assignments') is not None:
- new_object_params['fixedIpAssignments'] = self.new_object.get('fixedIpAssignments') or \
- self.new_object.get('fixed_ip_assignments')
- if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
- new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
- self.new_object.get('reserved_ip_ranges')
- if self.new_object.get('dnsNameservers') is not None or self.new_object.get('dns_nameservers') is not None:
- new_object_params['dnsNameservers'] = self.new_object.get('dnsNameservers') or \
- self.new_object.get('dns_nameservers')
if self.new_object.get('dhcpOptions') is not None or self.new_object.get('dhcp_options') is not None:
new_object_params['dhcpOptions'] = self.new_object.get('dhcpOptions') or \
self.new_object.get('dhcp_options')
- if self.new_object.get('templateVlanType') is not None or self.new_object.get('template_vlan_type') is not None:
- new_object_params['templateVlanType'] = self.new_object.get('templateVlanType') or \
- self.new_object.get('template_vlan_type')
- if self.new_object.get('cidr') is not None or self.new_object.get('cidr') is not None:
- new_object_params['cidr'] = self.new_object.get('cidr') or \
- self.new_object.get('cidr')
- if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
- new_object_params['mask'] = self.new_object.get('mask') or \
- self.new_object.get('mask')
+ if self.new_object.get('dhcpRelayServerIps') is not None or self.new_object.get('dhcp_relay_server_ips') is not None:
+ new_object_params['dhcpRelayServerIps'] = self.new_object.get('dhcpRelayServerIps') or \
+ self.new_object.get('dhcp_relay_server_ips')
+ if self.new_object.get('dnsNameservers') is not None or self.new_object.get('dns_nameservers') is not None:
+ new_object_params['dnsNameservers'] = self.new_object.get('dnsNameservers') or \
+ self.new_object.get('dns_nameservers')
+ if self.new_object.get('fixedIpAssignments') is not None or self.new_object.get('fixed_ip_assignments') is not None:
+ new_object_params['fixedIpAssignments'] = self.new_object.get('fixedIpAssignments') or \
+ self.new_object.get('fixed_ip_assignments')
+ if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
+ new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
+ self.new_object.get('group_policy_id')
if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
new_object_params['ipv6'] = self.new_object.get('ipv6') or \
self.new_object.get('ipv6')
if self.new_object.get('mandatoryDhcp') is not None or self.new_object.get('mandatory_dhcp') is not None:
new_object_params['mandatoryDhcp'] = self.new_object.get('mandatoryDhcp') or \
self.new_object.get('mandatory_dhcp')
+ if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
+ new_object_params['mask'] = self.new_object.get('mask') or \
+ self.new_object.get('mask')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
+ new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
+ self.new_object.get('reserved_ip_ranges')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
+ if self.new_object.get('templateVlanType') is not None or self.new_object.get('template_vlan_type') is not None:
+ new_object_params['templateVlanType'] = self.new_object.get('templateVlanType') or \
+ self.new_object.get('template_vlan_type')
+ if self.new_object.get('vpnNatSubnet') is not None or self.new_object.get('vpn_nat_subnet') is not None:
+ new_object_params['vpnNatSubnet'] = self.new_object.get('vpnNatSubnet') or \
+ self.new_object.get('vpn_nat_subnet')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None is not None or self.new_object.get('id') is not None:
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id') or self.new_object.get('id')
+ self.new_object.get('vlan_id')
return new_object_params
def get_object_by_name(self, name):
@@ -298,29 +297,29 @@ class NetworksApplianceVlans(object):
requested_obj = self.new_object
obj_params = [
- ("id", "id"),
- ("name", "name"),
- ("subnet", "subnet"),
("applianceIp", "applianceIp"),
- ("groupPolicyId", "groupPolicyId"),
- ("templateVlanType", "templateVlanType"),
("cidr", "cidr"),
- ("mask", "mask"),
+ ("groupPolicyId", "groupPolicyId"),
+ ("id", "id"),
("ipv6", "ipv6"),
("mandatoryDhcp", "mandatoryDhcp"),
+ ("mask", "mask"),
+ ("name", "name"),
+ ("subnet", "subnet"),
+ ("templateVlanType", "templateVlanType"),
("networkId", "networkId"),
("vlanId", "vlanId"),
- ("vpnNatSubnet", "vpnNatSubnet"),
+ ("dhcpBootFilename", "dhcpBootFilename"),
+ ("dhcpBootNextServer", "dhcpBootNextServer"),
+ ("dhcpBootOptionsEnabled", "dhcpBootOptionsEnabled"),
("dhcpHandling", "dhcpHandling"),
- ("dhcpRelayServerIps", "dhcpRelayServerIps"),
("dhcpLeaseTime", "dhcpLeaseTime"),
- ("dhcpBootOptionsEnabled", "dhcpBootOptionsEnabled"),
- ("dhcpBootNextServer", "dhcpBootNextServer"),
- ("dhcpBootFilename", "dhcpBootFilename"),
+ ("dhcpOptions", "dhcpOptions"),
+ ("dhcpRelayServerIps", "dhcpRelayServerIps"),
+ ("dnsNameservers", "dnsNameservers"),
("fixedIpAssignments", "fixedIpAssignments"),
("reservedIpRanges", "reservedIpRanges"),
- ("dnsNameservers", "dnsNameservers"),
- ("dhcpOptions", "dhcpOptions"),
+ ("vpnNatSubnet", "vpnNatSubnet"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (DNAC) params
# If any does not have eq params, it requires update
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_bgp.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_bgp.py
index e3eba8000..956e2bf59 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_bgp.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_bgp.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- enabled=dict(type="bool"),
asNumber=dict(type="int"),
+ enabled=dict(type="bool"),
ibgpHoldTimer=dict(type="int"),
neighbors=dict(type="list"),
networkId=dict(type="str"),
@@ -51,8 +51,8 @@ class NetworksApplianceVpnBgp(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- enabled=params.get("enabled"),
asNumber=params.get("asNumber"),
+ enabled=params.get("enabled"),
ibgpHoldTimer=params.get("ibgpHoldTimer"),
neighbors=params.get("neighbors"),
network_id=params.get("networkId"),
@@ -67,11 +67,11 @@ class NetworksApplianceVpnBgp(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('asNumber') is not None or self.new_object.get('as_number') is not None:
new_object_params['asNumber'] = self.new_object.get('asNumber') or \
self.new_object.get('as_number')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('ibgpHoldTimer') is not None or self.new_object.get('ibgp_hold_timer') is not None:
new_object_params['ibgpHoldTimer'] = self.new_object.get('ibgpHoldTimer') or \
self.new_object.get('ibgp_hold_timer')
@@ -134,8 +134,8 @@ class NetworksApplianceVpnBgp(object):
requested_obj = self.new_object
obj_params = [
- ("enabled", "enabled"),
("asNumber", "asNumber"),
+ ("enabled", "enabled"),
("ibgpHoldTimer", "ibgpHoldTimer"),
("neighbors", "neighbors"),
("networkId", "networkId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_site_to_site_vpn.py b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_site_to_site_vpn.py
index 1a73bb08d..e687d1ed4 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_site_to_site_vpn.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_appliance_vpn_site_to_site_vpn.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- mode=dict(type="str"),
hubs=dict(type="list"),
+ mode=dict(type="str"),
subnets=dict(type="list"),
networkId=dict(type="str"),
))
@@ -50,8 +50,8 @@ class NetworksApplianceVpnSiteToSiteVpn(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- mode=params.get("mode"),
hubs=params.get("hubs"),
+ mode=params.get("mode"),
subnets=params.get("subnets"),
network_id=params.get("networkId"),
)
@@ -65,12 +65,12 @@ class NetworksApplianceVpnSiteToSiteVpn(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
- new_object_params['mode'] = self.new_object.get('mode') or \
- self.new_object.get('mode')
if self.new_object.get('hubs') is not None or self.new_object.get('hubs') is not None:
new_object_params['hubs'] = self.new_object.get('hubs') or \
self.new_object.get('hubs')
+ if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
+ new_object_params['mode'] = self.new_object.get('mode') or \
+ self.new_object.get('mode')
if self.new_object.get('subnets') is not None or self.new_object.get('subnets') is not None:
new_object_params['subnets'] = self.new_object.get('subnets') or \
self.new_object.get('subnets')
@@ -130,8 +130,8 @@ class NetworksApplianceVpnSiteToSiteVpn(object):
requested_obj = self.new_object
obj_params = [
- ("mode", "mode"),
("hubs", "hubs"),
+ ("mode", "mode"),
("subnets", "subnets"),
("networkId", "networkId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_bind.py b/ansible_collections/cisco/meraki/plugins/action/networks_bind.py
index 2e65eefb3..e25f56335 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_bind.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_bind.py
@@ -25,8 +25,8 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- configTemplateId=dict(type="str"),
autoBind=dict(type="bool"),
+ configTemplateId=dict(type="str"),
networkId=dict(type="str"),
))
@@ -66,8 +66,8 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- configTemplateId=params.get("configTemplateId"),
autoBind=params.get("autoBind"),
+ configTemplateId=params.get("configTemplateId"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_camera_quality_retention_profiles.py b/ansible_collections/cisco/meraki/plugins/action/networks_camera_quality_retention_profiles.py
index 29e1aae17..4b33683b8 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_camera_quality_retention_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_camera_quality_retention_profiles.py
@@ -32,14 +32,14 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- motionBasedRetentionEnabled=dict(type="bool"),
- restrictedBandwidthModeEnabled=dict(type="bool"),
audioRecordingEnabled=dict(type="bool"),
cloudArchiveEnabled=dict(type="bool"),
+ maxRetentionDays=dict(type="int"),
+ motionBasedRetentionEnabled=dict(type="bool"),
motionDetectorVersion=dict(type="int"),
+ name=dict(type="str"),
+ restrictedBandwidthModeEnabled=dict(type="bool"),
scheduleId=dict(type="str"),
- maxRetentionDays=dict(type="int"),
videoSettings=dict(type="dict"),
networkId=dict(type="str"),
qualityRetentionProfileId=dict(type="str"),
@@ -58,14 +58,14 @@ class NetworksCameraQualityRetentionProfiles(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- motionBasedRetentionEnabled=params.get("motionBasedRetentionEnabled"),
- restrictedBandwidthModeEnabled=params.get("restrictedBandwidthModeEnabled"),
audioRecordingEnabled=params.get("audioRecordingEnabled"),
cloudArchiveEnabled=params.get("cloudArchiveEnabled"),
+ maxRetentionDays=params.get("maxRetentionDays"),
+ motionBasedRetentionEnabled=params.get("motionBasedRetentionEnabled"),
motionDetectorVersion=params.get("motionDetectorVersion"),
+ name=params.get("name"),
+ restrictedBandwidthModeEnabled=params.get("restrictedBandwidthModeEnabled"),
scheduleId=params.get("scheduleId"),
- maxRetentionDays=params.get("maxRetentionDays"),
videoSettings=params.get("videoSettings"),
networkId=params.get("networkId"),
qualityRetentionProfileId=params.get("qualityRetentionProfileId"),
@@ -90,26 +90,26 @@ class NetworksCameraQualityRetentionProfiles(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('motionBasedRetentionEnabled') is not None or self.new_object.get('motion_based_retention_enabled') is not None:
- new_object_params['motionBasedRetentionEnabled'] = self.new_object.get('motionBasedRetentionEnabled')
- if self.new_object.get('restrictedBandwidthModeEnabled') is not None or self.new_object.get('restricted_bandwidth_mode_enabled') is not None:
- new_object_params['restrictedBandwidthModeEnabled'] = self.new_object.get('restrictedBandwidthModeEnabled')
if self.new_object.get('audioRecordingEnabled') is not None or self.new_object.get('audio_recording_enabled') is not None:
new_object_params['audioRecordingEnabled'] = self.new_object.get('audioRecordingEnabled')
if self.new_object.get('cloudArchiveEnabled') is not None or self.new_object.get('cloud_archive_enabled') is not None:
new_object_params['cloudArchiveEnabled'] = self.new_object.get('cloudArchiveEnabled')
+ if self.new_object.get('maxRetentionDays') is not None or self.new_object.get('max_retention_days') is not None:
+ new_object_params['maxRetentionDays'] = self.new_object.get('maxRetentionDays') or \
+ self.new_object.get('max_retention_days')
+ if self.new_object.get('motionBasedRetentionEnabled') is not None or self.new_object.get('motion_based_retention_enabled') is not None:
+ new_object_params['motionBasedRetentionEnabled'] = self.new_object.get('motionBasedRetentionEnabled')
if self.new_object.get('motionDetectorVersion') is not None or self.new_object.get('motion_detector_version') is not None:
new_object_params['motionDetectorVersion'] = self.new_object.get('motionDetectorVersion') or \
self.new_object.get('motion_detector_version')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('restrictedBandwidthModeEnabled') is not None or self.new_object.get('restricted_bandwidth_mode_enabled') is not None:
+ new_object_params['restrictedBandwidthModeEnabled'] = self.new_object.get('restrictedBandwidthModeEnabled')
if self.new_object.get('scheduleId') is not None or self.new_object.get('schedule_id') is not None:
new_object_params['scheduleId'] = self.new_object.get('scheduleId') or \
self.new_object.get('schedule_id')
- if self.new_object.get('maxRetentionDays') is not None or self.new_object.get('max_retention_days') is not None:
- new_object_params['maxRetentionDays'] = self.new_object.get('maxRetentionDays') or \
- self.new_object.get('max_retention_days')
if self.new_object.get('videoSettings') is not None or self.new_object.get('video_settings') is not None:
new_object_params['videoSettings'] = self.new_object.get('videoSettings') or \
self.new_object.get('video_settings')
@@ -130,26 +130,26 @@ class NetworksCameraQualityRetentionProfiles(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('motionBasedRetentionEnabled') is not None or self.new_object.get('motion_based_retention_enabled') is not None:
- new_object_params['motionBasedRetentionEnabled'] = self.new_object.get('motionBasedRetentionEnabled')
- if self.new_object.get('restrictedBandwidthModeEnabled') is not None or self.new_object.get('restricted_bandwidth_mode_enabled') is not None:
- new_object_params['restrictedBandwidthModeEnabled'] = self.new_object.get('restrictedBandwidthModeEnabled')
if self.new_object.get('audioRecordingEnabled') is not None or self.new_object.get('audio_recording_enabled') is not None:
new_object_params['audioRecordingEnabled'] = self.new_object.get('audioRecordingEnabled')
if self.new_object.get('cloudArchiveEnabled') is not None or self.new_object.get('cloud_archive_enabled') is not None:
new_object_params['cloudArchiveEnabled'] = self.new_object.get('cloudArchiveEnabled')
+ if self.new_object.get('maxRetentionDays') is not None or self.new_object.get('max_retention_days') is not None:
+ new_object_params['maxRetentionDays'] = self.new_object.get('maxRetentionDays') or \
+ self.new_object.get('max_retention_days')
+ if self.new_object.get('motionBasedRetentionEnabled') is not None or self.new_object.get('motion_based_retention_enabled') is not None:
+ new_object_params['motionBasedRetentionEnabled'] = self.new_object.get('motionBasedRetentionEnabled')
if self.new_object.get('motionDetectorVersion') is not None or self.new_object.get('motion_detector_version') is not None:
new_object_params['motionDetectorVersion'] = self.new_object.get('motionDetectorVersion') or \
self.new_object.get('motion_detector_version')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('restrictedBandwidthModeEnabled') is not None or self.new_object.get('restricted_bandwidth_mode_enabled') is not None:
+ new_object_params['restrictedBandwidthModeEnabled'] = self.new_object.get('restrictedBandwidthModeEnabled')
if self.new_object.get('scheduleId') is not None or self.new_object.get('schedule_id') is not None:
new_object_params['scheduleId'] = self.new_object.get('scheduleId') or \
self.new_object.get('schedule_id')
- if self.new_object.get('maxRetentionDays') is not None or self.new_object.get('max_retention_days') is not None:
- new_object_params['maxRetentionDays'] = self.new_object.get('maxRetentionDays') or \
- self.new_object.get('max_retention_days')
if self.new_object.get('videoSettings') is not None or self.new_object.get('video_settings') is not None:
new_object_params['videoSettings'] = self.new_object.get('videoSettings') or \
self.new_object.get('video_settings')
@@ -230,14 +230,14 @@ class NetworksCameraQualityRetentionProfiles(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("motionBasedRetentionEnabled", "motionBasedRetentionEnabled"),
- ("restrictedBandwidthModeEnabled", "restrictedBandwidthModeEnabled"),
("audioRecordingEnabled", "audioRecordingEnabled"),
("cloudArchiveEnabled", "cloudArchiveEnabled"),
+ ("maxRetentionDays", "maxRetentionDays"),
+ ("motionBasedRetentionEnabled", "motionBasedRetentionEnabled"),
("motionDetectorVersion", "motionDetectorVersion"),
+ ("name", "name"),
+ ("restrictedBandwidthModeEnabled", "restrictedBandwidthModeEnabled"),
("scheduleId", "scheduleId"),
- ("maxRetentionDays", "maxRetentionDays"),
("videoSettings", "videoSettings"),
("networkId", "networkId"),
("qualityRetentionProfileId", "qualityRetentionProfileId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_camera_wireless_profiles.py b/ansible_collections/cisco/meraki/plugins/action/networks_camera_wireless_profiles.py
index 4aedf37c2..4525ab771 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_camera_wireless_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_camera_wireless_profiles.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ identity=dict(type="dict"),
name=dict(type="str"),
ssid=dict(type="dict"),
- identity=dict(type="dict"),
networkId=dict(type="str"),
wirelessProfileId=dict(type="str"),
))
@@ -52,9 +52,9 @@ class NetworksCameraWirelessProfiles(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ identity=params.get("identity"),
name=params.get("name"),
ssid=params.get("ssid"),
- identity=params.get("identity"),
networkId=params.get("networkId"),
wirelessProfileId=params.get("wirelessProfileId"),
)
@@ -78,15 +78,15 @@ class NetworksCameraWirelessProfiles(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('identity') is not None or self.new_object.get('identity') is not None:
+ new_object_params['identity'] = self.new_object.get('identity') or \
+ self.new_object.get('identity')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
if self.new_object.get('ssid') is not None or self.new_object.get('ssid') is not None:
new_object_params['ssid'] = self.new_object.get('ssid') or \
self.new_object.get('ssid')
- if self.new_object.get('identity') is not None or self.new_object.get('identity') is not None:
- new_object_params['identity'] = self.new_object.get('identity') or \
- self.new_object.get('identity')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -104,15 +104,15 @@ class NetworksCameraWirelessProfiles(object):
def update_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('identity') is not None or self.new_object.get('identity') is not None:
+ new_object_params['identity'] = self.new_object.get('identity') or \
+ self.new_object.get('identity')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
if self.new_object.get('ssid') is not None or self.new_object.get('ssid') is not None:
new_object_params['ssid'] = self.new_object.get('ssid') or \
self.new_object.get('ssid')
- if self.new_object.get('identity') is not None or self.new_object.get('identity') is not None:
- new_object_params['identity'] = self.new_object.get('identity') or \
- self.new_object.get('identity')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -190,9 +190,9 @@ class NetworksCameraWirelessProfiles(object):
requested_obj = self.new_object
obj_params = [
+ ("identity", "identity"),
("name", "name"),
("ssid", "ssid"),
- ("identity", "identity"),
("networkId", "networkId"),
("wirelessProfileId", "wirelessProfileId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_dhcp.py b/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_dhcp.py
index a02d4c4d4..823ff2348 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_dhcp.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_dhcp.py
@@ -33,8 +33,8 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
dhcpLeaseTime=dict(type="str"),
- dnsNameservers=dict(type="str"),
dnsCustomNameservers=dict(type="list"),
+ dnsNameservers=dict(type="str"),
networkId=dict(type="str"),
))
@@ -51,8 +51,8 @@ class NetworksCellularGatewayDhcp(object):
self.meraki = meraki
self.new_object = dict(
dhcpLeaseTime=params.get("dhcpLeaseTime"),
- dnsNameservers=params.get("dnsNameservers"),
dnsCustomNameservers=params.get("dnsCustomNameservers"),
+ dnsNameservers=params.get("dnsNameservers"),
network_id=params.get("networkId"),
)
@@ -68,12 +68,12 @@ class NetworksCellularGatewayDhcp(object):
if self.new_object.get('dhcpLeaseTime') is not None or self.new_object.get('dhcp_lease_time') is not None:
new_object_params['dhcpLeaseTime'] = self.new_object.get('dhcpLeaseTime') or \
self.new_object.get('dhcp_lease_time')
- if self.new_object.get('dnsNameservers') is not None or self.new_object.get('dns_nameservers') is not None:
- new_object_params['dnsNameservers'] = self.new_object.get('dnsNameservers') or \
- self.new_object.get('dns_nameservers')
if self.new_object.get('dnsCustomNameservers') is not None or self.new_object.get('dns_custom_nameservers') is not None:
new_object_params['dnsCustomNameservers'] = self.new_object.get('dnsCustomNameservers') or \
self.new_object.get('dns_custom_nameservers')
+ if self.new_object.get('dnsNameservers') is not None or self.new_object.get('dns_nameservers') is not None:
+ new_object_params['dnsNameservers'] = self.new_object.get('dnsNameservers') or \
+ self.new_object.get('dns_nameservers')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -131,8 +131,8 @@ class NetworksCellularGatewayDhcp(object):
obj_params = [
("dhcpLeaseTime", "dhcpLeaseTime"),
- ("dnsNameservers", "dnsNameservers"),
("dnsCustomNameservers", "dnsCustomNameservers"),
+ ("dnsNameservers", "dnsNameservers"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_subnet_pool.py b/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_subnet_pool.py
index 4af5e75ad..328e935ae 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_subnet_pool.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_cellular_gateway_subnet_pool.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- mask=dict(type="int"),
cidr=dict(type="str"),
+ mask=dict(type="int"),
networkId=dict(type="str"),
))
@@ -49,8 +49,8 @@ class NetworksCellularGatewaySubnetPool(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- mask=params.get("mask"),
cidr=params.get("cidr"),
+ mask=params.get("mask"),
network_id=params.get("networkId"),
)
@@ -63,12 +63,12 @@ class NetworksCellularGatewaySubnetPool(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
- new_object_params['mask'] = self.new_object.get('mask') or \
- self.new_object.get('mask')
if self.new_object.get('cidr') is not None or self.new_object.get('cidr') is not None:
new_object_params['cidr'] = self.new_object.get('cidr') or \
self.new_object.get('cidr')
+ if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
+ new_object_params['mask'] = self.new_object.get('mask') or \
+ self.new_object.get('mask')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -125,8 +125,8 @@ class NetworksCellularGatewaySubnetPool(object):
requested_obj = self.new_object
obj_params = [
- ("mask", "mask"),
("cidr", "cidr"),
+ ("mask", "mask"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_clients_info.py b/ansible_collections/cisco/meraki/plugins/action/networks_clients_info.py
index 7f6eae8dc..cb865220d 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_clients_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_clients_info.py
@@ -26,23 +26,7 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
networkId=dict(type="str"),
- t0=dict(type="str"),
- timespan=dict(type="float"),
- perPage=dict(type="int"),
- total_pages=dict(type="int"),
- direction=dict(type="str"),
- startingAfter=dict(type="str"),
- endingBefore=dict(type="str"),
- statuses=dict(type="list"),
- ip=dict(type="str"),
- ip6=dict(type="str"),
- ip6Local=dict(type="str"),
- mac=dict(type="str"),
- os=dict(type="str"),
- pskGroup=dict(type="str"),
- description=dict(type="str"),
- vlan=dict(type="str"),
- recentDeviceConnections=dict(type="list"),
+ clientId=dict(type="str"),
))
required_if = []
@@ -79,61 +63,14 @@ class ActionModule(ActionBase):
if not valid:
raise AnsibleActionFail(errors)
- def get_all(self, params):
+ def get_object(self, params):
new_object = {}
if params.get("networkId") is not None:
new_object["networkId"] = params.get(
"networkId")
- if params.get("t0") is not None:
- new_object["t0"] = params.get(
- "t0")
- if params.get("timespan") is not None:
- new_object["timespan"] = params.get(
- "timespan")
- if params.get("perPage") is not None:
- new_object["perPage"] = params.get(
- "perPage")
- new_object['total_pages'] = params.get(
- "total_pages") or 1
- new_object['direction'] = params.get(
- "direction") or "next"
- if params.get("startingAfter") is not None:
- new_object["startingAfter"] = params.get(
- "startingAfter")
- if params.get("endingBefore") is not None:
- new_object["endingBefore"] = params.get(
- "endingBefore")
- if params.get("statuses") is not None:
- new_object["statuses"] = params.get(
- "statuses")
- if params.get("ip") is not None:
- new_object["ip"] = params.get(
- "ip")
- if params.get("ip6") is not None:
- new_object["ip6"] = params.get(
- "ip6")
- if params.get("ip6Local") is not None:
- new_object["ip6Local"] = params.get(
- "ip6Local")
- if params.get("mac") is not None:
- new_object["mac"] = params.get(
- "mac")
- if params.get("os") is not None:
- new_object["os"] = params.get(
- "os")
- if params.get("pskGroup") is not None:
- new_object["pskGroup"] = params.get(
- "pskGroup")
- if params.get("description") is not None:
- new_object["description"] = params.get(
- "description")
- if params.get("vlan") is not None:
- new_object["vlan"] = params.get(
- "vlan")
- if params.get("recentDeviceConnections") is not None:
- new_object["recentDeviceConnections"] = params.get(
- "recentDeviceConnections")
-
+ if params.get("clientId") is not None:
+ new_object["clientId"] = params.get(
+ "clientId")
return new_object
def run(self, tmp=None, task_vars=None):
@@ -146,11 +83,20 @@ class ActionModule(ActionBase):
meraki = MERAKI(params=self._task.args)
- response = meraki.exec_meraki(
- family="networks",
- function='getNetworkClients',
- params=self.get_all(self._task.args),
- )
- self._result.update(dict(meraki_response=response))
- self._result.update(meraki.exit_json())
- return self._result
+ id = self._task.args.get("clientId")
+ if id:
+ response = meraki.exec_meraki(
+ family="networks",
+ function='getNetworkClient',
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
+ if not id:
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades.py b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades.py
index d60217404..f3cc453f0 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- upgradeWindow=dict(type="dict"),
- timezone=dict(type="str"),
products=dict(type="dict"),
+ timezone=dict(type="str"),
+ upgradeWindow=dict(type="dict"),
networkId=dict(type="str"),
))
@@ -50,9 +50,9 @@ class NetworksFirmwareUpgrades(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- upgradeWindow=params.get("upgradeWindow"),
- timezone=params.get("timezone"),
products=params.get("products"),
+ timezone=params.get("timezone"),
+ upgradeWindow=params.get("upgradeWindow"),
network_id=params.get("networkId"),
)
@@ -65,15 +65,15 @@ class NetworksFirmwareUpgrades(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('upgradeWindow') is not None or self.new_object.get('upgrade_window') is not None:
- new_object_params['upgradeWindow'] = self.new_object.get('upgradeWindow') or \
- self.new_object.get('upgrade_window')
- if self.new_object.get('timezone') is not None or self.new_object.get('timezone') is not None:
- new_object_params['timezone'] = self.new_object.get('timezone') or \
- self.new_object.get('timezone')
if self.new_object.get('products') is not None or self.new_object.get('products') is not None:
new_object_params['products'] = self.new_object.get('products') or \
self.new_object.get('products')
+ if self.new_object.get('timezone') is not None or self.new_object.get('timezone') is not None:
+ new_object_params['timezone'] = self.new_object.get('timezone') or \
+ self.new_object.get('timezone')
+ if self.new_object.get('upgradeWindow') is not None or self.new_object.get('upgrade_window') is not None:
+ new_object_params['upgradeWindow'] = self.new_object.get('upgradeWindow') or \
+ self.new_object.get('upgrade_window')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -130,9 +130,9 @@ class NetworksFirmwareUpgrades(object):
requested_obj = self.new_object
obj_params = [
- ("upgradeWindow", "upgradeWindow"),
- ("timezone", "timezone"),
("products", "products"),
+ ("timezone", "timezone"),
+ ("upgradeWindow", "upgradeWindow"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_rollbacks.py b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_rollbacks.py
index 02dd7a060..ac1f8efea 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_rollbacks.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_rollbacks.py
@@ -26,8 +26,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
product=dict(type="str"),
- time=dict(type="str"),
reasons=dict(type="list"),
+ time=dict(type="str"),
toVersion=dict(type="dict"),
networkId=dict(type="str"),
))
@@ -69,8 +69,8 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
product=params.get("product"),
- time=params.get("time"),
reasons=params.get("reasons"),
+ time=params.get("time"),
toVersion=params.get("toVersion"),
networkId=params.get("networkId"),
)
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_defer.py b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_defer.py
index db07326b4..f4676d6e5 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_defer.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_defer.py
@@ -64,7 +64,7 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- network_id=params.get("networkId"),
+ networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_rollbacks.py b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_rollbacks.py
index 72ab2abcc..4a7b0d8aa 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_rollbacks.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_events_rollbacks.py
@@ -25,8 +25,8 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- stages=dict(type="list"),
reasons=dict(type="list"),
+ stages=dict(type="list"),
networkId=dict(type="str"),
))
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_groups.py b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_groups.py
index ea0902e37..61f7f1b4b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_groups.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_firmware_upgrades_staged_groups.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
+ assignedDevices=dict(type="dict"),
description=dict(type="str"),
isDefault=dict(type="bool"),
- assignedDevices=dict(type="dict"),
+ name=dict(type="str"),
networkId=dict(type="str"),
groupId=dict(type="str"),
))
@@ -53,10 +53,10 @@ class NetworksFirmwareUpgradesStagedGroups(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
+ assignedDevices=params.get("assignedDevices"),
description=params.get("description"),
isDefault=params.get("isDefault"),
- assignedDevices=params.get("assignedDevices"),
+ name=params.get("name"),
networkId=params.get("networkId"),
groupId=params.get("groupId"),
)
@@ -80,17 +80,17 @@ class NetworksFirmwareUpgradesStagedGroups(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
+ if self.new_object.get('assignedDevices') is not None or self.new_object.get('assigned_devices') is not None:
+ new_object_params['assignedDevices'] = self.new_object.get('assignedDevices') or \
+ self.new_object.get('assigned_devices')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
if self.new_object.get('isDefault') is not None or self.new_object.get('is_default') is not None:
new_object_params['isDefault'] = self.new_object.get('isDefault')
- if self.new_object.get('assignedDevices') is not None or self.new_object.get('assigned_devices') is not None:
- new_object_params['assignedDevices'] = self.new_object.get('assignedDevices') or \
- self.new_object.get('assigned_devices')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -108,17 +108,17 @@ class NetworksFirmwareUpgradesStagedGroups(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
+ if self.new_object.get('assignedDevices') is not None or self.new_object.get('assigned_devices') is not None:
+ new_object_params['assignedDevices'] = self.new_object.get('assignedDevices') or \
+ self.new_object.get('assigned_devices')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
if self.new_object.get('isDefault') is not None or self.new_object.get('is_default') is not None:
new_object_params['isDefault'] = self.new_object.get('isDefault')
- if self.new_object.get('assignedDevices') is not None or self.new_object.get('assigned_devices') is not None:
- new_object_params['assignedDevices'] = self.new_object.get('assignedDevices') or \
- self.new_object.get('assigned_devices')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -196,10 +196,10 @@ class NetworksFirmwareUpgradesStagedGroups(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
+ ("assignedDevices", "assignedDevices"),
("description", "description"),
("isDefault", "isDefault"),
- ("assignedDevices", "assignedDevices"),
+ ("name", "name"),
("networkId", "networkId"),
("groupId", "groupId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_floor_plans.py b/ansible_collections/cisco/meraki/plugins/action/networks_floor_plans.py
index 0e1a40eec..561919d38 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_floor_plans.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_floor_plans.py
@@ -32,13 +32,13 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- center=dict(type="dict"),
bottomLeftCorner=dict(type="dict"),
bottomRightCorner=dict(type="dict"),
+ center=dict(type="dict"),
+ imageContents=dict(type="str"),
+ name=dict(type="str"),
topLeftCorner=dict(type="dict"),
topRightCorner=dict(type="dict"),
- imageContents=dict(type="str"),
networkId=dict(type="str"),
floorPlanId=dict(type="str"),
))
@@ -56,13 +56,13 @@ class NetworksFloorPlans(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- center=params.get("center"),
bottomLeftCorner=params.get("bottomLeftCorner"),
bottomRightCorner=params.get("bottomRightCorner"),
+ center=params.get("center"),
+ imageContents=params.get("imageContents"),
+ name=params.get("name"),
topLeftCorner=params.get("topLeftCorner"),
topRightCorner=params.get("topRightCorner"),
- imageContents=params.get("imageContents"),
networkId=params.get("networkId"),
floorPlanId=params.get("floorPlanId"),
)
@@ -86,27 +86,27 @@ class NetworksFloorPlans(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('center') is not None or self.new_object.get('center') is not None:
- new_object_params['center'] = self.new_object.get('center') or \
- self.new_object.get('center')
if self.new_object.get('bottomLeftCorner') is not None or self.new_object.get('bottom_left_corner') is not None:
new_object_params['bottomLeftCorner'] = self.new_object.get('bottomLeftCorner') or \
self.new_object.get('bottom_left_corner')
if self.new_object.get('bottomRightCorner') is not None or self.new_object.get('bottom_right_corner') is not None:
new_object_params['bottomRightCorner'] = self.new_object.get('bottomRightCorner') or \
self.new_object.get('bottom_right_corner')
+ if self.new_object.get('center') is not None or self.new_object.get('center') is not None:
+ new_object_params['center'] = self.new_object.get('center') or \
+ self.new_object.get('center')
+ if self.new_object.get('imageContents') is not None or self.new_object.get('image_contents') is not None:
+ new_object_params['imageContents'] = self.new_object.get('imageContents') or \
+ self.new_object.get('image_contents')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('topLeftCorner') is not None or self.new_object.get('top_left_corner') is not None:
new_object_params['topLeftCorner'] = self.new_object.get('topLeftCorner') or \
self.new_object.get('top_left_corner')
if self.new_object.get('topRightCorner') is not None or self.new_object.get('top_right_corner') is not None:
new_object_params['topRightCorner'] = self.new_object.get('topRightCorner') or \
self.new_object.get('top_right_corner')
- if self.new_object.get('imageContents') is not None or self.new_object.get('image_contents') is not None:
- new_object_params['imageContents'] = self.new_object.get('imageContents') or \
- self.new_object.get('image_contents')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -124,27 +124,27 @@ class NetworksFloorPlans(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('center') is not None or self.new_object.get('center') is not None:
- new_object_params['center'] = self.new_object.get('center') or \
- self.new_object.get('center')
if self.new_object.get('bottomLeftCorner') is not None or self.new_object.get('bottom_left_corner') is not None:
new_object_params['bottomLeftCorner'] = self.new_object.get('bottomLeftCorner') or \
self.new_object.get('bottom_left_corner')
if self.new_object.get('bottomRightCorner') is not None or self.new_object.get('bottom_right_corner') is not None:
new_object_params['bottomRightCorner'] = self.new_object.get('bottomRightCorner') or \
self.new_object.get('bottom_right_corner')
+ if self.new_object.get('center') is not None or self.new_object.get('center') is not None:
+ new_object_params['center'] = self.new_object.get('center') or \
+ self.new_object.get('center')
+ if self.new_object.get('imageContents') is not None or self.new_object.get('image_contents') is not None:
+ new_object_params['imageContents'] = self.new_object.get('imageContents') or \
+ self.new_object.get('image_contents')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('topLeftCorner') is not None or self.new_object.get('top_left_corner') is not None:
new_object_params['topLeftCorner'] = self.new_object.get('topLeftCorner') or \
self.new_object.get('top_left_corner')
if self.new_object.get('topRightCorner') is not None or self.new_object.get('top_right_corner') is not None:
new_object_params['topRightCorner'] = self.new_object.get('topRightCorner') or \
self.new_object.get('top_right_corner')
- if self.new_object.get('imageContents') is not None or self.new_object.get('image_contents') is not None:
- new_object_params['imageContents'] = self.new_object.get('imageContents') or \
- self.new_object.get('image_contents')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -222,13 +222,13 @@ class NetworksFloorPlans(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("center", "center"),
("bottomLeftCorner", "bottomLeftCorner"),
("bottomRightCorner", "bottomRightCorner"),
+ ("center", "center"),
+ ("imageContents", "imageContents"),
+ ("name", "name"),
("topLeftCorner", "topLeftCorner"),
("topRightCorner", "topRightCorner"),
- ("imageContents", "imageContents"),
("networkId", "networkId"),
("floorPlanId", "floorPlanId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_group_policies.py b/ansible_collections/cisco/meraki/plugins/action/networks_group_policies.py
index c8f41fc81..749350851 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_group_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_group_policies.py
@@ -32,14 +32,14 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- scheduling=dict(type="dict"),
bandwidth=dict(type="dict"),
- firewallAndTrafficShaping=dict(type="dict"),
+ bonjourForwarding=dict(type="dict"),
contentFiltering=dict(type="dict"),
+ firewallAndTrafficShaping=dict(type="dict"),
+ name=dict(type="str"),
+ scheduling=dict(type="dict"),
splashAuthSettings=dict(type="str"),
vlanTagging=dict(type="dict"),
- bonjourForwarding=dict(type="dict"),
networkId=dict(type="str"),
groupPolicyId=dict(type="str"),
))
@@ -57,14 +57,14 @@ class NetworksGroupPolicies(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- scheduling=params.get("scheduling"),
bandwidth=params.get("bandwidth"),
- firewallAndTrafficShaping=params.get("firewallAndTrafficShaping"),
+ bonjourForwarding=params.get("bonjourForwarding"),
contentFiltering=params.get("contentFiltering"),
+ firewallAndTrafficShaping=params.get("firewallAndTrafficShaping"),
+ name=params.get("name"),
+ scheduling=params.get("scheduling"),
splashAuthSettings=params.get("splashAuthSettings"),
vlanTagging=params.get("vlanTagging"),
- bonjourForwarding=params.get("bonjourForwarding"),
networkId=params.get("networkId"),
groupPolicyId=params.get("groupPolicyId"),
)
@@ -88,30 +88,30 @@ class NetworksGroupPolicies(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('scheduling') is not None or self.new_object.get('scheduling') is not None:
- new_object_params['scheduling'] = self.new_object.get('scheduling') or \
- self.new_object.get('scheduling')
if self.new_object.get('bandwidth') is not None or self.new_object.get('bandwidth') is not None:
new_object_params['bandwidth'] = self.new_object.get('bandwidth') or \
self.new_object.get('bandwidth')
- if self.new_object.get('firewallAndTrafficShaping') is not None or self.new_object.get('firewall_and_traffic_shaping') is not None:
- new_object_params['firewallAndTrafficShaping'] = self.new_object.get('firewallAndTrafficShaping') or \
- self.new_object.get('firewall_and_traffic_shaping')
+ if self.new_object.get('bonjourForwarding') is not None or self.new_object.get('bonjour_forwarding') is not None:
+ new_object_params['bonjourForwarding'] = self.new_object.get('bonjourForwarding') or \
+ self.new_object.get('bonjour_forwarding')
if self.new_object.get('contentFiltering') is not None or self.new_object.get('content_filtering') is not None:
new_object_params['contentFiltering'] = self.new_object.get('contentFiltering') or \
self.new_object.get('content_filtering')
+ if self.new_object.get('firewallAndTrafficShaping') is not None or self.new_object.get('firewall_and_traffic_shaping') is not None:
+ new_object_params['firewallAndTrafficShaping'] = self.new_object.get('firewallAndTrafficShaping') or \
+ self.new_object.get('firewall_and_traffic_shaping')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('scheduling') is not None or self.new_object.get('scheduling') is not None:
+ new_object_params['scheduling'] = self.new_object.get('scheduling') or \
+ self.new_object.get('scheduling')
if self.new_object.get('splashAuthSettings') is not None or self.new_object.get('splash_auth_settings') is not None:
new_object_params['splashAuthSettings'] = self.new_object.get('splashAuthSettings') or \
self.new_object.get('splash_auth_settings')
if self.new_object.get('vlanTagging') is not None or self.new_object.get('vlan_tagging') is not None:
new_object_params['vlanTagging'] = self.new_object.get('vlanTagging') or \
self.new_object.get('vlan_tagging')
- if self.new_object.get('bonjourForwarding') is not None or self.new_object.get('bonjour_forwarding') is not None:
- new_object_params['bonjourForwarding'] = self.new_object.get('bonjourForwarding') or \
- self.new_object.get('bonjour_forwarding')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -129,30 +129,30 @@ class NetworksGroupPolicies(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('scheduling') is not None or self.new_object.get('scheduling') is not None:
- new_object_params['scheduling'] = self.new_object.get('scheduling') or \
- self.new_object.get('scheduling')
if self.new_object.get('bandwidth') is not None or self.new_object.get('bandwidth') is not None:
new_object_params['bandwidth'] = self.new_object.get('bandwidth') or \
self.new_object.get('bandwidth')
- if self.new_object.get('firewallAndTrafficShaping') is not None or self.new_object.get('firewall_and_traffic_shaping') is not None:
- new_object_params['firewallAndTrafficShaping'] = self.new_object.get('firewallAndTrafficShaping') or \
- self.new_object.get('firewall_and_traffic_shaping')
+ if self.new_object.get('bonjourForwarding') is not None or self.new_object.get('bonjour_forwarding') is not None:
+ new_object_params['bonjourForwarding'] = self.new_object.get('bonjourForwarding') or \
+ self.new_object.get('bonjour_forwarding')
if self.new_object.get('contentFiltering') is not None or self.new_object.get('content_filtering') is not None:
new_object_params['contentFiltering'] = self.new_object.get('contentFiltering') or \
self.new_object.get('content_filtering')
+ if self.new_object.get('firewallAndTrafficShaping') is not None or self.new_object.get('firewall_and_traffic_shaping') is not None:
+ new_object_params['firewallAndTrafficShaping'] = self.new_object.get('firewallAndTrafficShaping') or \
+ self.new_object.get('firewall_and_traffic_shaping')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('scheduling') is not None or self.new_object.get('scheduling') is not None:
+ new_object_params['scheduling'] = self.new_object.get('scheduling') or \
+ self.new_object.get('scheduling')
if self.new_object.get('splashAuthSettings') is not None or self.new_object.get('splash_auth_settings') is not None:
new_object_params['splashAuthSettings'] = self.new_object.get('splashAuthSettings') or \
self.new_object.get('splash_auth_settings')
if self.new_object.get('vlanTagging') is not None or self.new_object.get('vlan_tagging') is not None:
new_object_params['vlanTagging'] = self.new_object.get('vlanTagging') or \
self.new_object.get('vlan_tagging')
- if self.new_object.get('bonjourForwarding') is not None or self.new_object.get('bonjour_forwarding') is not None:
- new_object_params['bonjourForwarding'] = self.new_object.get('bonjourForwarding') or \
- self.new_object.get('bonjour_forwarding')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -230,14 +230,14 @@ class NetworksGroupPolicies(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("scheduling", "scheduling"),
("bandwidth", "bandwidth"),
- ("firewallAndTrafficShaping", "firewallAndTrafficShaping"),
+ ("bonjourForwarding", "bonjourForwarding"),
("contentFiltering", "contentFiltering"),
+ ("firewallAndTrafficShaping", "firewallAndTrafficShaping"),
+ ("name", "name"),
+ ("scheduling", "scheduling"),
("splashAuthSettings", "splashAuthSettings"),
("vlanTagging", "vlanTagging"),
- ("bonjourForwarding", "bonjourForwarding"),
("networkId", "networkId"),
("groupPolicyId", "groupPolicyId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_meraki_auth_users.py b/ansible_collections/cisco/meraki/plugins/action/networks_meraki_auth_users.py
index 56787c4fd..436947b7c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_meraki_auth_users.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_meraki_auth_users.py
@@ -32,15 +32,16 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- email=dict(type="str"),
- name=dict(type="str"),
- password=dict(type="str"),
accountType=dict(type="str"),
+ authorizations=dict(type="list"),
+ email=dict(type="str"),
emailPasswordToUser=dict(type="bool"),
isAdmin=dict(type="bool"),
- authorizations=dict(type="list"),
+ name=dict(type="str"),
+ password=dict(type="str"),
networkId=dict(type="str"),
merakiAuthUserId=dict(type="str"),
+ delete=dict(type="bool"),
))
required_if = [
@@ -56,15 +57,16 @@ class NetworksMerakiAuthUsers(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- email=params.get("email"),
- name=params.get("name"),
- password=params.get("password"),
accountType=params.get("accountType"),
+ authorizations=params.get("authorizations"),
+ email=params.get("email"),
emailPasswordToUser=params.get("emailPasswordToUser"),
isAdmin=params.get("isAdmin"),
- authorizations=params.get("authorizations"),
+ name=params.get("name"),
+ password=params.get("password"),
networkId=params.get("networkId"),
merakiAuthUserId=params.get("merakiAuthUserId"),
+ delete=params.get("delete"),
)
def get_all_params(self, name=None, id=None):
@@ -86,25 +88,25 @@ class NetworksMerakiAuthUsers(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('accountType') is not None or self.new_object.get('account_type') is not None:
+ new_object_params['accountType'] = self.new_object.get('accountType') or \
+ self.new_object.get('account_type')
+ if self.new_object.get('authorizations') is not None or self.new_object.get('authorizations') is not None:
+ new_object_params['authorizations'] = self.new_object.get('authorizations') or \
+ self.new_object.get('authorizations')
if self.new_object.get('email') is not None or self.new_object.get('email') is not None:
new_object_params['email'] = self.new_object.get('email') or \
self.new_object.get('email')
+ if self.new_object.get('emailPasswordToUser') is not None or self.new_object.get('email_password_to_user') is not None:
+ new_object_params['emailPasswordToUser'] = self.new_object.get('emailPasswordToUser')
+ if self.new_object.get('isAdmin') is not None or self.new_object.get('is_admin') is not None:
+ new_object_params['isAdmin'] = self.new_object.get('isAdmin')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
if self.new_object.get('password') is not None or self.new_object.get('password') is not None:
new_object_params['password'] = self.new_object.get('password') or \
self.new_object.get('password')
- if self.new_object.get('accountType') is not None or self.new_object.get('account_type') is not None:
- new_object_params['accountType'] = self.new_object.get('accountType') or \
- self.new_object.get('account_type')
- if self.new_object.get('emailPasswordToUser') is not None or self.new_object.get('email_password_to_user') is not None:
- new_object_params['emailPasswordToUser'] = self.new_object.get('emailPasswordToUser')
- if self.new_object.get('isAdmin') is not None or self.new_object.get('is_admin') is not None:
- new_object_params['isAdmin'] = self.new_object.get('isAdmin')
- if self.new_object.get('authorizations') is not None or self.new_object.get('authorizations') is not None:
- new_object_params['authorizations'] = self.new_object.get('authorizations') or \
- self.new_object.get('authorizations')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -112,6 +114,8 @@ class NetworksMerakiAuthUsers(object):
def delete_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('delete') is not None or self.new_object.get('delete') is not None:
+ new_object_params['delete'] = self.new_object.get('delete')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -122,17 +126,17 @@ class NetworksMerakiAuthUsers(object):
def update_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('authorizations') is not None or self.new_object.get('authorizations') is not None:
+ new_object_params['authorizations'] = self.new_object.get('authorizations') or \
+ self.new_object.get('authorizations')
+ if self.new_object.get('emailPasswordToUser') is not None or self.new_object.get('email_password_to_user') is not None:
+ new_object_params['emailPasswordToUser'] = self.new_object.get('emailPasswordToUser')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
if self.new_object.get('password') is not None or self.new_object.get('password') is not None:
new_object_params['password'] = self.new_object.get('password') or \
self.new_object.get('password')
- if self.new_object.get('emailPasswordToUser') is not None or self.new_object.get('email_password_to_user') is not None:
- new_object_params['emailPasswordToUser'] = self.new_object.get('emailPasswordToUser')
- if self.new_object.get('authorizations') is not None or self.new_object.get('authorizations') is not None:
- new_object_params['authorizations'] = self.new_object.get('authorizations') or \
- self.new_object.get('authorizations')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -210,14 +214,15 @@ class NetworksMerakiAuthUsers(object):
requested_obj = self.new_object
obj_params = [
- ("email", "email"),
- ("name", "name"),
("accountType", "accountType"),
+ ("authorizations", "authorizations"),
+ ("email", "email"),
("emailPasswordToUser", "emailPasswordToUser"),
("isAdmin", "isAdmin"),
- ("authorizations", "authorizations"),
+ ("name", "name"),
("networkId", "networkId"),
("merakiAuthUserId", "merakiAuthUserId"),
+ ("delete", "delete"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (DNAC) params
# If any does not have eq params, it requires update
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_mqtt_brokers.py b/ansible_collections/cisco/meraki/plugins/action/networks_mqtt_brokers.py
index 4313ec519..89e45246e 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_mqtt_brokers.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_mqtt_brokers.py
@@ -25,11 +25,11 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- name=dict(type="str"),
+ authentication=dict(type="dict"),
host=dict(type="str"),
+ name=dict(type="str"),
port=dict(type="int"),
security=dict(type="dict"),
- authentication=dict(type="dict"),
networkId=dict(type="str"),
))
@@ -69,11 +69,11 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- name=params.get("name"),
+ authentication=params.get("authentication"),
host=params.get("host"),
+ name=params.get("name"),
port=params.get("port"),
security=params.get("security"),
- authentication=params.get("authentication"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_netflow.py b/ansible_collections/cisco/meraki/plugins/action/networks_netflow.py
index 0360b2792..730f5518b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_netflow.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_netflow.py
@@ -32,11 +32,11 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- reportingEnabled=dict(type="bool"),
collectorIp=dict(type="str"),
collectorPort=dict(type="int"),
- etaEnabled=dict(type="bool"),
etaDstPort=dict(type="int"),
+ etaEnabled=dict(type="bool"),
+ reportingEnabled=dict(type="bool"),
networkId=dict(type="str"),
))
@@ -52,11 +52,11 @@ class NetworksNetflow(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- reportingEnabled=params.get("reportingEnabled"),
collectorIp=params.get("collectorIp"),
collectorPort=params.get("collectorPort"),
- etaEnabled=params.get("etaEnabled"),
etaDstPort=params.get("etaDstPort"),
+ etaEnabled=params.get("etaEnabled"),
+ reportingEnabled=params.get("reportingEnabled"),
network_id=params.get("networkId"),
)
@@ -69,19 +69,19 @@ class NetworksNetflow(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('reportingEnabled') is not None or self.new_object.get('reporting_enabled') is not None:
- new_object_params['reportingEnabled'] = self.new_object.get('reportingEnabled')
if self.new_object.get('collectorIp') is not None or self.new_object.get('collector_ip') is not None:
new_object_params['collectorIp'] = self.new_object.get('collectorIp') or \
self.new_object.get('collector_ip')
if self.new_object.get('collectorPort') is not None or self.new_object.get('collector_port') is not None:
new_object_params['collectorPort'] = self.new_object.get('collectorPort') or \
self.new_object.get('collector_port')
- if self.new_object.get('etaEnabled') is not None or self.new_object.get('eta_enabled') is not None:
- new_object_params['etaEnabled'] = self.new_object.get('etaEnabled')
if self.new_object.get('etaDstPort') is not None or self.new_object.get('eta_dst_port') is not None:
new_object_params['etaDstPort'] = self.new_object.get('etaDstPort') or \
self.new_object.get('eta_dst_port')
+ if self.new_object.get('etaEnabled') is not None or self.new_object.get('eta_enabled') is not None:
+ new_object_params['etaEnabled'] = self.new_object.get('etaEnabled')
+ if self.new_object.get('reportingEnabled') is not None or self.new_object.get('reporting_enabled') is not None:
+ new_object_params['reportingEnabled'] = self.new_object.get('reportingEnabled')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -138,11 +138,11 @@ class NetworksNetflow(object):
requested_obj = self.new_object
obj_params = [
- ("reportingEnabled", "reportingEnabled"),
("collectorIp", "collectorIp"),
("collectorPort", "collectorPort"),
- ("etaEnabled", "etaEnabled"),
("etaDstPort", "etaDstPort"),
+ ("etaEnabled", "etaEnabled"),
+ ("reportingEnabled", "reportingEnabled"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sensor_alerts_profiles.py b/ansible_collections/cisco/meraki/plugins/action/networks_sensor_alerts_profiles.py
index 13be65175..bb150c8fd 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sensor_alerts_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sensor_alerts_profiles.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- schedule=dict(type="dict"),
conditions=dict(type="list"),
+ name=dict(type="str"),
recipients=dict(type="dict"),
+ schedule=dict(type="dict"),
serials=dict(type="list"),
networkId=dict(type="str"),
id=dict(type="str"),
@@ -54,10 +54,10 @@ class NetworksSensorAlertsProfiles(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- schedule=params.get("schedule"),
conditions=params.get("conditions"),
+ name=params.get("name"),
recipients=params.get("recipients"),
+ schedule=params.get("schedule"),
serials=params.get("serials"),
networkId=params.get("networkId"),
id=params.get("id"),
@@ -81,18 +81,18 @@ class NetworksSensorAlertsProfiles(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('schedule') is not None or self.new_object.get('schedule') is not None:
- new_object_params['schedule'] = self.new_object.get('schedule') or \
- self.new_object.get('schedule')
if self.new_object.get('conditions') is not None or self.new_object.get('conditions') is not None:
new_object_params['conditions'] = self.new_object.get('conditions') or \
self.new_object.get('conditions')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('recipients') is not None or self.new_object.get('recipients') is not None:
new_object_params['recipients'] = self.new_object.get('recipients') or \
self.new_object.get('recipients')
+ if self.new_object.get('schedule') is not None or self.new_object.get('schedule') is not None:
+ new_object_params['schedule'] = self.new_object.get('schedule') or \
+ self.new_object.get('schedule')
if self.new_object.get('serials') is not None or self.new_object.get('serials') is not None:
new_object_params['serials'] = self.new_object.get('serials') or \
self.new_object.get('serials')
@@ -113,18 +113,18 @@ class NetworksSensorAlertsProfiles(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('schedule') is not None or self.new_object.get('schedule') is not None:
- new_object_params['schedule'] = self.new_object.get('schedule') or \
- self.new_object.get('schedule')
if self.new_object.get('conditions') is not None or self.new_object.get('conditions') is not None:
new_object_params['conditions'] = self.new_object.get('conditions') or \
self.new_object.get('conditions')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('recipients') is not None or self.new_object.get('recipients') is not None:
new_object_params['recipients'] = self.new_object.get('recipients') or \
self.new_object.get('recipients')
+ if self.new_object.get('schedule') is not None or self.new_object.get('schedule') is not None:
+ new_object_params['schedule'] = self.new_object.get('schedule') or \
+ self.new_object.get('schedule')
if self.new_object.get('serials') is not None or self.new_object.get('serials') is not None:
new_object_params['serials'] = self.new_object.get('serials') or \
self.new_object.get('serials')
@@ -201,10 +201,10 @@ class NetworksSensorAlertsProfiles(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("schedule", "schedule"),
("conditions", "conditions"),
+ ("name", "name"),
("recipients", "recipients"),
+ ("schedule", "schedule"),
("serials", "serials"),
("networkId", "networkId"),
("id", "id"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_settings.py b/ansible_collections/cisco/meraki/plugins/action/networks_settings.py
index 3827be9c0..26277be99 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_settings.py
@@ -32,9 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ localStatusPage=dict(type="dict"),
localStatusPageEnabled=dict(type="bool"),
+ namedVlans=dict(type="dict"),
remoteStatusPageEnabled=dict(type="bool"),
- localStatusPage=dict(type="dict"),
securePort=dict(type="dict"),
networkId=dict(type="str"),
))
@@ -51,9 +52,10 @@ class NetworksSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ localStatusPage=params.get("localStatusPage"),
localStatusPageEnabled=params.get("localStatusPageEnabled"),
+ namedVlans=params.get("namedVlans"),
remoteStatusPageEnabled=params.get("remoteStatusPageEnabled"),
- localStatusPage=params.get("localStatusPage"),
securePort=params.get("securePort"),
network_id=params.get("networkId"),
)
@@ -67,13 +69,16 @@ class NetworksSettings(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('localStatusPage') is not None or self.new_object.get('local_status_page') is not None:
+ new_object_params['localStatusPage'] = self.new_object.get('localStatusPage') or \
+ self.new_object.get('local_status_page')
if self.new_object.get('localStatusPageEnabled') is not None or self.new_object.get('local_status_page_enabled') is not None:
new_object_params['localStatusPageEnabled'] = self.new_object.get('localStatusPageEnabled')
+ if self.new_object.get('namedVlans') is not None or self.new_object.get('named_vlans') is not None:
+ new_object_params['namedVlans'] = self.new_object.get('namedVlans') or \
+ self.new_object.get('named_vlans')
if self.new_object.get('remoteStatusPageEnabled') is not None or self.new_object.get('remote_status_page_enabled') is not None:
new_object_params['remoteStatusPageEnabled'] = self.new_object.get('remoteStatusPageEnabled')
- if self.new_object.get('localStatusPage') is not None or self.new_object.get('local_status_page') is not None:
- new_object_params['localStatusPage'] = self.new_object.get('localStatusPage') or \
- self.new_object.get('local_status_page')
if self.new_object.get('securePort') is not None or self.new_object.get('secure_port') is not None:
new_object_params['securePort'] = self.new_object.get('securePort') or \
self.new_object.get('secure_port')
@@ -133,9 +138,10 @@ class NetworksSettings(object):
requested_obj = self.new_object
obj_params = [
+ ("localStatusPage", "localStatusPage"),
("localStatusPageEnabled", "localStatusPageEnabled"),
+ ("namedVlans", "namedVlans"),
("remoteStatusPageEnabled", "remoteStatusPageEnabled"),
- ("localStatusPage", "localStatusPage"),
("securePort", "securePort"),
("networkId", "networkId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_checkin.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_checkin.py
index 8695838b5..ba46b4121 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_checkin.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_checkin.py
@@ -25,10 +25,10 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- wifiMacs=dict(type="list"),
ids=dict(type="list"),
- serials=dict(type="list"),
scope=dict(type="list"),
+ serials=dict(type="list"),
+ wifiMacs=dict(type="list"),
networkId=dict(type="str"),
))
@@ -68,10 +68,10 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- wifiMacs=params.get("wifiMacs"),
ids=params.get("ids"),
- serials=params.get("serials"),
scope=params.get("scope"),
+ serials=params.get("serials"),
+ wifiMacs=params.get("wifiMacs"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_fields.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_fields.py
index 6d9bda4c7..7d7ada596 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_fields.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_fields.py
@@ -25,10 +25,10 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- wifiMac=dict(type="str"),
+ deviceFields=dict(type="dict"),
id=dict(type="str"),
serial=dict(type="str"),
- deviceFields=dict(type="dict"),
+ wifiMac=dict(type="str"),
networkId=dict(type="str"),
))
@@ -68,10 +68,10 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- wifiMac=params.get("wifiMac"),
+ deviceFields=params.get("deviceFields"),
id=params.get("id"),
serial=params.get("serial"),
- deviceFields=params.get("deviceFields"),
+ wifiMac=params.get("wifiMac"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_info.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_info.py
index c37f3cc07..e186502cd 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_info.py
@@ -30,6 +30,8 @@ argument_spec.update(dict(
wifiMacs=dict(type="list"),
serials=dict(type="list"),
ids=dict(type="list"),
+ uuids=dict(type="list"),
+ systemTypes=dict(type="list"),
scope=dict(type="list"),
perPage=dict(type="int"),
total_pages=dict(type="int"),
@@ -89,6 +91,12 @@ class ActionModule(ActionBase):
if params.get("ids") is not None:
new_object["ids"] = params.get(
"ids")
+ if params.get("uuids") is not None:
+ new_object["uuids"] = params.get(
+ "uuids")
+ if params.get("systemTypes") is not None:
+ new_object["systemTypes"] = params.get(
+ "systemTypes")
if params.get("scope") is not None:
new_object["scope"] = params.get(
"scope")
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_install_apps.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_install_apps.py
new file mode 100644
index 000000000..5dfbe018f
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_install_apps.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ appIds=dict(type="list"),
+ force=dict(type="bool"),
+ networkId=dict(type="str"),
+ deviceId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ appIds=params.get("appIds"),
+ force=params.get("force"),
+ networkId=params.get("networkId"),
+ deviceId=params.get("deviceId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="sm",
+ function='installNetworkSmDeviceApps',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_lock.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_lock.py
index c846a4dde..8f851fe0a 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_lock.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_lock.py
@@ -25,11 +25,11 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- wifiMacs=dict(type="list"),
ids=dict(type="list"),
- serials=dict(type="list"),
- scope=dict(type="list"),
pin=dict(type="int"),
+ scope=dict(type="list"),
+ serials=dict(type="list"),
+ wifiMacs=dict(type="list"),
networkId=dict(type="str"),
))
@@ -69,11 +69,11 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- wifiMacs=params.get("wifiMacs"),
ids=params.get("ids"),
- serials=params.get("serials"),
- scope=params.get("scope"),
pin=params.get("pin"),
+ scope=params.get("scope"),
+ serials=params.get("serials"),
+ wifiMacs=params.get("wifiMacs"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_modify_tags.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_modify_tags.py
index ea771b977..27f47614e 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_modify_tags.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_modify_tags.py
@@ -25,12 +25,12 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- wifiMacs=dict(type="list"),
ids=dict(type="list"),
- serials=dict(type="list"),
scope=dict(type="list"),
+ serials=dict(type="list"),
tags=dict(type="list"),
updateAction=dict(type="str"),
+ wifiMacs=dict(type="list"),
networkId=dict(type="str"),
))
@@ -70,12 +70,12 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- wifiMacs=params.get("wifiMacs"),
ids=params.get("ids"),
- serials=params.get("serials"),
scope=params.get("scope"),
+ serials=params.get("serials"),
tags=params.get("tags"),
updateAction=params.get("updateAction"),
+ wifiMacs=params.get("wifiMacs"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_move.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_move.py
index 5ed4b5d65..384f3abf0 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_move.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_move.py
@@ -25,11 +25,11 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- wifiMacs=dict(type="list"),
ids=dict(type="list"),
- serials=dict(type="list"),
- scope=dict(type="list"),
newNetwork=dict(type="str"),
+ scope=dict(type="list"),
+ serials=dict(type="list"),
+ wifiMacs=dict(type="list"),
networkId=dict(type="str"),
))
@@ -69,11 +69,11 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- wifiMacs=params.get("wifiMacs"),
ids=params.get("ids"),
- serials=params.get("serials"),
- scope=params.get("scope"),
newNetwork=params.get("newNetwork"),
+ scope=params.get("scope"),
+ serials=params.get("serials"),
+ wifiMacs=params.get("wifiMacs"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_reboot.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_reboot.py
new file mode 100644
index 000000000..16e825308
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_reboot.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ ids=dict(type="list"),
+ kextPaths=dict(type="list"),
+ notifyUser=dict(type="bool"),
+ rebuildKernelCache=dict(type="bool"),
+ requestRequiresNetworkTether=dict(type="bool"),
+ scope=dict(type="list"),
+ serials=dict(type="list"),
+ wifiMacs=dict(type="list"),
+ networkId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ ids=params.get("ids"),
+ kextPaths=params.get("kextPaths"),
+ notifyUser=params.get("notifyUser"),
+ rebuildKernelCache=params.get("rebuildKernelCache"),
+ requestRequiresNetworkTether=params.get("requestRequiresNetworkTether"),
+ scope=params.get("scope"),
+ serials=params.get("serials"),
+ wifiMacs=params.get("wifiMacs"),
+ networkId=params.get("networkId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="sm",
+ function='rebootNetworkSmDevices',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_shutdown.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_shutdown.py
new file mode 100644
index 000000000..fb184208c
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_shutdown.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ ids=dict(type="list"),
+ scope=dict(type="list"),
+ serials=dict(type="list"),
+ wifiMacs=dict(type="list"),
+ networkId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ ids=params.get("ids"),
+ scope=params.get("scope"),
+ serials=params.get("serials"),
+ wifiMacs=params.get("wifiMacs"),
+ networkId=params.get("networkId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="sm",
+ function='shutdownNetworkSmDevices',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_uninstall_apps.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_uninstall_apps.py
new file mode 100644
index 000000000..056734402
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_uninstall_apps.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ appIds=dict(type="list"),
+ networkId=dict(type="str"),
+ deviceId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ appIds=params.get("appIds"),
+ networkId=params.get("networkId"),
+ deviceId=params.get("deviceId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="sm",
+ function='uninstallNetworkSmDeviceApps',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wipe.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wipe.py
index 1b20cad81..ca334bd8c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wipe.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_devices_wipe.py
@@ -25,10 +25,10 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
- wifiMac=dict(type="str"),
id=dict(type="str"),
- serial=dict(type="str"),
pin=dict(type="int"),
+ serial=dict(type="str"),
+ wifiMac=dict(type="str"),
networkId=dict(type="str"),
))
@@ -68,10 +68,10 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
- wifiMac=params.get("wifiMac"),
id=params.get("id"),
- serial=params.get("serial"),
pin=params.get("pin"),
+ serial=params.get("serial"),
+ wifiMac=params.get("wifiMac"),
networkId=params.get("networkId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_sm_profiles_info.py b/ansible_collections/cisco/meraki/plugins/action/networks_sm_profiles_info.py
index 44ab17a59..d834af8b9 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_sm_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_sm_profiles_info.py
@@ -26,6 +26,7 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
networkId=dict(type="str"),
+ payloadTypes=dict(type="list"),
))
required_if = []
@@ -67,6 +68,9 @@ class ActionModule(ActionBase):
if params.get("networkId") is not None:
new_object["networkId"] = params.get(
"networkId")
+ if params.get("payloadTypes") is not None:
+ new_object["payloadTypes"] = params.get(
+ "payloadTypes")
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_access_policies.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_access_policies.py
index a56a7f0dd..aef2813a9 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_access_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_access_policies.py
@@ -32,23 +32,23 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ accessPolicyType=dict(type="str"),
+ dot1x=dict(type="dict"),
+ guestPortBouncing=dict(type="bool"),
+ guestVlanId=dict(type="int"),
+ hostMode=dict(type="str"),
+ increaseAccessSpeed=dict(type="bool"),
name=dict(type="str"),
- radiusServers=dict(type="list"),
radius=dict(type="dict"),
- guestPortBouncing=dict(type="bool"),
- radiusTestingEnabled=dict(type="bool"),
- radiusCoaSupportEnabled=dict(type="bool"),
radiusAccountingEnabled=dict(type="bool"),
radiusAccountingServers=dict(type="list"),
+ radiusCoaSupportEnabled=dict(type="bool"),
radiusGroupAttribute=dict(type="str"),
- hostMode=dict(type="str"),
- accessPolicyType=dict(type="str"),
- increaseAccessSpeed=dict(type="bool"),
- guestVlanId=dict(type="int"),
- dot1x=dict(type="dict"),
- voiceVlanClients=dict(type="bool"),
+ radiusServers=dict(type="list"),
+ radiusTestingEnabled=dict(type="bool"),
urlRedirectWalledGardenEnabled=dict(type="bool"),
urlRedirectWalledGardenRanges=dict(type="list"),
+ voiceVlanClients=dict(type="bool"),
networkId=dict(type="str"),
accessPolicyNumber=dict(type="str"),
))
@@ -66,25 +66,23 @@ class NetworksSwitchAccessPolicies(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ accessPolicyType=params.get("accessPolicyType"),
+ dot1x=params.get("dot1x"),
+ guestPortBouncing=params.get("guestPortBouncing"),
+ guestVlanId=params.get("guestVlanId"),
+ hostMode=params.get("hostMode"),
+ increaseAccessSpeed=params.get("increaseAccessSpeed"),
name=params.get("name"),
- radiusServers=params.get("radiusServers"),
radius=params.get("radius"),
- guestPortBouncing=params.get("guestPortBouncing"),
- radiusTestingEnabled=params.get("radiusTestingEnabled"),
- radiusCoaSupportEnabled=params.get("radiusCoaSupportEnabled"),
radiusAccountingEnabled=params.get("radiusAccountingEnabled"),
radiusAccountingServers=params.get("radiusAccountingServers"),
+ radiusCoaSupportEnabled=params.get("radiusCoaSupportEnabled"),
radiusGroupAttribute=params.get("radiusGroupAttribute"),
- hostMode=params.get("hostMode"),
- accessPolicyType=params.get("accessPolicyType"),
- increaseAccessSpeed=params.get("increaseAccessSpeed"),
- guestVlanId=params.get("guestVlanId"),
- dot1x=params.get("dot1x"),
+ radiusServers=params.get("radiusServers"),
+ radiusTestingEnabled=params.get("radiusTestingEnabled"),
+ urlRedirectWalledGardenEnabled=params.get("urlRedirectWalledGardenEnabled"),
+ urlRedirectWalledGardenRanges=params.get("urlRedirectWalledGardenRanges"),
voiceVlanClients=params.get("voiceVlanClients"),
- urlRedirectWalledGardenEnabled=params.get(
- "urlRedirectWalledGardenEnabled"),
- urlRedirectWalledGardenRanges=params.get(
- "urlRedirectWalledGardenRanges"),
networkId=params.get("networkId"),
accessPolicyNumber=params.get("accessPolicyNumber"),
)
@@ -108,57 +106,50 @@ class NetworksSwitchAccessPolicies(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
+ new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
+ self.new_object.get('access_policy_type')
+ if self.new_object.get('dot1x') is not None or self.new_object.get('dot1x') is not None:
+ new_object_params['dot1x'] = self.new_object.get('dot1x') or \
+ self.new_object.get('dot1x')
+ if self.new_object.get('guestPortBouncing') is not None or self.new_object.get('guest_port_bouncing') is not None:
+ new_object_params['guestPortBouncing'] = self.new_object.get('guestPortBouncing')
+ if self.new_object.get('guestVlanId') is not None or self.new_object.get('guest_vlan_id') is not None:
+ new_object_params['guestVlanId'] = self.new_object.get('guestVlanId') or \
+ self.new_object.get('guest_vlan_id')
+ if self.new_object.get('hostMode') is not None or self.new_object.get('host_mode') is not None:
+ new_object_params['hostMode'] = self.new_object.get('hostMode') or \
+ self.new_object.get('host_mode')
+ if self.new_object.get('increaseAccessSpeed') is not None or self.new_object.get('increase_access_speed') is not None:
+ new_object_params['increaseAccessSpeed'] = self.new_object.get('increaseAccessSpeed')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('radiusServers') is not None or self.new_object.get('radius_servers') is not None:
- new_object_params['radiusServers'] = self.new_object.get('radiusServers') or \
- self.new_object.get('radius_servers')
if self.new_object.get('radius') is not None or self.new_object.get('radius') is not None:
new_object_params['radius'] = self.new_object.get('radius') or \
self.new_object.get('radius')
- if self.new_object.get('guestPortBouncing') is not None or self.new_object.get('guest_port_bouncing') is not None:
- new_object_params['guestPortBouncing'] = self.new_object.get(
- 'guestPortBouncing')
- if self.new_object.get('radiusTestingEnabled') is not None or self.new_object.get('radius_testing_enabled') is not None:
- new_object_params['radiusTestingEnabled'] = self.new_object.get(
- 'radiusTestingEnabled')
- if self.new_object.get('radiusCoaSupportEnabled') is not None or self.new_object.get('radius_coa_support_enabled') is not None:
- new_object_params['radiusCoaSupportEnabled'] = self.new_object.get(
- 'radiusCoaSupportEnabled')
if self.new_object.get('radiusAccountingEnabled') is not None or self.new_object.get('radius_accounting_enabled') is not None:
- new_object_params['radiusAccountingEnabled'] = self.new_object.get(
- 'radiusAccountingEnabled')
+ new_object_params['radiusAccountingEnabled'] = self.new_object.get('radiusAccountingEnabled')
if self.new_object.get('radiusAccountingServers') is not None or self.new_object.get('radius_accounting_servers') is not None:
new_object_params['radiusAccountingServers'] = self.new_object.get('radiusAccountingServers') or \
self.new_object.get('radius_accounting_servers')
+ if self.new_object.get('radiusCoaSupportEnabled') is not None or self.new_object.get('radius_coa_support_enabled') is not None:
+ new_object_params['radiusCoaSupportEnabled'] = self.new_object.get('radiusCoaSupportEnabled')
if self.new_object.get('radiusGroupAttribute') is not None or self.new_object.get('radius_group_attribute') is not None:
new_object_params['radiusGroupAttribute'] = self.new_object.get('radiusGroupAttribute') or \
self.new_object.get('radius_group_attribute')
- if self.new_object.get('hostMode') is not None or self.new_object.get('host_mode') is not None:
- new_object_params['hostMode'] = self.new_object.get('hostMode') or \
- self.new_object.get('host_mode')
- if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
- new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
- self.new_object.get('access_policy_type')
- if self.new_object.get('increaseAccessSpeed') is not None or self.new_object.get('increase_access_speed') is not None:
- new_object_params['increaseAccessSpeed'] = self.new_object.get(
- 'increaseAccessSpeed')
- if self.new_object.get('guestVlanId') is not None or self.new_object.get('guest_vlan_id') is not None:
- new_object_params['guestVlanId'] = self.new_object.get('guestVlanId') or \
- self.new_object.get('guest_vlan_id')
- if self.new_object.get('dot1x') is not None or self.new_object.get('dot1x') is not None:
- new_object_params['dot1x'] = self.new_object.get('dot1x') or \
- self.new_object.get('dot1x')
- if self.new_object.get('voiceVlanClients') is not None or self.new_object.get('voice_vlan_clients') is not None:
- new_object_params['voiceVlanClients'] = self.new_object.get(
- 'voiceVlanClients')
+ if self.new_object.get('radiusServers') is not None or self.new_object.get('radius_servers') is not None:
+ new_object_params['radiusServers'] = self.new_object.get('radiusServers') or \
+ self.new_object.get('radius_servers')
+ if self.new_object.get('radiusTestingEnabled') is not None or self.new_object.get('radius_testing_enabled') is not None:
+ new_object_params['radiusTestingEnabled'] = self.new_object.get('radiusTestingEnabled')
if self.new_object.get('urlRedirectWalledGardenEnabled') is not None or self.new_object.get('url_redirect_walled_garden_enabled') is not None:
- new_object_params['urlRedirectWalledGardenEnabled'] = self.new_object.get(
- 'urlRedirectWalledGardenEnabled')
+ new_object_params['urlRedirectWalledGardenEnabled'] = self.new_object.get('urlRedirectWalledGardenEnabled')
if self.new_object.get('urlRedirectWalledGardenRanges') is not None or self.new_object.get('url_redirect_walled_garden_ranges') is not None:
new_object_params['urlRedirectWalledGardenRanges'] = self.new_object.get('urlRedirectWalledGardenRanges') or \
self.new_object.get('url_redirect_walled_garden_ranges')
+ if self.new_object.get('voiceVlanClients') is not None or self.new_object.get('voice_vlan_clients') is not None:
+ new_object_params['voiceVlanClients'] = self.new_object.get('voiceVlanClients')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -176,57 +167,50 @@ class NetworksSwitchAccessPolicies(object):
def update_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
+ new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
+ self.new_object.get('access_policy_type')
+ if self.new_object.get('dot1x') is not None or self.new_object.get('dot1x') is not None:
+ new_object_params['dot1x'] = self.new_object.get('dot1x') or \
+ self.new_object.get('dot1x')
+ if self.new_object.get('guestPortBouncing') is not None or self.new_object.get('guest_port_bouncing') is not None:
+ new_object_params['guestPortBouncing'] = self.new_object.get('guestPortBouncing')
+ if self.new_object.get('guestVlanId') is not None or self.new_object.get('guest_vlan_id') is not None:
+ new_object_params['guestVlanId'] = self.new_object.get('guestVlanId') or \
+ self.new_object.get('guest_vlan_id')
+ if self.new_object.get('hostMode') is not None or self.new_object.get('host_mode') is not None:
+ new_object_params['hostMode'] = self.new_object.get('hostMode') or \
+ self.new_object.get('host_mode')
+ if self.new_object.get('increaseAccessSpeed') is not None or self.new_object.get('increase_access_speed') is not None:
+ new_object_params['increaseAccessSpeed'] = self.new_object.get('increaseAccessSpeed')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('radiusServers') is not None or self.new_object.get('radius_servers') is not None:
- new_object_params['radiusServers'] = self.new_object.get('radiusServers') or \
- self.new_object.get('radius_servers')
if self.new_object.get('radius') is not None or self.new_object.get('radius') is not None:
new_object_params['radius'] = self.new_object.get('radius') or \
self.new_object.get('radius')
- if self.new_object.get('guestPortBouncing') is not None or self.new_object.get('guest_port_bouncing') is not None:
- new_object_params['guestPortBouncing'] = self.new_object.get(
- 'guestPortBouncing')
- if self.new_object.get('radiusTestingEnabled') is not None or self.new_object.get('radius_testing_enabled') is not None:
- new_object_params['radiusTestingEnabled'] = self.new_object.get(
- 'radiusTestingEnabled')
- if self.new_object.get('radiusCoaSupportEnabled') is not None or self.new_object.get('radius_coa_support_enabled') is not None:
- new_object_params['radiusCoaSupportEnabled'] = self.new_object.get(
- 'radiusCoaSupportEnabled')
if self.new_object.get('radiusAccountingEnabled') is not None or self.new_object.get('radius_accounting_enabled') is not None:
- new_object_params['radiusAccountingEnabled'] = self.new_object.get(
- 'radiusAccountingEnabled')
+ new_object_params['radiusAccountingEnabled'] = self.new_object.get('radiusAccountingEnabled')
if self.new_object.get('radiusAccountingServers') is not None or self.new_object.get('radius_accounting_servers') is not None:
new_object_params['radiusAccountingServers'] = self.new_object.get('radiusAccountingServers') or \
self.new_object.get('radius_accounting_servers')
+ if self.new_object.get('radiusCoaSupportEnabled') is not None or self.new_object.get('radius_coa_support_enabled') is not None:
+ new_object_params['radiusCoaSupportEnabled'] = self.new_object.get('radiusCoaSupportEnabled')
if self.new_object.get('radiusGroupAttribute') is not None or self.new_object.get('radius_group_attribute') is not None:
new_object_params['radiusGroupAttribute'] = self.new_object.get('radiusGroupAttribute') or \
self.new_object.get('radius_group_attribute')
- if self.new_object.get('hostMode') is not None or self.new_object.get('host_mode') is not None:
- new_object_params['hostMode'] = self.new_object.get('hostMode') or \
- self.new_object.get('host_mode')
- if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
- new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
- self.new_object.get('access_policy_type')
- if self.new_object.get('increaseAccessSpeed') is not None or self.new_object.get('increase_access_speed') is not None:
- new_object_params['increaseAccessSpeed'] = self.new_object.get(
- 'increaseAccessSpeed')
- if self.new_object.get('guestVlanId') is not None or self.new_object.get('guest_vlan_id') is not None:
- new_object_params['guestVlanId'] = self.new_object.get('guestVlanId') or \
- self.new_object.get('guest_vlan_id')
- if self.new_object.get('dot1x') is not None or self.new_object.get('dot1x') is not None:
- new_object_params['dot1x'] = self.new_object.get('dot1x') or \
- self.new_object.get('dot1x')
- if self.new_object.get('voiceVlanClients') is not None or self.new_object.get('voice_vlan_clients') is not None:
- new_object_params['voiceVlanClients'] = self.new_object.get(
- 'voiceVlanClients')
+ if self.new_object.get('radiusServers') is not None or self.new_object.get('radius_servers') is not None:
+ new_object_params['radiusServers'] = self.new_object.get('radiusServers') or \
+ self.new_object.get('radius_servers')
+ if self.new_object.get('radiusTestingEnabled') is not None or self.new_object.get('radius_testing_enabled') is not None:
+ new_object_params['radiusTestingEnabled'] = self.new_object.get('radiusTestingEnabled')
if self.new_object.get('urlRedirectWalledGardenEnabled') is not None or self.new_object.get('url_redirect_walled_garden_enabled') is not None:
- new_object_params['urlRedirectWalledGardenEnabled'] = self.new_object.get(
- 'urlRedirectWalledGardenEnabled')
+ new_object_params['urlRedirectWalledGardenEnabled'] = self.new_object.get('urlRedirectWalledGardenEnabled')
if self.new_object.get('urlRedirectWalledGardenRanges') is not None or self.new_object.get('url_redirect_walled_garden_ranges') is not None:
new_object_params['urlRedirectWalledGardenRanges'] = self.new_object.get('urlRedirectWalledGardenRanges') or \
self.new_object.get('url_redirect_walled_garden_ranges')
+ if self.new_object.get('voiceVlanClients') is not None or self.new_object.get('voice_vlan_clients') is not None:
+ new_object_params['voiceVlanClients'] = self.new_object.get('voiceVlanClients')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -304,23 +288,23 @@ class NetworksSwitchAccessPolicies(object):
requested_obj = self.new_object
obj_params = [
+ ("accessPolicyType", "accessPolicyType"),
+ ("dot1x", "dot1x"),
+ ("guestPortBouncing", "guestPortBouncing"),
+ ("guestVlanId", "guestVlanId"),
+ ("hostMode", "hostMode"),
+ ("increaseAccessSpeed", "increaseAccessSpeed"),
("name", "name"),
- ("radiusServers", "radiusServers"),
("radius", "radius"),
- ("guestPortBouncing", "guestPortBouncing"),
- ("radiusTestingEnabled", "radiusTestingEnabled"),
- ("radiusCoaSupportEnabled", "radiusCoaSupportEnabled"),
("radiusAccountingEnabled", "radiusAccountingEnabled"),
("radiusAccountingServers", "radiusAccountingServers"),
+ ("radiusCoaSupportEnabled", "radiusCoaSupportEnabled"),
("radiusGroupAttribute", "radiusGroupAttribute"),
- ("hostMode", "hostMode"),
- ("accessPolicyType", "accessPolicyType"),
- ("increaseAccessSpeed", "increaseAccessSpeed"),
- ("guestVlanId", "guestVlanId"),
- ("dot1x", "dot1x"),
- ("voiceVlanClients", "voiceVlanClients"),
+ ("radiusServers", "radiusServers"),
+ ("radiusTestingEnabled", "radiusTestingEnabled"),
("urlRedirectWalledGardenEnabled", "urlRedirectWalledGardenEnabled"),
("urlRedirectWalledGardenRanges", "urlRedirectWalledGardenRanges"),
+ ("voiceVlanClients", "voiceVlanClients"),
("networkId", "networkId"),
("accessPolicyNumber", "accessPolicyNumber"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_alternate_management_interface.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_alternate_management_interface.py
index 7fd38d4f3..02d8d2c0c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_alternate_management_interface.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_alternate_management_interface.py
@@ -33,9 +33,9 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
enabled=dict(type="bool"),
- vlanId=dict(type="int"),
protocols=dict(type="list"),
switches=dict(type="list"),
+ vlanId=dict(type="int"),
networkId=dict(type="str"),
))
@@ -52,9 +52,9 @@ class NetworksSwitchAlternateManagementInterface(object):
self.meraki = meraki
self.new_object = dict(
enabled=params.get("enabled"),
- vlanId=params.get("vlanId"),
protocols=params.get("protocols"),
switches=params.get("switches"),
+ vlanId=params.get("vlanId"),
network_id=params.get("networkId"),
)
@@ -69,15 +69,15 @@ class NetworksSwitchAlternateManagementInterface(object):
new_object_params = {}
if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
new_object_params['enabled'] = self.new_object.get('enabled')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
- new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id')
if self.new_object.get('protocols') is not None or self.new_object.get('protocols') is not None:
new_object_params['protocols'] = self.new_object.get('protocols') or \
self.new_object.get('protocols')
if self.new_object.get('switches') is not None or self.new_object.get('switches') is not None:
new_object_params['switches'] = self.new_object.get('switches') or \
self.new_object.get('switches')
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
+ new_object_params['vlanId'] = self.new_object.get('vlanId') or \
+ self.new_object.get('vlan_id')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -135,9 +135,9 @@ class NetworksSwitchAlternateManagementInterface(object):
obj_params = [
("enabled", "enabled"),
- ("vlanId", "vlanId"),
("protocols", "protocols"),
("switches", "switches"),
+ ("vlanId", "vlanId"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy.py
index 70dae83da..4e3434058 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy.py
@@ -33,10 +33,10 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
alerts=dict(type="dict"),
- defaultPolicy=dict(type="str"),
allowedServers=dict(type="list"),
- blockedServers=dict(type="list"),
arpInspection=dict(type="dict"),
+ blockedServers=dict(type="list"),
+ defaultPolicy=dict(type="str"),
networkId=dict(type="str"),
))
@@ -53,10 +53,10 @@ class NetworksSwitchDhcpServerPolicy(object):
self.meraki = meraki
self.new_object = dict(
alerts=params.get("alerts"),
- defaultPolicy=params.get("defaultPolicy"),
allowedServers=params.get("allowedServers"),
- blockedServers=params.get("blockedServers"),
arpInspection=params.get("arpInspection"),
+ blockedServers=params.get("blockedServers"),
+ defaultPolicy=params.get("defaultPolicy"),
network_id=params.get("networkId"),
)
@@ -72,18 +72,18 @@ class NetworksSwitchDhcpServerPolicy(object):
if self.new_object.get('alerts') is not None or self.new_object.get('alerts') is not None:
new_object_params['alerts'] = self.new_object.get('alerts') or \
self.new_object.get('alerts')
- if self.new_object.get('defaultPolicy') is not None or self.new_object.get('default_policy') is not None:
- new_object_params['defaultPolicy'] = self.new_object.get('defaultPolicy') or \
- self.new_object.get('default_policy')
if self.new_object.get('allowedServers') is not None or self.new_object.get('allowed_servers') is not None:
new_object_params['allowedServers'] = self.new_object.get('allowedServers') or \
self.new_object.get('allowed_servers')
- if self.new_object.get('blockedServers') is not None or self.new_object.get('blocked_servers') is not None:
- new_object_params['blockedServers'] = self.new_object.get('blockedServers') or \
- self.new_object.get('blocked_servers')
if self.new_object.get('arpInspection') is not None or self.new_object.get('arp_inspection') is not None:
new_object_params['arpInspection'] = self.new_object.get('arpInspection') or \
self.new_object.get('arp_inspection')
+ if self.new_object.get('blockedServers') is not None or self.new_object.get('blocked_servers') is not None:
+ new_object_params['blockedServers'] = self.new_object.get('blockedServers') or \
+ self.new_object.get('blocked_servers')
+ if self.new_object.get('defaultPolicy') is not None or self.new_object.get('default_policy') is not None:
+ new_object_params['defaultPolicy'] = self.new_object.get('defaultPolicy') or \
+ self.new_object.get('default_policy')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -141,10 +141,10 @@ class NetworksSwitchDhcpServerPolicy(object):
obj_params = [
("alerts", "alerts"),
- ("defaultPolicy", "defaultPolicy"),
("allowedServers", "allowedServers"),
- ("blockedServers", "blockedServers"),
("arpInspection", "arpInspection"),
+ ("blockedServers", "blockedServers"),
+ ("defaultPolicy", "defaultPolicy"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py
index d0bd4b120..e6110049d 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ ipv4=dict(type="dict"),
mac=dict(type="str"),
vlan=dict(type="int"),
- ipv4=dict(type="dict"),
networkId=dict(type="str"),
trustedServerId=dict(type="str"),
))
@@ -52,9 +52,9 @@ class NetworksSwitchDhcpServerPolicyArpInspectionTrustedServers(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ ipv4=params.get("ipv4"),
mac=params.get("mac"),
vlan=params.get("vlan"),
- ipv4=params.get("ipv4"),
networkId=params.get("networkId"),
trustedServerId=params.get("trustedServerId"),
)
@@ -78,15 +78,15 @@ class NetworksSwitchDhcpServerPolicyArpInspectionTrustedServers(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('ipv4') is not None or self.new_object.get('ipv4') is not None:
+ new_object_params['ipv4'] = self.new_object.get('ipv4') or \
+ self.new_object.get('ipv4')
if self.new_object.get('mac') is not None or self.new_object.get('mac') is not None:
new_object_params['mac'] = self.new_object.get('mac') or \
self.new_object.get('mac')
if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
new_object_params['vlan'] = self.new_object.get('vlan') or \
self.new_object.get('vlan')
- if self.new_object.get('ipv4') is not None or self.new_object.get('ipv4') is not None:
- new_object_params['ipv4'] = self.new_object.get('ipv4') or \
- self.new_object.get('ipv4')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -104,15 +104,15 @@ class NetworksSwitchDhcpServerPolicyArpInspectionTrustedServers(object):
def update_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('ipv4') is not None or self.new_object.get('ipv4') is not None:
+ new_object_params['ipv4'] = self.new_object.get('ipv4') or \
+ self.new_object.get('ipv4')
if self.new_object.get('mac') is not None or self.new_object.get('mac') is not None:
new_object_params['mac'] = self.new_object.get('mac') or \
self.new_object.get('mac')
if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
new_object_params['vlan'] = self.new_object.get('vlan') or \
self.new_object.get('vlan')
- if self.new_object.get('ipv4') is not None or self.new_object.get('ipv4') is not None:
- new_object_params['ipv4'] = self.new_object.get('ipv4') or \
- self.new_object.get('ipv4')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -189,9 +189,9 @@ class NetworksSwitchDhcpServerPolicyArpInspectionTrustedServers(object):
requested_obj = self.new_object
obj_params = [
+ ("ipv4", "ipv4"),
("mac", "mac"),
("vlan", "vlan"),
- ("ipv4", "ipv4"),
("networkId", "networkId"),
("trustedServerId", "trustedServerId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_qos_rules_order.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_qos_rules_order.py
index 33841d11c..430d78211 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_qos_rules_order.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_qos_rules_order.py
@@ -32,13 +32,13 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- vlan=dict(type="int"),
+ dscp=dict(type="int"),
+ dstPort=dict(type="int"),
+ dstPortRange=dict(type="str"),
protocol=dict(type="str"),
srcPort=dict(type="int"),
srcPortRange=dict(type="str"),
- dstPort=dict(type="int"),
- dstPortRange=dict(type="str"),
- dscp=dict(type="int"),
+ vlan=dict(type="int"),
networkId=dict(type="str"),
qosRuleId=dict(type="str"),
))
@@ -56,13 +56,13 @@ class NetworksSwitchQosRulesOrder(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- vlan=params.get("vlan"),
+ dscp=params.get("dscp"),
+ dstPort=params.get("dstPort"),
+ dstPortRange=params.get("dstPortRange"),
protocol=params.get("protocol"),
srcPort=params.get("srcPort"),
srcPortRange=params.get("srcPortRange"),
- dstPort=params.get("dstPort"),
- dstPortRange=params.get("dstPortRange"),
- dscp=params.get("dscp"),
+ vlan=params.get("vlan"),
networkId=params.get("networkId"),
qosRuleId=params.get("qosRuleId"),
)
@@ -86,9 +86,15 @@ class NetworksSwitchQosRulesOrder(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
- new_object_params['vlan'] = self.new_object.get('vlan') or \
- self.new_object.get('vlan')
+ if self.new_object.get('dscp') is not None or self.new_object.get('dscp') is not None:
+ new_object_params['dscp'] = self.new_object.get('dscp') or \
+ self.new_object.get('dscp')
+ if self.new_object.get('dstPort') is not None or self.new_object.get('dst_port') is not None:
+ new_object_params['dstPort'] = self.new_object.get('dstPort') or \
+ self.new_object.get('dst_port')
+ if self.new_object.get('dstPortRange') is not None or self.new_object.get('dst_port_range') is not None:
+ new_object_params['dstPortRange'] = self.new_object.get('dstPortRange') or \
+ self.new_object.get('dst_port_range')
if self.new_object.get('protocol') is not None or self.new_object.get('protocol') is not None:
new_object_params['protocol'] = self.new_object.get('protocol') or \
self.new_object.get('protocol')
@@ -98,15 +104,9 @@ class NetworksSwitchQosRulesOrder(object):
if self.new_object.get('srcPortRange') is not None or self.new_object.get('src_port_range') is not None:
new_object_params['srcPortRange'] = self.new_object.get('srcPortRange') or \
self.new_object.get('src_port_range')
- if self.new_object.get('dstPort') is not None or self.new_object.get('dst_port') is not None:
- new_object_params['dstPort'] = self.new_object.get('dstPort') or \
- self.new_object.get('dst_port')
- if self.new_object.get('dstPortRange') is not None or self.new_object.get('dst_port_range') is not None:
- new_object_params['dstPortRange'] = self.new_object.get('dstPortRange') or \
- self.new_object.get('dst_port_range')
- if self.new_object.get('dscp') is not None or self.new_object.get('dscp') is not None:
- new_object_params['dscp'] = self.new_object.get('dscp') or \
- self.new_object.get('dscp')
+ if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
+ new_object_params['vlan'] = self.new_object.get('vlan') or \
+ self.new_object.get('vlan')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -124,9 +124,15 @@ class NetworksSwitchQosRulesOrder(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
- new_object_params['vlan'] = self.new_object.get('vlan') or \
- self.new_object.get('vlan')
+ if self.new_object.get('dscp') is not None or self.new_object.get('dscp') is not None:
+ new_object_params['dscp'] = self.new_object.get('dscp') or \
+ self.new_object.get('dscp')
+ if self.new_object.get('dstPort') is not None or self.new_object.get('dst_port') is not None:
+ new_object_params['dstPort'] = self.new_object.get('dstPort') or \
+ self.new_object.get('dst_port')
+ if self.new_object.get('dstPortRange') is not None or self.new_object.get('dst_port_range') is not None:
+ new_object_params['dstPortRange'] = self.new_object.get('dstPortRange') or \
+ self.new_object.get('dst_port_range')
if self.new_object.get('protocol') is not None or self.new_object.get('protocol') is not None:
new_object_params['protocol'] = self.new_object.get('protocol') or \
self.new_object.get('protocol')
@@ -136,15 +142,9 @@ class NetworksSwitchQosRulesOrder(object):
if self.new_object.get('srcPortRange') is not None or self.new_object.get('src_port_range') is not None:
new_object_params['srcPortRange'] = self.new_object.get('srcPortRange') or \
self.new_object.get('src_port_range')
- if self.new_object.get('dstPort') is not None or self.new_object.get('dst_port') is not None:
- new_object_params['dstPort'] = self.new_object.get('dstPort') or \
- self.new_object.get('dst_port')
- if self.new_object.get('dstPortRange') is not None or self.new_object.get('dst_port_range') is not None:
- new_object_params['dstPortRange'] = self.new_object.get('dstPortRange') or \
- self.new_object.get('dst_port_range')
- if self.new_object.get('dscp') is not None or self.new_object.get('dscp') is not None:
- new_object_params['dscp'] = self.new_object.get('dscp') or \
- self.new_object.get('dscp')
+ if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
+ new_object_params['vlan'] = self.new_object.get('vlan') or \
+ self.new_object.get('vlan')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -222,13 +222,13 @@ class NetworksSwitchQosRulesOrder(object):
requested_obj = self.new_object
obj_params = [
- ("vlan", "vlan"),
+ ("dscp", "dscp"),
+ ("dstPort", "dstPort"),
+ ("dstPortRange", "dstPortRange"),
("protocol", "protocol"),
("srcPort", "srcPort"),
("srcPortRange", "srcPortRange"),
- ("dstPort", "dstPort"),
- ("dstPortRange", "dstPortRange"),
- ("dscp", "dscp"),
+ ("vlan", "vlan"),
("networkId", "networkId"),
("qosRuleId", "qosRuleId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_routing_ospf.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_routing_ospf.py
index ec0eed0ee..aa72b735c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_routing_ospf.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_routing_ospf.py
@@ -32,13 +32,13 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ areas=dict(type="list"),
+ deadTimerInSeconds=dict(type="int"),
enabled=dict(type="bool"),
helloTimerInSeconds=dict(type="int"),
- deadTimerInSeconds=dict(type="int"),
- areas=dict(type="list"),
- v3=dict(type="dict"),
md5AuthenticationEnabled=dict(type="bool"),
md5AuthenticationKey=dict(type="dict"),
+ v3=dict(type="dict"),
networkId=dict(type="str"),
))
@@ -54,13 +54,13 @@ class NetworksSwitchRoutingOspf(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ areas=params.get("areas"),
+ deadTimerInSeconds=params.get("deadTimerInSeconds"),
enabled=params.get("enabled"),
helloTimerInSeconds=params.get("helloTimerInSeconds"),
- deadTimerInSeconds=params.get("deadTimerInSeconds"),
- areas=params.get("areas"),
- v3=params.get("v3"),
md5AuthenticationEnabled=params.get("md5AuthenticationEnabled"),
md5AuthenticationKey=params.get("md5AuthenticationKey"),
+ v3=params.get("v3"),
network_id=params.get("networkId"),
)
@@ -73,25 +73,25 @@ class NetworksSwitchRoutingOspf(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('areas') is not None or self.new_object.get('areas') is not None:
+ new_object_params['areas'] = self.new_object.get('areas') or \
+ self.new_object.get('areas')
+ if self.new_object.get('deadTimerInSeconds') is not None or self.new_object.get('dead_timer_in_seconds') is not None:
+ new_object_params['deadTimerInSeconds'] = self.new_object.get('deadTimerInSeconds') or \
+ self.new_object.get('dead_timer_in_seconds')
if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('helloTimerInSeconds') is not None or self.new_object.get('hello_timer_in_seconds') is not None:
new_object_params['helloTimerInSeconds'] = self.new_object.get('helloTimerInSeconds') or \
self.new_object.get('hello_timer_in_seconds')
- if self.new_object.get('deadTimerInSeconds') is not None or self.new_object.get('dead_timer_in_seconds') is not None:
- new_object_params['deadTimerInSeconds'] = self.new_object.get('deadTimerInSeconds') or \
- self.new_object.get('dead_timer_in_seconds')
- if self.new_object.get('areas') is not None or self.new_object.get('areas') is not None:
- new_object_params['areas'] = self.new_object.get('areas') or \
- self.new_object.get('areas')
- if self.new_object.get('v3') is not None or self.new_object.get('v3') is not None:
- new_object_params['v3'] = self.new_object.get('v3') or \
- self.new_object.get('v3')
if self.new_object.get('md5AuthenticationEnabled') is not None or self.new_object.get('md5_authentication_enabled') is not None:
new_object_params['md5AuthenticationEnabled'] = self.new_object.get('md5AuthenticationEnabled')
if self.new_object.get('md5AuthenticationKey') is not None or self.new_object.get('md5_authentication_key') is not None:
new_object_params['md5AuthenticationKey'] = self.new_object.get('md5AuthenticationKey') or \
self.new_object.get('md5_authentication_key')
+ if self.new_object.get('v3') is not None or self.new_object.get('v3') is not None:
+ new_object_params['v3'] = self.new_object.get('v3') or \
+ self.new_object.get('v3')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -148,13 +148,13 @@ class NetworksSwitchRoutingOspf(object):
requested_obj = self.new_object
obj_params = [
+ ("areas", "areas"),
+ ("deadTimerInSeconds", "deadTimerInSeconds"),
("enabled", "enabled"),
("helloTimerInSeconds", "helloTimerInSeconds"),
- ("deadTimerInSeconds", "deadTimerInSeconds"),
- ("areas", "areas"),
- ("v3", "v3"),
("md5AuthenticationEnabled", "md5AuthenticationEnabled"),
("md5AuthenticationKey", "md5AuthenticationKey"),
+ ("v3", "v3"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_settings.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_settings.py
index 65ae85bab..66664b957 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_settings.py
@@ -32,9 +32,11 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- vlan=dict(type="int"),
- useCombinedPower=dict(type="bool"),
+ macBlocklist=dict(type="dict"),
powerExceptions=dict(type="list"),
+ uplinkClientSampling=dict(type="dict"),
+ useCombinedPower=dict(type="bool"),
+ vlan=dict(type="int"),
networkId=dict(type="str"),
))
@@ -50,9 +52,11 @@ class NetworksSwitchSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- vlan=params.get("vlan"),
- useCombinedPower=params.get("useCombinedPower"),
+ macBlocklist=params.get("macBlocklist"),
powerExceptions=params.get("powerExceptions"),
+ uplinkClientSampling=params.get("uplinkClientSampling"),
+ useCombinedPower=params.get("useCombinedPower"),
+ vlan=params.get("vlan"),
network_id=params.get("networkId"),
)
@@ -65,14 +69,20 @@ class NetworksSwitchSettings(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
- new_object_params['vlan'] = self.new_object.get('vlan') or \
- self.new_object.get('vlan')
- if self.new_object.get('useCombinedPower') is not None or self.new_object.get('use_combined_power') is not None:
- new_object_params['useCombinedPower'] = self.new_object.get('useCombinedPower')
+ if self.new_object.get('macBlocklist') is not None or self.new_object.get('mac_blocklist') is not None:
+ new_object_params['macBlocklist'] = self.new_object.get('macBlocklist') or \
+ self.new_object.get('mac_blocklist')
if self.new_object.get('powerExceptions') is not None or self.new_object.get('power_exceptions') is not None:
new_object_params['powerExceptions'] = self.new_object.get('powerExceptions') or \
self.new_object.get('power_exceptions')
+ if self.new_object.get('uplinkClientSampling') is not None or self.new_object.get('uplink_client_sampling') is not None:
+ new_object_params['uplinkClientSampling'] = self.new_object.get('uplinkClientSampling') or \
+ self.new_object.get('uplink_client_sampling')
+ if self.new_object.get('useCombinedPower') is not None or self.new_object.get('use_combined_power') is not None:
+ new_object_params['useCombinedPower'] = self.new_object.get('useCombinedPower')
+ if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
+ new_object_params['vlan'] = self.new_object.get('vlan') or \
+ self.new_object.get('vlan')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -129,9 +139,11 @@ class NetworksSwitchSettings(object):
requested_obj = self.new_object
obj_params = [
- ("vlan", "vlan"),
- ("useCombinedPower", "useCombinedPower"),
+ ("macBlocklist", "macBlocklist"),
("powerExceptions", "powerExceptions"),
+ ("uplinkClientSampling", "uplinkClientSampling"),
+ ("useCombinedPower", "useCombinedPower"),
+ ("vlan", "vlan"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces.py
index 948b77458..e126bce26 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces.py
@@ -32,14 +32,14 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- subnet=dict(type="str"),
+ defaultGateway=dict(type="str"),
interfaceIp=dict(type="str"),
+ ipv6=dict(type="dict"),
multicastRouting=dict(type="str"),
- vlanId=dict(type="int"),
- defaultGateway=dict(type="str"),
+ name=dict(type="str"),
ospfSettings=dict(type="dict"),
- ipv6=dict(type="dict"),
+ subnet=dict(type="str"),
+ vlanId=dict(type="int"),
networkId=dict(type="str"),
switchStackId=dict(type="str"),
interfaceId=dict(type="str"),
@@ -58,14 +58,14 @@ class NetworksSwitchStacksRoutingInterfaces(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- subnet=params.get("subnet"),
+ defaultGateway=params.get("defaultGateway"),
interfaceIp=params.get("interfaceIp"),
+ ipv6=params.get("ipv6"),
multicastRouting=params.get("multicastRouting"),
- vlanId=params.get("vlanId"),
- defaultGateway=params.get("defaultGateway"),
+ name=params.get("name"),
ospfSettings=params.get("ospfSettings"),
- ipv6=params.get("ipv6"),
+ subnet=params.get("subnet"),
+ vlanId=params.get("vlanId"),
networkId=params.get("networkId"),
switchStackId=params.get("switchStackId"),
interfaceId=params.get("interfaceId"),
@@ -96,30 +96,30 @@ class NetworksSwitchStacksRoutingInterfaces(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
+ if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
+ new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
+ self.new_object.get('default_gateway')
if self.new_object.get('interfaceIp') is not None or self.new_object.get('interface_ip') is not None:
new_object_params['interfaceIp'] = self.new_object.get('interfaceIp') or \
self.new_object.get('interface_ip')
+ if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
+ new_object_params['ipv6'] = self.new_object.get('ipv6') or \
+ self.new_object.get('ipv6')
if self.new_object.get('multicastRouting') is not None or self.new_object.get('multicast_routing') is not None:
new_object_params['multicastRouting'] = self.new_object.get('multicastRouting') or \
self.new_object.get('multicast_routing')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
- new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id')
- if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
- new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
- self.new_object.get('default_gateway')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('ospfSettings') is not None or self.new_object.get('ospf_settings') is not None:
new_object_params['ospfSettings'] = self.new_object.get('ospfSettings') or \
self.new_object.get('ospf_settings')
- if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
- new_object_params['ipv6'] = self.new_object.get('ipv6') or \
- self.new_object.get('ipv6')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
+ new_object_params['vlanId'] = self.new_object.get('vlanId') or \
+ self.new_object.get('vlan_id')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -143,30 +143,30 @@ class NetworksSwitchStacksRoutingInterfaces(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
+ if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
+ new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
+ self.new_object.get('default_gateway')
if self.new_object.get('interfaceIp') is not None or self.new_object.get('interface_ip') is not None:
new_object_params['interfaceIp'] = self.new_object.get('interfaceIp') or \
self.new_object.get('interface_ip')
+ if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
+ new_object_params['ipv6'] = self.new_object.get('ipv6') or \
+ self.new_object.get('ipv6')
if self.new_object.get('multicastRouting') is not None or self.new_object.get('multicast_routing') is not None:
new_object_params['multicastRouting'] = self.new_object.get('multicastRouting') or \
self.new_object.get('multicast_routing')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
- new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id')
- if self.new_object.get('defaultGateway') is not None or self.new_object.get('default_gateway') is not None:
- new_object_params['defaultGateway'] = self.new_object.get('defaultGateway') or \
- self.new_object.get('default_gateway')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('ospfSettings') is not None or self.new_object.get('ospf_settings') is not None:
new_object_params['ospfSettings'] = self.new_object.get('ospfSettings') or \
self.new_object.get('ospf_settings')
- if self.new_object.get('ipv6') is not None or self.new_object.get('ipv6') is not None:
- new_object_params['ipv6'] = self.new_object.get('ipv6') or \
- self.new_object.get('ipv6')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
+ new_object_params['vlanId'] = self.new_object.get('vlanId') or \
+ self.new_object.get('vlan_id')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -247,14 +247,14 @@ class NetworksSwitchStacksRoutingInterfaces(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("subnet", "subnet"),
+ ("defaultGateway", "defaultGateway"),
("interfaceIp", "interfaceIp"),
+ ("ipv6", "ipv6"),
("multicastRouting", "multicastRouting"),
- ("vlanId", "vlanId"),
- ("defaultGateway", "defaultGateway"),
+ ("name", "name"),
("ospfSettings", "ospfSettings"),
- ("ipv6", "ipv6"),
+ ("subnet", "subnet"),
+ ("vlanId", "vlanId"),
("networkId", "networkId"),
("switchStackId", "switchStackId"),
("interfaceId", "interfaceId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces_dhcp.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces_dhcp.py
index 0127666a5..e1addc98e 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces_dhcp.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_interfaces_dhcp.py
@@ -32,17 +32,17 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ bootFileName=dict(type="str"),
+ bootNextServer=dict(type="str"),
+ bootOptionsEnabled=dict(type="bool"),
+ dhcpLeaseTime=dict(type="str"),
dhcpMode=dict(type="str"),
+ dhcpOptions=dict(type="list"),
dhcpRelayServerIps=dict(type="list"),
- dhcpLeaseTime=dict(type="str"),
- dnsNameserversOption=dict(type="str"),
dnsCustomNameservers=dict(type="list"),
- bootOptionsEnabled=dict(type="bool"),
- bootNextServer=dict(type="str"),
- bootFileName=dict(type="str"),
- dhcpOptions=dict(type="list"),
- reservedIpRanges=dict(type="list"),
+ dnsNameserversOption=dict(type="str"),
fixedIpAssignments=dict(type="list"),
+ reservedIpRanges=dict(type="list"),
networkId=dict(type="str"),
switchStackId=dict(type="str"),
interfaceId=dict(type="str"),
@@ -60,17 +60,17 @@ class NetworksSwitchStacksRoutingInterfacesDhcp(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ bootFileName=params.get("bootFileName"),
+ bootNextServer=params.get("bootNextServer"),
+ bootOptionsEnabled=params.get("bootOptionsEnabled"),
+ dhcpLeaseTime=params.get("dhcpLeaseTime"),
dhcpMode=params.get("dhcpMode"),
+ dhcpOptions=params.get("dhcpOptions"),
dhcpRelayServerIps=params.get("dhcpRelayServerIps"),
- dhcpLeaseTime=params.get("dhcpLeaseTime"),
- dnsNameserversOption=params.get("dnsNameserversOption"),
dnsCustomNameservers=params.get("dnsCustomNameservers"),
- bootOptionsEnabled=params.get("bootOptionsEnabled"),
- bootNextServer=params.get("bootNextServer"),
- bootFileName=params.get("bootFileName"),
- dhcpOptions=params.get("dhcpOptions"),
- reservedIpRanges=params.get("reservedIpRanges"),
+ dnsNameserversOption=params.get("dnsNameserversOption"),
fixedIpAssignments=params.get("fixedIpAssignments"),
+ reservedIpRanges=params.get("reservedIpRanges"),
network_id=params.get("networkId"),
switch_stack_id=params.get("switchStackId"),
interface_id=params.get("interfaceId"),
@@ -91,38 +91,38 @@ class NetworksSwitchStacksRoutingInterfacesDhcp(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('bootFileName') is not None or self.new_object.get('boot_file_name') is not None:
+ new_object_params['bootFileName'] = self.new_object.get('bootFileName') or \
+ self.new_object.get('boot_file_name')
+ if self.new_object.get('bootNextServer') is not None or self.new_object.get('boot_next_server') is not None:
+ new_object_params['bootNextServer'] = self.new_object.get('bootNextServer') or \
+ self.new_object.get('boot_next_server')
+ if self.new_object.get('bootOptionsEnabled') is not None or self.new_object.get('boot_options_enabled') is not None:
+ new_object_params['bootOptionsEnabled'] = self.new_object.get('bootOptionsEnabled')
+ if self.new_object.get('dhcpLeaseTime') is not None or self.new_object.get('dhcp_lease_time') is not None:
+ new_object_params['dhcpLeaseTime'] = self.new_object.get('dhcpLeaseTime') or \
+ self.new_object.get('dhcp_lease_time')
if self.new_object.get('dhcpMode') is not None or self.new_object.get('dhcp_mode') is not None:
new_object_params['dhcpMode'] = self.new_object.get('dhcpMode') or \
self.new_object.get('dhcp_mode')
+ if self.new_object.get('dhcpOptions') is not None or self.new_object.get('dhcp_options') is not None:
+ new_object_params['dhcpOptions'] = self.new_object.get('dhcpOptions') or \
+ self.new_object.get('dhcp_options')
if self.new_object.get('dhcpRelayServerIps') is not None or self.new_object.get('dhcp_relay_server_ips') is not None:
new_object_params['dhcpRelayServerIps'] = self.new_object.get('dhcpRelayServerIps') or \
self.new_object.get('dhcp_relay_server_ips')
- if self.new_object.get('dhcpLeaseTime') is not None or self.new_object.get('dhcp_lease_time') is not None:
- new_object_params['dhcpLeaseTime'] = self.new_object.get('dhcpLeaseTime') or \
- self.new_object.get('dhcp_lease_time')
- if self.new_object.get('dnsNameserversOption') is not None or self.new_object.get('dns_nameservers_option') is not None:
- new_object_params['dnsNameserversOption'] = self.new_object.get('dnsNameserversOption') or \
- self.new_object.get('dns_nameservers_option')
if self.new_object.get('dnsCustomNameservers') is not None or self.new_object.get('dns_custom_nameservers') is not None:
new_object_params['dnsCustomNameservers'] = self.new_object.get('dnsCustomNameservers') or \
self.new_object.get('dns_custom_nameservers')
- if self.new_object.get('bootOptionsEnabled') is not None or self.new_object.get('boot_options_enabled') is not None:
- new_object_params['bootOptionsEnabled'] = self.new_object.get('bootOptionsEnabled')
- if self.new_object.get('bootNextServer') is not None or self.new_object.get('boot_next_server') is not None:
- new_object_params['bootNextServer'] = self.new_object.get('bootNextServer') or \
- self.new_object.get('boot_next_server')
- if self.new_object.get('bootFileName') is not None or self.new_object.get('boot_file_name') is not None:
- new_object_params['bootFileName'] = self.new_object.get('bootFileName') or \
- self.new_object.get('boot_file_name')
- if self.new_object.get('dhcpOptions') is not None or self.new_object.get('dhcp_options') is not None:
- new_object_params['dhcpOptions'] = self.new_object.get('dhcpOptions') or \
- self.new_object.get('dhcp_options')
- if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
- new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
- self.new_object.get('reserved_ip_ranges')
+ if self.new_object.get('dnsNameserversOption') is not None or self.new_object.get('dns_nameservers_option') is not None:
+ new_object_params['dnsNameserversOption'] = self.new_object.get('dnsNameserversOption') or \
+ self.new_object.get('dns_nameservers_option')
if self.new_object.get('fixedIpAssignments') is not None or self.new_object.get('fixed_ip_assignments') is not None:
new_object_params['fixedIpAssignments'] = self.new_object.get('fixedIpAssignments') or \
self.new_object.get('fixed_ip_assignments')
+ if self.new_object.get('reservedIpRanges') is not None or self.new_object.get('reserved_ip_ranges') is not None:
+ new_object_params['reservedIpRanges'] = self.new_object.get('reservedIpRanges') or \
+ self.new_object.get('reserved_ip_ranges')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -185,17 +185,17 @@ class NetworksSwitchStacksRoutingInterfacesDhcp(object):
requested_obj = self.new_object
obj_params = [
+ ("bootFileName", "bootFileName"),
+ ("bootNextServer", "bootNextServer"),
+ ("bootOptionsEnabled", "bootOptionsEnabled"),
+ ("dhcpLeaseTime", "dhcpLeaseTime"),
("dhcpMode", "dhcpMode"),
+ ("dhcpOptions", "dhcpOptions"),
("dhcpRelayServerIps", "dhcpRelayServerIps"),
- ("dhcpLeaseTime", "dhcpLeaseTime"),
- ("dnsNameserversOption", "dnsNameserversOption"),
("dnsCustomNameservers", "dnsCustomNameservers"),
- ("bootOptionsEnabled", "bootOptionsEnabled"),
- ("bootNextServer", "bootNextServer"),
- ("bootFileName", "bootFileName"),
- ("dhcpOptions", "dhcpOptions"),
- ("reservedIpRanges", "reservedIpRanges"),
+ ("dnsNameserversOption", "dnsNameserversOption"),
("fixedIpAssignments", "fixedIpAssignments"),
+ ("reservedIpRanges", "reservedIpRanges"),
("networkId", "networkId"),
("switchStackId", "switchStackId"),
("interfaceId", "interfaceId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_static_routes.py b/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_static_routes.py
index 1ac473570..88d04e931 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_static_routes.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_switch_stacks_routing_static_routes.py
@@ -32,11 +32,11 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ advertiseViaOspfEnabled=dict(type="bool"),
name=dict(type="str"),
- subnet=dict(type="str"),
nextHopIp=dict(type="str"),
- advertiseViaOspfEnabled=dict(type="bool"),
preferOverOspfRoutesEnabled=dict(type="bool"),
+ subnet=dict(type="str"),
networkId=dict(type="str"),
switchStackId=dict(type="str"),
staticRouteId=dict(type="str"),
@@ -55,11 +55,11 @@ class NetworksSwitchStacksRoutingStaticRoutes(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ advertiseViaOspfEnabled=params.get("advertiseViaOspfEnabled"),
name=params.get("name"),
- subnet=params.get("subnet"),
nextHopIp=params.get("nextHopIp"),
- advertiseViaOspfEnabled=params.get("advertiseViaOspfEnabled"),
preferOverOspfRoutesEnabled=params.get("preferOverOspfRoutesEnabled"),
+ subnet=params.get("subnet"),
networkId=params.get("networkId"),
switchStackId=params.get("switchStackId"),
staticRouteId=params.get("staticRouteId"),
@@ -90,19 +90,19 @@ class NetworksSwitchStacksRoutingStaticRoutes(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
+ new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
if self.new_object.get('nextHopIp') is not None or self.new_object.get('next_hop_ip') is not None:
new_object_params['nextHopIp'] = self.new_object.get('nextHopIp') or \
self.new_object.get('next_hop_ip')
- if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
- new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('preferOverOspfRoutesEnabled') is not None or self.new_object.get('prefer_over_ospf_routes_enabled') is not None:
new_object_params['preferOverOspfRoutesEnabled'] = self.new_object.get('preferOverOspfRoutesEnabled')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -126,19 +126,19 @@ class NetworksSwitchStacksRoutingStaticRoutes(object):
def update_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
+ new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
- new_object_params['subnet'] = self.new_object.get('subnet') or \
- self.new_object.get('subnet')
if self.new_object.get('nextHopIp') is not None or self.new_object.get('next_hop_ip') is not None:
new_object_params['nextHopIp'] = self.new_object.get('nextHopIp') or \
self.new_object.get('next_hop_ip')
- if self.new_object.get('advertiseViaOspfEnabled') is not None or self.new_object.get('advertise_via_ospf_enabled') is not None:
- new_object_params['advertiseViaOspfEnabled'] = self.new_object.get('advertiseViaOspfEnabled')
if self.new_object.get('preferOverOspfRoutesEnabled') is not None or self.new_object.get('prefer_over_ospf_routes_enabled') is not None:
new_object_params['preferOverOspfRoutesEnabled'] = self.new_object.get('preferOverOspfRoutesEnabled')
+ if self.new_object.get('subnet') is not None or self.new_object.get('subnet') is not None:
+ new_object_params['subnet'] = self.new_object.get('subnet') or \
+ self.new_object.get('subnet')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -219,11 +219,11 @@ class NetworksSwitchStacksRoutingStaticRoutes(object):
requested_obj = self.new_object
obj_params = [
+ ("advertiseViaOspfEnabled", "advertiseViaOspfEnabled"),
("name", "name"),
- ("subnet", "subnet"),
("nextHopIp", "nextHopIp"),
- ("advertiseViaOspfEnabled", "advertiseViaOspfEnabled"),
("preferOverOspfRoutesEnabled", "preferOverOspfRoutesEnabled"),
+ ("subnet", "subnet"),
("networkId", "networkId"),
("switchStackId", "switchStackId"),
("staticRouteId", "staticRouteId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_traffic_analysis.py b/ansible_collections/cisco/meraki/plugins/action/networks_traffic_analysis.py
index eb815e34c..3a0362321 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_traffic_analysis.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_traffic_analysis.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- mode=dict(type="str"),
customPieChartItems=dict(type="list"),
+ mode=dict(type="str"),
networkId=dict(type="str"),
))
@@ -49,8 +49,8 @@ class NetworksTrafficAnalysis(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- mode=params.get("mode"),
customPieChartItems=params.get("customPieChartItems"),
+ mode=params.get("mode"),
network_id=params.get("networkId"),
)
@@ -63,12 +63,12 @@ class NetworksTrafficAnalysis(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
- new_object_params['mode'] = self.new_object.get('mode') or \
- self.new_object.get('mode')
if self.new_object.get('customPieChartItems') is not None or self.new_object.get('custom_pie_chart_items') is not None:
new_object_params['customPieChartItems'] = self.new_object.get('customPieChartItems') or \
self.new_object.get('custom_pie_chart_items')
+ if self.new_object.get('mode') is not None or self.new_object.get('mode') is not None:
+ new_object_params['mode'] = self.new_object.get('mode') or \
+ self.new_object.get('mode')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -125,8 +125,8 @@ class NetworksTrafficAnalysis(object):
requested_obj = self.new_object
obj_params = [
- ("mode", "mode"),
("customPieChartItems", "customPieChartItems"),
+ ("mode", "mode"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles.py b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles.py
new file mode 100644
index 000000000..c92346bea
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles.py
@@ -0,0 +1,260 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+ get_dict_result,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present", "absent"]),
+ name=dict(type="str"),
+ vlanGroups=dict(type="list"),
+ vlanNames=dict(type="list"),
+ networkId=dict(type="str"),
+ iname=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["iname", "name", "networkId"], True),
+ ("state", "absent", ["iname", "name", "networkId"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class NetworksVlanProfiles(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ name=params.get("name"),
+ vlanGroups=params.get("vlanGroups"),
+ vlanNames=params.get("vlanNames"),
+ network_id=params.get("networkId"),
+ iname=params.get("iname"),
+ )
+
+ def delete_by_name_params(self):
+ new_object_params = {}
+ if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
+ new_object_params['networkId'] = self.new_object.get('networkId') or \
+ self.new_object.get('network_id')
+ if self.new_object.get('iname') is not None or self.new_object.get('iname') is not None:
+ new_object_params['iname'] = self.new_object.get('iname') or \
+ self.new_object.get('iname')
+ return new_object_params
+
+ def update_by_name_params(self):
+ new_object_params = {}
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('vlanGroups') is not None or self.new_object.get('vlan_groups') is not None:
+ new_object_params['vlanGroups'] = self.new_object.get('vlanGroups') or \
+ self.new_object.get('vlan_groups')
+ if self.new_object.get('vlanNames') is not None or self.new_object.get('vlan_names') is not None:
+ new_object_params['vlanNames'] = self.new_object.get('vlanNames') or \
+ self.new_object.get('vlan_names')
+ if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
+ new_object_params['networkId'] = self.new_object.get('networkId') or \
+ self.new_object.get('network_id')
+ if self.new_object.get('iname') is not None or self.new_object.get('iname') is not None:
+ new_object_params['iname'] = self.new_object.get('iname') or \
+ self.new_object.get('iname')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ try:
+ items = self.meraki.exec_meraki(
+ family="networks",
+ function="getNetworkVlanProfile",
+ params={"iname": name}
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = get_dict_result(items, 'iname', name)
+ except Exception:
+ result = None
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ return result
+
+ def exists(self):
+ prev_obj = None
+ id_exists = False
+ name_exists = False
+ o_id = self.new_object.get("networkId") or self.new_object.get("network_id")
+ name = self.new_object.get("name")
+ name = name or self.new_object.get("iname")
+ if o_id:
+ prev_obj = self.get_object_by_name(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if id_exists:
+ _name = prev_obj.get("name")
+ _name = _name or prev_obj.get("iname")
+ if _name:
+ self.new_object.update(dict(iname=_name))
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("name", "name"),
+ ("vlanGroups", "vlanGroups"),
+ ("vlanNames", "vlanNames"),
+ ("networkId", "networkId"),
+ ("iname", "iname"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def update(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ name = name or self.new_object.get("iname")
+ result = None
+ if not name:
+ prev_obj_id = self.get_object_by_id(id)
+ name_ = None
+ if prev_obj_id:
+ name_ = prev_obj_id.get("name")
+ name_ = name_ or prev_obj_id.get("iname")
+ if name_:
+ self.new_object.update(dict(iname=name_))
+ result = self.meraki.exec_meraki(
+ family="networks",
+ function="updateNetworkVlanProfile",
+ params=self.update_by_name_params(),
+ op_modifies=True,
+ )
+ return result
+
+ def delete(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ name = name or self.new_object.get("iname")
+ result = None
+ if not name:
+ prev_obj_id = self.get_object_by_id(id)
+ name_ = None
+ if prev_obj_id:
+ name_ = prev_obj_id.get("name")
+ name_ = name_ or prev_obj_id.get("iname")
+ if name_:
+ self.new_object.update(dict(iname=name_))
+ result = self.meraki.exec_meraki(
+ family="networks",
+ function="deleteNetworkVlanProfile",
+ params=self.delete_by_name_params(),
+ )
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = NetworksVlanProfiles(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = obj.update()
+ meraki.object_updated()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ meraki.fail_json(
+ "Object does not exists, plugin only has update")
+ elif state == "absent":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ response = obj.delete()
+ meraki.object_deleted()
+ else:
+ meraki.object_already_absent()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_by_device_info.py b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_by_device_info.py
new file mode 100644
index 000000000..2e386c0ab
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_by_device_info.py
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ networkId=dict(type="str"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ serials=dict(type="list"),
+ productTypes=dict(type="list"),
+ stackIds=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("networkId") is not None:
+ new_object["networkId"] = params.get(
+ "networkId")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("productTypes") is not None:
+ new_object["productTypes"] = params.get(
+ "productTypes")
+ if params.get("stackIds") is not None:
+ new_object["stackIds"] = params.get(
+ "stackIds")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="networks",
+ function='getNetworkVlanProfilesAssignmentsByDevice',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_reassign.py b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_reassign.py
new file mode 100644
index 000000000..96cb0a3a1
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_assignments_reassign.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ serials=dict(type="list"),
+ stackIds=dict(type="list"),
+ vlanProfile=dict(type="dict"),
+ networkId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ serials=params.get("serials"),
+ stackIds=params.get("stackIds"),
+ vlanProfile=params.get("vlanProfile"),
+ networkId=params.get("networkId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="networks",
+ function='reassignNetworkVlanProfilesAssignments',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_info.py b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_info.py
new file mode 100644
index 000000000..74fa01c03
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_vlan_profiles_info.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ networkId=dict(type="str"),
+ iname=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ name = self._task.args.get("iname")
+ if name:
+ response = meraki.exec_meraki(
+ family="networks",
+ function='getNetworkVlanProfile',
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
+ if not name:
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers.py b/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers.py
index ef9a6d29d..a893960f6 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_http_servers.py
@@ -33,9 +33,9 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
name=dict(type="str"),
- url=dict(type="str"),
- sharedSecret=dict(type="str"),
payloadTemplate=dict(type="dict"),
+ sharedSecret=dict(type="str"),
+ url=dict(type="str"),
networkId=dict(type="str"),
httpServerId=dict(type="str"),
))
@@ -54,9 +54,9 @@ class NetworksWebhooksHttpServers(object):
self.meraki = meraki
self.new_object = dict(
name=params.get("name"),
- url=params.get("url"),
- sharedSecret=params.get("sharedSecret"),
payloadTemplate=params.get("payloadTemplate"),
+ sharedSecret=params.get("sharedSecret"),
+ url=params.get("url"),
networkId=params.get("networkId"),
httpServerId=params.get("httpServerId"),
)
@@ -83,15 +83,15 @@ class NetworksWebhooksHttpServers(object):
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('url') is not None or self.new_object.get('url') is not None:
- new_object_params['url'] = self.new_object.get('url') or \
- self.new_object.get('url')
- if self.new_object.get('sharedSecret') is not None or self.new_object.get('shared_secret') is not None:
- new_object_params['sharedSecret'] = self.new_object.get('sharedSecret') or \
- self.new_object.get('shared_secret')
if self.new_object.get('payloadTemplate') is not None or self.new_object.get('payload_template') is not None:
new_object_params['payloadTemplate'] = self.new_object.get('payloadTemplate') or \
self.new_object.get('payload_template')
+ if self.new_object.get('sharedSecret') is not None or self.new_object.get('shared_secret') is not None:
+ new_object_params['sharedSecret'] = self.new_object.get('sharedSecret') or \
+ self.new_object.get('shared_secret')
+ if self.new_object.get('url') is not None or self.new_object.get('url') is not None:
+ new_object_params['url'] = self.new_object.get('url') or \
+ self.new_object.get('url')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -112,12 +112,12 @@ class NetworksWebhooksHttpServers(object):
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
- if self.new_object.get('sharedSecret') is not None or self.new_object.get('shared_secret') is not None:
- new_object_params['sharedSecret'] = self.new_object.get('sharedSecret') or \
- self.new_object.get('shared_secret')
if self.new_object.get('payloadTemplate') is not None or self.new_object.get('payload_template') is not None:
new_object_params['payloadTemplate'] = self.new_object.get('payloadTemplate') or \
self.new_object.get('payload_template')
+ if self.new_object.get('sharedSecret') is not None or self.new_object.get('shared_secret') is not None:
+ new_object_params['sharedSecret'] = self.new_object.get('sharedSecret') or \
+ self.new_object.get('shared_secret')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -196,9 +196,9 @@ class NetworksWebhooksHttpServers(object):
obj_params = [
("name", "name"),
- ("url", "url"),
- ("sharedSecret", "sharedSecret"),
("payloadTemplate", "payloadTemplate"),
+ ("sharedSecret", "sharedSecret"),
+ ("url", "url"),
("networkId", "networkId"),
("httpServerId", "httpServerId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_payload_templates.py b/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_payload_templates.py
index 335a112bc..9f1b32936 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_payload_templates.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_webhooks_payload_templates.py
@@ -32,11 +32,11 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
body=dict(type="str"),
- headers=dict(type="list"),
bodyFile=dict(type="str"),
+ headers=dict(type="list"),
headersFile=dict(type="str"),
+ name=dict(type="str"),
networkId=dict(type="str"),
payloadTemplateId=dict(type="str"),
))
@@ -54,11 +54,11 @@ class NetworksWebhooksPayloadTemplates(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
body=params.get("body"),
- headers=params.get("headers"),
bodyFile=params.get("bodyFile"),
+ headers=params.get("headers"),
headersFile=params.get("headersFile"),
+ name=params.get("name"),
networkId=params.get("networkId"),
payloadTemplateId=params.get("payloadTemplateId"),
)
@@ -82,21 +82,21 @@ class NetworksWebhooksPayloadTemplates(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('body') is not None or self.new_object.get('body') is not None:
new_object_params['body'] = self.new_object.get('body') or \
self.new_object.get('body')
- if self.new_object.get('headers') is not None or self.new_object.get('headers') is not None:
- new_object_params['headers'] = self.new_object.get('headers') or \
- self.new_object.get('headers')
if self.new_object.get('bodyFile') is not None or self.new_object.get('body_file') is not None:
new_object_params['bodyFile'] = self.new_object.get('bodyFile') or \
self.new_object.get('body_file')
+ if self.new_object.get('headers') is not None or self.new_object.get('headers') is not None:
+ new_object_params['headers'] = self.new_object.get('headers') or \
+ self.new_object.get('headers')
if self.new_object.get('headersFile') is not None or self.new_object.get('headers_file') is not None:
new_object_params['headersFile'] = self.new_object.get('headersFile') or \
self.new_object.get('headers_file')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -114,21 +114,21 @@ class NetworksWebhooksPayloadTemplates(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('body') is not None or self.new_object.get('body') is not None:
new_object_params['body'] = self.new_object.get('body') or \
self.new_object.get('body')
- if self.new_object.get('headers') is not None or self.new_object.get('headers') is not None:
- new_object_params['headers'] = self.new_object.get('headers') or \
- self.new_object.get('headers')
if self.new_object.get('bodyFile') is not None or self.new_object.get('body_file') is not None:
new_object_params['bodyFile'] = self.new_object.get('bodyFile') or \
self.new_object.get('body_file')
+ if self.new_object.get('headers') is not None or self.new_object.get('headers') is not None:
+ new_object_params['headers'] = self.new_object.get('headers') or \
+ self.new_object.get('headers')
if self.new_object.get('headersFile') is not None or self.new_object.get('headers_file') is not None:
new_object_params['headersFile'] = self.new_object.get('headersFile') or \
self.new_object.get('headers_file')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -206,11 +206,11 @@ class NetworksWebhooksPayloadTemplates(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
("body", "body"),
- ("headers", "headers"),
("bodyFile", "bodyFile"),
+ ("headers", "headers"),
("headersFile", "headersFile"),
+ ("name", "name"),
("networkId", "networkId"),
("payloadTemplateId", "payloadTemplateId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_alternate_management_interface.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_alternate_management_interface.py
index 899d9f264..f21ab1696 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_alternate_management_interface.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_alternate_management_interface.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ accessPoints=dict(type="list"),
enabled=dict(type="bool"),
- vlanId=dict(type="int"),
protocols=dict(type="list"),
- accessPoints=dict(type="list"),
+ vlanId=dict(type="int"),
networkId=dict(type="str"),
))
@@ -51,10 +51,10 @@ class NetworksWirelessAlternateManagementInterface(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ accessPoints=params.get("accessPoints"),
enabled=params.get("enabled"),
- vlanId=params.get("vlanId"),
protocols=params.get("protocols"),
- accessPoints=params.get("accessPoints"),
+ vlanId=params.get("vlanId"),
network_id=params.get("networkId"),
)
@@ -67,17 +67,17 @@ class NetworksWirelessAlternateManagementInterface(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('accessPoints') is not None or self.new_object.get('access_points') is not None:
+ new_object_params['accessPoints'] = self.new_object.get('accessPoints') or \
+ self.new_object.get('access_points')
if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
new_object_params['enabled'] = self.new_object.get('enabled')
- if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
- new_object_params['vlanId'] = self.new_object.get('vlanId') or \
- self.new_object.get('vlan_id')
if self.new_object.get('protocols') is not None or self.new_object.get('protocols') is not None:
new_object_params['protocols'] = self.new_object.get('protocols') or \
self.new_object.get('protocols')
- if self.new_object.get('accessPoints') is not None or self.new_object.get('access_points') is not None:
- new_object_params['accessPoints'] = self.new_object.get('accessPoints') or \
- self.new_object.get('access_points')
+ if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
+ new_object_params['vlanId'] = self.new_object.get('vlanId') or \
+ self.new_object.get('vlan_id')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -134,10 +134,10 @@ class NetworksWirelessAlternateManagementInterface(object):
requested_obj = self.new_object
obj_params = [
+ ("accessPoints", "accessPoints"),
("enabled", "enabled"),
- ("vlanId", "vlanId"),
("protocols", "protocols"),
- ("accessPoints", "accessPoints"),
+ ("vlanId", "vlanId"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_bluetooth_settings.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_bluetooth_settings.py
index 59f9f6c75..ea730674c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_bluetooth_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_bluetooth_settings.py
@@ -32,12 +32,12 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- scanningEnabled=dict(type="bool"),
advertisingEnabled=dict(type="bool"),
- uuid=dict(type="str"),
- majorMinorAssignmentMode=dict(type="str"),
major=dict(type="int"),
+ majorMinorAssignmentMode=dict(type="str"),
minor=dict(type="int"),
+ scanningEnabled=dict(type="bool"),
+ uuid=dict(type="str"),
networkId=dict(type="str"),
))
@@ -53,12 +53,12 @@ class NetworksWirelessBluetoothSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- scanningEnabled=params.get("scanningEnabled"),
advertisingEnabled=params.get("advertisingEnabled"),
- uuid=params.get("uuid"),
- majorMinorAssignmentMode=params.get("majorMinorAssignmentMode"),
major=params.get("major"),
+ majorMinorAssignmentMode=params.get("majorMinorAssignmentMode"),
minor=params.get("minor"),
+ scanningEnabled=params.get("scanningEnabled"),
+ uuid=params.get("uuid"),
network_id=params.get("networkId"),
)
@@ -71,22 +71,22 @@ class NetworksWirelessBluetoothSettings(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('scanningEnabled') is not None or self.new_object.get('scanning_enabled') is not None:
- new_object_params['scanningEnabled'] = self.new_object.get('scanningEnabled')
if self.new_object.get('advertisingEnabled') is not None or self.new_object.get('advertising_enabled') is not None:
new_object_params['advertisingEnabled'] = self.new_object.get('advertisingEnabled')
- if self.new_object.get('uuid') is not None or self.new_object.get('uuid') is not None:
- new_object_params['uuid'] = self.new_object.get('uuid') or \
- self.new_object.get('uuid')
- if self.new_object.get('majorMinorAssignmentMode') is not None or self.new_object.get('major_minor_assignment_mode') is not None:
- new_object_params['majorMinorAssignmentMode'] = self.new_object.get('majorMinorAssignmentMode') or \
- self.new_object.get('major_minor_assignment_mode')
if self.new_object.get('major') is not None or self.new_object.get('major') is not None:
new_object_params['major'] = self.new_object.get('major') or \
self.new_object.get('major')
+ if self.new_object.get('majorMinorAssignmentMode') is not None or self.new_object.get('major_minor_assignment_mode') is not None:
+ new_object_params['majorMinorAssignmentMode'] = self.new_object.get('majorMinorAssignmentMode') or \
+ self.new_object.get('major_minor_assignment_mode')
if self.new_object.get('minor') is not None or self.new_object.get('minor') is not None:
new_object_params['minor'] = self.new_object.get('minor') or \
self.new_object.get('minor')
+ if self.new_object.get('scanningEnabled') is not None or self.new_object.get('scanning_enabled') is not None:
+ new_object_params['scanningEnabled'] = self.new_object.get('scanningEnabled')
+ if self.new_object.get('uuid') is not None or self.new_object.get('uuid') is not None:
+ new_object_params['uuid'] = self.new_object.get('uuid') or \
+ self.new_object.get('uuid')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -143,12 +143,12 @@ class NetworksWirelessBluetoothSettings(object):
requested_obj = self.new_object
obj_params = [
- ("scanningEnabled", "scanningEnabled"),
("advertisingEnabled", "advertisingEnabled"),
- ("uuid", "uuid"),
- ("majorMinorAssignmentMode", "majorMinorAssignmentMode"),
("major", "major"),
+ ("majorMinorAssignmentMode", "majorMinorAssignmentMode"),
("minor", "minor"),
+ ("scanningEnabled", "scanningEnabled"),
+ ("uuid", "uuid"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles.py
new file mode 100644
index 000000000..fc95256a5
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles.py
@@ -0,0 +1,270 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present", "absent"]),
+ name=dict(type="str"),
+ ports=dict(type="list"),
+ usbPorts=dict(type="list"),
+ networkId=dict(type="str"),
+ profileId=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["name", "networkId", "profileId"], True),
+ ("state", "absent", ["name", "networkId", "profileId"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class NetworksWirelessEthernetPortsProfiles(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ name=params.get("name"),
+ ports=params.get("ports"),
+ usbPorts=params.get("usbPorts"),
+ network_id=params.get("networkId"),
+ profile_id=params.get("profileId"),
+ )
+
+ def get_params_by_id(self, name=None, id=None):
+ new_object_params = {}
+ if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
+ new_object_params['networkId'] = self.new_object.get('networkId') or \
+ self.new_object.get('network_id')
+ if self.new_object.get('profileId') is not None or self.new_object.get('profile_id') is not None:
+ new_object_params['profileId'] = self.new_object.get('profileId') or \
+ self.new_object.get('profile_id')
+ return new_object_params
+
+ def delete_by_id_params(self):
+ new_object_params = {}
+ if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
+ new_object_params['networkId'] = self.new_object.get('networkId') or \
+ self.new_object.get('network_id')
+ if self.new_object.get('profileId') is not None or self.new_object.get('profile_id') is not None:
+ new_object_params['profileId'] = self.new_object.get('profileId') or \
+ self.new_object.get('profile_id')
+ return new_object_params
+
+ def update_by_id_params(self):
+ new_object_params = {}
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('ports') is not None or self.new_object.get('ports') is not None:
+ new_object_params['ports'] = self.new_object.get('ports') or \
+ self.new_object.get('ports')
+ if self.new_object.get('usbPorts') is not None or self.new_object.get('usb_ports') is not None:
+ new_object_params['usbPorts'] = self.new_object.get('usbPorts') or \
+ self.new_object.get('usb_ports')
+ if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
+ new_object_params['networkId'] = self.new_object.get('networkId') or \
+ self.new_object.get('network_id')
+ if self.new_object.get('profileId') is not None or self.new_object.get('profile_id') is not None:
+ new_object_params['profileId'] = self.new_object.get('profileId') or \
+ self.new_object.get('profile_id')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name and get all
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ try:
+ items = self.meraki.exec_meraki(
+ family="wireless",
+ function="getNetworkWirelessEthernetPortsProfile",
+ params=self.get_params_by_id()
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = items
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def exists(self):
+ prev_obj = None
+ id_exists = False
+ name_exists = False
+ o_id = self.new_object.get("networkId") or self.new_object.get("network_id")
+ o_id = o_id or self.new_object.get(
+ "profile_id") or self.new_object.get("profileId")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_id(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ _id = _id or prev_obj.get("profileId")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ self.new_object.update(dict(profileId=_id))
+ if _id:
+ prev_obj = self.get_object_by_id(_id)
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("name", "name"),
+ ("ports", "ports"),
+ ("usbPorts", "usbPorts"),
+ ("networkId", "networkId"),
+ ("profileId", "profileId"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def update(self):
+ id = self.new_object.get("id")
+ id = id or self.new_object.get("profileId")
+ name = self.new_object.get("name")
+ result = None
+ if not id:
+ prev_obj_name = self.get_object_by_name(name)
+ id_ = None
+ if prev_obj_name:
+ id_ = prev_obj_name.get("id")
+ id_ = id_ or prev_obj_name.get("profileId")
+ if id_:
+ self.new_object.update(dict(profileid=id_))
+ result = self.meraki.exec_meraki(
+ family="wireless",
+ function="updateNetworkWirelessEthernetPortsProfile",
+ params=self.update_by_id_params(),
+ op_modifies=True,
+ )
+ return result
+
+ def delete(self):
+ id = self.new_object.get("id")
+ id = id or self.new_object.get("profileId")
+ name = self.new_object.get("name")
+ result = None
+ if not id:
+ prev_obj_name = self.get_object_by_name(name)
+ id_ = None
+ if prev_obj_name:
+ id_ = prev_obj_name.get("id")
+ id_ = id_ or prev_obj_name.get("profileId")
+ if id_:
+ self.new_object.update(dict(profileid=id_))
+ result = self.meraki.exec_meraki(
+ family="wireless",
+ function="deleteNetworkWirelessEthernetPortsProfile",
+ params=self.delete_by_id_params(),
+ )
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = NetworksWirelessEthernetPortsProfiles(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = obj.update()
+ meraki.object_updated()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ meraki.fail_json(
+ "Object does not exists, plugin only has update")
+ elif state == "absent":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ response = obj.delete()
+ meraki.object_deleted()
+ else:
+ meraki.object_already_absent()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_assign.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_assign.py
new file mode 100644
index 000000000..8e594fcae
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_assign.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ profileId=dict(type="str"),
+ serials=dict(type="list"),
+ networkId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ profileId=params.get("profileId"),
+ serials=params.get("serials"),
+ networkId=params.get("networkId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='assignNetworkWirelessEthernetPortsProfiles',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_info.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_info.py
new file mode 100644
index 000000000..1bf4c8dee
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_info.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ networkId=dict(type="str"),
+ profileId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = {}
+ if params.get("networkId") is not None:
+ new_object["networkId"] = params.get(
+ "networkId")
+ if params.get("profileId") is not None:
+ new_object["profileId"] = params.get(
+ "profileId")
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ id = self._task.args.get("profileId")
+ if id:
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getNetworkWirelessEthernetPortsProfile',
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
+ if not id:
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_set_default.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_set_default.py
new file mode 100644
index 000000000..1cccd7aa1
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ethernet_ports_profiles_set_default.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ profileId=dict(type="str"),
+ networkId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ profileId=params.get("profileId"),
+ networkId=params.get("networkId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='setNetworkWirelessEthernetPortsProfilesDefault',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_rf_profiles.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_rf_profiles.py
index ad3f0d8ec..c4d650c4d 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_rf_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_rf_profiles.py
@@ -32,16 +32,17 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- clientBalancingEnabled=dict(type="bool"),
- minBitrateType=dict(type="str"),
- bandSelectionType=dict(type="str"),
apBandSettings=dict(type="dict"),
- twoFourGhzSettings=dict(type="dict"),
+ bandSelectionType=dict(type="str"),
+ clientBalancingEnabled=dict(type="bool"),
fiveGhzSettings=dict(type="dict"),
+ flexRadios=dict(type="dict"),
+ minBitrateType=dict(type="str"),
+ name=dict(type="str"),
+ perSsidSettings=dict(type="dict"),
sixGhzSettings=dict(type="dict"),
transmission=dict(type="dict"),
- perSsidSettings=dict(type="dict"),
+ twoFourGhzSettings=dict(type="dict"),
networkId=dict(type="str"),
rfProfileId=dict(type="str"),
))
@@ -59,16 +60,17 @@ class NetworksWirelessRfProfiles(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- clientBalancingEnabled=params.get("clientBalancingEnabled"),
- minBitrateType=params.get("minBitrateType"),
- bandSelectionType=params.get("bandSelectionType"),
apBandSettings=params.get("apBandSettings"),
- twoFourGhzSettings=params.get("twoFourGhzSettings"),
+ bandSelectionType=params.get("bandSelectionType"),
+ clientBalancingEnabled=params.get("clientBalancingEnabled"),
fiveGhzSettings=params.get("fiveGhzSettings"),
+ flexRadios=params.get("flexRadios"),
+ minBitrateType=params.get("minBitrateType"),
+ name=params.get("name"),
+ perSsidSettings=params.get("perSsidSettings"),
sixGhzSettings=params.get("sixGhzSettings"),
transmission=params.get("transmission"),
- perSsidSettings=params.get("perSsidSettings"),
+ twoFourGhzSettings=params.get("twoFourGhzSettings"),
networkId=params.get("networkId"),
rfProfileId=params.get("rfProfileId"),
)
@@ -95,35 +97,38 @@ class NetworksWirelessRfProfiles(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('clientBalancingEnabled') is not None or self.new_object.get('client_balancing_enabled') is not None:
- new_object_params['clientBalancingEnabled'] = self.new_object.get('clientBalancingEnabled')
- if self.new_object.get('minBitrateType') is not None or self.new_object.get('min_bitrate_type') is not None:
- new_object_params['minBitrateType'] = self.new_object.get('minBitrateType') or \
- self.new_object.get('min_bitrate_type')
- if self.new_object.get('bandSelectionType') is not None or self.new_object.get('band_selection_type') is not None:
- new_object_params['bandSelectionType'] = self.new_object.get('bandSelectionType') or \
- self.new_object.get('band_selection_type')
if self.new_object.get('apBandSettings') is not None or self.new_object.get('ap_band_settings') is not None:
new_object_params['apBandSettings'] = self.new_object.get('apBandSettings') or \
self.new_object.get('ap_band_settings')
- if self.new_object.get('twoFourGhzSettings') is not None or self.new_object.get('two_four_ghz_settings') is not None:
- new_object_params['twoFourGhzSettings'] = self.new_object.get('twoFourGhzSettings') or \
- self.new_object.get('two_four_ghz_settings')
+ if self.new_object.get('bandSelectionType') is not None or self.new_object.get('band_selection_type') is not None:
+ new_object_params['bandSelectionType'] = self.new_object.get('bandSelectionType') or \
+ self.new_object.get('band_selection_type')
+ if self.new_object.get('clientBalancingEnabled') is not None or self.new_object.get('client_balancing_enabled') is not None:
+ new_object_params['clientBalancingEnabled'] = self.new_object.get('clientBalancingEnabled')
if self.new_object.get('fiveGhzSettings') is not None or self.new_object.get('five_ghz_settings') is not None:
new_object_params['fiveGhzSettings'] = self.new_object.get('fiveGhzSettings') or \
self.new_object.get('five_ghz_settings')
+ if self.new_object.get('flexRadios') is not None or self.new_object.get('flex_radios') is not None:
+ new_object_params['flexRadios'] = self.new_object.get('flexRadios') or \
+ self.new_object.get('flex_radios')
+ if self.new_object.get('minBitrateType') is not None or self.new_object.get('min_bitrate_type') is not None:
+ new_object_params['minBitrateType'] = self.new_object.get('minBitrateType') or \
+ self.new_object.get('min_bitrate_type')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('perSsidSettings') is not None or self.new_object.get('per_ssid_settings') is not None:
+ new_object_params['perSsidSettings'] = self.new_object.get('perSsidSettings') or \
+ self.new_object.get('per_ssid_settings')
if self.new_object.get('sixGhzSettings') is not None or self.new_object.get('six_ghz_settings') is not None:
new_object_params['sixGhzSettings'] = self.new_object.get('sixGhzSettings') or \
self.new_object.get('six_ghz_settings')
if self.new_object.get('transmission') is not None or self.new_object.get('transmission') is not None:
new_object_params['transmission'] = self.new_object.get('transmission') or \
self.new_object.get('transmission')
- if self.new_object.get('perSsidSettings') is not None or self.new_object.get('per_ssid_settings') is not None:
- new_object_params['perSsidSettings'] = self.new_object.get('perSsidSettings') or \
- self.new_object.get('per_ssid_settings')
+ if self.new_object.get('twoFourGhzSettings') is not None or self.new_object.get('two_four_ghz_settings') is not None:
+ new_object_params['twoFourGhzSettings'] = self.new_object.get('twoFourGhzSettings') or \
+ self.new_object.get('two_four_ghz_settings')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -141,35 +146,38 @@ class NetworksWirelessRfProfiles(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('clientBalancingEnabled') is not None or self.new_object.get('client_balancing_enabled') is not None:
- new_object_params['clientBalancingEnabled'] = self.new_object.get('clientBalancingEnabled')
- if self.new_object.get('minBitrateType') is not None or self.new_object.get('min_bitrate_type') is not None:
- new_object_params['minBitrateType'] = self.new_object.get('minBitrateType') or \
- self.new_object.get('min_bitrate_type')
- if self.new_object.get('bandSelectionType') is not None or self.new_object.get('band_selection_type') is not None:
- new_object_params['bandSelectionType'] = self.new_object.get('bandSelectionType') or \
- self.new_object.get('band_selection_type')
if self.new_object.get('apBandSettings') is not None or self.new_object.get('ap_band_settings') is not None:
new_object_params['apBandSettings'] = self.new_object.get('apBandSettings') or \
self.new_object.get('ap_band_settings')
- if self.new_object.get('twoFourGhzSettings') is not None or self.new_object.get('two_four_ghz_settings') is not None:
- new_object_params['twoFourGhzSettings'] = self.new_object.get('twoFourGhzSettings') or \
- self.new_object.get('two_four_ghz_settings')
+ if self.new_object.get('bandSelectionType') is not None or self.new_object.get('band_selection_type') is not None:
+ new_object_params['bandSelectionType'] = self.new_object.get('bandSelectionType') or \
+ self.new_object.get('band_selection_type')
+ if self.new_object.get('clientBalancingEnabled') is not None or self.new_object.get('client_balancing_enabled') is not None:
+ new_object_params['clientBalancingEnabled'] = self.new_object.get('clientBalancingEnabled')
if self.new_object.get('fiveGhzSettings') is not None or self.new_object.get('five_ghz_settings') is not None:
new_object_params['fiveGhzSettings'] = self.new_object.get('fiveGhzSettings') or \
self.new_object.get('five_ghz_settings')
+ if self.new_object.get('flexRadios') is not None or self.new_object.get('flex_radios') is not None:
+ new_object_params['flexRadios'] = self.new_object.get('flexRadios') or \
+ self.new_object.get('flex_radios')
+ if self.new_object.get('minBitrateType') is not None or self.new_object.get('min_bitrate_type') is not None:
+ new_object_params['minBitrateType'] = self.new_object.get('minBitrateType') or \
+ self.new_object.get('min_bitrate_type')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('perSsidSettings') is not None or self.new_object.get('per_ssid_settings') is not None:
+ new_object_params['perSsidSettings'] = self.new_object.get('perSsidSettings') or \
+ self.new_object.get('per_ssid_settings')
if self.new_object.get('sixGhzSettings') is not None or self.new_object.get('six_ghz_settings') is not None:
new_object_params['sixGhzSettings'] = self.new_object.get('sixGhzSettings') or \
self.new_object.get('six_ghz_settings')
if self.new_object.get('transmission') is not None or self.new_object.get('transmission') is not None:
new_object_params['transmission'] = self.new_object.get('transmission') or \
self.new_object.get('transmission')
- if self.new_object.get('perSsidSettings') is not None or self.new_object.get('per_ssid_settings') is not None:
- new_object_params['perSsidSettings'] = self.new_object.get('perSsidSettings') or \
- self.new_object.get('per_ssid_settings')
+ if self.new_object.get('twoFourGhzSettings') is not None or self.new_object.get('two_four_ghz_settings') is not None:
+ new_object_params['twoFourGhzSettings'] = self.new_object.get('twoFourGhzSettings') or \
+ self.new_object.get('two_four_ghz_settings')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -247,16 +255,17 @@ class NetworksWirelessRfProfiles(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("clientBalancingEnabled", "clientBalancingEnabled"),
- ("minBitrateType", "minBitrateType"),
- ("bandSelectionType", "bandSelectionType"),
("apBandSettings", "apBandSettings"),
- ("twoFourGhzSettings", "twoFourGhzSettings"),
+ ("bandSelectionType", "bandSelectionType"),
+ ("clientBalancingEnabled", "clientBalancingEnabled"),
("fiveGhzSettings", "fiveGhzSettings"),
+ ("flexRadios", "flexRadios"),
+ ("minBitrateType", "minBitrateType"),
+ ("name", "name"),
+ ("perSsidSettings", "perSsidSettings"),
("sixGhzSettings", "sixGhzSettings"),
("transmission", "transmission"),
- ("perSsidSettings", "perSsidSettings"),
+ ("twoFourGhzSettings", "twoFourGhzSettings"),
("networkId", "networkId"),
("rfProfileId", "rfProfileId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_settings.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_settings.py
index 2a7543475..4fecff005 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_settings.py
@@ -32,11 +32,12 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- meshingEnabled=dict(type="bool"),
ipv6BridgeEnabled=dict(type="bool"),
+ ledLightsOn=dict(type="bool"),
locationAnalyticsEnabled=dict(type="bool"),
+ meshingEnabled=dict(type="bool"),
+ namedVlans=dict(type="dict"),
upgradeStrategy=dict(type="str"),
- ledLightsOn=dict(type="bool"),
networkId=dict(type="str"),
))
@@ -52,11 +53,12 @@ class NetworksWirelessSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- meshingEnabled=params.get("meshingEnabled"),
ipv6BridgeEnabled=params.get("ipv6BridgeEnabled"),
+ ledLightsOn=params.get("ledLightsOn"),
locationAnalyticsEnabled=params.get("locationAnalyticsEnabled"),
+ meshingEnabled=params.get("meshingEnabled"),
+ namedVlans=params.get("namedVlans"),
upgradeStrategy=params.get("upgradeStrategy"),
- ledLightsOn=params.get("ledLightsOn"),
network_id=params.get("networkId"),
)
@@ -69,17 +71,20 @@ class NetworksWirelessSettings(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('meshingEnabled') is not None or self.new_object.get('meshing_enabled') is not None:
- new_object_params['meshingEnabled'] = self.new_object.get('meshingEnabled')
if self.new_object.get('ipv6BridgeEnabled') is not None or self.new_object.get('ipv6_bridge_enabled') is not None:
new_object_params['ipv6BridgeEnabled'] = self.new_object.get('ipv6BridgeEnabled')
+ if self.new_object.get('ledLightsOn') is not None or self.new_object.get('led_lights_on') is not None:
+ new_object_params['ledLightsOn'] = self.new_object.get('ledLightsOn')
if self.new_object.get('locationAnalyticsEnabled') is not None or self.new_object.get('location_analytics_enabled') is not None:
new_object_params['locationAnalyticsEnabled'] = self.new_object.get('locationAnalyticsEnabled')
+ if self.new_object.get('meshingEnabled') is not None or self.new_object.get('meshing_enabled') is not None:
+ new_object_params['meshingEnabled'] = self.new_object.get('meshingEnabled')
+ if self.new_object.get('namedVlans') is not None or self.new_object.get('named_vlans') is not None:
+ new_object_params['namedVlans'] = self.new_object.get('namedVlans') or \
+ self.new_object.get('named_vlans')
if self.new_object.get('upgradeStrategy') is not None or self.new_object.get('upgrade_strategy') is not None:
new_object_params['upgradeStrategy'] = self.new_object.get('upgradeStrategy') or \
self.new_object.get('upgrade_strategy')
- if self.new_object.get('ledLightsOn') is not None or self.new_object.get('led_lights_on') is not None:
- new_object_params['ledLightsOn'] = self.new_object.get('ledLightsOn')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -136,11 +141,12 @@ class NetworksWirelessSettings(object):
requested_obj = self.new_object
obj_params = [
- ("meshingEnabled", "meshingEnabled"),
("ipv6BridgeEnabled", "ipv6BridgeEnabled"),
+ ("ledLightsOn", "ledLightsOn"),
("locationAnalyticsEnabled", "locationAnalyticsEnabled"),
+ ("meshingEnabled", "meshingEnabled"),
+ ("namedVlans", "namedVlans"),
("upgradeStrategy", "upgradeStrategy"),
- ("ledLightsOn", "ledLightsOn"),
("networkId", "networkId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids.py
index eb8affa88..24272855d 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids.py
@@ -32,64 +32,65 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- name=dict(type="str"),
- enabled=dict(type="bool"),
+ activeDirectory=dict(type="dict"),
+ adultContentFilteringEnabled=dict(type="bool"),
+ apTagsAndVlanIds=dict(type="list"),
authMode=dict(type="str"),
- enterpriseAdminAccess=dict(type="str"),
- encryptionMode=dict(type="str"),
- psk=dict(type="str"),
- wpaEncryptionMode=dict(type="str"),
- dot11w=dict(type="dict"),
+ availabilityTags=dict(type="list"),
+ availableOnAllAps=dict(type="bool"),
+ bandSelection=dict(type="str"),
+ concentratorNetworkId=dict(type="str"),
+ defaultVlanId=dict(type="int"),
+ disassociateClientsOnVpnFailover=dict(type="bool"),
+ dnsRewrite=dict(type="dict"),
dot11r=dict(type="dict"),
- splashPage=dict(type="str"),
- splashGuestSponsorDomains=dict(type="list"),
- oauth=dict(type="dict"),
- localRadius=dict(type="dict"),
+ dot11w=dict(type="dict"),
+ enabled=dict(type="bool"),
+ encryptionMode=dict(type="str"),
+ enterpriseAdminAccess=dict(type="str"),
+ gre=dict(type="dict"),
+ ipAssignmentMode=dict(type="str"),
+ lanIsolationEnabled=dict(type="bool"),
ldap=dict(type="dict"),
- activeDirectory=dict(type="dict"),
- radiusServers=dict(type="list"),
- radiusProxyEnabled=dict(type="bool"),
- radiusTestingEnabled=dict(type="bool"),
- radiusCalledStationId=dict(type="str"),
+ localRadius=dict(type="dict"),
+ mandatoryDhcpEnabled=dict(type="bool"),
+ minBitrate=dict(type="float"),
+ name=dict(type="str"),
+ namedVlans=dict(type="dict"),
+ oauth=dict(type="dict"),
+ perClientBandwidthLimitDown=dict(type="int"),
+ perClientBandwidthLimitUp=dict(type="int"),
+ perSsidBandwidthLimitDown=dict(type="int"),
+ perSsidBandwidthLimitUp=dict(type="int"),
+ psk=dict(type="str"),
+ radiusAccountingEnabled=dict(type="bool"),
+ radiusAccountingInterimInterval=dict(type="int"),
+ radiusAccountingServers=dict(type="list"),
+ radiusAttributeForGroupPolicies=dict(type="str"),
radiusAuthenticationNasId=dict(type="str"),
- radiusServerTimeout=dict(type="int"),
- radiusServerAttemptsLimit=dict(type="int"),
- radiusFallbackEnabled=dict(type="bool"),
+ radiusCalledStationId=dict(type="str"),
radiusCoaEnabled=dict(type="bool"),
radiusFailoverPolicy=dict(type="str"),
+ radiusFallbackEnabled=dict(type="bool"),
+ radiusGuestVlanEnabled=dict(type="bool"),
+ radiusGuestVlanId=dict(type="int"),
radiusLoadBalancingPolicy=dict(type="str"),
- radiusAccountingEnabled=dict(type="bool"),
- radiusAccountingServers=dict(type="list"),
- radiusAccountingInterimInterval=dict(type="int"),
- radiusAttributeForGroupPolicies=dict(type="str"),
- ipAssignmentMode=dict(type="str"),
- useVlanTagging=dict(type="bool"),
- concentratorNetworkId=dict(type="str"),
+ radiusOverride=dict(type="bool"),
+ radiusProxyEnabled=dict(type="bool"),
+ radiusServerAttemptsLimit=dict(type="int"),
+ radiusServerTimeout=dict(type="int"),
+ radiusServers=dict(type="list"),
+ radiusTestingEnabled=dict(type="bool"),
secondaryConcentratorNetworkId=dict(type="str"),
- disassociateClientsOnVpnFailover=dict(type="bool"),
+ speedBurst=dict(type="dict"),
+ splashGuestSponsorDomains=dict(type="list"),
+ splashPage=dict(type="str"),
+ useVlanTagging=dict(type="bool"),
+ visible=dict(type="bool"),
vlanId=dict(type="int"),
- defaultVlanId=dict(type="int"),
- apTagsAndVlanIds=dict(type="list"),
walledGardenEnabled=dict(type="bool"),
walledGardenRanges=dict(type="list"),
- gre=dict(type="dict"),
- radiusOverride=dict(type="bool"),
- radiusGuestVlanEnabled=dict(type="bool"),
- radiusGuestVlanId=dict(type="int"),
- minBitrate=dict(type="float"),
- bandSelection=dict(type="str"),
- perClientBandwidthLimitUp=dict(type="int"),
- perClientBandwidthLimitDown=dict(type="int"),
- perSsidBandwidthLimitUp=dict(type="int"),
- perSsidBandwidthLimitDown=dict(type="int"),
- lanIsolationEnabled=dict(type="bool"),
- visible=dict(type="bool"),
- availableOnAllAps=dict(type="bool"),
- availabilityTags=dict(type="list"),
- mandatoryDhcpEnabled=dict(type="bool"),
- adultContentFilteringEnabled=dict(type="bool"),
- dnsRewrite=dict(type="dict"),
- speedBurst=dict(type="dict"),
+ wpaEncryptionMode=dict(type="str"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -106,64 +107,65 @@ class NetworksWirelessSsids(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- enabled=params.get("enabled"),
+ activeDirectory=params.get("activeDirectory"),
+ adultContentFilteringEnabled=params.get("adultContentFilteringEnabled"),
+ apTagsAndVlanIds=params.get("apTagsAndVlanIds"),
authMode=params.get("authMode"),
- enterpriseAdminAccess=params.get("enterpriseAdminAccess"),
- encryptionMode=params.get("encryptionMode"),
- psk=params.get("psk"),
- wpaEncryptionMode=params.get("wpaEncryptionMode"),
- dot11w=params.get("dot11w"),
+ availabilityTags=params.get("availabilityTags"),
+ availableOnAllAps=params.get("availableOnAllAps"),
+ bandSelection=params.get("bandSelection"),
+ concentratorNetworkId=params.get("concentratorNetworkId"),
+ defaultVlanId=params.get("defaultVlanId"),
+ disassociateClientsOnVpnFailover=params.get("disassociateClientsOnVpnFailover"),
+ dnsRewrite=params.get("dnsRewrite"),
dot11r=params.get("dot11r"),
- splashPage=params.get("splashPage"),
- splashGuestSponsorDomains=params.get("splashGuestSponsorDomains"),
- oauth=params.get("oauth"),
- localRadius=params.get("localRadius"),
+ dot11w=params.get("dot11w"),
+ enabled=params.get("enabled"),
+ encryptionMode=params.get("encryptionMode"),
+ enterpriseAdminAccess=params.get("enterpriseAdminAccess"),
+ gre=params.get("gre"),
+ ipAssignmentMode=params.get("ipAssignmentMode"),
+ lanIsolationEnabled=params.get("lanIsolationEnabled"),
ldap=params.get("ldap"),
- activeDirectory=params.get("activeDirectory"),
- radiusServers=params.get("radiusServers"),
- radiusProxyEnabled=params.get("radiusProxyEnabled"),
- radiusTestingEnabled=params.get("radiusTestingEnabled"),
- radiusCalledStationId=params.get("radiusCalledStationId"),
+ localRadius=params.get("localRadius"),
+ mandatoryDhcpEnabled=params.get("mandatoryDhcpEnabled"),
+ minBitrate=params.get("minBitrate"),
+ name=params.get("name"),
+ namedVlans=params.get("namedVlans"),
+ oauth=params.get("oauth"),
+ perClientBandwidthLimitDown=params.get("perClientBandwidthLimitDown"),
+ perClientBandwidthLimitUp=params.get("perClientBandwidthLimitUp"),
+ perSsidBandwidthLimitDown=params.get("perSsidBandwidthLimitDown"),
+ perSsidBandwidthLimitUp=params.get("perSsidBandwidthLimitUp"),
+ psk=params.get("psk"),
+ radiusAccountingEnabled=params.get("radiusAccountingEnabled"),
+ radiusAccountingInterimInterval=params.get("radiusAccountingInterimInterval"),
+ radiusAccountingServers=params.get("radiusAccountingServers"),
+ radiusAttributeForGroupPolicies=params.get("radiusAttributeForGroupPolicies"),
radiusAuthenticationNasId=params.get("radiusAuthenticationNasId"),
- radiusServerTimeout=params.get("radiusServerTimeout"),
- radiusServerAttemptsLimit=params.get("radiusServerAttemptsLimit"),
- radiusFallbackEnabled=params.get("radiusFallbackEnabled"),
+ radiusCalledStationId=params.get("radiusCalledStationId"),
radiusCoaEnabled=params.get("radiusCoaEnabled"),
radiusFailoverPolicy=params.get("radiusFailoverPolicy"),
+ radiusFallbackEnabled=params.get("radiusFallbackEnabled"),
+ radiusGuestVlanEnabled=params.get("radiusGuestVlanEnabled"),
+ radiusGuestVlanId=params.get("radiusGuestVlanId"),
radiusLoadBalancingPolicy=params.get("radiusLoadBalancingPolicy"),
- radiusAccountingEnabled=params.get("radiusAccountingEnabled"),
- radiusAccountingServers=params.get("radiusAccountingServers"),
- radiusAccountingInterimInterval=params.get("radiusAccountingInterimInterval"),
- radiusAttributeForGroupPolicies=params.get("radiusAttributeForGroupPolicies"),
- ipAssignmentMode=params.get("ipAssignmentMode"),
- useVlanTagging=params.get("useVlanTagging"),
- concentratorNetworkId=params.get("concentratorNetworkId"),
+ radiusOverride=params.get("radiusOverride"),
+ radiusProxyEnabled=params.get("radiusProxyEnabled"),
+ radiusServerAttemptsLimit=params.get("radiusServerAttemptsLimit"),
+ radiusServerTimeout=params.get("radiusServerTimeout"),
+ radiusServers=params.get("radiusServers"),
+ radiusTestingEnabled=params.get("radiusTestingEnabled"),
secondaryConcentratorNetworkId=params.get("secondaryConcentratorNetworkId"),
- disassociateClientsOnVpnFailover=params.get("disassociateClientsOnVpnFailover"),
+ speedBurst=params.get("speedBurst"),
+ splashGuestSponsorDomains=params.get("splashGuestSponsorDomains"),
+ splashPage=params.get("splashPage"),
+ useVlanTagging=params.get("useVlanTagging"),
+ visible=params.get("visible"),
vlanId=params.get("vlanId"),
- defaultVlanId=params.get("defaultVlanId"),
- apTagsAndVlanIds=params.get("apTagsAndVlanIds"),
walledGardenEnabled=params.get("walledGardenEnabled"),
walledGardenRanges=params.get("walledGardenRanges"),
- gre=params.get("gre"),
- radiusOverride=params.get("radiusOverride"),
- radiusGuestVlanEnabled=params.get("radiusGuestVlanEnabled"),
- radiusGuestVlanId=params.get("radiusGuestVlanId"),
- minBitrate=params.get("minBitrate"),
- bandSelection=params.get("bandSelection"),
- perClientBandwidthLimitUp=params.get("perClientBandwidthLimitUp"),
- perClientBandwidthLimitDown=params.get("perClientBandwidthLimitDown"),
- perSsidBandwidthLimitUp=params.get("perSsidBandwidthLimitUp"),
- perSsidBandwidthLimitDown=params.get("perSsidBandwidthLimitDown"),
- lanIsolationEnabled=params.get("lanIsolationEnabled"),
- visible=params.get("visible"),
- availableOnAllAps=params.get("availableOnAllAps"),
- availabilityTags=params.get("availabilityTags"),
- mandatoryDhcpEnabled=params.get("mandatoryDhcpEnabled"),
- adultContentFilteringEnabled=params.get("adultContentFilteringEnabled"),
- dnsRewrite=params.get("dnsRewrite"),
- speedBurst=params.get("speedBurst"),
+ wpaEncryptionMode=params.get("wpaEncryptionMode"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -186,164 +188,167 @@ class NetworksWirelessSsids(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('activeDirectory') is not None or self.new_object.get('active_directory') is not None:
+ new_object_params['activeDirectory'] = self.new_object.get('activeDirectory') or \
+ self.new_object.get('active_directory')
+ if self.new_object.get('adultContentFilteringEnabled') is not None or self.new_object.get('adult_content_filtering_enabled') is not None:
+ new_object_params['adultContentFilteringEnabled'] = self.new_object.get('adultContentFilteringEnabled')
+ if self.new_object.get('apTagsAndVlanIds') is not None or self.new_object.get('ap_tags_and_vlan_ids') is not None:
+ new_object_params['apTagsAndVlanIds'] = self.new_object.get('apTagsAndVlanIds') or \
+ self.new_object.get('ap_tags_and_vlan_ids')
if self.new_object.get('authMode') is not None or self.new_object.get('auth_mode') is not None:
new_object_params['authMode'] = self.new_object.get('authMode') or \
self.new_object.get('auth_mode')
- if self.new_object.get('enterpriseAdminAccess') is not None or self.new_object.get('enterprise_admin_access') is not None:
- new_object_params['enterpriseAdminAccess'] = self.new_object.get('enterpriseAdminAccess') or \
- self.new_object.get('enterprise_admin_access')
- if self.new_object.get('encryptionMode') is not None or self.new_object.get('encryption_mode') is not None:
- new_object_params['encryptionMode'] = self.new_object.get('encryptionMode') or \
- self.new_object.get('encryption_mode')
- if self.new_object.get('psk') is not None or self.new_object.get('psk') is not None:
- new_object_params['psk'] = self.new_object.get('psk') or \
- self.new_object.get('psk')
- if self.new_object.get('wpaEncryptionMode') is not None or self.new_object.get('wpa_encryption_mode') is not None:
- new_object_params['wpaEncryptionMode'] = self.new_object.get('wpaEncryptionMode') or \
- self.new_object.get('wpa_encryption_mode')
- if self.new_object.get('dot11w') is not None or self.new_object.get('dot11w') is not None:
- new_object_params['dot11w'] = self.new_object.get('dot11w') or \
- self.new_object.get('dot11w')
+ if self.new_object.get('availabilityTags') is not None or self.new_object.get('availability_tags') is not None:
+ new_object_params['availabilityTags'] = self.new_object.get('availabilityTags') or \
+ self.new_object.get('availability_tags')
+ if self.new_object.get('availableOnAllAps') is not None or self.new_object.get('available_on_all_aps') is not None:
+ new_object_params['availableOnAllAps'] = self.new_object.get('availableOnAllAps')
+ if self.new_object.get('bandSelection') is not None or self.new_object.get('band_selection') is not None:
+ new_object_params['bandSelection'] = self.new_object.get('bandSelection') or \
+ self.new_object.get('band_selection')
+ if self.new_object.get('concentratorNetworkId') is not None or self.new_object.get('concentrator_network_id') is not None:
+ new_object_params['concentratorNetworkId'] = self.new_object.get('concentratorNetworkId') or \
+ self.new_object.get('concentrator_network_id')
+ if self.new_object.get('defaultVlanId') is not None or self.new_object.get('default_vlan_id') is not None:
+ new_object_params['defaultVlanId'] = self.new_object.get('defaultVlanId') or \
+ self.new_object.get('default_vlan_id')
+ if self.new_object.get('disassociateClientsOnVpnFailover') is not None or self.new_object.get('disassociate_clients_on_vpn_failover') is not None:
+ new_object_params['disassociateClientsOnVpnFailover'] = self.new_object.get('disassociateClientsOnVpnFailover')
+ if self.new_object.get('dnsRewrite') is not None or self.new_object.get('dns_rewrite') is not None:
+ new_object_params['dnsRewrite'] = self.new_object.get('dnsRewrite') or \
+ self.new_object.get('dns_rewrite')
if self.new_object.get('dot11r') is not None or self.new_object.get('dot11r') is not None:
new_object_params['dot11r'] = self.new_object.get('dot11r') or \
self.new_object.get('dot11r')
- if self.new_object.get('splashPage') is not None or self.new_object.get('splash_page') is not None:
- new_object_params['splashPage'] = self.new_object.get('splashPage') or \
- self.new_object.get('splash_page')
- if self.new_object.get('splashGuestSponsorDomains') is not None or self.new_object.get('splash_guest_sponsor_domains') is not None:
- new_object_params['splashGuestSponsorDomains'] = self.new_object.get('splashGuestSponsorDomains') or \
- self.new_object.get('splash_guest_sponsor_domains')
- if self.new_object.get('oauth') is not None or self.new_object.get('oauth') is not None:
- new_object_params['oauth'] = self.new_object.get('oauth') or \
- self.new_object.get('oauth')
- if self.new_object.get('localRadius') is not None or self.new_object.get('local_radius') is not None:
- new_object_params['localRadius'] = self.new_object.get('localRadius') or \
- self.new_object.get('local_radius')
+ if self.new_object.get('dot11w') is not None or self.new_object.get('dot11w') is not None:
+ new_object_params['dot11w'] = self.new_object.get('dot11w') or \
+ self.new_object.get('dot11w')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('encryptionMode') is not None or self.new_object.get('encryption_mode') is not None:
+ new_object_params['encryptionMode'] = self.new_object.get('encryptionMode') or \
+ self.new_object.get('encryption_mode')
+ if self.new_object.get('enterpriseAdminAccess') is not None or self.new_object.get('enterprise_admin_access') is not None:
+ new_object_params['enterpriseAdminAccess'] = self.new_object.get('enterpriseAdminAccess') or \
+ self.new_object.get('enterprise_admin_access')
+ if self.new_object.get('gre') is not None or self.new_object.get('gre') is not None:
+ new_object_params['gre'] = self.new_object.get('gre') or \
+ self.new_object.get('gre')
+ if self.new_object.get('ipAssignmentMode') is not None or self.new_object.get('ip_assignment_mode') is not None:
+ new_object_params['ipAssignmentMode'] = self.new_object.get('ipAssignmentMode') or \
+ self.new_object.get('ip_assignment_mode')
+ if self.new_object.get('lanIsolationEnabled') is not None or self.new_object.get('lan_isolation_enabled') is not None:
+ new_object_params['lanIsolationEnabled'] = self.new_object.get('lanIsolationEnabled')
if self.new_object.get('ldap') is not None or self.new_object.get('ldap') is not None:
new_object_params['ldap'] = self.new_object.get('ldap') or \
self.new_object.get('ldap')
- if self.new_object.get('activeDirectory') is not None or self.new_object.get('active_directory') is not None:
- new_object_params['activeDirectory'] = self.new_object.get('activeDirectory') or \
- self.new_object.get('active_directory')
- if self.new_object.get('radiusServers') is not None or self.new_object.get('radius_servers') is not None:
- new_object_params['radiusServers'] = self.new_object.get('radiusServers') or \
- self.new_object.get('radius_servers')
- if self.new_object.get('radiusProxyEnabled') is not None or self.new_object.get('radius_proxy_enabled') is not None:
- new_object_params['radiusProxyEnabled'] = self.new_object.get('radiusProxyEnabled')
- if self.new_object.get('radiusTestingEnabled') is not None or self.new_object.get('radius_testing_enabled') is not None:
- new_object_params['radiusTestingEnabled'] = self.new_object.get('radiusTestingEnabled')
- if self.new_object.get('radiusCalledStationId') is not None or self.new_object.get('radius_called_station_id') is not None:
- new_object_params['radiusCalledStationId'] = self.new_object.get('radiusCalledStationId') or \
- self.new_object.get('radius_called_station_id')
+ if self.new_object.get('localRadius') is not None or self.new_object.get('local_radius') is not None:
+ new_object_params['localRadius'] = self.new_object.get('localRadius') or \
+ self.new_object.get('local_radius')
+ if self.new_object.get('mandatoryDhcpEnabled') is not None or self.new_object.get('mandatory_dhcp_enabled') is not None:
+ new_object_params['mandatoryDhcpEnabled'] = self.new_object.get('mandatoryDhcpEnabled')
+ if self.new_object.get('minBitrate') is not None or self.new_object.get('min_bitrate') is not None:
+ new_object_params['minBitrate'] = self.new_object.get('minBitrate') or \
+ self.new_object.get('min_bitrate')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('namedVlans') is not None or self.new_object.get('named_vlans') is not None:
+ new_object_params['namedVlans'] = self.new_object.get('namedVlans') or \
+ self.new_object.get('named_vlans')
+ if self.new_object.get('oauth') is not None or self.new_object.get('oauth') is not None:
+ new_object_params['oauth'] = self.new_object.get('oauth') or \
+ self.new_object.get('oauth')
+ if self.new_object.get('perClientBandwidthLimitDown') is not None or self.new_object.get('per_client_bandwidth_limit_down') is not None:
+ new_object_params['perClientBandwidthLimitDown'] = self.new_object.get('perClientBandwidthLimitDown') or \
+ self.new_object.get('per_client_bandwidth_limit_down')
+ if self.new_object.get('perClientBandwidthLimitUp') is not None or self.new_object.get('per_client_bandwidth_limit_up') is not None:
+ new_object_params['perClientBandwidthLimitUp'] = self.new_object.get('perClientBandwidthLimitUp') or \
+ self.new_object.get('per_client_bandwidth_limit_up')
+ if self.new_object.get('perSsidBandwidthLimitDown') is not None or self.new_object.get('per_ssid_bandwidth_limit_down') is not None:
+ new_object_params['perSsidBandwidthLimitDown'] = self.new_object.get('perSsidBandwidthLimitDown') or \
+ self.new_object.get('per_ssid_bandwidth_limit_down')
+ if self.new_object.get('perSsidBandwidthLimitUp') is not None or self.new_object.get('per_ssid_bandwidth_limit_up') is not None:
+ new_object_params['perSsidBandwidthLimitUp'] = self.new_object.get('perSsidBandwidthLimitUp') or \
+ self.new_object.get('per_ssid_bandwidth_limit_up')
+ if self.new_object.get('psk') is not None or self.new_object.get('psk') is not None:
+ new_object_params['psk'] = self.new_object.get('psk') or \
+ self.new_object.get('psk')
+ if self.new_object.get('radiusAccountingEnabled') is not None or self.new_object.get('radius_accounting_enabled') is not None:
+ new_object_params['radiusAccountingEnabled'] = self.new_object.get('radiusAccountingEnabled')
+ if self.new_object.get('radiusAccountingInterimInterval') is not None or self.new_object.get('radius_accounting_interim_interval') is not None:
+ new_object_params['radiusAccountingInterimInterval'] = self.new_object.get('radiusAccountingInterimInterval') or \
+ self.new_object.get('radius_accounting_interim_interval')
+ if self.new_object.get('radiusAccountingServers') is not None or self.new_object.get('radius_accounting_servers') is not None:
+ new_object_params['radiusAccountingServers'] = self.new_object.get('radiusAccountingServers') or \
+ self.new_object.get('radius_accounting_servers')
+ if self.new_object.get('radiusAttributeForGroupPolicies') is not None or self.new_object.get('radius_attribute_for_group_policies') is not None:
+ new_object_params['radiusAttributeForGroupPolicies'] = self.new_object.get('radiusAttributeForGroupPolicies') or \
+ self.new_object.get('radius_attribute_for_group_policies')
if self.new_object.get('radiusAuthenticationNasId') is not None or self.new_object.get('radius_authentication_nas_id') is not None:
new_object_params['radiusAuthenticationNasId'] = self.new_object.get('radiusAuthenticationNasId') or \
self.new_object.get('radius_authentication_nas_id')
- if self.new_object.get('radiusServerTimeout') is not None or self.new_object.get('radius_server_timeout') is not None:
- new_object_params['radiusServerTimeout'] = self.new_object.get('radiusServerTimeout') or \
- self.new_object.get('radius_server_timeout')
- if self.new_object.get('radiusServerAttemptsLimit') is not None or self.new_object.get('radius_server_attempts_limit') is not None:
- new_object_params['radiusServerAttemptsLimit'] = self.new_object.get('radiusServerAttemptsLimit') or \
- self.new_object.get('radius_server_attempts_limit')
- if self.new_object.get('radiusFallbackEnabled') is not None or self.new_object.get('radius_fallback_enabled') is not None:
- new_object_params['radiusFallbackEnabled'] = self.new_object.get('radiusFallbackEnabled')
+ if self.new_object.get('radiusCalledStationId') is not None or self.new_object.get('radius_called_station_id') is not None:
+ new_object_params['radiusCalledStationId'] = self.new_object.get('radiusCalledStationId') or \
+ self.new_object.get('radius_called_station_id')
if self.new_object.get('radiusCoaEnabled') is not None or self.new_object.get('radius_coa_enabled') is not None:
new_object_params['radiusCoaEnabled'] = self.new_object.get('radiusCoaEnabled')
if self.new_object.get('radiusFailoverPolicy') is not None or self.new_object.get('radius_failover_policy') is not None:
new_object_params['radiusFailoverPolicy'] = self.new_object.get('radiusFailoverPolicy') or \
self.new_object.get('radius_failover_policy')
+ if self.new_object.get('radiusFallbackEnabled') is not None or self.new_object.get('radius_fallback_enabled') is not None:
+ new_object_params['radiusFallbackEnabled'] = self.new_object.get('radiusFallbackEnabled')
+ if self.new_object.get('radiusGuestVlanEnabled') is not None or self.new_object.get('radius_guest_vlan_enabled') is not None:
+ new_object_params['radiusGuestVlanEnabled'] = self.new_object.get('radiusGuestVlanEnabled')
+ if self.new_object.get('radiusGuestVlanId') is not None or self.new_object.get('radius_guest_vlan_id') is not None:
+ new_object_params['radiusGuestVlanId'] = self.new_object.get('radiusGuestVlanId') or \
+ self.new_object.get('radius_guest_vlan_id')
if self.new_object.get('radiusLoadBalancingPolicy') is not None or self.new_object.get('radius_load_balancing_policy') is not None:
new_object_params['radiusLoadBalancingPolicy'] = self.new_object.get('radiusLoadBalancingPolicy') or \
self.new_object.get('radius_load_balancing_policy')
- if self.new_object.get('radiusAccountingEnabled') is not None or self.new_object.get('radius_accounting_enabled') is not None:
- new_object_params['radiusAccountingEnabled'] = self.new_object.get('radiusAccountingEnabled')
- if self.new_object.get('radiusAccountingServers') is not None or self.new_object.get('radius_accounting_servers') is not None:
- new_object_params['radiusAccountingServers'] = self.new_object.get('radiusAccountingServers') or \
- self.new_object.get('radius_accounting_servers')
- if self.new_object.get('radiusAccountingInterimInterval') is not None or self.new_object.get('radius_accounting_interim_interval') is not None:
- new_object_params['radiusAccountingInterimInterval'] = self.new_object.get('radiusAccountingInterimInterval') or \
- self.new_object.get('radius_accounting_interim_interval')
- if self.new_object.get('radiusAttributeForGroupPolicies') is not None or self.new_object.get('radius_attribute_for_group_policies') is not None:
- new_object_params['radiusAttributeForGroupPolicies'] = self.new_object.get('radiusAttributeForGroupPolicies') or \
- self.new_object.get('radius_attribute_for_group_policies')
- if self.new_object.get('ipAssignmentMode') is not None or self.new_object.get('ip_assignment_mode') is not None:
- new_object_params['ipAssignmentMode'] = self.new_object.get('ipAssignmentMode') or \
- self.new_object.get('ip_assignment_mode')
- if self.new_object.get('useVlanTagging') is not None or self.new_object.get('use_vlan_tagging') is not None:
- new_object_params['useVlanTagging'] = self.new_object.get('useVlanTagging')
- if self.new_object.get('concentratorNetworkId') is not None or self.new_object.get('concentrator_network_id') is not None:
- new_object_params['concentratorNetworkId'] = self.new_object.get('concentratorNetworkId') or \
- self.new_object.get('concentrator_network_id')
+ if self.new_object.get('radiusOverride') is not None or self.new_object.get('radius_override') is not None:
+ new_object_params['radiusOverride'] = self.new_object.get('radiusOverride')
+ if self.new_object.get('radiusProxyEnabled') is not None or self.new_object.get('radius_proxy_enabled') is not None:
+ new_object_params['radiusProxyEnabled'] = self.new_object.get('radiusProxyEnabled')
+ if self.new_object.get('radiusServerAttemptsLimit') is not None or self.new_object.get('radius_server_attempts_limit') is not None:
+ new_object_params['radiusServerAttemptsLimit'] = self.new_object.get('radiusServerAttemptsLimit') or \
+ self.new_object.get('radius_server_attempts_limit')
+ if self.new_object.get('radiusServerTimeout') is not None or self.new_object.get('radius_server_timeout') is not None:
+ new_object_params['radiusServerTimeout'] = self.new_object.get('radiusServerTimeout') or \
+ self.new_object.get('radius_server_timeout')
+ if self.new_object.get('radiusServers') is not None or self.new_object.get('radius_servers') is not None:
+ new_object_params['radiusServers'] = self.new_object.get('radiusServers') or \
+ self.new_object.get('radius_servers')
+ if self.new_object.get('radiusTestingEnabled') is not None or self.new_object.get('radius_testing_enabled') is not None:
+ new_object_params['radiusTestingEnabled'] = self.new_object.get('radiusTestingEnabled')
if self.new_object.get('secondaryConcentratorNetworkId') is not None or self.new_object.get('secondary_concentrator_network_id') is not None:
new_object_params['secondaryConcentratorNetworkId'] = self.new_object.get('secondaryConcentratorNetworkId') or \
self.new_object.get('secondary_concentrator_network_id')
- if self.new_object.get('disassociateClientsOnVpnFailover') is not None or self.new_object.get('disassociate_clients_on_vpn_failover') is not None:
- new_object_params['disassociateClientsOnVpnFailover'] = self.new_object.get('disassociateClientsOnVpnFailover')
+ if self.new_object.get('speedBurst') is not None or self.new_object.get('speed_burst') is not None:
+ new_object_params['speedBurst'] = self.new_object.get('speedBurst') or \
+ self.new_object.get('speed_burst')
+ if self.new_object.get('splashGuestSponsorDomains') is not None or self.new_object.get('splash_guest_sponsor_domains') is not None:
+ new_object_params['splashGuestSponsorDomains'] = self.new_object.get('splashGuestSponsorDomains') or \
+ self.new_object.get('splash_guest_sponsor_domains')
+ if self.new_object.get('splashPage') is not None or self.new_object.get('splash_page') is not None:
+ new_object_params['splashPage'] = self.new_object.get('splashPage') or \
+ self.new_object.get('splash_page')
+ if self.new_object.get('useVlanTagging') is not None or self.new_object.get('use_vlan_tagging') is not None:
+ new_object_params['useVlanTagging'] = self.new_object.get('useVlanTagging')
+ if self.new_object.get('visible') is not None or self.new_object.get('visible') is not None:
+ new_object_params['visible'] = self.new_object.get('visible')
if self.new_object.get('vlanId') is not None or self.new_object.get('vlan_id') is not None:
new_object_params['vlanId'] = self.new_object.get('vlanId') or \
self.new_object.get('vlan_id')
- if self.new_object.get('defaultVlanId') is not None or self.new_object.get('default_vlan_id') is not None:
- new_object_params['defaultVlanId'] = self.new_object.get('defaultVlanId') or \
- self.new_object.get('default_vlan_id')
- if self.new_object.get('apTagsAndVlanIds') is not None or self.new_object.get('ap_tags_and_vlan_ids') is not None:
- new_object_params['apTagsAndVlanIds'] = self.new_object.get('apTagsAndVlanIds') or \
- self.new_object.get('ap_tags_and_vlan_ids')
if self.new_object.get('walledGardenEnabled') is not None or self.new_object.get('walled_garden_enabled') is not None:
new_object_params['walledGardenEnabled'] = self.new_object.get('walledGardenEnabled')
if self.new_object.get('walledGardenRanges') is not None or self.new_object.get('walled_garden_ranges') is not None:
new_object_params['walledGardenRanges'] = self.new_object.get('walledGardenRanges') or \
self.new_object.get('walled_garden_ranges')
- if self.new_object.get('gre') is not None or self.new_object.get('gre') is not None:
- new_object_params['gre'] = self.new_object.get('gre') or \
- self.new_object.get('gre')
- if self.new_object.get('radiusOverride') is not None or self.new_object.get('radius_override') is not None:
- new_object_params['radiusOverride'] = self.new_object.get('radiusOverride')
- if self.new_object.get('radiusGuestVlanEnabled') is not None or self.new_object.get('radius_guest_vlan_enabled') is not None:
- new_object_params['radiusGuestVlanEnabled'] = self.new_object.get('radiusGuestVlanEnabled')
- if self.new_object.get('radiusGuestVlanId') is not None or self.new_object.get('radius_guest_vlan_id') is not None:
- new_object_params['radiusGuestVlanId'] = self.new_object.get('radiusGuestVlanId') or \
- self.new_object.get('radius_guest_vlan_id')
- if self.new_object.get('minBitrate') is not None or self.new_object.get('min_bitrate') is not None:
- new_object_params['minBitrate'] = self.new_object.get('minBitrate') or \
- self.new_object.get('min_bitrate')
- if self.new_object.get('bandSelection') is not None or self.new_object.get('band_selection') is not None:
- new_object_params['bandSelection'] = self.new_object.get('bandSelection') or \
- self.new_object.get('band_selection')
- if self.new_object.get('perClientBandwidthLimitUp') is not None or self.new_object.get('per_client_bandwidth_limit_up') is not None:
- new_object_params['perClientBandwidthLimitUp'] = self.new_object.get('perClientBandwidthLimitUp') or \
- self.new_object.get('per_client_bandwidth_limit_up')
- if self.new_object.get('perClientBandwidthLimitDown') is not None or self.new_object.get('per_client_bandwidth_limit_down') is not None:
- new_object_params['perClientBandwidthLimitDown'] = self.new_object.get('perClientBandwidthLimitDown') or \
- self.new_object.get('per_client_bandwidth_limit_down')
- if self.new_object.get('perSsidBandwidthLimitUp') is not None or self.new_object.get('per_ssid_bandwidth_limit_up') is not None:
- new_object_params['perSsidBandwidthLimitUp'] = self.new_object.get('perSsidBandwidthLimitUp') or \
- self.new_object.get('per_ssid_bandwidth_limit_up')
- if self.new_object.get('perSsidBandwidthLimitDown') is not None or self.new_object.get('per_ssid_bandwidth_limit_down') is not None:
- new_object_params['perSsidBandwidthLimitDown'] = self.new_object.get('perSsidBandwidthLimitDown') or \
- self.new_object.get('per_ssid_bandwidth_limit_down')
- if self.new_object.get('lanIsolationEnabled') is not None or self.new_object.get('lan_isolation_enabled') is not None:
- new_object_params['lanIsolationEnabled'] = self.new_object.get('lanIsolationEnabled')
- if self.new_object.get('visible') is not None or self.new_object.get('visible') is not None:
- new_object_params['visible'] = self.new_object.get('visible')
- if self.new_object.get('availableOnAllAps') is not None or self.new_object.get('available_on_all_aps') is not None:
- new_object_params['availableOnAllAps'] = self.new_object.get('availableOnAllAps')
- if self.new_object.get('availabilityTags') is not None or self.new_object.get('availability_tags') is not None:
- new_object_params['availabilityTags'] = self.new_object.get('availabilityTags') or \
- self.new_object.get('availability_tags')
- if self.new_object.get('mandatoryDhcpEnabled') is not None or self.new_object.get('mandatory_dhcp_enabled') is not None:
- new_object_params['mandatoryDhcpEnabled'] = self.new_object.get('mandatoryDhcpEnabled')
- if self.new_object.get('adultContentFilteringEnabled') is not None or self.new_object.get('adult_content_filtering_enabled') is not None:
- new_object_params['adultContentFilteringEnabled'] = self.new_object.get('adultContentFilteringEnabled')
- if self.new_object.get('dnsRewrite') is not None or self.new_object.get('dns_rewrite') is not None:
- new_object_params['dnsRewrite'] = self.new_object.get('dnsRewrite') or \
- self.new_object.get('dns_rewrite')
- if self.new_object.get('speedBurst') is not None or self.new_object.get('speed_burst') is not None:
- new_object_params['speedBurst'] = self.new_object.get('speedBurst') or \
- self.new_object.get('speed_burst')
+ if self.new_object.get('wpaEncryptionMode') is not None or self.new_object.get('wpa_encryption_mode') is not None:
+ new_object_params['wpaEncryptionMode'] = self.new_object.get('wpaEncryptionMode') or \
+ self.new_object.get('wpa_encryption_mode')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -421,64 +426,65 @@ class NetworksWirelessSsids(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("enabled", "enabled"),
+ ("activeDirectory", "activeDirectory"),
+ ("adultContentFilteringEnabled", "adultContentFilteringEnabled"),
+ ("apTagsAndVlanIds", "apTagsAndVlanIds"),
("authMode", "authMode"),
- ("enterpriseAdminAccess", "enterpriseAdminAccess"),
- ("encryptionMode", "encryptionMode"),
- ("psk", "psk"),
- ("wpaEncryptionMode", "wpaEncryptionMode"),
- ("dot11w", "dot11w"),
+ ("availabilityTags", "availabilityTags"),
+ ("availableOnAllAps", "availableOnAllAps"),
+ ("bandSelection", "bandSelection"),
+ ("concentratorNetworkId", "concentratorNetworkId"),
+ ("defaultVlanId", "defaultVlanId"),
+ ("disassociateClientsOnVpnFailover", "disassociateClientsOnVpnFailover"),
+ ("dnsRewrite", "dnsRewrite"),
("dot11r", "dot11r"),
- ("splashPage", "splashPage"),
- ("splashGuestSponsorDomains", "splashGuestSponsorDomains"),
- ("oauth", "oauth"),
- ("localRadius", "localRadius"),
+ ("dot11w", "dot11w"),
+ ("enabled", "enabled"),
+ ("encryptionMode", "encryptionMode"),
+ ("enterpriseAdminAccess", "enterpriseAdminAccess"),
+ ("gre", "gre"),
+ ("ipAssignmentMode", "ipAssignmentMode"),
+ ("lanIsolationEnabled", "lanIsolationEnabled"),
("ldap", "ldap"),
- ("activeDirectory", "activeDirectory"),
- ("radiusServers", "radiusServers"),
- ("radiusProxyEnabled", "radiusProxyEnabled"),
- ("radiusTestingEnabled", "radiusTestingEnabled"),
- ("radiusCalledStationId", "radiusCalledStationId"),
+ ("localRadius", "localRadius"),
+ ("mandatoryDhcpEnabled", "mandatoryDhcpEnabled"),
+ ("minBitrate", "minBitrate"),
+ ("name", "name"),
+ ("namedVlans", "namedVlans"),
+ ("oauth", "oauth"),
+ ("perClientBandwidthLimitDown", "perClientBandwidthLimitDown"),
+ ("perClientBandwidthLimitUp", "perClientBandwidthLimitUp"),
+ ("perSsidBandwidthLimitDown", "perSsidBandwidthLimitDown"),
+ ("perSsidBandwidthLimitUp", "perSsidBandwidthLimitUp"),
+ ("psk", "psk"),
+ ("radiusAccountingEnabled", "radiusAccountingEnabled"),
+ ("radiusAccountingInterimInterval", "radiusAccountingInterimInterval"),
+ ("radiusAccountingServers", "radiusAccountingServers"),
+ ("radiusAttributeForGroupPolicies", "radiusAttributeForGroupPolicies"),
("radiusAuthenticationNasId", "radiusAuthenticationNasId"),
- ("radiusServerTimeout", "radiusServerTimeout"),
- ("radiusServerAttemptsLimit", "radiusServerAttemptsLimit"),
- ("radiusFallbackEnabled", "radiusFallbackEnabled"),
+ ("radiusCalledStationId", "radiusCalledStationId"),
("radiusCoaEnabled", "radiusCoaEnabled"),
("radiusFailoverPolicy", "radiusFailoverPolicy"),
+ ("radiusFallbackEnabled", "radiusFallbackEnabled"),
+ ("radiusGuestVlanEnabled", "radiusGuestVlanEnabled"),
+ ("radiusGuestVlanId", "radiusGuestVlanId"),
("radiusLoadBalancingPolicy", "radiusLoadBalancingPolicy"),
- ("radiusAccountingEnabled", "radiusAccountingEnabled"),
- ("radiusAccountingServers", "radiusAccountingServers"),
- ("radiusAccountingInterimInterval", "radiusAccountingInterimInterval"),
- ("radiusAttributeForGroupPolicies", "radiusAttributeForGroupPolicies"),
- ("ipAssignmentMode", "ipAssignmentMode"),
- ("useVlanTagging", "useVlanTagging"),
- ("concentratorNetworkId", "concentratorNetworkId"),
+ ("radiusOverride", "radiusOverride"),
+ ("radiusProxyEnabled", "radiusProxyEnabled"),
+ ("radiusServerAttemptsLimit", "radiusServerAttemptsLimit"),
+ ("radiusServerTimeout", "radiusServerTimeout"),
+ ("radiusServers", "radiusServers"),
+ ("radiusTestingEnabled", "radiusTestingEnabled"),
("secondaryConcentratorNetworkId", "secondaryConcentratorNetworkId"),
- ("disassociateClientsOnVpnFailover", "disassociateClientsOnVpnFailover"),
+ ("speedBurst", "speedBurst"),
+ ("splashGuestSponsorDomains", "splashGuestSponsorDomains"),
+ ("splashPage", "splashPage"),
+ ("useVlanTagging", "useVlanTagging"),
+ ("visible", "visible"),
("vlanId", "vlanId"),
- ("defaultVlanId", "defaultVlanId"),
- ("apTagsAndVlanIds", "apTagsAndVlanIds"),
("walledGardenEnabled", "walledGardenEnabled"),
("walledGardenRanges", "walledGardenRanges"),
- ("gre", "gre"),
- ("radiusOverride", "radiusOverride"),
- ("radiusGuestVlanEnabled", "radiusGuestVlanEnabled"),
- ("radiusGuestVlanId", "radiusGuestVlanId"),
- ("minBitrate", "minBitrate"),
- ("bandSelection", "bandSelection"),
- ("perClientBandwidthLimitUp", "perClientBandwidthLimitUp"),
- ("perClientBandwidthLimitDown", "perClientBandwidthLimitDown"),
- ("perSsidBandwidthLimitUp", "perSsidBandwidthLimitUp"),
- ("perSsidBandwidthLimitDown", "perSsidBandwidthLimitDown"),
- ("lanIsolationEnabled", "lanIsolationEnabled"),
- ("visible", "visible"),
- ("availableOnAllAps", "availableOnAllAps"),
- ("availabilityTags", "availabilityTags"),
- ("mandatoryDhcpEnabled", "mandatoryDhcpEnabled"),
- ("adultContentFilteringEnabled", "adultContentFilteringEnabled"),
- ("dnsRewrite", "dnsRewrite"),
- ("speedBurst", "speedBurst"),
+ ("wpaEncryptionMode", "wpaEncryptionMode"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_bonjour_forwarding.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_bonjour_forwarding.py
index 43f69849a..85a078a39 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_bonjour_forwarding.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_bonjour_forwarding.py
@@ -33,6 +33,7 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
enabled=dict(type="bool"),
+ exception=dict(type="dict"),
rules=dict(type="list"),
networkId=dict(type="str"),
number=dict(type="str"),
@@ -51,6 +52,7 @@ class NetworksWirelessSsidsBonjourForwarding(object):
self.meraki = meraki
self.new_object = dict(
enabled=params.get("enabled"),
+ exception=params.get("exception"),
rules=params.get("rules"),
network_id=params.get("networkId"),
number=params.get("number"),
@@ -69,6 +71,9 @@ class NetworksWirelessSsidsBonjourForwarding(object):
new_object_params = {}
if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('exception') is not None or self.new_object.get('exception') is not None:
+ new_object_params['exception'] = self.new_object.get('exception') or \
+ self.new_object.get('exception')
if self.new_object.get('rules') is not None or self.new_object.get('rules') is not None:
new_object_params['rules'] = self.new_object.get('rules') or \
self.new_object.get('rules')
@@ -132,6 +137,7 @@ class NetworksWirelessSsidsBonjourForwarding(object):
obj_params = [
("enabled", "enabled"),
+ ("exception", "exception"),
("rules", "rules"),
("networkId", "networkId"),
("number", "number"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_device_type_group_policies.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_device_type_group_policies.py
index 7cc30fd3e..b3890afbe 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_device_type_group_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_device_type_group_policies.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- enabled=dict(type="bool"),
deviceTypePolicies=dict(type="list"),
+ enabled=dict(type="bool"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -50,8 +50,8 @@ class NetworksWirelessSsidsDeviceTypeGroupPolicies(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- enabled=params.get("enabled"),
deviceTypePolicies=params.get("deviceTypePolicies"),
+ enabled=params.get("enabled"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -67,11 +67,11 @@ class NetworksWirelessSsidsDeviceTypeGroupPolicies(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('deviceTypePolicies') is not None or self.new_object.get('device_type_policies') is not None:
new_object_params['deviceTypePolicies'] = self.new_object.get('deviceTypePolicies') or \
self.new_object.get('device_type_policies')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -131,8 +131,8 @@ class NetworksWirelessSsidsDeviceTypeGroupPolicies(object):
requested_obj = self.new_object
obj_params = [
- ("enabled", "enabled"),
("deviceTypePolicies", "deviceTypePolicies"),
+ ("enabled", "enabled"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_eap_override.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_eap_override.py
index d0e924aaa..2d0748958 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_eap_override.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_eap_override.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- timeout=dict(type="int"),
+ eapolKey=dict(type="dict"),
identity=dict(type="dict"),
maxRetries=dict(type="int"),
- eapolKey=dict(type="dict"),
+ timeout=dict(type="int"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -52,10 +52,10 @@ class NetworksWirelessSsidsEapOverride(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- timeout=params.get("timeout"),
+ eapolKey=params.get("eapolKey"),
identity=params.get("identity"),
maxRetries=params.get("maxRetries"),
- eapolKey=params.get("eapolKey"),
+ timeout=params.get("timeout"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -71,18 +71,18 @@ class NetworksWirelessSsidsEapOverride(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('timeout') is not None or self.new_object.get('timeout') is not None:
- new_object_params['timeout'] = self.new_object.get('timeout') or \
- self.new_object.get('timeout')
+ if self.new_object.get('eapolKey') is not None or self.new_object.get('eapol_key') is not None:
+ new_object_params['eapolKey'] = self.new_object.get('eapolKey') or \
+ self.new_object.get('eapol_key')
if self.new_object.get('identity') is not None or self.new_object.get('identity') is not None:
new_object_params['identity'] = self.new_object.get('identity') or \
self.new_object.get('identity')
if self.new_object.get('maxRetries') is not None or self.new_object.get('max_retries') is not None:
new_object_params['maxRetries'] = self.new_object.get('maxRetries') or \
self.new_object.get('max_retries')
- if self.new_object.get('eapolKey') is not None or self.new_object.get('eapol_key') is not None:
- new_object_params['eapolKey'] = self.new_object.get('eapolKey') or \
- self.new_object.get('eapol_key')
+ if self.new_object.get('timeout') is not None or self.new_object.get('timeout') is not None:
+ new_object_params['timeout'] = self.new_object.get('timeout') or \
+ self.new_object.get('timeout')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -142,10 +142,10 @@ class NetworksWirelessSsidsEapOverride(object):
requested_obj = self.new_object
obj_params = [
- ("timeout", "timeout"),
+ ("eapolKey", "eapolKey"),
("identity", "identity"),
("maxRetries", "maxRetries"),
- ("eapolKey", "eapolKey"),
+ ("timeout", "timeout"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_firewall_l3_firewall_rules.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_firewall_l3_firewall_rules.py
index 178967038..909fc147c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_firewall_l3_firewall_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_firewall_l3_firewall_rules.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- rules=dict(type="list"),
allowLanAccess=dict(type="bool"),
+ rules=dict(type="list"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -50,8 +50,8 @@ class NetworksWirelessSsidsFirewallL3FirewallRules(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- rules=params.get("rules"),
allowLanAccess=params.get("allowLanAccess"),
+ rules=params.get("rules"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -67,11 +67,11 @@ class NetworksWirelessSsidsFirewallL3FirewallRules(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('allowLanAccess') is not None or self.new_object.get('allow_lan_access') is not None:
+ new_object_params['allowLanAccess'] = self.new_object.get('allowLanAccess')
if self.new_object.get('rules') is not None or self.new_object.get('rules') is not None:
new_object_params['rules'] = self.new_object.get('rules') or \
self.new_object.get('rules')
- if self.new_object.get('allowLanAccess') is not None or self.new_object.get('allow_lan_access') is not None:
- new_object_params['allowLanAccess'] = self.new_object.get('allowLanAccess')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -131,8 +131,8 @@ class NetworksWirelessSsidsFirewallL3FirewallRules(object):
requested_obj = self.new_object
obj_params = [
- ("rules", "rules"),
("allowLanAccess", "allowLanAccess"),
+ ("rules", "rules"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_hotspot20.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_hotspot20.py
index 553ea6544..8efc94199 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_hotspot20.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_hotspot20.py
@@ -32,14 +32,14 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- enabled=dict(type="bool"),
- operator=dict(type="dict"),
- venue=dict(type="dict"),
- networkAccessType=dict(type="str"),
domains=dict(type="list"),
- roamConsortOis=dict(type="list"),
+ enabled=dict(type="bool"),
mccMncs=dict(type="list"),
naiRealms=dict(type="list"),
+ networkAccessType=dict(type="str"),
+ operator=dict(type="dict"),
+ roamConsortOis=dict(type="list"),
+ venue=dict(type="dict"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -56,14 +56,14 @@ class NetworksWirelessSsidsHotspot20(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- enabled=params.get("enabled"),
- operator=params.get("operator"),
- venue=params.get("venue"),
- networkAccessType=params.get("networkAccessType"),
domains=params.get("domains"),
- roamConsortOis=params.get("roamConsortOis"),
+ enabled=params.get("enabled"),
mccMncs=params.get("mccMncs"),
naiRealms=params.get("naiRealms"),
+ networkAccessType=params.get("networkAccessType"),
+ operator=params.get("operator"),
+ roamConsortOis=params.get("roamConsortOis"),
+ venue=params.get("venue"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -79,29 +79,29 @@ class NetworksWirelessSsidsHotspot20(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
- if self.new_object.get('operator') is not None or self.new_object.get('operator') is not None:
- new_object_params['operator'] = self.new_object.get('operator') or \
- self.new_object.get('operator')
- if self.new_object.get('venue') is not None or self.new_object.get('venue') is not None:
- new_object_params['venue'] = self.new_object.get('venue') or \
- self.new_object.get('venue')
- if self.new_object.get('networkAccessType') is not None or self.new_object.get('network_access_type') is not None:
- new_object_params['networkAccessType'] = self.new_object.get('networkAccessType') or \
- self.new_object.get('network_access_type')
if self.new_object.get('domains') is not None or self.new_object.get('domains') is not None:
new_object_params['domains'] = self.new_object.get('domains') or \
self.new_object.get('domains')
- if self.new_object.get('roamConsortOis') is not None or self.new_object.get('roam_consort_ois') is not None:
- new_object_params['roamConsortOis'] = self.new_object.get('roamConsortOis') or \
- self.new_object.get('roam_consort_ois')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('mccMncs') is not None or self.new_object.get('mcc_mncs') is not None:
new_object_params['mccMncs'] = self.new_object.get('mccMncs') or \
self.new_object.get('mcc_mncs')
if self.new_object.get('naiRealms') is not None or self.new_object.get('nai_realms') is not None:
new_object_params['naiRealms'] = self.new_object.get('naiRealms') or \
self.new_object.get('nai_realms')
+ if self.new_object.get('networkAccessType') is not None or self.new_object.get('network_access_type') is not None:
+ new_object_params['networkAccessType'] = self.new_object.get('networkAccessType') or \
+ self.new_object.get('network_access_type')
+ if self.new_object.get('operator') is not None or self.new_object.get('operator') is not None:
+ new_object_params['operator'] = self.new_object.get('operator') or \
+ self.new_object.get('operator')
+ if self.new_object.get('roamConsortOis') is not None or self.new_object.get('roam_consort_ois') is not None:
+ new_object_params['roamConsortOis'] = self.new_object.get('roamConsortOis') or \
+ self.new_object.get('roam_consort_ois')
+ if self.new_object.get('venue') is not None or self.new_object.get('venue') is not None:
+ new_object_params['venue'] = self.new_object.get('venue') or \
+ self.new_object.get('venue')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -161,14 +161,14 @@ class NetworksWirelessSsidsHotspot20(object):
requested_obj = self.new_object
obj_params = [
- ("enabled", "enabled"),
- ("operator", "operator"),
- ("venue", "venue"),
- ("networkAccessType", "networkAccessType"),
("domains", "domains"),
- ("roamConsortOis", "roamConsortOis"),
+ ("enabled", "enabled"),
("mccMncs", "mccMncs"),
("naiRealms", "naiRealms"),
+ ("networkAccessType", "networkAccessType"),
+ ("operator", "operator"),
+ ("roamConsortOis", "roamConsortOis"),
+ ("venue", "venue"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_identity_psks.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_identity_psks.py
index 266306851..995997893 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_identity_psks.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_identity_psks.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ expiresAt=dict(type="str"),
+ groupPolicyId=dict(type="str"),
name=dict(type="str"),
passphrase=dict(type="str"),
- groupPolicyId=dict(type="str"),
- expiresAt=dict(type="str"),
networkId=dict(type="str"),
number=dict(type="str"),
identityPskId=dict(type="str"),
@@ -54,10 +54,10 @@ class NetworksWirelessSsidsIdentityPsks(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ expiresAt=params.get("expiresAt"),
+ groupPolicyId=params.get("groupPolicyId"),
name=params.get("name"),
passphrase=params.get("passphrase"),
- groupPolicyId=params.get("groupPolicyId"),
- expiresAt=params.get("expiresAt"),
networkId=params.get("networkId"),
number=params.get("number"),
identityPskId=params.get("identityPskId"),
@@ -86,18 +86,18 @@ class NetworksWirelessSsidsIdentityPsks(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('expiresAt') is not None or self.new_object.get('expires_at') is not None:
+ new_object_params['expiresAt'] = self.new_object.get('expiresAt') or \
+ self.new_object.get('expires_at')
+ if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
+ new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
+ self.new_object.get('group_policy_id')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
if self.new_object.get('passphrase') is not None or self.new_object.get('passphrase') is not None:
new_object_params['passphrase'] = self.new_object.get('passphrase') or \
self.new_object.get('passphrase')
- if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
- new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
- self.new_object.get('group_policy_id')
- if self.new_object.get('expiresAt') is not None or self.new_object.get('expires_at') is not None:
- new_object_params['expiresAt'] = self.new_object.get('expiresAt') or \
- self.new_object.get('expires_at')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -121,18 +121,18 @@ class NetworksWirelessSsidsIdentityPsks(object):
def update_by_id_params(self):
new_object_params = {}
+ if self.new_object.get('expiresAt') is not None or self.new_object.get('expires_at') is not None:
+ new_object_params['expiresAt'] = self.new_object.get('expiresAt') or \
+ self.new_object.get('expires_at')
+ if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
+ new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
+ self.new_object.get('group_policy_id')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
if self.new_object.get('passphrase') is not None or self.new_object.get('passphrase') is not None:
new_object_params['passphrase'] = self.new_object.get('passphrase') or \
self.new_object.get('passphrase')
- if self.new_object.get('groupPolicyId') is not None or self.new_object.get('group_policy_id') is not None:
- new_object_params['groupPolicyId'] = self.new_object.get('groupPolicyId') or \
- self.new_object.get('group_policy_id')
- if self.new_object.get('expiresAt') is not None or self.new_object.get('expires_at') is not None:
- new_object_params['expiresAt'] = self.new_object.get('expiresAt') or \
- self.new_object.get('expires_at')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -213,10 +213,10 @@ class NetworksWirelessSsidsIdentityPsks(object):
requested_obj = self.new_object
obj_params = [
+ ("expiresAt", "expiresAt"),
+ ("groupPolicyId", "groupPolicyId"),
("name", "name"),
("passphrase", "passphrase"),
- ("groupPolicyId", "groupPolicyId"),
- ("expiresAt", "expiresAt"),
("networkId", "networkId"),
("number", "number"),
("identityPskId", "identityPskId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_splash_settings.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_splash_settings.py
index 71989ade2..b062af863 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_splash_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_splash_settings.py
@@ -32,21 +32,22 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- splashUrl=dict(type="str"),
- useSplashUrl=dict(type="bool"),
- splashTimeout=dict(type="int"),
- redirectUrl=dict(type="str"),
- useRedirectUrl=dict(type="bool"),
- welcomeMessage=dict(type="str"),
- splashLogo=dict(type="dict"),
- splashImage=dict(type="dict"),
- splashPrepaidFront=dict(type="dict"),
+ allowSimultaneousLogins=dict(type="bool"),
+ billing=dict(type="dict"),
blockAllTrafficBeforeSignOn=dict(type="bool"),
controllerDisconnectionBehavior=dict(type="str"),
- allowSimultaneousLogins=dict(type="bool"),
guestSponsorship=dict(type="dict"),
- billing=dict(type="dict"),
+ redirectUrl=dict(type="str"),
sentryEnrollment=dict(type="dict"),
+ splashImage=dict(type="dict"),
+ splashLogo=dict(type="dict"),
+ splashPrepaidFront=dict(type="dict"),
+ splashTimeout=dict(type="int"),
+ splashUrl=dict(type="str"),
+ themeId=dict(type="str"),
+ useRedirectUrl=dict(type="bool"),
+ useSplashUrl=dict(type="bool"),
+ welcomeMessage=dict(type="str"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -63,21 +64,22 @@ class NetworksWirelessSsidsSplashSettings(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- splashUrl=params.get("splashUrl"),
- useSplashUrl=params.get("useSplashUrl"),
- splashTimeout=params.get("splashTimeout"),
- redirectUrl=params.get("redirectUrl"),
- useRedirectUrl=params.get("useRedirectUrl"),
- welcomeMessage=params.get("welcomeMessage"),
- splashLogo=params.get("splashLogo"),
- splashImage=params.get("splashImage"),
- splashPrepaidFront=params.get("splashPrepaidFront"),
+ allowSimultaneousLogins=params.get("allowSimultaneousLogins"),
+ billing=params.get("billing"),
blockAllTrafficBeforeSignOn=params.get("blockAllTrafficBeforeSignOn"),
controllerDisconnectionBehavior=params.get("controllerDisconnectionBehavior"),
- allowSimultaneousLogins=params.get("allowSimultaneousLogins"),
guestSponsorship=params.get("guestSponsorship"),
- billing=params.get("billing"),
+ redirectUrl=params.get("redirectUrl"),
sentryEnrollment=params.get("sentryEnrollment"),
+ splashImage=params.get("splashImage"),
+ splashLogo=params.get("splashLogo"),
+ splashPrepaidFront=params.get("splashPrepaidFront"),
+ splashTimeout=params.get("splashTimeout"),
+ splashUrl=params.get("splashUrl"),
+ themeId=params.get("themeId"),
+ useRedirectUrl=params.get("useRedirectUrl"),
+ useSplashUrl=params.get("useSplashUrl"),
+ welcomeMessage=params.get("welcomeMessage"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -93,47 +95,50 @@ class NetworksWirelessSsidsSplashSettings(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('splashUrl') is not None or self.new_object.get('splash_url') is not None:
- new_object_params['splashUrl'] = self.new_object.get('splashUrl') or \
- self.new_object.get('splash_url')
- if self.new_object.get('useSplashUrl') is not None or self.new_object.get('use_splash_url') is not None:
- new_object_params['useSplashUrl'] = self.new_object.get('useSplashUrl')
- if self.new_object.get('splashTimeout') is not None or self.new_object.get('splash_timeout') is not None:
- new_object_params['splashTimeout'] = self.new_object.get('splashTimeout') or \
- self.new_object.get('splash_timeout')
- if self.new_object.get('redirectUrl') is not None or self.new_object.get('redirect_url') is not None:
- new_object_params['redirectUrl'] = self.new_object.get('redirectUrl') or \
- self.new_object.get('redirect_url')
- if self.new_object.get('useRedirectUrl') is not None or self.new_object.get('use_redirect_url') is not None:
- new_object_params['useRedirectUrl'] = self.new_object.get('useRedirectUrl')
- if self.new_object.get('welcomeMessage') is not None or self.new_object.get('welcome_message') is not None:
- new_object_params['welcomeMessage'] = self.new_object.get('welcomeMessage') or \
- self.new_object.get('welcome_message')
- if self.new_object.get('splashLogo') is not None or self.new_object.get('splash_logo') is not None:
- new_object_params['splashLogo'] = self.new_object.get('splashLogo') or \
- self.new_object.get('splash_logo')
- if self.new_object.get('splashImage') is not None or self.new_object.get('splash_image') is not None:
- new_object_params['splashImage'] = self.new_object.get('splashImage') or \
- self.new_object.get('splash_image')
- if self.new_object.get('splashPrepaidFront') is not None or self.new_object.get('splash_prepaid_front') is not None:
- new_object_params['splashPrepaidFront'] = self.new_object.get('splashPrepaidFront') or \
- self.new_object.get('splash_prepaid_front')
+ if self.new_object.get('allowSimultaneousLogins') is not None or self.new_object.get('allow_simultaneous_logins') is not None:
+ new_object_params['allowSimultaneousLogins'] = self.new_object.get('allowSimultaneousLogins')
+ if self.new_object.get('billing') is not None or self.new_object.get('billing') is not None:
+ new_object_params['billing'] = self.new_object.get('billing') or \
+ self.new_object.get('billing')
if self.new_object.get('blockAllTrafficBeforeSignOn') is not None or self.new_object.get('block_all_traffic_before_sign_on') is not None:
new_object_params['blockAllTrafficBeforeSignOn'] = self.new_object.get('blockAllTrafficBeforeSignOn')
if self.new_object.get('controllerDisconnectionBehavior') is not None or self.new_object.get('controller_disconnection_behavior') is not None:
new_object_params['controllerDisconnectionBehavior'] = self.new_object.get('controllerDisconnectionBehavior') or \
self.new_object.get('controller_disconnection_behavior')
- if self.new_object.get('allowSimultaneousLogins') is not None or self.new_object.get('allow_simultaneous_logins') is not None:
- new_object_params['allowSimultaneousLogins'] = self.new_object.get('allowSimultaneousLogins')
if self.new_object.get('guestSponsorship') is not None or self.new_object.get('guest_sponsorship') is not None:
new_object_params['guestSponsorship'] = self.new_object.get('guestSponsorship') or \
self.new_object.get('guest_sponsorship')
- if self.new_object.get('billing') is not None or self.new_object.get('billing') is not None:
- new_object_params['billing'] = self.new_object.get('billing') or \
- self.new_object.get('billing')
+ if self.new_object.get('redirectUrl') is not None or self.new_object.get('redirect_url') is not None:
+ new_object_params['redirectUrl'] = self.new_object.get('redirectUrl') or \
+ self.new_object.get('redirect_url')
if self.new_object.get('sentryEnrollment') is not None or self.new_object.get('sentry_enrollment') is not None:
new_object_params['sentryEnrollment'] = self.new_object.get('sentryEnrollment') or \
self.new_object.get('sentry_enrollment')
+ if self.new_object.get('splashImage') is not None or self.new_object.get('splash_image') is not None:
+ new_object_params['splashImage'] = self.new_object.get('splashImage') or \
+ self.new_object.get('splash_image')
+ if self.new_object.get('splashLogo') is not None or self.new_object.get('splash_logo') is not None:
+ new_object_params['splashLogo'] = self.new_object.get('splashLogo') or \
+ self.new_object.get('splash_logo')
+ if self.new_object.get('splashPrepaidFront') is not None or self.new_object.get('splash_prepaid_front') is not None:
+ new_object_params['splashPrepaidFront'] = self.new_object.get('splashPrepaidFront') or \
+ self.new_object.get('splash_prepaid_front')
+ if self.new_object.get('splashTimeout') is not None or self.new_object.get('splash_timeout') is not None:
+ new_object_params['splashTimeout'] = self.new_object.get('splashTimeout') or \
+ self.new_object.get('splash_timeout')
+ if self.new_object.get('splashUrl') is not None or self.new_object.get('splash_url') is not None:
+ new_object_params['splashUrl'] = self.new_object.get('splashUrl') or \
+ self.new_object.get('splash_url')
+ if self.new_object.get('themeId') is not None or self.new_object.get('theme_id') is not None:
+ new_object_params['themeId'] = self.new_object.get('themeId') or \
+ self.new_object.get('theme_id')
+ if self.new_object.get('useRedirectUrl') is not None or self.new_object.get('use_redirect_url') is not None:
+ new_object_params['useRedirectUrl'] = self.new_object.get('useRedirectUrl')
+ if self.new_object.get('useSplashUrl') is not None or self.new_object.get('use_splash_url') is not None:
+ new_object_params['useSplashUrl'] = self.new_object.get('useSplashUrl')
+ if self.new_object.get('welcomeMessage') is not None or self.new_object.get('welcome_message') is not None:
+ new_object_params['welcomeMessage'] = self.new_object.get('welcomeMessage') or \
+ self.new_object.get('welcome_message')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -193,21 +198,22 @@ class NetworksWirelessSsidsSplashSettings(object):
requested_obj = self.new_object
obj_params = [
- ("splashUrl", "splashUrl"),
- ("useSplashUrl", "useSplashUrl"),
- ("splashTimeout", "splashTimeout"),
- ("redirectUrl", "redirectUrl"),
- ("useRedirectUrl", "useRedirectUrl"),
- ("welcomeMessage", "welcomeMessage"),
- ("splashLogo", "splashLogo"),
- ("splashImage", "splashImage"),
- ("splashPrepaidFront", "splashPrepaidFront"),
+ ("allowSimultaneousLogins", "allowSimultaneousLogins"),
+ ("billing", "billing"),
("blockAllTrafficBeforeSignOn", "blockAllTrafficBeforeSignOn"),
("controllerDisconnectionBehavior", "controllerDisconnectionBehavior"),
- ("allowSimultaneousLogins", "allowSimultaneousLogins"),
("guestSponsorship", "guestSponsorship"),
- ("billing", "billing"),
+ ("redirectUrl", "redirectUrl"),
("sentryEnrollment", "sentryEnrollment"),
+ ("splashImage", "splashImage"),
+ ("splashLogo", "splashLogo"),
+ ("splashPrepaidFront", "splashPrepaidFront"),
+ ("splashTimeout", "splashTimeout"),
+ ("splashUrl", "splashUrl"),
+ ("themeId", "themeId"),
+ ("useRedirectUrl", "useRedirectUrl"),
+ ("useSplashUrl", "useSplashUrl"),
+ ("welcomeMessage", "welcomeMessage"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_traffic_shaping_rules.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_traffic_shaping_rules.py
index de13a0d80..bddddcbea 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_traffic_shaping_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_traffic_shaping_rules.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- trafficShapingEnabled=dict(type="bool"),
defaultRulesEnabled=dict(type="bool"),
rules=dict(type="list"),
+ trafficShapingEnabled=dict(type="bool"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -51,9 +51,9 @@ class NetworksWirelessSsidsTrafficShapingRules(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- trafficShapingEnabled=params.get("trafficShapingEnabled"),
defaultRulesEnabled=params.get("defaultRulesEnabled"),
rules=params.get("rules"),
+ trafficShapingEnabled=params.get("trafficShapingEnabled"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -69,13 +69,13 @@ class NetworksWirelessSsidsTrafficShapingRules(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('trafficShapingEnabled') is not None or self.new_object.get('traffic_shaping_enabled') is not None:
- new_object_params['trafficShapingEnabled'] = self.new_object.get('trafficShapingEnabled')
if self.new_object.get('defaultRulesEnabled') is not None or self.new_object.get('default_rules_enabled') is not None:
new_object_params['defaultRulesEnabled'] = self.new_object.get('defaultRulesEnabled')
if self.new_object.get('rules') is not None or self.new_object.get('rules') is not None:
new_object_params['rules'] = self.new_object.get('rules') or \
self.new_object.get('rules')
+ if self.new_object.get('trafficShapingEnabled') is not None or self.new_object.get('traffic_shaping_enabled') is not None:
+ new_object_params['trafficShapingEnabled'] = self.new_object.get('trafficShapingEnabled')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -135,9 +135,9 @@ class NetworksWirelessSsidsTrafficShapingRules(object):
requested_obj = self.new_object
obj_params = [
- ("trafficShapingEnabled", "trafficShapingEnabled"),
("defaultRulesEnabled", "defaultRulesEnabled"),
("rules", "rules"),
+ ("trafficShapingEnabled", "trafficShapingEnabled"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_vpn.py b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_vpn.py
index cc3836353..a66830f81 100644
--- a/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_vpn.py
+++ b/ansible_collections/cisco/meraki/plugins/action/networks_wireless_ssids_vpn.py
@@ -33,8 +33,8 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
concentrator=dict(type="dict"),
- splitTunnel=dict(type="dict"),
failover=dict(type="dict"),
+ splitTunnel=dict(type="dict"),
networkId=dict(type="str"),
number=dict(type="str"),
))
@@ -52,8 +52,8 @@ class NetworksWirelessSsidsVpn(object):
self.meraki = meraki
self.new_object = dict(
concentrator=params.get("concentrator"),
- splitTunnel=params.get("splitTunnel"),
failover=params.get("failover"),
+ splitTunnel=params.get("splitTunnel"),
network_id=params.get("networkId"),
number=params.get("number"),
)
@@ -72,12 +72,12 @@ class NetworksWirelessSsidsVpn(object):
if self.new_object.get('concentrator') is not None or self.new_object.get('concentrator') is not None:
new_object_params['concentrator'] = self.new_object.get('concentrator') or \
self.new_object.get('concentrator')
- if self.new_object.get('splitTunnel') is not None or self.new_object.get('split_tunnel') is not None:
- new_object_params['splitTunnel'] = self.new_object.get('splitTunnel') or \
- self.new_object.get('split_tunnel')
if self.new_object.get('failover') is not None or self.new_object.get('failover') is not None:
new_object_params['failover'] = self.new_object.get('failover') or \
self.new_object.get('failover')
+ if self.new_object.get('splitTunnel') is not None or self.new_object.get('split_tunnel') is not None:
+ new_object_params['splitTunnel'] = self.new_object.get('splitTunnel') or \
+ self.new_object.get('split_tunnel')
if self.new_object.get('networkId') is not None or self.new_object.get('network_id') is not None:
new_object_params['networkId'] = self.new_object.get('networkId') or \
self.new_object.get('network_id')
@@ -138,8 +138,8 @@ class NetworksWirelessSsidsVpn(object):
obj_params = [
("concentrator", "concentrator"),
- ("splitTunnel", "splitTunnel"),
("failover", "failover"),
+ ("splitTunnel", "splitTunnel"),
("networkId", "networkId"),
("number", "number"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations.py b/ansible_collections/cisco/meraki/plugins/action/organizations.py
index 0cb1670ef..410ebc37d 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
management=dict(type="dict"),
+ name=dict(type="str"),
organizationId=dict(type="str"),
api=dict(type="dict"),
))
@@ -51,14 +51,24 @@ class Organizations(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
management=params.get("management"),
+ name=params.get("name"),
organizationId=params.get("organizationId"),
api=params.get("api"),
)
def get_all_params(self, name=None, id=None):
new_object_params = {}
+ if self.new_object.get('perPage') is not None or self.new_object.get('per_page') is not None:
+ new_object_params['perPage'] = self.new_object.get('perPage') or \
+ self.new_object.get('per_page')
+ new_object_params['total_pages'] = -1
+ if self.new_object.get('startingAfter') is not None or self.new_object.get('starting_after') is not None:
+ new_object_params['startingAfter'] = self.new_object.get('startingAfter') or \
+ self.new_object.get('starting_after')
+ if self.new_object.get('endingBefore') is not None or self.new_object.get('ending_before') is not None:
+ new_object_params['endingBefore'] = self.new_object.get('endingBefore') or \
+ self.new_object.get('ending_before')
return new_object_params
def get_params_by_id(self, name=None, id=None):
@@ -70,12 +80,12 @@ class Organizations(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('management') is not None or self.new_object.get('management') is not None:
new_object_params['management'] = self.new_object.get('management') or \
self.new_object.get('management')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
return new_object_params
def delete_by_id_params(self):
@@ -87,15 +97,15 @@ class Organizations(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('management') is not None or self.new_object.get('management') is not None:
- new_object_params['management'] = self.new_object.get('management') or \
- self.new_object.get('management')
if self.new_object.get('api') is not None or self.new_object.get('api') is not None:
new_object_params['api'] = self.new_object.get('api') or \
self.new_object.get('api')
+ if self.new_object.get('management') is not None or self.new_object.get('management') is not None:
+ new_object_params['management'] = self.new_object.get('management') or \
+ self.new_object.get('management')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -170,8 +180,8 @@ class Organizations(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
("management", "management"),
+ ("name", "name"),
("organizationId", "organizationId"),
("api", "api"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_action_batches.py b/ansible_collections/cisco/meraki/plugins/action/organizations_action_batches.py
index 8780b3e82..92a82e869 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_action_batches.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_action_batches.py
@@ -32,9 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ actions=dict(type="list"),
+ callback=dict(type="dict"),
confirmed=dict(type="bool"),
synchronous=dict(type="bool"),
- actions=dict(type="list"),
organizationId=dict(type="str"),
actionBatchId=dict(type="str"),
))
@@ -52,9 +53,10 @@ class OrganizationsActionBatches(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ actions=params.get("actions"),
+ callback=params.get("callback"),
confirmed=params.get("confirmed"),
synchronous=params.get("synchronous"),
- actions=params.get("actions"),
organizationId=params.get("organizationId"),
actionBatchId=params.get("actionBatchId"),
)
@@ -80,13 +82,16 @@ class OrganizationsActionBatches(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('actions') is not None or self.new_object.get('actions') is not None:
+ new_object_params['actions'] = self.new_object.get('actions') or \
+ self.new_object.get('actions')
+ if self.new_object.get('callback') is not None or self.new_object.get('callback') is not None:
+ new_object_params['callback'] = self.new_object.get('callback') or \
+ self.new_object.get('callback')
if self.new_object.get('confirmed') is not None or self.new_object.get('confirmed') is not None:
new_object_params['confirmed'] = self.new_object.get('confirmed')
if self.new_object.get('synchronous') is not None or self.new_object.get('synchronous') is not None:
new_object_params['synchronous'] = self.new_object.get('synchronous')
- if self.new_object.get('actions') is not None or self.new_object.get('actions') is not None:
- new_object_params['actions'] = self.new_object.get('actions') or \
- self.new_object.get('actions')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -185,9 +190,10 @@ class OrganizationsActionBatches(object):
requested_obj = self.new_object
obj_params = [
+ ("actions", "actions"),
+ ("callback", "callback"),
("confirmed", "confirmed"),
("synchronous", "synchronous"),
- ("actions", "actions"),
("organizationId", "organizationId"),
("actionBatchId", "actionBatchId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_acls.py b/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_acls.py
index cc445e11f..b5249443c 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_acls.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_acls.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
description=dict(type="str"),
- rules=dict(type="list"),
ipVersion=dict(type="str"),
+ name=dict(type="str"),
+ rules=dict(type="list"),
organizationId=dict(type="str"),
aclId=dict(type="str"),
))
@@ -53,10 +53,10 @@ class OrganizationsAdaptivePolicyAcls(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
description=params.get("description"),
- rules=params.get("rules"),
ipVersion=params.get("ipVersion"),
+ name=params.get("name"),
+ rules=params.get("rules"),
organizationId=params.get("organizationId"),
aclId=params.get("aclId"),
)
@@ -80,18 +80,18 @@ class OrganizationsAdaptivePolicyAcls(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
- if self.new_object.get('rules') is not None or self.new_object.get('rules') is not None:
- new_object_params['rules'] = self.new_object.get('rules') or \
- self.new_object.get('rules')
if self.new_object.get('ipVersion') is not None or self.new_object.get('ip_version') is not None:
new_object_params['ipVersion'] = self.new_object.get('ipVersion') or \
self.new_object.get('ip_version')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('rules') is not None or self.new_object.get('rules') is not None:
+ new_object_params['rules'] = self.new_object.get('rules') or \
+ self.new_object.get('rules')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -109,18 +109,18 @@ class OrganizationsAdaptivePolicyAcls(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
- if self.new_object.get('rules') is not None or self.new_object.get('rules') is not None:
- new_object_params['rules'] = self.new_object.get('rules') or \
- self.new_object.get('rules')
if self.new_object.get('ipVersion') is not None or self.new_object.get('ip_version') is not None:
new_object_params['ipVersion'] = self.new_object.get('ipVersion') or \
self.new_object.get('ip_version')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('rules') is not None or self.new_object.get('rules') is not None:
+ new_object_params['rules'] = self.new_object.get('rules') or \
+ self.new_object.get('rules')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -198,10 +198,10 @@ class OrganizationsAdaptivePolicyAcls(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
("description", "description"),
- ("rules", "rules"),
("ipVersion", "ipVersion"),
+ ("name", "name"),
+ ("rules", "rules"),
("organizationId", "organizationId"),
("aclId", "aclId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_groups.py b/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_groups.py
index f170a7ad0..7a871b57b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_groups.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_groups.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- sgt=dict(type="int"),
description=dict(type="str"),
+ name=dict(type="str"),
policyObjects=dict(type="list"),
+ sgt=dict(type="int"),
organizationId=dict(type="str"),
id=dict(type="str"),
))
@@ -53,10 +53,10 @@ class OrganizationsAdaptivePolicyGroups(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- sgt=params.get("sgt"),
description=params.get("description"),
+ name=params.get("name"),
policyObjects=params.get("policyObjects"),
+ sgt=params.get("sgt"),
organizationId=params.get("organizationId"),
id=params.get("id"),
)
@@ -79,18 +79,18 @@ class OrganizationsAdaptivePolicyGroups(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('sgt') is not None or self.new_object.get('sgt') is not None:
- new_object_params['sgt'] = self.new_object.get('sgt') or \
- self.new_object.get('sgt')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('policyObjects') is not None or self.new_object.get('policy_objects') is not None:
new_object_params['policyObjects'] = self.new_object.get('policyObjects') or \
self.new_object.get('policy_objects')
+ if self.new_object.get('sgt') is not None or self.new_object.get('sgt') is not None:
+ new_object_params['sgt'] = self.new_object.get('sgt') or \
+ self.new_object.get('sgt')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -108,18 +108,18 @@ class OrganizationsAdaptivePolicyGroups(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('sgt') is not None or self.new_object.get('sgt') is not None:
- new_object_params['sgt'] = self.new_object.get('sgt') or \
- self.new_object.get('sgt')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('policyObjects') is not None or self.new_object.get('policy_objects') is not None:
new_object_params['policyObjects'] = self.new_object.get('policyObjects') or \
self.new_object.get('policy_objects')
+ if self.new_object.get('sgt') is not None or self.new_object.get('sgt') is not None:
+ new_object_params['sgt'] = self.new_object.get('sgt') or \
+ self.new_object.get('sgt')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -193,10 +193,10 @@ class OrganizationsAdaptivePolicyGroups(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("sgt", "sgt"),
("description", "description"),
+ ("name", "name"),
("policyObjects", "policyObjects"),
+ ("sgt", "sgt"),
("organizationId", "organizationId"),
("id", "id"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_policies.py b/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_policies.py
index 9717b4aef..856b7ac16 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_adaptive_policy_policies.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- sourceGroup=dict(type="dict"),
- destinationGroup=dict(type="dict"),
acls=dict(type="list"),
+ destinationGroup=dict(type="dict"),
lastEntryRule=dict(type="str"),
+ sourceGroup=dict(type="dict"),
organizationId=dict(type="str"),
id=dict(type="str"),
))
@@ -53,10 +53,10 @@ class OrganizationsAdaptivePolicyPolicies(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- sourceGroup=params.get("sourceGroup"),
- destinationGroup=params.get("destinationGroup"),
acls=params.get("acls"),
+ destinationGroup=params.get("destinationGroup"),
lastEntryRule=params.get("lastEntryRule"),
+ sourceGroup=params.get("sourceGroup"),
organizationId=params.get("organizationId"),
id=params.get("id"),
)
@@ -79,18 +79,18 @@ class OrganizationsAdaptivePolicyPolicies(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('sourceGroup') is not None or self.new_object.get('source_group') is not None:
- new_object_params['sourceGroup'] = self.new_object.get('sourceGroup') or \
- self.new_object.get('source_group')
- if self.new_object.get('destinationGroup') is not None or self.new_object.get('destination_group') is not None:
- new_object_params['destinationGroup'] = self.new_object.get('destinationGroup') or \
- self.new_object.get('destination_group')
if self.new_object.get('acls') is not None or self.new_object.get('acls') is not None:
new_object_params['acls'] = self.new_object.get('acls') or \
self.new_object.get('acls')
+ if self.new_object.get('destinationGroup') is not None or self.new_object.get('destination_group') is not None:
+ new_object_params['destinationGroup'] = self.new_object.get('destinationGroup') or \
+ self.new_object.get('destination_group')
if self.new_object.get('lastEntryRule') is not None or self.new_object.get('last_entry_rule') is not None:
new_object_params['lastEntryRule'] = self.new_object.get('lastEntryRule') or \
self.new_object.get('last_entry_rule')
+ if self.new_object.get('sourceGroup') is not None or self.new_object.get('source_group') is not None:
+ new_object_params['sourceGroup'] = self.new_object.get('sourceGroup') or \
+ self.new_object.get('source_group')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -108,18 +108,18 @@ class OrganizationsAdaptivePolicyPolicies(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('sourceGroup') is not None or self.new_object.get('source_group') is not None:
- new_object_params['sourceGroup'] = self.new_object.get('sourceGroup') or \
- self.new_object.get('source_group')
- if self.new_object.get('destinationGroup') is not None or self.new_object.get('destination_group') is not None:
- new_object_params['destinationGroup'] = self.new_object.get('destinationGroup') or \
- self.new_object.get('destination_group')
if self.new_object.get('acls') is not None or self.new_object.get('acls') is not None:
new_object_params['acls'] = self.new_object.get('acls') or \
self.new_object.get('acls')
+ if self.new_object.get('destinationGroup') is not None or self.new_object.get('destination_group') is not None:
+ new_object_params['destinationGroup'] = self.new_object.get('destinationGroup') or \
+ self.new_object.get('destination_group')
if self.new_object.get('lastEntryRule') is not None or self.new_object.get('last_entry_rule') is not None:
new_object_params['lastEntryRule'] = self.new_object.get('lastEntryRule') or \
self.new_object.get('last_entry_rule')
+ if self.new_object.get('sourceGroup') is not None or self.new_object.get('source_group') is not None:
+ new_object_params['sourceGroup'] = self.new_object.get('sourceGroup') or \
+ self.new_object.get('source_group')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -193,10 +193,10 @@ class OrganizationsAdaptivePolicyPolicies(object):
requested_obj = self.new_object
obj_params = [
- ("sourceGroup", "sourceGroup"),
- ("destinationGroup", "destinationGroup"),
("acls", "acls"),
+ ("destinationGroup", "destinationGroup"),
("lastEntryRule", "lastEntryRule"),
+ ("sourceGroup", "sourceGroup"),
("organizationId", "organizationId"),
("id", "id"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_admins.py b/ansible_collections/cisco/meraki/plugins/action/organizations_admins.py
index a9b2140ef..641befa29 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_admins.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_admins.py
@@ -32,12 +32,12 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ authenticationMethod=dict(type="str"),
email=dict(type="str"),
name=dict(type="str"),
+ networks=dict(type="list"),
orgAccess=dict(type="str"),
tags=dict(type="list"),
- networks=dict(type="list"),
- authenticationMethod=dict(type="str"),
organizationId=dict(type="str"),
adminId=dict(type="str"),
))
@@ -55,12 +55,12 @@ class OrganizationsAdmins(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ authenticationMethod=params.get("authenticationMethod"),
email=params.get("email"),
name=params.get("name"),
+ networks=params.get("networks"),
orgAccess=params.get("orgAccess"),
tags=params.get("tags"),
- networks=params.get("networks"),
- authenticationMethod=params.get("authenticationMethod"),
organizationId=params.get("organizationId"),
adminId=params.get("adminId"),
)
@@ -74,24 +74,24 @@ class OrganizationsAdmins(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('authenticationMethod') is not None or self.new_object.get('authentication_method') is not None:
+ new_object_params['authenticationMethod'] = self.new_object.get('authenticationMethod') or \
+ self.new_object.get('authentication_method')
if self.new_object.get('email') is not None or self.new_object.get('email') is not None:
new_object_params['email'] = self.new_object.get('email') or \
self.new_object.get('email')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
+ if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
+ new_object_params['networks'] = self.new_object.get('networks') or \
+ self.new_object.get('networks')
if self.new_object.get('orgAccess') is not None or self.new_object.get('org_access') is not None:
new_object_params['orgAccess'] = self.new_object.get('orgAccess') or \
self.new_object.get('org_access')
if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
new_object_params['tags'] = self.new_object.get('tags') or \
self.new_object.get('tags')
- if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
- new_object_params['networks'] = self.new_object.get('networks') or \
- self.new_object.get('networks')
- if self.new_object.get('authenticationMethod') is not None or self.new_object.get('authentication_method') is not None:
- new_object_params['authenticationMethod'] = self.new_object.get('authenticationMethod') or \
- self.new_object.get('authentication_method')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -112,15 +112,15 @@ class OrganizationsAdmins(object):
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
+ if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
+ new_object_params['networks'] = self.new_object.get('networks') or \
+ self.new_object.get('networks')
if self.new_object.get('orgAccess') is not None or self.new_object.get('org_access') is not None:
new_object_params['orgAccess'] = self.new_object.get('orgAccess') or \
self.new_object.get('org_access')
if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
new_object_params['tags'] = self.new_object.get('tags') or \
self.new_object.get('tags')
- if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
- new_object_params['networks'] = self.new_object.get('networks') or \
- self.new_object.get('networks')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -195,12 +195,12 @@ class OrganizationsAdmins(object):
requested_obj = self.new_object
obj_params = [
+ ("authenticationMethod", "authenticationMethod"),
("email", "email"),
("name", "name"),
+ ("networks", "networks"),
("orgAccess", "orgAccess"),
("tags", "tags"),
- ("networks", "networks"),
- ("authenticationMethod", "authenticationMethod"),
("organizationId", "organizationId"),
("adminId", "adminId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_alerts_profiles.py b/ansible_collections/cisco/meraki/plugins/action/organizations_alerts_profiles.py
index cc046ea86..b773a76cc 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_alerts_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_alerts_profiles.py
@@ -31,11 +31,11 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- type=dict(type="str"),
alertCondition=dict(type="dict"),
- recipients=dict(type="dict"),
- networkTags=dict(type="list"),
description=dict(type="str"),
+ networkTags=dict(type="list"),
+ recipients=dict(type="dict"),
+ type=dict(type="str"),
organizationId=dict(type="str"),
enabled=dict(type="bool"),
alertConfigId=dict(type="str"),
@@ -54,11 +54,11 @@ class OrganizationsAlertsProfiles(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- type=params.get("type"),
alertCondition=params.get("alertCondition"),
- recipients=params.get("recipients"),
- networkTags=params.get("networkTags"),
description=params.get("description"),
+ networkTags=params.get("networkTags"),
+ recipients=params.get("recipients"),
+ type=params.get("type"),
organization_id=params.get("organizationId"),
enabled=params.get("enabled"),
alert_config_id=params.get("alertConfigId"),
@@ -66,21 +66,21 @@ class OrganizationsAlertsProfiles(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
- new_object_params['type'] = self.new_object.get('type') or \
- self.new_object.get('type')
if self.new_object.get('alertCondition') is not None or self.new_object.get('alert_condition') is not None:
new_object_params['alertCondition'] = self.new_object.get('alertCondition') or \
self.new_object.get('alert_condition')
- if self.new_object.get('recipients') is not None or self.new_object.get('recipients') is not None:
- new_object_params['recipients'] = self.new_object.get('recipients') or \
- self.new_object.get('recipients')
- if self.new_object.get('networkTags') is not None or self.new_object.get('network_tags') is not None:
- new_object_params['networkTags'] = self.new_object.get('networkTags') or \
- self.new_object.get('network_tags')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
+ if self.new_object.get('networkTags') is not None or self.new_object.get('network_tags') is not None:
+ new_object_params['networkTags'] = self.new_object.get('networkTags') or \
+ self.new_object.get('network_tags')
+ if self.new_object.get('recipients') is not None or self.new_object.get('recipients') is not None:
+ new_object_params['recipients'] = self.new_object.get('recipients') or \
+ self.new_object.get('recipients')
+ if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
+ new_object_params['type'] = self.new_object.get('type') or \
+ self.new_object.get('type')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -98,23 +98,23 @@ class OrganizationsAlertsProfiles(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
- if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
- new_object_params['type'] = self.new_object.get('type') or \
- self.new_object.get('type')
if self.new_object.get('alertCondition') is not None or self.new_object.get('alert_condition') is not None:
new_object_params['alertCondition'] = self.new_object.get('alertCondition') or \
self.new_object.get('alert_condition')
- if self.new_object.get('recipients') is not None or self.new_object.get('recipients') is not None:
- new_object_params['recipients'] = self.new_object.get('recipients') or \
- self.new_object.get('recipients')
- if self.new_object.get('networkTags') is not None or self.new_object.get('network_tags') is not None:
- new_object_params['networkTags'] = self.new_object.get('networkTags') or \
- self.new_object.get('network_tags')
if self.new_object.get('description') is not None or self.new_object.get('description') is not None:
new_object_params['description'] = self.new_object.get('description') or \
self.new_object.get('description')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('networkTags') is not None or self.new_object.get('network_tags') is not None:
+ new_object_params['networkTags'] = self.new_object.get('networkTags') or \
+ self.new_object.get('network_tags')
+ if self.new_object.get('recipients') is not None or self.new_object.get('recipients') is not None:
+ new_object_params['recipients'] = self.new_object.get('recipients') or \
+ self.new_object.get('recipients')
+ if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
+ new_object_params['type'] = self.new_object.get('type') or \
+ self.new_object.get('type')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -163,11 +163,11 @@ class OrganizationsAlertsProfiles(object):
requested_obj = self.new_object
obj_params = [
- ("type", "type"),
("alertCondition", "alertCondition"),
- ("recipients", "recipients"),
- ("networkTags", "networkTags"),
("description", "description"),
+ ("networkTags", "networkTags"),
+ ("recipients", "recipients"),
+ ("type", "type"),
("organizationId", "organizationId"),
("enabled", "enabled"),
("alertConfigId", "alertConfigId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
new file mode 100644
index 000000000..6aad7552f
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ networkIds=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="appliance",
+ function='getOrganizationApplianceTrafficShapingVpnExclusionsByNetwork',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_statuses_overview_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_statuses_overview_info.py
new file mode 100644
index 000000000..8180b0eb2
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_statuses_overview_info.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="appliance",
+ function='getOrganizationApplianceUplinksStatusesOverview',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_usage_by_network_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_usage_by_network_info.py
new file mode 100644
index 000000000..c52e2bac2
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_appliance_uplinks_usage_by_network_info.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="appliance",
+ function='getOrganizationApplianceUplinksUsageByNetwork',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies.py b/ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies.py
index 870c0370e..246f94575 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_branding_policies.py
@@ -32,11 +32,11 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
- enabled=dict(type="bool"),
adminSettings=dict(type="dict"),
- helpSettings=dict(type="dict"),
customLogo=dict(type="dict"),
+ enabled=dict(type="bool"),
+ helpSettings=dict(type="dict"),
+ name=dict(type="str"),
organizationId=dict(type="str"),
brandingPolicyId=dict(type="str"),
))
@@ -54,11 +54,11 @@ class OrganizationsBrandingPolicies(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- enabled=params.get("enabled"),
adminSettings=params.get("adminSettings"),
- helpSettings=params.get("helpSettings"),
customLogo=params.get("customLogo"),
+ enabled=params.get("enabled"),
+ helpSettings=params.get("helpSettings"),
+ name=params.get("name"),
organizationId=params.get("organizationId"),
brandingPolicyId=params.get("brandingPolicyId"),
)
@@ -82,20 +82,20 @@ class OrganizationsBrandingPolicies(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('adminSettings') is not None or self.new_object.get('admin_settings') is not None:
new_object_params['adminSettings'] = self.new_object.get('adminSettings') or \
self.new_object.get('admin_settings')
- if self.new_object.get('helpSettings') is not None or self.new_object.get('help_settings') is not None:
- new_object_params['helpSettings'] = self.new_object.get('helpSettings') or \
- self.new_object.get('help_settings')
if self.new_object.get('customLogo') is not None or self.new_object.get('custom_logo') is not None:
new_object_params['customLogo'] = self.new_object.get('customLogo') or \
self.new_object.get('custom_logo')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('helpSettings') is not None or self.new_object.get('help_settings') is not None:
+ new_object_params['helpSettings'] = self.new_object.get('helpSettings') or \
+ self.new_object.get('help_settings')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -113,20 +113,20 @@ class OrganizationsBrandingPolicies(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
if self.new_object.get('adminSettings') is not None or self.new_object.get('admin_settings') is not None:
new_object_params['adminSettings'] = self.new_object.get('adminSettings') or \
self.new_object.get('admin_settings')
- if self.new_object.get('helpSettings') is not None or self.new_object.get('help_settings') is not None:
- new_object_params['helpSettings'] = self.new_object.get('helpSettings') or \
- self.new_object.get('help_settings')
if self.new_object.get('customLogo') is not None or self.new_object.get('custom_logo') is not None:
new_object_params['customLogo'] = self.new_object.get('customLogo') or \
self.new_object.get('custom_logo')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('helpSettings') is not None or self.new_object.get('help_settings') is not None:
+ new_object_params['helpSettings'] = self.new_object.get('helpSettings') or \
+ self.new_object.get('help_settings')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -204,11 +204,11 @@ class OrganizationsBrandingPolicies(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("enabled", "enabled"),
("adminSettings", "adminSettings"),
- ("helpSettings", "helpSettings"),
("customLogo", "customLogo"),
+ ("enabled", "enabled"),
+ ("helpSettings", "helpSettings"),
+ ("name", "name"),
("organizationId", "organizationId"),
("brandingPolicyId", "brandingPolicyId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_areas_by_device_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_areas_by_device_info.py
new file mode 100644
index 000000000..a54a4f830
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_areas_by_device_info.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ serials=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="camera",
+ function='getOrganizationCameraBoundariesAreasByDevice',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_lines_by_device_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_lines_by_device_info.py
new file mode 100644
index 000000000..89f74a210
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_boundaries_lines_by_device_info.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ serials=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="camera",
+ function='getOrganizationCameraBoundariesLinesByDevice',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_camera_detections_history_by_boundary_by_interval_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_detections_history_by_boundary_by_interval_info.py
new file mode 100644
index 000000000..fd9ef63d5
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_detections_history_by_boundary_by_interval_info.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ boundaryIds=dict(type="list"),
+ ranges=dict(type="list"),
+ duration=dict(type="int"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ boundaryTypes=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("boundaryIds") is not None:
+ new_object["boundaryIds"] = params.get(
+ "boundaryIds")
+ if params.get("ranges") is not None:
+ new_object["ranges"] = params.get(
+ "ranges")
+ if params.get("duration") is not None:
+ new_object["duration"] = params.get(
+ "duration")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("boundaryTypes") is not None:
+ new_object["boundaryTypes"] = params.get(
+ "boundaryTypes")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="camera",
+ function='getOrganizationCameraDetectionsHistoryByBoundaryByInterval',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_camera_permissions_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_permissions_info.py
new file mode 100644
index 000000000..3eb13d08d
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_permissions_info.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ permissionScopeId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("permissionScopeId") is not None:
+ new_object["permissionScopeId"] = params.get(
+ "permissionScopeId")
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ id = self._task.args.get("permissionScopeId")
+ if id:
+ response = meraki.exec_meraki(
+ family="camera",
+ function='getOrganizationCameraPermission',
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
+ if not id:
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles.py b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles.py
new file mode 100644
index 000000000..222b2503d
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles.py
@@ -0,0 +1,252 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+ get_dict_result,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present", "absent"]),
+ appliedOnDevices=dict(type="list"),
+ appliedOnNetworks=dict(type="list"),
+ appliedOrgWide=dict(type="list"),
+ name=dict(type="str"),
+ organizationId=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["name", "organizationId"], True),
+ ("state", "absent", ["name", "organizationId"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class OrganizationsCameraRoles(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ appliedOnDevices=params.get("appliedOnDevices"),
+ appliedOnNetworks=params.get("appliedOnNetworks"),
+ appliedOrgWide=params.get("appliedOrgWide"),
+ name=params.get("name"),
+ organizationId=params.get("organizationId"),
+ )
+
+ def get_all_params(self, name=None, id=None):
+ new_object_params = {}
+ if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
+ new_object_params['organizationId'] = self.new_object.get('organizationId') or \
+ self.new_object.get('organization_id')
+ return new_object_params
+
+ def create_params(self):
+ new_object_params = {}
+ if self.new_object.get('appliedOnDevices') is not None or self.new_object.get('applied_on_devices') is not None:
+ new_object_params['appliedOnDevices'] = self.new_object.get('appliedOnDevices') or \
+ self.new_object.get('applied_on_devices')
+ if self.new_object.get('appliedOnNetworks') is not None or self.new_object.get('applied_on_networks') is not None:
+ new_object_params['appliedOnNetworks'] = self.new_object.get('appliedOnNetworks') or \
+ self.new_object.get('applied_on_networks')
+ if self.new_object.get('appliedOrgWide') is not None or self.new_object.get('applied_org_wide') is not None:
+ new_object_params['appliedOrgWide'] = self.new_object.get('appliedOrgWide') or \
+ self.new_object.get('applied_org_wide')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
+ new_object_params['organizationId'] = self.new_object.get('organizationId') or \
+ self.new_object.get('organization_id')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name method or it is in another action
+ try:
+ items = self.meraki.exec_meraki(
+ family="camera",
+ function="getOrganizationCameraRoles",
+ params=self.get_all_params(name=name),
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = get_dict_result(items, 'name', name)
+ if result is None:
+ result = items
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ try:
+ items = self.meraki.exec_meraki(
+ family="camera",
+ function="getOrganizationCameraRoles",
+ params=self.get_all_params(id=id),
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = get_dict_result(items, 'id', id)
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def exists(self):
+ id_exists = False
+ name_exists = False
+ prev_obj = None
+ o_id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_id(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("appliedOnDevices", "appliedOnDevices"),
+ ("appliedOnNetworks", "appliedOnNetworks"),
+ ("appliedOrgWide", "appliedOrgWide"),
+ ("name", "name"),
+ ("organizationId", "organizationId"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (DNAC) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def create(self):
+ result = self.meraki.exec_meraki(
+ family="camera",
+ function="createOrganizationCameraRole",
+ params=self.create_params(),
+ op_modifies=True,
+ )
+ return result
+
+ def update(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ result = None
+ # NOTE: Does not have update method. What do we do?
+ return result
+
+ def delete(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ result = None
+ # NOTE: Does not have delete method. What do we do?
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = OrganizationsCameraRoles(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = obj.update()
+ meraki.object_updated()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ response = obj.create()
+ meraki.object_created()
+
+ elif state == "absent":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ response = obj.delete()
+ meraki.object_deleted()
+ else:
+ meraki.object_already_absent()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles_info.py
new file mode 100644
index 000000000..2a100b4e2
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_camera_roles_info.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="camera",
+ function='getOrganizationCameraRoles',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_claim.py b/ansible_collections/cisco/meraki/plugins/action/organizations_claim.py
index 5439a5af8..6f3a8ef92 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_claim.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_claim.py
@@ -25,9 +25,9 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
+ licenses=dict(type="list"),
orders=dict(type="list"),
serials=dict(type="list"),
- licenses=dict(type="list"),
organizationId=dict(type="str"),
))
@@ -67,9 +67,9 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
+ licenses=params.get("licenses"),
orders=params.get("orders"),
serials=params.get("serials"),
- licenses=params.get("licenses"),
organizationId=params.get("organizationId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates.py b/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates.py
index 09dc845b0..1811392e7 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates.py
@@ -32,6 +32,7 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
+ copyFromNetworkId=dict(type="str"),
name=dict(type="str"),
timeZone=dict(type="str"),
organizationId=dict(type="str"),
@@ -51,6 +52,7 @@ class OrganizationsConfigTemplates(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ copyFromNetworkId=params.get("copyFromNetworkId"),
name=params.get("name"),
timeZone=params.get("timeZone"),
organizationId=params.get("organizationId"),
@@ -76,6 +78,9 @@ class OrganizationsConfigTemplates(object):
def create_params(self):
new_object_params = {}
+ if self.new_object.get('copyFromNetworkId') is not None or self.new_object.get('copy_from_network_id') is not None:
+ new_object_params['copyFromNetworkId'] = self.new_object.get('copyFromNetworkId') or \
+ self.new_object.get('copy_from_network_id')
if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
new_object_params['name'] = self.new_object.get('name') or \
self.new_object.get('name')
@@ -182,6 +187,7 @@ class OrganizationsConfigTemplates(object):
requested_obj = self.new_object
obj_params = [
+ ("copyFromNetworkId", "copyFromNetworkId"),
("name", "name"),
("timeZone", "timeZone"),
("organizationId", "organizationId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports.py b/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports.py
index 38cd937fc..82963b4b0 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_config_templates_switch_profiles_ports.py
@@ -32,29 +32,29 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- name=dict(type="str"),
- tags=dict(type="list"),
- enabled=dict(type="bool"),
- poeEnabled=dict(type="bool"),
- type=dict(type="str"),
- vlan=dict(type="int"),
- voiceVlan=dict(type="int"),
+ accessPolicyNumber=dict(type="int"),
+ accessPolicyType=dict(type="str"),
allowedVlans=dict(type="str"),
+ daiTrusted=dict(type="bool"),
+ enabled=dict(type="bool"),
+ flexibleStackingEnabled=dict(type="bool"),
isolationEnabled=dict(type="bool"),
- rstpEnabled=dict(type="bool"),
- stpGuard=dict(type="str"),
linkNegotiation=dict(type="str"),
- portScheduleId=dict(type="str"),
- udld=dict(type="str"),
- accessPolicyType=dict(type="str"),
- accessPolicyNumber=dict(type="int"),
macAllowList=dict(type="list"),
+ name=dict(type="str"),
+ poeEnabled=dict(type="bool"),
+ portScheduleId=dict(type="str"),
+ profile=dict(type="dict"),
+ rstpEnabled=dict(type="bool"),
stickyMacAllowList=dict(type="list"),
stickyMacAllowListLimit=dict(type="int"),
stormControlEnabled=dict(type="bool"),
- flexibleStackingEnabled=dict(type="bool"),
- daiTrusted=dict(type="bool"),
- profile=dict(type="dict"),
+ stpGuard=dict(type="str"),
+ tags=dict(type="list"),
+ type=dict(type="str"),
+ udld=dict(type="str"),
+ vlan=dict(type="int"),
+ voiceVlan=dict(type="int"),
organizationId=dict(type="str"),
configTemplateId=dict(type="str"),
profileId=dict(type="str"),
@@ -73,29 +73,29 @@ class OrganizationsConfigTemplatesSwitchProfilesPorts(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
- tags=params.get("tags"),
- enabled=params.get("enabled"),
- poeEnabled=params.get("poeEnabled"),
- type=params.get("type"),
- vlan=params.get("vlan"),
- voiceVlan=params.get("voiceVlan"),
+ accessPolicyNumber=params.get("accessPolicyNumber"),
+ accessPolicyType=params.get("accessPolicyType"),
allowedVlans=params.get("allowedVlans"),
+ daiTrusted=params.get("daiTrusted"),
+ enabled=params.get("enabled"),
+ flexibleStackingEnabled=params.get("flexibleStackingEnabled"),
isolationEnabled=params.get("isolationEnabled"),
- rstpEnabled=params.get("rstpEnabled"),
- stpGuard=params.get("stpGuard"),
linkNegotiation=params.get("linkNegotiation"),
- portScheduleId=params.get("portScheduleId"),
- udld=params.get("udld"),
- accessPolicyType=params.get("accessPolicyType"),
- accessPolicyNumber=params.get("accessPolicyNumber"),
macAllowList=params.get("macAllowList"),
+ name=params.get("name"),
+ poeEnabled=params.get("poeEnabled"),
+ portScheduleId=params.get("portScheduleId"),
+ profile=params.get("profile"),
+ rstpEnabled=params.get("rstpEnabled"),
stickyMacAllowList=params.get("stickyMacAllowList"),
stickyMacAllowListLimit=params.get("stickyMacAllowListLimit"),
stormControlEnabled=params.get("stormControlEnabled"),
- flexibleStackingEnabled=params.get("flexibleStackingEnabled"),
- daiTrusted=params.get("daiTrusted"),
- profile=params.get("profile"),
+ stpGuard=params.get("stpGuard"),
+ tags=params.get("tags"),
+ type=params.get("type"),
+ udld=params.get("udld"),
+ vlan=params.get("vlan"),
+ voiceVlan=params.get("voiceVlan"),
organization_id=params.get("organizationId"),
config_template_id=params.get("configTemplateId"),
profile_id=params.get("profileId"),
@@ -133,53 +133,42 @@ class OrganizationsConfigTemplatesSwitchProfilesPorts(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
- if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
- new_object_params['tags'] = self.new_object.get('tags') or \
- self.new_object.get('tags')
- if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
- new_object_params['enabled'] = self.new_object.get('enabled')
- if self.new_object.get('poeEnabled') is not None or self.new_object.get('poe_enabled') is not None:
- new_object_params['poeEnabled'] = self.new_object.get('poeEnabled')
- if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
- new_object_params['type'] = self.new_object.get('type') or \
- self.new_object.get('type')
- if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
- new_object_params['vlan'] = self.new_object.get('vlan') or \
- self.new_object.get('vlan')
- if self.new_object.get('voiceVlan') is not None or self.new_object.get('voice_vlan') is not None:
- new_object_params['voiceVlan'] = self.new_object.get('voiceVlan') or \
- self.new_object.get('voice_vlan')
+ if self.new_object.get('accessPolicyNumber') is not None or self.new_object.get('access_policy_number') is not None:
+ new_object_params['accessPolicyNumber'] = self.new_object.get('accessPolicyNumber') or \
+ self.new_object.get('access_policy_number')
+ if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
+ new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
+ self.new_object.get('access_policy_type')
if self.new_object.get('allowedVlans') is not None or self.new_object.get('allowed_vlans') is not None:
new_object_params['allowedVlans'] = self.new_object.get('allowedVlans') or \
self.new_object.get('allowed_vlans')
+ if self.new_object.get('daiTrusted') is not None or self.new_object.get('dai_trusted') is not None:
+ new_object_params['daiTrusted'] = self.new_object.get('daiTrusted')
+ if self.new_object.get('enabled') is not None or self.new_object.get('enabled') is not None:
+ new_object_params['enabled'] = self.new_object.get('enabled')
+ if self.new_object.get('flexibleStackingEnabled') is not None or self.new_object.get('flexible_stacking_enabled') is not None:
+ new_object_params['flexibleStackingEnabled'] = self.new_object.get('flexibleStackingEnabled')
if self.new_object.get('isolationEnabled') is not None or self.new_object.get('isolation_enabled') is not None:
new_object_params['isolationEnabled'] = self.new_object.get('isolationEnabled')
- if self.new_object.get('rstpEnabled') is not None or self.new_object.get('rstp_enabled') is not None:
- new_object_params['rstpEnabled'] = self.new_object.get('rstpEnabled')
- if self.new_object.get('stpGuard') is not None or self.new_object.get('stp_guard') is not None:
- new_object_params['stpGuard'] = self.new_object.get('stpGuard') or \
- self.new_object.get('stp_guard')
if self.new_object.get('linkNegotiation') is not None or self.new_object.get('link_negotiation') is not None:
new_object_params['linkNegotiation'] = self.new_object.get('linkNegotiation') or \
self.new_object.get('link_negotiation')
- if self.new_object.get('portScheduleId') is not None or self.new_object.get('port_schedule_id') is not None:
- new_object_params['portScheduleId'] = self.new_object.get('portScheduleId') or \
- self.new_object.get('port_schedule_id')
- if self.new_object.get('udld') is not None or self.new_object.get('udld') is not None:
- new_object_params['udld'] = self.new_object.get('udld') or \
- self.new_object.get('udld')
- if self.new_object.get('accessPolicyType') is not None or self.new_object.get('access_policy_type') is not None:
- new_object_params['accessPolicyType'] = self.new_object.get('accessPolicyType') or \
- self.new_object.get('access_policy_type')
- if self.new_object.get('accessPolicyNumber') is not None or self.new_object.get('access_policy_number') is not None:
- new_object_params['accessPolicyNumber'] = self.new_object.get('accessPolicyNumber') or \
- self.new_object.get('access_policy_number')
if self.new_object.get('macAllowList') is not None or self.new_object.get('mac_allow_list') is not None:
new_object_params['macAllowList'] = self.new_object.get('macAllowList') or \
self.new_object.get('mac_allow_list')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('poeEnabled') is not None or self.new_object.get('poe_enabled') is not None:
+ new_object_params['poeEnabled'] = self.new_object.get('poeEnabled')
+ if self.new_object.get('portScheduleId') is not None or self.new_object.get('port_schedule_id') is not None:
+ new_object_params['portScheduleId'] = self.new_object.get('portScheduleId') or \
+ self.new_object.get('port_schedule_id')
+ if self.new_object.get('profile') is not None or self.new_object.get('profile') is not None:
+ new_object_params['profile'] = self.new_object.get('profile') or \
+ self.new_object.get('profile')
+ if self.new_object.get('rstpEnabled') is not None or self.new_object.get('rstp_enabled') is not None:
+ new_object_params['rstpEnabled'] = self.new_object.get('rstpEnabled')
if self.new_object.get('stickyMacAllowList') is not None or self.new_object.get('sticky_mac_allow_list') is not None:
new_object_params['stickyMacAllowList'] = self.new_object.get('stickyMacAllowList') or \
self.new_object.get('sticky_mac_allow_list')
@@ -188,13 +177,24 @@ class OrganizationsConfigTemplatesSwitchProfilesPorts(object):
self.new_object.get('sticky_mac_allow_list_limit')
if self.new_object.get('stormControlEnabled') is not None or self.new_object.get('storm_control_enabled') is not None:
new_object_params['stormControlEnabled'] = self.new_object.get('stormControlEnabled')
- if self.new_object.get('flexibleStackingEnabled') is not None or self.new_object.get('flexible_stacking_enabled') is not None:
- new_object_params['flexibleStackingEnabled'] = self.new_object.get('flexibleStackingEnabled')
- if self.new_object.get('daiTrusted') is not None or self.new_object.get('dai_trusted') is not None:
- new_object_params['daiTrusted'] = self.new_object.get('daiTrusted')
- if self.new_object.get('profile') is not None or self.new_object.get('profile') is not None:
- new_object_params['profile'] = self.new_object.get('profile') or \
- self.new_object.get('profile')
+ if self.new_object.get('stpGuard') is not None or self.new_object.get('stp_guard') is not None:
+ new_object_params['stpGuard'] = self.new_object.get('stpGuard') or \
+ self.new_object.get('stp_guard')
+ if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
+ new_object_params['tags'] = self.new_object.get('tags') or \
+ self.new_object.get('tags')
+ if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
+ new_object_params['type'] = self.new_object.get('type') or \
+ self.new_object.get('type')
+ if self.new_object.get('udld') is not None or self.new_object.get('udld') is not None:
+ new_object_params['udld'] = self.new_object.get('udld') or \
+ self.new_object.get('udld')
+ if self.new_object.get('vlan') is not None or self.new_object.get('vlan') is not None:
+ new_object_params['vlan'] = self.new_object.get('vlan') or \
+ self.new_object.get('vlan')
+ if self.new_object.get('voiceVlan') is not None or self.new_object.get('voice_vlan') is not None:
+ new_object_params['voiceVlan'] = self.new_object.get('voiceVlan') or \
+ self.new_object.get('voice_vlan')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -278,29 +278,29 @@ class OrganizationsConfigTemplatesSwitchProfilesPorts(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
- ("tags", "tags"),
- ("enabled", "enabled"),
- ("poeEnabled", "poeEnabled"),
- ("type", "type"),
- ("vlan", "vlan"),
- ("voiceVlan", "voiceVlan"),
+ ("accessPolicyNumber", "accessPolicyNumber"),
+ ("accessPolicyType", "accessPolicyType"),
("allowedVlans", "allowedVlans"),
+ ("daiTrusted", "daiTrusted"),
+ ("enabled", "enabled"),
+ ("flexibleStackingEnabled", "flexibleStackingEnabled"),
("isolationEnabled", "isolationEnabled"),
- ("rstpEnabled", "rstpEnabled"),
- ("stpGuard", "stpGuard"),
("linkNegotiation", "linkNegotiation"),
- ("portScheduleId", "portScheduleId"),
- ("udld", "udld"),
- ("accessPolicyType", "accessPolicyType"),
- ("accessPolicyNumber", "accessPolicyNumber"),
("macAllowList", "macAllowList"),
+ ("name", "name"),
+ ("poeEnabled", "poeEnabled"),
+ ("portScheduleId", "portScheduleId"),
+ ("profile", "profile"),
+ ("rstpEnabled", "rstpEnabled"),
("stickyMacAllowList", "stickyMacAllowList"),
("stickyMacAllowListLimit", "stickyMacAllowListLimit"),
("stormControlEnabled", "stormControlEnabled"),
- ("flexibleStackingEnabled", "flexibleStackingEnabled"),
- ("daiTrusted", "daiTrusted"),
- ("profile", "profile"),
+ ("stpGuard", "stpGuard"),
+ ("tags", "tags"),
+ ("type", "type"),
+ ("udld", "udld"),
+ ("vlan", "vlan"),
+ ("voiceVlan", "voiceVlan"),
("organizationId", "organizationId"),
("configTemplateId", "configTemplateId"),
("profileId", "profileId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_change_history_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_change_history_info.py
new file mode 100644
index 000000000..feee0396e
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_devices_availabilities_change_history_info.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+ serials=dict(type="list"),
+ productTypes=dict(type="list"),
+ networkIds=dict(type="list"),
+ statuses=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("productTypes") is not None:
+ new_object["productTypes"] = params.get(
+ "productTypes")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("statuses") is not None:
+ new_object["statuses"] = params.get(
+ "statuses")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="organizations",
+ function='getOrganizationDevicesAvailabilitiesChangeHistory',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_devices_boots_history_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_devices_boots_history_info.py
new file mode 100644
index 000000000..53053eb7a
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_devices_boots_history_info.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+ serials=dict(type="list"),
+ mostRecentPerDevice=dict(type="bool"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ sortOrder=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("mostRecentPerDevice") is not None:
+ new_object["mostRecentPerDevice"] = params.get(
+ "mostRecentPerDevice")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("sortOrder") is not None:
+ new_object["sortOrder"] = params.get(
+ "sortOrder")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="organizations",
+ function='getOrganizationDevicesBootsHistory',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_early_access_features_opt_ins.py b/ansible_collections/cisco/meraki/plugins/action/organizations_early_access_features_opt_ins.py
index 7a952168f..b0ebdf793 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_early_access_features_opt_ins.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_early_access_features_opt_ins.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- shortName=dict(type="str"),
limitScopeToNetworks=dict(type="list"),
+ shortName=dict(type="str"),
organizationId=dict(type="str"),
optInId=dict(type="str"),
))
@@ -51,8 +51,8 @@ class OrganizationsEarlyAccessFeaturesOptIns(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- shortName=params.get("shortName"),
limitScopeToNetworks=params.get("limitScopeToNetworks"),
+ shortName=params.get("shortName"),
organizationId=params.get("organizationId"),
optInId=params.get("optInId"),
)
@@ -76,12 +76,12 @@ class OrganizationsEarlyAccessFeaturesOptIns(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('shortName') is not None or self.new_object.get('short_name') is not None:
- new_object_params['shortName'] = self.new_object.get('shortName') or \
- self.new_object.get('short_name')
if self.new_object.get('limitScopeToNetworks') is not None or self.new_object.get('limit_scope_to_networks') is not None:
new_object_params['limitScopeToNetworks'] = self.new_object.get('limitScopeToNetworks') or \
self.new_object.get('limit_scope_to_networks')
+ if self.new_object.get('shortName') is not None or self.new_object.get('short_name') is not None:
+ new_object_params['shortName'] = self.new_object.get('shortName') or \
+ self.new_object.get('short_name')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -179,8 +179,8 @@ class OrganizationsEarlyAccessFeaturesOptIns(object):
requested_obj = self.new_object
obj_params = [
- ("shortName", "shortName"),
("limitScopeToNetworks", "limitScopeToNetworks"),
+ ("shortName", "shortName"),
("organizationId", "organizationId"),
("optInId", "optInId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_by_device_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_by_device_info.py
index 254770a93..942ee2ecb 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_by_device_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_by_device_info.py
@@ -34,8 +34,8 @@ argument_spec.update(dict(
networkIds=dict(type="list"),
serials=dict(type="list"),
macs=dict(type="list"),
- firmwareUpgradeIds=dict(type="list"),
firmwareUpgradeBatchIds=dict(type="list"),
+ upgradeStatuses=dict(type="list"),
))
required_if = []
@@ -99,12 +99,12 @@ class ActionModule(ActionBase):
if params.get("macs") is not None:
new_object["macs"] = params.get(
"macs")
- if params.get("firmwareUpgradeIds") is not None:
- new_object["firmwareUpgradeIds"] = params.get(
- "firmwareUpgradeIds")
if params.get("firmwareUpgradeBatchIds") is not None:
new_object["firmwareUpgradeBatchIds"] = params.get(
"firmwareUpgradeBatchIds")
+ if params.get("upgradeStatuses") is not None:
+ new_object["upgradeStatuses"] = params.get(
+ "upgradeStatuses")
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_info.py
index e8e72f6ce..afe4584e9 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_firmware_upgrades_info.py
@@ -26,8 +26,13 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
organizationId=dict(type="str"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
status=dict(type="list"),
- productType=dict(type="list"),
+ productTypes=dict(type="list"),
))
required_if = []
@@ -69,12 +74,25 @@ class ActionModule(ActionBase):
if params.get("organizationId") is not None:
new_object["organizationId"] = params.get(
"organizationId")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
if params.get("status") is not None:
new_object["status"] = params.get(
"status")
- if params.get("productType") is not None:
- new_object["productType"] = params.get(
- "productType")
+ if params.get("productTypes") is not None:
+ new_object["productTypes"] = params.get(
+ "productTypes")
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_info.py
index e7dba48d4..3a48d1c4b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_info.py
@@ -25,6 +25,11 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
organizationId=dict(type="str"),
))
@@ -71,6 +76,19 @@ class ActionModule(ActionBase):
def get_all(self, params):
new_object = {}
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_insight_monitored_media_servers.py b/ansible_collections/cisco/meraki/plugins/action/organizations_insight_monitored_media_servers.py
index 14957d943..dbead6d01 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_insight_monitored_media_servers.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_insight_monitored_media_servers.py
@@ -32,9 +32,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
address=dict(type="str"),
bestEffortMonitoringEnabled=dict(type="bool"),
+ name=dict(type="str"),
organizationId=dict(type="str"),
monitoredMediaServerId=dict(type="str"),
))
@@ -52,9 +52,9 @@ class OrganizationsInsightMonitoredMediaServers(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
address=params.get("address"),
bestEffortMonitoringEnabled=params.get("bestEffortMonitoringEnabled"),
+ name=params.get("name"),
organizationId=params.get("organizationId"),
monitoredMediaServerId=params.get("monitoredMediaServerId"),
)
@@ -78,14 +78,14 @@ class OrganizationsInsightMonitoredMediaServers(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('address') is not None or self.new_object.get('address') is not None:
new_object_params['address'] = self.new_object.get('address') or \
self.new_object.get('address')
if self.new_object.get('bestEffortMonitoringEnabled') is not None or self.new_object.get('best_effort_monitoring_enabled') is not None:
new_object_params['bestEffortMonitoringEnabled'] = self.new_object.get('bestEffortMonitoringEnabled')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -103,14 +103,14 @@ class OrganizationsInsightMonitoredMediaServers(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('address') is not None or self.new_object.get('address') is not None:
new_object_params['address'] = self.new_object.get('address') or \
self.new_object.get('address')
if self.new_object.get('bestEffortMonitoringEnabled') is not None or self.new_object.get('best_effort_monitoring_enabled') is not None:
new_object_params['bestEffortMonitoringEnabled'] = self.new_object.get('bestEffortMonitoringEnabled')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -188,9 +188,9 @@ class OrganizationsInsightMonitoredMediaServers(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
("address", "address"),
("bestEffortMonitoringEnabled", "bestEffortMonitoringEnabled"),
+ ("name", "name"),
("organizationId", "organizationId"),
("monitoredMediaServerId", "monitoredMediaServerId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_claim.py b/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_claim.py
index 5bc648b91..e25a3d67b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_claim.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_claim.py
@@ -25,9 +25,9 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
+ licenses=dict(type="list"),
orders=dict(type="list"),
serials=dict(type="list"),
- licenses=dict(type="list"),
organizationId=dict(type="str"),
))
@@ -67,9 +67,9 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
+ licenses=params.get("licenses"),
orders=params.get("orders"),
serials=params.get("serials"),
- licenses=params.get("licenses"),
organizationId=params.get("organizationId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_export_events.py b/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_export_events.py
index 11cefb220..6a03ab49f 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_export_events.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_export_events.py
@@ -26,9 +26,9 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
logEvent=dict(type="str"),
- timestamp=dict(type="int"),
- targetOS=dict(type="str"),
request=dict(type="str"),
+ targetOS=dict(type="str"),
+ timestamp=dict(type="int"),
organizationId=dict(type="str"),
))
@@ -69,9 +69,9 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
logEvent=params.get("logEvent"),
- timestamp=params.get("timestamp"),
- targetOS=params.get("targetOS"),
request=params.get("request"),
+ targetOS=params.get("targetOS"),
+ timestamp=params.get("timestamp"),
organizationId=params.get("organizationId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_networks_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_networks_info.py
index 409b7abdb..bf953f272 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_networks_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_inventory_onboarding_cloud_monitoring_networks_info.py
@@ -27,6 +27,7 @@ argument_spec = meraki_argument_spec()
argument_spec.update(dict(
organizationId=dict(type="str"),
deviceType=dict(type="str"),
+ search=dict(type="str"),
perPage=dict(type="int"),
total_pages=dict(type="int"),
direction=dict(type="str"),
@@ -76,6 +77,9 @@ class ActionModule(ActionBase):
if params.get("deviceType") is not None:
new_object["deviceType"] = params.get(
"deviceType")
+ if params.get("search") is not None:
+ new_object["search"] = params.get(
+ "search")
if params.get("perPage") is not None:
new_object["perPage"] = params.get(
"perPage")
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_login_security.py b/ansible_collections/cisco/meraki/plugins/action/organizations_login_security.py
index 64f5ea7b4..d231966d9 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_login_security.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_login_security.py
@@ -32,19 +32,19 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
- enforcePasswordExpiration=dict(type="bool"),
- passwordExpirationDays=dict(type="int"),
- enforceDifferentPasswords=dict(type="bool"),
- numDifferentPasswords=dict(type="int"),
- enforceStrongPasswords=dict(type="bool"),
- enforceAccountLockout=dict(type="bool"),
accountLockoutAttempts=dict(type="int"),
+ apiAuthentication=dict(type="dict"),
+ enforceAccountLockout=dict(type="bool"),
+ enforceDifferentPasswords=dict(type="bool"),
enforceIdleTimeout=dict(type="bool"),
- idleTimeoutMinutes=dict(type="int"),
- enforceTwoFactorAuth=dict(type="bool"),
enforceLoginIpRanges=dict(type="bool"),
+ enforcePasswordExpiration=dict(type="bool"),
+ enforceStrongPasswords=dict(type="bool"),
+ enforceTwoFactorAuth=dict(type="bool"),
+ idleTimeoutMinutes=dict(type="int"),
loginIpRanges=dict(type="list"),
- apiAuthentication=dict(type="dict"),
+ numDifferentPasswords=dict(type="int"),
+ passwordExpirationDays=dict(type="int"),
organizationId=dict(type="str"),
))
@@ -60,19 +60,19 @@ class OrganizationsLoginSecurity(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- enforcePasswordExpiration=params.get("enforcePasswordExpiration"),
- passwordExpirationDays=params.get("passwordExpirationDays"),
- enforceDifferentPasswords=params.get("enforceDifferentPasswords"),
- numDifferentPasswords=params.get("numDifferentPasswords"),
- enforceStrongPasswords=params.get("enforceStrongPasswords"),
- enforceAccountLockout=params.get("enforceAccountLockout"),
accountLockoutAttempts=params.get("accountLockoutAttempts"),
+ apiAuthentication=params.get("apiAuthentication"),
+ enforceAccountLockout=params.get("enforceAccountLockout"),
+ enforceDifferentPasswords=params.get("enforceDifferentPasswords"),
enforceIdleTimeout=params.get("enforceIdleTimeout"),
- idleTimeoutMinutes=params.get("idleTimeoutMinutes"),
- enforceTwoFactorAuth=params.get("enforceTwoFactorAuth"),
enforceLoginIpRanges=params.get("enforceLoginIpRanges"),
+ enforcePasswordExpiration=params.get("enforcePasswordExpiration"),
+ enforceStrongPasswords=params.get("enforceStrongPasswords"),
+ enforceTwoFactorAuth=params.get("enforceTwoFactorAuth"),
+ idleTimeoutMinutes=params.get("idleTimeoutMinutes"),
loginIpRanges=params.get("loginIpRanges"),
- apiAuthentication=params.get("apiAuthentication"),
+ numDifferentPasswords=params.get("numDifferentPasswords"),
+ passwordExpirationDays=params.get("passwordExpirationDays"),
organization_id=params.get("organizationId"),
)
@@ -85,38 +85,38 @@ class OrganizationsLoginSecurity(object):
def update_all_params(self):
new_object_params = {}
- if self.new_object.get('enforcePasswordExpiration') is not None or self.new_object.get('enforce_password_expiration') is not None:
- new_object_params['enforcePasswordExpiration'] = self.new_object.get('enforcePasswordExpiration')
- if self.new_object.get('passwordExpirationDays') is not None or self.new_object.get('password_expiration_days') is not None:
- new_object_params['passwordExpirationDays'] = self.new_object.get('passwordExpirationDays') or \
- self.new_object.get('password_expiration_days')
- if self.new_object.get('enforceDifferentPasswords') is not None or self.new_object.get('enforce_different_passwords') is not None:
- new_object_params['enforceDifferentPasswords'] = self.new_object.get('enforceDifferentPasswords')
- if self.new_object.get('numDifferentPasswords') is not None or self.new_object.get('num_different_passwords') is not None:
- new_object_params['numDifferentPasswords'] = self.new_object.get('numDifferentPasswords') or \
- self.new_object.get('num_different_passwords')
- if self.new_object.get('enforceStrongPasswords') is not None or self.new_object.get('enforce_strong_passwords') is not None:
- new_object_params['enforceStrongPasswords'] = self.new_object.get('enforceStrongPasswords')
- if self.new_object.get('enforceAccountLockout') is not None or self.new_object.get('enforce_account_lockout') is not None:
- new_object_params['enforceAccountLockout'] = self.new_object.get('enforceAccountLockout')
if self.new_object.get('accountLockoutAttempts') is not None or self.new_object.get('account_lockout_attempts') is not None:
new_object_params['accountLockoutAttempts'] = self.new_object.get('accountLockoutAttempts') or \
self.new_object.get('account_lockout_attempts')
+ if self.new_object.get('apiAuthentication') is not None or self.new_object.get('api_authentication') is not None:
+ new_object_params['apiAuthentication'] = self.new_object.get('apiAuthentication') or \
+ self.new_object.get('api_authentication')
+ if self.new_object.get('enforceAccountLockout') is not None or self.new_object.get('enforce_account_lockout') is not None:
+ new_object_params['enforceAccountLockout'] = self.new_object.get('enforceAccountLockout')
+ if self.new_object.get('enforceDifferentPasswords') is not None or self.new_object.get('enforce_different_passwords') is not None:
+ new_object_params['enforceDifferentPasswords'] = self.new_object.get('enforceDifferentPasswords')
if self.new_object.get('enforceIdleTimeout') is not None or self.new_object.get('enforce_idle_timeout') is not None:
new_object_params['enforceIdleTimeout'] = self.new_object.get('enforceIdleTimeout')
+ if self.new_object.get('enforceLoginIpRanges') is not None or self.new_object.get('enforce_login_ip_ranges') is not None:
+ new_object_params['enforceLoginIpRanges'] = self.new_object.get('enforceLoginIpRanges')
+ if self.new_object.get('enforcePasswordExpiration') is not None or self.new_object.get('enforce_password_expiration') is not None:
+ new_object_params['enforcePasswordExpiration'] = self.new_object.get('enforcePasswordExpiration')
+ if self.new_object.get('enforceStrongPasswords') is not None or self.new_object.get('enforce_strong_passwords') is not None:
+ new_object_params['enforceStrongPasswords'] = self.new_object.get('enforceStrongPasswords')
+ if self.new_object.get('enforceTwoFactorAuth') is not None or self.new_object.get('enforce_two_factor_auth') is not None:
+ new_object_params['enforceTwoFactorAuth'] = self.new_object.get('enforceTwoFactorAuth')
if self.new_object.get('idleTimeoutMinutes') is not None or self.new_object.get('idle_timeout_minutes') is not None:
new_object_params['idleTimeoutMinutes'] = self.new_object.get('idleTimeoutMinutes') or \
self.new_object.get('idle_timeout_minutes')
- if self.new_object.get('enforceTwoFactorAuth') is not None or self.new_object.get('enforce_two_factor_auth') is not None:
- new_object_params['enforceTwoFactorAuth'] = self.new_object.get('enforceTwoFactorAuth')
- if self.new_object.get('enforceLoginIpRanges') is not None or self.new_object.get('enforce_login_ip_ranges') is not None:
- new_object_params['enforceLoginIpRanges'] = self.new_object.get('enforceLoginIpRanges')
if self.new_object.get('loginIpRanges') is not None or self.new_object.get('login_ip_ranges') is not None:
new_object_params['loginIpRanges'] = self.new_object.get('loginIpRanges') or \
self.new_object.get('login_ip_ranges')
- if self.new_object.get('apiAuthentication') is not None or self.new_object.get('api_authentication') is not None:
- new_object_params['apiAuthentication'] = self.new_object.get('apiAuthentication') or \
- self.new_object.get('api_authentication')
+ if self.new_object.get('numDifferentPasswords') is not None or self.new_object.get('num_different_passwords') is not None:
+ new_object_params['numDifferentPasswords'] = self.new_object.get('numDifferentPasswords') or \
+ self.new_object.get('num_different_passwords')
+ if self.new_object.get('passwordExpirationDays') is not None or self.new_object.get('password_expiration_days') is not None:
+ new_object_params['passwordExpirationDays'] = self.new_object.get('passwordExpirationDays') or \
+ self.new_object.get('password_expiration_days')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -152,7 +152,7 @@ class OrganizationsLoginSecurity(object):
id_exists = False
name_exists = False
o_id = self.new_object.get("id")
- name = self.new_object.get("organization_id")
+ name = self.new_object.get("name")
if o_id:
prev_obj = self.get_object_by_name(o_id)
id_exists = prev_obj is not None and isinstance(prev_obj, dict)
@@ -173,18 +173,18 @@ class OrganizationsLoginSecurity(object):
requested_obj = self.new_object
obj_params = [
- ("enforcePasswordExpiration", "enforcePasswordExpiration"),
- ("enforceDifferentPasswords", "enforceDifferentPasswords"),
- ("numDifferentPasswords", "numDifferentPasswords"),
- ("enforceStrongPasswords", "enforceStrongPasswords"),
- ("enforceAccountLockout", "enforceAccountLockout"),
("accountLockoutAttempts", "accountLockoutAttempts"),
+ ("apiAuthentication", "apiAuthentication"),
+ ("enforceAccountLockout", "enforceAccountLockout"),
+ ("enforceDifferentPasswords", "enforceDifferentPasswords"),
("enforceIdleTimeout", "enforceIdleTimeout"),
- ("idleTimeoutMinutes", "idleTimeoutMinutes"),
- ("enforceTwoFactorAuth", "enforceTwoFactorAuth"),
("enforceLoginIpRanges", "enforceLoginIpRanges"),
+ ("enforcePasswordExpiration", "enforcePasswordExpiration"),
+ ("enforceStrongPasswords", "enforceStrongPasswords"),
+ ("enforceTwoFactorAuth", "enforceTwoFactorAuth"),
+ ("idleTimeoutMinutes", "idleTimeoutMinutes"),
("loginIpRanges", "loginIpRanges"),
- ("apiAuthentication", "apiAuthentication"),
+ ("numDifferentPasswords", "numDifferentPasswords"),
("organizationId", "organizationId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_networks_combine.py b/ansible_collections/cisco/meraki/plugins/action/organizations_networks_combine.py
index c6d337d78..395cd6597 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_networks_combine.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_networks_combine.py
@@ -25,9 +25,9 @@ from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
+ enrollmentString=dict(type="str"),
name=dict(type="str"),
networkIds=dict(type="list"),
- enrollmentString=dict(type="str"),
organizationId=dict(type="str"),
))
@@ -67,9 +67,9 @@ class ActionModule(ActionBase):
def get_object(self, params):
new_object = dict(
+ enrollmentString=params.get("enrollmentString"),
name=params.get("name"),
networkIds=params.get("networkIds"),
- enrollmentString=params.get("enrollmentString"),
organizationId=params.get("organizationId"),
)
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_openapi_spec_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_openapi_spec_info.py
index 6ad1215dc..2d6bb35ed 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_openapi_spec_info.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_openapi_spec_info.py
@@ -26,6 +26,7 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
organizationId=dict(type="str"),
+ version=dict(type="int"),
))
required_if = []
@@ -67,6 +68,9 @@ class ActionModule(ActionBase):
if params.get("organizationId") is not None:
new_object["organizationId"] = params.get(
"organizationId")
+ if params.get("version") is not None:
+ new_object["version"] = params.get(
+ "version")
return new_object
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects.py b/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects.py
index 6e49366b2..e412ec4d4 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects.py
@@ -32,14 +32,14 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
category=dict(type="str"),
- type=dict(type="str"),
cidr=dict(type="str"),
fqdn=dict(type="str"),
- mask=dict(type="str"),
- ip=dict(type="str"),
groupIds=dict(type="list"),
+ ip=dict(type="str"),
+ mask=dict(type="str"),
+ name=dict(type="str"),
+ type=dict(type="str"),
organizationId=dict(type="str"),
policyObjectId=dict(type="str"),
))
@@ -57,14 +57,14 @@ class OrganizationsPolicyObjects(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
category=params.get("category"),
- type=params.get("type"),
cidr=params.get("cidr"),
fqdn=params.get("fqdn"),
- mask=params.get("mask"),
- ip=params.get("ip"),
groupIds=params.get("groupIds"),
+ ip=params.get("ip"),
+ mask=params.get("mask"),
+ name=params.get("name"),
+ type=params.get("type"),
organizationId=params.get("organizationId"),
policyObjectId=params.get("policyObjectId"),
)
@@ -98,30 +98,30 @@ class OrganizationsPolicyObjects(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('category') is not None or self.new_object.get('category') is not None:
new_object_params['category'] = self.new_object.get('category') or \
self.new_object.get('category')
- if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
- new_object_params['type'] = self.new_object.get('type') or \
- self.new_object.get('type')
if self.new_object.get('cidr') is not None or self.new_object.get('cidr') is not None:
new_object_params['cidr'] = self.new_object.get('cidr') or \
self.new_object.get('cidr')
if self.new_object.get('fqdn') is not None or self.new_object.get('fqdn') is not None:
new_object_params['fqdn'] = self.new_object.get('fqdn') or \
self.new_object.get('fqdn')
- if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
- new_object_params['mask'] = self.new_object.get('mask') or \
- self.new_object.get('mask')
- if self.new_object.get('ip') is not None or self.new_object.get('ip') is not None:
- new_object_params['ip'] = self.new_object.get('ip') or \
- self.new_object.get('ip')
if self.new_object.get('groupIds') is not None or self.new_object.get('group_ids') is not None:
new_object_params['groupIds'] = self.new_object.get('groupIds') or \
self.new_object.get('group_ids')
+ if self.new_object.get('ip') is not None or self.new_object.get('ip') is not None:
+ new_object_params['ip'] = self.new_object.get('ip') or \
+ self.new_object.get('ip')
+ if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
+ new_object_params['mask'] = self.new_object.get('mask') or \
+ self.new_object.get('mask')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('type') is not None or self.new_object.get('type') is not None:
+ new_object_params['type'] = self.new_object.get('type') or \
+ self.new_object.get('type')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -139,24 +139,24 @@ class OrganizationsPolicyObjects(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('cidr') is not None or self.new_object.get('cidr') is not None:
new_object_params['cidr'] = self.new_object.get('cidr') or \
self.new_object.get('cidr')
if self.new_object.get('fqdn') is not None or self.new_object.get('fqdn') is not None:
new_object_params['fqdn'] = self.new_object.get('fqdn') or \
self.new_object.get('fqdn')
- if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
- new_object_params['mask'] = self.new_object.get('mask') or \
- self.new_object.get('mask')
- if self.new_object.get('ip') is not None or self.new_object.get('ip') is not None:
- new_object_params['ip'] = self.new_object.get('ip') or \
- self.new_object.get('ip')
if self.new_object.get('groupIds') is not None or self.new_object.get('group_ids') is not None:
new_object_params['groupIds'] = self.new_object.get('groupIds') or \
self.new_object.get('group_ids')
+ if self.new_object.get('ip') is not None or self.new_object.get('ip') is not None:
+ new_object_params['ip'] = self.new_object.get('ip') or \
+ self.new_object.get('ip')
+ if self.new_object.get('mask') is not None or self.new_object.get('mask') is not None:
+ new_object_params['mask'] = self.new_object.get('mask') or \
+ self.new_object.get('mask')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -234,14 +234,14 @@ class OrganizationsPolicyObjects(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
("category", "category"),
- ("type", "type"),
("cidr", "cidr"),
("fqdn", "fqdn"),
- ("mask", "mask"),
- ("ip", "ip"),
("groupIds", "groupIds"),
+ ("ip", "ip"),
+ ("mask", "mask"),
+ ("name", "name"),
+ ("type", "type"),
("organizationId", "organizationId"),
("policyObjectId", "policyObjectId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects_groups.py b/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects_groups.py
index ff6b3f852..7de772a5e 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects_groups.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_policy_objects_groups.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- name=dict(type="str"),
category=dict(type="str"),
+ name=dict(type="str"),
objectIds=dict(type="list"),
organizationId=dict(type="str"),
policyObjectGroupId=dict(type="str"),
@@ -52,8 +52,8 @@ class OrganizationsPolicyObjectsGroups(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- name=params.get("name"),
category=params.get("category"),
+ name=params.get("name"),
objectIds=params.get("objectIds"),
organizationId=params.get("organizationId"),
policyObjectGroupId=params.get("policyObjectGroupId"),
@@ -88,12 +88,12 @@ class OrganizationsPolicyObjectsGroups(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
- new_object_params['name'] = self.new_object.get('name') or \
- self.new_object.get('name')
if self.new_object.get('category') is not None or self.new_object.get('category') is not None:
new_object_params['category'] = self.new_object.get('category') or \
self.new_object.get('category')
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
if self.new_object.get('objectIds') is not None or self.new_object.get('object_ids') is not None:
new_object_params['objectIds'] = self.new_object.get('objectIds') or \
self.new_object.get('object_ids')
@@ -197,8 +197,8 @@ class OrganizationsPolicyObjectsGroups(object):
requested_obj = self.new_object
obj_params = [
- ("name", "name"),
("category", "category"),
+ ("name", "name"),
("objectIds", "objectIds"),
("organizationId", "organizationId"),
("policyObjectGroupId", "policyObjectGroupId"),
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_saml_idps.py b/ansible_collections/cisco/meraki/plugins/action/organizations_saml_idps.py
index e557665b9..196750ebf 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_saml_idps.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_saml_idps.py
@@ -32,8 +32,8 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- x509certSha1Fingerprint=dict(type="str"),
sloLogoutUrl=dict(type="str"),
+ x509certSha1Fingerprint=dict(type="str"),
organizationId=dict(type="str"),
idpId=dict(type="str"),
))
@@ -51,8 +51,8 @@ class OrganizationsSamlIdps(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- x509certSha1Fingerprint=params.get("x509certSha1Fingerprint"),
sloLogoutUrl=params.get("sloLogoutUrl"),
+ x509certSha1Fingerprint=params.get("x509certSha1Fingerprint"),
organizationId=params.get("organizationId"),
idpId=params.get("idpId"),
)
@@ -76,12 +76,12 @@ class OrganizationsSamlIdps(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('x509certSha1Fingerprint') is not None or self.new_object.get('x509cert_sha1_fingerprint') is not None:
- new_object_params['x509certSha1Fingerprint'] = self.new_object.get('x509certSha1Fingerprint') or \
- self.new_object.get('x509cert_sha1_fingerprint')
if self.new_object.get('sloLogoutUrl') is not None or self.new_object.get('slo_logout_url') is not None:
new_object_params['sloLogoutUrl'] = self.new_object.get('sloLogoutUrl') or \
self.new_object.get('slo_logout_url')
+ if self.new_object.get('x509certSha1Fingerprint') is not None or self.new_object.get('x509cert_sha1_fingerprint') is not None:
+ new_object_params['x509certSha1Fingerprint'] = self.new_object.get('x509certSha1Fingerprint') or \
+ self.new_object.get('x509cert_sha1_fingerprint')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -99,12 +99,12 @@ class OrganizationsSamlIdps(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('x509certSha1Fingerprint') is not None or self.new_object.get('x509cert_sha1_fingerprint') is not None:
- new_object_params['x509certSha1Fingerprint'] = self.new_object.get('x509certSha1Fingerprint') or \
- self.new_object.get('x509cert_sha1_fingerprint')
if self.new_object.get('sloLogoutUrl') is not None or self.new_object.get('slo_logout_url') is not None:
new_object_params['sloLogoutUrl'] = self.new_object.get('sloLogoutUrl') or \
self.new_object.get('slo_logout_url')
+ if self.new_object.get('x509certSha1Fingerprint') is not None or self.new_object.get('x509cert_sha1_fingerprint') is not None:
+ new_object_params['x509certSha1Fingerprint'] = self.new_object.get('x509certSha1Fingerprint') or \
+ self.new_object.get('x509cert_sha1_fingerprint')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -182,8 +182,8 @@ class OrganizationsSamlIdps(object):
requested_obj = self.new_object
obj_params = [
- ("x509certSha1Fingerprint", "x509certSha1Fingerprint"),
("sloLogoutUrl", "sloLogoutUrl"),
+ ("x509certSha1Fingerprint", "x509certSha1Fingerprint"),
("organizationId", "organizationId"),
("idpId", "idpId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles.py b/ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles.py
index 48dc6dfdb..bfc4a978b 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_saml_roles.py
@@ -32,10 +32,10 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present", "absent"]),
- role=dict(type="str"),
+ networks=dict(type="list"),
orgAccess=dict(type="str"),
+ role=dict(type="str"),
tags=dict(type="list"),
- networks=dict(type="list"),
organizationId=dict(type="str"),
samlRoleId=dict(type="str"),
))
@@ -53,10 +53,10 @@ class OrganizationsSamlRoles(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
- role=params.get("role"),
+ networks=params.get("networks"),
orgAccess=params.get("orgAccess"),
+ role=params.get("role"),
tags=params.get("tags"),
- networks=params.get("networks"),
organizationId=params.get("organizationId"),
samlRoleId=params.get("samlRoleId"),
)
@@ -80,18 +80,18 @@ class OrganizationsSamlRoles(object):
def create_params(self):
new_object_params = {}
- if self.new_object.get('role') is not None or self.new_object.get('role') is not None:
- new_object_params['role'] = self.new_object.get('role') or \
- self.new_object.get('role')
+ if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
+ new_object_params['networks'] = self.new_object.get('networks') or \
+ self.new_object.get('networks')
if self.new_object.get('orgAccess') is not None or self.new_object.get('org_access') is not None:
new_object_params['orgAccess'] = self.new_object.get('orgAccess') or \
self.new_object.get('org_access')
+ if self.new_object.get('role') is not None or self.new_object.get('role') is not None:
+ new_object_params['role'] = self.new_object.get('role') or \
+ self.new_object.get('role')
if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
new_object_params['tags'] = self.new_object.get('tags') or \
self.new_object.get('tags')
- if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
- new_object_params['networks'] = self.new_object.get('networks') or \
- self.new_object.get('networks')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -109,18 +109,18 @@ class OrganizationsSamlRoles(object):
def update_by_id_params(self):
new_object_params = {}
- if self.new_object.get('role') is not None or self.new_object.get('role') is not None:
- new_object_params['role'] = self.new_object.get('role') or \
- self.new_object.get('role')
+ if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
+ new_object_params['networks'] = self.new_object.get('networks') or \
+ self.new_object.get('networks')
if self.new_object.get('orgAccess') is not None or self.new_object.get('org_access') is not None:
new_object_params['orgAccess'] = self.new_object.get('orgAccess') or \
self.new_object.get('org_access')
+ if self.new_object.get('role') is not None or self.new_object.get('role') is not None:
+ new_object_params['role'] = self.new_object.get('role') or \
+ self.new_object.get('role')
if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
new_object_params['tags'] = self.new_object.get('tags') or \
self.new_object.get('tags')
- if self.new_object.get('networks') is not None or self.new_object.get('networks') is not None:
- new_object_params['networks'] = self.new_object.get('networks') or \
- self.new_object.get('networks')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -198,10 +198,10 @@ class OrganizationsSamlRoles(object):
requested_obj = self.new_object
obj_params = [
- ("role", "role"),
+ ("networks", "networks"),
("orgAccess", "orgAccess"),
+ ("role", "role"),
("tags", "tags"),
- ("networks", "networks"),
("organizationId", "organizationId"),
("samlRoleId", "samlRoleId"),
]
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles.py b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles.py
new file mode 100644
index 000000000..4bbf8db98
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles.py
@@ -0,0 +1,256 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or
+# https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+ meraki_compare_equality,
+ get_dict_result,
+)
+from ansible_collections.cisco.meraki.plugins.plugin_utils.exceptions import (
+ InconsistentParameters,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ state=dict(type="str", default="present", choices=["present", "absent"]),
+ name=dict(type="str"),
+ scope=dict(type="str"),
+ tags=dict(type="list"),
+ organizationId=dict(type="str"),
+))
+
+required_if = [
+ ("state", "present", ["name", "organizationId"], True),
+ ("state", "absent", ["name", "organizationId"], True),
+]
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class OrganizationsSmAdminsRoles(object):
+ def __init__(self, params, meraki):
+ self.meraki = meraki
+ self.new_object = dict(
+ name=params.get("name"),
+ scope=params.get("scope"),
+ tags=params.get("tags"),
+ organizationId=params.get("organizationId"),
+ )
+
+ def get_all_params(self, name=None, id=None):
+ new_object_params = {}
+ if self.new_object.get('perPage') is not None or self.new_object.get('per_page') is not None:
+ new_object_params['perPage'] = self.new_object.get('perPage') or \
+ self.new_object.get('per_page')
+ new_object_params['total_pages'] = -1
+ if self.new_object.get('startingAfter') is not None or self.new_object.get('starting_after') is not None:
+ new_object_params['startingAfter'] = self.new_object.get('startingAfter') or \
+ self.new_object.get('starting_after')
+ if self.new_object.get('endingBefore') is not None or self.new_object.get('ending_before') is not None:
+ new_object_params['endingBefore'] = self.new_object.get('endingBefore') or \
+ self.new_object.get('ending_before')
+ if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
+ new_object_params['organizationId'] = self.new_object.get('organizationId') or \
+ self.new_object.get('organization_id')
+ return new_object_params
+
+ def create_params(self):
+ new_object_params = {}
+ if self.new_object.get('name') is not None or self.new_object.get('name') is not None:
+ new_object_params['name'] = self.new_object.get('name') or \
+ self.new_object.get('name')
+ if self.new_object.get('scope') is not None or self.new_object.get('scope') is not None:
+ new_object_params['scope'] = self.new_object.get('scope') or \
+ self.new_object.get('scope')
+ if self.new_object.get('tags') is not None or self.new_object.get('tags') is not None:
+ new_object_params['tags'] = self.new_object.get('tags') or \
+ self.new_object.get('tags')
+ if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
+ new_object_params['organizationId'] = self.new_object.get('organizationId') or \
+ self.new_object.get('organization_id')
+ return new_object_params
+
+ def get_object_by_name(self, name):
+ result = None
+ # NOTE: Does not have a get by name method or it is in another action
+ try:
+ items = self.meraki.exec_meraki(
+ family="sm",
+ function="getOrganizationSmAdminsRoles",
+ params=self.get_all_params(name=name),
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = get_dict_result(items, 'name', name)
+ if result is None:
+ result = items
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def get_object_by_id(self, id):
+ result = None
+ # NOTE: Does not have a get by id method or it is in another action
+ try:
+ items = self.meraki.exec_meraki(
+ family="sm",
+ function="getOrganizationSmAdminsRoles",
+ params=self.get_all_params(id=id),
+ )
+ if isinstance(items, dict):
+ if 'response' in items:
+ items = items.get('response')
+ result = get_dict_result(items, 'id', id)
+ except Exception as e:
+ print("Error: ", e)
+ result = None
+ return result
+
+ def exists(self):
+ id_exists = False
+ name_exists = False
+ prev_obj = None
+ o_id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ if o_id:
+ prev_obj = self.get_object_by_id(o_id)
+ id_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if not id_exists and name:
+ prev_obj = self.get_object_by_name(name)
+ name_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ if name_exists:
+ _id = prev_obj.get("id")
+ if id_exists and name_exists and o_id != _id:
+ raise InconsistentParameters(
+ "The 'id' and 'name' params don't refer to the same object")
+ if _id:
+ self.new_object.update(dict(id=_id))
+ it_exists = prev_obj is not None and isinstance(prev_obj, dict)
+ return (it_exists, prev_obj)
+
+ def requires_update(self, current_obj):
+ requested_obj = self.new_object
+
+ obj_params = [
+ ("name", "name"),
+ ("scope", "scope"),
+ ("tags", "tags"),
+ ("organizationId", "organizationId"),
+ ]
+ # Method 1. Params present in request (Ansible) obj are the same as the current (DNAC) params
+ # If any does not have eq params, it requires update
+ return any(not meraki_compare_equality(current_obj.get(meraki_param),
+ requested_obj.get(ansible_param))
+ for (meraki_param, ansible_param) in obj_params)
+
+ def create(self):
+ result = self.meraki.exec_meraki(
+ family="sm",
+ function="createOrganizationSmAdminsRole",
+ params=self.create_params(),
+ op_modifies=True,
+ )
+ return result
+
+ def update(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ result = None
+ # NOTE: Does not have update method. What do we do?
+ return result
+
+ def delete(self):
+ id = self.new_object.get("id")
+ name = self.new_object.get("name")
+ result = None
+ # NOTE: Does not have delete method. What do we do?
+ return result
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(self._task.args)
+ obj = OrganizationsSmAdminsRoles(self._task.args, meraki)
+
+ state = self._task.args.get("state")
+
+ response = None
+
+ if state == "present":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ if obj.requires_update(prev_obj):
+ response = obj.update()
+ meraki.object_updated()
+ else:
+ response = prev_obj
+ meraki.object_already_present()
+ else:
+ response = obj.create()
+ meraki.object_created()
+
+ elif state == "absent":
+ (obj_exists, prev_obj) = obj.exists()
+ if obj_exists:
+ response = obj.delete()
+ meraki.object_deleted()
+ else:
+ meraki.object_already_absent()
+
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles_info.py
new file mode 100644
index 000000000..297c64b48
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_admins_roles_info.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="sm",
+ function='getOrganizationSmAdminsRoles',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments.py b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments.py
new file mode 100644
index 000000000..8e51a06e0
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguements specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ items=dict(type="list"),
+ organizationId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = False
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = dict(
+ items=params.get("items"),
+ organizationId=params.get("organizationId"),
+ )
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="sm",
+ function='updateOrganizationSmSentryPoliciesAssignments',
+ op_modifies=True,
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments_by_network_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments_by_network_info.py
new file mode 100644
index 000000000..fdc3bd05d
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_sm_sentry_policies_assignments_by_network_info.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ networkIds=dict(type="list"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="sm",
+ function='getOrganizationSmSentryPoliciesAssignmentsByNetwork',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_snmp.py b/ansible_collections/cisco/meraki/plugins/action/organizations_snmp.py
index aaf676ee7..4641a02e5 100644
--- a/ansible_collections/cisco/meraki/plugins/action/organizations_snmp.py
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_snmp.py
@@ -32,13 +32,13 @@ argument_spec = meraki_argument_spec()
# Add arguments specific for this module
argument_spec.update(dict(
state=dict(type="str", default="present", choices=["present"]),
+ peerIps=dict(type="list"),
v2cEnabled=dict(type="bool"),
- v3Enabled=dict(type="bool"),
v3AuthMode=dict(type="str"),
v3AuthPass=dict(type="str"),
+ v3Enabled=dict(type="bool"),
v3PrivMode=dict(type="str"),
v3PrivPass=dict(type="str"),
- peerIps=dict(type="list"),
organizationId=dict(type="str"),
))
@@ -54,13 +54,13 @@ class OrganizationsSnmp(object):
def __init__(self, params, meraki):
self.meraki = meraki
self.new_object = dict(
+ peerIps=params.get("peerIps"),
v2cEnabled=params.get("v2cEnabled"),
- v3Enabled=params.get("v3Enabled"),
v3AuthMode=params.get("v3AuthMode"),
v3AuthPass=params.get("v3AuthPass"),
+ v3Enabled=params.get("v3Enabled"),
v3PrivMode=params.get("v3PrivMode"),
v3PrivPass=params.get("v3PrivPass"),
- peerIps=params.get("peerIps"),
organization_id=params.get("organizationId"),
)
@@ -73,25 +73,25 @@ class OrganizationsSnmp(object):
def update_all_params(self):
new_object_params = {}
+ if self.new_object.get('peerIps') is not None or self.new_object.get('peer_ips') is not None:
+ new_object_params['peerIps'] = self.new_object.get('peerIps') or \
+ self.new_object.get('peer_ips')
if self.new_object.get('v2cEnabled') is not None or self.new_object.get('v2c_enabled') is not None:
new_object_params['v2cEnabled'] = self.new_object.get('v2cEnabled')
- if self.new_object.get('v3Enabled') is not None or self.new_object.get('v3_enabled') is not None:
- new_object_params['v3Enabled'] = self.new_object.get('v3Enabled')
if self.new_object.get('v3AuthMode') is not None or self.new_object.get('v3_auth_mode') is not None:
new_object_params['v3AuthMode'] = self.new_object.get('v3AuthMode') or \
self.new_object.get('v3_auth_mode')
if self.new_object.get('v3AuthPass') is not None or self.new_object.get('v3_auth_pass') is not None:
new_object_params['v3AuthPass'] = self.new_object.get('v3AuthPass') or \
self.new_object.get('v3_auth_pass')
+ if self.new_object.get('v3Enabled') is not None or self.new_object.get('v3_enabled') is not None:
+ new_object_params['v3Enabled'] = self.new_object.get('v3Enabled')
if self.new_object.get('v3PrivMode') is not None or self.new_object.get('v3_priv_mode') is not None:
new_object_params['v3PrivMode'] = self.new_object.get('v3PrivMode') or \
self.new_object.get('v3_priv_mode')
if self.new_object.get('v3PrivPass') is not None or self.new_object.get('v3_priv_pass') is not None:
new_object_params['v3PrivPass'] = self.new_object.get('v3PrivPass') or \
self.new_object.get('v3_priv_pass')
- if self.new_object.get('peerIps') is not None or self.new_object.get('peer_ips') is not None:
- new_object_params['peerIps'] = self.new_object.get('peerIps') or \
- self.new_object.get('peer_ips')
if self.new_object.get('organizationId') is not None or self.new_object.get('organization_id') is not None:
new_object_params['organizationId'] = self.new_object.get('organizationId') or \
self.new_object.get('organization_id')
@@ -148,13 +148,13 @@ class OrganizationsSnmp(object):
requested_obj = self.new_object
obj_params = [
+ ("peerIps", "peerIps"),
("v2cEnabled", "v2cEnabled"),
- ("v3Enabled", "v3Enabled"),
("v3AuthMode", "v3AuthMode"),
("v3AuthPass", "v3AuthPass"),
+ ("v3Enabled", "v3Enabled"),
("v3PrivMode", "v3PrivMode"),
("v3PrivPass", "v3PrivPass"),
- ("peerIps", "peerIps"),
("organizationId", "organizationId"),
]
# Method 1. Params present in request (Ansible) obj are the same as the current (ISE) params
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_networks_by_status_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_networks_by_status_info.py
new file mode 100644
index 000000000..c7091e152
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_summary_top_networks_by_status_info.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="organizations",
+ function='getOrganizationSummaryTopNetworksByStatus',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_callbacks_statuses_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_callbacks_statuses_info.py
new file mode 100644
index 000000000..868d02371
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_webhooks_callbacks_statuses_info.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ callbackId=dict(type="str"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_object(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("callbackId") is not None:
+ new_object["callbackId"] = params.get(
+ "callbackId")
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ id = self._task.args.get("callbackId")
+ if id:
+ response = meraki.exec_meraki(
+ family="organizations",
+ function='getOrganizationWebhooksCallbacksStatus',
+ params=self.get_object(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
+ if not id:
+ # NOTE: Does not have a get all method or it is in another action
+ response = None
+ meraki.object_modify_result(changed=False, result="Module does not have get all, check arguments of module")
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_device_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_device_info.py
new file mode 100644
index 000000000..5d78f5a98
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_device_info.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ networkIds=dict(type="list"),
+ serials=dict(type="list"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+ interval=dict(type="int"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+ if params.get("interval") is not None:
+ new_object["interval"] = params.get(
+ "interval")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getOrganizationWirelessDevicesChannelUtilizationByDevice',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_network_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_network_info.py
new file mode 100644
index 000000000..fb57fd52f
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_by_network_info.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ networkIds=dict(type="list"),
+ serials=dict(type="list"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+ interval=dict(type="int"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+ if params.get("interval") is not None:
+ new_object["interval"] = params.get(
+ "interval")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getOrganizationWirelessDevicesChannelUtilizationByNetwork',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
new file mode 100644
index 000000000..9bd73d0b2
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ networkIds=dict(type="list"),
+ serials=dict(type="list"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+ interval=dict(type="int"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+ if params.get("interval") is not None:
+ new_object["interval"] = params.get(
+ "interval")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getOrganizationWirelessDevicesChannelUtilizationHistoryByDeviceByInterval',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
new file mode 100644
index 000000000..872cc59be
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ networkIds=dict(type="list"),
+ serials=dict(type="list"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+ interval=dict(type="int"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+ if params.get("interval") is not None:
+ new_object["interval"] = params.get(
+ "interval")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getOrganizationWirelessDevicesChannelUtilizationHistoryByNetworkByInterval',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_client_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_client_info.py
new file mode 100644
index 000000000..772ffac1a
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_client_info.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ networkIds=dict(type="list"),
+ ssids=dict(type="list"),
+ bands=dict(type="list"),
+ macs=dict(type="list"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("ssids") is not None:
+ new_object["ssids"] = params.get(
+ "ssids")
+ if params.get("bands") is not None:
+ new_object["bands"] = params.get(
+ "bands")
+ if params.get("macs") is not None:
+ new_object["macs"] = params.get(
+ "macs")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getOrganizationWirelessDevicesPacketLossByClient',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_device_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_device_info.py
new file mode 100644
index 000000000..beef87f14
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_device_info.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ networkIds=dict(type="list"),
+ serials=dict(type="list"),
+ ssids=dict(type="list"),
+ bands=dict(type="list"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("ssids") is not None:
+ new_object["ssids"] = params.get(
+ "ssids")
+ if params.get("bands") is not None:
+ new_object["bands"] = params.get(
+ "bands")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getOrganizationWirelessDevicesPacketLossByDevice',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_network_info.py b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_network_info.py
new file mode 100644
index 000000000..b871a3539
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/action/organizations_wireless_devices_packet_loss_by_network_info.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+from ansible.plugins.action import ActionBase
+try:
+ from ansible_collections.ansible.utils.plugins.module_utils.common.argspec_validate import (
+ AnsibleArgSpecValidator,
+ )
+except ImportError:
+ ANSIBLE_UTILS_IS_INSTALLED = False
+else:
+ ANSIBLE_UTILS_IS_INSTALLED = True
+from ansible.errors import AnsibleActionFail
+from ansible_collections.cisco.meraki.plugins.plugin_utils.meraki import (
+ MERAKI,
+ meraki_argument_spec,
+)
+
+# Get common arguments specification
+argument_spec = meraki_argument_spec()
+# Add arguments specific for this module
+argument_spec.update(dict(
+ organizationId=dict(type="str"),
+ networkIds=dict(type="list"),
+ serials=dict(type="list"),
+ ssids=dict(type="list"),
+ bands=dict(type="list"),
+ perPage=dict(type="int"),
+ total_pages=dict(type="int"),
+ direction=dict(type="str"),
+ startingAfter=dict(type="str"),
+ endingBefore=dict(type="str"),
+ t0=dict(type="str"),
+ t1=dict(type="str"),
+ timespan=dict(type="float"),
+))
+
+required_if = []
+required_one_of = []
+mutually_exclusive = []
+required_together = []
+
+
+class ActionModule(ActionBase):
+ def __init__(self, *args, **kwargs):
+ if not ANSIBLE_UTILS_IS_INSTALLED:
+ raise AnsibleActionFail(
+ "ansible.utils is not installed. Execute 'ansible-galaxy collection install ansible.utils'")
+ super(ActionModule, self).__init__(*args, **kwargs)
+ self._supports_async = False
+ self._supports_check_mode = True
+ self._result = None
+
+ # Checks the supplied parameters against the argument spec for this module
+ def _check_argspec(self):
+ aav = AnsibleArgSpecValidator(
+ data=self._task.args,
+ schema=dict(argument_spec=argument_spec),
+ schema_format="argspec",
+ schema_conditionals=dict(
+ required_if=required_if,
+ required_one_of=required_one_of,
+ mutually_exclusive=mutually_exclusive,
+ required_together=required_together,
+ ),
+ name=self._task.action,
+ )
+ valid, errors, self._task.args = aav.validate()
+ if not valid:
+ raise AnsibleActionFail(errors)
+
+ def get_all(self, params):
+ new_object = {}
+ if params.get("organizationId") is not None:
+ new_object["organizationId"] = params.get(
+ "organizationId")
+ if params.get("networkIds") is not None:
+ new_object["networkIds"] = params.get(
+ "networkIds")
+ if params.get("serials") is not None:
+ new_object["serials"] = params.get(
+ "serials")
+ if params.get("ssids") is not None:
+ new_object["ssids"] = params.get(
+ "ssids")
+ if params.get("bands") is not None:
+ new_object["bands"] = params.get(
+ "bands")
+ if params.get("perPage") is not None:
+ new_object["perPage"] = params.get(
+ "perPage")
+ new_object['total_pages'] = params.get(
+ "total_pages") or 1
+ new_object['direction'] = params.get(
+ "direction") or "next"
+ if params.get("startingAfter") is not None:
+ new_object["startingAfter"] = params.get(
+ "startingAfter")
+ if params.get("endingBefore") is not None:
+ new_object["endingBefore"] = params.get(
+ "endingBefore")
+ if params.get("t0") is not None:
+ new_object["t0"] = params.get(
+ "t0")
+ if params.get("t1") is not None:
+ new_object["t1"] = params.get(
+ "t1")
+ if params.get("timespan") is not None:
+ new_object["timespan"] = params.get(
+ "timespan")
+
+ return new_object
+
+ def run(self, tmp=None, task_vars=None):
+ self._task.diff = False
+ self._result = super(ActionModule, self).run(tmp, task_vars)
+ self._result["changed"] = False
+ self._check_argspec()
+
+ self._result.update(dict(meraki_response={}))
+
+ meraki = MERAKI(params=self._task.args)
+
+ response = meraki.exec_meraki(
+ family="wireless",
+ function='getOrganizationWirelessDevicesPacketLossByNetwork',
+ params=self.get_all(self._task.args),
+ )
+ self._result.update(dict(meraki_response=response))
+ self._result.update(meraki.exit_json())
+ return self._result
diff --git a/ansible_collections/cisco/meraki/plugins/modules/administered_identities_me_info.py b/ansible_collections/cisco/meraki/plugins/modules/administered_identities_me_info.py
index 05a8f14d8..7f833e0d8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/administered_identities_me_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/administered_identities_me_info.py
@@ -67,22 +67,22 @@ meraki_response:
type: dict
sample: >
{
- "name": "string",
- "email": "string",
- "lastUsedDashboardAt": "string",
"authentication": {
- "mode": "string",
"api": {
"key": {
"created": true
}
},
- "twoFactor": {
+ "mode": "string",
+ "saml": {
"enabled": true
},
- "saml": {
+ "twoFactor": {
"enabled": true
}
- }
+ },
+ "email": "string",
+ "lastUsedDashboardAt": "string",
+ "name": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_entitlements_info.py b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_entitlements_info.py
new file mode 100644
index 000000000..64b91eae9
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_entitlements_info.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: administered_licensing_subscription_entitlements_info
+short_description: Information module for administered _licensing _subscription _entitlements
+description:
+- Get all administered _licensing _subscription _entitlements.
+- Retrieve the list of purchasable entitlements.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ skus:
+ description:
+ - Skus query parameter. Filter to entitlements with the specified SKUs.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for licensing getAdministeredLicensingSubscriptionEntitlements
+ description: Complete reference of the getAdministeredLicensingSubscriptionEntitlements API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-administered-licensing-subscription-entitlements
+notes:
+ - SDK Method used are
+ licensing.Licensing.get_administered_licensing_subscription_entitlements,
+
+ - Paths used are
+ get /administered/licensing/subscription/entitlements,
+"""
+
+EXAMPLES = r"""
+- name: Get all administered _licensing _subscription _entitlements
+ cisco.meraki.administered_licensing_subscription_entitlements_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ skus: []
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "featureTier": "string",
+ "isAddOn": true,
+ "name": "string",
+ "productClass": "string",
+ "productType": "string",
+ "sku": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_bind.py b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_bind.py
new file mode 100644
index 000000000..7ab09dfcf
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_bind.py
@@ -0,0 +1,95 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: administered_licensing_subscription_subscriptions_bind
+short_description: Resource module for administered _licensing _subscription _subscriptions _bind
+description:
+- Manage operation create of the resource administered _licensing _subscription _subscriptions _bind.
+- Bind networks to a subscription.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ networkIds:
+ description: List of network ids to bind to the subscription.
+ elements: str
+ type: list
+ subscriptionId:
+ description: SubscriptionId path parameter. Subscription ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for licensing bindAdministeredLicensingSubscriptionSubscription
+ description: Complete reference of the bindAdministeredLicensingSubscriptionSubscription API.
+ link: https://developer.cisco.com/meraki/api-v1/#!bind-administered-licensing-subscription-subscription
+notes:
+ - SDK Method used are
+ licensing.Licensing.bind_administered_licensing_subscription_subscription,
+
+ - Paths used are
+ post /administered/licensing/subscription/subscriptions/{subscriptionId}/bind,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.administered_licensing_subscription_subscriptions_bind:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds:
+ - L_1234
+ - N_5678
+ subscriptionId: string
+ validate: true
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "errors": [
+ "string"
+ ],
+ "insufficientEntitlements": [
+ {
+ "quantity": 0,
+ "sku": "string"
+ }
+ ],
+ "networks": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "subscriptionId": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim.py b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim.py
new file mode 100644
index 000000000..9049fb0f2
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim.py
@@ -0,0 +1,112 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: administered_licensing_subscription_subscriptions_claim
+short_description: Resource module for administered _licensing _subscription _subscriptions _claim
+description:
+- Manage operation create of the resource administered _licensing _subscription _subscriptions _claim.
+- Claim a subscription into an organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ claimKey:
+ description: The subscription's claim key.
+ type: str
+ description:
+ description: Extra details or notes about the subscription.
+ type: str
+ name:
+ description: Friendly name to identify the subscription.
+ type: str
+ organizationId:
+ description: The id of the organization claiming the subscription.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for licensing claimAdministeredLicensingSubscriptionSubscriptions
+ description: Complete reference of the claimAdministeredLicensingSubscriptionSubscriptions API.
+ link: https://developer.cisco.com/meraki/api-v1/#!claim-administered-licensing-subscription-subscriptions
+notes:
+ - SDK Method used are
+ licensing.Licensing.claim_administered_licensing_subscription_subscriptions,
+
+ - Paths used are
+ post /administered/licensing/subscription/subscriptions/claim,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.administered_licensing_subscription_subscriptions_claim:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ claimKey: S2345-6789A-BCDEF-GHJKM
+ description: Subscription for all main offices
+ name: Corporate subscription
+ organizationId: '12345678910'
+ validate: true
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "counts": {
+ "networks": 0,
+ "seats": {
+ "assigned": 0,
+ "available": 0,
+ "limit": 0
+ }
+ },
+ "description": "string",
+ "endDate": "string",
+ "entitlements": [
+ {
+ "seats": {
+ "assigned": 0,
+ "available": 0,
+ "limit": 0
+ },
+ "sku": "string"
+ }
+ ],
+ "name": "string",
+ "productTypes": [
+ "string"
+ ],
+ "startDate": "string",
+ "status": "string",
+ "subscriptionId": "string",
+ "webOrderId": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim_key_validate.py b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim_key_validate.py
new file mode 100644
index 000000000..578a9603c
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_claim_key_validate.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: administered_licensing_subscription_subscriptions_claim_key_validate
+short_description: Resource module for administered _licensing _subscription _subscriptions _claimkey _validate
+description:
+- Manage operation create of the resource administered _licensing _subscription _subscriptions _claimkey _validate.
+- Find a subscription by claim key. Returns 400 if the key has already been claimed.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ claimKey:
+ description: The subscription's claim key.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for licensing validateAdministeredLicensingSubscriptionSubscriptionsClaimKey
+ description: Complete reference of the validateAdministeredLicensingSubscriptionSubscriptionsClaimKey API.
+ link: https://developer.cisco.com/meraki/api-v1/#!validate-administered-licensing-subscription-subscriptions-claim-key
+notes:
+ - SDK Method used are
+ licensing.Licensing.validate_administered_licensing_subscription_subscriptions_claim_key,
+
+ - Paths used are
+ post /administered/licensing/subscription/subscriptions/claimKey/validate,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.administered_licensing_subscription_subscriptions_claim_key_validate:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ claimKey: S2345-6789A-BCDEF-GHJKM
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "counts": {
+ "networks": 0,
+ "seats": {
+ "assigned": 0,
+ "available": 0,
+ "limit": 0
+ }
+ },
+ "description": "string",
+ "endDate": "string",
+ "entitlements": [
+ {
+ "seats": {
+ "assigned": 0,
+ "available": 0,
+ "limit": 0
+ },
+ "sku": "string"
+ }
+ ],
+ "name": "string",
+ "productTypes": [
+ "string"
+ ],
+ "startDate": "string",
+ "status": "string",
+ "subscriptionId": "string",
+ "webOrderId": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_compliance_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
new file mode 100644
index 000000000..08c0dfca8
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_compliance_statuses_info.py
@@ -0,0 +1,107 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: administered_licensing_subscription_subscriptions_compliance_statuses_info
+short_description: Information module for administered _licensing _subscription _subscriptions _compliance _statuses
+description:
+- Get all administered _licensing _subscription _subscriptions _compliance _statuses.
+- Get compliance status for requested subscriptions.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationIds:
+ description:
+ - OrganizationIds query parameter. Organizations to get subscription compliance information for.
+ elements: str
+ type: list
+ subscriptionIds:
+ description:
+ - SubscriptionIds query parameter. Subscription ids.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for licensing getAdministeredLicensingSubscriptionSubscriptionsComplianceStatuses
+ description: Complete reference of the getAdministeredLicensingSubscriptionSubscriptionsComplianceStatuses API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-administered-licensing-subscription-subscriptions-compliance-statuses
+notes:
+ - SDK Method used are
+ licensing.Licensing.get_administered_licensing_subscription_subscriptions_compliance_statuses,
+
+ - Paths used are
+ get /administered/licensing/subscription/subscriptions/compliance/statuses,
+"""
+
+EXAMPLES = r"""
+- name: Get all administered _licensing _subscription _subscriptions _compliance _statuses
+ cisco.meraki.administered_licensing_subscription_subscriptions_compliance_statuses_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ organizationIds: []
+ subscriptionIds: []
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "subscription": {
+ "id": "string",
+ "name": "string",
+ "status": "string"
+ },
+ "violations": {
+ "byProductClass": [
+ {
+ "gracePeriodEndsAt": "string",
+ "missing": {
+ "entitlements": [
+ {
+ "quantity": 0,
+ "sku": "string"
+ }
+ ]
+ },
+ "productClass": "string"
+ }
+ ]
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_info.py b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_info.py
new file mode 100644
index 000000000..f60343cd7
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/administered_licensing_subscription_subscriptions_info.py
@@ -0,0 +1,164 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: administered_licensing_subscription_subscriptions_info
+short_description: Information module for administered _licensing _subscription _subscriptions
+description:
+- Get all administered _licensing _subscription _subscriptions.
+- List available subscriptions.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ subscriptionIds:
+ description:
+ - SubscriptionIds query parameter. List of subscription ids to fetch.
+ elements: str
+ type: list
+ organizationIds:
+ description:
+ - OrganizationIds query parameter. Organizations to get associated subscriptions for.
+ elements: str
+ type: list
+ statuses:
+ description:
+ - Statuses query parameter. List of statuses that returned subscriptions can have.
+ elements: str
+ type: list
+ productTypes:
+ description:
+ - ProductTypes query parameter. List of product types that returned subscriptions need to have entitlements for.
+ elements: str
+ type: list
+ startDate:
+ description:
+ - >
+ StartDate query parameter. Filter subscriptions by start date, ISO 8601 format. To filter with a range of
+ dates, use 'startDate<option>=?' in the request. Accepted options include lt, gt, lte, gte.
+ type: str
+ endDate:
+ description:
+ - >
+ EndDate query parameter. Filter subscriptions by end date, ISO 8601 format. To filter with a range of dates,
+ use 'endDate<option>=?' in the request. Accepted options include lt, gt, lte, gte.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for licensing getAdministeredLicensingSubscriptionSubscriptions
+ description: Complete reference of the getAdministeredLicensingSubscriptionSubscriptions API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-administered-licensing-subscription-subscriptions
+notes:
+ - SDK Method used are
+ licensing.Licensing.get_administered_licensing_subscription_subscriptions,
+
+ - Paths used are
+ get /administered/licensing/subscription/subscriptions,
+"""
+
+EXAMPLES = r"""
+- name: Get all administered _licensing _subscription _subscriptions
+ cisco.meraki.administered_licensing_subscription_subscriptions_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ subscriptionIds: []
+ organizationIds: []
+ statuses: []
+ productTypes: []
+ startDate: string
+ endDate: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "counts": {
+ "networks": 0,
+ "seats": {
+ "assigned": 0,
+ "available": 0,
+ "limit": 0
+ }
+ },
+ "description": "string",
+ "endDate": "string",
+ "entitlements": [
+ {
+ "seats": {
+ "assigned": 0,
+ "available": 0,
+ "limit": 0
+ },
+ "sku": "string"
+ }
+ ],
+ "name": "string",
+ "productTypes": [
+ "string"
+ ],
+ "startDate": "string",
+ "status": "string",
+ "subscriptionId": "string",
+ "webOrderId": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices.py b/ansible_collections/cisco/meraki/plugins/modules/devices.py
index 095ec27d8..2e17ef2ce 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices.py
@@ -29,9 +29,6 @@ options:
lng:
description: The longitude of a device.
type: float
- mac:
- description: Mac.
- type: str
moveMapMarker:
description: Whether or not to set the latitude and longitude of a device based
on the new address. Only applies when lat and lng are not specified.
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_performance_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_performance_info.py
index 5bdc0d6b0..1b0ef7ac6 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_performance_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_performance_info.py
@@ -72,6 +72,8 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "perfScore": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings.py b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings.py
new file mode 100644
index 000000000..ec5439141
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings.py
@@ -0,0 +1,128 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_appliance_radio_settings
+short_description: Resource module for devices _appliance _radio _settings
+description:
+- Manage operation update of the resource devices _appliance _radio _settings.
+- Update the radio settings of an appliance.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ fiveGhzSettings:
+ description: Manual radio settings for 5 GHz.
+ suboptions:
+ channel:
+ description: Sets a manual channel for 5 GHz. Can be '36', '40', '44', '48',
+ '52', '56', '60', '64', '100', '104', '108', '112', '116', '120', '124', '128',
+ '132', '136', '140', '144', '149', '153', '157', '161', '165', '169', '173'
+ or '177' or null for using auto channel.
+ type: int
+ channelWidth:
+ description: Sets a manual channel width for 5 GHz. Can be '0', '20', '40',
+ '80' or '160' or null for using auto channel width.
+ type: int
+ targetPower:
+ description: Set a manual target power for 5 GHz. Can be between '8' or '30'
+ or null for using auto power range.
+ type: int
+ type: dict
+ rfProfileId:
+ description: The ID of an RF profile to assign to the device. If the value of this
+ parameter is null, the appropriate basic RF profile (indoor or outdoor) will be
+ assigned to the device. Assigning an RF profile will clear ALL manually configured
+ overrides on the device (channel width, channel, power).
+ type: str
+ serial:
+ description: Serial path parameter.
+ type: str
+ twoFourGhzSettings:
+ description: Manual radio settings for 2.4 GHz.
+ suboptions:
+ channel:
+ description: Sets a manual channel for 2.4 GHz. Can be '1', '2', '3', '4', '5',
+ '6', '7', '8', '9', '10', '11', '12', '13' or '14' or null for using auto
+ channel.
+ type: int
+ targetPower:
+ description: Set a manual target power for 2.4 GHz. Can be between '5' or '30'
+ or null for using auto power range.
+ type: int
+ type: dict
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance updateDeviceApplianceRadioSettings
+ description: Complete reference of the updateDeviceApplianceRadioSettings API.
+ link: https://developer.cisco.com/meraki/api-v1/#!update-device-appliance-radio-settings
+notes:
+ - SDK Method used are
+ appliance.Appliance.update_device_appliance_radio_settings,
+
+ - Paths used are
+ put /devices/{serial}/appliance/radio/settings,
+"""
+
+EXAMPLES = r"""
+- name: Update all
+ cisco.meraki.devices_appliance_radio_settings:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ fiveGhzSettings:
+ channel: 149
+ channelWidth: 20
+ targetPower: 15
+ rfProfileId: '1234'
+ serial: string
+ twoFourGhzSettings:
+ channel: 11
+ targetPower: 21
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "fiveGhzSettings": {
+ "channel": 0,
+ "channelWidth": 0,
+ "targetPower": 0
+ },
+ "rfProfileId": "string",
+ "serial": "string",
+ "twoFourGhzSettings": {
+ "channel": 0,
+ "targetPower": 0
+ }
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings_info.py
new file mode 100644
index 000000000..c2461ffed
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_radio_settings_info.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_appliance_radio_settings_info
+short_description: Information module for devices _appliance _radio _settings
+description:
+- Get all devices _appliance _radio _settings.
+- Return the radio settings of an appliance.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ serial:
+ description:
+ - Serial path parameter.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance getDeviceApplianceRadioSettings
+ description: Complete reference of the getDeviceApplianceRadioSettings API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-device-appliance-radio-settings
+notes:
+ - SDK Method used are
+ appliance.Appliance.get_device_appliance_radio_settings,
+
+ - Paths used are
+ get /devices/{serial}/appliance/radio/settings,
+"""
+
+EXAMPLES = r"""
+- name: Get all devices _appliance _radio _settings
+ cisco.meraki.devices_appliance_radio_settings_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ serial: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "fiveGhzSettings": {
+ "channel": 0,
+ "channelWidth": 0,
+ "targetPower": 0
+ },
+ "rfProfileId": "string",
+ "serial": "string",
+ "twoFourGhzSettings": {
+ "channel": 0,
+ "targetPower": 0
+ }
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings.py b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings.py
index 0b325882b..1b24e9dfb 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings.py
@@ -309,14 +309,17 @@ meraki_response:
{
"wan1": {
"enabled": true,
- "vlanTagging": {
- "enabled": true,
- "vlanId": 0
+ "pppoe": {
+ "authentication": {
+ "enabled": true,
+ "username": "string"
+ },
+ "enabled": true
},
"svis": {
"ipv4": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -325,8 +328,8 @@ meraki_response:
}
},
"ipv6": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -335,24 +338,24 @@ meraki_response:
}
}
},
- "pppoe": {
+ "vlanTagging": {
"enabled": true,
- "authentication": {
- "enabled": true,
- "username": "string"
- }
+ "vlanId": 0
}
},
"wan2": {
"enabled": true,
- "vlanTagging": {
- "enabled": true,
- "vlanId": 0
+ "pppoe": {
+ "authentication": {
+ "enabled": true,
+ "username": "string"
+ },
+ "enabled": true
},
"svis": {
"ipv4": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -361,8 +364,8 @@ meraki_response:
}
},
"ipv6": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -371,12 +374,9 @@ meraki_response:
}
}
},
- "pppoe": {
+ "vlanTagging": {
"enabled": true,
- "authentication": {
- "enabled": true,
- "username": "string"
- }
+ "vlanId": 0
}
}
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings_info.py
index 57b2d8c2a..84ae86bfe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_uplinks_settings_info.py
@@ -74,14 +74,17 @@ meraki_response:
{
"wan1": {
"enabled": true,
- "vlanTagging": {
- "enabled": true,
- "vlanId": 0
+ "pppoe": {
+ "authentication": {
+ "enabled": true,
+ "username": "string"
+ },
+ "enabled": true
},
"svis": {
"ipv4": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -90,8 +93,8 @@ meraki_response:
}
},
"ipv6": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -100,24 +103,24 @@ meraki_response:
}
}
},
- "pppoe": {
+ "vlanTagging": {
"enabled": true,
- "authentication": {
- "enabled": true,
- "username": "string"
- }
+ "vlanId": 0
}
},
"wan2": {
"enabled": true,
- "vlanTagging": {
- "enabled": true,
- "vlanId": 0
+ "pppoe": {
+ "authentication": {
+ "enabled": true,
+ "username": "string"
+ },
+ "enabled": true
},
"svis": {
"ipv4": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -126,8 +129,8 @@ meraki_response:
}
},
"ipv6": {
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
"nameservers": {
"addresses": [
@@ -136,12 +139,9 @@ meraki_response:
}
}
},
- "pppoe": {
+ "vlanTagging": {
"enabled": true,
- "authentication": {
- "enabled": true,
- "username": "string"
- }
+ "vlanId": 0
}
}
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_vmx_authentication_token.py b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_vmx_authentication_token.py
index 6b5f400af..80cfba930 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_vmx_authentication_token.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_appliance_vmx_authentication_token.py
@@ -67,7 +67,7 @@ meraki_response:
type: dict
sample: >
{
- "token": "string",
- "expiresAt": "string"
+ "expiresAt": "string",
+ "token": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_blink_leds.py b/ansible_collections/cisco/meraki/plugins/modules/devices_blink_leds.py
index e79e87a8e..bca7f62e5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_blink_leds.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_blink_leds.py
@@ -80,5 +80,9 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "duration": 0,
+ "duty": 0,
+ "period": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_analytics_live_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_analytics_live_info.py
index 33f83d4bd..55638a526 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_analytics_live_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_analytics_live_info.py
@@ -70,6 +70,13 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "ts": "string",
+ "zones": {
+ "0": {
+ "person": 0
+ }
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics.py
index e68f3ee98..40263f5cf 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics.py
@@ -40,12 +40,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceCameraCustomAnalytics
+- name: Cisco Meraki documentation for camera updateDeviceCameraCustomAnalytics
description: Complete reference of the updateDeviceCameraCustomAnalytics API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-camera-custom-analytics
notes:
- SDK Method used are
- devices.Devices.update_device_camera_custom_analytics,
+ camera.Camera.update_device_camera_custom_analytics,
- Paths used are
put /devices/{serial}/camera/customAnalytics,
@@ -89,5 +89,14 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "artifactId": "string",
+ "enabled": true,
+ "parameters": [
+ {
+ "name": "string",
+ "value": 0
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics_info.py
index 8a08930bc..235270b65 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_custom_analytics_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceCameraCustomAnalytics
+- name: Cisco Meraki documentation for camera getDeviceCameraCustomAnalytics
description: Complete reference of the getDeviceCameraCustomAnalytics API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-camera-custom-analytics
notes:
- SDK Method used are
- devices.Devices.get_device_camera_custom_analytics,
+ camera.Camera.get_device_camera_custom_analytics,
- Paths used are
get /devices/{serial}/camera/customAnalytics,
@@ -70,6 +70,15 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "artifactId": "string",
+ "enabled": true,
+ "parameters": [
+ {
+ "name": "string",
+ "value": 0
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_generate_snapshot.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_generate_snapshot.py
index 026e44fa8..a849306e5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_generate_snapshot.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_generate_snapshot.py
@@ -32,12 +32,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices generateDeviceCameraSnapshot
+- name: Cisco Meraki documentation for camera generateDeviceCameraSnapshot
description: Complete reference of the generateDeviceCameraSnapshot API.
link: https://developer.cisco.com/meraki/api-v1/#!generate-device-camera-snapshot
notes:
- SDK Method used are
- devices.Devices.generate_device_camera_snapshot,
+ camera.Camera.generate_device_camera_snapshot,
- Paths used are
post /devices/{serial}/camera/generateSnapshot,
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention.py
index ab0e474ec..355aee8b7 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention.py
@@ -40,8 +40,8 @@ options:
type: str
resolution:
description: Resolution of the camera. Can be one of '1280x720', '1920x1080', '1080x1080',
- '2058x2058', '2112x2112', '2880x2880', '2688x1512' or '3840x2160'.Not all resolutions
- are supported by every camera model.
+ '2112x2112', '2880x2880', '2688x1512' or '3840x2160'.Not all resolutions are supported
+ by every camera model.
type: str
restrictedBandwidthModeEnabled:
description: Boolean indicating if restricted bandwidth is enabled(true) or disabled(false)
@@ -54,12 +54,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceCameraQualityAndRetention
+- name: Cisco Meraki documentation for camera updateDeviceCameraQualityAndRetention
description: Complete reference of the updateDeviceCameraQualityAndRetention API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-camera-quality-and-retention
notes:
- SDK Method used are
- devices.Devices.update_device_camera_quality_and_retention,
+ camera.Camera.update_device_camera_quality_and_retention,
- Paths used are
put /devices/{serial}/camera/qualityAndRetention,
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention_info.py
index 4c24df969..0a24bc07d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_quality_and_retention_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceCameraQualityAndRetention
+- name: Cisco Meraki documentation for camera getDeviceCameraQualityAndRetention
description: Complete reference of the getDeviceCameraQualityAndRetention API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-camera-quality-and-retention
notes:
- SDK Method used are
- devices.Devices.get_device_camera_quality_and_retention,
+ camera.Camera.get_device_camera_quality_and_retention,
- Paths used are
get /devices/{serial}/camera/qualityAndRetention,
@@ -70,6 +70,14 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "audioRecordingEnabled": true,
+ "motionBasedRetentionEnabled": true,
+ "motionDetectorVersion": 0,
+ "profileId": "string",
+ "quality": "string",
+ "resolution": "string",
+ "restrictedBandwidthModeEnabled": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense.py
index fba029c46..cb65eb3c4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense.py
@@ -42,12 +42,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceCameraSense
+- name: Cisco Meraki documentation for camera updateDeviceCameraSense
description: Complete reference of the updateDeviceCameraSense API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-camera-sense
notes:
- SDK Method used are
- devices.Devices.update_device_camera_sense,
+ camera.Camera.update_device_camera_sense,
- Paths used are
put /devices/{serial}/camera/sense,
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense_info.py
index 2dee743aa..319939da0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_sense_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceCameraSense
+- name: Cisco Meraki documentation for camera getDeviceCameraSense
description: Complete reference of the getDeviceCameraSense API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-camera-sense
notes:
- SDK Method used are
- devices.Devices.get_device_camera_sense,
+ camera.Camera.get_device_camera_sense,
- Paths used are
get /devices/{serial}/camera/sense,
@@ -70,6 +70,15 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "audioDetection": {
+ "enabled": true
+ },
+ "mqttBrokerId": "string",
+ "mqttTopics": [
+ "string"
+ ],
+ "senseEnabled": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_link_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_link_info.py
index a872336bc..2f409ed6a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_link_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_link_info.py
@@ -77,6 +77,9 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "url": "string",
+ "visionUrl": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings.py
index 27803c8dd..24a5896f3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings.py
@@ -26,12 +26,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceCameraVideoSettings
+- name: Cisco Meraki documentation for camera updateDeviceCameraVideoSettings
description: Complete reference of the updateDeviceCameraVideoSettings API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-camera-video-settings
notes:
- SDK Method used are
- devices.Devices.update_device_camera_video_settings,
+ camera.Camera.update_device_camera_video_settings,
- Paths used are
put /devices/{serial}/camera/video/settings,
@@ -71,5 +71,8 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "externalRtspEnabled": true,
+ "rtspUrl": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings_info.py
index 1a6deb42e..0610c46fe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_video_settings_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceCameraVideoSettings
+- name: Cisco Meraki documentation for camera getDeviceCameraVideoSettings
description: Complete reference of the getDeviceCameraVideoSettings API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-camera-video-settings
notes:
- SDK Method used are
- devices.Devices.get_device_camera_video_settings,
+ camera.Camera.get_device_camera_video_settings,
- Paths used are
get /devices/{serial}/camera/video/settings,
@@ -70,6 +70,9 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "externalRtspEnabled": true,
+ "rtspUrl": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles.py
index 2453b6679..b7d480719 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles.py
@@ -38,12 +38,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceCameraWirelessProfiles
+- name: Cisco Meraki documentation for camera updateDeviceCameraWirelessProfiles
description: Complete reference of the updateDeviceCameraWirelessProfiles API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-camera-wireless-profiles
notes:
- SDK Method used are
- devices.Devices.update_device_camera_wireless_profiles,
+ camera.Camera.update_device_camera_wireless_profiles,
- Paths used are
put /devices/{serial}/camera/wirelessProfiles,
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles_info.py
index f9939d5a4..e766acd51 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_camera_wireless_profiles_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceCameraWirelessProfiles
+- name: Cisco Meraki documentation for camera getDeviceCameraWirelessProfiles
description: Complete reference of the getDeviceCameraWirelessProfiles API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-camera-wireless-profiles
notes:
- SDK Method used are
- devices.Devices.get_device_camera_wireless_profiles,
+ camera.Camera.get_device_camera_wireless_profiles,
- Paths used are
get /devices/{serial}/camera/wirelessProfiles,
@@ -70,6 +70,10 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "backup": "string",
+ "primary": "string",
+ "secondary": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan.py b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan.py
index 8c930e9e7..d5bd881e8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan.py
@@ -52,12 +52,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceCellularGatewayLan
+- name: Cisco Meraki documentation for cellularGateway updateDeviceCellularGatewayLan
description: Complete reference of the updateDeviceCellularGatewayLan API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-cellular-gateway-lan
notes:
- SDK Method used are
- devices.Devices.update_device_cellular_gateway_lan,
+ cellular_gateway.CellularGateway.update_device_cellular_gateway_lan,
- Paths used are
put /devices/{serial}/cellularGateway/lan,
@@ -87,16 +87,10 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
- deviceLanIp: 192.168.0.33
- deviceName: name of the MG
- deviceSubnet: 192.168.0.32/27
fixedIpAssignments:
- ip: 192.168.0.10
mac: 0b:00:00:00:00:ac
name: server 1
- - ip: 192.168.0.20
- mac: 0b:00:00:00:00:ab
- name: server 2
reservedIpRanges:
- comment: A reserved IP range
end: 192.168.1.1
@@ -110,5 +104,23 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "deviceLanIp": "string",
+ "deviceName": "string",
+ "deviceSubnet": "string",
+ "fixedIpAssignments": [
+ {
+ "ip": "string",
+ "mac": "string",
+ "name": "string"
+ }
+ ],
+ "reservedIpRanges": [
+ {
+ "comment": "string",
+ "end": "string",
+ "start": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan_info.py
index b16d76670..e5cf15868 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_lan_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceCellularGatewayLan
+- name: Cisco Meraki documentation for cellularGateway getDeviceCellularGatewayLan
description: Complete reference of the getDeviceCellularGatewayLan API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-cellular-gateway-lan
notes:
- SDK Method used are
- devices.Devices.get_device_cellular_gateway_lan,
+ cellular_gateway.CellularGateway.get_device_cellular_gateway_lan,
- Paths used are
get /devices/{serial}/cellularGateway/lan,
@@ -70,6 +70,24 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "deviceLanIp": "string",
+ "deviceName": "string",
+ "deviceSubnet": "string",
+ "fixedIpAssignments": [
+ {
+ "ip": "string",
+ "mac": "string",
+ "name": "string"
+ }
+ ],
+ "reservedIpRanges": [
+ {
+ "comment": "string",
+ "end": "string",
+ "start": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_port_forwarding_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_port_forwarding_rules_info.py
index 6e8e713d2..76ffa1bb8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_port_forwarding_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_gateway_port_forwarding_rules_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceCellularGatewayPortForwardingRules
+- name: Cisco Meraki documentation for cellularGateway getDeviceCellularGatewayPortForwardingRules
description: Complete reference of the getDeviceCellularGatewayPortForwardingRules API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-cellular-gateway-port-forwarding-rules
notes:
- SDK Method used are
- devices.Devices.get_device_cellular_gateway_port_forwarding_rules,
+ cellular_gateway.CellularGateway.get_device_cellular_gateway_port_forwarding_rules,
- Paths used are
get /devices/{serial}/cellularGateway/portForwardingRules,
@@ -69,7 +69,18 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "access": "string",
+ "lanIp": "string",
+ "localPort": "string",
+ "name": "string",
+ "protocol": "string",
+ "publicPort": "string",
+ "uplink": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims.py b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims.py
index a0c66c0d2..03a26c3f2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims.py
@@ -25,6 +25,9 @@ options:
enabled:
description: Failover to secondary SIM (optional).
type: bool
+ timeout:
+ description: Failover timeout in seconds (optional).
+ type: int
type: dict
sims:
description: List of SIMs. If a SIM was previously configured and not specified
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims_info.py
index 5ae2eab96..3022b8e6f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_cellular_sims_info.py
@@ -69,7 +69,25 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "apns": [
+ {
+ "allowedIpTypes": [
+ "string"
+ ],
+ "authentication": {
+ "type": "string",
+ "username": "string"
+ },
+ "name": "string"
+ }
+ ],
+ "isPrimary": true,
+ "slot": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_info.py
index f230e826f..89fc1f92e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_info.py
@@ -226,26 +226,30 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {
- "name": "string",
- "lat": 0,
- "lng": 0,
- "address": "string",
- "notes": "string",
- "tags": [
- "string"
- ],
- "networkId": "string",
- "serial": "string",
- "model": "string",
- "mac": "string",
- "lanIp": "string",
- "firmware": "string",
- "productType": "string"
- }
- ]
+ {
+ "address": "string",
+ "details": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ],
+ "firmware": "string",
+ "imei": "string",
+ "lanIp": "string",
+ "lat": 0,
+ "lng": 0,
+ "mac": "string",
+ "model": "string",
+ "name": "string",
+ "networkId": "string",
+ "notes": "string",
+ "productType": "string",
+ "serial": "string",
+ "tags": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table.py
new file mode 100644
index 000000000..2719794c8
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table.py
@@ -0,0 +1,120 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_arp_table
+short_description: Resource module for devices _livetools _arptable
+description:
+- Manage operation create of the resource devices _livetools _arptable.
+- Enqueue a job to perform a ARP table request for the device. This endpoint currently supports switches.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ callback:
+ description: Details for the callback. Please include either an httpServerId OR
+ url and sharedSecret.
+ suboptions:
+ httpServer:
+ description: The webhook receiver used for the callback webhook.
+ suboptions:
+ id:
+ description: The webhook receiver ID that will receive information. If specifying
+ this, please leave the url and sharedSecret fields blank.
+ type: str
+ type: dict
+ payloadTemplate:
+ description: The payload template of the webhook used for the callback.
+ suboptions:
+ id:
+ description: The ID of the payload template. Defaults to 'wpt_00005' for
+ the Callback (included) template.
+ type: str
+ type: dict
+ sharedSecret:
+ description: A shared secret that will be included in the requests sent to the
+ callback URL. It can be used to verify that the request was sent by Meraki.
+ If using this field, please also specify an url.
+ type: str
+ url:
+ description: The callback URL for the webhook target. If using this field, please
+ also specify a sharedSecret.
+ type: str
+ type: dict
+ serial:
+ description: Serial path parameter.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for devices createDeviceLiveToolsArpTable
+ description: Complete reference of the createDeviceLiveToolsArpTable API.
+ link: https://developer.cisco.com/meraki/api-v1/#!create-device-live-tools-arp-table
+notes:
+ - SDK Method used are
+ devices.Devices.create_device_live_tools_arp_table,
+
+ - Paths used are
+ post /devices/{serial}/liveTools/arpTable,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.devices_live_tools_arp_table:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ callback:
+ httpServer:
+ id: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vd2ViaG9va3M=
+ payloadTemplate:
+ id: wpt_2100
+ sharedSecret: secret
+ url: https://webhook.site/28efa24e-f830-4d9f-a12b-fbb9e5035031
+ serial: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "arpTableId": "string",
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
+ "request": {
+ "serial": "string"
+ },
+ "status": "string",
+ "url": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table_info.py
new file mode 100644
index 000000000..fb9433a17
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_arp_table_info.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_arp_table_info
+short_description: Information module for devices _livetools _arptable
+description: Information module for devices _livetools _arptable
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+notes:
+ - Paths used are
+"""
+
+EXAMPLES = r"""
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample:
+ - {}
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test.py
new file mode 100644
index 000000000..fe7e47df9
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test.py
@@ -0,0 +1,130 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_cable_test
+short_description: Resource module for devices _livetools _cabletest
+description:
+- Manage operation create of the resource devices _livetools _cabletest.
+- Enqueue a job to perform a cable test for the device on the specified ports.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ callback:
+ description: Details for the callback. Please include either an httpServerId OR
+ url and sharedSecret.
+ suboptions:
+ httpServer:
+ description: The webhook receiver used for the callback webhook.
+ suboptions:
+ id:
+ description: The webhook receiver ID that will receive information. If specifying
+ this, please leave the url and sharedSecret fields blank.
+ type: str
+ type: dict
+ payloadTemplate:
+ description: The payload template of the webhook used for the callback.
+ suboptions:
+ id:
+ description: The ID of the payload template. Defaults to 'wpt_00005' for
+ the Callback (included) template.
+ type: str
+ type: dict
+ sharedSecret:
+ description: A shared secret that will be included in the requests sent to the
+ callback URL. It can be used to verify that the request was sent by Meraki.
+ If using this field, please also specify an url.
+ type: str
+ url:
+ description: The callback URL for the webhook target. If using this field, please
+ also specify a sharedSecret.
+ type: str
+ type: dict
+ ports:
+ description: A list of ports for which to perform the cable test.
+ elements: str
+ type: list
+ serial:
+ description: Serial path parameter.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for devices createDeviceLiveToolsCableTest
+ description: Complete reference of the createDeviceLiveToolsCableTest API.
+ link: https://developer.cisco.com/meraki/api-v1/#!create-device-live-tools-cable-test
+notes:
+ - SDK Method used are
+ devices.Devices.create_device_live_tools_cable_test,
+
+ - Paths used are
+ post /devices/{serial}/liveTools/cableTest,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.devices_live_tools_cable_test:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ callback:
+ httpServer:
+ id: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vd2ViaG9va3M=
+ payloadTemplate:
+ id: wpt_2100
+ sharedSecret: secret
+ url: https://webhook.site/28efa24e-f830-4d9f-a12b-fbb9e5035031
+ ports:
+ - '2'
+ - '8'
+ serial: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "cableTestId": "string",
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
+ "request": {
+ "ports": [
+ "string"
+ ],
+ "serial": "string"
+ },
+ "status": "string",
+ "url": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test_info.py
new file mode 100644
index 000000000..62ee49431
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_cable_test_info.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_cable_test_info
+short_description: Information module for devices _livetools _cabletest
+description: Information module for devices _livetools _cabletest
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+notes:
+ - Paths used are
+"""
+
+EXAMPLES = r"""
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample:
+ - {}
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping.py
index 791847c69..a3814c19c 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping.py
@@ -16,6 +16,36 @@ extends_documentation_fragment:
- cisco.meraki.module
author: Francisco Munoz (@fmunoz)
options:
+ callback:
+ description: Details for the callback. Please include either an httpServerId OR
+ url and sharedSecret.
+ suboptions:
+ httpServer:
+ description: The webhook receiver used for the callback webhook.
+ suboptions:
+ id:
+ description: The webhook receiver ID that will receive information. If specifying
+ this, please leave the url and sharedSecret fields blank.
+ type: str
+ type: dict
+ payloadTemplate:
+ description: The payload template of the webhook used for the callback.
+ suboptions:
+ id:
+ description: The ID of the payload template. Defaults to 'wpt_00005' for
+ the Callback (included) template.
+ type: str
+ type: dict
+ sharedSecret:
+ description: A shared secret that will be included in the requests sent to the
+ callback URL. It can be used to verify that the request was sent by Meraki.
+ If using this field, please also specify an url.
+ type: str
+ url:
+ description: The callback URL for the webhook target. If using this field, please
+ also specify a sharedSecret.
+ type: str
+ type: dict
count:
description: Count parameter to pass to ping. 1..5, default 5.
type: int
@@ -64,6 +94,13 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
+ callback:
+ httpServer:
+ id: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vd2ViaG9va3M=
+ payloadTemplate:
+ id: wpt_2100
+ sharedSecret: secret
+ url: https://webhook.site/28efa24e-f830-4d9f-a12b-fbb9e5035031
count: 2
serial: string
target: 75.75.75.75
@@ -76,13 +113,18 @@ meraki_response:
type: dict
sample: >
{
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
"pingId": "string",
- "url": "string",
"request": {
+ "count": 0,
"serial": "string",
- "target": "string",
- "count": 0
+ "target": "string"
},
- "status": "string"
+ "status": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device.py
index ee6a137cf..65df1e314 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device.py
@@ -16,6 +16,36 @@ extends_documentation_fragment:
- cisco.meraki.module
author: Francisco Munoz (@fmunoz)
options:
+ callback:
+ description: Details for the callback. Please include either an httpServerId OR
+ url and sharedSecret.
+ suboptions:
+ httpServer:
+ description: The webhook receiver used for the callback webhook.
+ suboptions:
+ id:
+ description: The webhook receiver ID that will receive information. If specifying
+ this, please leave the url and sharedSecret fields blank.
+ type: str
+ type: dict
+ payloadTemplate:
+ description: The payload template of the webhook used for the callback.
+ suboptions:
+ id:
+ description: The ID of the payload template. Defaults to 'wpt_00005' for
+ the Callback (included) template.
+ type: str
+ type: dict
+ sharedSecret:
+ description: A shared secret that will be included in the requests sent to the
+ callback URL. It can be used to verify that the request was sent by Meraki.
+ If using this field, please also specify an url.
+ type: str
+ url:
+ description: The callback URL for the webhook target. If using this field, please
+ also specify a sharedSecret.
+ type: str
+ type: dict
count:
description: Count parameter to pass to ping. 1..5, default 5.
type: int
@@ -61,6 +91,13 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
+ callback:
+ httpServer:
+ id: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vd2ViaG9va3M=
+ payloadTemplate:
+ id: wpt_2100
+ sharedSecret: secret
+ url: https://webhook.site/28efa24e-f830-4d9f-a12b-fbb9e5035031
count: 3
serial: string
@@ -72,13 +109,18 @@ meraki_response:
type: dict
sample: >
{
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
"pingId": "string",
- "url": "string",
"request": {
+ "count": 0,
"serial": "string",
- "target": "string",
- "count": 0
+ "target": "string"
},
- "status": "string"
+ "status": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device_info.py
index 3a5507001..4173b0a95 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_device_info.py
@@ -77,32 +77,37 @@ meraki_response:
type: dict
sample: >
{
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
"pingId": "string",
- "url": "string",
"request": {
+ "count": 0,
"serial": "string",
- "target": "string",
- "count": 0
+ "target": "string"
},
- "status": "string",
"results": {
- "sent": 0,
- "received": 0,
- "loss": {
- "percentage": 0
- },
"latencies": {
- "minimum": 0,
"average": 0,
- "maximum": 0
+ "maximum": 0,
+ "minimum": 0
},
+ "loss": {
+ "percentage": 0
+ },
+ "received": 0,
"replies": [
{
+ "latency": 0,
"sequenceId": 0,
- "size": 0,
- "latency": 0
+ "size": 0
}
- ]
- }
+ ],
+ "sent": 0
+ },
+ "status": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_info.py
index 65a11d488..2dcb32d7b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_ping_info.py
@@ -78,31 +78,31 @@ meraki_response:
sample: >
{
"pingId": "string",
- "url": "string",
"request": {
+ "count": 0,
"serial": "string",
- "target": "string",
- "count": 0
+ "target": "string"
},
- "status": "string",
"results": {
- "sent": 0,
- "received": 0,
- "loss": {
- "percentage": 0
- },
"latencies": {
- "minimum": 0,
"average": 0,
- "maximum": 0
+ "maximum": 0,
+ "minimum": 0
},
+ "loss": {
+ "percentage": 0
+ },
+ "received": 0,
"replies": [
{
+ "latency": 0,
"sequenceId": 0,
- "size": 0,
- "latency": 0
+ "size": 0
}
- ]
- }
+ ],
+ "sent": 0
+ },
+ "status": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test.py
new file mode 100644
index 000000000..2eefccd70
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test.py
@@ -0,0 +1,126 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_throughput_test
+short_description: Resource module for devices _livetools _throughputtest
+description:
+- Manage operation create of the resource devices _livetools _throughputtest.
+- Enqueue a job to test a device throughput, the test will run for 10 secs to test throughput.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ callback:
+ description: Details for the callback. Please include either an httpServerId OR
+ url and sharedSecret.
+ suboptions:
+ httpServer:
+ description: The webhook receiver used for the callback webhook.
+ suboptions:
+ id:
+ description: The webhook receiver ID that will receive information. If specifying
+ this, please leave the url and sharedSecret fields blank.
+ type: str
+ type: dict
+ payloadTemplate:
+ description: The payload template of the webhook used for the callback.
+ suboptions:
+ id:
+ description: The ID of the payload template. Defaults to 'wpt_00005' for
+ the Callback (included) template.
+ type: str
+ type: dict
+ sharedSecret:
+ description: A shared secret that will be included in the requests sent to the
+ callback URL. It can be used to verify that the request was sent by Meraki.
+ If using this field, please also specify an url.
+ type: str
+ url:
+ description: The callback URL for the webhook target. If using this field, please
+ also specify a sharedSecret.
+ type: str
+ type: dict
+ serial:
+ description: Serial path parameter.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for devices createDeviceLiveToolsThroughputTest
+ description: Complete reference of the createDeviceLiveToolsThroughputTest API.
+ link: https://developer.cisco.com/meraki/api-v1/#!create-device-live-tools-throughput-test
+notes:
+ - SDK Method used are
+ devices.Devices.create_device_live_tools_throughput_test,
+
+ - Paths used are
+ post /devices/{serial}/liveTools/throughputTest,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.devices_live_tools_throughput_test:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ callback:
+ httpServer:
+ id: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vd2ViaG9va3M=
+ payloadTemplate:
+ id: wpt_2100
+ sharedSecret: secret
+ url: https://webhook.site/28efa24e-f830-4d9f-a12b-fbb9e5035031
+ serial: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
+ "error": "string",
+ "request": {
+ "serial": "string"
+ },
+ "result": {
+ "speeds": {
+ "downstream": 0
+ }
+ },
+ "status": "string",
+ "throughputTestId": "string",
+ "url": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test_info.py
new file mode 100644
index 000000000..3f01daf1a
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_throughput_test_info.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_throughput_test_info
+short_description: Information module for devices _livetools _throughputtest
+description: Information module for devices _livetools _throughputtest
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+notes:
+ - Paths used are
+"""
+
+EXAMPLES = r"""
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample:
+ - {}
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan.py
new file mode 100644
index 000000000..665fd2e4a
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan.py
@@ -0,0 +1,131 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_wake_on_lan
+short_description: Resource module for devices _livetools _wakeonlan
+description:
+- Manage operation create of the resource devices _livetools _wakeonlan.
+- Enqueue a job to send a Wake-on-LAN packet from the device.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ callback:
+ description: Details for the callback. Please include either an httpServerId OR
+ url and sharedSecret.
+ suboptions:
+ httpServer:
+ description: The webhook receiver used for the callback webhook.
+ suboptions:
+ id:
+ description: The webhook receiver ID that will receive information. If specifying
+ this, please leave the url and sharedSecret fields blank.
+ type: str
+ type: dict
+ payloadTemplate:
+ description: The payload template of the webhook used for the callback.
+ suboptions:
+ id:
+ description: The ID of the payload template. Defaults to 'wpt_00005' for
+ the Callback (included) template.
+ type: str
+ type: dict
+ sharedSecret:
+ description: A shared secret that will be included in the requests sent to the
+ callback URL. It can be used to verify that the request was sent by Meraki.
+ If using this field, please also specify an url.
+ type: str
+ url:
+ description: The callback URL for the webhook target. If using this field, please
+ also specify a sharedSecret.
+ type: str
+ type: dict
+ mac:
+ description: The target's MAC address.
+ type: str
+ serial:
+ description: Serial path parameter.
+ type: str
+ vlanId:
+ description: The target's VLAN (1 to 4094).
+ type: int
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for devices createDeviceLiveToolsWakeOnLan
+ description: Complete reference of the createDeviceLiveToolsWakeOnLan API.
+ link: https://developer.cisco.com/meraki/api-v1/#!create-device-live-tools-wake-on-lan
+notes:
+ - SDK Method used are
+ devices.Devices.create_device_live_tools_wake_on_lan,
+
+ - Paths used are
+ post /devices/{serial}/liveTools/wakeOnLan,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.devices_live_tools_wake_on_lan:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ callback:
+ httpServer:
+ id: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vd2ViaG9va3M=
+ payloadTemplate:
+ id: wpt_2100
+ sharedSecret: secret
+ url: https://webhook.site/28efa24e-f830-4d9f-a12b-fbb9e5035031
+ mac: 00:11:22:33:44:55
+ serial: string
+ vlanId: 12
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
+ "error": "string",
+ "request": {
+ "mac": "string",
+ "serial": "string",
+ "vlanId": 0
+ },
+ "status": "string",
+ "url": "string",
+ "wakeOnLanId": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan_info.py
new file mode 100644
index 000000000..e6d709634
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_live_tools_wake_on_lan_info.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_live_tools_wake_on_lan_info
+short_description: Information module for devices _livetools _wakeonlan
+description: Information module for devices _livetools _wakeonlan
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+notes:
+ - Paths used are
+"""
+
+EXAMPLES = r"""
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample:
+ - {}
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_lldp_cdp_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_lldp_cdp_info.py
index 6b164fafb..eea8e5e0e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_lldp_cdp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_lldp_cdp_info.py
@@ -70,6 +70,9 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "ports": {},
+ "sourceMac": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface.py b/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface.py
index 7935d66b8..26b3b91d9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface.py
@@ -132,6 +132,12 @@ EXAMPLES = r"""
vlan: 7
wanEnabled: not configured
wan2:
+ staticDns:
+ - 1.2.3.2
+ - 1.2.3.3
+ staticGatewayIp: 1.2.3.1
+ staticIp: 1.2.3.4
+ staticSubnetMask: 255.255.255.0
usingStaticIp: false
vlan: 2
wanEnabled: enabled
@@ -168,5 +174,33 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "ddnsHostnames": {
+ "activeDdnsHostname": "string",
+ "ddnsHostnameWan1": "string",
+ "ddnsHostnameWan2": "string"
+ },
+ "wan1": {
+ "staticDns": [
+ "string"
+ ],
+ "staticGatewayIp": "string",
+ "staticIp": "string",
+ "staticSubnetMask": "string",
+ "usingStaticIp": true,
+ "vlan": 0,
+ "wanEnabled": "string"
+ },
+ "wan2": {
+ "staticDns": [
+ "string"
+ ],
+ "staticGatewayIp": "string",
+ "staticIp": "string",
+ "staticSubnetMask": "string",
+ "usingStaticIp": true,
+ "vlan": 0,
+ "wanEnabled": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface_info.py
index d6c7b9f5a..6037634ab 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_management_interface_info.py
@@ -70,6 +70,34 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "ddnsHostnames": {
+ "activeDdnsHostname": "string",
+ "ddnsHostnameWan1": "string",
+ "ddnsHostnameWan2": "string"
+ },
+ "wan1": {
+ "staticDns": [
+ "string"
+ ],
+ "staticGatewayIp": "string",
+ "staticIp": "string",
+ "staticSubnetMask": "string",
+ "usingStaticIp": true,
+ "vlan": 0,
+ "wanEnabled": "string"
+ },
+ "wan2": {
+ "staticDns": [
+ "string"
+ ],
+ "staticGatewayIp": "string",
+ "staticIp": "string",
+ "staticSubnetMask": "string",
+ "usingStaticIp": true,
+ "vlan": 0,
+ "wanEnabled": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships.py b/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships.py
index 6807e39b3..16d18deb0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships.py
@@ -37,12 +37,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceSensorRelationships
+- name: Cisco Meraki documentation for sensor updateDeviceSensorRelationships
description: Complete reference of the updateDeviceSensorRelationships API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-sensor-relationships
notes:
- SDK Method used are
- devices.Devices.update_device_sensor_relationships,
+ sensor.Sensor.update_device_sensor_relationships,
- Paths used are
put /devices/{serial}/sensor/relationships,
@@ -85,13 +85,11 @@ meraki_response:
type: dict
sample: >
{
- "livestream": {
- "relatedDevices": [
- {
- "serial": "string",
- "productType": "string"
- }
- ]
- }
+ "relatedDevices": [
+ {
+ "productType": "string",
+ "serial": "string"
+ }
+ ]
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships_info.py
index 10dfce37d..2bdf296c5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_sensor_relationships_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceSensorRelationships
+- name: Cisco Meraki documentation for sensor getDeviceSensorRelationships
description: Complete reference of the getDeviceSensorRelationships API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-sensor-relationships
notes:
- SDK Method used are
- devices.Devices.get_device_sensor_relationships,
+ sensor.Sensor.get_device_sensor_relationships,
- Paths used are
get /devices/{serial}/sensor/relationships,
@@ -69,19 +69,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {
- "livestream": {
- "relatedDevices": [
- {
- "serial": "string",
- "productType": "string"
- }
- ]
+ {
+ "relatedDevices": [
+ {
+ "productType": "string",
+ "serial": "string"
}
- }
- ]
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports.py
index 370a7c560..7a4414b83 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports.py
@@ -122,8 +122,8 @@ options:
Enforce). Default configuration is Alert only.
type: str
vlan:
- description: The VLAN of the switch port. A null value will clear the value set
- for trunk ports.
+ description: The VLAN of the switch port. For a trunk port, this is the native VLAN.
+ A null value will clear the value set for trunk ports.
type: int
voiceVlan:
description: The voice VLAN of the switch port. Only applicable to access ports.
@@ -132,12 +132,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceSwitchPort
+- name: Cisco Meraki documentation for switch updateDeviceSwitchPort
description: Complete reference of the updateDeviceSwitchPort API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-switch-port
notes:
- SDK Method used are
- devices.Devices.update_device_switch_port,
+ switch.Switch.update_device_switch_port,
- Paths used are
put /devices/{serial}/switch/ports/{portId},
@@ -212,44 +212,50 @@ meraki_response:
type: dict
sample: >
{
- "portId": "string",
- "name": "string",
- "tags": [
- "string"
- ],
- "enabled": true,
- "poeEnabled": true,
- "type": "string",
- "vlan": 0,
- "voiceVlan": 0,
+ "accessPolicyNumber": 0,
+ "accessPolicyType": "string",
+ "adaptivePolicyGroupId": "string",
"allowedVlans": "string",
+ "daiTrusted": true,
+ "enabled": true,
+ "flexibleStackingEnabled": true,
"isolationEnabled": true,
- "rstpEnabled": true,
- "stpGuard": "string",
"linkNegotiation": "string",
"linkNegotiationCapabilities": [
"string"
],
- "portScheduleId": "string",
- "udld": "string",
- "accessPolicyType": "string",
- "accessPolicyNumber": 0,
"macAllowList": [
"string"
],
- "stickyMacAllowList": [
- "string"
- ],
- "stickyMacAllowListLimit": 0,
- "stormControlEnabled": true,
- "adaptivePolicyGroupId": "string",
+ "mirror": {
+ "mode": "string"
+ },
+ "module": {
+ "model": "string"
+ },
+ "name": "string",
"peerSgtCapable": true,
- "flexibleStackingEnabled": true,
- "daiTrusted": true,
+ "poeEnabled": true,
+ "portId": "string",
+ "portScheduleId": "string",
"profile": {
"enabled": true,
"id": "string",
"iname": "string"
- }
+ },
+ "rstpEnabled": true,
+ "stickyMacAllowList": [
+ "string"
+ ],
+ "stickyMacAllowListLimit": 0,
+ "stormControlEnabled": true,
+ "stpGuard": "string",
+ "tags": [
+ "string"
+ ],
+ "type": "string",
+ "udld": "string",
+ "vlan": 0,
+ "voiceVlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_cycle.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_cycle.py
index a408ad69f..9739b0427 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_cycle.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_cycle.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices cycleDeviceSwitchPorts
+- name: Cisco Meraki documentation for switch cycleDeviceSwitchPorts
description: Complete reference of the cycleDeviceSwitchPorts API.
link: https://developer.cisco.com/meraki/api-v1/#!cycle-device-switch-ports
notes:
- SDK Method used are
- devices.Devices.cycle_device_switch_ports,
+ switch.Switch.cycle_device_switch_ports,
- Paths used are
post /devices/{serial}/switch/ports/cycle,
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_info.py
index 668e18e12..f890001ed 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_info.py
@@ -9,7 +9,9 @@ DOCUMENTATION = r"""
module: devices_switch_ports_info
short_description: Information module for devices _switch _ports
description:
+- Get all devices _switch _ports.
- Get devices _switch _ports by id.
+- List the switch ports for a switch.
- Return a switch port.
version_added: '2.16.0'
extends_documentation_fragment:
@@ -31,18 +33,48 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceSwitchPort
+- name: Cisco Meraki documentation for switch getDeviceSwitchPort
description: Complete reference of the getDeviceSwitchPort API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-port
+- name: Cisco Meraki documentation for switch getDeviceSwitchPorts
+ description: Complete reference of the getDeviceSwitchPorts API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-ports
notes:
- SDK Method used are
- devices.Devices.get_device_switch_port,
+ switch.Switch.get_device_switch_port,
+ switch.Switch.get_device_switch_ports,
- Paths used are
+ get /devices/{serial}/switch/ports,
get /devices/{serial}/switch/ports/{portId},
"""
EXAMPLES = r"""
+- name: Get all devices _switch _ports
+ cisco.meraki.devices_switch_ports_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ serial: string
+ register: result
+
- name: Get devices _switch _ports by id
cisco.meraki.devices_switch_ports_info:
meraki_api_key: "{{meraki_api_key}}"
@@ -77,44 +109,50 @@ meraki_response:
type: dict
sample: >
{
- "portId": "string",
- "name": "string",
- "tags": [
- "string"
- ],
- "enabled": true,
- "poeEnabled": true,
- "type": "string",
- "vlan": 0,
- "voiceVlan": 0,
+ "accessPolicyNumber": 0,
+ "accessPolicyType": "string",
+ "adaptivePolicyGroupId": "string",
"allowedVlans": "string",
+ "daiTrusted": true,
+ "enabled": true,
+ "flexibleStackingEnabled": true,
"isolationEnabled": true,
- "rstpEnabled": true,
- "stpGuard": "string",
"linkNegotiation": "string",
"linkNegotiationCapabilities": [
"string"
],
- "portScheduleId": "string",
- "udld": "string",
- "accessPolicyType": "string",
- "accessPolicyNumber": 0,
"macAllowList": [
"string"
],
- "stickyMacAllowList": [
- "string"
- ],
- "stickyMacAllowListLimit": 0,
- "stormControlEnabled": true,
- "adaptivePolicyGroupId": "string",
+ "mirror": {
+ "mode": "string"
+ },
+ "module": {
+ "model": "string"
+ },
+ "name": "string",
"peerSgtCapable": true,
- "flexibleStackingEnabled": true,
- "daiTrusted": true,
+ "poeEnabled": true,
+ "portId": "string",
+ "portScheduleId": "string",
"profile": {
"enabled": true,
"id": "string",
"iname": "string"
- }
+ },
+ "rstpEnabled": true,
+ "stickyMacAllowList": [
+ "string"
+ ],
+ "stickyMacAllowListLimit": 0,
+ "stormControlEnabled": true,
+ "stpGuard": "string",
+ "tags": [
+ "string"
+ ],
+ "type": "string",
+ "udld": "string",
+ "vlan": 0,
+ "voiceVlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_statuses_info.py
index 3d3c7964b..b85a401aa 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_statuses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_ports_statuses_info.py
@@ -38,12 +38,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceSwitchPortsStatuses
+- name: Cisco Meraki documentation for switch getDeviceSwitchPortsStatuses
description: Complete reference of the getDeviceSwitchPortsStatuses API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-ports-statuses
notes:
- SDK Method used are
- devices.Devices.get_device_switch_ports_statuses,
+ switch.Switch.get_device_switch_ports_statuses,
- Paths used are
get /devices/{serial}/switch/ports/statuses,
@@ -87,64 +87,69 @@ meraki_response:
sample: >
[
{
- "portId": "string",
- "enabled": true,
- "status": "string",
- "isUplink": true,
- "errors": [
- "string"
- ],
- "warnings": [
- "string"
- ],
- "speed": "string",
- "duplex": "string",
- "usageInKb": {
- "total": 0,
- "sent": 0,
- "recv": 0
- },
"cdp": {
- "systemName": "string",
- "platform": "string",
- "deviceId": "string",
- "portId": "string",
- "nativeVlan": 0,
"address": "string",
+ "capabilities": "string",
+ "deviceId": "string",
"managementAddress": "string",
+ "nativeVlan": 0,
+ "platform": "string",
+ "portId": "string",
+ "systemName": "string",
"version": "string",
- "vtpManagementDomain": "string",
- "capabilities": "string"
+ "vtpManagementDomain": "string"
},
+ "clientCount": 0,
+ "duplex": "string",
+ "enabled": true,
+ "errors": [
+ "string"
+ ],
+ "isUplink": true,
"lldp": {
- "systemName": "string",
- "systemDescription": "string",
"chassisId": "string",
- "portId": "string",
- "managementVlan": 0,
- "portVlan": 0,
"managementAddress": "string",
+ "managementVlan": 0,
"portDescription": "string",
- "systemCapabilities": "string"
+ "portId": "string",
+ "portVlan": 0,
+ "systemCapabilities": "string",
+ "systemDescription": "string",
+ "systemName": "string"
},
- "clientCount": 0,
+ "portId": "string",
"powerUsageInWh": 0,
- "trafficInKbps": {
- "total": 0,
- "sent": 0,
- "recv": 0
- },
"securePort": {
- "enabled": true,
"active": true,
"authenticationStatus": "string",
"configOverrides": {
+ "allowedVlans": "string",
"type": "string",
"vlan": 0,
- "voiceVlan": 0,
- "allowedVlans": "string"
- }
- }
+ "voiceVlan": 0
+ },
+ "enabled": true
+ },
+ "spanningTree": {
+ "statuses": [
+ "string"
+ ]
+ },
+ "speed": "string",
+ "status": "string",
+ "trafficInKbps": {
+ "recv": 0,
+ "sent": 0,
+ "total": 0
+ },
+ "usageInKb": {
+ "recv": 0,
+ "sent": 0,
+ "total": 0
+ },
+ "warnings": [
+ "string"
+ ]
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces.py
index 1a9d2d174..de05b3b3d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces.py
@@ -102,20 +102,20 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices createDeviceSwitchRoutingInterface
+- name: Cisco Meraki documentation for switch createDeviceSwitchRoutingInterface
description: Complete reference of the createDeviceSwitchRoutingInterface API.
link: https://developer.cisco.com/meraki/api-v1/#!create-device-switch-routing-interface
-- name: Cisco Meraki documentation for devices deleteDeviceSwitchRoutingInterface
+- name: Cisco Meraki documentation for switch deleteDeviceSwitchRoutingInterface
description: Complete reference of the deleteDeviceSwitchRoutingInterface API.
link: https://developer.cisco.com/meraki/api-v1/#!delete-device-switch-routing-interface
-- name: Cisco Meraki documentation for devices updateDeviceSwitchRoutingInterface
+- name: Cisco Meraki documentation for switch updateDeviceSwitchRoutingInterface
description: Complete reference of the updateDeviceSwitchRoutingInterface API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-switch-routing-interface
notes:
- SDK Method used are
- devices.Devices.create_device_switch_routing_interface,
- devices.Devices.delete_device_switch_routing_interface,
- devices.Devices.update_device_switch_routing_interface,
+ switch.Switch.create_device_switch_routing_interface,
+ switch.Switch.delete_device_switch_routing_interface,
+ switch.Switch.update_device_switch_routing_interface,
- Paths used are
post /devices/{serial}/switch/routing/interfaces,
@@ -168,7 +168,7 @@ EXAMPLES = r"""
subnet: 192.168.1.0/24
vlanId: 100
-- name: Update by id
+- name: Delete by id
cisco.meraki.devices_switch_routing_interfaces:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -190,30 +190,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- defaultGateway: 192.168.1.1
+ state: absent
interfaceId: string
- interfaceIp: 192.168.1.2
- ipv6:
- address: 1:2:3:4::1
- assignmentMode: static
- gateway: 1:2:3:4::2
- prefix: 1:2:3:4::/48
- multicastRouting: disabled
- name: L3 interface
- ospfSettings:
- area: '0'
- cost: 1
- isPassiveEnabled: true
- ospfV3:
- area: '1'
- cost: 2
- isPassiveEnabled: true
serial: string
- subnet: 192.168.1.0/24
- vlanId: 100
-- name: Delete by id
+- name: Update by id
cisco.meraki.devices_switch_routing_interfaces:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -235,9 +216,28 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ defaultGateway: 192.168.1.1
interfaceId: string
+ interfaceIp: 192.168.1.2
+ ipv6:
+ address: 1:2:3:4::1
+ assignmentMode: static
+ gateway: 1:2:3:4::2
+ prefix: 1:2:3:4::/48
+ multicastRouting: disabled
+ name: L3 interface
+ ospfSettings:
+ area: '0'
+ cost: 1
+ isPassiveEnabled: true
+ ospfV3:
+ area: '1'
+ cost: 2
+ isPassiveEnabled: true
serial: string
+ subnet: 192.168.1.0/24
+ vlanId: 100
"""
RETURN = r"""
@@ -247,13 +247,17 @@ meraki_response:
type: dict
sample: >
{
+ "defaultGateway": "string",
"interfaceId": "string",
- "name": "string",
- "subnet": "string",
"interfaceIp": "string",
+ "ipv6": {
+ "address": "string",
+ "assignmentMode": "string",
+ "gateway": "string",
+ "prefix": "string"
+ },
"multicastRouting": "string",
- "vlanId": 0,
- "defaultGateway": "string",
+ "name": "string",
"ospfSettings": {
"area": "string",
"cost": 0,
@@ -264,11 +268,7 @@ meraki_response:
"cost": 0,
"isPassiveEnabled": true
},
- "ipv6": {
- "assignmentMode": "string",
- "address": "string",
- "prefix": "string",
- "gateway": "string"
- }
+ "subnet": "string",
+ "vlanId": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp.py
index 84500631d..1b8fb6e0b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp.py
@@ -105,12 +105,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceSwitchRoutingInterfaceDhcp
+- name: Cisco Meraki documentation for switch updateDeviceSwitchRoutingInterfaceDhcp
description: Complete reference of the updateDeviceSwitchRoutingInterfaceDhcp API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-switch-routing-interface-dhcp
notes:
- SDK Method used are
- devices.Devices.update_device_switch_routing_interface_dhcp,
+ switch.Switch.update_device_switch_routing_interface_dhcp,
- Paths used are
put /devices/{serial}/switch/routing/interfaces/{interfaceId}/dhcp,
@@ -149,6 +149,8 @@ EXAMPLES = r"""
- code: '5'
type: text
value: five
+ dhcpRelayServerIps:
+ - 1.2.3.4
dnsCustomNameservers:
- 8.8.8.8, 8.8.4.4
dnsNameserversOption: custom
@@ -170,5 +172,39 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "bootFileName": "string",
+ "bootNextServer": "string",
+ "bootOptionsEnabled": true,
+ "dhcpLeaseTime": "string",
+ "dhcpMode": "string",
+ "dhcpOptions": [
+ {
+ "code": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dhcpRelayServerIps": [
+ "string"
+ ],
+ "dnsCustomNameservers": [
+ "string"
+ ],
+ "dnsNameserversOption": "string",
+ "fixedIpAssignments": [
+ {
+ "ip": "string",
+ "mac": "string",
+ "name": "string"
+ }
+ ],
+ "reservedIpRanges": [
+ {
+ "comment": "string",
+ "end": "string",
+ "start": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp_info.py
index 12f0758e5..b4cb02f4e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_dhcp_info.py
@@ -31,12 +31,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceSwitchRoutingInterfaceDhcp
+- name: Cisco Meraki documentation for switch getDeviceSwitchRoutingInterfaceDhcp
description: Complete reference of the getDeviceSwitchRoutingInterfaceDhcp API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-routing-interface-dhcp
notes:
- SDK Method used are
- devices.Devices.get_device_switch_routing_interface_dhcp,
+ switch.Switch.get_device_switch_routing_interface_dhcp,
- Paths used are
get /devices/{serial}/switch/routing/interfaces/{interfaceId}/dhcp,
@@ -75,6 +75,40 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "bootFileName": "string",
+ "bootNextServer": "string",
+ "bootOptionsEnabled": true,
+ "dhcpLeaseTime": "string",
+ "dhcpMode": "string",
+ "dhcpOptions": [
+ {
+ "code": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dhcpRelayServerIps": [
+ "string"
+ ],
+ "dnsCustomNameservers": [
+ "string"
+ ],
+ "dnsNameserversOption": "string",
+ "fixedIpAssignments": [
+ {
+ "ip": "string",
+ "mac": "string",
+ "name": "string"
+ }
+ ],
+ "reservedIpRanges": [
+ {
+ "comment": "string",
+ "end": "string",
+ "start": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_info.py
index 3797bc13c..697792d01 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_interfaces_info.py
@@ -33,16 +33,16 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceSwitchRoutingInterface
+- name: Cisco Meraki documentation for switch getDeviceSwitchRoutingInterface
description: Complete reference of the getDeviceSwitchRoutingInterface API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-routing-interface
-- name: Cisco Meraki documentation for devices getDeviceSwitchRoutingInterfaces
+- name: Cisco Meraki documentation for switch getDeviceSwitchRoutingInterfaces
description: Complete reference of the getDeviceSwitchRoutingInterfaces API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-routing-interfaces
notes:
- SDK Method used are
- devices.Devices.get_device_switch_routing_interface,
- devices.Devices.get_device_switch_routing_interfaces,
+ switch.Switch.get_device_switch_routing_interface,
+ switch.Switch.get_device_switch_routing_interfaces,
- Paths used are
get /devices/{serial}/switch/routing/interfaces,
@@ -109,13 +109,17 @@ meraki_response:
type: dict
sample: >
{
+ "defaultGateway": "string",
"interfaceId": "string",
- "name": "string",
- "subnet": "string",
"interfaceIp": "string",
+ "ipv6": {
+ "address": "string",
+ "assignmentMode": "string",
+ "gateway": "string",
+ "prefix": "string"
+ },
"multicastRouting": "string",
- "vlanId": 0,
- "defaultGateway": "string",
+ "name": "string",
"ospfSettings": {
"area": "string",
"cost": 0,
@@ -126,11 +130,7 @@ meraki_response:
"cost": 0,
"isPassiveEnabled": true
},
- "ipv6": {
- "assignmentMode": "string",
- "address": "string",
- "prefix": "string",
- "gateway": "string"
- }
+ "subnet": "string",
+ "vlanId": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes.py
index 88642d475..4393ddb56 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes.py
@@ -45,20 +45,20 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices createDeviceSwitchRoutingStaticRoute
+- name: Cisco Meraki documentation for switch createDeviceSwitchRoutingStaticRoute
description: Complete reference of the createDeviceSwitchRoutingStaticRoute API.
link: https://developer.cisco.com/meraki/api-v1/#!create-device-switch-routing-static-route
-- name: Cisco Meraki documentation for devices deleteDeviceSwitchRoutingStaticRoute
+- name: Cisco Meraki documentation for switch deleteDeviceSwitchRoutingStaticRoute
description: Complete reference of the deleteDeviceSwitchRoutingStaticRoute API.
link: https://developer.cisco.com/meraki/api-v1/#!delete-device-switch-routing-static-route
-- name: Cisco Meraki documentation for devices updateDeviceSwitchRoutingStaticRoute
+- name: Cisco Meraki documentation for switch updateDeviceSwitchRoutingStaticRoute
description: Complete reference of the updateDeviceSwitchRoutingStaticRoute API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-switch-routing-static-route
notes:
- SDK Method used are
- devices.Devices.create_device_switch_routing_static_route,
- devices.Devices.delete_device_switch_routing_static_route,
- devices.Devices.update_device_switch_routing_static_route,
+ switch.Switch.create_device_switch_routing_static_route,
+ switch.Switch.delete_device_switch_routing_static_route,
+ switch.Switch.update_device_switch_routing_static_route,
- Paths used are
post /devices/{serial}/switch/routing/staticRoutes,
@@ -97,7 +97,7 @@ EXAMPLES = r"""
serial: string
subnet: 192.168.1.0/24
-- name: Update by id
+- name: Delete by id
cisco.meraki.devices_switch_routing_static_routes:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -119,16 +119,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- advertiseViaOspfEnabled: false
- name: My route
- nextHopIp: 1.2.3.4
- preferOverOspfRoutesEnabled: false
+ state: absent
serial: string
staticRouteId: string
- subnet: 192.168.1.0/24
-- name: Delete by id
+- name: Update by id
cisco.meraki.devices_switch_routing_static_routes:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -150,9 +145,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ advertiseViaOspfEnabled: false
+ name: My route
+ nextHopIp: 1.2.3.4
+ preferOverOspfRoutesEnabled: false
serial: string
staticRouteId: string
+ subnet: 192.168.1.0/24
"""
RETURN = r"""
@@ -161,5 +161,12 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "advertiseViaOspfEnabled": true,
+ "name": "string",
+ "nextHopIp": "string",
+ "preferOverOspfRoutesEnabled": true,
+ "staticRouteId": "string",
+ "subnet": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes_info.py
index 2473a8989..d7611215e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_routing_static_routes_info.py
@@ -33,16 +33,16 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceSwitchRoutingStaticRoute
+- name: Cisco Meraki documentation for switch getDeviceSwitchRoutingStaticRoute
description: Complete reference of the getDeviceSwitchRoutingStaticRoute API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-routing-static-route
-- name: Cisco Meraki documentation for devices getDeviceSwitchRoutingStaticRoutes
+- name: Cisco Meraki documentation for switch getDeviceSwitchRoutingStaticRoutes
description: Complete reference of the getDeviceSwitchRoutingStaticRoutes API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-routing-static-routes
notes:
- SDK Method used are
- devices.Devices.get_device_switch_routing_static_route,
- devices.Devices.get_device_switch_routing_static_routes,
+ switch.Switch.get_device_switch_routing_static_route,
+ switch.Switch.get_device_switch_routing_static_routes,
- Paths used are
get /devices/{serial}/switch/routing/staticRoutes,
@@ -109,11 +109,11 @@ meraki_response:
type: dict
sample: >
{
- "staticRouteId": "string",
+ "advertiseViaOspfEnabled": true,
"name": "string",
- "subnet": "string",
"nextHopIp": "string",
- "advertiseViaOspfEnabled": true,
- "preferOverOspfRoutesEnabled": true
+ "preferOverOspfRoutesEnabled": true,
+ "staticRouteId": "string",
+ "subnet": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare.py
index 6fd5890f5..c386180fa 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare.py
@@ -31,12 +31,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceSwitchWarmSpare
+- name: Cisco Meraki documentation for switch updateDeviceSwitchWarmSpare
description: Complete reference of the updateDeviceSwitchWarmSpare API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-switch-warm-spare
notes:
- SDK Method used are
- devices.Devices.update_device_switch_warm_spare,
+ switch.Switch.update_device_switch_warm_spare,
- Paths used are
put /devices/{serial}/switch/warmSpare,
@@ -77,5 +77,9 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "enabled": true,
+ "primarySerial": "string",
+ "spareSerial": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare_info.py
index b3f525c38..a5474e874 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_switch_warm_spare_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceSwitchWarmSpare
+- name: Cisco Meraki documentation for switch getDeviceSwitchWarmSpare
description: Complete reference of the getDeviceSwitchWarmSpare API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-switch-warm-spare
notes:
- SDK Method used are
- devices.Devices.get_device_switch_warm_spare,
+ switch.Switch.get_device_switch_warm_spare,
- Paths used are
get /devices/{serial}/switch/warmSpare,
@@ -70,6 +70,10 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "enabled": true,
+ "primarySerial": "string",
+ "spareSerial": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_alternate_management_interface_ipv6.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_alternate_management_interface_ipv6.py
new file mode 100644
index 000000000..139085016
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_alternate_management_interface_ipv6.py
@@ -0,0 +1,125 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: devices_wireless_alternate_management_interface_ipv6
+short_description: Resource module for devices _wireless _alternatemanagementinterface _ipv6
+description:
+- Manage operation update of the resource devices _wireless _alternatemanagementinterface _ipv6.
+- Update alternate management interface IPv6 address.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ addresses:
+ description: Configured alternate management interface addresses.
+ elements: dict
+ suboptions:
+ address:
+ description: The IP address configured for the alternate management interface.
+ type: str
+ assignmentMode:
+ description: The type of address assignment. Either static or dynamic.
+ type: str
+ gateway:
+ description: The gateway address configured for the alternate managment interface.
+ type: str
+ nameservers:
+ description: The DNS servers settings for this address.
+ suboptions:
+ addresses:
+ description: Up to 2 nameserver addresses to use, ordered in priority from
+ highest to lowest priority.
+ elements: str
+ type: list
+ type: dict
+ prefix:
+ description: The IPv6 prefix length of the IPv6 interface. Required if IPv6
+ object is included.
+ type: str
+ protocol:
+ description: The IP protocol used for the address.
+ type: str
+ type: list
+ serial:
+ description: Serial path parameter.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless updateDeviceWirelessAlternateManagementInterfaceIpv6
+ description: Complete reference of the updateDeviceWirelessAlternateManagementInterfaceIpv6 API.
+ link: https://developer.cisco.com/meraki/api-v1/#!update-device-wireless-alternate-management-interface-ipv6
+notes:
+ - SDK Method used are
+ wireless.Wireless.update_device_wireless_alternate_management_interface_ipv6,
+
+ - Paths used are
+ put /devices/{serial}/wireless/alternateManagementInterface/ipv6,
+"""
+
+EXAMPLES = r"""
+- name: Update all
+ cisco.meraki.devices_wireless_alternate_management_interface_ipv6:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ addresses:
+ - address: 2001:db8:3c4d:15::1
+ assignmentMode: static
+ gateway: fe80:db8:c15:c0:d0c::10ca:1d02
+ nameservers:
+ addresses:
+ - 2001:db8:3c4d:15::1
+ - 2001:db8:3c4d:15::1
+ prefix: 2001:db8:3c4d:15::/64
+ protocol: ipv6
+ serial: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "addresses": [
+ {
+ "address": "string",
+ "assignmentMode": "string",
+ "gateway": "string",
+ "nameservers": {
+ "addresses": [
+ "string"
+ ]
+ },
+ "prefix": "string",
+ "protocol": "string"
+ }
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings.py
index c30f4f45a..49c532417 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings.py
@@ -35,12 +35,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceWirelessBluetoothSettings
+- name: Cisco Meraki documentation for wireless updateDeviceWirelessBluetoothSettings
description: Complete reference of the updateDeviceWirelessBluetoothSettings API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-wireless-bluetooth-settings
notes:
- SDK Method used are
- devices.Devices.update_device_wireless_bluetooth_settings,
+ wireless.Wireless.update_device_wireless_bluetooth_settings,
- Paths used are
put /devices/{serial}/wireless/bluetooth/settings,
@@ -83,8 +83,8 @@ meraki_response:
type: dict
sample: >
{
- "uuid": "string",
"major": 0,
- "minor": 0
+ "minor": 0,
+ "uuid": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings_info.py
index ee2d74bbb..34e538774 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_bluetooth_settings_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceWirelessBluetoothSettings
+- name: Cisco Meraki documentation for wireless getDeviceWirelessBluetoothSettings
description: Complete reference of the getDeviceWirelessBluetoothSettings API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-wireless-bluetooth-settings
notes:
- SDK Method used are
- devices.Devices.get_device_wireless_bluetooth_settings,
+ wireless.Wireless.get_device_wireless_bluetooth_settings,
- Paths used are
get /devices/{serial}/wireless/bluetooth/settings,
@@ -72,8 +72,8 @@ meraki_response:
type: dict
sample: >
{
- "uuid": "string",
"major": 0,
- "minor": 0
+ "minor": 0,
+ "uuid": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_connection_stats_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_connection_stats_info.py
index a580e3ed8..0beb65eb0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_connection_stats_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_connection_stats_info.py
@@ -111,13 +111,13 @@ meraki_response:
type: dict
sample: >
{
- "serial": "string",
"connectionStats": {
"assoc": 0,
"auth": 0,
"dhcp": 0,
"dns": 0,
"success": 0
- }
+ },
+ "serial": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_latency_stats_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_latency_stats_info.py
index 6689b3cc5..2c11d2f45 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_latency_stats_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_latency_stats_info.py
@@ -66,12 +66,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceWirelessLatencyStats
+- name: Cisco Meraki documentation for wireless getDeviceWirelessLatencyStats
description: Complete reference of the getDeviceWirelessLatencyStats API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-wireless-latency-stats
notes:
- SDK Method used are
- devices.Devices.get_device_wireless_latency_stats,
+ wireless.Wireless.get_device_wireless_latency_stats,
- Paths used are
get /devices/{serial}/wireless/latencyStats,
@@ -117,6 +117,31 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "latencyStats": {
+ "backgroundTraffic": {
+ "avg": 0,
+ "rawDistribution": {
+ "0": 0,
+ "1": 0,
+ "1024": 0,
+ "128": 0,
+ "16": 0,
+ "2": 0,
+ "2048": 0,
+ "256": 0,
+ "32": 0,
+ "4": 0,
+ "512": 0,
+ "64": 0,
+ "8": 0
+ }
+ },
+ "bestEffortTraffic": "string",
+ "videoTraffic": "string",
+ "voiceTraffic": "string"
+ },
+ "serial": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings.py
index fd4e1ce3b..57a5c01fe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings.py
@@ -60,12 +60,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices updateDeviceWirelessRadioSettings
+- name: Cisco Meraki documentation for wireless updateDeviceWirelessRadioSettings
description: Complete reference of the updateDeviceWirelessRadioSettings API.
link: https://developer.cisco.com/meraki/api-v1/#!update-device-wireless-radio-settings
notes:
- SDK Method used are
- devices.Devices.update_device_wireless_radio_settings,
+ wireless.Wireless.update_device_wireless_radio_settings,
- Paths used are
put /devices/{serial}/wireless/radio/settings,
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings_info.py
index b672510c2..0cbeb278b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_radio_settings_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceWirelessRadioSettings
+- name: Cisco Meraki documentation for wireless getDeviceWirelessRadioSettings
description: Complete reference of the getDeviceWirelessRadioSettings API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-wireless-radio-settings
notes:
- SDK Method used are
- devices.Devices.get_device_wireless_radio_settings,
+ wireless.Wireless.get_device_wireless_radio_settings,
- Paths used are
get /devices/{serial}/wireless/radio/settings,
@@ -70,6 +70,18 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "fiveGhzSettings": {
+ "channel": 0,
+ "channelWidth": 0,
+ "targetPower": 0
+ },
+ "rfProfileId": "string",
+ "serial": "string",
+ "twoFourGhzSettings": {
+ "channel": 0,
+ "targetPower": 0
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_status_info.py b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_status_info.py
index 196815d81..d4c67f4ad 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_status_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/devices_wireless_status_info.py
@@ -27,12 +27,12 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for devices getDeviceWirelessStatus
+- name: Cisco Meraki documentation for wireless getDeviceWirelessStatus
description: Complete reference of the getDeviceWirelessStatus API.
link: https://developer.cisco.com/meraki/api-v1/#!get-device-wireless-status
notes:
- SDK Method used are
- devices.Devices.get_device_wireless_status,
+ wireless.Wireless.get_device_wireless_status,
- Paths used are
get /devices/{serial}/wireless/status,
@@ -69,7 +69,21 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "band": "string",
+ "broadcasting": true,
+ "bssid": "string",
+ "channel": 0,
+ "channelWidth": "string",
+ "enabled": true,
+ "power": "string",
+ "ssidName": "string",
+ "ssidNumber": 0,
+ "visible": true
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks.py b/ansible_collections/cisco/meraki/plugins/modules/networks.py
index 3b1a7adb0..b81eead05 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks.py
@@ -58,20 +58,20 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for organizations,networks createOrganizationNetwork
+- name: Cisco Meraki documentation for networks createOrganizationNetwork
description: Complete reference of the createOrganizationNetwork API.
link: https://developer.cisco.com/meraki/api-v1/#!create-organization-network
-- name: Cisco Meraki documentation for organizations,networks deleteNetwork
+- name: Cisco Meraki documentation for networks deleteNetwork
description: Complete reference of the deleteNetwork API.
link: https://developer.cisco.com/meraki/api-v1/#!delete-network
-- name: Cisco Meraki documentation for organizations,networks updateNetwork
+- name: Cisco Meraki documentation for networks updateNetwork
description: Complete reference of the updateNetwork API.
link: https://developer.cisco.com/meraki/api-v1/#!update-network
notes:
- SDK Method used are
- organizationsnetworks.Organizationsnetworks.create_organization_network,
- organizationsnetworks.Organizationsnetworks.delete_network,
- organizationsnetworks.Organizationsnetworks.update_network,
+ networks.Networks.create_organization_network,
+ networks.Networks.delete_network,
+ networks.Networks.update_network,
- Paths used are
post /organizations/{organizationId}/networks,
@@ -80,7 +80,7 @@ notes:
"""
EXAMPLES = r"""
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -102,17 +102,10 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- enrollmentString: my-enrollment-string
- name: Main Office
+ state: absent
networkId: string
- notes: Additional description of the network
- tags:
- - tag1
- - tag2
- timeZone: America/Los_Angeles
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -134,8 +127,15 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ enrollmentString: my-enrollment-string
+ name: Main Office
networkId: string
+ notes: Additional description of the network
+ tags:
+ - tag1
+ - tag2
+ timeZone: America/Los_Angeles
- name: Create
cisco.meraki.networks:
@@ -181,19 +181,19 @@ meraki_response:
type: dict
sample: >
{
+ "enrollmentString": "string",
"id": "string",
- "organizationId": "string",
+ "isBoundToConfigTemplate": true,
"name": "string",
+ "notes": "string",
+ "organizationId": "string",
"productTypes": [
"string"
],
- "timeZone": "string",
"tags": [
"string"
],
- "enrollmentString": "string",
- "url": "string",
- "notes": "string",
- "isBoundToConfigTemplate": true
+ "timeZone": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_history_info.py
index 6c9df8ebd..f1fba6042 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_history_info.py
@@ -98,12 +98,9 @@ meraki_response:
sample: >
[
{
- "occurredAt": "string",
- "alertTypeId": "string",
+ "alertData": {},
"alertType": "string",
- "device": {
- "serial": "string"
- },
+ "alertTypeId": "string",
"destinations": {
"email": {
"sentAt": "string"
@@ -118,7 +115,10 @@ meraki_response:
"sentAt": "string"
}
},
- "alertData": {}
+ "device": {
+ "serial": "string"
+ },
+ "occurredAt": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings.py b/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings.py
index 7e317f727..b00f76840 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings.py
@@ -59,7 +59,7 @@ options:
description: If true, then all network admins will receive emails.
type: bool
emails:
- description: A list of emails that will recieve the alert(s).
+ description: A list of emails that will receive the alert(s).
elements: str
type: list
httpServerIds:
@@ -71,6 +71,18 @@ options:
server configured for this network.
type: bool
type: dict
+ muting:
+ description: Mute alerts under certain conditions.
+ suboptions:
+ byPortSchedules:
+ description: Mute wireless unreachable alerts based on switch port schedules.
+ suboptions:
+ enabled:
+ description: If true, then wireless unreachable alerts will be muted when
+ caused by a port schedule.
+ type: bool
+ type: dict
+ type: dict
networkId:
description: NetworkId path parameter. Network ID.
type: str
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings_info.py
index 07032923b..69ed2c2c2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_alerts_settings_info.py
@@ -70,6 +70,36 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "alerts": [
+ {
+ "alertDestinations": {
+ "allAdmins": true,
+ "emails": [
+ "string"
+ ],
+ "httpServerIds": [
+ "string"
+ ],
+ "snmp": true
+ },
+ "enabled": true,
+ "filters": {
+ "timeout": 0
+ },
+ "type": "string"
+ }
+ ],
+ "defaultDestinations": {
+ "allAdmins": true,
+ "emails": [
+ "string"
+ ],
+ "httpServerIds": [
+ "string"
+ ],
+ "snmp": true
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_connectivity_monitoring_destinations_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_connectivity_monitoring_destinations_info.py
index 859b797ad..fd8a50eb0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_connectivity_monitoring_destinations_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_connectivity_monitoring_destinations_info.py
@@ -69,7 +69,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "default": true,
+ "description": "string",
+ "ip": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_categories_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_categories_info.py
index 845329185..6f91d2a13 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_categories_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_categories_info.py
@@ -69,7 +69,13 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_info.py
index d63f8b86f..7c3ac5109 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_content_filtering_info.py
@@ -70,6 +70,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "allowedUrlPatterns": [
+ "string"
+ ],
+ "blockedUrlCategories": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "blockedUrlPatterns": [
+ "string"
+ ],
+ "urlCategoryListSize": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_cellular_firewall_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_cellular_firewall_rules_info.py
index 1c2da7010..092140ef2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_cellular_firewall_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_cellular_firewall_rules_info.py
@@ -69,7 +69,19 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string",
+ "srcCidr": "string",
+ "srcPort": "string",
+ "syslogEnabled": true
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services.py
index 173b7f42a..3707507c3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services.py
@@ -85,5 +85,11 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "access": "string",
+ "allowedIps": [
+ "string"
+ ],
+ "service": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services_info.py
index e432299d4..bcd806d71 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_firewalled_services_info.py
@@ -75,6 +75,12 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "access": "string",
+ "allowedIps": [
+ "string"
+ ],
+ "service": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules.py
index dcfc8ad1a..8002caf5b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules.py
@@ -107,6 +107,7 @@ EXAMPLES = r"""
srcCidr: Any
srcPort: Any
syslogEnabled: false
+ syslogDefaultRule: true
"""
RETURN = r"""
@@ -115,5 +116,19 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "rules": [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string",
+ "srcCidr": "string",
+ "srcPort": "string",
+ "syslogEnabled": true
+ }
+ ],
+ "syslogDefaultRule": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules_info.py
index f08a8082d..66fcfe80a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_inbound_firewall_rules_info.py
@@ -70,6 +70,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "rules": [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string",
+ "srcCidr": "string",
+ "srcPort": "string",
+ "syslogEnabled": true
+ }
+ ],
+ "syslogDefaultRule": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l3_firewall_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l3_firewall_rules_info.py
index de1148922..961c86455 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l3_firewall_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l3_firewall_rules_info.py
@@ -69,7 +69,19 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string",
+ "srcCidr": "string",
+ "srcPort": "string",
+ "syslogEnabled": true
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_application_categories_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_application_categories_info.py
index 5ff02017d..5fe611e5c 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_application_categories_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_application_categories_info.py
@@ -69,7 +69,19 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "applications": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "id": "string",
+ "name": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_info.py
index eeb013d18..dcc39ca0d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_l7_firewall_rules_info.py
@@ -69,7 +69,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "policy": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_many_nat_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_many_nat_rules_info.py
index 9c2dc9618..0f9772c5b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_many_nat_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_many_nat_rules_info.py
@@ -69,7 +69,25 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "portRules": [
+ {
+ "allowedIps": [
+ "string"
+ ],
+ "localIp": "string",
+ "localPort": "string",
+ "name": "string",
+ "protocol": "string",
+ "publicPort": "string"
+ }
+ ],
+ "publicIp": "string",
+ "uplink": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_one_nat_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_one_nat_rules_info.py
index c27fdfe0a..d5ec00afe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_one_nat_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_one_to_one_nat_rules_info.py
@@ -69,7 +69,26 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "allowedInbound": [
+ {
+ "allowedIps": [
+ "string"
+ ],
+ "destinationPorts": [
+ "string"
+ ],
+ "protocol": "string"
+ }
+ ],
+ "lanIp": "string",
+ "name": "string",
+ "publicIp": "string",
+ "uplink": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_port_forwarding_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_port_forwarding_rules_info.py
index df2070a01..fdbbdb318 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_port_forwarding_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_port_forwarding_rules_info.py
@@ -69,7 +69,20 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "allowedIps": [
+ "string"
+ ],
+ "lanIp": "string",
+ "localPort": "string",
+ "name": "string",
+ "protocol": "string",
+ "publicPort": "string",
+ "uplink": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_settings_info.py
index f0c04a984..fdd74c905 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_firewall_settings_info.py
@@ -70,6 +70,10 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "ipSourceGuard": {
+ "mode": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports.py
index f1f4acf6e..2701431f3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports.py
@@ -102,12 +102,12 @@ meraki_response:
type: dict
sample: >
{
- "number": 0,
+ "accessPolicy": "string",
+ "allowedVlans": "string",
+ "dropUntaggedTraffic": true,
"enabled": true,
+ "number": 0,
"type": "string",
- "dropUntaggedTraffic": true,
- "vlan": 0,
- "allowedVlans": "string",
- "accessPolicy": "string"
+ "vlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports_info.py
index edbf8b584..3fbe13138 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ports_info.py
@@ -109,12 +109,12 @@ meraki_response:
type: dict
sample: >
{
- "number": 0,
+ "accessPolicy": "string",
+ "allowedVlans": "string",
+ "dropUntaggedTraffic": true,
"enabled": true,
+ "number": 0,
"type": "string",
- "dropUntaggedTraffic": true,
- "vlan": 0,
- "allowedVlans": "string",
- "accessPolicy": "string"
+ "vlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics.py
index 0af536fa5..503495828 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics.py
@@ -98,7 +98,7 @@ EXAMPLES = r"""
type: internet
prefix: 2001:db8:3c4d:15::/64
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_appliance_prefixes_delegated_statics:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -120,17 +120,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- description: Prefix on WAN 1 of Long Island Office network
+ state: absent
networkId: string
- origin:
- interfaces:
- - wan1
- type: internet
- prefix: 2001:db8:3c4d:15::/64
staticDelegatedPrefixId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_appliance_prefixes_delegated_statics:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -152,8 +146,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ description: Prefix on WAN 1 of Long Island Office network
networkId: string
+ origin:
+ interfaces:
+ - wan1
+ type: internet
+ prefix: 2001:db8:3c4d:15::/64
staticDelegatedPrefixId: string
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics_info.py
index bf28378fc..829708d54 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_prefixes_delegated_statics_info.py
@@ -109,16 +109,16 @@ meraki_response:
type: dict
sample: >
{
- "staticDelegatedPrefixId": "string",
- "prefix": "string",
+ "createdAt": "string",
+ "description": "string",
"origin": {
- "type": "string",
"interfaces": [
"string"
- ]
+ ],
+ "type": "string"
},
- "description": "string",
- "createdAt": "string",
+ "prefix": "string",
+ "staticDelegatedPrefixId": "string",
"updatedAt": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles.py
new file mode 100644
index 000000000..52178c6e6
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles.py
@@ -0,0 +1,199 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_appliance_rf_profiles
+short_description: Resource module for networks _appliance _rfprofiles
+description:
+- Manage operations create, update and delete of the resource networks _appliance _rfprofiles.
+- Creates new RF profile for this network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ fiveGhzSettings:
+ description: Settings related to 5Ghz band.
+ suboptions:
+ axEnabled:
+ description: Determines whether ax radio on 5Ghz band is on or off. Can be either
+ true or false. If false, we highly recommend disabling band steering. Defaults
+ to true.
+ type: bool
+ minBitrate:
+ description: Sets min bitrate (Mbps) of 5Ghz band. Can be one of '6', '9', '12',
+ '18', '24', '36', '48' or '54'. Defaults to 12.
+ type: int
+ type: dict
+ name:
+ description: The name of the new profile. Must be unique. This param is required
+ on creation.
+ type: str
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ perSsidSettings:
+ description: Per-SSID radio settings by number.
+ suboptions:
+ '1':
+ description: Settings for SSID 1.
+ suboptions:
+ bandOperationMode:
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
+ type: str
+ bandSteeringEnabled:
+ description: Steers client to most open band between 2.4 GHz and 5 GHz.
+ Can be either true or false.
+ type: bool
+ type: dict
+ '2':
+ description: Settings for SSID 2.
+ suboptions:
+ bandOperationMode:
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
+ type: str
+ bandSteeringEnabled:
+ description: Steers client to most open band between 2.4 GHz and 5 GHz.
+ Can be either true or false.
+ type: bool
+ type: dict
+ '3':
+ description: Settings for SSID 3.
+ suboptions:
+ bandOperationMode:
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
+ type: str
+ bandSteeringEnabled:
+ description: Steers client to most open band between 2.4 GHz and 5 GHz.
+ Can be either true or false.
+ type: bool
+ type: dict
+ '4':
+ description: Settings for SSID 4.
+ suboptions:
+ bandOperationMode:
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
+ type: str
+ bandSteeringEnabled:
+ description: Steers client to most open band between 2.4 GHz and 5 GHz.
+ Can be either true or false.
+ type: bool
+ type: dict
+ type: dict
+ twoFourGhzSettings:
+ description: Settings related to 2.4Ghz band.
+ suboptions:
+ axEnabled:
+ description: Determines whether ax radio on 2.4Ghz band is on or off. Can be
+ either true or false. If false, we highly recommend disabling band steering.
+ Defaults to true.
+ type: bool
+ minBitrate:
+ description: Sets min bitrate (Mbps) of 2.4Ghz band. Can be one of '1', '2',
+ '5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'. Defaults to 11.
+ type: float
+ type: dict
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance createNetworkApplianceRfProfile
+ description: Complete reference of the createNetworkApplianceRfProfile API.
+ link: https://developer.cisco.com/meraki/api-v1/#!create-network-appliance-rf-profile
+notes:
+ - SDK Method used are
+ appliance.Appliance.create_network_appliance_rf_profile,
+
+ - Paths used are
+ post /networks/{networkId}/appliance/rfProfiles,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_appliance_rf_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ fiveGhzSettings:
+ axEnabled: true
+ minBitrate: 48
+ name: MX RF Profile
+ networkId: string
+ perSsidSettings:
+ '1':
+ bandOperationMode: dual
+ bandSteeringEnabled: true
+ '2':
+ bandOperationMode: dual
+ bandSteeringEnabled: true
+ '3':
+ bandOperationMode: dual
+ bandSteeringEnabled: true
+ '4':
+ bandOperationMode: dual
+ bandSteeringEnabled: true
+ twoFourGhzSettings:
+ axEnabled: true
+ minBitrate: 12.0
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "fiveGhzSettings": {
+ "axEnabled": true,
+ "minBitrate": 0
+ },
+ "id": "string",
+ "name": "string",
+ "networkId": "string",
+ "perSsidSettings": {
+ "1": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ },
+ "2": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ },
+ "3": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ },
+ "4": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ }
+ },
+ "twoFourGhzSettings": {
+ "axEnabled": true,
+ "minBitrate": 0
+ }
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles_info.py
new file mode 100644
index 000000000..8826509f0
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_rf_profiles_info.py
@@ -0,0 +1,108 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_appliance_rf_profiles_info
+short_description: Information module for networks _appliance _rfprofiles
+description:
+- Get all networks _appliance _rfprofiles.
+- List the RF profiles for this network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ networkId:
+ description:
+ - NetworkId path parameter. Network ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance getNetworkApplianceRfProfiles
+ description: Complete reference of the getNetworkApplianceRfProfiles API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-network-appliance-rf-profiles
+notes:
+ - SDK Method used are
+ appliance.Appliance.get_network_appliance_rf_profiles,
+
+ - Paths used are
+ get /networks/{networkId}/appliance/rfProfiles,
+"""
+
+EXAMPLES = r"""
+- name: Get all networks _appliance _rfprofiles
+ cisco.meraki.networks_appliance_rf_profiles_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "fiveGhzSettings": {
+ "axEnabled": true,
+ "minBitrate": 0
+ },
+ "id": "string",
+ "name": "string",
+ "networkId": "string",
+ "perSsidSettings": {
+ "1": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ },
+ "2": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ },
+ "3": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ },
+ "4": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true
+ }
+ },
+ "twoFourGhzSettings": {
+ "axEnabled": true,
+ "minBitrate": 0
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion.py
index 1dc684761..7c3b4aa6f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion.py
@@ -108,5 +108,17 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "idsRulesets": "string",
+ "mode": "string",
+ "protectedNetworks": {
+ "excludedCidr": [
+ "string"
+ ],
+ "includedCidr": [
+ "string"
+ ],
+ "useDefault": true
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion_info.py
index 9ff5173ff..b08270d2a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_intrusion_info.py
@@ -70,6 +70,18 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "idsRulesets": "string",
+ "mode": "string",
+ "protectedNetworks": {
+ "excludedCidr": [
+ "string"
+ ],
+ "includedCidr": [
+ "string"
+ ],
+ "useDefault": true
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware.py
index 50344af2c..90247f131 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware.py
@@ -91,8 +91,6 @@ EXAMPLES = r"""
- comment: allow ZIP file
sha256: e82c5f7d75004727e1f3b94426b9a11c8bc4c312a9170ac9a73abace40aef503
allowedUrls:
- - comment: allow example.org
- url: example.org
- comment: allow help.com.au
url: help.com.au
mode: enabled
@@ -105,5 +103,19 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "allowedFiles": [
+ {
+ "comment": "string",
+ "sha256": "string"
+ }
+ ],
+ "allowedUrls": [
+ {
+ "comment": "string",
+ "url": "string"
+ }
+ ],
+ "mode": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware_info.py
index f3bd19640..272bbcd85 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_security_malware_info.py
@@ -70,6 +70,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "allowedFiles": [
+ {
+ "comment": "string",
+ "sha256": "string"
+ }
+ ],
+ "allowedUrls": [
+ {
+ "comment": "string",
+ "url": "string"
+ }
+ ],
+ "mode": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan.py
index 993f07768..ae5ab8e48 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan.py
@@ -129,26 +129,26 @@ meraki_response:
type: dict
sample: >
{
- "subnet": "string",
"applianceIp": "string",
- "mandatoryDhcp": {
- "enabled": true
- },
"ipv6": {
"enabled": true,
"prefixAssignments": [
{
"autonomous": true,
- "staticPrefix": "string",
- "staticApplianceIp6": "string",
"origin": {
- "type": "string",
"interfaces": [
"string"
- ]
- }
+ ],
+ "type": "string"
+ },
+ "staticApplianceIp6": "string",
+ "staticPrefix": "string"
}
]
- }
+ },
+ "mandatoryDhcp": {
+ "enabled": true
+ },
+ "subnet": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan_info.py
index a6261b106..7582d6147 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_single_lan_info.py
@@ -72,26 +72,26 @@ meraki_response:
type: dict
sample: >
{
- "subnet": "string",
"applianceIp": "string",
- "mandatoryDhcp": {
- "enabled": true
- },
"ipv6": {
"enabled": true,
"prefixAssignments": [
{
"autonomous": true,
- "staticPrefix": "string",
- "staticApplianceIp6": "string",
"origin": {
- "type": "string",
"interfaces": [
"string"
- ]
- }
+ ],
+ "type": "string"
+ },
+ "staticApplianceIp6": "string",
+ "staticPrefix": "string"
}
]
- }
+ },
+ "mandatoryDhcp": {
+ "enabled": true
+ },
+ "subnet": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids.py
index 5e9273f81..26aa0602d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids.py
@@ -33,6 +33,16 @@ options:
description: Enable DCHP Enforced Deauthentication on the SSID.
type: bool
type: dict
+ dot11w:
+ description: The current setting for Protected Management Frames (802.11w).
+ suboptions:
+ enabled:
+ description: Whether 802.11w is enabled or not.
+ type: bool
+ required:
+ description: (Optional) Whether 802.11w is required or not.
+ type: bool
+ type: dict
enabled:
description: Whether or not the SSID is enabled.
type: bool
@@ -120,6 +130,9 @@ EXAMPLES = r"""
defaultVlanId: 1
dhcpEnforcedDeauthentication:
enabled: true
+ dot11w:
+ enabled: true
+ required: true
enabled: true
encryptionMode: wpa
name: My SSID
@@ -141,19 +154,19 @@ meraki_response:
type: dict
sample: >
{
- "number": 0,
- "name": "string",
- "enabled": true,
- "defaultVlanId": 0,
"authMode": "string",
+ "defaultVlanId": 0,
+ "enabled": true,
+ "encryptionMode": "string",
+ "name": "string",
+ "number": 0,
"radiusServers": [
{
"host": "string",
"port": 0
}
],
- "encryptionMode": "string",
- "wpaEncryptionMode": "string",
- "visible": true
+ "visible": true,
+ "wpaEncryptionMode": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids_info.py
index 912d5d1fb..86d6d7307 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_ssids_info.py
@@ -109,19 +109,19 @@ meraki_response:
type: dict
sample: >
{
- "number": 0,
- "name": "string",
- "enabled": true,
- "defaultVlanId": 0,
"authMode": "string",
+ "defaultVlanId": 0,
+ "enabled": true,
+ "encryptionMode": "string",
+ "name": "string",
+ "number": 0,
"radiusServers": [
{
"host": "string",
"port": 0
}
],
- "encryptionMode": "string",
- "wpaEncryptionMode": "string",
- "visible": true
+ "visible": true,
+ "wpaEncryptionMode": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_custom_performance_classes.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_custom_performance_classes.py
index a1913416a..63324ba6c 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_custom_performance_classes.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_custom_performance_classes.py
@@ -82,5 +82,11 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "customPerformanceClassId": "string",
+ "maxJitter": 0,
+ "maxLatency": 0,
+ "maxLossPercentage": 0,
+ "name": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_info.py
index ff936ddae..e929508ae 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_info.py
@@ -70,6 +70,9 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "limitDown": 0,
+ "limitUp": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_rules_info.py
index c691a5aba..4bb9e3826 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_rules_info.py
@@ -70,6 +70,27 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "defaultRulesEnabled": true,
+ "rules": [
+ {
+ "definitions": [
+ {
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dscpTagValue": 0,
+ "perClientBandwidthLimits": {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "settings": "string"
+ },
+ "priority": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth.py
index 6a516b4a0..685dcd409 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth.py
@@ -101,8 +101,8 @@ EXAMPLES = r"""
state: present
bandwidthLimits:
cellular:
- limitDown: 51200
- limitUp: 51200
+ limitDown: 1000000
+ limitUp: 1000000
wan1:
limitDown: 1000000
limitUp: 1000000
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py
index 6d79cb2b2..088766c6f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_bandwidth_info.py
@@ -75,17 +75,17 @@ meraki_response:
type: dict
sample: >
{
+ "cellular": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
"wan1": {
- "limitUp": 0,
- "limitDown": 0
+ "limitDown": 0,
+ "limitUp": 0
},
"wan2": {
- "limitUp": 0,
- "limitDown": 0
- },
- "cellular": {
- "limitUp": 0,
- "limitDown": 0
+ "limitDown": 0,
+ "limitUp": 0
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py
index 1c89f8150..627405c95 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection.py
@@ -301,68 +301,68 @@ meraki_response:
{
"activeActiveAutoVpnEnabled": true,
"defaultUplink": "string",
- "loadBalancingEnabled": true,
"failoverAndFailback": {
"immediate": {
"enabled": true
}
},
- "wanTrafficUplinkPreferences": [
+ "loadBalancingEnabled": true,
+ "vpnTrafficUplinkPreferences": [
{
+ "failOverCriterion": "string",
+ "performanceClass": {
+ "builtinPerformanceClassName": "string",
+ "customPerformanceClassId": "string",
+ "type": "string"
+ },
+ "preferredUplink": "string",
"trafficFilters": [
{
"type": "string",
"value": {
+ "destination": {
+ "cidr": "string",
+ "fqdn": "string",
+ "host": 0,
+ "network": "string",
+ "port": "string",
+ "vlan": 0
+ },
+ "id": "string",
"protocol": "string",
"source": {
- "port": "string",
"cidr": "string",
- "vlan": 0,
- "host": 0
- },
- "destination": {
+ "host": 0,
+ "network": "string",
"port": "string",
- "cidr": "string"
+ "vlan": 0
}
}
}
- ],
- "preferredUplink": "string"
+ ]
}
],
- "vpnTrafficUplinkPreferences": [
+ "wanTrafficUplinkPreferences": [
{
+ "preferredUplink": "string",
"trafficFilters": [
{
"type": "string",
"value": {
- "id": "string",
- "protocol": "string",
- "source": {
- "port": "string",
+ "destination": {
"cidr": "string",
- "network": "string",
- "vlan": 0,
- "host": 0
+ "port": "string"
},
- "destination": {
- "port": "string",
+ "protocol": "string",
+ "source": {
"cidr": "string",
- "network": "string",
- "vlan": 0,
"host": 0,
- "fqdn": "string"
+ "port": "string",
+ "vlan": 0
}
}
}
- ],
- "preferredUplink": "string",
- "failOverCriterion": "string",
- "performanceClass": {
- "type": "string",
- "builtinPerformanceClassName": "string",
- "customPerformanceClassId": "string"
- }
+ ]
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py
index 5041d31b4..7194ca460 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_uplink_selection_info.py
@@ -74,68 +74,68 @@ meraki_response:
{
"activeActiveAutoVpnEnabled": true,
"defaultUplink": "string",
- "loadBalancingEnabled": true,
"failoverAndFailback": {
"immediate": {
"enabled": true
}
},
- "wanTrafficUplinkPreferences": [
+ "loadBalancingEnabled": true,
+ "vpnTrafficUplinkPreferences": [
{
+ "failOverCriterion": "string",
+ "performanceClass": {
+ "builtinPerformanceClassName": "string",
+ "customPerformanceClassId": "string",
+ "type": "string"
+ },
+ "preferredUplink": "string",
"trafficFilters": [
{
"type": "string",
"value": {
+ "destination": {
+ "cidr": "string",
+ "fqdn": "string",
+ "host": 0,
+ "network": "string",
+ "port": "string",
+ "vlan": 0
+ },
+ "id": "string",
"protocol": "string",
"source": {
- "port": "string",
"cidr": "string",
- "vlan": 0,
- "host": 0
- },
- "destination": {
+ "host": 0,
+ "network": "string",
"port": "string",
- "cidr": "string"
+ "vlan": 0
}
}
}
- ],
- "preferredUplink": "string"
+ ]
}
],
- "vpnTrafficUplinkPreferences": [
+ "wanTrafficUplinkPreferences": [
{
+ "preferredUplink": "string",
"trafficFilters": [
{
"type": "string",
"value": {
- "id": "string",
- "protocol": "string",
- "source": {
- "port": "string",
+ "destination": {
"cidr": "string",
- "network": "string",
- "vlan": 0,
- "host": 0
+ "port": "string"
},
- "destination": {
- "port": "string",
+ "protocol": "string",
+ "source": {
"cidr": "string",
- "network": "string",
- "vlan": 0,
"host": 0,
- "fqdn": "string"
+ "port": "string",
+ "vlan": 0
}
}
}
- ],
- "preferredUplink": "string",
- "failOverCriterion": "string",
- "performanceClass": {
- "type": "string",
- "builtinPerformanceClassName": "string",
- "customPerformanceClassId": "string"
- }
+ ]
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_vpn_exclusions.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_vpn_exclusions.py
new file mode 100644
index 000000000..cc338979b
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_traffic_shaping_vpn_exclusions.py
@@ -0,0 +1,119 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_appliance_traffic_shaping_vpn_exclusions
+short_description: Resource module for networks _appliance _trafficshaping _vpnexclusions
+description:
+- Manage operation update of the resource networks _appliance _trafficshaping _vpnexclusions.
+- Update VPN exclusion rules for an MX network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ custom:
+ description: Custom VPN exclusion rules. Pass an empty array to clear existing rules.
+ elements: dict
+ suboptions:
+ destination:
+ description: Destination address; hostname required for DNS, IPv4 otherwise.
+ type: str
+ port:
+ description: Destination port.
+ type: str
+ protocol:
+ description: Protocol.
+ type: str
+ type: list
+ majorApplications:
+ description: Major Application based VPN exclusion rules. Pass an empty array to
+ clear existing rules.
+ elements: dict
+ suboptions:
+ id:
+ description: Application's Meraki ID.
+ type: str
+ name:
+ description: Application's name.
+ type: str
+ type: list
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance updateNetworkApplianceTrafficShapingVpnExclusions
+ description: Complete reference of the updateNetworkApplianceTrafficShapingVpnExclusions API.
+ link: https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-traffic-shaping-vpn-exclusions
+notes:
+ - SDK Method used are
+ appliance.Appliance.update_network_appliance_traffic_shaping_vpn_exclusions,
+
+ - Paths used are
+ put /networks/{networkId}/appliance/trafficShaping/vpnExclusions,
+"""
+
+EXAMPLES = r"""
+- name: Update all
+ cisco.meraki.networks_appliance_traffic_shaping_vpn_exclusions:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ custom:
+ - destination: 192.168.3.0/24
+ port: '8000'
+ protocol: tcp
+ majorApplications:
+ - id: meraki:vpnExclusion/application/2
+ name: Office 365 Sharepoint
+ networkId: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "custom": [
+ {
+ "destination": "string",
+ "port": "string",
+ "protocol": "string"
+ }
+ ],
+ "majorApplications": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "networkId": "string",
+ "networkName": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans.py
index 1f7c9cf27..0e0212dbd 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans.py
@@ -230,6 +230,32 @@ EXAMPLES = r"""
subnet: 192.168.1.0/24
templateVlanType: same
+- name: Delete by id
+ cisco.meraki.networks_appliance_vlans:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ networkId: string
+ vlanId: string
+
- name: Update by id
cisco.meraki.networks_appliance_vlans:
meraki_api_key: "{{meraki_api_key}}"
@@ -298,32 +324,6 @@ EXAMPLES = r"""
vlanId: string
vpnNatSubnet: 192.168.1.0/24
-- name: Delete by id
- cisco.meraki.networks_appliance_vlans:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- networkId: string
- vlanId: string
-
"""
RETURN = r"""
meraki_response:
@@ -332,33 +332,33 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "interfaceId": "string",
- "name": "string",
- "subnet": "string",
"applianceIp": "string",
- "groupPolicyId": "string",
- "templateVlanType": "string",
"cidr": "string",
- "mask": 0,
- "mandatoryDhcp": {
- "enabled": true
- },
+ "groupPolicyId": "string",
+ "id": "string",
+ "interfaceId": "string",
"ipv6": {
"enabled": true,
"prefixAssignments": [
{
"autonomous": true,
- "staticPrefix": "string",
- "staticApplianceIp6": "string",
"origin": {
- "type": "string",
"interfaces": [
"string"
- ]
- }
+ ],
+ "type": "string"
+ },
+ "staticApplianceIp6": "string",
+ "staticPrefix": "string"
}
]
- }
+ },
+ "mandatoryDhcp": {
+ "enabled": true
+ },
+ "mask": 0,
+ "name": "string",
+ "subnet": "string",
+ "templateVlanType": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_info.py
index 015566a3c..6274223e3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_info.py
@@ -109,32 +109,13 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "interfaceId": "string",
- "name": "string",
- "subnet": "string",
"applianceIp": "string",
- "groupPolicyId": "string",
- "templateVlanType": "string",
"cidr": "string",
- "mask": 0,
- "dhcpRelayServerIps": [
- "string"
- ],
+ "dhcpBootFilename": "string",
+ "dhcpBootNextServer": "string",
+ "dhcpBootOptionsEnabled": true,
"dhcpHandling": "string",
"dhcpLeaseTime": "string",
- "dhcpBootOptionsEnabled": true,
- "dhcpBootNextServer": "string",
- "dhcpBootFilename": "string",
- "fixedIpAssignments": {},
- "reservedIpRanges": [
- {
- "start": "string",
- "end": "string",
- "comment": "string"
- }
- ],
- "dnsNameservers": "string",
"dhcpOptions": [
{
"code": "string",
@@ -142,25 +123,44 @@ meraki_response:
"value": "string"
}
],
- "vpnNatSubnet": "string",
- "mandatoryDhcp": {
- "enabled": true
- },
+ "dhcpRelayServerIps": [
+ "string"
+ ],
+ "dnsNameservers": "string",
+ "fixedIpAssignments": {},
+ "groupPolicyId": "string",
+ "id": "string",
+ "interfaceId": "string",
"ipv6": {
"enabled": true,
"prefixAssignments": [
{
"autonomous": true,
- "staticPrefix": "string",
- "staticApplianceIp6": "string",
"origin": {
- "type": "string",
"interfaces": [
"string"
- ]
- }
+ ],
+ "type": "string"
+ },
+ "staticApplianceIp6": "string",
+ "staticPrefix": "string"
}
]
- }
+ },
+ "mandatoryDhcp": {
+ "enabled": true
+ },
+ "mask": 0,
+ "name": "string",
+ "reservedIpRanges": [
+ {
+ "comment": "string",
+ "end": "string",
+ "start": "string"
+ }
+ ],
+ "subnet": "string",
+ "templateVlanType": "string",
+ "vpnNatSubnet": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings.py
index f5bd2750f..b106cf31d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings.py
@@ -72,5 +72,5 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ true
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings_info.py
index c4afd72c2..81dc964de 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vlans_settings_info.py
@@ -69,7 +69,7 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: int
+ sample: >
+ true
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp.py
index 7696f737e..16cd474e8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp.py
@@ -29,7 +29,7 @@ options:
at other Hubs or a default value if there is no ASN configured.
type: bool
ibgpHoldTimer:
- description: The IBGP holdtimer in seconds. The IBGP holdtimer must be an integer
+ description: The iBGP holdtimer in seconds. The iBGP holdtimer must be an integer
between 12 and 240. When absent, this field is not updated. If no value exists
then it defaults to 240.
type: int
@@ -51,11 +51,11 @@ options:
type: str
type: dict
ebgpHoldTimer:
- description: The EBGP hold timer in seconds for each neighbor. The EBGP hold
+ description: The eBGP hold timer in seconds for each neighbor. The eBGP hold
timer must be an integer between 12 and 240.
type: int
ebgpMultihop:
- description: Configure this if the neighbor is not adjacent. The EBGP multi-hop
+ description: Configure this if the neighbor is not adjacent. The eBGP multi-hop
must be an integer between 1 and 255.
type: int
ip:
@@ -84,7 +84,7 @@ options:
type: int
sourceInterface:
description: The output interface for peering with the remote BGP peer. Valid
- values are 'wired0', 'wired1' or 'vlan{VLAN ID}'(e.g. 'vlan123').
+ values are 'wan1', 'wan2' or 'vlan{VLAN ID}'(e.g. 'vlan123').
type: str
ttlSecurity:
description: Settings for BGP TTL security to protect BGP peering sessions from
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp_info.py
index c2dda6cd0..7bdc3af9e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_bgp_info.py
@@ -70,6 +70,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "asNumber": 0,
+ "enabled": true,
+ "ibgpHoldTimer": 0,
+ "neighbors": [
+ {
+ "allowTransit": true,
+ "ebgpHoldTimer": 0,
+ "ebgpMultihop": 0,
+ "ip": "string",
+ "receiveLimit": 0,
+ "remoteAsNumber": 0
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn.py
index f0f579bae..a1b725548 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn.py
@@ -102,13 +102,13 @@ meraki_response:
type: dict
sample: >
{
- "mode": "string",
"hubs": [
{
"hubId": "string",
"useDefaultRoute": true
}
],
+ "mode": "string",
"subnets": [
{
"localSubnet": "string",
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn_info.py
index 66c039cca..407338ffe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_vpn_site_to_site_vpn_info.py
@@ -72,13 +72,13 @@ meraki_response:
type: dict
sample: >
{
- "mode": "string",
"hubs": [
{
"hubId": "string",
"useDefaultRoute": true
}
],
+ "mode": "string",
"subnets": [
{
"localSubnet": "string",
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_warm_spare_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_warm_spare_info.py
index dffb15b9f..9444954f5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_warm_spare_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_appliance_warm_spare_info.py
@@ -70,6 +70,19 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "enabled": true,
+ "primarySerial": "string",
+ "spareSerial": "string",
+ "uplinkMode": "string",
+ "wan1": {
+ "ip": "string",
+ "subnet": "string"
+ },
+ "wan2": {
+ "ip": "string",
+ "subnet": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_bind.py b/ansible_collections/cisco/meraki/plugins/modules/networks_bind.py
index c285acd32..9a5de7451 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_bind.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_bind.py
@@ -78,5 +78,21 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "configTemplateId": "string",
+ "enrollmentString": "string",
+ "id": "string",
+ "isBoundToConfigTemplate": true,
+ "name": "string",
+ "notes": "string",
+ "organizationId": "string",
+ "productTypes": [
+ "string"
+ ],
+ "tags": [
+ "string"
+ ],
+ "timeZone": "string",
+ "url": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_bluetooth_clients_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_bluetooth_clients_info.py
index 4b6ffedef..7f035c2f3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_bluetooth_clients_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_bluetooth_clients_info.py
@@ -87,6 +87,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "deviceName": "string",
+ "id": "string",
+ "inSightAlert": true,
+ "lastSeen": 0,
+ "mac": "string",
+ "manufacturer": "string",
+ "name": "string",
+ "networkId": "string",
+ "outOfSightAlert": true,
+ "seenByDeviceMac": "string",
+ "tags": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles.py
index 07d1c5567..1da5aee67 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles.py
@@ -92,7 +92,8 @@ options:
or 'High'.
type: str
resolution:
- description: Resolution of the camera. Can be one of '1080x1080' or '2688x1512'.
+ description: Resolution of the camera. Can be one of '1920x1080', '2688x1512'
+ or '3840x2160'.
type: str
type: dict
MV21/MV71:
@@ -126,7 +127,7 @@ options:
or 'High'.
type: str
resolution:
- description: Resolution of the camera. Can be one of '1080x1080' or '2058x2058'.
+ description: Resolution of the camera. Can be one of '1080x1080' or '2112x2112'.
type: str
type: dict
MV33:
@@ -137,7 +138,8 @@ options:
or 'High'.
type: str
resolution:
- description: Resolution of the camera. Can be one of '1080x1080' or '2112x2112'.
+ description: Resolution of the camera. Can be one of '1080x1080', '2112x2112'
+ or '2880x2880'.
type: str
type: dict
MV52:
@@ -251,6 +253,32 @@ EXAMPLES = r"""
name: Sample quality retention profile
networkId: string
+- name: Delete by id
+ cisco.meraki.networks_camera_quality_retention_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ networkId: string
+ qualityRetentionProfileId: string
+
- name: Update by id
cisco.meraki.networks_camera_quality_retention_profiles:
meraki_api_key: "{{meraki_api_key}}"
@@ -322,32 +350,6 @@ EXAMPLES = r"""
quality: string
resolution: string
-- name: Delete by id
- cisco.meraki.networks_camera_quality_retention_profiles:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- networkId: string
- qualityRetentionProfileId: string
-
"""
RETURN = r"""
meraki_response:
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles_info.py
index d6db755e8..5102000bc 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_quality_retention_profiles_info.py
@@ -106,10 +106,36 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "audioRecordingEnabled": true,
+ "cloudArchiveEnabled": true,
+ "id": "string",
+ "maxRetentionDays": 0,
+ "motionBasedRetentionEnabled": true,
+ "motionDetectorVersion": 0,
+ "name": "string",
+ "networkId": "string",
+ "restrictedBandwidthModeEnabled": true,
+ "scheduleId": "string",
+ "videoSettings": {
+ "MV12/MV22/MV72": {
+ "quality": "string",
+ "resolution": "string"
+ },
+ "MV12WE": {
+ "quality": "string",
+ "resolution": "string"
+ },
+ "MV21/MV71": {
+ "quality": "string",
+ "resolution": "string"
+ },
+ "MV32": {
+ "quality": "string",
+ "resolution": "string"
+ }
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles.py
index b5b602f26..dfda03766 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles.py
@@ -112,7 +112,7 @@ EXAMPLES = r"""
encryptionMode: wpa-eap
name: ssid test
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_camera_wireless_profiles:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -134,20 +134,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- identity:
- password: string
- username: string
- name: string
+ state: absent
networkId: string
- ssid:
- authMode: string
- encryptionMode: string
- name: string
- psk: string
wirelessProfileId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_camera_wireless_profiles:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -169,8 +160,17 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ identity:
+ password: string
+ username: string
+ name: string
networkId: string
+ ssid:
+ authMode: string
+ encryptionMode: string
+ name: string
+ psk: string
wirelessProfileId: string
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles_info.py
index 89628d32f..9e6f37ca0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_camera_wireless_profiles_info.py
@@ -106,10 +106,20 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "appliedDeviceCount": 0,
+ "id": "string",
+ "identity": {
+ "password": "string",
+ "username": "string"
+ },
+ "name": "string",
+ "ssid": {
+ "authMode": "string",
+ "encryptionMode": "string",
+ "name": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_connectivity_monitoring_destinations_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_connectivity_monitoring_destinations_info.py
index 03e1d295c..49540cd21 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_connectivity_monitoring_destinations_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_connectivity_monitoring_destinations_info.py
@@ -69,7 +69,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "default": true,
+ "description": "string",
+ "ip": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp.py b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp.py
index a2ee4ddc7..a67358a21 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp.py
@@ -87,9 +87,9 @@ meraki_response:
sample: >
{
"dhcpLeaseTime": "string",
- "dnsNameservers": "string",
"dnsCustomNameservers": [
"string"
- ]
+ ],
+ "dnsNameservers": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp_info.py
index 51263c0cf..a146d5e7d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_dhcp_info.py
@@ -73,9 +73,9 @@ meraki_response:
sample: >
{
"dhcpLeaseTime": "string",
- "dnsNameservers": "string",
"dnsCustomNameservers": [
"string"
- ]
+ ],
+ "dnsNameservers": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool.py b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool.py
index 8e2586106..9b949e9ca 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool.py
@@ -66,7 +66,6 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
cidr: 192.168.0.0/16
- deploymentMode: routed
mask: 24
networkId: string
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool_info.py
index 270363463..ec65da656 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_subnet_pool_info.py
@@ -70,6 +70,18 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "cidr": "string",
+ "deploymentMode": "string",
+ "mask": 0,
+ "subnets": [
+ {
+ "applianceIp": "string",
+ "name": "string",
+ "serial": "string",
+ "subnet": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink.py b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink.py
index b3d5f70ae..692c10607 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink.py
@@ -71,8 +71,8 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
bandwidthLimits:
- limitDown: 0
- limitUp: 0
+ limitDown: 1000000
+ limitUp: 1000000
networkId: string
"""
@@ -82,5 +82,8 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "limitDown": 0,
+ "limitUp": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink_info.py
index 8c46b24c3..839557474 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_cellular_gateway_uplink_info.py
@@ -70,6 +70,9 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "limitDown": 0,
+ "limitUp": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_info.py
index fb08a9ba1..ce0976a7b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_info.py
@@ -9,12 +9,13 @@ DOCUMENTATION = r"""
module: networks_clients_info
short_description: Information module for networks _clients
description:
-- Get all networks _clients.
-- List the clients that have used this network in the timespan.
-version_added: '1.0.0'
+- Get networks _clients by id.
+- >
+ Return the client associated with the given identifier. Clients can be identified by a client key or either the
+ MAC or IP depending on whether the network uses Track-by-IP.
+version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
- - cisco.meraki.module_info_pagination
author: Francisco Munoz (@fmunoz)
options:
headers:
@@ -24,96 +25,27 @@ options:
description:
- NetworkId path parameter. Network ID.
type: str
- t0:
+ clientId:
description:
- - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 31 days from today.
+ - ClientId path parameter. Client ID.
type: str
- timespan:
- description:
- - >
- Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
- not specify parameter t0. The value must be in seconds and be less than or equal to 31 days. The default is
- 1 day.
- type: float
- perPage:
- description:
- - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 10.
- type: int
- startingAfter:
- description:
- - >
- StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
- timestamp or an ID but it is not limited to those. This parameter should not be defined by client
- applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- type: str
- endingBefore:
- description:
- - >
- EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
- timestamp or an ID but it is not limited to those. This parameter should not be defined by client
- applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- type: str
- statuses:
- description:
- - Statuses query parameter. Filters clients based on status. Can be one of 'Online' or 'Offline'.
- elements: str
- type: list
- ip:
- description:
- - Ip query parameter. Filters clients based on a partial or full match for the ip address field.
- type: str
- ip6:
- description:
- - Ip6 query parameter. Filters clients based on a partial or full match for the ip6 address field.
- type: str
- ip6Local:
- description:
- - Ip6Local query parameter. Filters clients based on a partial or full match for the ip6Local address field.
- type: str
- mac:
- description:
- - Mac query parameter. Filters clients based on a partial or full match for the mac address field.
- type: str
- os:
- description:
- - Os query parameter. Filters clients based on a partial or full match for the os (operating system) field.
- type: str
- pskGroup:
- description:
- - PskGroup query parameter. Filters clients based on partial or full match for the iPSK name field.
- type: str
- description:
- description:
- - Description query parameter. Filters clients based on a partial or full match for the description field.
- type: str
- vlan:
- description:
- - Vlan query parameter. Filters clients based on the full match for the VLAN field.
- type: str
- recentDeviceConnections:
- description:
- - >
- RecentDeviceConnections query parameter. Filters clients based on recent connection type. Can be one of
- 'Wired' or 'Wireless'.
- elements: str
- type: list
requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for networks getNetworkClients
- description: Complete reference of the getNetworkClients API.
- link: https://developer.cisco.com/meraki/api-v1/#!get-network-clients
+- name: Cisco Meraki documentation for networks getNetworkClient
+ description: Complete reference of the getNetworkClient API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-network-client
notes:
- SDK Method used are
- networks.Networks.get_network_clients,
+ networks.Networks.get_network_client,
- Paths used are
- get /networks/{networkId}/clients,
+ get /networks/{networkId}/clients/{clientId},
"""
EXAMPLES = r"""
-- name: Get all networks _clients
+- name: Get networks _clients by id
cisco.meraki.networks_clients_info:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -133,27 +65,10 @@ EXAMPLES = r"""
meraki_suppress_logging: "{{meraki_suppress_logging}}"
meraki_simulate: "{{meraki_simulate}}"
meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_caller: "{{meraki_caller}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- t0: string
- timespan: 0
- perPage: 0
- startingAfter: string
- endingBefore: string
- statuses: []
- ip: string
- ip6: string
- ip6Local: string
- mac: string
- os: string
- pskGroup: string
- description: string
- vlan: string
- recentDeviceConnections: []
networkId: string
- total_pages: -1
- direction: next
+ clientId: string
register: result
"""
@@ -164,36 +79,39 @@ meraki_response:
type: dict
sample: >
{
+ "cdp": [
+ [
+ "string"
+ ]
+ ],
+ "clientVpnConnections": [
+ {
+ "connectedAt": 0,
+ "disconnectedAt": 0,
+ "remoteIp": "string"
+ }
+ ],
+ "description": "string",
+ "firstSeen": 0,
"id": "string",
- "mac": "string",
"ip": "string",
"ip6": "string",
- "description": "string",
- "firstSeen": 0,
"lastSeen": 0,
+ "lldp": [
+ [
+ "string"
+ ]
+ ],
+ "mac": "string",
"manufacturer": "string",
"os": "string",
- "user": "string",
- "vlan": "string",
- "ssid": "string",
- "switchport": "string",
- "wirelessCapabilities": "string",
- "smInstalled": true,
"recentDeviceMac": "string",
+ "smInstalled": true,
+ "ssid": "string",
"status": "string",
- "usage": {
- "sent": 0,
- "recv": 0
- },
- "namedVlan": "string",
- "adaptivePolicyGroup": "string",
- "deviceTypePrediction": "string",
- "recentDeviceSerial": "string",
- "recentDeviceName": "string",
- "recentDeviceConnection": "string",
- "notes": "string",
- "ip6Local": "string",
- "groupPolicy8021x": "string",
- "pskGroup": "string"
+ "switchport": "string",
+ "user": "string",
+ "vlan": "string",
+ "wirelessCapabilities": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_overview_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_overview_info.py
index 834ea73ed..df042de24 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_overview_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_overview_info.py
@@ -95,6 +95,15 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "counts": {
+ "total": 0,
+ "withHeavyUsage": 0
+ },
+ "usages": {
+ "average": 0,
+ "withHeavyUsageAverage": 0
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy.py b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy.py
index 445d19e37..a597962a3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy.py
@@ -74,7 +74,6 @@ EXAMPLES = r"""
clientId: string
devicePolicy: Group policy
groupPolicyId: '101'
- mac: 00:11:22:33:44:55
networkId: string
"""
@@ -84,5 +83,9 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "devicePolicy": "string",
+ "groupPolicyId": "string",
+ "mac": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy_info.py
index c1d7205e9..180956b7f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_policy_info.py
@@ -77,6 +77,10 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "devicePolicy": "string",
+ "groupPolicyId": "string",
+ "mac": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_provision.py b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_provision.py
index b605f7fbf..399015fb8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_provision.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_provision.py
@@ -288,12 +288,59 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
clients:
- - clientId: k74272e
- mac: 00:11:22:33:44:55
+ - mac: 00:11:22:33:44:55
name: Miles's phone
devicePolicy: Group policy
groupPolicyId: '101'
networkId: string
+ policiesBySecurityAppliance:
+ devicePolicy: Normal
+ policiesBySsid:
+ '0':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '1':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '10':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '11':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '12':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '13':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '14':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '2':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '3':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '4':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '5':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '6':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '7':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '8':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
+ '9':
+ devicePolicy: Group policy
+ groupPolicyId: '101'
"""
RETURN = r"""
@@ -302,5 +349,16 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "clients": [
+ {
+ "clientId": "string",
+ "mac": "string",
+ "message": "string",
+ "name": "string"
+ }
+ ],
+ "devicePolicy": "string",
+ "groupPolicyId": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_splash_authorization_status_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_splash_authorization_status_info.py
index 972f09e64..533d54bf4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_clients_splash_authorization_status_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_clients_splash_authorization_status_info.py
@@ -78,6 +78,15 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "0": {
+ "authorizedAt": "string",
+ "expiresAt": "string",
+ "isAuthorized": true
+ },
+ "2": {
+ "isAuthorized": true
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim.py b/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim.py
index 81aca9acd..ebac12f92 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim.py
@@ -11,8 +11,8 @@ short_description: Resource module for networks _devices _claim
description:
- Manage operation create of the resource networks _devices _claim.
- >
- Claim devices into a network. Note for recently claimed devices, it may take a few minutes for API requsts against
- that device to succeed .
+ Claim devices into a network. Note for recently claimed devices, it may take a few minutes for API requests
+ against that device to succeed. This operation can be used up to ten times within a single five minute window.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module
@@ -76,5 +76,9 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "serials": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim_vmx.py b/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim_vmx.py
index ba4165db7..369be1c2a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim_vmx.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_devices_claim_vmx.py
@@ -21,7 +21,7 @@ options:
type: str
size:
description: The size of the vMX you claim. It can be one of small, medium, large,
- 100.
+ xlarge, 100.
type: str
requirements:
- meraki >= 2.4.9
@@ -71,5 +71,28 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "address": "string",
+ "details": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ],
+ "firmware": "string",
+ "imei": "string",
+ "lanIp": "string",
+ "lat": 0,
+ "lng": 0,
+ "mac": "string",
+ "model": "string",
+ "name": "string",
+ "networkId": "string",
+ "notes": "string",
+ "productType": "string",
+ "serial": "string",
+ "tags": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_events_event_types_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_events_event_types_info.py
index 98cbd5079..a1b16cb2e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_events_event_types_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_events_event_types_info.py
@@ -75,8 +75,8 @@ meraki_response:
[
{
"category": "string",
- "type": "string",
- "description": "string"
+ "description": "string",
+ "type": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_events_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_events_info.py
index 98ed26a1f..f344826df 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_events_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_events_info.py
@@ -170,32 +170,32 @@ meraki_response:
type: dict
sample: >
{
- "message": "string",
- "pageStartAt": "string",
- "pageEndAt": "string",
"events": [
{
- "occurredAt": "string",
- "networkId": "string",
- "type": "string",
- "description": "string",
"category": "string",
- "clientId": "string",
"clientDescription": "string",
+ "clientId": "string",
"clientMac": "string",
- "deviceSerial": "string",
+ "description": "string",
"deviceName": "string",
- "ssidNumber": 0,
+ "deviceSerial": "string",
"eventData": {
- "radio": "string",
- "vap": "string",
- "client_mac": "string",
- "client_ip": "string",
+ "aid": "string",
"channel": "string",
+ "client_ip": "string",
+ "client_mac": "string",
+ "radio": "string",
"rssi": "string",
- "aid": "string"
- }
+ "vap": "string"
+ },
+ "networkId": "string",
+ "occurredAt": "string",
+ "ssidNumber": 0,
+ "type": "string"
}
- ]
+ ],
+ "message": "string",
+ "pageEndAt": "string",
+ "pageStartAt": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades.py
index 54e5cc1de..6413c41b8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades.py
@@ -127,6 +127,27 @@ options:
description: Whether or not the network wants beta firmware.
type: bool
type: dict
+ switchCatalyst:
+ description: The network device to be updated.
+ suboptions:
+ nextUpgrade:
+ description: The pending firmware upgrade if it exists.
+ suboptions:
+ time:
+ description: The time of the last successful upgrade.
+ type: str
+ toVersion:
+ description: The version to be updated to.
+ suboptions:
+ id:
+ description: The version ID.
+ type: str
+ type: dict
+ type: dict
+ participateInNextBetaRelease:
+ description: Whether or not the network wants beta firmware.
+ type: bool
+ type: dict
wireless:
description: The network device to be updated.
suboptions:
@@ -233,6 +254,12 @@ EXAMPLES = r"""
toVersion:
id: '1002'
participateInNextBetaRelease: false
+ switchCatalyst:
+ nextUpgrade:
+ time: '2019-03-17T17:22:52Z'
+ toVersion:
+ id: '1234'
+ participateInNextBetaRelease: false
wireless:
nextUpgrade:
time: '2019-03-17T17:22:52Z'
@@ -252,288 +279,288 @@ meraki_response:
type: dict
sample: >
{
- "upgradeWindow": {
- "dayOfWeek": "string",
- "hourOfDay": "string"
- },
- "timezone": "string",
"products": {
- "wireless": {
+ "appliance": {
+ "availableVersions": [
+ {
+ "firmware": "string",
+ "id": "string",
+ "releaseDate": "string",
+ "releaseType": "string",
+ "shortName": "string"
+ }
+ ],
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "camera": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "appliance": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "cellularGateway": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "switch": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "sensor": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "camera": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "switch": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "cellularGateway": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "wireless": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "sensor": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
- "releaseType": "string",
- "releaseDate": "string"
- }
- },
- "availableVersions": [
- {
"id": "string",
- "firmware": "string",
- "shortName": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
- ],
+ },
"participateInNextBetaRelease": true
}
+ },
+ "timezone": "string",
+ "upgradeWindow": {
+ "dayOfWeek": "string",
+ "hourOfDay": "string"
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_info.py
index 49cf472c2..2c046fc66 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_info.py
@@ -72,288 +72,288 @@ meraki_response:
type: dict
sample: >
{
- "upgradeWindow": {
- "dayOfWeek": "string",
- "hourOfDay": "string"
- },
- "timezone": "string",
"products": {
- "wireless": {
+ "appliance": {
+ "availableVersions": [
+ {
+ "firmware": "string",
+ "id": "string",
+ "releaseDate": "string",
+ "releaseType": "string",
+ "shortName": "string"
+ }
+ ],
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "camera": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "appliance": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "cellularGateway": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "switch": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "sensor": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "camera": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "switch": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "cellularGateway": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
+ "participateInNextBetaRelease": true
+ },
+ "wireless": {
"availableVersions": [
{
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
],
- "participateInNextBetaRelease": true
- },
- "sensor": {
"currentVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
"lastUpgrade": {
- "time": "string",
"fromVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
+ "time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
},
"nextUpgrade": {
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
- "releaseType": "string",
- "releaseDate": "string"
- }
- },
- "availableVersions": [
- {
"id": "string",
- "firmware": "string",
- "shortName": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
}
- ],
+ },
"participateInNextBetaRelease": true
}
+ },
+ "timezone": "string",
+ "upgradeWindow": {
+ "dayOfWeek": "string",
+ "hourOfDay": "string"
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_rollbacks.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_rollbacks.py
index f68a20e14..bd2ad6f6f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_rollbacks.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_rollbacks.py
@@ -99,21 +99,21 @@ meraki_response:
sample: >
{
"product": "string",
+ "reasons": [
+ {
+ "category": "string",
+ "comment": "string"
+ }
+ ],
"status": "string",
- "upgradeBatchId": "string",
"time": "string",
"toVersion": {
- "id": "string",
"firmware": "string",
- "shortName": "string",
+ "id": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
- "reasons": [
- {
- "category": "string",
- "comment": "string"
- }
- ]
+ "upgradeBatchId": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events.py
index 7602effc6..1fc0e256a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events.py
@@ -38,6 +38,21 @@ options:
type: dict
type: dict
type: dict
+ switchCatalyst:
+ description: Version information for the switch network being upgraded.
+ suboptions:
+ nextUpgrade:
+ description: The next upgrade version for the switch network.
+ suboptions:
+ toVersion:
+ description: The version to be updated to for switch Catalyst devices.
+ suboptions:
+ id:
+ description: The version ID.
+ type: str
+ type: dict
+ type: dict
+ type: dict
type: dict
stages:
description: All firmware upgrade stages in the network with their start time.
@@ -80,7 +95,7 @@ notes:
"""
EXAMPLES = r"""
-- name: Update all
+- name: Create
cisco.meraki.networks_firmware_upgrades_staged_events:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -104,13 +119,22 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
networkId: string
+ products:
+ switch:
+ nextUpgrade:
+ toVersion:
+ id: '1234'
+ switchCatalyst:
+ nextUpgrade:
+ toVersion:
+ id: '4321'
stages:
- group:
id: '1234'
milestones:
scheduledFor: '2018-02-11T00:00:00Z'
-- name: Create
+- name: Update all
cisco.meraki.networks_firmware_upgrades_staged_events:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -134,11 +158,6 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
networkId: string
- products:
- switch:
- nextUpgrade:
- toVersion:
- id: '1234'
stages:
- group:
id: '1234'
@@ -163,27 +182,27 @@ meraki_response:
}
}
},
+ "reasons": [
+ {
+ "category": "string",
+ "comment": "string"
+ }
+ ],
"stages": [
{
"group": {
+ "description": "string",
"id": "string",
- "name": "string",
- "description": "string"
+ "name": "string"
},
"milestones": {
- "scheduledFor": "string",
- "startedAt": "string",
+ "canceledAt": "string",
"completedAt": "string",
- "canceledAt": "string"
+ "scheduledFor": "string",
+ "startedAt": "string"
},
"status": "string"
}
- ],
- "reasons": [
- {
- "category": "string",
- "comment": "string"
- }
]
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_defer.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_defer.py
index eb7bd60d4..a0e7440ee 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_defer.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_defer.py
@@ -77,27 +77,27 @@ meraki_response:
}
}
},
+ "reasons": [
+ {
+ "category": "string",
+ "comment": "string"
+ }
+ ],
"stages": [
{
"group": {
+ "description": "string",
"id": "string",
- "name": "string",
- "description": "string"
+ "name": "string"
},
"milestones": {
- "scheduledFor": "string",
- "startedAt": "string",
+ "canceledAt": "string",
"completedAt": "string",
- "canceledAt": "string"
+ "scheduledFor": "string",
+ "startedAt": "string"
},
"status": "string"
}
- ],
- "reasons": [
- {
- "category": "string",
- "comment": "string"
- }
]
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_info.py
index 5a2bc160c..14282197a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_info.py
@@ -82,27 +82,27 @@ meraki_response:
}
}
},
+ "reasons": [
+ {
+ "category": "string",
+ "comment": "string"
+ }
+ ],
"stages": [
{
"group": {
+ "description": "string",
"id": "string",
- "name": "string",
- "description": "string"
+ "name": "string"
},
"milestones": {
- "scheduledFor": "string",
- "startedAt": "string",
+ "canceledAt": "string",
"completedAt": "string",
- "canceledAt": "string"
+ "scheduledFor": "string",
+ "startedAt": "string"
},
"status": "string"
}
- ],
- "reasons": [
- {
- "category": "string",
- "comment": "string"
- }
]
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_rollbacks.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_rollbacks.py
index 91393eaf1..ba96d49c1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_rollbacks.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_events_rollbacks.py
@@ -117,27 +117,27 @@ meraki_response:
}
}
},
+ "reasons": [
+ {
+ "category": "string",
+ "comment": "string"
+ }
+ ],
"stages": [
{
"group": {
+ "description": "string",
"id": "string",
- "name": "string",
- "description": "string"
+ "name": "string"
},
"milestones": {
- "scheduledFor": "string",
- "startedAt": "string",
+ "canceledAt": "string",
"completedAt": "string",
- "canceledAt": "string"
+ "scheduledFor": "string",
+ "startedAt": "string"
},
"status": "string"
}
- ],
- "reasons": [
- {
- "category": "string",
- "comment": "string"
- }
]
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups.py
index 8d152996d..066426acd 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups.py
@@ -121,7 +121,7 @@ EXAMPLES = r"""
name: My Staged Upgrade Group
networkId: string
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_firmware_upgrades_staged_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -143,21 +143,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- assignedDevices:
- devices:
- - name: Device Name
- serial: Q234-ABCD-5678
- switchStacks:
- - id: '1234'
- name: Stack Name
- description: The description of the group
+ state: absent
groupId: string
- isDefault: false
- name: My Staged Upgrade Group
networkId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_firmware_upgrades_staged_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -179,8 +169,18 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ assignedDevices:
+ devices:
+ - name: Device Name
+ serial: Q234-ABCD-5678
+ switchStacks:
+ - id: '1234'
+ name: Stack Name
+ description: The description of the group
groupId: string
+ isDefault: false
+ name: My Staged Upgrade Group
networkId: string
"""
@@ -190,5 +190,24 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "assignedDevices": {
+ "devices": [
+ {
+ "name": "string",
+ "serial": "string"
+ }
+ ],
+ "switchStacks": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ]
+ },
+ "description": "string",
+ "groupId": "string",
+ "isDefault": true,
+ "name": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups_info.py
index 27e1bb7a9..e329e3a59 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_groups_info.py
@@ -109,15 +109,11 @@ meraki_response:
type: dict
sample: >
{
- "groupId": "string",
- "name": "string",
- "description": "string",
- "isDefault": true,
"assignedDevices": {
"devices": [
{
- "serial": "string",
- "name": "string"
+ "name": "string",
+ "serial": "string"
}
],
"switchStacks": [
@@ -126,6 +122,10 @@ meraki_response:
"name": "string"
}
]
- }
+ },
+ "description": "string",
+ "groupId": "string",
+ "isDefault": true,
+ "name": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages.py
index 2222ee097..53066ce50 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages.py
@@ -85,9 +85,9 @@ meraki_response:
[
{
"group": {
+ "description": "string",
"id": "string",
- "name": "string",
- "description": "string"
+ "name": "string"
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages_info.py
index 150aa58af..e43004be7 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_firmware_upgrades_staged_stages_info.py
@@ -75,9 +75,9 @@ meraki_response:
[
{
"group": {
+ "description": "string",
"id": "string",
- "name": "string",
- "description": "string"
+ "name": "string"
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans.py b/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans.py
index 6873a0ca4..01b2a1241 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans.py
@@ -141,11 +141,26 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
- imageContents: Q2lzY28gTWVyYWtp
+ bottomLeftCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
+ bottomRightCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
+ center:
+ lat: 37.770040510499996
+ lng: -122.38714009525
+ imageContents: 2a9edd3f4ffd80130c647d13eacb59f3
name: HQ Floor Plan
networkId: string
+ topLeftCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
+ topRightCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_floor_plans:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -167,28 +182,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- bottomLeftCorner:
- lat: 0
- lng: 0
- bottomRightCorner:
- lat: 0
- lng: 0
- center:
- lat: 0
- lng: 0
+ state: absent
floorPlanId: string
- imageContents: string
- name: string
networkId: string
- topLeftCorner:
- lat: 0
- lng: 0
- topRightCorner:
- lat: 0
- lng: 0
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_floor_plans:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -210,9 +208,26 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ bottomLeftCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
+ bottomRightCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
+ center:
+ lat: 37.770040510499996
+ lng: -122.38714009525
floorPlanId: string
+ imageContents: 2a9edd3f4ffd80130c647d13eacb59f3
+ name: HQ Floor Plan
networkId: string
+ topLeftCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
+ topRightCorner:
+ lat: 37.770040510499996
+ lng: -122.38714009525
"""
RETURN = r"""
@@ -221,5 +236,60 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "bottomLeftCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "bottomRightCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "center": {
+ "lat": 0,
+ "lng": 0
+ },
+ "devices": [
+ {
+ "address": "string",
+ "details": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ],
+ "firmware": "string",
+ "imei": "string",
+ "lanIp": "string",
+ "lat": 0,
+ "lng": 0,
+ "mac": "string",
+ "model": "string",
+ "name": "string",
+ "networkId": "string",
+ "notes": "string",
+ "productType": "string",
+ "serial": "string",
+ "tags": [
+ "string"
+ ]
+ }
+ ],
+ "floorPlanId": "string",
+ "height": 0,
+ "imageExtension": "string",
+ "imageMd5": "string",
+ "imageUrl": "string",
+ "imageUrlExpiresAt": "string",
+ "name": "string",
+ "topLeftCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "topRightCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "width": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans_info.py
index 6925db738..df4d139ae 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_floor_plans_info.py
@@ -106,10 +106,62 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "bottomLeftCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "bottomRightCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "center": {
+ "lat": 0,
+ "lng": 0
+ },
+ "devices": [
+ {
+ "address": "string",
+ "details": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ],
+ "firmware": "string",
+ "imei": "string",
+ "lanIp": "string",
+ "lat": 0,
+ "lng": 0,
+ "mac": "string",
+ "model": "string",
+ "name": "string",
+ "networkId": "string",
+ "notes": "string",
+ "productType": "string",
+ "serial": "string",
+ "tags": [
+ "string"
+ ]
+ }
+ ],
+ "floorPlanId": "string",
+ "height": 0,
+ "imageExtension": "string",
+ "imageMd5": "string",
+ "imageUrl": "string",
+ "imageUrlExpiresAt": "string",
+ "name": "string",
+ "topLeftCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "topRightCorner": {
+ "lat": 0,
+ "lng": 0
+ },
+ "width": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies.py b/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies.py
index 62689ee9f..2cd4091e6 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies.py
@@ -467,30 +467,11 @@ EXAMPLES = r"""
- policy: deny
type: host
value: google.com
- - policy: deny
- type: port
- value: '23'
- - policy: deny
- type: ipRange
- value: 10.11.12.00/24
- - policy: deny
- type: ipRange
- value: 10.11.12.00/24:5555
settings: custom
trafficShapingRules:
- definitions:
- type: host
value: google.com
- - type: port
- value: '9090'
- - type: ipRange
- value: 192.1.0.0
- - type: ipRange
- value: 192.1.0.0/16
- - type: ipRange
- value: 10.1.0.0/16:80
- - type: localNet
- value: 192.168.0.0/16
dscpTagValue: 0
pcpTagValue: 0
perClientBandwidthLimits:
@@ -498,6 +479,7 @@ EXAMPLES = r"""
limitDown: 1000000
limitUp: 1000000
settings: custom
+ priority: normal
name: No video streaming
networkId: string
scheduling:
@@ -511,13 +493,13 @@ EXAMPLES = r"""
from: '9:00'
to: '17:00'
saturday:
- active: false
- from: 0:00
- to: '24:00'
+ active: true
+ from: '9:00'
+ to: '17:00'
sunday:
- active: false
- from: 0:00
- to: '24:00'
+ active: true
+ from: '9:00'
+ to: '17:00'
thursday:
active: true
from: '9:00'
@@ -535,6 +517,32 @@ EXAMPLES = r"""
settings: custom
vlanId: '1'
+- name: Delete by id
+ cisco.meraki.networks_group_policies:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ groupPolicyId: string
+ networkId: string
+
- name: Update by id
cisco.meraki.networks_group_policies:
meraki_api_key: "{{meraki_api_key}}"
@@ -595,30 +603,11 @@ EXAMPLES = r"""
- policy: deny
type: host
value: google.com
- - policy: deny
- type: port
- value: '23'
- - policy: deny
- type: ipRange
- value: 10.11.12.00/24
- - policy: deny
- type: ipRange
- value: 10.11.12.00/24:5555
settings: custom
trafficShapingRules:
- definitions:
- type: host
value: google.com
- - type: port
- value: '9090'
- - type: ipRange
- value: 192.1.0.0
- - type: ipRange
- value: 192.1.0.0/16
- - type: ipRange
- value: 10.1.0.0/16:80
- - type: localNet
- value: 192.168.0.0/16
dscpTagValue: 0
pcpTagValue: 0
perClientBandwidthLimits:
@@ -626,6 +615,7 @@ EXAMPLES = r"""
limitDown: 1000000
limitUp: 1000000
settings: custom
+ priority: normal
groupPolicyId: string
name: No video streaming
networkId: string
@@ -640,13 +630,13 @@ EXAMPLES = r"""
from: '9:00'
to: '17:00'
saturday:
- active: false
- from: 0:00
- to: '24:00'
+ active: true
+ from: '9:00'
+ to: '17:00'
sunday:
- active: false
- from: 0:00
- to: '24:00'
+ active: true
+ from: '9:00'
+ to: '17:00'
thursday:
active: true
from: '9:00'
@@ -664,32 +654,6 @@ EXAMPLES = r"""
settings: custom
vlanId: '1'
-- name: Delete by id
- cisco.meraki.networks_group_policies:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- groupPolicyId: string
- networkId: string
-
"""
RETURN = r"""
meraki_response:
@@ -697,5 +661,128 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "bandwidth": {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "settings": "string"
+ },
+ "bonjourForwarding": {
+ "rules": [
+ {
+ "description": "string",
+ "services": [
+ "string"
+ ],
+ "vlanId": "string"
+ }
+ ],
+ "settings": "string"
+ },
+ "contentFiltering": {
+ "allowedUrlPatterns": {
+ "patterns": [
+ "string"
+ ],
+ "settings": "string"
+ },
+ "blockedUrlCategories": {
+ "categories": [
+ "string"
+ ],
+ "settings": "string"
+ },
+ "blockedUrlPatterns": {
+ "patterns": [
+ "string"
+ ],
+ "settings": "string"
+ }
+ },
+ "firewallAndTrafficShaping": {
+ "l3FirewallRules": [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string"
+ }
+ ],
+ "l7FirewallRules": [
+ {
+ "policy": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "settings": "string",
+ "trafficShapingRules": [
+ {
+ "definitions": [
+ {
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dscpTagValue": 0,
+ "pcpTagValue": 0,
+ "perClientBandwidthLimits": {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "settings": "string"
+ },
+ "priority": "string"
+ }
+ ]
+ },
+ "groupPolicyId": "string",
+ "scheduling": {
+ "enabled": true,
+ "friday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "monday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "saturday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "sunday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "thursday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "tuesday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "wednesday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ }
+ },
+ "splashAuthSettings": "string",
+ "vlanTagging": {
+ "settings": "string",
+ "vlanId": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies_info.py
index 29bb06cbe..6913657eb 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_group_policies_info.py
@@ -106,10 +106,130 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "bandwidth": {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "settings": "string"
+ },
+ "bonjourForwarding": {
+ "rules": [
+ {
+ "description": "string",
+ "services": [
+ "string"
+ ],
+ "vlanId": "string"
+ }
+ ],
+ "settings": "string"
+ },
+ "contentFiltering": {
+ "allowedUrlPatterns": {
+ "patterns": [
+ "string"
+ ],
+ "settings": "string"
+ },
+ "blockedUrlCategories": {
+ "categories": [
+ "string"
+ ],
+ "settings": "string"
+ },
+ "blockedUrlPatterns": {
+ "patterns": [
+ "string"
+ ],
+ "settings": "string"
+ }
+ },
+ "firewallAndTrafficShaping": {
+ "l3FirewallRules": [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string"
+ }
+ ],
+ "l7FirewallRules": [
+ {
+ "policy": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "settings": "string",
+ "trafficShapingRules": [
+ {
+ "definitions": [
+ {
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dscpTagValue": 0,
+ "pcpTagValue": 0,
+ "perClientBandwidthLimits": {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "settings": "string"
+ },
+ "priority": "string"
+ }
+ ]
+ },
+ "groupPolicyId": "string",
+ "scheduling": {
+ "enabled": true,
+ "friday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "monday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "saturday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "sunday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "thursday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "tuesday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "wednesday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ }
+ },
+ "splashAuthSettings": "string",
+ "vlanTagging": {
+ "settings": "string",
+ "vlanId": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_health_alerts_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_health_alerts_info.py
index 1bae1b67b..3cbb0776f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_health_alerts_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_health_alerts_info.py
@@ -74,44 +74,44 @@ meraki_response:
sample: >
[
{
- "id": "string",
"category": "string",
- "type": "string",
- "severity": "string",
+ "id": "string",
"scope": {
- "devices": [
+ "applications": [
{
- "url": "string",
"name": "string",
- "productType": "string",
- "serial": "string",
- "mac": "string",
- "lldp": {
- "portId": "string"
- },
+ "url": "string"
+ }
+ ],
+ "devices": [
+ {
"clients": [
{
"mac": "string"
}
- ]
- }
- ],
- "applications": [
- {
- "url": "string",
- "name": "string"
+ ],
+ "lldp": {
+ "portId": "string"
+ },
+ "mac": "string",
+ "name": "string",
+ "productType": "string",
+ "serial": "string",
+ "url": "string"
}
],
"peers": [
{
- "url": "string",
"network": {
- "name": "string",
- "id": "string"
- }
+ "id": "string",
+ "name": "string"
+ },
+ "url": "string"
}
]
- }
+ },
+ "severity": "string",
+ "type": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_info.py
index 2d4b88cb4..7aa697f10 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_info.py
@@ -78,16 +78,16 @@ requirements:
- meraki >= 2.4.9
- python >= 3.5
seealso:
-- name: Cisco Meraki documentation for organizations,networks getNetwork
+- name: Cisco Meraki documentation for networks getNetwork
description: Complete reference of the getNetwork API.
link: https://developer.cisco.com/meraki/api-v1/#!get-network
-- name: Cisco Meraki documentation for organizations,networks getOrganizationNetworks
+- name: Cisco Meraki documentation for networks getOrganizationNetworks
description: Complete reference of the getOrganizationNetworks API.
link: https://developer.cisco.com/meraki/api-v1/#!get-organization-networks
notes:
- SDK Method used are
- organizationsnetworks.Organizationsnetworks.get_network,
- organizationsnetworks.Organizationsnetworks.get_organization_networks,
+ networks.Networks.get_network,
+ networks.Networks.get_organization_networks,
- Paths used are
get /networks/{networkId},
@@ -162,19 +162,19 @@ meraki_response:
type: dict
sample: >
{
+ "enrollmentString": "string",
"id": "string",
- "organizationId": "string",
+ "isBoundToConfigTemplate": true,
"name": "string",
+ "notes": "string",
+ "organizationId": "string",
"productTypes": [
"string"
],
- "timeZone": "string",
"tags": [
"string"
],
- "enrollmentString": "string",
- "url": "string",
- "notes": "string",
- "isBoundToConfigTemplate": true
+ "timeZone": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_insight_applications_health_by_time_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_insight_applications_health_by_time_info.py
index 955f5beee..3da4aedb1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_insight_applications_health_by_time_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_insight_applications_health_by_time_info.py
@@ -104,18 +104,18 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
"endTs": "string",
- "wanGoodput": 0,
"lanGoodput": 0,
- "wanLatencyMs": 0,
"lanLatencyMs": 0,
- "wanLossPercent": 0,
"lanLossPercent": 0,
+ "numClients": 0,
+ "recv": 0,
"responseDuration": 0,
"sent": 0,
- "recv": 0,
- "numClients": 0
+ "startTs": "string",
+ "wanGoodput": 0,
+ "wanLatencyMs": 0,
+ "wanLossPercent": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users.py b/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users.py
index 41f61c823..39578076a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users.py
@@ -13,9 +13,7 @@ description:
- >
Authorize a user configured with Meraki Authentication for a network currently supports 802.1X, splash guest, and
client VPN users, and currently, organizations have a 50,000 user cap .
-- >
- Deauthorize a user. To reauthorize a user after deauthorizing them, POST to this endpoint. Currently, 802.1X
- RADIUS, splash guest, and client VPN users can be deauthorized. .
+- Delete an 802.1X RADIUS user, or deauthorize and optionally delete a splash guest or client VPN user.
- >
Update a user configured with Meraki Authentication currently, 802.1X RADIUS, splash guest, and client VPN users
can be updated .
@@ -26,7 +24,7 @@ author: Francisco Munoz (@fmunoz)
options:
accountType:
description: Authorization type for user. Can be 'Guest' or '802.1X' for wireless
- networks, or 'Client VPN' for wired networks. Defaults to '802.1X'.
+ networks, or 'Client VPN' for MX networks. Defaults to '802.1X'.
type: str
authorizations:
description: Authorization zones and expiration dates for the user.
@@ -41,6 +39,12 @@ options:
being authorized, which must be configured for the user's given accountType.
type: int
type: list
+ delete:
+ description: Delete query parameter. If the ID supplied is for a splash guest or
+ client VPN user, and that user is not authorized for any other networks in the
+ organization, then also delete the user. 802.1X RADIUS users are always deleted
+ regardless of this optional attribute.
+ type: bool
email:
description: Email address of the user.
type: str
@@ -124,7 +128,7 @@ EXAMPLES = r"""
networkId: string
password: secret
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_meraki_auth_users:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -146,17 +150,12 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- authorizations:
- - expiresAt: '2018-03-13T00:00:00.090210Z'
- ssidNumber: 1
- emailPasswordToUser: false
+ state: absent
+ delete: true
merakiAuthUserId: string
- name: Miles Meraki
networkId: string
- password: secret
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_meraki_auth_users:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -178,9 +177,15 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ authorizations:
+ - expiresAt: '2018-03-13T00:00:00.090210Z'
+ ssidNumber: 1
+ emailPasswordToUser: false
merakiAuthUserId: string
+ name: Miles Meraki
networkId: string
+ password: secret
"""
RETURN = r"""
@@ -190,20 +195,20 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "email": "string",
- "name": "string",
- "createdAt": "string",
"accountType": "string",
- "isAdmin": true,
"authorizations": [
{
- "ssidNumber": 0,
+ "authorizedByEmail": "string",
+ "authorizedByName": "string",
"authorizedZone": "string",
"expiresAt": "string",
- "authorizedByName": "string",
- "authorizedByEmail": "string"
+ "ssidNumber": 0
}
- ]
+ ],
+ "createdAt": "string",
+ "email": "string",
+ "id": "string",
+ "isAdmin": true,
+ "name": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users_info.py
index 5d1e15e3d..f7a2293d9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_meraki_auth_users_info.py
@@ -13,7 +13,7 @@ description:
- Get networks _merakiauthusers by id.
- >
List the users configured under Meraki Authentication for a network splash guest or RADIUS users for a wireless
- network, or client VPN users for a wired network .
+ network, or client VPN users for a MX network .
- Return the Meraki Auth splash guest, RADIUS, or client VPN user.
version_added: '2.16.0'
extends_documentation_fragment:
@@ -111,20 +111,20 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "email": "string",
- "name": "string",
- "createdAt": "string",
"accountType": "string",
- "isAdmin": true,
"authorizations": [
{
- "ssidNumber": 0,
+ "authorizedByEmail": "string",
+ "authorizedByName": "string",
"authorizedZone": "string",
"expiresAt": "string",
- "authorizedByName": "string",
- "authorizedByEmail": "string"
+ "ssidNumber": 0
}
- ]
+ ],
+ "createdAt": "string",
+ "email": "string",
+ "id": "string",
+ "isAdmin": true,
+ "name": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_mqtt_brokers.py b/ansible_collections/cisco/meraki/plugins/modules/networks_mqtt_brokers.py
index a5c897a17..a52f4fe29 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_mqtt_brokers.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_mqtt_brokers.py
@@ -18,6 +18,13 @@ author: Francisco Munoz (@fmunoz)
options:
authentication:
description: Authentication settings of the MQTT broker.
+ suboptions:
+ password:
+ description: Password for the MQTT broker.
+ type: str
+ username:
+ description: Username for the MQTT broker.
+ type: str
type: dict
host:
description: Host name/IP address where the MQTT broker runs.
@@ -37,7 +44,7 @@ options:
mode:
description: Security protocol of the MQTT broker.
type: str
- security:
+ tls:
description: TLS settings of the MQTT broker.
suboptions:
caCertificate:
@@ -88,15 +95,16 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
authentication:
- username: Username
- host: 1.1.1.1
+ password: '*****'
+ username: milesmeraki
+ host: 1.2.3.4
name: MQTT_Broker_1
networkId: string
- port: 1234
+ port: 443
security:
mode: tls
tls:
- hasCaCertificate: true
+ caCertificate: '*****'
verifyHostnames: true
"""
@@ -106,5 +114,20 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "authentication": {
+ "username": "string"
+ },
+ "host": "string",
+ "id": "string",
+ "name": "string",
+ "port": 0,
+ "security": {
+ "mode": "string",
+ "tls": {
+ "hasCaCertificate": true,
+ "verifyHostnames": true
+ }
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_netflow.py b/ansible_collections/cisco/meraki/plugins/modules/networks_netflow.py
index e3bc1b646..10acb1d5e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_netflow.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_netflow.py
@@ -90,5 +90,11 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "collectorIp": "string",
+ "collectorPort": 0,
+ "etaDstPort": 0,
+ "etaEnabled": true,
+ "reportingEnabled": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_netflow_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_netflow_info.py
index d5fb5dcc9..fb3168440 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_netflow_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_netflow_info.py
@@ -70,6 +70,12 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "collectorIp": "string",
+ "collectorPort": 0,
+ "etaDstPort": 0,
+ "etaEnabled": true,
+ "reportingEnabled": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_pii_keys_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_pii_keys_info.py
index a96737ef0..4dfb193f5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_pii_keys_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_pii_keys_info.py
@@ -103,6 +103,25 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "bluetoothMacs": [
+ "string"
+ ],
+ "emails": [
+ "string"
+ ],
+ "imeis": [
+ "string"
+ ],
+ "macs": [
+ "string"
+ ],
+ "serials": [
+ "string"
+ ],
+ "usernames": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_requests_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_requests_info.py
index 6536069b6..5608b757a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_requests_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_requests_info.py
@@ -106,10 +106,17 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "completedAt": 0,
+ "createdAt": 0,
+ "datasets": "string",
+ "id": "string",
+ "mac": "string",
+ "networkId": "string",
+ "organizationWide": true,
+ "status": "string",
+ "type": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_devices_for_key_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_devices_for_key_info.py
index 488dd4d24..f3be5aaf2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_devices_for_key_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_devices_for_key_info.py
@@ -102,7 +102,10 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: str
+ sample: >
+ [
+ "string"
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_owners_for_key_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_owners_for_key_info.py
index 1387ce301..b3369a8e0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_owners_for_key_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_pii_sm_owners_for_key_info.py
@@ -102,7 +102,10 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: str
+ sample: >
+ [
+ "string"
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_policies_by_client_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_policies_by_client_info.py
index 36c8ca8fd..309902377 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_policies_by_client_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_policies_by_client_info.py
@@ -111,20 +111,20 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "clientId": "string",
"assigned": [
{
- "name": "string",
- "type": "string",
"groupPolicyId": "string",
+ "name": "string",
"ssid": [
{
"ssidNumber": 0
}
- ]
+ ],
+ "type": "string"
}
- ]
+ ],
+ "clientId": "string",
+ "name": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_current_overview_by_metric_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_current_overview_by_metric_info.py
index 252fccc0d..8396447d2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_current_overview_by_metric_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_current_overview_by_metric_info.py
@@ -72,20 +72,28 @@ meraki_response:
type: dict
sample: >
{
- "supportedMetrics": [
- "string"
- ],
"counts": {
+ "apparentPower": 0,
+ "co2": 0,
+ "current": 0,
"door": 0,
+ "frequency": 0,
"humidity": 0,
"indoorAirQuality": 0,
"noise": {
"ambient": 0
},
"pm25": 0,
+ "powerFactor": 0,
+ "realPower": 0,
"temperature": 0,
"tvoc": 0,
+ "upstreamPower": 0,
+ "voltage": 0,
"water": 0
- }
+ },
+ "supportedMetrics": [
+ "string"
+ ]
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_overview_by_metric_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_overview_by_metric_info.py
index 591800095..8d3b31ab9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_overview_by_metric_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_overview_by_metric_info.py
@@ -99,20 +99,28 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
- "endTs": "string",
"counts": {
+ "apparentPower": 0,
+ "co2": 0,
+ "current": 0,
"door": 0,
+ "frequency": 0,
"humidity": 0,
"indoorAirQuality": 0,
"noise": {
"ambient": 0
},
"pm25": 0,
+ "powerFactor": 0,
+ "realPower": 0,
"temperature": 0,
"tvoc": 0,
+ "upstreamPower": 0,
+ "voltage": 0,
"water": 0
- }
+ },
+ "endTs": "string",
+ "startTs": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles.py
index 67b7f3c87..6b8cfb841 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles.py
@@ -25,17 +25,19 @@ options:
direction:
description: If 'above', an alert will be sent when a sensor reads above the
threshold. If 'below', an alert will be sent when a sensor reads below the
- threshold. Only applicable for temperature and humidity thresholds.
+ threshold. Only applicable for temperature, humidity, realPower, apparentPower,
+ powerFactor, voltage, current, and frequency thresholds.
type: str
duration:
description: Length of time in seconds that the triggering state must persist
before an alert is sent. Available options are 0 seconds, 1 minute, 2 minutes,
- 3 minutes, 4 minutes, 5 minutes, 10 minutes, 15 minutes, 30 minutes, and 1
- hour. Default is 0.
+ 3 minutes, 4 minutes, 5 minutes, 10 minutes, 15 minutes, 30 minutes, 1 hour,
+ 2 hours, 4 hours, and 8 hours. Default is 0.
type: int
metric:
description: The type of sensor metric that will be monitored for changes. Available
- metrics are door, humidity, indoorAirQuality, noise, pm25, temperature, tvoc,
+ metrics are apparentPower, co2, current, door, frequency, humidity, indoorAirQuality,
+ noise, pm25, powerFactor, realPower, temperature, tvoc, upstreamPower, voltage,
and water.
type: str
threshold:
@@ -43,6 +45,21 @@ options:
This object should contain a single property key matching the condition's
'metric' value.
suboptions:
+ apparentPower:
+ description: Apparent power threshold. 'draw' must be provided.
+ suboptions:
+ draw:
+ description: Alerting threshold in volt-amps. Must be between 0 and
+ 3750.
+ type: float
+ type: dict
+ current:
+ description: Electrical current threshold. 'level' must be provided.
+ suboptions:
+ draw:
+ description: Alerting threshold in amps. Must be between 0 and 15.
+ type: float
+ type: dict
door:
description: Door open threshold. 'open' must be provided and set to true.
suboptions:
@@ -51,6 +68,13 @@ options:
true.
type: bool
type: dict
+ frequency:
+ description: Electrical frequency threshold. 'level' must be provided.
+ suboptions:
+ level:
+ description: Alerting threshold in hertz. Must be between 0 and 60.
+ type: float
+ type: dict
humidity:
description: Humidity threshold. One of 'relativePercentage' or 'quality'
must be provided.
@@ -100,6 +124,21 @@ options:
description: Alerting threshold as a qualitative PM2.5 level.
type: str
type: dict
+ powerFactor:
+ description: Power factor threshold. 'percentage' must be provided.
+ suboptions:
+ percentage:
+ description: Alerting threshold as the ratio of active power to apparent
+ power. Must be between 0 and 100.
+ type: int
+ type: dict
+ realPower:
+ description: Real power threshold. 'draw' must be provided.
+ suboptions:
+ draw:
+ description: Alerting threshold in watts. Must be between 0 and 3750.
+ type: float
+ type: dict
temperature:
description: Temperature threshold. One of 'celsius', 'fahrenheit', or 'quality'
must be provided.
@@ -125,6 +164,22 @@ options:
description: Alerting threshold as a qualitative TVOC level.
type: str
type: dict
+ upstreamPower:
+ description: Upstream power threshold. 'outageDetected' must be provided
+ and set to true.
+ suboptions:
+ outageDetected:
+ description: Alerting threshold for an upstream power event. Must be
+ set to true.
+ type: bool
+ type: dict
+ voltage:
+ description: Voltage threshold. 'level' must be provided.
+ suboptions:
+ level:
+ description: Alerting threshold in volts. Must be between 0 and 250.
+ type: float
+ type: dict
water:
description: Water detection threshold. 'present' must be provided and set
to true.
@@ -146,7 +201,7 @@ options:
description: NetworkId path parameter. Network ID.
type: str
recipients:
- description: List of recipients that will recieve the alert.
+ description: List of recipients that will receive the alert.
suboptions:
emails:
description: A list of emails that will receive information about the alert.
@@ -228,8 +283,14 @@ EXAMPLES = r"""
duration: 60
metric: temperature
threshold:
+ apparentPower:
+ draw: 17.2
+ current:
+ draw: 0.14
door:
open: true
+ frequency:
+ level: 58.8
humidity:
quality: inadequate
relativePercentage: 65
@@ -243,13 +304,21 @@ EXAMPLES = r"""
pm25:
concentration: 90
quality: fair
+ powerFactor:
+ percentage: 81
+ realPower:
+ draw: 14.1
temperature:
celsius: 20.5
- fahrenheit: 70
+ fahrenheit: 70.0
quality: good
tvoc:
concentration: 400
quality: poor
+ upstreamPower:
+ outageDetected: true
+ voltage:
+ level: 119.5
water:
present: true
name: My Sensor Alert Profile
@@ -268,6 +337,32 @@ EXAMPLES = r"""
- Q234-ABCD-0002
- Q234-ABCD-0003
+- name: Delete by id
+ cisco.meraki.networks_sensor_alerts_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ id: string
+ networkId: string
+
- name: Update by id
cisco.meraki.networks_sensor_alerts_profiles:
meraki_api_key: "{{meraki_api_key}}"
@@ -296,8 +391,14 @@ EXAMPLES = r"""
duration: 60
metric: temperature
threshold:
+ apparentPower:
+ draw: 17.2
+ current:
+ draw: 0.14
door:
open: true
+ frequency:
+ level: 58.8
humidity:
quality: inadequate
relativePercentage: 65
@@ -311,13 +412,21 @@ EXAMPLES = r"""
pm25:
concentration: 90
quality: fair
+ powerFactor:
+ percentage: 81
+ realPower:
+ draw: 14.1
temperature:
celsius: 20.5
- fahrenheit: 70
+ fahrenheit: 70.0
quality: good
tvoc:
concentration: 400
quality: poor
+ upstreamPower:
+ outageDetected: true
+ voltage:
+ level: 119.5
water:
present: true
id: string
@@ -337,32 +446,6 @@ EXAMPLES = r"""
- Q234-ABCD-0002
- Q234-ABCD-0003
-- name: Delete by id
- cisco.meraki.networks_sensor_alerts_profiles:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- id: string
- networkId: string
-
"""
RETURN = r"""
meraki_response:
@@ -371,38 +454,31 @@ meraki_response:
type: dict
sample: >
{
- "profileId": "string",
- "name": "string",
- "schedule": {
- "id": "string",
- "name": "string"
- },
"conditions": [
{
+ "direction": "string",
+ "duration": 0,
"metric": "string",
"threshold": {
- "temperature": {
- "celsius": 0,
- "fahrenheit": 0,
- "quality": "string"
+ "apparentPower": {
+ "draw": 0
},
- "humidity": {
- "relativePercentage": 0,
- "quality": "string"
- },
- "water": {
- "present": true
+ "current": {
+ "draw": 0
},
"door": {
"open": true
},
- "tvoc": {
- "concentration": 0,
- "quality": "string"
+ "frequency": {
+ "level": 0
},
- "pm25": {
- "concentration": 0,
- "quality": "string"
+ "humidity": {
+ "quality": "string",
+ "relativePercentage": 0
+ },
+ "indoorAirQuality": {
+ "quality": "string",
+ "score": 0
},
"noise": {
"ambient": {
@@ -410,26 +486,54 @@ meraki_response:
"quality": "string"
}
},
- "indoorAirQuality": {
- "score": 0,
+ "pm25": {
+ "concentration": 0,
+ "quality": "string"
+ },
+ "powerFactor": {
+ "percentage": 0
+ },
+ "realPower": {
+ "draw": 0
+ },
+ "temperature": {
+ "celsius": 0,
+ "fahrenheit": 0,
+ "quality": "string"
+ },
+ "tvoc": {
+ "concentration": 0,
"quality": "string"
+ },
+ "upstreamPower": {
+ "outageDetected": true
+ },
+ "voltage": {
+ "level": 0
+ },
+ "water": {
+ "present": true
}
- },
- "direction": "string",
- "duration": 0
+ }
}
],
+ "name": "string",
+ "profileId": "string",
"recipients": {
"emails": [
"string"
],
- "smsNumbers": [
+ "httpServerIds": [
"string"
],
- "httpServerIds": [
+ "smsNumbers": [
"string"
]
},
+ "schedule": {
+ "id": "string",
+ "name": "string"
+ },
"serials": [
"string"
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles_info.py
index 151433194..9f3ca1d12 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_alerts_profiles_info.py
@@ -109,38 +109,31 @@ meraki_response:
type: dict
sample: >
{
- "profileId": "string",
- "name": "string",
- "schedule": {
- "id": "string",
- "name": "string"
- },
"conditions": [
{
+ "direction": "string",
+ "duration": 0,
"metric": "string",
"threshold": {
- "temperature": {
- "celsius": 0,
- "fahrenheit": 0,
- "quality": "string"
- },
- "humidity": {
- "relativePercentage": 0,
- "quality": "string"
+ "apparentPower": {
+ "draw": 0
},
- "water": {
- "present": true
+ "current": {
+ "draw": 0
},
"door": {
"open": true
},
- "tvoc": {
- "concentration": 0,
- "quality": "string"
+ "frequency": {
+ "level": 0
},
- "pm25": {
- "concentration": 0,
- "quality": "string"
+ "humidity": {
+ "quality": "string",
+ "relativePercentage": 0
+ },
+ "indoorAirQuality": {
+ "quality": "string",
+ "score": 0
},
"noise": {
"ambient": {
@@ -148,26 +141,54 @@ meraki_response:
"quality": "string"
}
},
- "indoorAirQuality": {
- "score": 0,
+ "pm25": {
+ "concentration": 0,
"quality": "string"
+ },
+ "powerFactor": {
+ "percentage": 0
+ },
+ "realPower": {
+ "draw": 0
+ },
+ "temperature": {
+ "celsius": 0,
+ "fahrenheit": 0,
+ "quality": "string"
+ },
+ "tvoc": {
+ "concentration": 0,
+ "quality": "string"
+ },
+ "upstreamPower": {
+ "outageDetected": true
+ },
+ "voltage": {
+ "level": 0
+ },
+ "water": {
+ "present": true
}
- },
- "direction": "string",
- "duration": 0
+ }
}
],
+ "name": "string",
+ "profileId": "string",
"recipients": {
"emails": [
"string"
],
- "smsNumbers": [
+ "httpServerIds": [
"string"
],
- "httpServerIds": [
+ "smsNumbers": [
"string"
]
},
+ "schedule": {
+ "id": "string",
+ "name": "string"
+ },
"serials": [
"string"
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers.py
index 7503606ba..db086be0a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers.py
@@ -78,7 +78,7 @@ meraki_response:
type: dict
sample: >
{
- "mqttBrokerId": "string",
- "enabled": true
+ "enabled": true,
+ "mqttBrokerId": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers_info.py
index e4bf71113..27956dec0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_mqtt_brokers_info.py
@@ -113,7 +113,7 @@ meraki_response:
type: dict
sample: >
{
- "mqttBrokerId": "string",
- "enabled": true
+ "enabled": true,
+ "mqttBrokerId": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_relationships_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_relationships_info.py
index 759d7ecc1..f976325ff 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_relationships_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sensor_relationships_info.py
@@ -76,15 +76,15 @@ meraki_response:
{
"device": {
"name": "string",
- "serial": "string",
- "productType": "string"
+ "productType": "string",
+ "serial": "string"
},
"relationships": {
"livestream": {
"relatedDevices": [
{
- "serial": "string",
- "productType": "string"
+ "productType": "string",
+ "serial": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_settings.py b/ansible_collections/cisco/meraki/plugins/modules/networks_settings.py
index 06a298a59..a6529b36f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_settings.py
@@ -40,6 +40,13 @@ options:
</a><a target='_blank' href='http //wired.meraki.com/'>wired.meraki.com</a>).
Optional (defaults to false).
type: bool
+ namedVlans:
+ description: A hash of Named VLANs options applied to the Network.
+ suboptions:
+ enabled:
+ description: Enables / disables Named VLANs on the Network.
+ type: bool
+ type: dict
networkId:
description: NetworkId path parameter. Network ID.
type: str
@@ -99,6 +106,8 @@ EXAMPLES = r"""
enabled: false
password: miles123
localStatusPageEnabled: true
+ namedVlans:
+ enabled: true
networkId: string
remoteStatusPageEnabled: true
securePort:
@@ -112,26 +121,22 @@ meraki_response:
type: dict
sample: >
{
- "localStatusPageEnabled": true,
- "remoteStatusPageEnabled": true,
+ "fips": {
+ "enabled": true
+ },
"localStatusPage": {
"authentication": {
"enabled": true,
"username": "string"
}
},
- "securePort": {
- "enabled": true
- },
- "fips": {
- "enabled": true
- },
+ "localStatusPageEnabled": true,
"namedVlans": {
"enabled": true
},
- "clientPrivacy": {
- "expireDataOlderThan": 0,
- "expireDataBefore": "string"
+ "remoteStatusPageEnabled": true,
+ "securePort": {
+ "enabled": true
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_settings_info.py
index 981f935ef..b42f23284 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_settings_info.py
@@ -72,26 +72,22 @@ meraki_response:
type: dict
sample: >
{
- "localStatusPageEnabled": true,
- "remoteStatusPageEnabled": true,
+ "fips": {
+ "enabled": true
+ },
"localStatusPage": {
"authentication": {
"enabled": true,
"username": "string"
}
},
- "securePort": {
- "enabled": true
- },
- "fips": {
- "enabled": true
- },
+ "localStatusPageEnabled": true,
"namedVlans": {
"enabled": true
},
- "clientPrivacy": {
- "expireDataOlderThan": 0,
- "expireDataBefore": "string"
+ "remoteStatusPageEnabled": true,
+ "securePort": {
+ "enabled": true
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_bypass_activation_lock_attempts_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_bypass_activation_lock_attempts_info.py
index a0ced3278..827557db1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_bypass_activation_lock_attempts_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_bypass_activation_lock_attempts_info.py
@@ -75,6 +75,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "data": {
+ "2090938209": {
+ "errors": [
+ "string"
+ ],
+ "success": true
+ },
+ "38290139892": {
+ "success": true
+ }
+ },
+ "id": "string",
+ "status": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_certs_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_certs_info.py
index 2a220ae72..fb367f2e0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_certs_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_certs_info.py
@@ -79,14 +79,14 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "notValidAfter": "string",
- "notValidBefore": "string",
"certPem": "string",
"deviceId": "string",
+ "id": "string",
"issuer": "string",
- "subject": "string",
- "id": "string"
+ "name": "string",
+ "notValidAfter": "string",
+ "notValidBefore": "string",
+ "subject": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_checkin.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_checkin.py
index 1dfc1c63b..cd679eb9e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_checkin.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_checkin.py
@@ -83,9 +83,9 @@ EXAMPLES = r"""
- tag1
- tag2
serials:
- - Q234-ABCD-0001
- - Q234-ABCD-0002
- - Q234-ABCD-0003
+ - XY0XX0Y0X0
+ - A01B01CD00E
+ - X02YZ1ZYZX
wifiMacs:
- 00:11:22:33:44:55
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_desktop_logs_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_desktop_logs_info.py
index 0b90c88b4..6b67442bd 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_desktop_logs_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_desktop_logs_info.py
@@ -103,24 +103,24 @@ meraki_response:
sample: >
[
{
+ "dhcpServer": "string",
+ "dnsServer": "string",
+ "gateway": "string",
+ "ip": "string",
"measuredAt": "string",
- "user": "string",
"networkDevice": "string",
"networkDriver": "string",
- "wifiChannel": "string",
+ "networkMTU": "string",
+ "publicIP": "string",
+ "subnet": "string",
+ "ts": "string",
+ "user": "string",
"wifiAuth": "string",
"wifiBssid": "string",
- "wifiSsid": "string",
- "wifiRssi": "string",
+ "wifiChannel": "string",
"wifiNoise": "string",
- "dhcpServer": "string",
- "ip": "string",
- "networkMTU": "string",
- "subnet": "string",
- "gateway": "string",
- "publicIP": "string",
- "dnsServer": "string",
- "ts": "string"
+ "wifiRssi": "string",
+ "wifiSsid": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_command_logs_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_command_logs_info.py
index 255e05013..f3d21b8b1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_command_logs_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_command_logs_info.py
@@ -107,9 +107,9 @@ meraki_response:
[
{
"action": "string",
- "name": "string",
- "details": "string",
"dashboardUser": "string",
+ "details": "string",
+ "name": "string",
"ts": "string"
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_profiles_info.py
index fe6883bb9..0a076c7ae 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_device_profiles_info.py
@@ -83,9 +83,9 @@ meraki_response:
"id": "string",
"isEncrypted": true,
"isManaged": true,
+ "name": "string",
"profileData": "string",
"profileIdentifier": "string",
- "name": "string",
"version": "string"
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_fields.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_fields.py
index 57b97c54f..5560a6e52 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_fields.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_fields.py
@@ -81,7 +81,7 @@ EXAMPLES = r"""
notes: Here's some info about my device
id: '1284392014819'
networkId: string
- serial: Q234-ABCD-5678
+ serial: XY0XX0Y0X0
wifiMac: 00:11:22:33:44:55
"""
@@ -95,9 +95,9 @@ meraki_response:
{
"id": "string",
"name": "string",
- "wifiMac": "string",
+ "notes": "string",
"serial": "string",
- "notes": "string"
+ "wifiMac": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_info.py
index ca4a080e0..7826fa7c8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_info.py
@@ -35,7 +35,7 @@ options:
cellularDataUsed, isHotspotEnabled, createdAt, batteryEstCharge, quarantined, avName, avRunning, asName,
fwName, isRooted, loginRequired, screenLockEnabled, screenLockDelay, autoLoginDisabled, autoTags, hasMdm,
hasDesktopAgent, diskEncryptionEnabled, hardwareEncryptionCaps, passCodeLock, usesHardwareKeystore,
- androidSecurityPatchVersion, and url.
+ androidSecurityPatchVersion, cellular, and url.
elements: str
type: list
wifiMacs:
@@ -53,6 +53,16 @@ options:
- Ids query parameter. Filter devices by id(s).
elements: str
type: list
+ uuids:
+ description:
+ - Uuids query parameter. Filter devices by uuid(s).
+ elements: str
+ type: list
+ systemTypes:
+ description:
+ - SystemTypes query parameter. Filter devices by system type(s).
+ elements: str
+ type: list
scope:
description:
- >
@@ -120,6 +130,8 @@ EXAMPLES = r"""
wifiMacs: []
serials: []
ids: []
+ uuids: []
+ systemTypes: []
scope: []
perPage: 0
startingAfter: string
@@ -140,19 +152,19 @@ meraki_response:
[
{
"id": "string",
+ "ip": "string",
"name": "string",
+ "notes": "string",
+ "osName": "string",
+ "serial": "string",
+ "serialNumber": "string",
+ "ssid": "string",
+ "systemModel": "string",
"tags": [
"string"
],
- "ssid": "string",
- "wifiMac": "string",
- "osName": "string",
- "systemModel": "string",
"uuid": "string",
- "serialNumber": "string",
- "serial": "string",
- "ip": "string",
- "notes": "string"
+ "wifiMac": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_install_apps.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_install_apps.py
new file mode 100644
index 000000000..8038f69f0
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_install_apps.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_sm_devices_install_apps
+short_description: Resource module for networks _sm _devices _installapps
+description:
+- Manage operation create of the resource networks _sm _devices _installapps.
+- Install applications on a device.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ appIds:
+ description: Ids of applications to be installed.
+ elements: str
+ type: list
+ deviceId:
+ description: DeviceId path parameter. Device ID.
+ type: str
+ force:
+ description: By default, installation of an app which is believed to already be
+ present on the device will be skipped. If you'd like to force the installation
+ of the app, set this parameter to true.
+ type: bool
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm installNetworkSmDeviceApps
+ description: Complete reference of the installNetworkSmDeviceApps API.
+ link: https://developer.cisco.com/meraki/api-v1/#!install-network-sm-device-apps
+notes:
+ - SDK Method used are
+ sm.Sm.install_network_sm_device_apps,
+
+ - Paths used are
+ post /networks/{networkId}/sm/devices/{deviceId}/installApps,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_sm_devices_install_apps:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ appIds:
+ - '1284392014819'
+ - '2983092129865'
+ deviceId: string
+ force: false
+ networkId: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {}
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_lock.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_lock.py
index 9f4c7c560..e55489942 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_lock.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_lock.py
@@ -29,7 +29,7 @@ options:
type: int
scope:
description: The scope (one of all, none, withAny, withAll, withoutAny, or withoutAll)
- and a set of tags of the devices to be wiped.
+ and a set of tags of the devices to be locked.
elements: str
type: list
serials:
@@ -88,9 +88,9 @@ EXAMPLES = r"""
- tag1
- tag2
serials:
- - Q234-ABCD-0001
- - Q234-ABCD-0002
- - Q234-ABCD-0003
+ - XY0XX0Y0X0
+ - A01B01CD00E
+ - X02YZ1ZYZX
wifiMacs:
- 00:11:22:33:44:55
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_modify_tags.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_modify_tags.py
index a67885428..71dbec17a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_modify_tags.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_modify_tags.py
@@ -89,9 +89,9 @@ EXAMPLES = r"""
scope:
- withAny, old_tag
serials:
- - Q234-ABCD-0001
- - Q234-ABCD-0002
- - Q234-ABCD-0003
+ - XY0XX0Y0X0
+ - A01B01CD00E
+ - X02YZ1ZYZX
tags:
- tag1
- tag2
@@ -109,11 +109,11 @@ meraki_response:
[
{
"id": "string",
+ "serial": "string",
"tags": [
"string"
],
- "wifiMac": "string",
- "serial": "string"
+ "wifiMac": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_move.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_move.py
index 822eb7715..0a4a627c1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_move.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_move.py
@@ -87,9 +87,9 @@ EXAMPLES = r"""
- tag1
- tag2
serials:
- - Q234-ABCD-0001
- - Q234-ABCD-0002
- - Q234-ABCD-0003
+ - XY0XX0Y0X0
+ - A01B01CD00E
+ - X02YZ1ZYZX
wifiMacs:
- 00:11:22:33:44:55
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_performance_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_performance_history_info.py
index 08ce482cf..e624aa532 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_performance_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_performance_history_info.py
@@ -104,19 +104,19 @@ meraki_response:
[
{
"cpuPercentUsed": 0,
- "memFree": 0,
- "memWired": 0,
- "memActive": 0,
- "memInactive": 0,
- "networkSent": 0,
- "networkReceived": 0,
- "swapUsed": 0,
"diskUsage": {
"c": {
- "used": 0,
- "space": 0
+ "space": 0,
+ "used": 0
}
},
+ "memActive": 0,
+ "memFree": 0,
+ "memInactive": 0,
+ "memWired": 0,
+ "networkReceived": 0,
+ "networkSent": 0,
+ "swapUsed": 0,
"ts": "string"
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_reboot.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_reboot.py
new file mode 100644
index 000000000..915ef3e40
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_reboot.py
@@ -0,0 +1,126 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_sm_devices_reboot
+short_description: Resource module for networks _sm _devices _reboot
+description:
+- Manage operation create of the resource networks _sm _devices _reboot.
+- Reboot a set of endpoints.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ ids:
+ description: The ids of the endpoints to be rebooted.
+ elements: str
+ type: list
+ kextPaths:
+ description: The KextPaths of the endpoints to be rebooted. Available for macOS
+ 11+.
+ elements: str
+ type: list
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ notifyUser:
+ description: Whether or not to notify the user before rebooting the endpoint. Available
+ for macOS 11.3+.
+ type: bool
+ rebuildKernelCache:
+ description: Whether or not to rebuild the kernel cache when rebooting the endpoint.
+ Available for macOS 11+.
+ type: bool
+ requestRequiresNetworkTether:
+ description: Whether or not the request requires network tethering. Available for
+ macOS and supervised iOS or tvOS.
+ type: bool
+ scope:
+ description: The scope (one of all, none, withAny, withAll, withoutAny, or withoutAll)
+ and a set of tags of the endpoints to be rebooted.
+ elements: str
+ type: list
+ serials:
+ description: The serials of the endpoints to be rebooted.
+ elements: str
+ type: list
+ wifiMacs:
+ description: The wifiMacs of the endpoints to be rebooted.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm rebootNetworkSmDevices
+ description: Complete reference of the rebootNetworkSmDevices API.
+ link: https://developer.cisco.com/meraki/api-v1/#!reboot-network-sm-devices
+notes:
+ - SDK Method used are
+ sm.Sm.reboot_network_sm_devices,
+
+ - Paths used are
+ post /networks/{networkId}/sm/devices/reboot,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_sm_devices_reboot:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ ids:
+ - '1284392014819'
+ - '2983092129865'
+ kextPaths:
+ - test
+ networkId: string
+ notifyUser: true
+ rebuildKernelCache: true
+ requestRequiresNetworkTether: true
+ scope:
+ - withAny
+ - tag1
+ - tag2
+ serials:
+ - XY0XX0Y0X0
+ - A01B01CD00E
+ - X02YZ1ZYZX
+ wifiMacs:
+ - 00:11:22:33:44:55
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "ids": [
+ "string"
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_security_centers_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_security_centers_info.py
index 0b375bccf..22874c3b3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_security_centers_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_security_centers_info.py
@@ -92,7 +92,6 @@ meraki_response:
"id": "string",
"identifier": "string",
"installedAt": "string",
- "toInstall": true,
"iosRedemptionCode": true,
"isManaged": true,
"itunesId": "string",
@@ -102,6 +101,7 @@ meraki_response:
"redemptionCode": 0,
"shortVersion": "string",
"status": "string",
+ "toInstall": true,
"toUninstall": true,
"uninstalledAt": "string",
"updatedAt": "string",
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_shutdown.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_shutdown.py
new file mode 100644
index 000000000..0c92fcb85
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_shutdown.py
@@ -0,0 +1,104 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_sm_devices_shutdown
+short_description: Resource module for networks _sm _devices _shutdown
+description:
+- Manage operation create of the resource networks _sm _devices _shutdown.
+- Shutdown a set of endpoints.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ ids:
+ description: The ids of the endpoints to be shutdown.
+ elements: str
+ type: list
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ scope:
+ description: The scope (one of all, none, withAny, withAll, withoutAny, or withoutAll)
+ and a set of tags of the endpoints to be shutdown.
+ elements: str
+ type: list
+ serials:
+ description: The serials of the endpoints to be shutdown.
+ elements: str
+ type: list
+ wifiMacs:
+ description: The wifiMacs of the endpoints to be shutdown.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm shutdownNetworkSmDevices
+ description: Complete reference of the shutdownNetworkSmDevices API.
+ link: https://developer.cisco.com/meraki/api-v1/#!shutdown-network-sm-devices
+notes:
+ - SDK Method used are
+ sm.Sm.shutdown_network_sm_devices,
+
+ - Paths used are
+ post /networks/{networkId}/sm/devices/shutdown,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_sm_devices_shutdown:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ ids:
+ - '1284392014819'
+ - '2983092129865'
+ networkId: string
+ scope:
+ - withAny
+ - tag1
+ - tag2
+ serials:
+ - XY0XX0Y0X0
+ - A01B01CD00E
+ - X02YZ1ZYZX
+ wifiMacs:
+ - 00:11:22:33:44:55
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "ids": [
+ "string"
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_unenroll.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_unenroll.py
index aa23004df..560571fe2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_unenroll.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_unenroll.py
@@ -70,5 +70,7 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "success": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_uninstall_apps.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_uninstall_apps.py
new file mode 100644
index 000000000..938728a96
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_uninstall_apps.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_sm_devices_uninstall_apps
+short_description: Resource module for networks _sm _devices _uninstallapps
+description:
+- Manage operation create of the resource networks _sm _devices _uninstallapps.
+- Uninstall applications on a device.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ appIds:
+ description: Ids of applications to be uninstalled.
+ elements: str
+ type: list
+ deviceId:
+ description: DeviceId path parameter. Device ID.
+ type: str
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm uninstallNetworkSmDeviceApps
+ description: Complete reference of the uninstallNetworkSmDeviceApps API.
+ link: https://developer.cisco.com/meraki/api-v1/#!uninstall-network-sm-device-apps
+notes:
+ - SDK Method used are
+ sm.Sm.uninstall_network_sm_device_apps,
+
+ - Paths used are
+ post /networks/{networkId}/sm/devices/{deviceId}/uninstallApps,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_sm_devices_uninstall_apps:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ appIds:
+ - '1284392014819'
+ - '2983092129865'
+ deviceId: string
+ networkId: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {}
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wipe.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wipe.py
index 898ef5533..fe83157b0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wipe.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_devices_wipe.py
@@ -73,7 +73,7 @@ EXAMPLES = r"""
id: '1284392014819'
networkId: string
pin: 123456
- serial: Q234-ABCD-5678
+ serial: XY0XX0Y0X0
wifiMac: 00:11:22:33:44:55
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_profiles_info.py
index d604680c3..9deb6ed0f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_profiles_info.py
@@ -23,6 +23,11 @@ options:
description:
- NetworkId path parameter. Network ID.
type: str
+ payloadTypes:
+ description:
+ - PayloadTypes query parameter. Filter by payload types.
+ elements: str
+ type: list
requirements:
- meraki >= 2.4.9
- python >= 3.5
@@ -61,6 +66,7 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ payloadTypes: []
networkId: string
register: result
@@ -74,9 +80,12 @@ meraki_response:
sample: >
[
{
+ "description": "string",
"id": "string",
"name": "string",
- "description": "string",
+ "payloadTypes": [
+ "string"
+ ],
"scope": "string",
"tags": [
"string"
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups.py
index d9f5747d0..f6f047caa 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups.py
@@ -81,13 +81,11 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
- name: My target group
+ name: Target group name
networkId: string
- scope: none
- tags: '[]'
- type: devices
+ scope: withAny, tag1, tag2
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_sm_target_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -109,15 +107,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- name: My target group
+ state: absent
networkId: string
- scope: none
- tags: '[]'
targetGroupId: string
- type: devices
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_sm_target_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -139,8 +133,10 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ name: Target group name
networkId: string
+ scope: withAny, tag1, tag2
targetGroupId: string
"""
@@ -150,5 +146,12 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "id": "string",
+ "name": "string",
+ "scope": "string",
+ "tags": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups_info.py
index 89fdccd5b..ffeee56aa 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_target_groups_info.py
@@ -114,10 +114,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "id": "string",
+ "name": "string",
+ "scope": "string",
+ "tags": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_trusted_access_configs_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_trusted_access_configs_info.py
index 186fadc18..eff8e9682 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_trusted_access_configs_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_trusted_access_configs_info.py
@@ -98,16 +98,19 @@ meraki_response:
sample: >
[
{
+ "accessEndAt": "string",
+ "accessStartAt": "string",
+ "additionalEmailText": "string",
"id": "string",
- "ssidName": "string",
"name": "string",
+ "notifyTimeBeforeAccessEnds": 0,
"scope": "string",
+ "sendExpirationEmails": true,
+ "ssidName": "string",
"tags": [
"string"
],
- "timeboundType": "string",
- "accessStartAt": "string",
- "accessEndAt": "string"
+ "timeboundType": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_user_access_devices_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_user_access_devices_info.py
index 8062c6c51..92e448472 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_user_access_devices_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_user_access_devices_info.py
@@ -98,23 +98,23 @@ meraki_response:
sample: >
[
{
+ "email": "string",
"id": "string",
+ "mac": "string",
"name": "string",
"systemType": "string",
- "mac": "string",
- "username": "string",
- "email": "string",
"tags": [
"string"
],
"trustedAccessConnections": [
{
- "trustedAccessConfigId": "string",
"downloadedAt": "string",
+ "lastConnectedAt": "string",
"scepCompletedAt": "string",
- "lastConnectedAt": "string"
+ "trustedAccessConfigId": "string"
}
- ]
+ ],
+ "username": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_device_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_device_profiles_info.py
index c431cc0f7..585e2cffe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_device_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_device_profiles_info.py
@@ -83,9 +83,9 @@ meraki_response:
"id": "string",
"isEncrypted": true,
"isManaged": true,
+ "name": "string",
"profileData": "string",
"profileIdentifier": "string",
- "name": "string",
"version": "string"
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_info.py
index 415e8595f..80b6839b8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_info.py
@@ -100,28 +100,28 @@ meraki_response:
sample: >
[
{
- "id": "string",
- "email": "string",
- "fullName": "string",
- "username": "string",
- "hasPassword": true,
- "tags": "string",
"adGroups": [
"string"
],
- "azureAdGroups": [
- "string"
- ],
- "samlGroups": [
+ "asmGroups": [
"string"
],
- "asmGroups": [
+ "azureAdGroups": [
"string"
],
- "isExternal": true,
"displayName": "string",
+ "email": "string",
+ "fullName": "string",
"hasIdentityCertificate": true,
- "userThumbnail": "string"
+ "hasPassword": true,
+ "id": "string",
+ "isExternal": true,
+ "samlGroups": [
+ "string"
+ ],
+ "tags": "string",
+ "userThumbnail": "string",
+ "username": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_softwares_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_softwares_info.py
index 03f436cc1..6ae05cbb9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_softwares_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_sm_users_softwares_info.py
@@ -87,7 +87,6 @@ meraki_response:
"id": "string",
"identifier": "string",
"installedAt": "string",
- "toInstall": true,
"iosRedemptionCode": true,
"isManaged": true,
"itunesId": "string",
@@ -97,6 +96,7 @@ meraki_response:
"redemptionCode": 0,
"shortVersion": "string",
"status": "string",
+ "toInstall": true,
"toUninstall": true,
"uninstalledAt": "string",
"updatedAt": "string",
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_snmp.py b/ansible_collections/cisco/meraki/plugins/modules/networks_snmp.py
index 5c17335a7..f9b6c0a6d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_snmp.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_snmp.py
@@ -77,6 +77,7 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
access: users
+ communityString: sample
networkId: string
users:
- passphrase: hunter2
@@ -89,5 +90,14 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "access": "string",
+ "communityString": "string",
+ "users": [
+ {
+ "passphrase": "string",
+ "username": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_snmp_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_snmp_info.py
index 4ca9958df..31fbc2aab 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_snmp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_snmp_info.py
@@ -70,6 +70,15 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "access": "string",
+ "communityString": "string",
+ "users": [
+ {
+ "passphrase": "string",
+ "username": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_split.py b/ansible_collections/cisco/meraki/plugins/modules/networks_split.py
index 9eda61958..af15765be 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_split.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_split.py
@@ -69,20 +69,20 @@ meraki_response:
{
"resultingNetworks": [
{
+ "enrollmentString": "string",
"id": "string",
- "organizationId": "string",
+ "isBoundToConfigTemplate": true,
"name": "string",
+ "notes": "string",
+ "organizationId": "string",
"productTypes": [
"string"
],
- "timeZone": "string",
"tags": [
"string"
],
- "enrollmentString": "string",
- "url": "string",
- "notes": "string",
- "isBoundToConfigTemplate": true
+ "timeZone": "string",
+ "url": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists.py
index fac22efdb..be67e1c03 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists.py
@@ -117,13 +117,13 @@ meraki_response:
[
{
"comment": "string",
- "policy": "string",
+ "dstCidr": "string",
+ "dstPort": "string",
"ipVersion": "string",
+ "policy": "string",
"protocol": "string",
"srcCidr": "string",
"srcPort": "string",
- "dstCidr": "string",
- "dstPort": "string",
"vlan": "string"
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists_info.py
index 782199ed5..62bf7eeef 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_control_lists_info.py
@@ -75,13 +75,13 @@ meraki_response:
[
{
"comment": "string",
- "policy": "string",
+ "dstCidr": "string",
+ "dstPort": "string",
"ipVersion": "string",
+ "policy": "string",
"protocol": "string",
"srcCidr": "string",
"srcPort": "string",
- "dstCidr": "string",
- "dstPort": "string",
"vlan": "string"
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies.py
index 6362763ed..3322ecc19 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies.py
@@ -228,6 +228,32 @@ EXAMPLES = r"""
- 192.168.1.0/24
voiceVlanClients: true
+- name: Delete by id
+ cisco.meraki.networks_switch_access_policies:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ accessPolicyNumber: string
+ networkId: string
+
- name: Update by id
cisco.meraki.networks_switch_access_policies:
meraki_api_key: "{{meraki_api_key}}"
@@ -285,32 +311,6 @@ EXAMPLES = r"""
- 192.168.1.0/24
voiceVlanClients: true
-- name: Delete by id
- cisco.meraki.networks_switch_access_policies:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- accessPolicyNumber: string
- networkId: string
-
"""
RETURN = r"""
meraki_response:
@@ -319,25 +319,29 @@ meraki_response:
type: dict
sample: >
{
- "name": "string",
- "radiusServers": [
- {
- "host": "string",
- "port": 0
+ "accessPolicyType": "string",
+ "counts": {
+ "ports": {
+ "withThisPolicy": 0
}
- ],
+ },
+ "dot1x": {
+ "controlDirection": "string"
+ },
+ "guestPortBouncing": true,
+ "guestVlanId": 0,
+ "hostMode": "string",
+ "increaseAccessSpeed": true,
+ "name": "string",
"radius": {
"criticalAuth": {
"dataVlanId": 0,
- "voiceVlanId": 0,
- "suspendPortBounce": true
+ "suspendPortBounce": true,
+ "voiceVlanId": 0
},
"failedAuthVlanId": 0,
"reAuthenticationInterval": 0
},
- "guestPortBouncing": true,
- "radiusTestingEnabled": true,
- "radiusCoaSupportEnabled": true,
"radiusAccountingEnabled": true,
"radiusAccountingServers": [
{
@@ -345,18 +349,19 @@ meraki_response:
"port": 0
}
],
+ "radiusCoaSupportEnabled": true,
"radiusGroupAttribute": "string",
- "hostMode": "string",
- "accessPolicyType": "string",
- "increaseAccessSpeed": true,
- "guestVlanId": 0,
- "dot1x": {
- "controlDirection": "string"
- },
- "voiceVlanClients": true,
+ "radiusServers": [
+ {
+ "host": "string",
+ "port": 0
+ }
+ ],
+ "radiusTestingEnabled": true,
"urlRedirectWalledGardenEnabled": true,
"urlRedirectWalledGardenRanges": [
"string"
- ]
+ ],
+ "voiceVlanClients": true
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies_info.py
index fe1c7310e..fe9dddbaf 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_access_policies_info.py
@@ -111,25 +111,29 @@ meraki_response:
type: dict
sample: >
{
- "name": "string",
- "radiusServers": [
- {
- "host": "string",
- "port": 0
+ "accessPolicyType": "string",
+ "counts": {
+ "ports": {
+ "withThisPolicy": 0
}
- ],
+ },
+ "dot1x": {
+ "controlDirection": "string"
+ },
+ "guestPortBouncing": true,
+ "guestVlanId": 0,
+ "hostMode": "string",
+ "increaseAccessSpeed": true,
+ "name": "string",
"radius": {
"criticalAuth": {
"dataVlanId": 0,
- "voiceVlanId": 0,
- "suspendPortBounce": true
+ "suspendPortBounce": true,
+ "voiceVlanId": 0
},
"failedAuthVlanId": 0,
"reAuthenticationInterval": 0
},
- "guestPortBouncing": true,
- "radiusTestingEnabled": true,
- "radiusCoaSupportEnabled": true,
"radiusAccountingEnabled": true,
"radiusAccountingServers": [
{
@@ -137,18 +141,19 @@ meraki_response:
"port": 0
}
],
+ "radiusCoaSupportEnabled": true,
"radiusGroupAttribute": "string",
- "hostMode": "string",
- "accessPolicyType": "string",
- "increaseAccessSpeed": true,
- "guestVlanId": 0,
- "dot1x": {
- "controlDirection": "string"
- },
- "voiceVlanClients": true,
+ "radiusServers": [
+ {
+ "host": "string",
+ "port": 0
+ }
+ ],
+ "radiusTestingEnabled": true,
"urlRedirectWalledGardenEnabled": true,
"urlRedirectWalledGardenRanges": [
"string"
- ]
+ ],
+ "voiceVlanClients": true
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_alternate_management_interface_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_alternate_management_interface_info.py
index a576b95ec..af4d2ba80 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_alternate_management_interface_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_alternate_management_interface_info.py
@@ -70,6 +70,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "enabled": true,
+ "protocols": [
+ "string"
+ ],
+ "switches": [
+ {
+ "alternateManagementIp": "string",
+ "gateway": "string",
+ "serial": "string",
+ "subnetMask": "string"
+ }
+ ],
+ "vlanId": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy.py
index b381c0d4a..7cee1227d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy.py
@@ -95,12 +95,12 @@ EXAMPLES = r"""
state: present
alerts:
email:
- enabled: false
+ enabled: true
allowedServers:
- 00:50:56:00:00:01
- 00:50:56:00:00:02
arpInspection:
- enabled: false
+ enabled: true
blockedServers:
- 00:50:56:00:00:03
- 00:50:56:00:00:04
@@ -114,5 +114,24 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "alerts": {
+ "email": {
+ "enabled": true
+ }
+ },
+ "allowedServers": [
+ "string"
+ ],
+ "arpInspection": {
+ "enabled": true,
+ "unsupportedModels": [
+ "string"
+ ]
+ },
+ "blockedServers": [
+ "string"
+ ],
+ "defaultPolicy": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py
index b44011380..abc33d08a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers.py
@@ -93,7 +93,7 @@ EXAMPLES = r"""
networkId: string
vlan: 100
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_switch_dhcp_server_policy_arp_inspection_trusted_servers:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -115,15 +115,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- ipv4:
- address: 1.2.3.4
- mac: 00:11:22:33:44:55
+ state: absent
networkId: string
trustedServerId: string
- vlan: 100
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_switch_dhcp_server_policy_arp_inspection_trusted_servers:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -145,9 +141,13 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ ipv4:
+ address: 1.2.3.4
+ mac: 00:11:22:33:44:55
networkId: string
trustedServerId: string
+ vlan: 100
"""
RETURN = r"""
@@ -157,11 +157,11 @@ meraki_response:
type: dict
sample: >
{
- "trustedServerId": "string",
- "mac": "string",
- "vlan": 0,
"ipv4": {
"address": "string"
- }
+ },
+ "mac": "string",
+ "trustedServerId": "string",
+ "vlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers_info.py
index e654b5159..c9b72ace5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_trusted_servers_info.py
@@ -100,12 +100,12 @@ meraki_response:
sample: >
[
{
- "trustedServerId": "string",
- "mac": "string",
- "vlan": 0,
"ipv4": {
"address": "string"
- }
+ },
+ "mac": "string",
+ "trustedServerId": "string",
+ "vlan": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_warnings_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_warnings_by_device_info.py
index ea6429340..f21ec3b9c 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_warnings_by_device_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_arp_inspection_warnings_by_device_info.py
@@ -98,11 +98,11 @@ meraki_response:
sample: >
[
{
- "serial": "string",
+ "hasTrustedPort": true,
"name": "string",
- "url": "string",
+ "serial": "string",
"supportsInspection": true,
- "hasTrustedPort": true
+ "url": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_info.py
index 471741bc3..895a259d0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_server_policy_info.py
@@ -72,6 +72,25 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "alerts": {
+ "email": {
+ "enabled": true
+ }
+ },
+ "allowedServers": [
+ "string"
+ ],
+ "arpInspection": {
+ "enabled": true,
+ "unsupportedModels": [
+ "string"
+ ]
+ },
+ "blockedServers": [
+ "string"
+ ],
+ "defaultPolicy": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_v4_servers_seen_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_v4_servers_seen_info.py
index 824bbceea..b95a1890f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_v4_servers_seen_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dhcp_v4_servers_seen_info.py
@@ -111,98 +111,98 @@ meraki_response:
sample: >
[
{
- "mac": "string",
- "vlan": 0,
"clientId": "string",
- "isAllowed": true,
- "lastSeenAt": "string",
- "seenBy": [
- {
- "serial": "string",
- "name": "string",
- "url": "string"
- }
- ],
- "type": "string",
"device": {
- "serial": "string",
- "name": "string",
- "url": "string",
"interface": {
"name": "string",
"url": "string"
- }
+ },
+ "name": "string",
+ "serial": "string",
+ "url": "string"
},
"ipv4": {
"address": "string",
- "subnet": "string",
- "gateway": "string"
+ "gateway": "string",
+ "subnet": "string"
},
+ "isAllowed": true,
"isConfigured": true,
"lastAck": {
- "ts": "string",
"ipv4": {
"address": "string"
- }
+ },
+ "ts": "string"
},
"lastPacket": {
- "source": {
- "mac": "string",
- "ipv4": {
- "address": "string"
- },
- "port": 0
- },
"destination": {
- "mac": "string",
"ipv4": {
"address": "string"
},
+ "mac": "string",
"port": 0
},
- "type": "string",
"ethernet": {
"type": "string"
},
- "ip": {
- "id": "string",
- "version": 0,
- "length": 0,
- "headerLength": 0,
- "protocol": 0,
- "ttl": 0,
- "dscp": {
- "tag": 0,
- "ecn": 0
- }
- },
- "udp": {
- "length": 0,
- "checksum": "string"
- },
"fields": {
- "op": 0,
- "htype": 0,
- "hlen": 0,
- "hops": 0,
- "xid": "string",
- "secs": 0,
- "flags": "string",
+ "chaddr": "string",
"ciaddr": "string",
- "yiaddr": "string",
- "siaddr": "string",
+ "flags": "string",
"giaddr": "string",
- "chaddr": "string",
- "sname": "string",
+ "hlen": 0,
+ "hops": 0,
+ "htype": 0,
"magicCookie": "string",
+ "op": 0,
"options": [
{
"name": "string",
"value": "string"
}
- ]
+ ],
+ "secs": 0,
+ "siaddr": "string",
+ "sname": "string",
+ "xid": "string",
+ "yiaddr": "string"
+ },
+ "ip": {
+ "dscp": {
+ "ecn": 0,
+ "tag": 0
+ },
+ "headerLength": 0,
+ "id": "string",
+ "length": 0,
+ "protocol": 0,
+ "ttl": 0,
+ "version": 0
+ },
+ "source": {
+ "ipv4": {
+ "address": "string"
+ },
+ "mac": "string",
+ "port": 0
+ },
+ "type": "string",
+ "udp": {
+ "checksum": "string",
+ "length": 0
}
- }
+ },
+ "lastSeenAt": "string",
+ "mac": "string",
+ "seenBy": [
+ {
+ "name": "string",
+ "serial": "string",
+ "url": "string"
+ }
+ ],
+ "type": "string",
+ "vlan": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dscp_to_cos_mappings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dscp_to_cos_mappings_info.py
index b13cc894c..9bc619a76 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dscp_to_cos_mappings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_dscp_to_cos_mappings_info.py
@@ -69,7 +69,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "cos": 0,
+ "dscp": 0,
+ "title": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations.py
index 297dc628a..8a2b66e20 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations.py
@@ -120,7 +120,7 @@ EXAMPLES = r"""
- portId: '8'
serial: Q234-ABCD-0008
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_switch_link_aggregations:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -142,29 +142,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- id: NDU2N18yXzM=
+ state: absent
linkAggregationId: string
networkId: string
- switchPorts:
- - portId: '1'
- serial: Q234-ABCD-0001
- - portId: '2'
- serial: Q234-ABCD-0002
- - portId: '3'
- serial: Q234-ABCD-0003
- - portId: '4'
- serial: Q234-ABCD-0004
- - portId: '5'
- serial: Q234-ABCD-0005
- - portId: '6'
- serial: Q234-ABCD-0006
- - portId: '7'
- serial: Q234-ABCD-0007
- - portId: '8'
- serial: Q234-ABCD-0008
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_switch_link_aggregations:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -186,9 +168,27 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ id: NDU2N18yXzM=
linkAggregationId: string
networkId: string
+ switchPorts:
+ - portId: '1'
+ serial: Q234-ABCD-0001
+ - portId: '2'
+ serial: Q234-ABCD-0002
+ - portId: '3'
+ serial: Q234-ABCD-0003
+ - portId: '4'
+ serial: Q234-ABCD-0004
+ - portId: '5'
+ serial: Q234-ABCD-0005
+ - portId: '6'
+ serial: Q234-ABCD-0006
+ - portId: '7'
+ serial: Q234-ABCD-0007
+ - portId: '8'
+ serial: Q234-ABCD-0008
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations_info.py
index 5b2d93fe6..a18dab1a4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_link_aggregations_info.py
@@ -77,8 +77,8 @@ meraki_response:
"id": "string",
"switchPorts": [
{
- "serial": "string",
- "portId": "string"
+ "portId": "string",
+ "serial": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu.py
index 1d981d779..c0cecd5a0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu.py
@@ -23,15 +23,15 @@ options:
description: NetworkId path parameter. Network ID.
type: str
overrides:
- description: Override MTU size for individual switches or switch profiles. An empty
+ description: Override MTU size for individual switches or switch templates. An empty
array will clear overrides.
elements: dict
suboptions:
mtuSize:
- description: MTU size for the switches or switch profiles.
+ description: MTU size for the switches or switch templates.
type: int
switchProfiles:
- description: List of switch profile IDs. Applicable only for template network.
+ description: List of switch template IDs. Applicable only for template network.
elements: str
type: list
switches:
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu_info.py
index 1cc1be9bf..b037ff64b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_mtu_info.py
@@ -75,13 +75,13 @@ meraki_response:
"defaultMtuSize": 0,
"overrides": [
{
- "switches": [
- "string"
- ],
+ "mtuSize": 0,
"switchProfiles": [
"string"
],
- "mtuSize": 0
+ "switches": [
+ "string"
+ ]
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules.py
index 9b714e198..f07e52f59 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules.py
@@ -241,6 +241,32 @@ EXAMPLES = r"""
from: '9:00'
to: '17:00'
+- name: Delete by id
+ cisco.meraki.networks_switch_port_schedules:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ networkId: string
+ portScheduleId: string
+
- name: Update by id
cisco.meraki.networks_switch_port_schedules:
meraki_api_key: "{{meraki_api_key}}"
@@ -297,32 +323,6 @@ EXAMPLES = r"""
to: '17:00'
portScheduleId: string
-- name: Delete by id
- cisco.meraki.networks_switch_port_schedules:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- networkId: string
- portScheduleId: string
-
"""
RETURN = r"""
meraki_response:
@@ -330,5 +330,46 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "id": "string",
+ "name": "string",
+ "networkId": "string",
+ "portSchedule": {
+ "friday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "monday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "saturday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "sunday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "thursday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "tuesday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ },
+ "wednesday": {
+ "active": true,
+ "from": "string",
+ "to": "string"
+ }
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules_info.py
index 8a409eb51..aef71adc7 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_port_schedules_info.py
@@ -76,38 +76,39 @@ meraki_response:
{
"id": "string",
"name": "string",
+ "networkId": "string",
"portSchedule": {
- "monday": {
+ "friday": {
"active": true,
"from": "string",
"to": "string"
},
- "tuesday": {
+ "monday": {
"active": true,
"from": "string",
"to": "string"
},
- "wednesday": {
+ "saturday": {
"active": true,
"from": "string",
"to": "string"
},
- "thursday": {
+ "sunday": {
"active": true,
"from": "string",
"to": "string"
},
- "friday": {
+ "thursday": {
"active": true,
"from": "string",
"to": "string"
},
- "saturday": {
+ "tuesday": {
"active": true,
"from": "string",
"to": "string"
},
- "sunday": {
+ "wednesday": {
"active": true,
"from": "string",
"to": "string"
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order.py
index f3bddd377..e5cc50e47 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order.py
@@ -108,7 +108,7 @@ EXAMPLES = r"""
srcPortRange: 70-80
vlan: 100
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_switch_qos_rules_order:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -130,18 +130,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- dscp: 0
- dstPort: 3000
- dstPortRange: 3000-3100
+ state: absent
networkId: string
- protocol: TCP
qosRuleId: string
- srcPort: 2000
- srcPortRange: 70-80
- vlan: 100
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_switch_qos_rules_order:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -163,9 +156,16 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ dscp: 0
+ dstPort: 3000
+ dstPortRange: 3000-3100
networkId: string
+ protocol: TCP
qosRuleId: string
+ srcPort: 2000
+ srcPortRange: 70-80
+ vlan: 100
"""
RETURN = r"""
@@ -174,5 +174,14 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "dscp": 0,
+ "dstPort": 0,
+ "dstPortRange": "string",
+ "id": "string",
+ "protocol": "string",
+ "srcPort": 0,
+ "srcPortRange": "string",
+ "vlan": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order_info.py
index 653bfd482..0ae4a4428 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_qos_rules_order_info.py
@@ -106,10 +106,16 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "dscp": 0,
+ "dstPort": 0,
+ "dstPortRange": "string",
+ "id": "string",
+ "protocol": "string",
+ "srcPort": 0,
+ "srcPortRange": "string",
+ "vlan": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast.py
index 11f4d4269..2169b2ee9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast.py
@@ -37,17 +37,17 @@ options:
suboptions:
floodUnknownMulticastTrafficEnabled:
description: Flood unknown multicast traffic setting for switches, switch stacks
- or switch profiles.
+ or switch templates.
type: bool
igmpSnoopingEnabled:
- description: IGMP snooping setting for switches, switch stacks or switch profiles.
+ description: IGMP snooping setting for switches, switch stacks or switch templates.
type: bool
stacks:
description: List of switch stack ids for non-template network.
elements: str
type: list
switchProfiles:
- description: List of switch profiles ids for template network.
+ description: List of switch templates ids for template network.
elements: str
type: list
switches:
@@ -101,16 +101,17 @@ EXAMPLES = r"""
overrides:
- floodUnknownMulticastTrafficEnabled: true
igmpSnoopingEnabled: true
- switches:
- - Q234-ABCD-0001
- - Q234-ABCD-0002
- - Q234-ABCD-0003
- - floodUnknownMulticastTrafficEnabled: true
- igmpSnoopingEnabled: true
stacks:
- '789102'
- '123456'
- '129102'
+ switchProfiles:
+ - '1234'
+ - '4567'
+ switches:
+ - Q234-ABCD-0001
+ - Q234-ABCD-0002
+ - Q234-ABCD-0003
"""
RETURN = r"""
@@ -119,5 +120,25 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "defaultSettings": {
+ "floodUnknownMulticastTrafficEnabled": true,
+ "igmpSnoopingEnabled": true
+ },
+ "overrides": [
+ {
+ "floodUnknownMulticastTrafficEnabled": true,
+ "igmpSnoopingEnabled": true,
+ "stacks": [
+ "string"
+ ],
+ "switchProfiles": [
+ "string"
+ ],
+ "switches": [
+ "string"
+ ]
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_info.py
index 85afebe2e..a2b220be0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_info.py
@@ -70,6 +70,26 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "defaultSettings": {
+ "floodUnknownMulticastTrafficEnabled": true,
+ "igmpSnoopingEnabled": true
+ },
+ "overrides": [
+ {
+ "floodUnknownMulticastTrafficEnabled": true,
+ "igmpSnoopingEnabled": true,
+ "stacks": [
+ "string"
+ ],
+ "switchProfiles": [
+ "string"
+ ],
+ "switches": [
+ "string"
+ ]
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points.py
index 77e3eb80d..c72cd9a7e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points.py
@@ -19,7 +19,7 @@ extends_documentation_fragment:
author: Francisco Munoz (@fmunoz)
options:
interfaceIp:
- description: The IP address of the interface where the RP needs to be created.
+ description: "The\_IP address of the interface where the RP needs to be created."
type: str
multicastGroup:
description: '''Any'', or the IP address of a multicast group.'
@@ -80,10 +80,10 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
interfaceIp: 192.168.1.2
- multicastGroup: 192.168.128.0/24
+ multicastGroup: Any
networkId: string
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_switch_routing_multicast_rendezvous_points:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -105,13 +105,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- interfaceIp: 192.168.1.2
- multicastGroup: 192.168.128.0/24
+ state: absent
networkId: string
rendezvousPointId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_switch_routing_multicast_rendezvous_points:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -133,7 +131,9 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ interfaceIp: 192.168.1.2
+ multicastGroup: Any
networkId: string
rendezvousPointId: string
@@ -144,5 +144,11 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "interfaceIp": "string",
+ "interfaceName": "string",
+ "multicastGroup": "string",
+ "rendezvousPointId": "string",
+ "serial": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points_info.py
index de278e2bb..bb79e214e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_multicast_rendezvous_points_info.py
@@ -106,12 +106,13 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: list
+ type: dict
sample: >
- [
- [
- {}
- ]
- ]
+ {
+ "interfaceIp": "string",
+ "interfaceName": "string",
+ "multicastGroup": "string",
+ "rendezvousPointId": "string",
+ "serial": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_ospf_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_ospf_info.py
index e8a33c356..4f42c51f8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_ospf_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_routing_ospf_info.py
@@ -70,6 +70,34 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "areas": [
+ {
+ "areaId": "string",
+ "areaName": "string",
+ "areaType": "string"
+ }
+ ],
+ "deadTimerInSeconds": 0,
+ "enabled": true,
+ "helloTimerInSeconds": 0,
+ "md5AuthenticationEnabled": true,
+ "md5AuthenticationKey": {
+ "id": 0,
+ "passphrase": "string"
+ },
+ "v3": {
+ "areas": [
+ {
+ "areaId": "string",
+ "areaName": "string",
+ "areaType": "string"
+ }
+ ],
+ "deadTimerInSeconds": 0,
+ "enabled": true,
+ "helloTimerInSeconds": 0
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings.py
index 61bff048d..239a875a1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings.py
@@ -16,6 +16,13 @@ extends_documentation_fragment:
- cisco.meraki.module
author: Francisco Munoz (@fmunoz)
options:
+ macBlocklist:
+ description: MAC blocklist.
+ suboptions:
+ enabled:
+ description: Enable MAC blocklist.
+ type: bool
+ type: dict
networkId:
description: NetworkId path parameter. Network ID.
type: str
@@ -30,6 +37,13 @@ options:
description: Serial number of the switch.
type: str
type: list
+ uplinkClientSampling:
+ description: Uplink client sampling.
+ suboptions:
+ enabled:
+ description: Enable uplink client sampling.
+ type: bool
+ type: dict
useCombinedPower:
description: The use Combined Power as the default behavior of secondary power supplies
on supported devices.
@@ -76,10 +90,14 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
+ macBlocklist:
+ enabled: true
networkId: string
powerExceptions:
- powerType: string
serial: string
+ uplinkClientSampling:
+ enabled: true
useCombinedPower: true
vlan: 0
@@ -91,13 +109,19 @@ meraki_response:
type: dict
sample: >
{
- "vlan": 0,
- "useCombinedPower": true,
+ "macBlocklist": {
+ "enabled": true
+ },
"powerExceptions": [
{
- "serial": "string",
- "powerType": "string"
+ "powerType": "string",
+ "serial": "string"
}
- ]
+ ],
+ "uplinkClientSampling": {
+ "enabled": true
+ },
+ "useCombinedPower": true,
+ "vlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings_info.py
index 5328f4b5f..3a34301fb 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_settings_info.py
@@ -72,13 +72,19 @@ meraki_response:
type: dict
sample: >
{
- "vlan": 0,
- "useCombinedPower": true,
+ "macBlocklist": {
+ "enabled": true
+ },
"powerExceptions": [
{
- "serial": "string",
- "powerType": "string"
+ "powerType": "string",
+ "serial": "string"
}
- ]
+ ],
+ "uplinkClientSampling": {
+ "enabled": true
+ },
+ "useCombinedPower": true,
+ "vlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks.py
index 7d6303ed6..27eaa73be 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks.py
@@ -10,7 +10,7 @@ module: networks_switch_stacks
short_description: Resource module for networks _switch _stacks
description:
- Manage operations create and delete of the resource networks _switch _stacks.
-- Create a stack.
+- Create a switch stack.
- Delete a stack.
version_added: '2.16.0'
extends_documentation_fragment:
@@ -113,5 +113,11 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "id": "string",
+ "name": "string",
+ "serials": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_remove.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_remove.py
index 3eb4a79b7..bed0266e5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_remove.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_remove.py
@@ -74,5 +74,11 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "id": "string",
+ "name": "string",
+ "serials": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces.py
index 7fad46342..3337cfd51 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces.py
@@ -148,15 +148,11 @@ EXAMPLES = r"""
area: '0'
cost: 1
isPassiveEnabled: true
- ospfV3:
- area: '1'
- cost: 2
- isPassiveEnabled: true
subnet: 192.168.1.0/24
switchStackId: string
vlanId: 100
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_switch_stacks_routing_interfaces:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -178,30 +174,12 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
interfaceId: string
- interfaceIp: 192.168.1.2
- ipv6:
- address: 1:2:3:4::1
- assignmentMode: static
- gateway: 1:2:3:4::2
- prefix: 1:2:3:4::/48
- multicastRouting: disabled
- name: L3 interface
networkId: string
- ospfSettings:
- area: '0'
- cost: 1
- isPassiveEnabled: true
- ospfV3:
- area: '1'
- cost: 2
- isPassiveEnabled: true
- subnet: 192.168.1.0/24
switchStackId: string
- vlanId: 100
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_switch_stacks_routing_interfaces:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -223,10 +201,25 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ defaultGateway: 192.168.1.1
interfaceId: string
+ interfaceIp: 192.168.1.2
+ ipv6:
+ address: 1:2:3:4::1
+ assignmentMode: static
+ gateway: 1:2:3:4::2
+ prefix: 1:2:3:4::/48
+ multicastRouting: disabled
+ name: L3 interface
networkId: string
+ ospfSettings:
+ area: '0'
+ cost: 1
+ isPassiveEnabled: true
+ subnet: 192.168.1.0/24
switchStackId: string
+ vlanId: 100
"""
RETURN = r"""
@@ -235,5 +228,29 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "defaultGateway": "string",
+ "interfaceId": "string",
+ "interfaceIp": "string",
+ "ipv6": {
+ "address": "string",
+ "assignmentMode": "string",
+ "gateway": "string",
+ "prefix": "string"
+ },
+ "multicastRouting": "string",
+ "name": "string",
+ "ospfSettings": {
+ "area": "string",
+ "cost": 0,
+ "isPassiveEnabled": true
+ },
+ "ospfV3": {
+ "area": "string",
+ "cost": 0,
+ "isPassiveEnabled": true
+ },
+ "subnet": "string",
+ "vlanId": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp.py
index 1e4601086..f2e12148b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp.py
@@ -58,7 +58,7 @@ options:
elements: str
type: list
dnsCustomNameservers:
- description: The DHCP name server IPs when DHCP name server option is 'custom'.
+ description: The DHCP name server IPs when DHCP name server option is ' custom'.
elements: str
type: list
dnsNameserversOption:
@@ -153,6 +153,8 @@ EXAMPLES = r"""
- code: '5'
type: text
value: five
+ dhcpRelayServerIps:
+ - 1.2.3.4
dnsCustomNameservers:
- 8.8.8.8, 8.8.4.4
dnsNameserversOption: custom
@@ -175,5 +177,39 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "bootFileName": "string",
+ "bootNextServer": "string",
+ "bootOptionsEnabled": true,
+ "dhcpLeaseTime": "string",
+ "dhcpMode": "string",
+ "dhcpOptions": [
+ {
+ "code": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dhcpRelayServerIps": [
+ "string"
+ ],
+ "dnsCustomNameservers": [
+ "string"
+ ],
+ "dnsNameserversOption": "string",
+ "fixedIpAssignments": [
+ {
+ "ip": "string",
+ "mac": "string",
+ "name": "string"
+ }
+ ],
+ "reservedIpRanges": [
+ {
+ "comment": "string",
+ "end": "string",
+ "start": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp_info.py
index 1ac626503..82e3ab21f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_dhcp_info.py
@@ -80,6 +80,40 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "bootFileName": "string",
+ "bootNextServer": "string",
+ "bootOptionsEnabled": true,
+ "dhcpLeaseTime": "string",
+ "dhcpMode": "string",
+ "dhcpOptions": [
+ {
+ "code": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dhcpRelayServerIps": [
+ "string"
+ ],
+ "dnsCustomNameservers": [
+ "string"
+ ],
+ "dnsNameserversOption": "string",
+ "fixedIpAssignments": [
+ {
+ "ip": "string",
+ "mac": "string",
+ "name": "string"
+ }
+ ],
+ "reservedIpRanges": [
+ {
+ "comment": "string",
+ "end": "string",
+ "start": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_info.py
index 93cb8ed58..1350158ec 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_interfaces_info.py
@@ -112,10 +112,31 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "defaultGateway": "string",
+ "interfaceId": "string",
+ "interfaceIp": "string",
+ "ipv6": {
+ "address": "string",
+ "assignmentMode": "string",
+ "gateway": "string",
+ "prefix": "string"
+ },
+ "multicastRouting": "string",
+ "name": "string",
+ "ospfSettings": {
+ "area": "string",
+ "cost": 0,
+ "isPassiveEnabled": true
+ },
+ "ospfV3": {
+ "area": "string",
+ "cost": 0,
+ "isPassiveEnabled": true
+ },
+ "subnet": "string",
+ "vlanId": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes.py
index 70f468f0e..63a174e99 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes.py
@@ -101,7 +101,7 @@ EXAMPLES = r"""
subnet: 192.168.1.0/24
switchStackId: string
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_switch_stacks_routing_static_routes:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -123,17 +123,12 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- advertiseViaOspfEnabled: false
- name: My route
+ state: absent
networkId: string
- nextHopIp: 1.2.3.4
- preferOverOspfRoutesEnabled: false
staticRouteId: string
- subnet: 192.168.1.0/24
switchStackId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_switch_stacks_routing_static_routes:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -155,9 +150,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ advertiseViaOspfEnabled: false
+ name: My route
networkId: string
+ nextHopIp: 1.2.3.4
+ preferOverOspfRoutesEnabled: false
staticRouteId: string
+ subnet: 192.168.1.0/24
switchStackId: string
"""
@@ -167,5 +167,12 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "advertiseViaOspfEnabled": true,
+ "name": "string",
+ "nextHopIp": "string",
+ "preferOverOspfRoutesEnabled": true,
+ "staticRouteId": "string",
+ "subnet": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes_info.py
index 18cda8040..a7e8d9812 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stacks_routing_static_routes_info.py
@@ -112,10 +112,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "advertiseViaOspfEnabled": true,
+ "name": "string",
+ "nextHopIp": "string",
+ "preferOverOspfRoutesEnabled": true,
+ "staticRouteId": "string",
+ "subnet": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_storm_control.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_storm_control.py
index 403b16840..722348dc9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_storm_control.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_storm_control.py
@@ -83,5 +83,9 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "broadcastThreshold": 0,
+ "multicastThreshold": 0,
+ "unknownUnicastThreshold": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp.py
index c084f6cc7..71d324660 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp.py
@@ -23,7 +23,7 @@ options:
description: The spanning tree protocol status in network.
type: bool
stpBridgePriority:
- description: STP bridge priority for switches/stacks or switch profiles. An empty
+ description: STP bridge priority for switches/stacks or switch templates. An empty
array will clear the STP bridge priority settings.
elements: dict
suboptions:
@@ -32,10 +32,10 @@ options:
elements: str
type: list
stpPriority:
- description: STP priority for switch, stacks, or switch profiles.
+ description: STP priority for switch, stacks, or switch templates.
type: int
switchProfiles:
- description: List of switch profile IDs.
+ description: List of switch template IDs.
elements: str
type: list
switches:
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp_info.py
index 05b82dd34..dc58fcdf5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_switch_stp_info.py
@@ -70,6 +70,16 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "rstpEnabled": true,
+ "stpBridgePriority": [
+ {
+ "stpPriority": 0,
+ "switches": [
+ "string"
+ ]
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_topology_link_layer_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_topology_link_layer_info.py
index 9c32d682a..6342f5fc4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_topology_link_layer_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_topology_link_layer_info.py
@@ -10,7 +10,9 @@ module: networks_topology_link_layer_info
short_description: Information module for networks _topology _linklayer
description:
- Get all networks _topology _linklayer.
-- List the LLDP and CDP information for all discovered devices and connections in a network.
+- >
+ List the LLDP and CDP information for all discovered devices and connections in a network. At least one MX or MS
+ device must be in the network in order to build the topology.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -70,6 +72,57 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "errors": [
+ "string"
+ ],
+ "links": [
+ {
+ "ends": [
+ {
+ "device": {
+ "name": "string",
+ "serial": "string"
+ },
+ "discovered": {
+ "cdp": {
+ "nativeVlan": 0,
+ "portId": "string"
+ },
+ "lldp": {
+ "portDescription": "string",
+ "portId": "string"
+ }
+ },
+ "node": {
+ "derivedId": "string",
+ "type": "string"
+ }
+ }
+ ],
+ "lastReportedAt": "string"
+ }
+ ],
+ "nodes": [
+ {
+ "derivedId": "string",
+ "discovered": {
+ "cdp": "string",
+ "lldp": {
+ "chassisId": "string",
+ "managementAddress": "string",
+ "systemCapabilities": [
+ "string"
+ ],
+ "systemDescription": "string",
+ "systemName": "string"
+ }
+ },
+ "mac": "string",
+ "root": true,
+ "type": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis.py b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis.py
index 52798d642..3a8d3d9d6 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis.py
@@ -84,19 +84,7 @@ EXAMPLES = r"""
- name: Item from hostname
type: host
value: example.com
- - name: Item from port
- type: port
- value: '440'
- - name: Item from IP
- type: ipRange
- value: 192.1.0.0
- - name: Item from IP range (CIDR)
- type: ipRange
- value: 192.2.0.0/16
- - name: Item from IP range with port
- type: ipRange
- value: 192.3.0.0/16:80
- mode: detailed
+ mode: disabled
networkId: string
"""
@@ -106,5 +94,14 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "customPieChartItems": [
+ {
+ "name": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "mode": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis_info.py
index a44c639eb..5d354ebdf 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_analysis_info.py
@@ -70,6 +70,15 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "customPieChartItems": [
+ {
+ "name": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "mode": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_application_categories_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_application_categories_info.py
index 4c39e70cd..96b4960aa 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_application_categories_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_application_categories_info.py
@@ -10,7 +10,7 @@ module: networks_traffic_shaping_application_categories_info
short_description: Information module for networks _trafficshaping _applicationcategories
description:
- Get all networks _trafficshaping _applicationcategories.
-- Returns the application categories for traffic shaping rules.
+- Returns the application categories for traffic shaping rules. Only applicable on networks with a security applicance.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -69,7 +69,19 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "applications": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "id": "string",
+ "name": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py
index eba6d516d..87d9cc7e9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_traffic_shaping_dscp_tagging_options_info.py
@@ -73,6 +73,9 @@ meraki_response:
elements: dict
sample: >
[
- {}
+ {
+ "description": "string",
+ "dscpTagValue": 0
+ }
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_unbind.py b/ansible_collections/cisco/meraki/plugins/modules/networks_unbind.py
index 8abfdb77c..6ad50aaff 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_unbind.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_unbind.py
@@ -71,19 +71,19 @@ meraki_response:
type: dict
sample: >
{
+ "enrollmentString": "string",
"id": "string",
- "organizationId": "string",
+ "isBoundToConfigTemplate": true,
"name": "string",
+ "notes": "string",
+ "organizationId": "string",
"productTypes": [
"string"
],
- "timeZone": "string",
"tags": [
"string"
],
- "enrollmentString": "string",
- "url": "string",
- "notes": "string",
- "isBoundToConfigTemplate": true
+ "timeZone": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles.py
new file mode 100644
index 000000000..4ea375e74
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles.py
@@ -0,0 +1,168 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_vlan_profiles
+short_description: Resource module for networks _vlanprofiles
+description:
+- Manage operations update and delete of the resource networks _vlanprofiles.
+- Delete a VLAN profile of a network.
+- Update an existing VLAN profile of a network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ iname:
+ description: Iname path parameter.
+ type: str
+ name:
+ description: Name of the profile, string length must be from 1 to 255 characters.
+ type: str
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ vlanGroups:
+ description: An array of VLAN groups.
+ elements: dict
+ suboptions:
+ name:
+ description: Name of the VLAN, string length must be from 1 to 32 characters.
+ type: str
+ vlanIds:
+ description: Comma-separated VLAN IDs or ID ranges.
+ type: str
+ type: list
+ vlanNames:
+ description: An array of named VLANs.
+ elements: dict
+ suboptions:
+ adaptivePolicyGroup:
+ description: Adaptive Policy Group assigned to Vlan ID.
+ suboptions:
+ id:
+ description: Adaptive Policy Group ID.
+ type: str
+ type: dict
+ name:
+ description: Name of the VLAN, string length must be from 1 to 32 characters.
+ type: str
+ vlanId:
+ description: VLAN ID.
+ type: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for networks deleteNetworkVlanProfile
+ description: Complete reference of the deleteNetworkVlanProfile API.
+ link: https://developer.cisco.com/meraki/api-v1/#!delete-network-vlan-profile
+- name: Cisco Meraki documentation for networks updateNetworkVlanProfile
+ description: Complete reference of the updateNetworkVlanProfile API.
+ link: https://developer.cisco.com/meraki/api-v1/#!update-network-vlan-profile
+notes:
+ - SDK Method used are
+ networks.Networks.delete_network_vlan_profile,
+ networks.Networks.update_network_vlan_profile,
+
+ - Paths used are
+ delete /networks/{networkId}/vlanProfiles/{iname},
+ put /networks/{networkId}/vlanProfiles/{iname},
+"""
+
+EXAMPLES = r"""
+- name: Delete by name
+ cisco.meraki.networks_vlan_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ iname: string
+ networkId: string
+
+- name: Update by name
+ cisco.meraki.networks_vlan_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ iname: string
+ name: My VLAN profile name
+ networkId: string
+ vlanGroups:
+ - name: named-group-1
+ vlanIds: 2,5-7
+ vlanNames:
+ - adaptivePolicyGroup:
+ id: '791'
+ name: named-1
+ vlanId: '1'
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "iname": "string",
+ "isDefault": true,
+ "name": "string",
+ "vlanGroups": [
+ {
+ "name": "string",
+ "vlanIds": "string"
+ }
+ ],
+ "vlanNames": [
+ {
+ "adaptivePolicyGroup": {
+ "id": "string",
+ "name": "string"
+ },
+ "name": "string",
+ "vlanId": "string"
+ }
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_by_device_info.py
new file mode 100644
index 000000000..7d4c96dee
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_by_device_info.py
@@ -0,0 +1,135 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_vlan_profiles_assignments_by_device_info
+short_description: Information module for networks _vlanprofiles _assignments _bydevice
+description:
+- Get all networks _vlanprofiles _assignments _bydevice.
+- Get the assigned VLAN Profiles for devices in a network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ networkId:
+ description:
+ - NetworkId path parameter. Network ID.
+ type: str
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ serials:
+ description:
+ - >
+ Serials query parameter. Optional parameter to filter devices by serials. All devices returned belong to
+ serial numbers that are an exact match.
+ elements: str
+ type: list
+ productTypes:
+ description:
+ - ProductTypes query parameter. Optional parameter to filter devices by product types.
+ elements: str
+ type: list
+ stackIds:
+ description:
+ - StackIds query parameter. Optional parameter to filter devices by Switch Stack ids.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for networks getNetworkVlanProfilesAssignmentsByDevice
+ description: Complete reference of the getNetworkVlanProfilesAssignmentsByDevice API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-network-vlan-profiles-assignments-by-device
+notes:
+ - SDK Method used are
+ networks.Networks.get_network_vlan_profiles_assignments_by_device,
+
+ - Paths used are
+ get /networks/{networkId}/vlanProfiles/assignments/byDevice,
+"""
+
+EXAMPLES = r"""
+- name: Get all networks _vlanprofiles _assignments _bydevice
+ cisco.meraki.networks_vlan_profiles_assignments_by_device_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ serials: []
+ productTypes: []
+ stackIds: []
+ networkId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "mac": "string",
+ "name": "string",
+ "productType": "string",
+ "serial": "string",
+ "stack": {
+ "id": "string"
+ },
+ "vlanProfile": {
+ "iname": "string",
+ "isDefault": true,
+ "name": "string"
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_reassign.py b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_reassign.py
new file mode 100644
index 000000000..781e30ebf
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_assignments_reassign.py
@@ -0,0 +1,102 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_vlan_profiles_assignments_reassign
+short_description: Resource module for networks _vlanprofiles _assignments _reassign
+description:
+- Manage operation create of the resource networks _vlanprofiles _assignments _reassign.
+- Update the assigned VLAN Profile for devices in a network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ serials:
+ description: Array of Device Serials.
+ elements: str
+ type: list
+ stackIds:
+ description: Array of Switch Stack IDs.
+ elements: str
+ type: list
+ vlanProfile:
+ description: The VLAN Profile.
+ suboptions:
+ iname:
+ description: IName of the VLAN Profile.
+ type: str
+ type: dict
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for networks reassignNetworkVlanProfilesAssignments
+ description: Complete reference of the reassignNetworkVlanProfilesAssignments API.
+ link: https://developer.cisco.com/meraki/api-v1/#!reassign-network-vlan-profiles-assignments
+notes:
+ - SDK Method used are
+ networks.Networks.reassign_network_vlan_profiles_assignments,
+
+ - Paths used are
+ post /networks/{networkId}/vlanProfiles/assignments/reassign,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_vlan_profiles_assignments_reassign:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkId: string
+ serials:
+ - Q234-ABCD-5678
+ stackIds:
+ - '1234'
+ vlanProfile:
+ iname: Profile1
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "serials": [
+ "string"
+ ],
+ "stackIds": [
+ "string"
+ ],
+ "vlanProfile": {
+ "iname": "string",
+ "name": "string"
+ }
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_info.py
new file mode 100644
index 000000000..35572e874
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_vlan_profiles_info.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_vlan_profiles_info
+short_description: Information module for networks _vlanprofiles
+description:
+- Get networks _vlanprofiles by name.
+- Get an existing VLAN profile of a network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ networkId:
+ description:
+ - NetworkId path parameter. Network ID.
+ type: str
+ iname:
+ description:
+ - Iname path parameter.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for networks getNetworkVlanProfile
+ description: Complete reference of the getNetworkVlanProfile API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-network-vlan-profile
+notes:
+ - SDK Method used are
+ networks.Networks.get_network_vlan_profile,
+
+ - Paths used are
+ get /networks/{networkId}/vlanProfiles/{iname},
+"""
+
+EXAMPLES = r"""
+- name: Get networks _vlanprofiles by name
+ cisco.meraki.networks_vlan_profiles_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkId: string
+ iname: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "iname": "string",
+ "isDefault": true,
+ "name": "string",
+ "vlanGroups": [
+ {
+ "name": "string",
+ "vlanIds": "string"
+ }
+ ],
+ "vlanNames": [
+ {
+ "adaptivePolicyGroup": {
+ "id": "string",
+ "name": "string"
+ },
+ "name": "string",
+ "vlanId": "string"
+ }
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers.py b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers.py
index 5e6bfaa31..dc08f0579 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers.py
@@ -105,7 +105,7 @@ EXAMPLES = r"""
sharedSecret: shhh
url: https://example.com
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_webhooks_http_servers:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -127,15 +127,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
httpServerId: string
- name: Example Webhook Server
networkId: string
- payloadTemplate:
- payloadTemplateId: wpt_00001
- sharedSecret: shhh
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_webhooks_http_servers:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -157,9 +153,13 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
httpServerId: string
+ name: Example Webhook Server
networkId: string
+ payloadTemplate:
+ payloadTemplateId: wpt_00001
+ sharedSecret: shhh
"""
RETURN = r"""
@@ -171,11 +171,11 @@ meraki_response:
{
"id": "string",
"name": "string",
- "url": "string",
"networkId": "string",
"payloadTemplate": {
- "payloadTemplateId": "string",
- "name": "string"
- }
+ "name": "string",
+ "payloadTemplateId": "string"
+ },
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers_info.py
index d28736f47..056394ba9 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_http_servers_info.py
@@ -111,11 +111,11 @@ meraki_response:
{
"id": "string",
"name": "string",
- "url": "string",
"networkId": "string",
"payloadTemplate": {
- "payloadTemplateId": "string",
- "name": "string"
- }
+ "name": "string",
+ "payloadTemplateId": "string"
+ },
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates.py b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates.py
index 971a6651f..b62b18214 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates.py
@@ -109,7 +109,7 @@ EXAMPLES = r"""
name: Custom Template
networkId: string
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_webhooks_payload_templates:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -131,18 +131,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- body: '{"event_type":"{{alertTypeId}}","client_payload":{"text":"{{alertData}}"}}'
- bodyFile: Qm9keSBGaWxl
- headers:
- - name: Authorization
- template: Bearer {{sharedSecret}}
- headersFile: SGVhZGVycyBGaWxl
- name: Custom Template
+ state: absent
networkId: string
payloadTemplateId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_webhooks_payload_templates:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -164,7 +157,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ body: '{"event_type":"{{alertTypeId}}","client_payload":{"text":"{{alertData}}"}}'
+ bodyFile: Qm9keSBGaWxl
+ headers:
+ - name: Authorization
+ template: Bearer {{sharedSecret}}
+ headersFile: SGVhZGVycyBGaWxl
+ name: Custom Template
networkId: string
payloadTemplateId: string
@@ -176,20 +176,20 @@ meraki_response:
type: dict
sample: >
{
- "payloadTemplateId": "string",
- "type": "string",
- "name": "string",
+ "body": "string",
"headers": [
{
"name": "string",
"template": "string"
}
],
- "body": "string",
+ "name": "string",
+ "payloadTemplateId": "string",
"sharing": {
"byNetwork": {
"adminsCanModify": true
}
- }
+ },
+ "type": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates_info.py
index 9e96aad4e..b008f262e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_payload_templates_info.py
@@ -109,20 +109,20 @@ meraki_response:
type: dict
sample: >
{
- "payloadTemplateId": "string",
- "type": "string",
- "name": "string",
+ "body": "string",
"headers": [
{
"name": "string",
"template": "string"
}
],
- "body": "string",
+ "name": "string",
+ "payloadTemplateId": "string",
"sharing": {
"byNetwork": {
"adminsCanModify": true
}
- }
+ },
+ "type": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_webhook_tests_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_webhook_tests_info.py
index 7ebdf0eb5..1c505a70a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_webhook_tests_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_webhooks_webhook_tests_info.py
@@ -78,7 +78,7 @@ meraki_response:
sample: >
{
"id": "string",
- "url": "string",
- "status": "string"
+ "status": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_alternate_management_interface_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_alternate_management_interface_info.py
index ec090d355..fc7fb0840 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_alternate_management_interface_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_alternate_management_interface_info.py
@@ -70,6 +70,22 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "accessPoints": [
+ {
+ "alternateManagementIp": "string",
+ "dns1": "string",
+ "dns2": "string",
+ "gateway": "string",
+ "serial": "string",
+ "subnetMask": "string"
+ }
+ ],
+ "enabled": true,
+ "protocols": [
+ "string"
+ ],
+ "vlanId": 0
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing.py
index 9296df094..2e6db99f7 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing.py
@@ -93,10 +93,10 @@ EXAMPLES = r"""
networkId: string
plans:
- bandwidthLimits:
- limitDown: 1000
- limitUp: 1000
+ limitDown: 1000000
+ limitUp: 1000000
id: '1'
- price: 5
+ price: 5.0
timeLimit: 1 hour
"""
@@ -106,5 +106,18 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "currency": "string",
+ "plans": [
+ {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "id": "string",
+ "price": 0,
+ "timeLimit": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing_info.py
index 581341573..0cb11b1e4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_billing_info.py
@@ -70,6 +70,19 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "currency": "string",
+ "plans": [
+ {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "id": "string",
+ "price": 0,
+ "timeLimit": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings.py
index 1b46a685a..6c28d9d68 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings.py
@@ -95,12 +95,12 @@ meraki_response:
type: dict
sample: >
{
- "scanningEnabled": true,
"advertisingEnabled": true,
- "uuid": "string",
- "majorMinorAssignmentMode": "string",
+ "eslEnabled": true,
"major": 0,
+ "majorMinorAssignmentMode": "string",
"minor": 0,
- "eslEnabled": true
+ "scanningEnabled": true,
+ "uuid": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings_info.py
index 7b7aa351c..3a801e0b8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_bluetooth_settings_info.py
@@ -72,12 +72,12 @@ meraki_response:
type: dict
sample: >
{
- "scanningEnabled": true,
"advertisingEnabled": true,
- "uuid": "string",
- "majorMinorAssignmentMode": "string",
+ "eslEnabled": true,
"major": 0,
+ "majorMinorAssignmentMode": "string",
"minor": 0,
- "eslEnabled": true
+ "scanningEnabled": true,
+ "uuid": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_channel_utilization_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_channel_utilization_history_info.py
index 497be9f02..4d8f39eed 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_channel_utilization_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_channel_utilization_history_info.py
@@ -132,11 +132,11 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
"endTs": "string",
- "utilizationTotal": 0,
+ "startTs": "string",
"utilization80211": 0,
- "utilizationNon80211": 0
+ "utilizationNon80211": 0,
+ "utilizationTotal": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_client_count_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_client_count_history_info.py
index e9fe2d829..ade0b0495 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_client_count_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_client_count_history_info.py
@@ -133,9 +133,9 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
+ "clientCount": 0,
"endTs": "string",
- "clientCount": 0
+ "startTs": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_connection_stats_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_connection_stats_info.py
index 05ab31873..f32e5f05b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_connection_stats_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_connection_stats_info.py
@@ -114,6 +114,15 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "connectionStats": {
+ "assoc": 0,
+ "auth": 0,
+ "dhcp": 0,
+ "dns": 0,
+ "success": 0
+ },
+ "mac": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_latency_stats_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_latency_stats_info.py
index 89477e7be..cdc08a9dd 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_latency_stats_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_clients_latency_stats_info.py
@@ -122,6 +122,31 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "latencyStats": {
+ "backgroundTraffic": {
+ "avg": 0,
+ "rawDistribution": {
+ "0": 0,
+ "1": 0,
+ "1024": 0,
+ "128": 0,
+ "16": 0,
+ "2": 0,
+ "2048": 0,
+ "256": 0,
+ "32": 0,
+ "4": 0,
+ "512": 0,
+ "64": 0,
+ "8": 0
+ }
+ },
+ "bestEffortTraffic": "string",
+ "videoTraffic": "string",
+ "voiceTraffic": "string"
+ },
+ "mac": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_data_rate_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_data_rate_history_info.py
index 92c65db8a..2b11d2655 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_data_rate_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_data_rate_history_info.py
@@ -131,10 +131,10 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
- "endTs": "string",
"averageKbps": 0,
"downloadKbps": 0,
+ "endTs": "string",
+ "startTs": "string",
"uploadKbps": 0
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_devices_connection_stats_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_devices_connection_stats_info.py
index 90a2f716a..b16d4aeb7 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_devices_connection_stats_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_devices_connection_stats_info.py
@@ -113,14 +113,14 @@ meraki_response:
sample: >
[
{
- "serial": "string",
"connectionStats": {
"assoc": 0,
"auth": 0,
"dhcp": 0,
"dns": 0,
"success": 0
- }
+ },
+ "serial": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles.py
new file mode 100644
index 000000000..39a42b08d
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles.py
@@ -0,0 +1,171 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_wireless_ethernet_ports_profiles
+short_description: Resource module for networks _wireless _ethernet _ports _profiles
+description:
+- Manage operations update and delete of the resource networks _wireless _ethernet _ports _profiles.
+- Delete an AP port profile.
+- Update the AP port profile by ID for this network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ name:
+ description: AP port profile name.
+ type: str
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ ports:
+ description: AP ports configuration.
+ elements: dict
+ suboptions:
+ enabled:
+ description: AP port enabled.
+ type: bool
+ name:
+ description: AP port name.
+ type: str
+ pskGroupId:
+ description: AP port PSK Group number.
+ type: str
+ ssid:
+ description: AP port ssid number.
+ type: int
+ type: list
+ profileId:
+ description: ProfileId path parameter. Profile ID.
+ type: str
+ usbPorts:
+ description: AP usb ports configuration.
+ elements: dict
+ suboptions:
+ enabled:
+ description: AP usb port enabled.
+ type: bool
+ name:
+ description: AP usb port name.
+ type: str
+ ssid:
+ description: AP usb port ssid number.
+ type: int
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless deleteNetworkWirelessEthernetPortsProfile
+ description: Complete reference of the deleteNetworkWirelessEthernetPortsProfile API.
+ link: https://developer.cisco.com/meraki/api-v1/#!delete-network-wireless-ethernet-ports-profile
+- name: Cisco Meraki documentation for wireless updateNetworkWirelessEthernetPortsProfile
+ description: Complete reference of the updateNetworkWirelessEthernetPortsProfile API.
+ link: https://developer.cisco.com/meraki/api-v1/#!update-network-wireless-ethernet-ports-profile
+notes:
+ - SDK Method used are
+ wireless.Wireless.delete_network_wireless_ethernet_ports_profile,
+ wireless.Wireless.update_network_wireless_ethernet_ports_profile,
+
+ - Paths used are
+ delete /networks/{networkId}/wireless/ethernet/ports/profiles/{profileId},
+ put /networks/{networkId}/wireless/ethernet/ports/profiles/{profileId},
+"""
+
+EXAMPLES = r"""
+- name: Delete by id
+ cisco.meraki.networks_wireless_ethernet_ports_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ networkId: string
+ profileId: string
+
+- name: Update by id
+ cisco.meraki.networks_wireless_ethernet_ports_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ name: string
+ networkId: string
+ ports:
+ - enabled: true
+ name: string
+ pskGroupId: string
+ ssid: 0
+ profileId: string
+ usbPorts:
+ - enabled: true
+ name: string
+ ssid: 0
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "isDefault": true,
+ "name": "string",
+ "ports": [
+ {
+ "enabled": true,
+ "name": "string",
+ "number": 0,
+ "pskGroupId": "string",
+ "ssid": 0
+ }
+ ],
+ "profileId": "string",
+ "usbPorts": [
+ {
+ "enabled": true,
+ "name": "string",
+ "ssid": 0
+ }
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_assign.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_assign.py
new file mode 100644
index 000000000..5177a1688
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_assign.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_wireless_ethernet_ports_profiles_assign
+short_description: Resource module for networks _wireless _ethernet _ports _profiles _assign
+description:
+- Manage operation create of the resource networks _wireless _ethernet _ports _profiles _assign.
+- Assign AP port profile to list of APs.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ profileId:
+ description: AP profile ID.
+ type: str
+ serials:
+ description: List of AP serials.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless assignNetworkWirelessEthernetPortsProfiles
+ description: Complete reference of the assignNetworkWirelessEthernetPortsProfiles API.
+ link: https://developer.cisco.com/meraki/api-v1/#!assign-network-wireless-ethernet-ports-profiles
+notes:
+ - SDK Method used are
+ wireless.Wireless.assign_network_wireless_ethernet_ports_profiles,
+
+ - Paths used are
+ post /networks/{networkId}/wireless/ethernet/ports/profiles/assign,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_wireless_ethernet_ports_profiles_assign:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkId: string
+ profileId: '1001'
+ serials:
+ - Q234-ABCD-0001
+ - Q234-ABCD-0002
+ - Q234-ABCD-0003
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "profileId": "string",
+ "serials": [
+ "string"
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_info.py
new file mode 100644
index 000000000..e6f9aeea9
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_info.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_wireless_ethernet_ports_profiles_info
+short_description: Information module for networks _wireless _ethernet _ports _profiles
+description:
+- Get networks _wireless _ethernet _ports _profiles by id.
+- Show the AP port profile by ID for this network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ networkId:
+ description:
+ - NetworkId path parameter. Network ID.
+ type: str
+ profileId:
+ description:
+ - ProfileId path parameter. Profile ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getNetworkWirelessEthernetPortsProfile
+ description: Complete reference of the getNetworkWirelessEthernetPortsProfile API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-network-wireless-ethernet-ports-profile
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_network_wireless_ethernet_ports_profile,
+
+ - Paths used are
+ get /networks/{networkId}/wireless/ethernet/ports/profiles/{profileId},
+"""
+
+EXAMPLES = r"""
+- name: Get networks _wireless _ethernet _ports _profiles by id
+ cisco.meraki.networks_wireless_ethernet_ports_profiles_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkId: string
+ profileId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "isDefault": true,
+ "name": "string",
+ "ports": [
+ {
+ "enabled": true,
+ "name": "string",
+ "number": 0,
+ "pskGroupId": "string",
+ "ssid": 0
+ }
+ ],
+ "profileId": "string",
+ "usbPorts": [
+ {
+ "enabled": true,
+ "name": "string",
+ "ssid": 0
+ }
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_set_default.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_set_default.py
new file mode 100644
index 000000000..47549ea9f
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ethernet_ports_profiles_set_default.py
@@ -0,0 +1,76 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: networks_wireless_ethernet_ports_profiles_set_default
+short_description: Resource module for networks _wireless _ethernet _ports _profiles _setdefault
+description:
+- Manage operation create of the resource networks _wireless _ethernet _ports _profiles _setdefault.
+- Set the AP port profile to be default for this network.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ networkId:
+ description: NetworkId path parameter. Network ID.
+ type: str
+ profileId:
+ description: AP profile ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless setNetworkWirelessEthernetPortsProfilesDefault
+ description: Complete reference of the setNetworkWirelessEthernetPortsProfilesDefault API.
+ link: https://developer.cisco.com/meraki/api-v1/#!set-network-wireless-ethernet-ports-profiles-default
+notes:
+ - SDK Method used are
+ wireless.Wireless.set_network_wireless_ethernet_ports_profiles_default,
+
+ - Paths used are
+ post /networks/{networkId}/wireless/ethernet/ports/profiles/setDefault,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.networks_wireless_ethernet_ports_profiles_set_default:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkId: string
+ profileId: '1001'
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "profileId": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_failed_connections_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_failed_connections_info.py
index b929330ff..2e5626ec3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_failed_connections_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_failed_connections_info.py
@@ -123,13 +123,13 @@ meraki_response:
sample: >
[
{
- "ssidNumber": 0,
- "vlan": 0,
"clientMac": "string",
- "serial": "string",
"failureStep": "string",
+ "serial": "string",
+ "ssidNumber": 0,
+ "ts": "string",
"type": "string",
- "ts": "string"
+ "vlan": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_history_info.py
index 536ed128f..65ceeb3c8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_history_info.py
@@ -136,9 +136,9 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
+ "avgLatencyMs": 0,
"endTs": "string",
- "avgLatencyMs": 0
+ "startTs": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_stats_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_stats_info.py
index cf8300995..7ae0fc8e0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_stats_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_latency_stats_info.py
@@ -117,6 +117,28 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "backgroundTraffic": {
+ "avg": 0,
+ "rawDistribution": {
+ "0": 0,
+ "1": 0,
+ "1024": 0,
+ "128": 0,
+ "16": 0,
+ "2": 0,
+ "2048": 0,
+ "256": 0,
+ "32": 0,
+ "4": 0,
+ "512": 0,
+ "64": 0,
+ "8": 0
+ }
+ },
+ "bestEffortTraffic": "string",
+ "videoTraffic": "string",
+ "voiceTraffic": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_mesh_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_mesh_statuses_info.py
index b7ba8f763..0616d38e4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_mesh_statuses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_mesh_statuses_info.py
@@ -93,7 +93,20 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "latestMeshPerformance": {
+ "mbps": 0,
+ "metric": 0,
+ "usagePercentage": "string"
+ },
+ "meshRoute": [
+ "string"
+ ],
+ "serial": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles.py
index c5f15bbd1..753217c31 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles.py
@@ -22,12 +22,21 @@ options:
description: Settings that will be enabled if selectionType is set to 'ap'.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'. Defaults to dual.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'. Defaults
+ to dual.
type: str
bandSteeringEnabled:
description: Steers client to most open band. Can be either true or false. Defaults
to true.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4", "5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
type: dict
bandSelectionType:
description: Band selection can be set to either 'ssid' or 'ap'. This param is required
@@ -71,6 +80,23 @@ options:
elements: int
type: list
type: dict
+ flexRadios:
+ description: Flex radio settings.
+ suboptions:
+ byModel:
+ description: Flex radios by model.
+ elements: dict
+ suboptions:
+ bands:
+ description: Band to use for each flex radio. For example, '6' will set
+ the AP's first flex radio to 6 GHz.
+ elements: str
+ type: list
+ model:
+ description: Model of the AP.
+ type: str
+ type: list
+ type: dict
minBitrateType:
description: Minimum bitrate can be set to either 'band' or 'ssid'. Defaults to
band.
@@ -89,12 +115,20 @@ options:
description: Settings for SSID 0.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4", "5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -104,12 +138,20 @@ options:
description: Settings for SSID 1.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4", "5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -119,12 +161,20 @@ options:
description: Settings for SSID 10.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4", "5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -134,12 +184,20 @@ options:
description: Settings for SSID 11.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4", "5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -149,12 +207,20 @@ options:
description: Settings for SSID 12.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4", "5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -164,12 +230,20 @@ options:
description: Settings for SSID 13.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -179,12 +253,20 @@ options:
description: Settings for SSID 14.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -194,12 +276,20 @@ options:
description: Settings for SSID 2.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -209,12 +299,20 @@ options:
description: Settings for SSID 3.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -224,12 +322,20 @@ options:
description: Settings for SSID 4.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -239,12 +345,20 @@ options:
description: Settings for SSID 5.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -254,12 +368,20 @@ options:
description: Settings for SSID 6.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -269,12 +391,20 @@ options:
description: Settings for SSID 7.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -284,12 +414,20 @@ options:
description: Settings for SSID 8.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -299,12 +437,20 @@ options:
description: Settings for SSID 9.
suboptions:
bandOperationMode:
- description: Choice between 'dual', '2.4ghz' or '5ghz'.
+ description: Choice between 'dual', '2.4ghz', '5ghz', '6ghz' or 'multi'.
type: str
bandSteeringEnabled:
description: Steers client to most open band between 2.4 GHz and 5 GHz.
Can be either true or false.
type: bool
+ bands:
+ description: Settings related to all bands.
+ suboptions:
+ enabled:
+ description: List of enabled bands. Can include "2.4","5", "6", "disabled".
+ elements: str
+ type: list
+ type: dict
minBitrate:
description: Sets min bitrate (Mbps) of this SSID. Can be one of '1', '2',
'5.5', '6', '9', '11', '12', '18', '24', '36', '48' or '54'.
@@ -315,7 +461,8 @@ options:
description: RfProfileId path parameter. Rf profile ID.
type: str
sixGhzSettings:
- description: Settings related to 6Ghz band.
+ description: Settings related to 6Ghz band. Only applicable to networks with 6Ghz
+ capable APs.
suboptions:
channelWidth:
description: Sets channel width (MHz) for 6Ghz band. Can be one of '0', '20',
@@ -445,6 +592,10 @@ EXAMPLES = r"""
apBandSettings:
bandOperationMode: dual
bandSteeringEnabled: true
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
bandSelectionType: ap
clientBalancingEnabled: true
fiveGhzSettings:
@@ -479,6 +630,11 @@ EXAMPLES = r"""
- 157
- 161
- 165
+ flexRadios:
+ byModel:
+ - bands:
+ - '5'
+ model: MR34
minBitrateType: band
name: Main Office
networkId: string
@@ -486,63 +642,123 @@ EXAMPLES = r"""
'0':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'1':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'10':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'11':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'12':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'13':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'14':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'2':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'3':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'4':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'5':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'6':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'7':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'8':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'9':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
sixGhzSettings:
channelWidth: auto
maxPower: 30
@@ -614,7 +830,7 @@ EXAMPLES = r"""
twoFourGhzSettings:
axEnabled: true
maxPower: 30
- minBitrate: 11
+ minBitrate: 11.0
minPower: 5
rxsop: -95
validAutoChannels:
@@ -622,6 +838,32 @@ EXAMPLES = r"""
- 6
- 11
+- name: Delete by id
+ cisco.meraki.networks_wireless_rf_profiles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ networkId: string
+ rfProfileId: string
+
- name: Update by id
cisco.meraki.networks_wireless_rf_profiles:
meraki_api_key: "{{meraki_api_key}}"
@@ -648,6 +890,10 @@ EXAMPLES = r"""
apBandSettings:
bandOperationMode: dual
bandSteeringEnabled: true
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
bandSelectionType: ap
clientBalancingEnabled: true
fiveGhzSettings:
@@ -682,6 +928,11 @@ EXAMPLES = r"""
- 157
- 161
- 165
+ flexRadios:
+ byModel:
+ - bands:
+ - '5'
+ model: MR34
minBitrateType: band
name: '1234'
networkId: string
@@ -689,63 +940,123 @@ EXAMPLES = r"""
'0':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'1':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'10':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'11':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'12':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'13':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'14':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'2':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'3':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'4':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'5':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'6':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'7':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'8':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
'9':
bandOperationMode: dual
bandSteeringEnabled: true
- minBitrate: 11
+ bands:
+ enabled:
+ - '2.4'
+ - '5'
+ minBitrate: 11.0
rfProfileId: string
sixGhzSettings:
channelWidth: auto
@@ -818,7 +1129,7 @@ EXAMPLES = r"""
twoFourGhzSettings:
axEnabled: true
maxPower: 30
- minBitrate: 11
+ minBitrate: 11.0
minPower: 5
rxsop: -95
validAutoChannels:
@@ -826,32 +1137,6 @@ EXAMPLES = r"""
- 6
- 11
-- name: Delete by id
- cisco.meraki.networks_wireless_rf_profiles:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- networkId: string
- rfProfileId: string
-
"""
RETURN = r"""
meraki_response:
@@ -860,130 +1145,220 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "networkId": "string",
- "name": "string",
- "clientBalancingEnabled": true,
- "minBitrateType": "string",
- "bandSelectionType": "string",
"apBandSettings": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
- },
- "twoFourGhzSettings": {
- "maxPower": 0,
- "minPower": 0,
- "minBitrate": 0,
- "validAutoChannels": [
- 0
- ],
- "axEnabled": true,
- "rxsop": 0
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ }
},
+ "bandSelectionType": "string",
+ "clientBalancingEnabled": true,
"fiveGhzSettings": {
+ "channelWidth": "string",
"maxPower": 0,
- "minPower": 0,
"minBitrate": 0,
+ "minPower": 0,
+ "rxsop": 0,
"validAutoChannels": [
0
- ],
- "channelWidth": "string",
- "rxsop": 0
- },
- "transmission": {
- "enabled": true
+ ]
},
+ "id": "string",
+ "minBitrateType": "string",
+ "name": "string",
+ "networkId": "string",
"perSsidSettings": {
"0": {
- "name": "string",
- "minBitrate": 0,
"bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
},
"1": {
- "name": "string",
- "minBitrate": 0,
"bandOperationMode": "string",
- "bandSteeringEnabled": true
- },
- "2": {
- "name": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
- "bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "name": "string"
},
- "3": {
- "name": "string",
- "minBitrate": 0,
+ "10": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
- },
- "4": {
- "name": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
- "bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "name": "string"
},
- "5": {
- "name": "string",
- "minBitrate": 0,
+ "11": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
- },
- "6": {
- "name": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
- "bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "name": "string"
},
- "7": {
- "name": "string",
- "minBitrate": 0,
+ "12": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
- },
- "8": {
- "name": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
- "bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "name": "string"
},
- "9": {
- "name": "string",
- "minBitrate": 0,
+ "13": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
- },
- "10": {
- "name": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
+ "name": "string"
+ },
+ "14": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
},
- "11": {
- "name": "string",
+ "2": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
+ "name": "string"
+ },
+ "3": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
},
- "12": {
- "name": "string",
+ "4": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
+ "name": "string"
+ },
+ "5": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
},
- "13": {
- "name": "string",
+ "6": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
+ "name": "string"
+ },
+ "7": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
},
- "14": {
- "name": "string",
+ "8": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
"minBitrate": 0,
+ "name": "string"
+ },
+ "9": {
"bandOperationMode": "string",
- "bandSteeringEnabled": true
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
}
+ },
+ "sixGhzSettings": {
+ "channelWidth": "string",
+ "maxPower": 0,
+ "minBitrate": 0,
+ "minPower": 0,
+ "rxsop": 0,
+ "validAutoChannels": [
+ 0
+ ]
+ },
+ "transmission": {
+ "enabled": true
+ },
+ "twoFourGhzSettings": {
+ "axEnabled": true,
+ "maxPower": 0,
+ "minBitrate": 0,
+ "minPower": 0,
+ "rxsop": 0,
+ "validAutoChannels": [
+ 0
+ ]
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles_info.py
index 29609886a..5d7a0abcb 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_rf_profiles_info.py
@@ -11,7 +11,7 @@ short_description: Information module for networks _wireless _rfprofiles
description:
- Get all networks _wireless _rfprofiles.
- Get networks _wireless _rfprofiles by id.
-- List the non-basic RF profiles for this network.
+- List RF profiles for this network.
- Return a RF profile.
version_added: '2.16.0'
extends_documentation_fragment:
@@ -114,10 +114,223 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "apBandSettings": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ }
+ },
+ "bandSelectionType": "string",
+ "clientBalancingEnabled": true,
+ "fiveGhzSettings": {
+ "channelWidth": "string",
+ "maxPower": 0,
+ "minBitrate": 0,
+ "minPower": 0,
+ "rxsop": 0,
+ "validAutoChannels": [
+ 0
+ ]
+ },
+ "id": "string",
+ "minBitrateType": "string",
+ "name": "string",
+ "networkId": "string",
+ "perSsidSettings": {
+ "0": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "1": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "10": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "11": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "12": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "13": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "14": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "2": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "3": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "4": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "5": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "6": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "7": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "8": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ },
+ "9": {
+ "bandOperationMode": "string",
+ "bandSteeringEnabled": true,
+ "bands": {
+ "enabled": [
+ "string"
+ ]
+ },
+ "minBitrate": 0,
+ "name": "string"
+ }
+ },
+ "sixGhzSettings": {
+ "channelWidth": "string",
+ "maxPower": 0,
+ "minBitrate": 0,
+ "minPower": 0,
+ "rxsop": 0,
+ "validAutoChannels": [
+ 0
+ ]
+ },
+ "transmission": {
+ "enabled": true
+ },
+ "twoFourGhzSettings": {
+ "axEnabled": true,
+ "maxPower": 0,
+ "minBitrate": 0,
+ "minPower": 0,
+ "rxsop": 0,
+ "validAutoChannels": [
+ 0
+ ]
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings.py
index 9f990b5ac..91f4d4ef7 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings.py
@@ -30,6 +30,23 @@ options:
meshingEnabled:
description: Toggle for enabling or disabling meshing in a network.
type: bool
+ namedVlans:
+ description: Named VLAN settings for wireless networks.
+ suboptions:
+ poolDhcpMonitoring:
+ description: Named VLAN Pool DHCP Monitoring settings.
+ suboptions:
+ duration:
+ description: The duration in minutes that devices will refrain from using
+ dirty VLANs before adding them back to the pool.
+ type: int
+ enabled:
+ description: Whether or not devices using named VLAN pools should remove
+ dirty VLANs from the pool, thereby preventing clients from being assigned
+ to VLANs where they would be unable to obtain an IP address via DHCP.
+ type: bool
+ type: dict
+ type: dict
networkId:
description: NetworkId path parameter. Network ID.
type: str
@@ -80,6 +97,10 @@ EXAMPLES = r"""
ledLightsOn: false
locationAnalyticsEnabled: false
meshingEnabled: true
+ namedVlans:
+ poolDhcpMonitoring:
+ duration: 5
+ enabled: true
networkId: string
upgradeStrategy: minimizeUpgradeTime
@@ -91,16 +112,21 @@ meraki_response:
type: dict
sample: >
{
- "meshingEnabled": true,
"ipv6BridgeEnabled": true,
- "locationAnalyticsEnabled": true,
- "upgradeStrategy": "string",
"ledLightsOn": true,
+ "locationAnalyticsEnabled": true,
+ "meshingEnabled": true,
"namedVlans": {
"poolDhcpMonitoring": {
- "enabled": true,
- "duration": 0
+ "duration": 0,
+ "enabled": true
}
- }
+ },
+ "regulatoryDomain": {
+ "countryCode": "string",
+ "name": "string",
+ "permits6e": true
+ },
+ "upgradeStrategy": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings_info.py
index 9c19a807f..56f3a698e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_settings_info.py
@@ -72,16 +72,21 @@ meraki_response:
type: dict
sample: >
{
- "meshingEnabled": true,
"ipv6BridgeEnabled": true,
- "locationAnalyticsEnabled": true,
- "upgradeStrategy": "string",
"ledLightsOn": true,
+ "locationAnalyticsEnabled": true,
+ "meshingEnabled": true,
"namedVlans": {
"poolDhcpMonitoring": {
- "enabled": true,
- "duration": 0
+ "duration": 0,
+ "enabled": true
}
- }
+ },
+ "regulatoryDomain": {
+ "countryCode": "string",
+ "name": "string",
+ "permits6e": true
+ },
+ "upgradeStrategy": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_signal_quality_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_signal_quality_history_info.py
index e5cd31632..4e1bdb3fe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_signal_quality_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_signal_quality_history_info.py
@@ -131,10 +131,10 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
"endTs": "string",
+ "rssi": 0,
"snr": 0,
- "rssi": 0
+ "startTs": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids.py
index 9938106c5..e16510d2e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids.py
@@ -38,7 +38,7 @@ options:
elements: dict
suboptions:
host:
- description: IP address of your Active Directory server.
+ description: IP address (or FQDN) of your Active Directory server.
type: str
port:
description: (Optional) UDP port the Active Directory server listens on.
@@ -65,7 +65,8 @@ options:
authMode:
description: The association control method for the SSID ('open', 'open-enhanced',
'psk', 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', '8021x-radius',
- '8021x-google', '8021x-localradius', 'ipsk-with-radius' or 'ipsk-without-radius').
+ '8021x-google', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without-radius'
+ or 'ipsk-with-nac').
type: str
availabilityTags:
description: Accepts a list of tags for this SSID. If availableOnAllAps is false,
@@ -194,7 +195,7 @@ options:
elements: dict
suboptions:
host:
- description: IP address of your LDAP server.
+ description: IP address (or FQDN) of your LDAP server.
type: str
port:
description: UDP port the LDAP server listens on.
@@ -255,6 +256,54 @@ options:
name:
description: The name of the SSID.
type: str
+ namedVlans:
+ description: Named VLAN settings.
+ suboptions:
+ radius:
+ description: RADIUS settings. This param is only valid when authMode is 'open-with-radius'
+ and ipAssignmentMode is not 'NAT mode'.
+ suboptions:
+ guestVlan:
+ description: Guest VLAN settings. Used to direct traffic to a guest VLAN
+ when none of the RADIUS servers are reachable or a client receives access-reject
+ from the RADIUS server.
+ suboptions:
+ enabled:
+ description: Whether or not RADIUS guest named VLAN is enabled.
+ type: bool
+ name:
+ description: RADIUS guest VLAN name.
+ type: str
+ type: dict
+ type: dict
+ tagging:
+ description: VLAN tagging settings. This param is only valid when ipAssignmentMode
+ is 'Bridge mode' or 'Layer 3 roaming'.
+ suboptions:
+ byApTags:
+ description: The list of AP tags and VLAN names used for named VLAN tagging.
+ If an AP has a tag matching one in the list, then traffic on this SSID
+ will be directed to use the VLAN name associated to the tag.
+ elements: dict
+ suboptions:
+ tags:
+ description: List of AP tags.
+ elements: str
+ type: list
+ vlanName:
+ description: VLAN name that will be used to tag traffic.
+ type: str
+ type: list
+ defaultVlanName:
+ description: The default VLAN name used to tag traffic in the absence of
+ a matching AP tag.
+ type: str
+ enabled:
+ description: Whether or not traffic should be directed to use specific VLAN
+ names.
+ type: bool
+ type: dict
+ type: dict
networkId:
description: NetworkId path parameter. Network ID.
type: str
@@ -304,7 +353,8 @@ options:
description: Certificate used for authorization for the RADSEC Server.
type: str
host:
- description: IP address to which the APs will send RADIUS accounting messages.
+ description: IP address (or FQDN) to which the APs will send RADIUS accounting
+ messages.
type: str
port:
description: Port on the RADIUS server that is listening for accounting messages.
@@ -384,7 +434,7 @@ options:
description: Certificate used for authorization for the RADSEC Server.
type: str
host:
- description: IP address of your RADIUS server.
+ description: IP address (or FQDN) of your RADIUS server.
type: str
openRoamingCertificateId:
description: The ID of the Openroaming Certificate attached to radius server.
@@ -497,10 +547,234 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
+ activeDirectory:
+ credentials:
+ logonName: user
+ password: password
+ servers:
+ - host: 127.0.0.1
+ port: 3268
+ adultContentFilteringEnabled: false
+ apTagsAndVlanIds:
+ - tags:
+ - tag1
+ - tag2
+ vlanId: 100
+ authMode: 8021x-radius
+ availabilityTags:
+ - tag1
+ - tag2
+ availableOnAllAps: false
+ bandSelection: 5 GHz band only
+ concentratorNetworkId: N_24329156
+ defaultVlanId: 1
+ disassociateClientsOnVpnFailover: false
+ dnsRewrite:
+ dnsCustomNameservers:
+ - 8.8.8.8
+ - 8.8.4.4
+ enabled: true
+ dot11r:
+ adaptive: true
+ enabled: true
+ dot11w:
+ enabled: true
+ required: false
enabled: true
+ encryptionMode: wpa
+ enterpriseAdminAccess: access enabled
+ gre:
+ concentrator:
+ host: 192.168.1.1
+ key: 5
+ ipAssignmentMode: NAT mode
+ lanIsolationEnabled: true
+ ldap:
+ baseDistinguishedName: dc=example,dc=com
+ credentials:
+ distinguishedName: cn=user,dc=example,dc=com
+ password: password
+ serverCaCertificate:
+ contents: '-----BEGIN CERTIFICATE-----
+ MIIEKjCCAxKgAwIBAgIRANb+lsED3eb4+6YKLFFYqEkwDQYJKoZIhvcNAQELBQAw
+ gYcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhT
+ YW4gSm9zZTEcMBoGA1UECgwTQ2lzY28gU3lzdGVtcywgSW5jLjESMBAGA1UECwwJ
+ RE5BU3BhY2VzMR4wHAYDVQQDDBVjaXNjby5vcGVucm9hbWluZy5vcmcwHhcNMjAx
+ MTA1MjEzMzM1WhcNMjExMTA1MjIzMzM1WjCBpDEcMBoGCgmSJomT8ixkAQETDGRu
+ YXNwYWNlczpVUzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQ4wDAYDVQQKEwVD
+ aXNjbzEcMBoGA1UECxMTV0JBOldSSVggRW5kLUVudGl0eTE8MDoGA1UEAxMzNjQ3
+ MDcwNDM4NDQ5NjQxMjAwMDAuMTg4MzQuaHMuY2lzY28ub3BlbnJvYW1pbmcub3Jn
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoqjP9QgRGyUO3p7SH9QK
+ uTq6UYK7nAyjImgS4yQxeBkyZ5f2EUkX8m/AOcewpPxxPBhjPKRwxGeX3S50ksiA
+ ayFomUeslR0S0Z7RN9rzJa+CFyi9MwWIHMbLgXpB8tsSpgTAqwrzoTzOGq9fgC6u
+ pZhdZrBkg3FeJgD88goCi9mZDsY2YAoeGRLFJ2fR8iICqIVQy+Htq9pE22WBLpnS
+ KjL3+mR9FArHNFtWlhKF2YHMUqyHHrnZnF/Ns7QNoMMF7/CK18iAKgnb+2wuGKM
+ aEMddOeOTtz+i/rgjkp/RGMt011EdCsso0/cTo9qqX/bxOOCE4/Mne/ChMkQPnNU
+ CwIDAQABo3IwcDAJBgNVHRMEAjAAMB8GA1UdIwQYMBaAFIG+4l5yiB01gP0sw4ML
+ USopqYcuMB0GA1UdDgQWBBSby1T9leYVOVVdOZXiHCSaDDEMiDAOBgNVHQ8BAf8E
+ BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAEyE
+ 1mjSUyY6uNp6W4l20w7SskALSJDRKkOeZxAgF3VMxlsCuEl70s9oEfntwIpyQtSa
+ jON/9yJHbwm/Az824bmk8Dc7AXIPhay+dftXb8j529gPuYB9AKoPNg0NctkyYCQh
+ a/3YQVdDWX7XgmEiXkL57M7G6+IdcPDONLArfjOcT9qHdkVVq1AIjlMSx3OQQmm/
+ uoLb/G9q/97QA2/l8shG/Na8HjVqGLcl5TNZdbNhs2w9ogxr/GNzqdvym6RQ8vT/
+ UR2n+uwH4n1MUxmHYYeyot5dnIV1IJ6hQ54JAncM9HvCLFk1WHz6RKshQUCuPBiJ
+ wTw70BVktzJnb0VLeDg=
+ -----END CERTIFICATE-----'
+ servers:
+ - host: 127.0.0.1
+ port: 389
+ localRadius:
+ cacheTimeout: 60
+ certificateAuthentication:
+ clientRootCaCertificate:
+ contents: '-----BEGIN CERTIFICATE-----
+ MIIEKjCCAxKgAwIBAgIRANb+lsED3eb4+6YKLFFYqEkwDQYJKoZIhvcNAQELBQAw
+ gYcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhT
+ YW4gSm9zZTEcMBoGA1UECgwTQ2lzY28gU3lzdGVtcywgSW5jLjESMBAGA1UECwwJ
+ RE5BU3BhY2VzMR4wHAYDVQQDDBVjaXNjby5vcGVucm9hbWluZy5vcmcwHhcNMjAx
+ MTA1MjEzMzM1WhcNMjExMTA1MjIzMzM1WjCBpDEcMBoGCgmSJomT8ixkAQETDGRu
+ YXNwYWNlczpVUzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQ4wDAYDVQQKEwVD
+ aXNjbzEcMBoGA1UECxMTV0JBOldSSVggRW5kLUVudGl0eTE8MDoGA1UEAxMzNjQ3
+ MDcwNDM4NDQ5NjQxMjAwMDAuMTg4MzQuaHMuY2lzY28ub3BlbnJvYW1pbmcub3Jn
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoqjP9QgRGyUO3p7SH9QK
+ uTq6UYK7nAyjImgS4yQxeBkyZ5f2EUkX8m/AOcewpPxxPBhjPKRwxGeX3S50ksiA
+ ayFomUeslR0S0Z7RN9rzJa+CFyi9MwWIHMbLgXpB8tsSpgTAqwrzoTzOGq9fgC6u
+ pZhdZrBkg3FeJgD88goCi9mZDsY2YAoeGRLFJ2fR8iICqIVQy+Htq9pE22WBLpnS
+ KjL3+mR9FArHNFtWlhKF2YHMUqyHHrnZnF/Ns7QNoMMF7/CK18iAKgnb+2wuGKM
+ aEMddOeOTtz+i/rgjkp/RGMt011EdCsso0/cTo9qqX/bxOOCE4/Mne/ChMkQPnNU
+ CwIDAQABo3IwcDAJBgNVHRMEAjAAMB8GA1UdIwQYMBaAFIG+4l5yiB01gP0sw4ML
+ USopqYcuMB0GA1UdDgQWBBSby1T9leYVOVVdOZXiHCSaDDEMiDAOBgNVHQ8BAf8E
+ BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAEyE
+ 1mjSUyY6uNp6W4l20w7SskALSJDRKkOeZxAgF3VMxlsCuEl70s9oEfntwIpyQtSa
+ jON/9yJHbwm/Az824bmk8Dc7AXIPhay+dftXb8j529gPuYB9AKoPNg0NctkyYCQh
+ a/3YQVdDWX7XgmEiXkL57M7G6+IdcPDONLArfjOcT9qHdkVVq1AIjlMSx3OQQmm/
+ uoLb/G9q/97QA2/l8shG/Na8HjVqGLcl5TNZdbNhs2w9ogxr/GNzqdvym6RQ8vT/
+ UR2n+uwH4n1MUxmHYYeyot5dnIV1IJ6hQ54JAncM9HvCLFk1WHz6RKshQUCuPBiJ
+ wTw70BVktzJnb0VLeDg=
+ -----END CERTIFICATE-----'
+ enabled: true
+ ocspResponderUrl: http://ocsp-server.example.com
+ useLdap: false
+ useOcsp: true
+ passwordAuthentication:
+ enabled: false
+ mandatoryDhcpEnabled: false
+ minBitrate: 5.5
name: My SSID
+ namedVlans:
+ radius:
+ guestVlan:
+ enabled: true
+ name: Guest VLAN
+ tagging:
+ byApTags:
+ - tags:
+ - tag1
+ - tag2
+ vlanName: My VLAN
+ defaultVlanName: My VLAN
+ enabled: true
networkId: string
number: string
+ oauth:
+ allowedDomains:
+ - example.com
+ perClientBandwidthLimitDown: 0
+ perClientBandwidthLimitUp: 0
+ perSsidBandwidthLimitDown: 0
+ perSsidBandwidthLimitUp: 0
+ psk: deadbeef
+ radiusAccountingEnabled: true
+ radiusAccountingInterimInterval: 5
+ radiusAccountingServers:
+ - caCertificate: '-----BEGIN CERTIFICATE-----
+ MIIEKjCCAxKgAwIBAgIRANb+lsED3eb4+6YKLFFYqEkwDQYJKoZIhvcNAQELBQAw
+ gYcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhT
+ YW4gSm9zZTEcMBoGA1UECgwTQ2lzY28gU3lzdGVtcywgSW5jLjESMBAGA1UECwwJ
+ RE5BU3BhY2VzMR4wHAYDVQQDDBVjaXNjby5vcGVucm9hbWluZy5vcmcwHhcNMjAx
+ MTA1MjEzMzM1WhcNMjExMTA1MjIzMzM1WjCBpDEcMBoGCgmSJomT8ixkAQETDGRu
+ YXNwYWNlczpVUzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQ4wDAYDVQQKEwVD
+ aXNjbzEcMBoGA1UECxMTV0JBOldSSVggRW5kLUVudGl0eTE8MDoGA1UEAxMzNjQ3
+ MDcwNDM4NDQ5NjQxMjAwMDAuMTg4MzQuaHMuY2lzY28ub3BlbnJvYW1pbmcub3Jn
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoqjP9QgRGyUO3p7SH9QK
+ uTq6UYK7nAyjImgS4yQxeBkyZ5f2EUkX8m/AOcewpPxxPBhjPKRwxGeX3S50ksiA
+ ayFomUeslR0S0Z7RN9rzJa+CFyi9MwWIHMbLgXpB8tsSpgTAqwrzoTzOGq9fgC6u
+ pZhdZrBkg3FeJgD88goCi9mZDsY2YAoeGRLFJ2fR8iICqIVQy+Htq9pE22WBLpnS
+ KjL3+mR9FArHNFtWlhKF2YHMUqyHHrnZnF/Ns7QNoMMF7/CK18iAKgnb+2wuGKM
+ aEMddOeOTtz+i/rgjkp/RGMt011EdCsso0/cTo9qqX/bxOOCE4/Mne/ChMkQPnNU
+ CwIDAQABo3IwcDAJBgNVHRMEAjAAMB8GA1UdIwQYMBaAFIG+4l5yiB01gP0sw4ML
+ USopqYcuMB0GA1UdDgQWBBSby1T9leYVOVVdOZXiHCSaDDEMiDAOBgNVHQ8BAf8E
+ BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAEyE
+ 1mjSUyY6uNp6W4l20w7SskALSJDRKkOeZxAgF3VMxlsCuEl70s9oEfntwIpyQtSa
+ jON/9yJHbwm/Az824bmk8Dc7AXIPhay+dftXb8j529gPuYB9AKoPNg0NctkyYCQh
+ a/3YQVdDWX7XgmEiXkL57M7G6+IdcPDONLArfjOcT9qHdkVVq1AIjlMSx3OQQmm/
+ uoLb/G9q/97QA2/l8shG/Na8HjVqGLcl5TNZdbNhs2w9ogxr/GNzqdvym6RQ8vT/
+ UR2n+uwH4n1MUxmHYYeyot5dnIV1IJ6hQ54JAncM9HvCLFk1WHz6RKshQUCuPBiJ
+ wTw70BVktzJnb0VLeDg=
+ -----END CERTIFICATE-----'
+ host: 0.0.0.0
+ port: 3000
+ radsecEnabled: true
+ secret: secret-string
+ radiusAttributeForGroupPolicies: Filter-Id
+ radiusAuthenticationNasId: 00-11-22-33-44-55:AP1
+ radiusCalledStationId: 00-11-22-33-44-55:AP1
+ radiusCoaEnabled: true
+ radiusFailoverPolicy: Deny access
+ radiusFallbackEnabled: true
+ radiusGuestVlanEnabled: true
+ radiusGuestVlanId: 1
+ radiusLoadBalancingPolicy: Round robin
+ radiusOverride: false
+ radiusProxyEnabled: false
+ radiusServerAttemptsLimit: 5
+ radiusServerTimeout: 5
+ radiusServers:
+ - caCertificate: '-----BEGIN CERTIFICATE-----
+ MIIEKjCCAxKgAwIBAgIRANb+lsED3eb4+6YKLFFYqEkwDQYJKoZIhvcNAQELBQAw
+ gYcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhT
+ YW4gSm9zZTEcMBoGA1UECgwTQ2lzY28gU3lzdGVtcywgSW5jLjESMBAGA1UECwwJ
+ RE5BU3BhY2VzMR4wHAYDVQQDDBVjaXNjby5vcGVucm9hbWluZy5vcmcwHhcNMjAx
+ MTA1MjEzMzM1WhcNMjExMTA1MjIzMzM1WjCBpDEcMBoGCgmSJomT8ixkAQETDGRu
+ YXNwYWNlczpVUzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQ4wDAYDVQQKEwVD
+ aXNjbzEcMBoGA1UECxMTV0JBOldSSVggRW5kLUVudGl0eTE8MDoGA1UEAxMzNjQ3
+ MDcwNDM4NDQ5NjQxMjAwMDAuMTg4MzQuaHMuY2lzY28ub3BlbnJvYW1pbmcub3Jn
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoqjP9QgRGyUO3p7SH9QK
+ uTq6UYK7nAyjImgS4yQxeBkyZ5f2EUkX8m/AOcewpPxxPBhjPKRwxGeX3S50ksiA
+ ayFomUeslR0S0Z7RN9rzJa+CFyi9MwWIHMbLgXpB8tsSpgTAqwrzoTzOGq9fgC6u
+ pZhdZrBkg3FeJgD88goCi9mZDsY2YAoeGRLFJ2fR8iICqIVQy+Htq9pE22WBLpnS
+ KjL3+mR9FArHNFtWlhKF2YHMUqyHHrnZnF/Ns7QNoMMF7/CK18iAKgnb+2wuGKM
+ aEMddOeOTtz+i/rgjkp/RGMt011EdCsso0/cTo9qqX/bxOOCE4/Mne/ChMkQPnNU
+ CwIDAQABo3IwcDAJBgNVHRMEAjAAMB8GA1UdIwQYMBaAFIG+4l5yiB01gP0sw4ML
+ USopqYcuMB0GA1UdDgQWBBSby1T9leYVOVVdOZXiHCSaDDEMiDAOBgNVHQ8BAf8E
+ BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAEyE
+ 1mjSUyY6uNp6W4l20w7SskALSJDRKkOeZxAgF3VMxlsCuEl70s9oEfntwIpyQtSa
+ jON/9yJHbwm/Az824bmk8Dc7AXIPhay+dftXb8j529gPuYB9AKoPNg0NctkyYCQh
+ a/3YQVdDWX7XgmEiXkL57M7G6+IdcPDONLArfjOcT9qHdkVVq1AIjlMSx3OQQmm/
+ uoLb/G9q/97QA2/l8shG/Na8HjVqGLcl5TNZdbNhs2w9ogxr/GNzqdvym6RQ8vT/
+ UR2n+uwH4n1MUxmHYYeyot5dnIV1IJ6hQ54JAncM9HvCLFk1WHz6RKshQUCuPBiJ
+ wTw70BVktzJnb0VLeDg=
+ -----END CERTIFICATE-----'
+ host: 0.0.0.0
+ openRoamingCertificateId: 2
+ port: 3000
+ radsecEnabled: true
+ secret: secret-string
+ radiusTestingEnabled: true
+ secondaryConcentratorNetworkId: disabled
+ speedBurst:
+ enabled: true
+ splashGuestSponsorDomains:
+ - example.com
+ splashPage: Click-through splash page
+ useVlanTagging: false
+ visible: true
+ vlanId: 10
+ walledGardenEnabled: true
+ walledGardenRanges:
+ - example.com
+ - 1.1.1.1/32
+ wpaEncryptionMode: WPA2 only
"""
RETURN = r"""
@@ -509,5 +783,55 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "adminSplashUrl": "string",
+ "authMode": "string",
+ "availabilityTags": [
+ "string"
+ ],
+ "availableOnAllAps": true,
+ "bandSelection": "string",
+ "enabled": true,
+ "encryptionMode": "string",
+ "ipAssignmentMode": "string",
+ "localAuth": true,
+ "mandatoryDhcpEnabled": true,
+ "minBitrate": 0,
+ "name": "string",
+ "number": 0,
+ "perClientBandwidthLimitDown": 0,
+ "perClientBandwidthLimitUp": 0,
+ "perSsidBandwidthLimitDown": 0,
+ "perSsidBandwidthLimitUp": 0,
+ "radiusAccountingEnabled": true,
+ "radiusAccountingServers": [
+ {
+ "caCertificate": "string",
+ "host": "string",
+ "openRoamingCertificateId": 0,
+ "port": 0
+ }
+ ],
+ "radiusAttributeForGroupPolicies": "string",
+ "radiusEnabled": true,
+ "radiusFailoverPolicy": "string",
+ "radiusLoadBalancingPolicy": "string",
+ "radiusServers": [
+ {
+ "caCertificate": "string",
+ "host": "string",
+ "openRoamingCertificateId": 0,
+ "port": 0
+ }
+ ],
+ "splashPage": "string",
+ "splashTimeout": "string",
+ "ssidAdminAccessible": true,
+ "visible": true,
+ "walledGardenEnabled": true,
+ "walledGardenRanges": [
+ "string"
+ ],
+ "wpaEncryptionMode": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding.py
index 6ceb22c1c..cd44977c8 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding.py
@@ -19,6 +19,15 @@ options:
enabled:
description: If true, Bonjour forwarding is enabled on this SSID.
type: bool
+ exception:
+ description: Bonjour forwarding exception.
+ suboptions:
+ enabled:
+ description: If true, Bonjour forwarding exception is enabled on this SSID.
+ Exception is required to enable L2 isolation and Bonjour forwarding to work
+ together.
+ type: bool
+ type: dict
networkId:
description: NetworkId path parameter. Network ID.
type: str
@@ -82,6 +91,8 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
enabled: true
+ exception:
+ enabled: true
networkId: string
number: string
rules:
@@ -97,5 +108,19 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "enabled": true,
+ "exception": {
+ "enabled": true
+ },
+ "rules": [
+ {
+ "description": "string",
+ "services": [
+ "string"
+ ],
+ "vlanId": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding_info.py
index 6ca1b1a89..2d438a635 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_bonjour_forwarding_info.py
@@ -75,6 +75,20 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "enabled": true,
+ "exception": {
+ "enabled": true
+ },
+ "rules": [
+ {
+ "description": "string",
+ "services": [
+ "string"
+ ],
+ "vlanId": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_device_type_group_policies_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_device_type_group_policies_info.py
index 1e340bb06..3a8c62ea3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_device_type_group_policies_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_device_type_group_policies_info.py
@@ -75,6 +75,14 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "deviceTypePolicies": [
+ {
+ "devicePolicy": "string",
+ "deviceType": "string"
+ }
+ ],
+ "enabled": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override.py
index f669a8cf0..4f4291051 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override.py
@@ -106,15 +106,15 @@ meraki_response:
type: dict
sample: >
{
- "timeout": 0,
- "maxRetries": 0,
+ "eapolKey": {
+ "retries": 0,
+ "timeoutInMs": 0
+ },
"identity": {
"retries": 0,
"timeout": 0
},
- "eapolKey": {
- "retries": 0,
- "timeoutInMs": 0
- }
+ "maxRetries": 0,
+ "timeout": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override_info.py
index 91c3de4fc..ad6f293a6 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_eap_override_info.py
@@ -77,15 +77,15 @@ meraki_response:
type: dict
sample: >
{
- "timeout": 0,
- "maxRetries": 0,
+ "eapolKey": {
+ "retries": 0,
+ "timeoutInMs": 0
+ },
"identity": {
"retries": 0,
"timeout": 0
},
- "eapolKey": {
- "retries": 0,
- "timeoutInMs": 0
- }
+ "maxRetries": 0,
+ "timeout": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules.py
index 4c8df7919..433c2347a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules.py
@@ -89,6 +89,7 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
+ allowLanAccess: true
networkId: string
number: string
rules:
@@ -105,5 +106,13 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules_info.py
index a0980ff8a..568e8eb11 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l3_firewall_rules_info.py
@@ -74,7 +74,16 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules.py
index c31b070d6..ce95401b6 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules.py
@@ -85,15 +85,6 @@ EXAMPLES = r"""
- policy: deny
type: host
value: google.com
- - policy: deny
- type: port
- value: '23'
- - policy: deny
- type: ipRange
- value: 10.11.12.00/24
- - policy: deny
- type: ipRange
- value: 10.11.12.00/24:5555
"""
RETURN = r"""
@@ -102,5 +93,11 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ [
+ {
+ "policy": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules_info.py
index b70038bc4..01e84baa5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_firewall_l7_firewall_rules_info.py
@@ -74,7 +74,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "policy": "string",
+ "type": "string",
+ "value": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_hotspot20_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_hotspot20_info.py
index fa08c602e..1586e3580 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_hotspot20_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_hotspot20_info.py
@@ -75,6 +75,53 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "domains": [
+ "string"
+ ],
+ "enabled": true,
+ "mccMncs": [
+ {
+ "mcc": "string",
+ "mnc": "string"
+ }
+ ],
+ "naiRealms": [
+ {
+ "format": "string",
+ "methods": [
+ {
+ "authenticationTypes": {
+ "credentials": [
+ "string"
+ ],
+ "eapInnerAuthentication": [
+ "string"
+ ],
+ "nonEapInnerAuthentication": [
+ "string"
+ ],
+ "tunneledEapMethodCredentials": [
+ "string"
+ ]
+ },
+ "id": "string"
+ }
+ ],
+ "name": "string"
+ }
+ ],
+ "networkAccessType": "string",
+ "operator": {
+ "name": "string"
+ },
+ "roamConsortOis": [
+ "string"
+ ],
+ "venue": {
+ "name": "string",
+ "type": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks.py
index 6418280d4..1bb2fd16d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks.py
@@ -92,13 +92,12 @@ EXAMPLES = r"""
state: present
expiresAt: '2018-02-11T00:00:00.090210Z'
groupPolicyId: '101'
- id: '1284392014819'
name: Sample Identity PSK
networkId: string
number: string
passphrase: secret
-- name: Update by id
+- name: Delete by id
cisco.meraki.networks_wireless_ssids_identity_psks:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -120,17 +119,12 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- expiresAt: '2018-02-11T00:00:00.090210Z'
- groupPolicyId: '101'
- id: '1284392014819'
+ state: absent
identityPskId: string
- name: Sample Identity PSK
networkId: string
number: string
- passphrase: secret
-- name: Delete by id
+- name: Update by id
cisco.meraki.networks_wireless_ssids_identity_psks:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -152,10 +146,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ expiresAt: '2018-02-11T00:00:00.090210Z'
+ groupPolicyId: '101'
identityPskId: string
+ name: Sample Identity PSK
networkId: string
number: string
+ passphrase: secret
"""
RETURN = r"""
@@ -164,5 +162,13 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "email": "string",
+ "expiresAt": "string",
+ "groupPolicyId": "string",
+ "id": "string",
+ "name": "string",
+ "passphrase": "string",
+ "wifiPersonalNetworkId": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks_info.py
index 091eed857..0ddb95c88 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_identity_psks_info.py
@@ -115,12 +115,12 @@ meraki_response:
type: dict
sample: >
{
- "name": "string",
- "id": "string",
+ "email": "string",
+ "expiresAt": "string",
"groupPolicyId": "string",
+ "id": "string",
+ "name": "string",
"passphrase": "string",
- "wifiPersonalNetworkId": "string",
- "email": "string",
- "expiresAt": "string"
+ "wifiPersonalNetworkId": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_info.py
index 4b67150ae..9f3fa4dbf 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_info.py
@@ -106,10 +106,57 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "adminSplashUrl": "string",
+ "authMode": "string",
+ "availabilityTags": [
+ "string"
+ ],
+ "availableOnAllAps": true,
+ "bandSelection": "string",
+ "enabled": true,
+ "encryptionMode": "string",
+ "ipAssignmentMode": "string",
+ "localAuth": true,
+ "mandatoryDhcpEnabled": true,
+ "minBitrate": 0,
+ "name": "string",
+ "number": 0,
+ "perClientBandwidthLimitDown": 0,
+ "perClientBandwidthLimitUp": 0,
+ "perSsidBandwidthLimitDown": 0,
+ "perSsidBandwidthLimitUp": 0,
+ "radiusAccountingEnabled": true,
+ "radiusAccountingServers": [
+ {
+ "caCertificate": "string",
+ "host": "string",
+ "openRoamingCertificateId": 0,
+ "port": 0
+ }
+ ],
+ "radiusAttributeForGroupPolicies": "string",
+ "radiusEnabled": true,
+ "radiusFailoverPolicy": "string",
+ "radiusLoadBalancingPolicy": "string",
+ "radiusServers": [
+ {
+ "caCertificate": "string",
+ "host": "string",
+ "openRoamingCertificateId": 0,
+ "port": 0
+ }
+ ],
+ "splashPage": "string",
+ "splashTimeout": "string",
+ "ssidAdminAccessible": true,
+ "visible": true,
+ "walledGardenEnabled": true,
+ "walledGardenRanges": [
+ "string"
+ ],
+ "wpaEncryptionMode": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_schedules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_schedules_info.py
index f77aba8b9..d6cc8e334 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_schedules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_schedules_info.py
@@ -75,6 +75,16 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "enabled": true,
+ "ranges": [
+ {
+ "endDay": "string",
+ "endTime": "string",
+ "startDay": "string",
+ "startTime": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings.py
index c238ed192..0f3807fb1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings.py
@@ -164,6 +164,9 @@ options:
that the URL can be configured without necessarily being used. In order to enable
the custom URL, see 'useSplashUrl'.
type: str
+ themeId:
+ description: The id of the selected splash theme.
+ type: str
useRedirectUrl:
description: The Boolean indicating whether the the user will be redirected to the
custom redirect URL after the splash page. A custom redirect URL must be set if
@@ -258,6 +261,7 @@ EXAMPLES = r"""
md5: 542cccac8d7dedee0f185311d154d194
splashTimeout: 1440
splashUrl: https://www.custom_splash_url.com
+ themeId: c3ddcb4f16785ee747ab5ffc10867d6c8ea704be
useRedirectUrl: true
useSplashUrl: true
welcomeMessage: Welcome!
@@ -270,53 +274,54 @@ meraki_response:
type: dict
sample: >
{
- "ssidNumber": 0,
- "splashPage": "string",
- "useSplashUrl": true,
- "splashUrl": "string",
- "splashTimeout": 0,
- "redirectUrl": "string",
- "useRedirectUrl": true,
- "welcomeMessage": "string",
- "splashLogo": {
- "md5": "string",
- "extension": "string"
- },
- "splashImage": {
- "md5": "string",
- "extension": "string"
- },
- "splashPrepaidFront": {
- "md5": "string",
- "extension": "string"
- },
- "guestSponsorship": {
- "durationInMinutes": 0,
- "guestCanRequestTimeframe": true
- },
- "blockAllTrafficBeforeSignOn": true,
- "controllerDisconnectionBehavior": "string",
"allowSimultaneousLogins": true,
"billing": {
"freeAccess": {
- "enabled": true,
- "durationInMinutes": 0
+ "durationInMinutes": 0,
+ "enabled": true
},
"prepaidAccessFastLoginEnabled": true,
"replyToEmailAddress": "string"
},
+ "blockAllTrafficBeforeSignOn": true,
+ "controllerDisconnectionBehavior": "string",
+ "guestSponsorship": {
+ "durationInMinutes": 0,
+ "guestCanRequestTimeframe": true
+ },
+ "redirectUrl": "string",
+ "selfRegistration": {
+ "authorizationType": "string",
+ "enabled": true
+ },
"sentryEnrollment": {
- "systemsManagerNetwork": {
- "id": "string"
- },
- "strength": "string",
"enforcedSystems": [
"string"
- ]
+ ],
+ "strength": "string",
+ "systemsManagerNetwork": {
+ "id": "string"
+ }
},
- "selfRegistration": {
- "enabled": true,
- "authorizationType": "string"
- }
+ "splashImage": {
+ "extension": "string",
+ "md5": "string"
+ },
+ "splashLogo": {
+ "extension": "string",
+ "md5": "string"
+ },
+ "splashPage": "string",
+ "splashPrepaidFront": {
+ "extension": "string",
+ "md5": "string"
+ },
+ "splashTimeout": 0,
+ "splashUrl": "string",
+ "ssidNumber": 0,
+ "themeId": "string",
+ "useRedirectUrl": true,
+ "useSplashUrl": true,
+ "welcomeMessage": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings_info.py
index f5950e0ac..6a3f33d02 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_splash_settings_info.py
@@ -77,53 +77,54 @@ meraki_response:
type: dict
sample: >
{
- "ssidNumber": 0,
- "splashPage": "string",
- "useSplashUrl": true,
- "splashUrl": "string",
- "splashTimeout": 0,
- "redirectUrl": "string",
- "useRedirectUrl": true,
- "welcomeMessage": "string",
- "splashLogo": {
- "md5": "string",
- "extension": "string"
- },
- "splashImage": {
- "md5": "string",
- "extension": "string"
- },
- "splashPrepaidFront": {
- "md5": "string",
- "extension": "string"
- },
- "guestSponsorship": {
- "durationInMinutes": 0,
- "guestCanRequestTimeframe": true
- },
- "blockAllTrafficBeforeSignOn": true,
- "controllerDisconnectionBehavior": "string",
"allowSimultaneousLogins": true,
"billing": {
"freeAccess": {
- "enabled": true,
- "durationInMinutes": 0
+ "durationInMinutes": 0,
+ "enabled": true
},
"prepaidAccessFastLoginEnabled": true,
"replyToEmailAddress": "string"
},
+ "blockAllTrafficBeforeSignOn": true,
+ "controllerDisconnectionBehavior": "string",
+ "guestSponsorship": {
+ "durationInMinutes": 0,
+ "guestCanRequestTimeframe": true
+ },
+ "redirectUrl": "string",
+ "selfRegistration": {
+ "authorizationType": "string",
+ "enabled": true
+ },
"sentryEnrollment": {
- "systemsManagerNetwork": {
- "id": "string"
- },
- "strength": "string",
"enforcedSystems": [
"string"
- ]
+ ],
+ "strength": "string",
+ "systemsManagerNetwork": {
+ "id": "string"
+ }
},
- "selfRegistration": {
- "enabled": true,
- "authorizationType": "string"
- }
+ "splashImage": {
+ "extension": "string",
+ "md5": "string"
+ },
+ "splashLogo": {
+ "extension": "string",
+ "md5": "string"
+ },
+ "splashPage": "string",
+ "splashPrepaidFront": {
+ "extension": "string",
+ "md5": "string"
+ },
+ "splashTimeout": 0,
+ "splashUrl": "string",
+ "ssidNumber": 0,
+ "themeId": "string",
+ "useRedirectUrl": true,
+ "useSplashUrl": true,
+ "welcomeMessage": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules.py
index ec03f02c9..0258c1f8e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules.py
@@ -10,7 +10,7 @@ module: networks_wireless_ssids_traffic_shaping_rules
short_description: Resource module for networks _wireless _ssids _trafficshaping _rules
description:
- Manage operation update of the resource networks _wireless _ssids _trafficshaping _rules.
-- Update the traffic shaping settings for an SSID on an MR network.
+- Update the traffic shaping rules for an SSID on an MR network.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module
@@ -132,16 +132,6 @@ EXAMPLES = r"""
- definitions:
- type: host
value: google.com
- - type: port
- value: '9090'
- - type: ipRange
- value: 192.1.0.0
- - type: ipRange
- value: 192.1.0.0/16
- - type: ipRange
- value: 10.1.0.0/16:80
- - type: localNet
- value: 192.168.0.0/16
dscpTagValue: 0
pcpTagValue: 0
perClientBandwidthLimits:
@@ -158,5 +148,27 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "defaultRulesEnabled": true,
+ "rules": [
+ {
+ "definitions": [
+ {
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dscpTagValue": 0,
+ "pcpTagValue": 0,
+ "perClientBandwidthLimits": {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "settings": "string"
+ }
+ }
+ ],
+ "trafficShapingEnabled": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules_info.py
index d83212867..1e4a8ba59 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_traffic_shaping_rules_info.py
@@ -75,6 +75,28 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "defaultRulesEnabled": true,
+ "rules": [
+ {
+ "definitions": [
+ {
+ "type": "string",
+ "value": "string"
+ }
+ ],
+ "dscpTagValue": 0,
+ "pcpTagValue": 0,
+ "perClientBandwidthLimits": {
+ "bandwidthLimits": {
+ "limitDown": 0,
+ "limitUp": 0
+ },
+ "settings": "string"
+ }
+ }
+ ],
+ "trafficShapingEnabled": true
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_vpn_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_vpn_info.py
index fd9ec3bee..3b19e185a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_vpn_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_ssids_vpn_info.py
@@ -75,6 +75,29 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "concentrator": {
+ "name": "string",
+ "networkId": "string",
+ "vlanId": 0
+ },
+ "failover": {
+ "heartbeatInterval": 0,
+ "idleTimeout": 0,
+ "requestIp": "string"
+ },
+ "splitTunnel": {
+ "enabled": true,
+ "rules": [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string"
+ }
+ ]
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_usage_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_usage_history_info.py
index 9166b505a..74a7bf9f4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_usage_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/networks_wireless_usage_history_info.py
@@ -133,11 +133,11 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
"endTs": "string",
- "totalKbps": 0,
+ "receivedKbps": 0,
"sentKbps": 0,
- "receivedKbps": 0
+ "startTs": "string",
+ "totalKbps": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations.py b/ansible_collections/cisco/meraki/plugins/modules/organizations.py
index 9f9e15b11..843c816ef 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations.py
@@ -101,7 +101,7 @@ EXAMPLES = r"""
value: '123456'
name: My organization
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -123,17 +123,10 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- api:
- enabled: true
- management:
- details:
- - name: MSP ID
- value: '123456'
- name: My organization
+ state: absent
organizationId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -155,7 +148,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ api:
+ enabled: true
+ management:
+ details:
+ - name: MSP ID
+ value: '123456'
+ name: My organization
organizationId: string
"""
@@ -166,20 +166,18 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "name": "string",
- "url": "string",
"api": {
"enabled": true
},
- "licensing": {
- "model": "string"
- },
"cloud": {
"region": {
"name": "string"
}
},
+ "id": "string",
+ "licensing": {
+ "model": "string"
+ },
"management": {
"details": [
{
@@ -187,6 +185,8 @@ meraki_response:
"value": "string"
}
]
- }
+ },
+ "name": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches.py
index 3671ddcb6..32b75500e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches.py
@@ -36,6 +36,36 @@ options:
description: Unique identifier for the resource to be acted on.
type: str
type: list
+ callback:
+ description: Details for the callback. Please include either an httpServerId OR
+ url and sharedSecret.
+ suboptions:
+ httpServer:
+ description: The webhook receiver used for the callback webhook.
+ suboptions:
+ id:
+ description: The webhook receiver ID that will receive information. If specifying
+ this, please leave the url and sharedSecret fields blank.
+ type: str
+ type: dict
+ payloadTemplate:
+ description: The payload template of the webhook used for the callback.
+ suboptions:
+ id:
+ description: The ID of the payload template. Defaults to 'wpt_00005' for
+ the Callback (included) template.
+ type: str
+ type: dict
+ sharedSecret:
+ description: A shared secret that will be included in the requests sent to the
+ callback URL. It can be used to verify that the request was sent by Meraki.
+ If using this field, please also specify an url.
+ type: str
+ url:
+ description: The callback URL for the webhook target. If using this field, please
+ also specify a sharedSecret.
+ type: str
+ type: dict
confirmed:
description: Set to true for immediate execution. Set to false if the action should
be previewed before executing. This property cannot be unset once it is true.
@@ -100,11 +130,18 @@ EXAMPLES = r"""
actions:
- operation: create
resource: /devices/QXXX-XXXX-XXXX/switch/ports/3
+ callback:
+ httpServer:
+ id: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vd2ViaG9va3M=
+ payloadTemplate:
+ id: wpt_2100
+ sharedSecret: secret
+ url: https://webhook.site/28efa24e-f830-4d9f-a12b-fbb9e5035031
confirmed: true
organizationId: string
synchronous: true
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_action_batches:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -126,13 +163,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
actionBatchId: string
- confirmed: true
organizationId: string
- synchronous: false
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_action_batches:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -154,9 +189,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
actionBatchId: string
+ confirmed: true
organizationId: string
+ synchronous: false
"""
RETURN = r"""
@@ -166,28 +203,34 @@ meraki_response:
type: dict
sample: >
{
+ "actions": [
+ {
+ "body": {},
+ "operation": "string",
+ "resource": "string"
+ }
+ ],
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
+ "confirmed": true,
"id": "string",
"organizationId": "string",
- "confirmed": true,
- "synchronous": true,
"status": {
"completed": true,
- "failed": true,
- "errors": [
- "string"
- ],
"createdResources": [
{
"id": "string",
"uri": "string"
}
- ]
+ ],
+ "errors": [
+ "string"
+ ],
+ "failed": true
},
- "actions": [
- {
- "resource": "string",
- "operation": "string"
- }
- ]
+ "synchronous": true
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches_info.py
index 11bdde6ad..acf6d6e25 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_action_batches_info.py
@@ -114,28 +114,34 @@ meraki_response:
type: dict
sample: >
{
+ "actions": [
+ {
+ "body": {},
+ "operation": "string",
+ "resource": "string"
+ }
+ ],
+ "callback": {
+ "id": "string",
+ "status": "string",
+ "url": "string"
+ },
+ "confirmed": true,
"id": "string",
"organizationId": "string",
- "confirmed": true,
- "synchronous": true,
"status": {
"completed": true,
- "failed": true,
- "errors": [
- "string"
- ],
"createdResources": [
{
"id": "string",
"uri": "string"
}
- ]
+ ],
+ "errors": [
+ "string"
+ ],
+ "failed": true
},
- "actions": [
- {
- "resource": "string",
- "operation": "string"
- }
- ]
+ "synchronous": true
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls.py
index 4be633cc5..b94f77261 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls.py
@@ -113,7 +113,7 @@ EXAMPLES = r"""
protocol: tcp
srcPort: 1,33
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_adaptive_policy_acls:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -135,19 +135,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
aclId: string
- description: Blocks sensitive web traffic
- ipVersion: ipv6
- name: Block sensitive web traffic
organizationId: string
- rules:
- - dstPort: 22-30
- policy: deny
- protocol: tcp
- srcPort: 1,33
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_adaptive_policy_acls:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -169,9 +161,17 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
aclId: string
+ description: Blocks sensitive web traffic
+ ipVersion: ipv6
+ name: Block sensitive web traffic
organizationId: string
+ rules:
+ - dstPort: 22-30
+ policy: deny
+ protocol: tcp
+ srcPort: 1,33
"""
RETURN = r"""
@@ -182,18 +182,18 @@ meraki_response:
sample: >
{
"aclId": "string",
- "name": "string",
+ "createdAt": "string",
"description": "string",
"ipVersion": "string",
+ "name": "string",
"rules": [
{
+ "dstPort": "string",
"policy": "string",
"protocol": "string",
- "srcPort": "string",
- "dstPort": "string"
+ "srcPort": "string"
}
],
- "createdAt": "string",
"updatedAt": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls_info.py
index 088e6e37a..8fa5bc8ea 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_acls_info.py
@@ -110,18 +110,18 @@ meraki_response:
sample: >
{
"aclId": "string",
- "name": "string",
+ "createdAt": "string",
"description": "string",
"ipVersion": "string",
+ "name": "string",
"rules": [
{
+ "dstPort": "string",
"policy": "string",
"protocol": "string",
- "srcPort": "string",
- "dstPort": "string"
+ "srcPort": "string"
}
],
- "createdAt": "string",
"updatedAt": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups.py
index 63238c804..689bcc610 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups.py
@@ -33,8 +33,7 @@ options:
policyObjects:
description: The policy objects that belong to this group; traffic from addresses
specified by these policy objects will be tagged with this group's SGT value if
- no other tagging scheme is being used (each requires one unique attribute) (default
- ).
+ no other tagging scheme is being used (each requires one unique attribute) ().
elements: dict
suboptions:
id:
@@ -106,7 +105,7 @@ EXAMPLES = r"""
requiredIpMappings: []
sgt: 1000
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_adaptive_policy_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -128,19 +127,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- description: Group of XYZ Corp Employees
+ state: absent
id: string
- isDefaultGroup: false
- name: Employee Group
organizationId: string
- policyObjects:
- - id: '2345'
- name: Example Policy Object
- requiredIpMappings: []
- sgt: 1000
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_adaptive_policy_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -162,9 +153,17 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ description: Group of XYZ Corp Employees
id: string
+ isDefaultGroup: false
+ name: Employee Group
organizationId: string
+ policyObjects:
+ - id: '2345'
+ name: Example Policy Object
+ requiredIpMappings: []
+ sgt: 1000
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups_info.py
index 6dc20e932..44f4ddd5f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_groups_info.py
@@ -106,10 +106,24 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "createdAt": "string",
+ "description": "string",
+ "groupId": "string",
+ "isDefaultGroup": true,
+ "name": "string",
+ "policyObjects": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "requiredIpMappings": [
+ "string"
+ ],
+ "sgt": 0,
+ "updatedAt": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_overview_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_overview_info.py
index 4512b4b57..c991e72b2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_overview_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_overview_info.py
@@ -73,19 +73,19 @@ meraki_response:
sample: >
{
"counts": {
- "groups": 0,
- "customGroups": 0,
+ "allowPolicies": 0,
"customAcls": 0,
- "policies": 0,
+ "customGroups": 0,
"denyPolicies": 0,
- "allowPolicies": 0,
+ "groups": 0,
+ "policies": 0,
"policyObjects": 0
},
"limits": {
- "customGroups": 0,
- "rulesInAnAcl": 0,
"aclsInAPolicy": 0,
- "policyObjects": 0
+ "customGroups": 0,
+ "policyObjects": 0,
+ "rulesInAnAcl": 0
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies.py
index 738c6998d..b468ac14e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies.py
@@ -20,7 +20,7 @@ author: Francisco Munoz (@fmunoz)
options:
acls:
description: An ordered array of adaptive policy ACLs (each requires one unique
- attribute) that apply to this policy (default ).
+ attribute) that apply to this policy ().
elements: dict
suboptions:
id:
@@ -128,7 +128,7 @@ EXAMPLES = r"""
name: IoT Devices
sgt: 50
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_adaptive_policy_policies:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -150,23 +150,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- acls:
- - id: '444'
- name: Block web
- destinationGroup:
- id: '333'
- name: IoT Servers
- sgt: 51
+ state: absent
id: string
- lastEntryRule: allow
organizationId: string
- sourceGroup:
- id: '222'
- name: IoT Devices
- sgt: 50
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_adaptive_policy_policies:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -188,9 +176,21 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ acls:
+ - id: '444'
+ name: Block web
+ destinationGroup:
+ id: '333'
+ name: IoT Servers
+ sgt: 51
id: string
+ lastEntryRule: allow
organizationId: string
+ sourceGroup:
+ id: '222'
+ name: IoT Devices
+ sgt: 50
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies_info.py
index 227305973..b13523b03 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_policies_info.py
@@ -106,10 +106,28 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "acls": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "adaptivePolicyId": "string",
+ "createdAt": "string",
+ "destinationGroup": {
+ "id": "string",
+ "name": "string",
+ "sgt": 0
+ },
+ "lastEntryRule": "string",
+ "sourceGroup": {
+ "id": "string",
+ "name": "string",
+ "sgt": 0
+ },
+ "updatedAt": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_settings_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_settings_info.py
index ab4a4d196..0a1408d88 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_settings_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_adaptive_policy_settings_info.py
@@ -69,7 +69,10 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: str
+ sample: >
+ [
+ "string"
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_admins.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_admins.py
index bdee8ec50..edbc2c326 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_admins.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_admins.py
@@ -126,7 +126,7 @@ EXAMPLES = r"""
- access: read-only
tag: west
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_admins:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -148,19 +148,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
adminId: string
- name: Miles Meraki
- networks:
- - access: full
- id: N_24329156
- orgAccess: none
organizationId: string
- tags:
- - access: read-only
- tag: west
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_admins:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -182,9 +174,17 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
adminId: string
+ name: Miles Meraki
+ networks:
+ - access: full
+ id: N_24329156
+ orgAccess: none
organizationId: string
+ tags:
+ - access: read-only
+ tag: west
"""
RETURN = r"""
@@ -194,26 +194,26 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "name": "string",
- "email": "string",
- "orgAccess": "string",
"accountStatus": "string",
- "twoFactorAuthEnabled": true,
+ "authenticationMethod": "string",
+ "email": "string",
"hasApiKey": true,
+ "id": "string",
"lastActive": "string",
- "tags": [
+ "name": "string",
+ "networks": [
{
- "tag": "string",
- "access": "string"
+ "access": "string",
+ "id": "string"
}
],
- "networks": [
+ "orgAccess": "string",
+ "tags": [
{
- "id": "string",
- "access": "string"
+ "access": "string",
+ "tag": "string"
}
],
- "authenticationMethod": "string"
+ "twoFactorAuthEnabled": true
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_admins_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_admins_info.py
index ae00991dc..0049ba6a4 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_admins_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_admins_info.py
@@ -74,27 +74,27 @@ meraki_response:
sample: >
[
{
- "id": "string",
- "name": "string",
- "email": "string",
- "orgAccess": "string",
"accountStatus": "string",
- "twoFactorAuthEnabled": true,
+ "authenticationMethod": "string",
+ "email": "string",
"hasApiKey": true,
+ "id": "string",
"lastActive": "string",
- "tags": [
+ "name": "string",
+ "networks": [
{
- "tag": "string",
- "access": "string"
+ "access": "string",
+ "id": "string"
}
],
- "networks": [
+ "orgAccess": "string",
+ "tags": [
{
- "id": "string",
- "access": "string"
+ "access": "string",
+ "tag": "string"
}
],
- "authenticationMethod": "string"
+ "twoFactorAuthEnabled": true
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_alerts_profiles.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_alerts_profiles.py
index 935aa39d9..e57f96bee 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_alerts_profiles.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_alerts_profiles.py
@@ -31,7 +31,7 @@ options:
type: int
interface:
description: The uplink observed for the alert. Interface must be one of the
- following wan1, wan2, cellular.
+ following wan1, wan2, wan3, cellular.
type: str
jitter_ms:
description: The threshold the metric must cross to be valid for alerting. Used
@@ -138,9 +138,12 @@ EXAMPLES = r"""
bit_rate_bps: 10000
duration: 60
interface: wan1
+ jitter_ms: 100
+ latency_ms: 100
+ loss_ratio: 0.1
+ mos: 3.5
window: 600
description: WAN 1 high utilization
- enabled: true
networkTags:
- tag1
- tag2
@@ -152,7 +155,7 @@ EXAMPLES = r"""
- aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcGF0aA==
type: wanUtilization
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_alerts_profiles:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -174,12 +177,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
alertConfigId: string
- enabled: true
organizationId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_alerts_profiles:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -201,9 +203,29 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ alertCondition:
+ bit_rate_bps: 10000
+ duration: 60
+ interface: wan1
+ jitter_ms: 100
+ latency_ms: 100
+ loss_ratio: 0.1
+ mos: 3.5
+ window: 600
alertConfigId: string
+ description: WAN 1 high utilization
+ enabled: true
+ networkTags:
+ - tag1
+ - tag2
organizationId: string
+ recipients:
+ emails:
+ - admin@example.org
+ httpServerIds:
+ - aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcGF0aA==
+ type: wanUtilization
"""
RETURN = r"""
@@ -212,5 +234,27 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "alertCondition": {
+ "bit_rate_bps": 0,
+ "duration": 0,
+ "interface": "string",
+ "window": 0
+ },
+ "description": "string",
+ "enabled": true,
+ "id": "string",
+ "networkTags": [
+ "string"
+ ],
+ "recipients": {
+ "emails": [
+ "string"
+ ],
+ "httpServerIds": [
+ "string"
+ ]
+ },
+ "type": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_info.py
index e12499b04..095f83e88 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_info.py
@@ -160,16 +160,16 @@ meraki_response:
[
{
"adminId": "string",
- "method": "string",
"host": "string",
+ "method": "string",
+ "operationId": "string",
"path": "string",
"queryString": "string",
- "userAgent": "string",
- "ts": "string",
"responseCode": 0,
"sourceIp": "string",
- "version": 0,
- "operationId": "string"
+ "ts": "string",
+ "userAgent": "string",
+ "version": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py
index 4a591fe1b..f4e488a49 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_api_requests_overview_response_codes_by_interval_info.py
@@ -129,14 +129,14 @@ meraki_response:
sample: >
[
{
- "startTs": "string",
- "endTs": "string",
"counts": [
{
"code": 0,
"count": 0
}
- ]
+ ],
+ "endTs": "string",
+ "startTs": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion_info.py
index 6218bc347..369f406ab 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_security_intrusion_info.py
@@ -69,7 +69,13 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "message": "string",
+ "ruleId": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
new file mode 100644
index 000000000..1230c35b6
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info.py
@@ -0,0 +1,124 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info
+short_description: Information module for organizations _appliance _trafficshaping _vpnexclusions _bynetwork
+description:
+- Get all organizations _appliance _trafficshaping _vpnexclusions _bynetwork.
+- Display VPN exclusion rules for MX networks.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 50.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Optional parameter to filter the results by network IDs.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance getOrganizationApplianceTrafficShapingVpnExclusionsByNetwork
+ description: Complete reference of the getOrganizationApplianceTrafficShapingVpnExclusionsByNetwork API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-traffic-shaping-vpn-exclusions-by-network
+notes:
+ - SDK Method used are
+ appliance.Appliance.get_organization_appliance_traffic_shaping_vpn_exclusions_by_network,
+
+ - Paths used are
+ get /organizations/{organizationId}/appliance/trafficShaping/vpnExclusions/byNetwork,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _appliance _trafficshaping _vpnexclusions _bynetwork
+ cisco.meraki.organizations_appliance_traffic_shaping_vpn_exclusions_by_network_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ networkIds: []
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "custom": [
+ {
+ "destination": "string",
+ "port": "string",
+ "protocol": "string"
+ }
+ ],
+ "majorApplications": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "networkId": "string",
+ "networkName": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_statuses_overview_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_statuses_overview_info.py
new file mode 100644
index 000000000..1c10f74a4
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_statuses_overview_info.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_appliance_uplinks_statuses_overview_info
+short_description: Information module for organizations _appliance _uplinks _statuses _overview
+description:
+- Get all organizations _appliance _uplinks _statuses _overview.
+- Returns an overview of uplink statuses.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance getOrganizationApplianceUplinksStatusesOverview
+ description: Complete reference of the getOrganizationApplianceUplinksStatusesOverview API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-uplinks-statuses-overview
+notes:
+ - SDK Method used are
+ appliance.Appliance.get_organization_appliance_uplinks_statuses_overview,
+
+ - Paths used are
+ get /organizations/{organizationId}/appliance/uplinks/statuses/overview,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _appliance _uplinks _statuses _overview
+ cisco.meraki.organizations_appliance_uplinks_statuses_overview_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ organizationId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "byStatus": {
+ "active": 0,
+ "connecting": 0,
+ "failed": 0,
+ "notConnected": 0,
+ "ready": 0
+ }
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_usage_by_network_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_usage_by_network_info.py
new file mode 100644
index 000000000..14a03b2e2
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_uplinks_usage_by_network_info.py
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_appliance_uplinks_usage_by_network_info
+short_description: Information module for organizations _appliance _uplinks _usage _bynetwork
+description:
+- Get all organizations _appliance _uplinks _usage _bynetwork.
+- >
+ Get the sent and received bytes for each uplink of all MX and Z networks within an organization. If more than one
+ device was active during the specified timespan, then the sent and received bytes will be aggregated by interface.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 365 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 14 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 14 days. The
+ default is 1 day.
+ type: float
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for appliance getOrganizationApplianceUplinksUsageByNetwork
+ description: Complete reference of the getOrganizationApplianceUplinksUsageByNetwork API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-uplinks-usage-by-network
+notes:
+ - SDK Method used are
+ appliance.Appliance.get_organization_appliance_uplinks_usage_by_network,
+
+ - Paths used are
+ get /organizations/{organizationId}/appliance/uplinks/usage/byNetwork,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _appliance _uplinks _usage _bynetwork
+ cisco.meraki.organizations_appliance_uplinks_usage_by_network_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ t0: string
+ t1: string
+ timespan: 0
+ organizationId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "byUplink": [
+ {
+ "interface": "string",
+ "received": 0,
+ "sent": 0,
+ "serial": "string"
+ }
+ ],
+ "name": "string",
+ "networkId": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py
index 3f29c60ff..4808d0857 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers.py
@@ -193,44 +193,44 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "publicIp": "string",
- "remoteId": "string",
- "localId": "string",
- "secret": "string",
- "privateSubnets": [
- "string"
- ],
+ "ikeVersion": "string",
"ipsecPolicies": {
- "ikeCipherAlgo": [
+ "childAuthAlgo": [
"string"
],
- "ikeAuthAlgo": [
+ "childCipherAlgo": [
"string"
],
- "ikePrfAlgo": [
+ "childLifetime": 0,
+ "childPfsGroup": [
"string"
],
- "ikeDiffieHellmanGroup": [
+ "ikeAuthAlgo": [
"string"
],
- "ikeLifetime": 0,
- "childCipherAlgo": [
+ "ikeCipherAlgo": [
"string"
],
- "childAuthAlgo": [
+ "ikeDiffieHellmanGroup": [
"string"
],
- "childPfsGroup": [
+ "ikeLifetime": 0,
+ "ikePrfAlgo": [
"string"
- ],
- "childLifetime": 0
+ ]
},
"ipsecPoliciesPreset": "string",
- "ikeVersion": "string",
+ "localId": "string",
+ "name": "string",
"networkTags": [
"string"
- ]
+ ],
+ "privateSubnets": [
+ "string"
+ ],
+ "publicIp": "string",
+ "remoteId": "string",
+ "secret": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py
index 780115b2d..7dd923632 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_third_party_vpnpeers_info.py
@@ -74,44 +74,44 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "publicIp": "string",
- "remoteId": "string",
- "localId": "string",
- "secret": "string",
- "privateSubnets": [
- "string"
- ],
+ "ikeVersion": "string",
"ipsecPolicies": {
- "ikeCipherAlgo": [
+ "childAuthAlgo": [
"string"
],
- "ikeAuthAlgo": [
+ "childCipherAlgo": [
"string"
],
- "ikePrfAlgo": [
+ "childLifetime": 0,
+ "childPfsGroup": [
"string"
],
- "ikeDiffieHellmanGroup": [
+ "ikeAuthAlgo": [
"string"
],
- "ikeLifetime": 0,
- "childCipherAlgo": [
+ "ikeCipherAlgo": [
"string"
],
- "childAuthAlgo": [
+ "ikeDiffieHellmanGroup": [
"string"
],
- "childPfsGroup": [
+ "ikeLifetime": 0,
+ "ikePrfAlgo": [
"string"
- ],
- "childLifetime": 0
+ ]
},
"ipsecPoliciesPreset": "string",
- "ikeVersion": "string",
+ "localId": "string",
+ "name": "string",
"networkTags": [
"string"
- ]
+ ],
+ "privateSubnets": [
+ "string"
+ ],
+ "publicIp": "string",
+ "remoteId": "string",
+ "secret": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py
index 8773b7c97..5750088e1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules.py
@@ -116,18 +116,16 @@ meraki_response:
returned: always
type: dict
sample: >
- {
- "rules": [
- {
- "comment": "string",
- "policy": "string",
- "protocol": "string",
- "srcPort": "string",
- "srcCidr": "string",
- "destPort": "string",
- "destCidr": "string",
- "syslogEnabled": true
- }
- ]
- }
+ [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string",
+ "srcCidr": "string",
+ "srcPort": "string",
+ "syslogEnabled": true
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules_info.py
index a98db73ac..7d66ec5e0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_appliance_vpn_vpn_firewall_rules_info.py
@@ -69,7 +69,19 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
- sample:
- - {}
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "comment": "string",
+ "destCidr": "string",
+ "destPort": "string",
+ "policy": "string",
+ "protocol": "string",
+ "srcCidr": "string",
+ "srcPort": "string",
+ "syslogEnabled": true
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies.py
index ca170c929..c4c4276c1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies.py
@@ -231,6 +231,32 @@ EXAMPLES = r"""
name: My Branding Policy
organizationId: string
+- name: Delete by id
+ cisco.meraki.organizations_branding_policies:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: absent
+ brandingPolicyId: string
+ organizationId: string
+
- name: Update by id
cisco.meraki.organizations_branding_policies:
meraki_api_key: "{{meraki_api_key}}"
@@ -285,32 +311,6 @@ EXAMPLES = r"""
name: My Branding Policy
organizationId: string
-- name: Delete by id
- cisco.meraki.organizations_branding_policies:
- meraki_api_key: "{{meraki_api_key}}"
- meraki_base_url: "{{meraki_base_url}}"
- meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
- meraki_certificate_path: "{{meraki_certificate_path}}"
- meraki_requests_proxy: "{{meraki_requests_proxy}}"
- meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
- meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
- meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
- meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
- meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
- meraki_maximum_retries: "{{meraki_maximum_retries}}"
- meraki_output_log: "{{meraki_output_log}}"
- meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
- meraki_log_path: "{{meraki_log_path}}"
- meraki_print_console: "{{meraki_print_console}}"
- meraki_suppress_logging: "{{meraki_suppress_logging}}"
- meraki_simulate: "{{meraki_simulate}}"
- meraki_be_geo_id: "{{meraki_be_geo_id}}"
- meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
- meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
- brandingPolicyId: string
- organizationId: string
-
"""
RETURN = r"""
meraki_response:
@@ -319,39 +319,39 @@ meraki_response:
type: dict
sample: >
{
- "name": "string",
- "enabled": true,
"adminSettings": {
"appliesTo": "string",
"values": [
"string"
]
},
+ "customLogo": {
+ "enabled": true,
+ "image": {
+ "preview": {
+ "expiresAt": "string",
+ "url": "string"
+ }
+ }
+ },
+ "enabled": true,
"helpSettings": {
- "helpTab": "string",
- "getHelpSubtab": "string",
- "communitySubtab": "string",
+ "apiDocsSubtab": "string",
"casesSubtab": "string",
- "dataProtectionRequestsSubtab": "string",
- "getHelpSubtabKnowledgeBaseSearch": "string",
- "universalSearchKnowledgeBaseSearch": "string",
"ciscoMerakiProductDocumentation": "string",
- "supportContactInfo": "string",
- "newFeaturesSubtab": "string",
+ "communitySubtab": "string",
+ "dataProtectionRequestsSubtab": "string",
"firewallInfoSubtab": "string",
- "apiDocsSubtab": "string",
+ "getHelpSubtab": "string",
+ "getHelpSubtabKnowledgeBaseSearch": "string",
"hardwareReplacementsSubtab": "string",
+ "helpTab": "string",
+ "helpWidget": "string",
+ "newFeaturesSubtab": "string",
"smForums": "string",
- "helpWidget": "string"
+ "supportContactInfo": "string",
+ "universalSearchKnowledgeBaseSearch": "string"
},
- "customLogo": {
- "enabled": true,
- "image": {
- "preview": {
- "url": "string",
- "expiresAt": "string"
- }
- }
- }
+ "name": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_info.py
index f1c61ced5..b052d28a1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_branding_policies_info.py
@@ -109,39 +109,39 @@ meraki_response:
type: dict
sample: >
{
- "name": "string",
- "enabled": true,
"adminSettings": {
"appliesTo": "string",
"values": [
"string"
]
},
+ "customLogo": {
+ "enabled": true,
+ "image": {
+ "preview": {
+ "expiresAt": "string",
+ "url": "string"
+ }
+ }
+ },
+ "enabled": true,
"helpSettings": {
- "helpTab": "string",
- "getHelpSubtab": "string",
- "communitySubtab": "string",
+ "apiDocsSubtab": "string",
"casesSubtab": "string",
- "dataProtectionRequestsSubtab": "string",
- "getHelpSubtabKnowledgeBaseSearch": "string",
- "universalSearchKnowledgeBaseSearch": "string",
"ciscoMerakiProductDocumentation": "string",
- "supportContactInfo": "string",
- "newFeaturesSubtab": "string",
+ "communitySubtab": "string",
+ "dataProtectionRequestsSubtab": "string",
"firewallInfoSubtab": "string",
- "apiDocsSubtab": "string",
+ "getHelpSubtab": "string",
+ "getHelpSubtabKnowledgeBaseSearch": "string",
"hardwareReplacementsSubtab": "string",
+ "helpTab": "string",
+ "helpWidget": "string",
+ "newFeaturesSubtab": "string",
"smForums": "string",
- "helpWidget": "string"
+ "supportContactInfo": "string",
+ "universalSearchKnowledgeBaseSearch": "string"
},
- "customLogo": {
- "enabled": true,
- "image": {
- "preview": {
- "url": "string",
- "expiresAt": "string"
- }
- }
- }
+ "name": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_areas_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_areas_by_device_info.py
new file mode 100644
index 000000000..26b79303c
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_areas_by_device_info.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_camera_boundaries_areas_by_device_info
+short_description: Information module for organizations _camera _boundaries _areas _bydevice
+description:
+- Get all organizations _camera _boundaries _areas _bydevice.
+- Returns all configured area boundaries of cameras.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ serials:
+ description:
+ - >
+ Serials query parameter. A list of serial numbers. The returned cameras will be filtered to only include
+ these serials.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for camera getOrganizationCameraBoundariesAreasByDevice
+ description: Complete reference of the getOrganizationCameraBoundariesAreasByDevice API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-camera-boundaries-areas-by-device
+notes:
+ - SDK Method used are
+ camera.Camera.get_organization_camera_boundaries_areas_by_device,
+
+ - Paths used are
+ get /organizations/{organizationId}/camera/boundaries/areas/byDevice,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _camera _boundaries _areas _bydevice
+ cisco.meraki.organizations_camera_boundaries_areas_by_device_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ serials: []
+ organizationId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "boundaries": {
+ "id": "string",
+ "name": "string",
+ "type": "string",
+ "vertices": [
+ {
+ "x": 0,
+ "y": 0
+ }
+ ]
+ },
+ "networkId": "string",
+ "serial": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_lines_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_lines_by_device_info.py
new file mode 100644
index 000000000..e2d3be61b
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_boundaries_lines_by_device_info.py
@@ -0,0 +1,104 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_camera_boundaries_lines_by_device_info
+short_description: Information module for organizations _camera _boundaries _lines _bydevice
+description:
+- Get all organizations _camera _boundaries _lines _bydevice.
+- Returns all configured crossingline boundaries of cameras.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ serials:
+ description:
+ - >
+ Serials query parameter. A list of serial numbers. The returned cameras will be filtered to only include
+ these serials.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for camera getOrganizationCameraBoundariesLinesByDevice
+ description: Complete reference of the getOrganizationCameraBoundariesLinesByDevice API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-camera-boundaries-lines-by-device
+notes:
+ - SDK Method used are
+ camera.Camera.get_organization_camera_boundaries_lines_by_device,
+
+ - Paths used are
+ get /organizations/{organizationId}/camera/boundaries/lines/byDevice,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _camera _boundaries _lines _bydevice
+ cisco.meraki.organizations_camera_boundaries_lines_by_device_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ serials: []
+ organizationId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "boundaries": {
+ "directionVertex": {
+ "x": 0,
+ "y": 0
+ },
+ "id": "string",
+ "name": "string",
+ "type": "string",
+ "vertices": [
+ {
+ "x": 0,
+ "y": 0
+ }
+ ]
+ },
+ "networkId": "string",
+ "serial": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts.py
index 3783eb460..709c10270 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts.py
@@ -108,5 +108,16 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "artifactId": "string",
+ "name": "string",
+ "organizationId": "string",
+ "status": {
+ "message": "string",
+ "type": "string"
+ },
+ "uploadId": "string",
+ "uploadUrl": "string",
+ "uploadUrlExpiry": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts_info.py
index 2335fb10a..8dfb82020 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_custom_analytics_artifacts_info.py
@@ -106,10 +106,15 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "artifactId": "string",
+ "name": "string",
+ "organizationId": "string",
+ "status": {
+ "message": "string",
+ "type": "string"
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_detections_history_by_boundary_by_interval_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_detections_history_by_boundary_by_interval_info.py
new file mode 100644
index 000000000..9d0461f4e
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_detections_history_by_boundary_by_interval_info.py
@@ -0,0 +1,123 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_camera_detections_history_by_boundary_by_interval_info
+short_description: Information module for organizations _camera _detections _history _byboundary _byinterval
+description:
+- Get all organizations _camera _detections _history _byboundary _byinterval.
+- Returns analytics data for timespans.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ boundaryIds:
+ description:
+ - >
+ BoundaryIds query parameter. A list of boundary ids. The returned cameras will be filtered to only include
+ these ids.
+ elements: str
+ type: list
+ ranges:
+ description:
+ - Ranges query parameter. A list of time ranges with intervals.
+ elements: dict
+ type: list
+ duration:
+ description:
+ - >
+ Duration query parameter. The minimum time, in seconds, that the person or car remains in the area to be
+ counted. Defaults to boundary configuration or 60.
+ type: int
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 1 - 1000. Defaults to 1000.
+ type: int
+ boundaryTypes:
+ description:
+ - BoundaryTypes query parameter. The detection types. Defaults to 'person'.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for camera getOrganizationCameraDetectionsHistoryByBoundaryByInterval
+ description: Complete reference of the getOrganizationCameraDetectionsHistoryByBoundaryByInterval API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-camera-detections-history-by-boundary-by-interval
+notes:
+ - SDK Method used are
+ camera.Camera.get_organization_camera_detections_history_by_boundary_by_interval,
+
+ - Paths used are
+ get /organizations/{organizationId}/camera/detections/history/byBoundary/byInterval,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _camera _detections _history _byboundary _byinterval
+ cisco.meraki.organizations_camera_detections_history_by_boundary_by_interval_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ boundaryIds: []
+ ranges: []
+ duration: 0
+ perPage: 0
+ boundaryTypes: []
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "boundaryId": "string",
+ "results": {
+ "endTime": "string",
+ "in": 0,
+ "objectType": "string",
+ "out": 0,
+ "startTime": "string"
+ },
+ "type": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_permissions_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_permissions_info.py
new file mode 100644
index 000000000..53e969fc0
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_permissions_info.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_camera_permissions_info
+short_description: Information module for organizations _camera _permissions
+description:
+- Get organizations _camera _permissions by id.
+- Retrieve a single permission scope.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ permissionScopeId:
+ description:
+ - PermissionScopeId path parameter. Permission scope ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for camera getOrganizationCameraPermission
+ description: Complete reference of the getOrganizationCameraPermission API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-camera-permission
+notes:
+ - SDK Method used are
+ camera.Camera.get_organization_camera_permission,
+
+ - Paths used are
+ get /organizations/{organizationId}/camera/permissions/{permissionScopeId},
+"""
+
+EXAMPLES = r"""
+- name: Get organizations _camera _permissions by id
+ cisco.meraki.organizations_camera_permissions_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ organizationId: string
+ permissionScopeId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "id": "string",
+ "level": "string",
+ "name": "string"
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles.py
new file mode 100644
index 000000000..cb141d37a
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles.py
@@ -0,0 +1,129 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_camera_roles
+short_description: Resource module for organizations _camera _roles
+description:
+- Manage operations create, update and delete of the resource organizations _camera _roles.
+- Creates new role for this organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ appliedOnDevices:
+ description: Device tag on which this specified permission is applied.
+ elements: dict
+ suboptions:
+ id:
+ description: Device id.
+ type: str
+ inNetworksWithId:
+ description: Network id scope.
+ type: str
+ inNetworksWithTag:
+ description: Network tag scope.
+ type: str
+ permissionScopeId:
+ description: Permission scope id.
+ type: str
+ tag:
+ description: Device tag.
+ type: str
+ type: list
+ appliedOnNetworks:
+ description: Network tag on which this specified permission is applied.
+ elements: dict
+ suboptions:
+ id:
+ description: Network id.
+ type: str
+ permissionScopeId:
+ description: Permission scope id.
+ type: str
+ tag:
+ description: Network tag.
+ type: str
+ type: list
+ appliedOrgWide:
+ description: Permissions to be applied org wide.
+ elements: dict
+ suboptions:
+ permissionScopeId:
+ description: Permission scope id.
+ type: str
+ type: list
+ name:
+ description: The name of the new role. Must be unique. This parameter is required.
+ type: str
+ organizationId:
+ description: OrganizationId path parameter. Organization ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for camera createOrganizationCameraRole
+ description: Complete reference of the createOrganizationCameraRole API.
+ link: https://developer.cisco.com/meraki/api-v1/#!create-organization-camera-role
+notes:
+ - SDK Method used are
+ camera.Camera.create_organization_camera_role,
+
+ - Paths used are
+ post /organizations/{organizationId}/camera/roles,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.organizations_camera_roles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ appliedOnDevices:
+ - id: ''
+ permissionScopeId: '1'
+ tag: reception-desk
+ appliedOnNetworks:
+ - id: ''
+ permissionScopeId: '2'
+ tag: building-a
+ appliedOrgWide:
+ - id: ''
+ permissionScopeId: '2'
+ tag: building-a
+ name: Security_Guard
+ organizationId: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {}
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles_info.py
new file mode 100644
index 000000000..53c293aeb
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_camera_roles_info.py
@@ -0,0 +1,106 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_camera_roles_info
+short_description: Information module for organizations _camera _roles
+description:
+- Get all organizations _camera _roles.
+- List all the roles in this organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for camera getOrganizationCameraRoles
+ description: Complete reference of the getOrganizationCameraRoles API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-camera-roles
+notes:
+ - SDK Method used are
+ camera.Camera.get_organization_camera_roles,
+
+ - Paths used are
+ get /organizations/{organizationId}/camera/roles,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _camera _roles
+ cisco.meraki.organizations_camera_roles_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ organizationId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "appliedOnDevices": [
+ {
+ "id": "string",
+ "permissionLevel": "string",
+ "permissionScope": "string",
+ "permissionScopeId": "string",
+ "tag": "string"
+ }
+ ],
+ "appliedOnNetworks": [
+ {
+ "id": "string",
+ "permissionLevel": "string",
+ "permissionScope": "string",
+ "permissionScopeId": "string",
+ "tag": "string"
+ }
+ ],
+ "appliedOrgWide": [
+ {
+ "permissionLevel": "string",
+ "permissionScope": "string",
+ "permissionScopeId": "string",
+ "tag": "string"
+ }
+ ],
+ "name": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py
index 9c503aee6..6e1dce91a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_cellular_gateway_uplink_statuses_info.py
@@ -120,29 +120,29 @@ meraki_response:
sample: >
[
{
+ "lastReportedAt": "string",
+ "model": "string",
"networkId": "string",
"serial": "string",
- "model": "string",
- "lastReportedAt": "string",
"uplinks": [
{
+ "apn": "string",
+ "connectionType": "string",
+ "dns1": "string",
+ "dns2": "string",
+ "gateway": "string",
+ "iccid": "string",
"interface": "string",
- "status": "string",
"ip": "string",
+ "model": "string",
"provider": "string",
"publicIp": "string",
- "model": "string",
"signalStat": {
"rsrp": "string",
"rsrq": "string"
},
- "connectionType": "string",
- "apn": "string",
- "gateway": "string",
- "dns1": "string",
- "dns2": "string",
"signalType": "string",
- "iccid": "string"
+ "status": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_claim.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_claim.py
index 38331e5b7..cafc57763 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_claim.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_claim.py
@@ -11,9 +11,10 @@ short_description: Resource module for organizations _claim
description:
- Manage operation create of the resource organizations _claim.
- >
- Claim a list of devices, licenses, and/or orders into an organization. When claiming by order, all devices and
- licenses in the order will be claimed; licenses will be added to the organization and devices will be placed in
- the organization's inventory.
+ Claim a list of devices, licenses, and/or orders into an organization inventory. When claiming by order, all
+ devices and licenses in the order will be claimed; licenses will be added to the organization and devices will be
+ placed in the organization's inventory. This operation can be used up to ten times within a single five minute
+ window.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module
@@ -99,5 +100,18 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "licenses": [
+ {
+ "key": "string",
+ "mode": "string"
+ }
+ ],
+ "orders": [
+ "string"
+ ],
+ "serials": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_bandwidth_usage_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_bandwidth_usage_history_info.py
index c7e8ebc7c..2d913a00e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_bandwidth_usage_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_bandwidth_usage_history_info.py
@@ -94,10 +94,10 @@ meraki_response:
sample: >
[
{
- "ts": "string",
+ "downstream": 0,
"total": 0,
- "upstream": 0,
- "downstream": 0
+ "ts": "string",
+ "upstream": 0
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_overview_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_overview_info.py
index f197340cc..0a8f9d231 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_overview_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_overview_info.py
@@ -90,16 +90,16 @@ meraki_response:
type: dict
sample: >
{
+ "counts": {
+ "total": 0
+ },
"usage": {
+ "average": 0,
"overall": {
- "total": 0,
"downstream": 0,
+ "total": 0,
"upstream": 0
- },
- "average": 0
- },
- "counts": {
- "total": 0
+ }
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_search_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_search_info.py
index 6ad0c555c..ddd9c9236 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_search_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_clients_search_info.py
@@ -99,6 +99,53 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "clientId": "string",
+ "mac": "string",
+ "manufacturer": "string",
+ "records": [
+ {
+ "cdp": "string",
+ "clientVpnConnections": [
+ {
+ "connectedAt": 0,
+ "disconnectedAt": 0,
+ "remoteIp": "string"
+ }
+ ],
+ "description": "string",
+ "firstSeen": 0,
+ "ip": "string",
+ "ip6": "string",
+ "lastSeen": 0,
+ "lldp": [
+ "string"
+ ],
+ "network": {
+ "enrollmentString": "string",
+ "id": "string",
+ "isBoundToConfigTemplate": true,
+ "name": "string",
+ "notes": "string",
+ "organizationId": "string",
+ "productTypes": [
+ "string"
+ ],
+ "tags": [
+ "string"
+ ],
+ "timeZone": "string"
+ },
+ "os": "string",
+ "smInstalled": true,
+ "ssid": "string",
+ "status": "string",
+ "switchport": "string",
+ "user": "string",
+ "vlan": "string",
+ "wirelessCapabilities": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_clone.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_clone.py
index 1b2aedb18..300371f86 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_clone.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_clone.py
@@ -71,20 +71,18 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "name": "string",
- "url": "string",
"api": {
"enabled": true
},
- "licensing": {
- "model": "string"
- },
"cloud": {
"region": {
"name": "string"
}
},
+ "id": "string",
+ "licensing": {
+ "model": "string"
+ },
"management": {
"details": [
{
@@ -92,6 +90,8 @@ meraki_response:
"value": "string"
}
]
- }
+ },
+ "name": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates.py
index 87073467e..c0ebb3702 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates.py
@@ -21,6 +21,9 @@ options:
configTemplateId:
description: ConfigTemplateId path parameter. Config template ID.
type: str
+ copyFromNetworkId:
+ description: The ID of the network or config template to copy configuration from.
+ type: str
name:
description: The name of the configuration template.
type: str
@@ -81,11 +84,12 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
+ copyFromNetworkId: N_24329156
name: My config template
organizationId: string
timeZone: America/Los_Angeles
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_config_templates:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -107,13 +111,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
configTemplateId: string
- name: My config template
organizationId: string
- timeZone: America/Los_Angeles
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_config_templates:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -135,9 +137,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
configTemplateId: string
+ name: My config template
organizationId: string
+ timeZone: America/Los_Angeles
"""
RETURN = r"""
@@ -146,5 +150,12 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "id": "string",
+ "name": "string",
+ "productTypes": [
+ "string"
+ ],
+ "timeZone": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_info.py
index 24c619cdc..9c12ff69f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_info.py
@@ -106,10 +106,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "id": "string",
+ "name": "string",
+ "productTypes": [
+ "string"
+ ],
+ "timeZone": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_info.py
index bdae89ac3..2c9c8747f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_info.py
@@ -10,7 +10,7 @@ module: organizations_config_templates_switch_profiles_info
short_description: Information module for organizations _configtemplates _switch _profiles
description:
- Get all organizations _configtemplates _switch _profiles.
-- List the switch profiles for your switch template configuration.
+- List the switch templates for your switch template configuration.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -74,11 +74,14 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
+ type: list
+ elements: dict
sample: >
- {
- "switchProfileId": "string",
- "name": "string",
- "model": "string"
- }
+ [
+ {
+ "model": "string",
+ "name": "string",
+ "switchProfileId": "string"
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports.py
index 3fe154c30..eec8506a2 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports.py
@@ -10,23 +10,23 @@ module: organizations_config_templates_switch_profiles_ports
short_description: Resource module for organizations _configtemplates _switch _profiles _ports
description:
- Manage operation update of the resource organizations _configtemplates _switch _profiles _ports.
-- Update a switch profile port.
+- Update a switch template port.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module
author: Francisco Munoz (@fmunoz)
options:
accessPolicyNumber:
- description: The number of a custom access policy to configure on the switch profile
+ description: The number of a custom access policy to configure on the switch template
port. Only applicable when 'accessPolicyType' is 'Custom access policy'.
type: int
accessPolicyType:
- description: The type of the access policy of the switch profile port. Only applicable
+ description: The type of the access policy of the switch template port. Only applicable
to access ports. Can be one of 'Open', 'Custom access policy', 'MAC allow list'
or 'Sticky MAC allow list'.
type: str
allowedVlans:
- description: The VLANs allowed on the switch profile port. Only applicable to trunk
+ description: The VLANs allowed on the switch template port. Only applicable to trunk
ports.
type: str
configTemplateId:
@@ -37,17 +37,17 @@ options:
Dynamic ARP Inspection will allow the traffic.
type: bool
enabled:
- description: The status of the switch profile port.
+ description: The status of the switch template port.
type: bool
flexibleStackingEnabled:
description: For supported switches (e.g. MS420/MS425), whether or not the port
has flexible stacking enabled.
type: bool
isolationEnabled:
- description: The isolation status of the switch profile port.
+ description: The isolation status of the switch template port.
type: bool
linkNegotiation:
- description: The link speed for the switch profile port.
+ description: The link speed for the switch template port.
type: str
macAllowList:
description: Only devices with MAC addresses specified in this list will have access
@@ -56,13 +56,13 @@ options:
elements: str
type: list
name:
- description: The name of the switch profile port.
+ description: The name of the switch template port.
type: str
organizationId:
description: OrganizationId path parameter. Organization ID.
type: str
poeEnabled:
- description: The PoE status of the switch profile port.
+ description: The PoE status of the switch template port.
type: bool
portId:
description: PortId path parameter. Port ID.
@@ -100,29 +100,29 @@ options:
applicable when 'accessPolicyType' is 'Sticky MAC allow list'.
type: int
stormControlEnabled:
- description: The storm control status of the switch profile port.
+ description: The storm control status of the switch template port.
type: bool
stpGuard:
description: The state of the STP guard ('disabled', 'root guard', 'bpdu guard'
or 'loop guard').
type: str
tags:
- description: The list of tags of the switch profile port.
+ description: The list of tags of the switch template port.
elements: str
type: list
type:
- description: The type of the switch profile port ('trunk' or 'access').
+ description: The type of the switch template port ('trunk' or 'access').
type: str
udld:
description: The action to take when Unidirectional Link is detected (Alert only,
Enforce). Default configuration is Alert only.
type: str
vlan:
- description: The VLAN of the switch profile port. A null value will clear the value
- set for trunk ports.
+ description: The VLAN of the switch template port. For a trunk port, this is the
+ native VLAN. A null value will clear the value set for trunk ports.
type: int
voiceVlan:
- description: The voice VLAN of the switch profile port. Only applicable to access
+ description: The voice VLAN of the switch template port. Only applicable to access
ports.
type: int
requirements:
@@ -209,42 +209,48 @@ meraki_response:
type: dict
sample: >
{
- "portId": "string",
- "name": "string",
- "tags": [
- "string"
- ],
- "enabled": true,
- "poeEnabled": true,
- "type": "string",
- "vlan": 0,
- "voiceVlan": 0,
+ "accessPolicyNumber": 0,
+ "accessPolicyType": "string",
"allowedVlans": "string",
+ "daiTrusted": true,
+ "enabled": true,
+ "flexibleStackingEnabled": true,
"isolationEnabled": true,
- "rstpEnabled": true,
- "stpGuard": "string",
"linkNegotiation": "string",
"linkNegotiationCapabilities": [
"string"
],
- "portScheduleId": "string",
- "udld": "string",
- "accessPolicyType": "string",
- "accessPolicyNumber": 0,
"macAllowList": [
"string"
],
+ "mirror": {
+ "mode": "string"
+ },
+ "module": {
+ "model": "string"
+ },
+ "name": "string",
+ "poeEnabled": true,
+ "portId": "string",
+ "portScheduleId": "string",
+ "profile": {
+ "enabled": true,
+ "id": "string",
+ "iname": "string"
+ },
+ "rstpEnabled": true,
"stickyMacAllowList": [
"string"
],
"stickyMacAllowListLimit": 0,
"stormControlEnabled": true,
- "flexibleStackingEnabled": true,
- "daiTrusted": true,
- "profile": {
- "enabled": true,
- "id": "string",
- "iname": "string"
- }
+ "stpGuard": "string",
+ "tags": [
+ "string"
+ ],
+ "type": "string",
+ "udld": "string",
+ "vlan": 0,
+ "voiceVlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports_info.py
index 3d3351bef..8d23b3e89 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_config_templates_switch_profiles_ports_info.py
@@ -11,8 +11,8 @@ short_description: Information module for organizations _configtemplates _switch
description:
- Get all organizations _configtemplates _switch _profiles _ports.
- Get organizations _configtemplates _switch _profiles _ports by id.
-- Return a switch profile port.
-- Return all the ports of a switch profile.
+- Return a switch template port.
+- Return all the ports of a switch template.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -121,42 +121,48 @@ meraki_response:
type: dict
sample: >
{
- "portId": "string",
- "name": "string",
- "tags": [
- "string"
- ],
- "enabled": true,
- "poeEnabled": true,
- "type": "string",
- "vlan": 0,
- "voiceVlan": 0,
+ "accessPolicyNumber": 0,
+ "accessPolicyType": "string",
"allowedVlans": "string",
+ "daiTrusted": true,
+ "enabled": true,
+ "flexibleStackingEnabled": true,
"isolationEnabled": true,
- "rstpEnabled": true,
- "stpGuard": "string",
"linkNegotiation": "string",
"linkNegotiationCapabilities": [
"string"
],
- "portScheduleId": "string",
- "udld": "string",
- "accessPolicyType": "string",
- "accessPolicyNumber": 0,
"macAllowList": [
"string"
],
+ "mirror": {
+ "mode": "string"
+ },
+ "module": {
+ "model": "string"
+ },
+ "name": "string",
+ "poeEnabled": true,
+ "portId": "string",
+ "portScheduleId": "string",
+ "profile": {
+ "enabled": true,
+ "id": "string",
+ "iname": "string"
+ },
+ "rstpEnabled": true,
"stickyMacAllowList": [
"string"
],
"stickyMacAllowListLimit": 0,
"stormControlEnabled": true,
- "flexibleStackingEnabled": true,
- "daiTrusted": true,
- "profile": {
- "enabled": true,
- "id": "string",
- "iname": "string"
- }
+ "stpGuard": "string",
+ "tags": [
+ "string"
+ ],
+ "type": "string",
+ "udld": "string",
+ "vlan": 0,
+ "voiceVlan": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_change_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_change_history_info.py
new file mode 100644
index 000000000..1e9c3ec71
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_availabilities_change_history_info.py
@@ -0,0 +1,174 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_devices_availabilities_change_history_info
+short_description: Information module for organizations _devices _availabilities _changehistory
+description:
+- Get all organizations _devices _availabilities _changehistory.
+- List the availability history information for devices in an organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 31 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 31 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
+ default is 1 day.
+ type: float
+ serials:
+ description:
+ - Serials query parameter. Optional parameter to filter device availabilities history by device serial numbers.
+ elements: str
+ type: list
+ productTypes:
+ description:
+ - ProductTypes query parameter. Optional parameter to filter device availabilities history by device product types.
+ elements: str
+ type: list
+ networkIds:
+ description:
+ - NetworkIds query parameter. Optional parameter to filter device availabilities history by network IDs.
+ elements: str
+ type: list
+ statuses:
+ description:
+ - Statuses query parameter. Optional parameter to filter device availabilities history by device statuses.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for organizations getOrganizationDevicesAvailabilitiesChangeHistory
+ description: Complete reference of the getOrganizationDevicesAvailabilitiesChangeHistory API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-devices-availabilities-change-history
+notes:
+ - SDK Method used are
+ organizations.Organizations.get_organization_devices_availabilities_change_history,
+
+ - Paths used are
+ get /organizations/{organizationId}/devices/availabilities/changeHistory,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _devices _availabilities _changehistory
+ cisco.meraki.organizations_devices_availabilities_change_history_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ serials: []
+ productTypes: []
+ networkIds: []
+ statuses: []
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "details": {
+ "new": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ],
+ "old": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ]
+ },
+ "device": {
+ "model": "string",
+ "name": "string",
+ "productType": "string",
+ "serial": "string"
+ },
+ "network": {
+ "id": "string",
+ "name": "string",
+ "tags": [
+ "string"
+ ],
+ "url": "string"
+ },
+ "ts": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_boots_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_boots_history_info.py
new file mode 100644
index 000000000..3a5530741
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_boots_history_info.py
@@ -0,0 +1,149 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_devices_boots_history_info
+short_description: Information module for organizations _devices _boots _history
+description:
+- Get all organizations _devices _boots _history.
+- >
+ Returns the history of device boots in reverse chronological order most recent first. Currently supported for MS
+ devices only.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 730 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 730 days.
+ type: float
+ serials:
+ description:
+ - >
+ Serials query parameter. Optional parameter to filter device by device serial numbers. This filter uses
+ multiple exact matches.
+ elements: str
+ type: list
+ mostRecentPerDevice:
+ description:
+ - MostRecentPerDevice query parameter. If true, only the most recent boot for each device is returned.
+ type: bool
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ sortOrder:
+ description:
+ - >
+ SortOrder query parameter. Sorted order of entries. Order options are 'ascending' and 'descending'. Default
+ is 'descending'.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for organizations getOrganizationDevicesBootsHistory
+ description: Complete reference of the getOrganizationDevicesBootsHistory API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-devices-boots-history
+notes:
+ - SDK Method used are
+ organizations.Organizations.get_organization_devices_boots_history,
+
+ - Paths used are
+ get /organizations/{organizationId}/devices/boots/history,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _devices _boots _history
+ cisco.meraki.organizations_devices_boots_history_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ t0: string
+ t1: string
+ timespan: 0
+ serials: []
+ mostRecentPerDevice: True
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ sortOrder: string
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "network": {
+ "id": "string"
+ },
+ "serial": "string",
+ "start": {
+ "bootedAt": "string"
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_info.py
index ea91eff27..ecfd3310f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_info.py
@@ -201,21 +201,28 @@ meraki_response:
sample: >
[
{
- "name": "string",
+ "address": "string",
+ "details": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ],
+ "firmware": "string",
+ "imei": "string",
+ "lanIp": "string",
"lat": 0,
"lng": 0,
- "address": "string",
+ "mac": "string",
+ "model": "string",
+ "name": "string",
+ "networkId": "string",
"notes": "string",
+ "productType": "string",
+ "serial": "string",
"tags": [
"string"
- ],
- "networkId": "string",
- "serial": "string",
- "model": "string",
- "mac": "string",
- "lanIp": "string",
- "firmware": "string",
- "productType": "string"
+ ]
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py
index ea3eeaf79..ff092b120 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_power_modules_statuses_by_device_info.py
@@ -11,8 +11,8 @@ short_description: Information module for organizations _devices _powermodules _
description:
- Get all organizations _devices _powermodules _statuses _bydevice.
- >
- List the power status information for devices in an organization. The data returned by this endpoint is updated
- every 5 minutes.
+ List the most recent status information for power modules in rackmount MX and MS devices that support them. The
+ data returned by this endpoint is updated every 5 minutes.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -148,16 +148,16 @@ meraki_response:
},
"productType": "string",
"serial": "string",
- "tags": [
- "string"
- ],
"slots": [
{
+ "model": "string",
"number": 0,
"serial": "string",
- "model": "string",
"status": "string"
}
+ ],
+ "tags": [
+ "string"
]
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_info.py
index 535d692b1..62584e39f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_info.py
@@ -143,30 +143,42 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: dict
+ type: list
+ elements: dict
sample: >
- {
- "name": "string",
- "serial": "string",
- "mac": "string",
- "publicIp": "string",
- "networkId": "string",
- "status": "string",
- "lastReportedAt": "string",
- "lanIp": "string",
- "gateway": "string",
- "ipType": "string",
- "primaryDns": "string",
- "secondaryDns": "string",
- "productType": "string",
- "components": {
- "powerSupplies": [
+ [
+ {
+ "components": {
+ "powerSupplies": [
+ {
+ "model": "string",
+ "poe": {
+ "maximum": 0,
+ "unit": "string"
+ },
+ "serial": "string",
+ "slot": 0,
+ "status": "string"
+ }
+ ]
+ },
+ "gateway": "string",
+ "ipType": "string",
+ "lanIp": "string",
+ "lastReportedAt": "string",
+ "mac": "string",
+ "model": "string",
+ "name": "string",
+ "networkId": "string",
+ "primaryDns": "string",
+ "productType": "string",
+ "publicIp": "string",
+ "secondaryDns": "string",
+ "serial": "string",
+ "status": "string",
+ "tags": [
"string"
]
- },
- "model": "string",
- "tags": [
- "string"
- ]
- }
+ }
+ ]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_overview_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_overview_info.py
index 2ba8069d6..f7ad0ce56 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_overview_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_statuses_overview_info.py
@@ -87,10 +87,10 @@ meraki_response:
sample: >
{
"byStatus": {
- "online": 0,
"alerting": 0,
+ "dormant": 0,
"offline": 0,
- "dormant": 0
+ "online": 0
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_addresses_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_addresses_by_device_info.py
index b29c6a345..eb8b99d0a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_addresses_by_device_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_addresses_by_device_info.py
@@ -151,18 +151,18 @@ meraki_response:
],
"uplinks": [
{
- "interface": "string",
"addresses": [
{
- "protocol": "string",
- "assignmentMode": "string",
"address": "string",
+ "assignmentMode": "string",
"gateway": "string",
+ "protocol": "string",
"public": {
"address": "string"
}
}
- ]
+ ],
+ "interface": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_loss_and_latency_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_loss_and_latency_info.py
index ee4226017..85b5b8b4a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_loss_and_latency_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_devices_uplinks_loss_and_latency_info.py
@@ -43,8 +43,8 @@ options:
uplink:
description:
- >
- Uplink query parameter. Optional filter for a specific WAN uplink. Valid uplinks are wan1, wan2, cellular.
- Default will return all uplinks.
+ Uplink query parameter. Optional filter for a specific WAN uplink. Valid uplinks are wan1, wan2, wan3,
+ cellular. Default will return all uplinks.
type: str
ip:
description:
@@ -106,17 +106,17 @@ meraki_response:
sample: >
[
{
+ "ip": "string",
"networkId": "string",
"serial": "string",
- "uplink": "string",
- "ip": "string",
"timeSeries": [
{
- "ts": "string",
+ "latencyMs": 0,
"lossPercent": 0,
- "latencyMs": 0
+ "ts": "string"
}
- ]
+ ],
+ "uplink": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_info.py
index 12f704ef6..ba2620508 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_info.py
@@ -74,16 +74,16 @@ meraki_response:
sample: >
[
{
- "shortName": "string",
- "name": "string",
"descriptions": {
- "short": "string",
- "long": "string"
+ "long": "string",
+ "short": "string"
},
- "topic": "string",
- "isOrgScopedOnly": true,
"documentationLink": "string",
- "supportLink": "string"
+ "isOrgScopedOnly": true,
+ "name": "string",
+ "shortName": "string",
+ "supportLink": "string",
+ "topic": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins.py
index cc2b37c20..c0fb0ea9d 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins.py
@@ -85,7 +85,7 @@ EXAMPLES = r"""
organizationId: string
shortName: has_magnetic_beta
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_early_access_features_opt_ins:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -107,13 +107,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- limitScopeToNetworks:
- - N_12345
+ state: absent
optInId: string
organizationId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_early_access_features_opt_ins:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -135,7 +133,9 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ limitScopeToNetworks:
+ - N_12345
optInId: string
organizationId: string
@@ -146,5 +146,15 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "createdAt": "string",
+ "id": "string",
+ "limitScopeToNetworks": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "shortName": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins_info.py
index 46fa222bd..794ee8bfe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_early_access_features_opt_ins_info.py
@@ -106,10 +106,17 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "createdAt": "string",
+ "id": "string",
+ "limitScopeToNetworks": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ],
+ "shortName": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_by_device_info.py
index 72755428d..0cafbcdbd 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_by_device_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_by_device_info.py
@@ -10,7 +10,7 @@ module: organizations_firmware_upgrades_by_device_info
short_description: Information module for organizations _firmware _upgrades _bydevice
description:
- Get all organizations _firmware _upgrades _bydevice.
-- Get firmware upgrade status for the filtered devices.
+- Get firmware upgrade status for the filtered devices. This endpoint currently only supports Meraki switches.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -26,7 +26,7 @@ options:
type: str
perPage:
description:
- - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 50. Default is 50.
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 50.
type: int
startingAfter:
description:
@@ -61,14 +61,14 @@ options:
devices returned belong to MAC addresses that are an exact match.
elements: str
type: list
- firmwareUpgradeIds:
+ firmwareUpgradeBatchIds:
description:
- - FirmwareUpgradeIds query parameter. Optional parameter to filter by firmware upgrade ids.
+ - FirmwareUpgradeBatchIds query parameter. Optional parameter to filter by firmware upgrade batch ids.
elements: str
type: list
- firmwareUpgradeBatchIds:
+ upgradeStatuses:
description:
- - FirmwareUpgradeBatchIds query parameter. Optional parameter to filter by firmware upgrade batch ids.
+ - UpgradeStatuses query parameter. Optional parameter to filter by firmware upgrade statuses.
elements: str
type: list
requirements:
@@ -115,8 +115,8 @@ EXAMPLES = r"""
networkIds: []
serials: []
macs: []
- firmwareUpgradeIds: []
firmwareUpgradeBatchIds: []
+ upgradeStatuses: []
organizationId: string
total_pages: -1
direction: next
@@ -132,31 +132,31 @@ meraki_response:
sample: >
[
{
- "serial": "string",
- "name": "string",
"deviceStatus": "string",
+ "name": "string",
+ "serial": "string",
"upgrade": {
- "time": "string",
"fromVersion": {
"id": "string",
- "shortName": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
- "toVersion": {
- "id": "string",
- "shortName": "string",
- "releaseType": "string",
- "releaseDate": "string"
- },
- "status": "string",
"id": "string",
- "upgradeBatchId": "string",
"staged": {
"group": {
"id": "string"
}
- }
+ },
+ "status": "string",
+ "time": "string",
+ "toVersion": {
+ "id": "string",
+ "releaseDate": "string",
+ "releaseType": "string",
+ "shortName": "string"
+ },
+ "upgradeBatchId": "string"
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_info.py
index 0179aaf68..a907f20ed 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_firmware_upgrades_info.py
@@ -14,6 +14,7 @@ description:
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
author: Francisco Munoz (@fmunoz)
options:
headers:
@@ -23,14 +24,32 @@ options:
description:
- OrganizationId path parameter. Organization ID.
type: str
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
status:
description:
- - Status query parameter. The status of an upgrade.
+ - Status query parameter. Optional parameter to filter the upgrade by status.
elements: str
type: list
- productType:
+ productTypes:
description:
- - ProductType query parameter. The product type in a given upgrade ID.
+ - ProductTypes query parameter. Optional parameter to filter the upgrade by product type.
elements: str
type: list
requirements:
@@ -71,9 +90,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
status: []
- productType: []
+ productTypes: []
organizationId: string
+ total_pages: -1
+ direction: next
register: result
"""
@@ -86,28 +110,30 @@ meraki_response:
sample: >
[
{
- "upgradeId": "string",
- "upgradeBatchId": "string",
+ "completedAt": "string",
+ "fromVersion": {
+ "firmware": "string",
+ "id": "string",
+ "releaseDate": "string",
+ "releaseType": "string",
+ "shortName": "string"
+ },
"network": {
"id": "string",
"name": "string"
},
+ "productTypes": "string",
"status": "string",
"time": "string",
- "completedAt": "string",
- "productType": "string",
"toVersion": {
+ "firmware": "string",
"id": "string",
- "shortName": "string",
+ "releaseDate": "string",
"releaseType": "string",
- "releaseDate": "string"
+ "shortName": "string"
},
- "fromVersion": {
- "id": "string",
- "shortName": "string",
- "releaseType": "string",
- "releaseDate": "string"
- }
+ "upgradeBatchId": "string",
+ "upgradeId": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_info.py
index d42e2bc0a..78abad577 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_info.py
@@ -16,11 +16,30 @@ description:
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
author: Francisco Munoz (@fmunoz)
options:
headers:
description: Additional headers.
type: dict
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 9000. Default is 9000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
organizationId:
description:
- OrganizationId path parameter. Organization ID.
@@ -68,6 +87,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ total_pages: -1
+ direction: next
register: result
- name: Get organizations by id
@@ -103,20 +127,18 @@ meraki_response:
type: dict
sample: >
{
- "id": "string",
- "name": "string",
- "url": "string",
"api": {
"enabled": true
},
- "licensing": {
- "model": "string"
- },
"cloud": {
"region": {
"name": "string"
}
},
+ "id": "string",
+ "licensing": {
+ "model": "string"
+ },
"management": {
"details": [
{
@@ -124,6 +146,8 @@ meraki_response:
"value": "string"
}
]
- }
+ },
+ "name": "string",
+ "url": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_applications_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_applications_info.py
index e3afc1e48..cd103e37c 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_applications_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_applications_info.py
@@ -77,14 +77,14 @@ meraki_response:
"applicationId": "string",
"name": "string",
"thresholds": {
- "type": "string",
"byNetwork": [
{
- "networkId": "string",
"goodput": 0,
+ "networkId": "string",
"responseDuration": 0
}
- ]
+ ],
+ "type": "string"
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers.py
index afc622fdf..e51ec7eae 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers.py
@@ -88,7 +88,7 @@ EXAMPLES = r"""
name: Sample VoIP Provider
organizationId: string
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_insight_monitored_media_servers:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -110,14 +110,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- address: 123.123.123.1
- bestEffortMonitoringEnabled: true
+ state: absent
monitoredMediaServerId: string
- name: Sample VoIP Provider
organizationId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_insight_monitored_media_servers:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -139,8 +136,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ address: 123.123.123.1
+ bestEffortMonitoringEnabled: true
monitoredMediaServerId: string
+ name: Sample VoIP Provider
organizationId: string
"""
@@ -150,5 +150,10 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "address": "string",
+ "bestEffortMonitoringEnabled": true,
+ "id": "string",
+ "name": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers_info.py
index bc6bc218f..1ac62c255 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_insight_monitored_media_servers_info.py
@@ -106,15 +106,12 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {
- "id": "string",
- "name": "string",
- "address": "string",
- "bestEffortMonitoringEnabled": true
- }
- ]
+ {
+ "address": "string",
+ "bestEffortMonitoringEnabled": true,
+ "id": "string",
+ "name": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_claim.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_claim.py
index 93e5c7ee1..fb963470b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_claim.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_claim.py
@@ -13,8 +13,8 @@ description:
- >
Claim a list of devices, licenses, and/or orders into an organization inventory. When claiming by order, all
devices and licenses in the order will be claimed; licenses will be added to the organization and devices will be
- placed in the organization's inventory. Use /organizations/{organizationId}/inventory/release to release devices
- from an organization.
+ placed in the organization's inventory. This operation can be used up to ten times within a single five minute
+ window.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module
@@ -100,5 +100,18 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "licenses": [
+ {
+ "key": "string",
+ "mode": "string"
+ }
+ ],
+ "orders": [
+ "string"
+ ],
+ "serials": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_devices_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_devices_info.py
index 9a589ab56..aab15ba41 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_devices_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_devices_info.py
@@ -59,7 +59,9 @@ options:
type: list
networkIds:
description:
- - NetworkIds query parameter. Search for devices in inventory based on network ids.
+ - >
+ NetworkIds query parameter. Search for devices in inventory based on network ids. Use explicit 'null' value
+ to get available devices only.
elements: str
type: list
serials:
@@ -196,17 +198,24 @@ meraki_response:
type: dict
sample: >
{
+ "claimedAt": "string",
+ "countryCode": "string",
+ "details": [
+ {
+ "name": "string",
+ "value": "string"
+ }
+ ],
+ "licenseExpirationDate": "string",
"mac": "string",
- "serial": "string",
- "name": "string",
"model": "string",
+ "name": "string",
"networkId": "string",
"orderNumber": "string",
- "claimedAt": "string",
- "licenseExpirationDate": "string",
+ "productType": "string",
+ "serial": "string",
"tags": [
"string"
- ],
- "productType": "string"
+ ]
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports.py
index 21f5c9770..17d490ebd 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports.py
@@ -87,9 +87,9 @@ meraki_response:
sample: >
[
{
- "status": "string",
"importId": "string",
- "message": "string"
+ "message": "string",
+ "status": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports_info.py
index c6e3cbbd7..685c1b9ab 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_imports_info.py
@@ -80,12 +80,12 @@ meraki_response:
sample: >
[
{
- "importId": "string",
"device": {
- "url": "string",
"created": true,
- "status": "string"
- }
+ "status": "string",
+ "url": "string"
+ },
+ "importId": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_networks_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_networks_info.py
index daf4a9029..726ce2e2f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_networks_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_networks_info.py
@@ -28,6 +28,10 @@ options:
description:
- DeviceType query parameter. Device Type switch or wireless controller.
type: str
+ search:
+ description:
+ - Search query parameter. Optional parameter to search on network name.
+ type: str
perPage:
description:
- PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 100000. Default is 1000.
@@ -85,6 +89,7 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
deviceType: string
+ search: string
perPage: 0
startingAfter: string
endingBefore: string
@@ -103,20 +108,20 @@ meraki_response:
sample: >
[
{
+ "enrollmentString": "string",
"id": "string",
- "organizationId": "string",
+ "isBoundToConfigTemplate": true,
"name": "string",
+ "notes": "string",
+ "organizationId": "string",
"productTypes": [
"string"
],
- "timeZone": "string",
"tags": [
"string"
],
- "enrollmentString": "string",
- "url": "string",
- "notes": "string",
- "isBoundToConfigTemplate": true
+ "timeZone": "string",
+ "url": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_prepare.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_prepare.py
index d49e9788a..276fe93c3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_prepare.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_onboarding_cloud_monitoring_prepare.py
@@ -195,30 +195,30 @@ meraki_response:
sample: >
[
{
- "message": "string",
- "udi": "string",
- "deviceId": "string",
- "status": "string",
"configParams": {
+ "cloudStaticIp": "string",
"tunnel": {
- "mode": "string",
- "port": "string",
"host": "string",
+ "mode": "string",
"name": "string",
+ "port": "string",
"rootCertificate": {
"content": "string",
"name": "string"
}
},
- "cloudStaticIp": "string",
"user": {
"publicKey": "string",
- "username": "string",
"secret": {
"hash": "string"
- }
+ },
+ "username": "string"
}
- }
+ },
+ "deviceId": "string",
+ "message": "string",
+ "status": "string",
+ "udi": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_release.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_release.py
index d0442ec75..0035ab519 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_release.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_inventory_release.py
@@ -72,5 +72,9 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "serials": [
+ "string"
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses.py
index 89a0bd1db..425b58291 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses.py
@@ -78,28 +78,28 @@ meraki_response:
type: dict
sample: >
{
+ "activationDate": "string",
+ "claimDate": "string",
+ "deviceSerial": "string",
+ "durationInDays": 0,
+ "expirationDate": "string",
+ "headLicenseId": "string",
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "deviceSerial": "string",
+ "licenseType": "string",
"networkId": "string",
- "state": "string",
- "seatCount": 0,
- "totalDurationInDays": 0,
- "durationInDays": 0,
+ "orderNumber": "string",
"permanentlyQueuedLicenses": [
{
+ "durationInDays": 0,
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "durationInDays": 0
+ "licenseType": "string",
+ "orderNumber": "string"
}
],
- "claimDate": "string",
- "activationDate": "string",
- "expirationDate": "string",
- "headLicenseId": "string"
+ "seatCount": 0,
+ "state": "string",
+ "totalDurationInDays": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_assign_seats.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_assign_seats.py
index 2306e020a..2b9b8a6b5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_assign_seats.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_assign_seats.py
@@ -82,29 +82,29 @@ meraki_response:
{
"resultingLicenses": [
{
+ "activationDate": "string",
+ "claimDate": "string",
+ "deviceSerial": "string",
+ "durationInDays": 0,
+ "expirationDate": "string",
+ "headLicenseId": "string",
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "deviceSerial": "string",
+ "licenseType": "string",
"networkId": "string",
- "state": "string",
- "seatCount": 0,
- "totalDurationInDays": 0,
- "durationInDays": 0,
+ "orderNumber": "string",
"permanentlyQueuedLicenses": [
{
+ "durationInDays": 0,
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "durationInDays": 0
+ "licenseType": "string",
+ "orderNumber": "string"
}
],
- "claimDate": "string",
- "activationDate": "string",
- "expirationDate": "string",
- "headLicenseId": "string"
+ "seatCount": 0,
+ "state": "string",
+ "totalDurationInDays": 0
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_info.py
index 767d34d5a..9fc09b597 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_info.py
@@ -77,28 +77,28 @@ meraki_response:
type: dict
sample: >
{
+ "activationDate": "string",
+ "claimDate": "string",
+ "deviceSerial": "string",
+ "durationInDays": 0,
+ "expirationDate": "string",
+ "headLicenseId": "string",
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "deviceSerial": "string",
+ "licenseType": "string",
"networkId": "string",
- "state": "string",
- "seatCount": 0,
- "totalDurationInDays": 0,
- "durationInDays": 0,
+ "orderNumber": "string",
"permanentlyQueuedLicenses": [
{
+ "durationInDays": 0,
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "durationInDays": 0
+ "licenseType": "string",
+ "orderNumber": "string"
}
],
- "claimDate": "string",
- "activationDate": "string",
- "expirationDate": "string",
- "headLicenseId": "string"
+ "seatCount": 0,
+ "state": "string",
+ "totalDurationInDays": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_overview_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_overview_info.py
index f10a0a179..fc934e71f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_overview_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_overview_info.py
@@ -70,6 +70,63 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "expirationDate": "string",
+ "licenseCount": 0,
+ "licenseTypes": [
+ {
+ "counts": {
+ "unassigned": 0
+ },
+ "licenseType": "string"
+ }
+ ],
+ "licensedDeviceCounts": {},
+ "states": {
+ "active": {
+ "count": 0
+ },
+ "expired": {
+ "count": 0
+ },
+ "expiring": {
+ "count": 0,
+ "critical": {
+ "expiringCount": 0,
+ "thresholdInDays": 0
+ },
+ "warning": {
+ "expiringCount": 0,
+ "thresholdInDays": 0
+ }
+ },
+ "recentlyQueued": {
+ "count": 0
+ },
+ "unused": {
+ "count": 0,
+ "soonestActivation": {
+ "activationDate": "string",
+ "toActivateCount": 0
+ }
+ },
+ "unusedActive": {
+ "count": 0,
+ "oldestActivation": {
+ "activationDate": "string",
+ "activeCount": 0
+ }
+ }
+ },
+ "status": "string",
+ "systemsManager": {
+ "counts": {
+ "activeSeats": 0,
+ "orgwideEnrolledDevices": 0,
+ "totalSeats": 0,
+ "unassignedSeats": 0
+ }
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_renew_seats.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_renew_seats.py
index 7cc5c95a5..34ebda60b 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_renew_seats.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_licenses_renew_seats.py
@@ -81,29 +81,29 @@ meraki_response:
{
"resultingLicenses": [
{
+ "activationDate": "string",
+ "claimDate": "string",
+ "deviceSerial": "string",
+ "durationInDays": 0,
+ "expirationDate": "string",
+ "headLicenseId": "string",
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "deviceSerial": "string",
+ "licenseType": "string",
"networkId": "string",
- "state": "string",
- "seatCount": 0,
- "totalDurationInDays": 0,
- "durationInDays": 0,
+ "orderNumber": "string",
"permanentlyQueuedLicenses": [
{
+ "durationInDays": 0,
"id": "string",
- "licenseType": "string",
"licenseKey": "string",
- "orderNumber": "string",
- "durationInDays": 0
+ "licenseType": "string",
+ "orderNumber": "string"
}
],
- "claimDate": "string",
- "activationDate": "string",
- "expirationDate": "string",
- "headLicenseId": "string"
+ "seatCount": 0,
+ "state": "string",
+ "totalDurationInDays": 0
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_info.py
index 30ace84a7..c55da1b53 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_info.py
@@ -108,27 +108,27 @@ meraki_response:
sample: >
[
{
- "key": "string",
- "organizationId": "string",
- "duration": 0,
- "mode": "string",
- "startedAt": "string",
"claimedAt": "string",
- "invalidated": true,
- "invalidatedAt": "string",
- "expired": true,
+ "counts": [
+ {
+ "count": 0,
+ "model": "string"
+ }
+ ],
+ "duration": 0,
"editions": [
{
"edition": "string",
"productType": "string"
}
],
- "counts": [
- {
- "model": "string",
- "count": 0
- }
- ]
+ "expired": true,
+ "invalidated": true,
+ "invalidatedAt": "string",
+ "key": "string",
+ "mode": "string",
+ "organizationId": "string",
+ "startedAt": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_move.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_move.py
index 4351b761a..224f8bd82 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_move.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_licensing_coterm_licenses_move.py
@@ -104,54 +104,54 @@ meraki_response:
type: dict
sample: >
{
- "remainderLicenses": [
+ "movedLicenses": [
{
- "key": "string",
- "organizationId": "string",
- "duration": 0,
- "mode": "string",
- "startedAt": "string",
"claimedAt": "string",
- "invalidated": true,
- "invalidatedAt": "string",
- "expired": true,
+ "counts": [
+ {
+ "count": 0,
+ "model": "string"
+ }
+ ],
+ "duration": 0,
"editions": [
{
"edition": "string",
"productType": "string"
}
],
- "counts": [
- {
- "model": "string",
- "count": 0
- }
- ]
+ "expired": true,
+ "invalidated": true,
+ "invalidatedAt": "string",
+ "key": "string",
+ "mode": "string",
+ "organizationId": "string",
+ "startedAt": "string"
}
],
- "movedLicenses": [
+ "remainderLicenses": [
{
- "key": "string",
- "organizationId": "string",
- "duration": 0,
- "mode": "string",
- "startedAt": "string",
"claimedAt": "string",
- "invalidated": true,
- "invalidatedAt": "string",
- "expired": true,
+ "counts": [
+ {
+ "count": 0,
+ "model": "string"
+ }
+ ],
+ "duration": 0,
"editions": [
{
"edition": "string",
"productType": "string"
}
],
- "counts": [
- {
- "model": "string",
- "count": 0
- }
- ]
+ "expired": true,
+ "invalidated": true,
+ "invalidatedAt": "string",
+ "key": "string",
+ "mode": "string",
+ "organizationId": "string",
+ "startedAt": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security.py
index 1e4d85137..d240d49f0 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security.py
@@ -157,20 +157,7 @@ meraki_response:
type: dict
sample: >
{
- "enforcePasswordExpiration": true,
- "passwordExpirationDays": 0,
- "enforceDifferentPasswords": true,
- "numDifferentPasswords": 0,
- "enforceStrongPasswords": true,
- "enforceAccountLockout": true,
"accountLockoutAttempts": 0,
- "enforceIdleTimeout": true,
- "idleTimeoutMinutes": 0,
- "enforceTwoFactorAuth": true,
- "enforceLoginIpRanges": true,
- "loginIpRanges": [
- "string"
- ],
"apiAuthentication": {
"ipRestrictionsForKeys": {
"enabled": true,
@@ -178,6 +165,19 @@ meraki_response:
"string"
]
}
- }
+ },
+ "enforceAccountLockout": true,
+ "enforceDifferentPasswords": true,
+ "enforceIdleTimeout": true,
+ "enforceLoginIpRanges": true,
+ "enforcePasswordExpiration": true,
+ "enforceStrongPasswords": true,
+ "enforceTwoFactorAuth": true,
+ "idleTimeoutMinutes": 0,
+ "loginIpRanges": [
+ "string"
+ ],
+ "numDifferentPasswords": 0,
+ "passwordExpirationDays": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security_info.py
index c9845c74e..63b7f4f3e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_login_security_info.py
@@ -72,20 +72,7 @@ meraki_response:
type: dict
sample: >
{
- "enforcePasswordExpiration": true,
- "passwordExpirationDays": 0,
- "enforceDifferentPasswords": true,
- "numDifferentPasswords": 0,
- "enforceStrongPasswords": true,
- "enforceAccountLockout": true,
"accountLockoutAttempts": 0,
- "enforceIdleTimeout": true,
- "idleTimeoutMinutes": 0,
- "enforceTwoFactorAuth": true,
- "enforceLoginIpRanges": true,
- "loginIpRanges": [
- "string"
- ],
"apiAuthentication": {
"ipRestrictionsForKeys": {
"enabled": true,
@@ -93,6 +80,19 @@ meraki_response:
"string"
]
}
- }
+ },
+ "enforceAccountLockout": true,
+ "enforceDifferentPasswords": true,
+ "enforceIdleTimeout": true,
+ "enforceLoginIpRanges": true,
+ "enforcePasswordExpiration": true,
+ "enforceStrongPasswords": true,
+ "enforceTwoFactorAuth": true,
+ "idleTimeoutMinutes": 0,
+ "loginIpRanges": [
+ "string"
+ ],
+ "numDifferentPasswords": 0,
+ "passwordExpirationDays": 0
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_networks_combine.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_networks_combine.py
index 06360f5f5..050a177ed 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_networks_combine.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_networks_combine.py
@@ -89,20 +89,20 @@ meraki_response:
sample: >
{
"resultingNetwork": {
+ "enrollmentString": "string",
"id": "string",
- "organizationId": "string",
+ "isBoundToConfigTemplate": true,
"name": "string",
+ "notes": "string",
+ "organizationId": "string",
"productTypes": [
"string"
],
- "timeZone": "string",
"tags": [
"string"
],
- "enrollmentString": "string",
- "url": "string",
- "notes": "string",
- "isBoundToConfigTemplate": true
+ "timeZone": "string",
+ "url": "string"
}
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_openapi_spec_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_openapi_spec_info.py
index 6747690be..7c26f73fe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_openapi_spec_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_openapi_spec_info.py
@@ -10,7 +10,7 @@ module: organizations_openapi_spec_info
short_description: Information module for organizations _openapispec
description:
- Get all organizations _openapispec.
-- Return the OpenAPI 2.0 Specification of the organization's API documentation in JSON.
+- Return the OpenAPI Specification of the organization's API documentation in JSON.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -23,6 +23,10 @@ options:
description:
- OrganizationId path parameter. Organization ID.
type: str
+ version:
+ description:
+ - Version query parameter. OpenAPI Specification version to return. Default is 2.
+ type: int
requirements:
- meraki >= 2.4.9
- python >= 3.5
@@ -61,6 +65,7 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ version: 0
organizationId: string
register: result
@@ -70,6 +75,34 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "info": {
+ "description": "string",
+ "title": "string",
+ "version": "string"
+ },
+ "openapi": "string",
+ "paths": {
+ "/organizations": {
+ "get": {
+ "description": "string",
+ "operationId": "string",
+ "responses": {
+ "200": {
+ "description": "string",
+ "examples": {
+ "application/json": [
+ {
+ "id": "string",
+ "name": "string"
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects.py
index eeaccf112..05291e269 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects.py
@@ -29,7 +29,7 @@ options:
type: str
groupIds:
description: The IDs of policy object groups the policy object belongs to.
- elements: int
+ elements: str
type: list
ip:
description: IP Address of a policy object (e.g. "1.2.3.4").
@@ -101,12 +101,17 @@ EXAMPLES = r"""
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
category: network
- groupIds: []
+ cidr: 10.0.0.0/24
+ fqdn: example.com
+ groupIds:
+ - '8'
+ ip: 1.2.3.4
+ mask: 255.255.0.0
name: Web Servers - Datacenter 10
organizationId: string
type: cidr
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_policy_objects:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -128,14 +133,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- groupIds: []
- name: Web Servers - Datacenter 10
+ state: absent
organizationId: string
policyObjectId: string
- type: cidr
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_policy_objects:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -157,7 +159,14 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ cidr: 10.0.0.0/24
+ fqdn: example.com
+ groupIds:
+ - '8'
+ ip: 1.2.3.4
+ mask: 255.255.0.0
+ name: Web Servers - Datacenter 10
organizationId: string
policyObjectId: string
@@ -168,5 +177,19 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "category": "string",
+ "cidr": "string",
+ "createdAt": "string",
+ "groupIds": [
+ "string"
+ ],
+ "id": "string",
+ "name": "string",
+ "networkIds": [
+ "string"
+ ],
+ "type": "string",
+ "updatedAt": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups.py
index 34bcc5920..d321d39c3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups.py
@@ -86,11 +86,13 @@ EXAMPLES = r"""
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
state: present
+ category: NetworkObjectGroup
name: Web Servers - Datacenter 10
- objectIds: []
+ objectIds:
+ - 100
organizationId: string
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_policy_objects_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -112,13 +114,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- name: Web Servers - Datacenter 10
- objectIds: []
+ state: absent
organizationId: string
policyObjectGroupId: string
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_policy_objects_groups:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -140,7 +140,10 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ name: Web Servers - Datacenter 10
+ objectIds:
+ - 100
organizationId: string
policyObjectGroupId: string
@@ -151,5 +154,17 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "category": "string",
+ "createdAt": "string",
+ "id": "string",
+ "name": "string",
+ "networkIds": [
+ "string"
+ ],
+ "objectIds": [
+ 0
+ ],
+ "updatedAt": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups_info.py
index e4db45f02..fb29fb628 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_groups_info.py
@@ -130,10 +130,19 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "category": "string",
+ "createdAt": "string",
+ "id": "string",
+ "name": "string",
+ "networkIds": [
+ "string"
+ ],
+ "objectIds": [
+ 0
+ ],
+ "updatedAt": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_info.py
index 0ceccfc31..21aca544a 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_policy_objects_info.py
@@ -130,10 +130,21 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "category": "string",
+ "cidr": "string",
+ "createdAt": "string",
+ "groupIds": [
+ "string"
+ ],
+ "id": "string",
+ "name": "string",
+ "networkIds": [
+ "string"
+ ],
+ "type": "string",
+ "updatedAt": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps.py
index 89152862f..f141154af 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps.py
@@ -84,7 +84,7 @@ EXAMPLES = r"""
sloLogoutUrl: https://somewhere.com
x509certSha1Fingerprint: 00:11:22:33:44:55:66:77:88:99:00:11:22:33:44:55:66:77:88:99
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_saml_idps:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -106,13 +106,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
+ state: absent
idpId: string
organizationId: string
- sloLogoutUrl: https://somewhere.com
- x509certSha1Fingerprint: 00:11:22:33:44:55:66:77:88:99:00:11:22:33:44:55:66:77:88:99
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_saml_idps:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -134,9 +132,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
idpId: string
organizationId: string
+ sloLogoutUrl: https://somewhere.com
+ x509certSha1Fingerprint: 00:11:22:33:44:55:66:77:88:99:00:11:22:33:44:55:66:77:88:99
"""
RETURN = r"""
@@ -147,10 +147,10 @@ meraki_response:
sample: >
[
{
- "idpId": "string",
"consumerUrl": "string",
- "x509certSha1Fingerprint": "string",
- "sloLogoutUrl": "string"
+ "idpId": "string",
+ "sloLogoutUrl": "string",
+ "x509certSha1Fingerprint": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps_info.py
index 4f3ce2af1..8845b0156 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_idps_info.py
@@ -109,9 +109,9 @@ meraki_response:
type: dict
sample: >
{
- "idpId": "string",
"consumerUrl": "string",
- "x509certSha1Fingerprint": "string",
- "sloLogoutUrl": "string"
+ "idpId": "string",
+ "sloLogoutUrl": "string",
+ "x509certSha1Fingerprint": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles.py
index 77ada3876..c3052a06f 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles.py
@@ -44,7 +44,7 @@ options:
description: SamlRoleId path parameter. Saml role ID.
type: str
tags:
- description: The list of tags that the SAML administrator has privleges on.
+ description: The list of tags that the SAML administrator has privileges on.
elements: dict
suboptions:
access:
@@ -114,7 +114,7 @@ EXAMPLES = r"""
- access: read-only
tag: west
-- name: Update by id
+- name: Delete by id
cisco.meraki.organizations_saml_roles:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -136,19 +136,11 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: present
- networks:
- - access: full
- id: N_24329156
- orgAccess: none
+ state: absent
organizationId: string
- role: myrole
samlRoleId: string
- tags:
- - access: read-only
- tag: west
-- name: Delete by id
+- name: Update by id
cisco.meraki.organizations_saml_roles:
meraki_api_key: "{{meraki_api_key}}"
meraki_base_url: "{{meraki_base_url}}"
@@ -170,9 +162,17 @@ EXAMPLES = r"""
meraki_be_geo_id: "{{meraki_be_geo_id}}"
meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
- state: absent
+ state: present
+ networks:
+ - access: full
+ id: N_24329156
+ orgAccess: none
organizationId: string
+ role: myrole
samlRoleId: string
+ tags:
+ - access: read-only
+ tag: west
"""
RETURN = r"""
@@ -182,19 +182,25 @@ meraki_response:
type: dict
sample: >
{
+ "camera": [
+ {
+ "access": "string",
+ "orgWide": true
+ }
+ ],
"id": "string",
- "role": "string",
- "orgAccess": "string",
"networks": [
{
- "id": "string",
- "access": "string"
+ "access": "string",
+ "id": "string"
}
],
+ "orgAccess": "string",
+ "role": "string",
"tags": [
{
- "tag": "string",
- "access": "string"
+ "access": "string",
+ "tag": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles_info.py
index 35bcd5bc2..b7748bee7 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_saml_roles_info.py
@@ -106,10 +106,29 @@ RETURN = r"""
meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
- type: list
- elements: dict
+ type: dict
sample: >
- [
- {}
- ]
+ {
+ "camera": [
+ {
+ "access": "string",
+ "orgWide": true
+ }
+ ],
+ "id": "string",
+ "networks": [
+ {
+ "access": "string",
+ "id": "string"
+ }
+ ],
+ "orgAccess": "string",
+ "role": "string",
+ "tags": [
+ {
+ "access": "string",
+ "tag": "string"
+ }
+ ]
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_history_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_history_info.py
index c27a764e1..1f0853dde 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_history_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_history_info.py
@@ -73,8 +73,9 @@ options:
description:
- >
Metrics query parameter. Types of sensor readings to retrieve. If no metrics are supplied, all available
- types of readings will be retrieved. Allowed values are battery, button, door, humidity, indoorAirQuality,
- noise, pm25, temperature, tvoc, and water.
+ types of readings will be retrieved. Allowed values are apparentPower, battery, button, co2, current, door,
+ downstreamPower, frequency, humidity, indoorAirQuality, noise, pm25, powerFactor, realPower,
+ remoteLockoutSwitch, temperature, tvoc, voltage, and water.
elements: str
type: list
requirements:
@@ -139,28 +140,41 @@ meraki_response:
sample: >
[
{
- "serial": "string",
- "network": {
- "id": "string",
- "name": "string"
+ "apparentPower": {
+ "draw": 0
},
- "ts": "string",
- "metric": "string",
"battery": {
"percentage": 0
},
"button": {
"pressType": "string"
},
+ "co2": {
+ "concentration": 0
+ },
+ "current": {
+ "draw": 0
+ },
"door": {
"open": true
},
+ "downstreamPower": {
+ "enabled": true
+ },
+ "frequency": {
+ "level": 0
+ },
"humidity": {
"relativePercentage": 0
},
"indoorAirQuality": {
"score": 0
},
+ "metric": "string",
+ "network": {
+ "id": "string",
+ "name": "string"
+ },
"noise": {
"ambient": {
"level": 0
@@ -169,13 +183,27 @@ meraki_response:
"pm25": {
"concentration": 0
},
+ "powerFactor": {
+ "percentage": 0
+ },
+ "realPower": {
+ "draw": 0
+ },
+ "remoteLockoutSwitch": {
+ "locked": true
+ },
+ "serial": "string",
"temperature": {
- "fahrenheit": 0,
- "celsius": 0
+ "celsius": 0,
+ "fahrenheit": 0
},
+ "ts": "string",
"tvoc": {
"concentration": 0
},
+ "voltage": {
+ "level": 0
+ },
"water": {
"present": true
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_latest_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_latest_info.py
index 615c3827e..26dfe95f5 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_latest_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_sensor_readings_latest_info.py
@@ -26,7 +26,7 @@ options:
type: str
perPage:
description:
- - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 100. Default is 100.
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
type: int
startingAfter:
description:
@@ -56,8 +56,9 @@ options:
description:
- >
Metrics query parameter. Types of sensor readings to retrieve. If no metrics are supplied, all available
- types of readings will be retrieved. Allowed values are battery, button, door, humidity, indoorAirQuality,
- noise, pm25, temperature, tvoc, and water.
+ types of readings will be retrieved. Allowed values are apparentPower, battery, button, co2, current, door,
+ downstreamPower, frequency, humidity, indoorAirQuality, noise, pm25, powerFactor, realPower,
+ remoteLockoutSwitch, temperature, tvoc, voltage, and water.
elements: str
type: list
requirements:
@@ -119,30 +120,43 @@ meraki_response:
sample: >
[
{
- "serial": "string",
"network": {
"id": "string",
"name": "string"
},
"readings": [
{
- "ts": "string",
- "metric": "string",
+ "apparentPower": {
+ "draw": 0
+ },
"battery": {
"percentage": 0
},
"button": {
"pressType": "string"
},
+ "co2": {
+ "concentration": 0
+ },
+ "current": {
+ "draw": 0
+ },
"door": {
"open": true
},
+ "downstreamPower": {
+ "enabled": true
+ },
+ "frequency": {
+ "level": 0
+ },
"humidity": {
"relativePercentage": 0
},
"indoorAirQuality": {
"score": 0
},
+ "metric": "string",
"noise": {
"ambient": {
"level": 0
@@ -151,18 +165,32 @@ meraki_response:
"pm25": {
"concentration": 0
},
+ "powerFactor": {
+ "percentage": 0
+ },
+ "realPower": {
+ "draw": 0
+ },
+ "remoteLockoutSwitch": {
+ "locked": true
+ },
"temperature": {
- "fahrenheit": 0,
- "celsius": 0
+ "celsius": 0,
+ "fahrenheit": 0
},
+ "ts": "string",
"tvoc": {
"concentration": 0
},
+ "voltage": {
+ "level": 0
+ },
"water": {
"present": true
}
}
- ]
+ ],
+ "serial": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles.py
new file mode 100644
index 000000000..16ce9cd27
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles.py
@@ -0,0 +1,92 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_sm_admins_roles
+short_description: Resource module for organizations _sm _admins _roles
+description:
+- Manage operations create, update and delete of the resource organizations _sm _admins _roles.
+- Create a Limited Access Role.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ name:
+ description: The name of the Limited Access Role.
+ type: str
+ organizationId:
+ description: OrganizationId path parameter. Organization ID.
+ type: str
+ scope:
+ description: The scope of the Limited Access Role.
+ type: str
+ tags:
+ description: The tags of the Limited Access Role.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm createOrganizationSmAdminsRole
+ description: Complete reference of the createOrganizationSmAdminsRole API.
+ link: https://developer.cisco.com/meraki/api-v1/#!create-organization-sm-admins-role
+notes:
+ - SDK Method used are
+ sm.Sm.create_organization_sm_admins_role,
+
+ - Paths used are
+ post /organizations/{organizationId}/sm/admins/roles,
+"""
+
+EXAMPLES = r"""
+- name: Create
+ cisco.meraki.organizations_sm_admins_roles:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ state: present
+ name: sample name
+ organizationId: string
+ scope: all_tags
+ tags:
+ - tag
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "name": "string",
+ "roleId": "string",
+ "scope": "string",
+ "tags": [
+ "string"
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles_info.py
new file mode 100644
index 000000000..ae7dd20d3
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_admins_roles_info.py
@@ -0,0 +1,118 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_sm_admins_roles_info
+short_description: Information module for organizations _sm _admins _roles
+description:
+- Get all organizations _sm _admins _roles.
+- List the Limited Access Roles for an organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 50.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm getOrganizationSmAdminsRoles
+ description: Complete reference of the getOrganizationSmAdminsRoles API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-sm-admins-roles
+notes:
+ - SDK Method used are
+ sm.Sm.get_organization_sm_admins_roles,
+
+ - Paths used are
+ get /organizations/{organizationId}/sm/admins/roles,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _sm _admins _roles
+ cisco.meraki.organizations_sm_admins_roles_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "items": [
+ {
+ "name": "string",
+ "roleId": "string",
+ "scope": "string",
+ "tags": [
+ "string"
+ ]
+ }
+ ],
+ "meta": {
+ "counts": {
+ "items": {
+ "remaining": 0,
+ "total": 0
+ }
+ }
+ }
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments.py
new file mode 100644
index 000000000..4e7701145
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments.py
@@ -0,0 +1,134 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_sm_sentry_policies_assignments
+short_description: Resource module for organizations _sm _sentry _policies _assignments
+description:
+- Manage operation update of the resource organizations _sm _sentry _policies _assignments.
+- >
+ Update an Organizations Sentry Policies using the provided list. Sentry Policies are ordered in descending order
+ of priority i.e. Highest priority at the bottom, this is opposite the Dashboard UI. Policies not present in the
+ request will be deleted.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module
+author: Francisco Munoz (@fmunoz)
+options:
+ items:
+ description: Sentry Group Policies for the Organization keyed by Network Id.
+ elements: dict
+ suboptions:
+ networkId:
+ description: The Id of the Network.
+ type: str
+ policies:
+ description: Array of Sentry Group Policies for the Network.
+ elements: dict
+ suboptions:
+ groupPolicyId:
+ description: The Group Policy Id.
+ type: str
+ policyId:
+ description: The Sentry Policy Id, if updating an existing Sentry Policy.
+ type: str
+ scope:
+ description: The scope of the Sentry Policy.
+ type: str
+ smNetworkId:
+ description: The Id of the Systems Manager Network.
+ type: str
+ tags:
+ description: The tags for the Sentry Policy.
+ elements: str
+ type: list
+ type: list
+ type: list
+ organizationId:
+ description: OrganizationId path parameter. Organization ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm updateOrganizationSmSentryPoliciesAssignments
+ description: Complete reference of the updateOrganizationSmSentryPoliciesAssignments API.
+ link: https://developer.cisco.com/meraki/api-v1/#!update-organization-sm-sentry-policies-assignments
+notes:
+ - SDK Method used are
+ sm.Sm.update_organization_sm_sentry_policies_assignments,
+
+ - Paths used are
+ put /organizations/{organizationId}/sm/sentry/policies/assignments,
+"""
+
+EXAMPLES = r"""
+- name: Update all
+ cisco.meraki.organizations_sm_sentry_policies_assignments:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ items:
+ - networkId: N_24329156
+ policies:
+ - groupPolicyId: '1284392014819'
+ policyId: '1284392014819'
+ scope: withAny
+ smNetworkId: N_24329156
+ tags:
+ - tag1
+ - tag2
+ organizationId: string
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "items": [
+ {
+ "networkId": "string",
+ "policies": [
+ {
+ "createdAt": "string",
+ "groupNumber": "string",
+ "groupPolicyId": "string",
+ "lastUpdatedAt": "string",
+ "networkId": "string",
+ "policyId": "string",
+ "priority": "string",
+ "scope": "string",
+ "smNetworkId": "string",
+ "tags": [
+ "string"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments_by_network_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments_by_network_info.py
new file mode 100644
index 000000000..410810331
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_sentry_policies_assignments_by_network_info.py
@@ -0,0 +1,138 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_sm_sentry_policies_assignments_by_network_info
+short_description: Information module for organizations _sm _sentry _policies _assignments _bynetwork
+description:
+- Get all organizations _sm _sentry _policies _assignments _bynetwork.
+- List the Sentry Policies for an organization ordered in ascending order of priority.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 50.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Optional parameter to filter Sentry Policies by Network Id.
+ elements: str
+ type: list
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for sm getOrganizationSmSentryPoliciesAssignmentsByNetwork
+ description: Complete reference of the getOrganizationSmSentryPoliciesAssignmentsByNetwork API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-sm-sentry-policies-assignments-by-network
+notes:
+ - SDK Method used are
+ sm.Sm.get_organization_sm_sentry_policies_assignments_by_network,
+
+ - Paths used are
+ get /organizations/{organizationId}/sm/sentry/policies/assignments/byNetwork,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _sm _sentry _policies _assignments _bynetwork
+ cisco.meraki.organizations_sm_sentry_policies_assignments_by_network_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ networkIds: []
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "items": [
+ {
+ "networkId": "string",
+ "policies": [
+ {
+ "createdAt": "string",
+ "groupNumber": "string",
+ "groupPolicyId": "string",
+ "lastUpdatedAt": "string",
+ "networkId": "string",
+ "policyId": "string",
+ "priority": "string",
+ "scope": "string",
+ "smNetworkId": "string",
+ "tags": [
+ "string"
+ ]
+ }
+ ]
+ }
+ ],
+ "meta": {
+ "counts": {
+ "items": {
+ "remaining": 0,
+ "total": 0
+ }
+ }
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_vpp_accounts_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_vpp_accounts_info.py
index 04f2f337f..429e3c52e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_vpp_accounts_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_sm_vpp_accounts_info.py
@@ -109,7 +109,26 @@ meraki_response:
type: dict
sample: >
{
+ "allowedAdmins": "string",
+ "assignableNetworkIds": [
+ "string"
+ ],
+ "assignableNetworks": "string",
+ "contentToken": "string",
+ "email": "string",
"id": "string",
+ "lastForceSyncedAt": "string",
+ "lastSyncedAt": "string",
+ "name": "string",
+ "networkIdAdmins": "string",
+ "parsedToken": {
+ "expiresAt": "string",
+ "hashedToken": "string",
+ "orgName": "string"
+ },
+ "vppAccountId": "string",
+ "vppLocationId": "string",
+ "vppLocationName": "string",
"vppServiceToken": "string"
}
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp.py
index f64326118..2ada45f40 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp.py
@@ -87,8 +87,10 @@ EXAMPLES = r"""
- 123.123.123.1
v2cEnabled: false
v3AuthMode: SHA
+ v3AuthPass: password
v3Enabled: true
v3PrivMode: AES128
+ v3PrivPass: password
"""
RETURN = r"""
@@ -97,5 +99,17 @@ meraki_response:
returned: always
type: dict
sample: >
- {}
+ {
+ "hostname": "string",
+ "peerIps": [
+ "string"
+ ],
+ "port": 0,
+ "v2CommunityString": "string",
+ "v2cEnabled": true,
+ "v3AuthMode": "string",
+ "v3Enabled": true,
+ "v3PrivMode": "string",
+ "v3User": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp_info.py
index 4f3872a0b..9447c4c70 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_snmp_info.py
@@ -70,6 +70,18 @@ meraki_response:
description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
returned: always
type: dict
- sample:
- - {}
+ sample: >
+ {
+ "hostname": "string",
+ "peerIps": [
+ "string"
+ ],
+ "port": 0,
+ "v2CommunityString": "string",
+ "v2cEnabled": true,
+ "v3AuthMode": "string",
+ "v3Enabled": true,
+ "v3PrivMode": "string",
+ "v3User": "string"
+ }
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_appliances_by_utilization_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_appliances_by_utilization_info.py
index 94e1b796b..fef47ccfe 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_appliances_by_utilization_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_appliances_by_utilization_info.py
@@ -35,8 +35,8 @@ options:
description:
- >
Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
- not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
- default is 1 day.
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 25 minutes
+ and be less than or equal to 31 days. The default is 1 day.
type: float
requirements:
- meraki >= 2.4.9
@@ -92,14 +92,14 @@ meraki_response:
sample: >
[
{
+ "mac": "string",
+ "model": "string",
+ "name": "string",
"network": {
- "name": "string",
- "id": "string"
+ "id": "string",
+ "name": "string"
},
- "name": "string",
- "mac": "string",
"serial": "string",
- "model": "string",
"utilization": {
"average": {
"percentage": 0
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_by_usage_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_by_usage_info.py
index ad3ac8cfb..b45869091 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_by_usage_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_by_usage_info.py
@@ -35,8 +35,8 @@ options:
description:
- >
Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
- not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
- default is 1 day.
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 8 hours and
+ be less than or equal to 31 days. The default is 1 day.
type: float
requirements:
- meraki >= 2.4.9
@@ -92,18 +92,18 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "mac": "string",
"id": "string",
+ "mac": "string",
+ "name": "string",
"network": {
- "name": "string",
- "id": "string"
+ "id": "string",
+ "name": "string"
},
"usage": {
- "total": 0,
- "upstream": 0,
"downstream": 0,
- "percentage": 0
+ "percentage": 0,
+ "total": 0,
+ "upstream": 0
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py
index eefbae45c..35fc6500e 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_clients_manufacturers_by_usage_info.py
@@ -92,16 +92,16 @@ meraki_response:
sample: >
[
{
- "name": "string",
"clients": {
"counts": {
"total": 0
}
},
+ "name": "string",
"usage": {
+ "downstream": 0,
"total": 0,
- "upstream": 0,
- "downstream": 0
+ "upstream": 0
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_by_usage_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_by_usage_info.py
index 4268e26a3..1c470ebc3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_by_usage_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_by_usage_info.py
@@ -37,8 +37,8 @@ options:
description:
- >
Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
- not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
- default is 1 day.
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 8 hours and
+ be less than or equal to 31 days. The default is 1 day.
type: float
requirements:
- meraki >= 2.4.9
@@ -94,23 +94,23 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "model": "string",
- "serial": "string",
- "mac": "string",
- "productType": "string",
- "network": {
- "name": "string",
- "id": "string"
- },
- "usage": {
- "total": 0,
- "percentage": 0
- },
"clients": {
"counts": {
"total": 0
}
+ },
+ "mac": "string",
+ "model": "string",
+ "name": "string",
+ "network": {
+ "id": "string",
+ "name": "string"
+ },
+ "productType": "string",
+ "serial": "string",
+ "usage": {
+ "percentage": 0,
+ "total": 0
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_models_by_usage_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_models_by_usage_info.py
index e5b35838a..f60cbb438 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_models_by_usage_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_devices_models_by_usage_info.py
@@ -37,8 +37,8 @@ options:
description:
- >
Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
- not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
- default is 1 day.
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 8 hours and
+ be less than or equal to 31 days. The default is 1 day.
type: float
requirements:
- meraki >= 2.4.9
@@ -94,11 +94,11 @@ meraki_response:
sample: >
[
{
- "model": "string",
"count": 0,
+ "model": "string",
"usage": {
- "total": 0,
- "average": 0
+ "average": 0,
+ "total": 0
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_networks_by_status_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_networks_by_status_info.py
new file mode 100644
index 000000000..f5472c326
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_networks_by_status_info.py
@@ -0,0 +1,145 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_summary_top_networks_by_status_info
+short_description: Information module for organizations _summary _top _networks _bystatus
+description:
+- Get all organizations _summary _top _networks _bystatus.
+- >
+ List the client and status overview information for the networks in an organization. Usage is measured in
+ kilobytes and from the last seven days.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 5000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for organizations getOrganizationSummaryTopNetworksByStatus
+ description: Complete reference of the getOrganizationSummaryTopNetworksByStatus API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-summary-top-networks-by-status
+notes:
+ - SDK Method used are
+ organizations.Organizations.get_organization_summary_top_networks_by_status,
+
+ - Paths used are
+ get /organizations/{organizationId}/summary/top/networks/byStatus,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _summary _top _networks _bystatus
+ cisco.meraki.organizations_summary_top_networks_by_status_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "clients": {
+ "counts": {
+ "total": 0
+ },
+ "usage": {
+ "downstream": 0,
+ "upstream": 0
+ }
+ },
+ "devices": {
+ "byProductType": [
+ {
+ "productType": "string",
+ "url": "string"
+ }
+ ]
+ },
+ "name": "string",
+ "networkId": "string",
+ "productTypes": [
+ "string"
+ ],
+ "statuses": {
+ "byProductType": [
+ {
+ "counts": {
+ "alerting": 0,
+ "dormant": 0,
+ "offline": 0,
+ "online": 0
+ },
+ "productType": "string"
+ }
+ ],
+ "overall": "string"
+ },
+ "tags": [
+ "string"
+ ],
+ "url": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_ssids_by_usage_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_ssids_by_usage_info.py
index 7f1b29d4b..195cc9630 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_ssids_by_usage_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_ssids_by_usage_info.py
@@ -35,8 +35,8 @@ options:
description:
- >
Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
- not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
- default is 1 day.
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 8 hours and
+ be less than or equal to 31 days. The default is 1 day.
type: float
requirements:
- meraki >= 2.4.9
@@ -92,17 +92,17 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "usage": {
- "total": 0,
- "downstream": 0,
- "upstream": 0,
- "percentage": 0
- },
"clients": {
"counts": {
"total": 0
}
+ },
+ "name": "string",
+ "usage": {
+ "downstream": 0,
+ "percentage": 0,
+ "total": 0,
+ "upstream": 0
}
}
]
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py
index 9efaa85a5..dd3bd0fc3 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_summary_top_switches_by_energy_usage_info.py
@@ -35,8 +35,8 @@ options:
description:
- >
Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
- not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
- default is 1 day.
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 25 minutes
+ and be less than or equal to 31 days. The default is 1 day.
type: float
requirements:
- meraki >= 2.4.9
@@ -92,13 +92,13 @@ meraki_response:
sample: >
[
{
- "network": {
- "name": "string",
- "id": "string"
- },
- "name": "string",
"mac": "string",
"model": "string",
+ "name": "string",
+ "network": {
+ "id": "string",
+ "name": "string"
+ },
"usage": {
"total": 0
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_switch_ports_by_switch_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_switch_ports_by_switch_info.py
index 067ebd9de..c77f52f84 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_switch_ports_by_switch_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_switch_ports_by_switch_info.py
@@ -154,37 +154,37 @@ meraki_response:
sample: >
[
{
- "name": "string",
- "serial": "string",
"mac": "string",
+ "model": "string",
+ "name": "string",
"network": {
- "name": "string",
- "id": "string"
+ "id": "string",
+ "name": "string"
},
- "model": "string",
"ports": [
{
- "portId": "string",
- "name": "string",
- "tags": [
- "string"
- ],
+ "accessPolicyType": "string",
+ "allowedVlans": "string",
"enabled": true,
+ "linkNegotiation": "string",
+ "name": "string",
"poeEnabled": true,
- "type": "string",
- "vlan": 0,
- "voiceVlan": 0,
- "allowedVlans": "string",
+ "portId": "string",
"rstpEnabled": true,
- "stpGuard": "string",
- "linkNegotiation": "string",
- "accessPolicyType": "string",
"stickyMacAllowList": [
"string"
],
- "stickyMacAllowListLimit": 0
+ "stickyMacAllowListLimit": 0,
+ "stpGuard": "string",
+ "tags": [
+ "string"
+ ],
+ "type": "string",
+ "vlan": 0,
+ "voiceVlan": 0
}
- ]
+ ],
+ "serial": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_uplinks_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_uplinks_statuses_info.py
index c29419b36..76b8f10f1 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_uplinks_statuses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_uplinks_statuses_info.py
@@ -120,31 +120,35 @@ meraki_response:
sample: >
[
{
+ "highAvailability": {
+ "enabled": true,
+ "role": "string"
+ },
+ "lastReportedAt": "string",
+ "model": "string",
"networkId": "string",
"serial": "string",
- "model": "string",
- "lastReportedAt": "string",
"uplinks": [
{
+ "apn": "string",
+ "connectionType": "string",
+ "dns1": "string",
+ "dns2": "string",
+ "gateway": "string",
+ "iccid": "string",
"interface": "string",
- "status": "string",
"ip": "string",
- "gateway": "string",
- "publicIp": "string",
- "primaryDns": "string",
- "secondaryDns": "string",
"ipAssignedBy": "string",
+ "primaryDns": "string",
"provider": "string",
+ "publicIp": "string",
+ "secondaryDns": "string",
"signalStat": {
"rsrp": "string",
"rsrq": "string"
},
- "connectionType": "string",
- "apn": "string",
- "dns1": "string",
- "dns2": "string",
"signalType": "string",
- "iccid": "string"
+ "status": "string"
}
]
}
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_callbacks_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_callbacks_statuses_info.py
new file mode 100644
index 000000000..77e6b7daf
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_webhooks_callbacks_statuses_info.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_webhooks_callbacks_statuses_info
+short_description: Information module for organizations _webhooks _callbacks _statuses
+description:
+- Get organizations _webhooks _callbacks _statuses by id.
+- Return the status of an API callback.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ callbackId:
+ description:
+ - CallbackId path parameter. Callback ID.
+ type: str
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for organizations getOrganizationWebhooksCallbacksStatus
+ description: Complete reference of the getOrganizationWebhooksCallbacksStatus API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-webhooks-callbacks-status
+notes:
+ - SDK Method used are
+ organizations.Organizations.get_organization_webhooks_callbacks_status,
+
+ - Paths used are
+ get /organizations/{organizationId}/webhooks/callbacks/statuses/{callbackId},
+"""
+
+EXAMPLES = r"""
+- name: Get organizations _webhooks _callbacks _statuses by id
+ cisco.meraki.organizations_webhooks_callbacks_statuses_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ organizationId: string
+ callbackId: string
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: dict
+ sample: >
+ {
+ "callbackId": "string",
+ "createdBy": {
+ "adminId": "string"
+ },
+ "errors": [
+ "string"
+ ],
+ "status": "string",
+ "webhook": {
+ "httpServer": {
+ "id": "string"
+ },
+ "payloadTemplate": {
+ "id": "string"
+ },
+ "sentAt": "string",
+ "url": "string"
+ }
+ }
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_device_info.py
new file mode 100644
index 000000000..3fab27fe7
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_device_info.py
@@ -0,0 +1,159 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_wireless_devices_channel_utilization_by_device_info
+short_description: Information module for organizations _wireless _devices _channelutilization _bydevice
+description:
+- Get all organizations _wireless _devices _channelutilization _bydevice.
+- Get average channel utilization for all bands in a network, split by AP.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Filter results by network.
+ elements: str
+ type: list
+ serials:
+ description:
+ - Serials query parameter. Filter results by device.
+ elements: str
+ type: list
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 90 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 90 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 90 days. The
+ default is 7 days.
+ type: float
+ interval:
+ description:
+ - >
+ Interval query parameter. The time interval in seconds for returned data. The valid intervals are 300, 600,
+ 3600, 7200, 14400, 21600. The default is 3600.
+ type: int
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getOrganizationWirelessDevicesChannelUtilizationByDevice
+ description: Complete reference of the getOrganizationWirelessDevicesChannelUtilizationByDevice API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-channel-utilization-by-device
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_organization_wireless_devices_channel_utilization_by_device,
+
+ - Paths used are
+ get /organizations/{organizationId}/wireless/devices/channelUtilization/byDevice,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _wireless _devices _channelutilization _bydevice
+ cisco.meraki.organizations_wireless_devices_channel_utilization_by_device_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds: []
+ serials: []
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ interval: 0
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "byBand": [
+ {
+ "band": "string",
+ "nonWifi": {
+ "percentage": 0
+ },
+ "total": {
+ "percentage": 0
+ },
+ "wifi": {
+ "percentage": 0
+ }
+ }
+ ],
+ "mac": "string",
+ "network": {
+ "id": "string"
+ },
+ "serial": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_network_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_network_info.py
new file mode 100644
index 000000000..b1aadc091
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_by_network_info.py
@@ -0,0 +1,157 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_wireless_devices_channel_utilization_by_network_info
+short_description: Information module for organizations _wireless _devices _channelutilization _bynetwork
+description:
+- Get all organizations _wireless _devices _channelutilization _bynetwork.
+- Get average channel utilization across all bands for all networks in the organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Filter results by network.
+ elements: str
+ type: list
+ serials:
+ description:
+ - Serials query parameter. Filter results by device.
+ elements: str
+ type: list
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 90 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 90 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 90 days. The
+ default is 7 days.
+ type: float
+ interval:
+ description:
+ - >
+ Interval query parameter. The time interval in seconds for returned data. The valid intervals are 300, 600,
+ 3600, 7200, 14400, 21600. The default is 3600.
+ type: int
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getOrganizationWirelessDevicesChannelUtilizationByNetwork
+ description: Complete reference of the getOrganizationWirelessDevicesChannelUtilizationByNetwork API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-channel-utilization-by-network
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_organization_wireless_devices_channel_utilization_by_network,
+
+ - Paths used are
+ get /organizations/{organizationId}/wireless/devices/channelUtilization/byNetwork,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _wireless _devices _channelutilization _bynetwork
+ cisco.meraki.organizations_wireless_devices_channel_utilization_by_network_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds: []
+ serials: []
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ interval: 0
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "byBand": [
+ {
+ "band": "string",
+ "nonWifi": {
+ "percentage": 0
+ },
+ "total": {
+ "percentage": 0
+ },
+ "wifi": {
+ "percentage": 0
+ }
+ }
+ ],
+ "network": {
+ "id": "string"
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
new file mode 100644
index 000000000..95a0a6017
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info.py
@@ -0,0 +1,161 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info
+short_description: Information module for organizations _wireless _devices _channelutilization _history _bydevice _byinterval
+description:
+- Get all organizations _wireless _devices _channelutilization _history _bydevice _byinterval.
+- Get a time-series of average channel utilization for all bands, segmented by device.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Filter results by network.
+ elements: str
+ type: list
+ serials:
+ description:
+ - Serials query parameter. Filter results by device.
+ elements: str
+ type: list
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 31 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 31 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
+ default is 7 days.
+ type: float
+ interval:
+ description:
+ - >
+ Interval query parameter. The time interval in seconds for returned data. The valid intervals are 300, 600,
+ 3600, 7200, 14400, 21600. The default is 3600.
+ type: int
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getOrganizationWirelessDevicesChannelUtilizationHistoryByDeviceByInterval
+ description: Complete reference of the getOrganizationWirelessDevicesChannelUtilizationHistoryByDeviceByInterval API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-channel-utilization-history-by-device-by-interval
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_organization_wireless_devices_channel_utilization_history_by_device_by_interval,
+
+ - Paths used are
+ get /organizations/{organizationId}/wireless/devices/channelUtilization/history/byDevice/byInterval,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _wireless _devices _channelutilization _history _bydevice _byinterval
+ cisco.meraki.organizations_wireless_devices_channel_utilization_history_by_device_by_interval_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds: []
+ serials: []
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ interval: 0
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "byBand": [
+ {
+ "band": "string",
+ "nonWifi": {
+ "percentage": 0
+ },
+ "total": {
+ "percentage": 0
+ },
+ "wifi": {
+ "percentage": 0
+ }
+ }
+ ],
+ "endTs": "string",
+ "mac": "string",
+ "network": {
+ "id": "string"
+ },
+ "serial": "string",
+ "startTs": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
new file mode 100644
index 000000000..df831db78
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info.py
@@ -0,0 +1,159 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info
+short_description: Information module for organizations _wireless _devices _channelutilization _history _bynetwork _byinterval
+description:
+- Get all organizations _wireless _devices _channelutilization _history _bynetwork _byinterval.
+- Get a time-series of average channel utilization for all bands.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Filter results by network.
+ elements: str
+ type: list
+ serials:
+ description:
+ - Serials query parameter. Filter results by device.
+ elements: str
+ type: list
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 31 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 31 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The
+ default is 7 days.
+ type: float
+ interval:
+ description:
+ - >
+ Interval query parameter. The time interval in seconds for returned data. The valid intervals are 300, 600,
+ 3600, 7200, 14400, 21600. The default is 3600.
+ type: int
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getOrganizationWirelessDevicesChannelUtilizationHistoryByNetworkByInterval
+ description: Complete reference of the getOrganizationWirelessDevicesChannelUtilizationHistoryByNetworkByInterval API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-channel-utilization-history-by-network-by-interval
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_organization_wireless_devices_channel_utilization_history_by_network_by_interval,
+
+ - Paths used are
+ get /organizations/{organizationId}/wireless/devices/channelUtilization/history/byNetwork/byInterval,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _wireless _devices _channelutilization _history _bynetwork _byinterval
+ cisco.meraki.organizations_wireless_devices_channel_utilization_history_by_network_by_interval_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds: []
+ serials: []
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ interval: 0
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "byBand": [
+ {
+ "band": "string",
+ "nonWifi": {
+ "percentage": 0
+ },
+ "total": {
+ "percentage": 0
+ },
+ "wifi": {
+ "percentage": 0
+ }
+ }
+ ],
+ "endTs": "string",
+ "network": {
+ "id": "string"
+ },
+ "startTs": "string"
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py
index d8a5c190c..0eaad0bcb 100644
--- a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_ethernet_statuses_info.py
@@ -10,7 +10,9 @@ module: organizations_wireless_devices_ethernet_statuses_info
short_description: Information module for organizations _wireless _devices _ethernet _statuses
description:
- Get all organizations _wireless _devices _ethernet _statuses.
-- Endpoint to see power status for wireless devices.
+- >
+ List the most recent Ethernet link speed, duplex, aggregation and power mode and status information for wireless
+ devices.
version_added: '2.16.0'
extends_documentation_fragment:
- cisco.meraki.module_info
@@ -106,36 +108,36 @@ meraki_response:
sample: >
[
{
- "serial": "string",
+ "aggregation": {
+ "enabled": true,
+ "speed": 0
+ },
"name": "string",
"network": {
"id": "string"
},
- "power": {
- "mode": "string",
- "ac": {
- "isConnected": true
- },
- "poe": {
- "isConnected": true
- }
- },
"ports": [
{
- "name": "string",
- "poe": {
- "standard": "string"
- },
"linkNegotiation": {
"duplex": "string",
"speed": 0
+ },
+ "name": "string",
+ "poe": {
+ "standard": "string"
}
}
],
- "aggregation": {
- "enabled": true,
- "speed": 0
- }
+ "power": {
+ "ac": {
+ "isConnected": true
+ },
+ "mode": "string",
+ "poe": {
+ "isConnected": true
+ }
+ },
+ "serial": "string"
}
]
"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_client_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_client_info.py
new file mode 100644
index 000000000..b28ea787d
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_client_info.py
@@ -0,0 +1,163 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_wireless_devices_packet_loss_by_client_info
+short_description: Information module for organizations _wireless _devices _packetloss _byclient
+description:
+- Get all organizations _wireless _devices _packetloss _byclient.
+- Get average packet loss for the given timespan for all clients in the organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Filter results by network.
+ elements: str
+ type: list
+ ssids:
+ description:
+ - Ssids query parameter. Filter results by SSID number.
+ elements: int
+ type: list
+ bands:
+ description:
+ - Bands query parameter. Filter results by band. Valid bands are 2.4, 5, and 6.
+ elements: str
+ type: list
+ macs:
+ description:
+ - Macs query parameter. Filter results by client mac address(es).
+ elements: str
+ type: list
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 90 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 90 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 5 minutes and
+ be less than or equal to 90 days. The default is 7 days.
+ type: float
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getOrganizationWirelessDevicesPacketLossByClient
+ description: Complete reference of the getOrganizationWirelessDevicesPacketLossByClient API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-packet-loss-by-client
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_organization_wireless_devices_packet_loss_by_client,
+
+ - Paths used are
+ get /organizations/{organizationId}/wireless/devices/packetLoss/byClient,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _wireless _devices _packetloss _byclient
+ cisco.meraki.organizations_wireless_devices_packet_loss_by_client_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds: []
+ ssids: []
+ bands: []
+ macs: []
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "client": {
+ "id": "string",
+ "mac": "string"
+ },
+ "downstream": {
+ "lossPercentage": 0,
+ "lost": 0,
+ "total": 0
+ },
+ "network": {
+ "id": "string",
+ "name": "string"
+ },
+ "upstream": {
+ "lossPercentage": 0,
+ "lost": 0,
+ "total": 0
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_device_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_device_info.py
new file mode 100644
index 000000000..038681e15
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_device_info.py
@@ -0,0 +1,166 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_wireless_devices_packet_loss_by_device_info
+short_description: Information module for organizations _wireless _devices _packetloss _bydevice
+description:
+- Get all organizations _wireless _devices _packetloss _bydevice.
+- >
+ Get average packet loss for the given timespan for all devices in the organization. Does not include device's own
+ traffic.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Filter results by network.
+ elements: str
+ type: list
+ serials:
+ description:
+ - Serials query parameter. Filter results by device.
+ elements: str
+ type: list
+ ssids:
+ description:
+ - Ssids query parameter. Filter results by SSID number.
+ elements: int
+ type: list
+ bands:
+ description:
+ - Bands query parameter. Filter results by band. Valid bands are 2.4, 5, and 6.
+ elements: str
+ type: list
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 90 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 90 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 5 minutes and
+ be less than or equal to 90 days. The default is 7 days.
+ type: float
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getOrganizationWirelessDevicesPacketLossByDevice
+ description: Complete reference of the getOrganizationWirelessDevicesPacketLossByDevice API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-packet-loss-by-device
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_organization_wireless_devices_packet_loss_by_device,
+
+ - Paths used are
+ get /organizations/{organizationId}/wireless/devices/packetLoss/byDevice,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _wireless _devices _packetloss _bydevice
+ cisco.meraki.organizations_wireless_devices_packet_loss_by_device_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds: []
+ serials: []
+ ssids: []
+ bands: []
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "device": {
+ "mac": "string",
+ "name": "string",
+ "serial": "string"
+ },
+ "downstream": {
+ "lossPercentage": 0,
+ "lost": 0,
+ "total": 0
+ },
+ "network": {
+ "id": "string",
+ "name": "string"
+ },
+ "upstream": {
+ "lossPercentage": 0,
+ "lost": 0,
+ "total": 0
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_network_info.py b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_network_info.py
new file mode 100644
index 000000000..d4c7c41b8
--- /dev/null
+++ b/ansible_collections/cisco/meraki/plugins/modules/organizations_wireless_devices_packet_loss_by_network_info.py
@@ -0,0 +1,159 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021, Cisco Systems
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: organizations_wireless_devices_packet_loss_by_network_info
+short_description: Information module for organizations _wireless _devices _packetloss _bynetwork
+description:
+- Get all organizations _wireless _devices _packetloss _bynetwork.
+- Get average packet loss for the given timespan for all networks in the organization.
+version_added: '2.18.0'
+extends_documentation_fragment:
+ - cisco.meraki.module_info
+ - cisco.meraki.module_info_pagination
+author: Francisco Munoz (@fmunoz)
+options:
+ headers:
+ description: Additional headers.
+ type: dict
+ organizationId:
+ description:
+ - OrganizationId path parameter. Organization ID.
+ type: str
+ networkIds:
+ description:
+ - NetworkIds query parameter. Filter results by network.
+ elements: str
+ type: list
+ serials:
+ description:
+ - Serials query parameter. Filter results by device.
+ elements: str
+ type: list
+ ssids:
+ description:
+ - Ssids query parameter. Filter results by SSID number.
+ elements: int
+ type: list
+ bands:
+ description:
+ - Bands query parameter. Filter results by band. Valid bands are 2.4, 5, and 6.
+ elements: str
+ type: list
+ perPage:
+ description:
+ - PerPage query parameter. The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ type: int
+ startingAfter:
+ description:
+ - >
+ StartingAfter query parameter. A token used by the server to indicate the start of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ endingBefore:
+ description:
+ - >
+ EndingBefore query parameter. A token used by the server to indicate the end of the page. Often this is a
+ timestamp or an ID but it is not limited to those. This parameter should not be defined by client
+ applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ type: str
+ t0:
+ description:
+ - T0 query parameter. The beginning of the timespan for the data. The maximum lookback period is 90 days from today.
+ type: str
+ t1:
+ description:
+ - T1 query parameter. The end of the timespan for the data. T1 can be a maximum of 90 days after t0.
+ type: str
+ timespan:
+ description:
+ - >
+ Timespan query parameter. The timespan for which the information will be fetched. If specifying timespan, do
+ not specify parameters t0 and t1. The value must be in seconds and be greater than or equal to 5 minutes and
+ be less than or equal to 90 days. The default is 7 days.
+ type: float
+requirements:
+- meraki >= 2.4.9
+- python >= 3.5
+seealso:
+- name: Cisco Meraki documentation for wireless getOrganizationWirelessDevicesPacketLossByNetwork
+ description: Complete reference of the getOrganizationWirelessDevicesPacketLossByNetwork API.
+ link: https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-packet-loss-by-network
+notes:
+ - SDK Method used are
+ wireless.Wireless.get_organization_wireless_devices_packet_loss_by_network,
+
+ - Paths used are
+ get /organizations/{organizationId}/wireless/devices/packetLoss/byNetwork,
+"""
+
+EXAMPLES = r"""
+- name: Get all organizations _wireless _devices _packetloss _bynetwork
+ cisco.meraki.organizations_wireless_devices_packet_loss_by_network_info:
+ meraki_api_key: "{{meraki_api_key}}"
+ meraki_base_url: "{{meraki_base_url}}"
+ meraki_single_request_timeout: "{{meraki_single_request_timeout}}"
+ meraki_certificate_path: "{{meraki_certificate_path}}"
+ meraki_requests_proxy: "{{meraki_requests_proxy}}"
+ meraki_wait_on_rate_limit: "{{meraki_wait_on_rate_limit}}"
+ meraki_nginx_429_retry_wait_time: "{{meraki_nginx_429_retry_wait_time}}"
+ meraki_action_batch_retry_wait_time: "{{meraki_action_batch_retry_wait_time}}"
+ meraki_retry_4xx_error: "{{meraki_retry_4xx_error}}"
+ meraki_retry_4xx_error_wait_time: "{{meraki_retry_4xx_error_wait_time}}"
+ meraki_maximum_retries: "{{meraki_maximum_retries}}"
+ meraki_output_log: "{{meraki_output_log}}"
+ meraki_log_file_prefix: "{{meraki_log_file_prefix}}"
+ meraki_log_path: "{{meraki_log_path}}"
+ meraki_print_console: "{{meraki_print_console}}"
+ meraki_suppress_logging: "{{meraki_suppress_logging}}"
+ meraki_simulate: "{{meraki_simulate}}"
+ meraki_be_geo_id: "{{meraki_be_geo_id}}"
+ meraki_use_iterator_for_get_pages: "{{meraki_use_iterator_for_get_pages}}"
+ meraki_inherit_logging_config: "{{meraki_inherit_logging_config}}"
+ networkIds: []
+ serials: []
+ ssids: []
+ bands: []
+ perPage: 0
+ startingAfter: string
+ endingBefore: string
+ t0: string
+ t1: string
+ timespan: 0
+ organizationId: string
+ total_pages: -1
+ direction: next
+ register: result
+
+"""
+RETURN = r"""
+meraki_response:
+ description: A dictionary or list with the response returned by the Cisco Meraki Python SDK
+ returned: always
+ type: list
+ elements: dict
+ sample: >
+ [
+ {
+ "downstream": {
+ "lossPercentage": 0,
+ "lost": 0,
+ "total": 0
+ },
+ "network": {
+ "id": "string",
+ "name": "string"
+ },
+ "upstream": {
+ "lossPercentage": 0,
+ "lost": 0,
+ "total": 0
+ }
+ }
+ ]
+"""
diff --git a/ansible_collections/cisco/mso/.github/workflows/ansible-test.yml b/ansible_collections/cisco/mso/.github/workflows/ansible-test.yml
index 08ed31bba..0696792f8 100644
--- a/ansible_collections/cisco/mso/.github/workflows/ansible-test.yml
+++ b/ansible_collections/cisco/mso/.github/workflows/ansible-test.yml
@@ -7,7 +7,7 @@ on:
# * is a special character in YAML so you have to quote this string
- cron: '0 7 * * *'
env:
- python_version: 3.9
+ python_version: '3.10'
jobs:
build:
name: Build collection
@@ -15,7 +15,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- ansible: [v2.9.27, v2.10.17, v2.11.12, v2.12.10, stable-2.13, stable-2.14]
+ ansible: [v2.14.13, v2.15.8, v2.16.2, stable-2.16]
steps:
- name: Check out code
uses: actions/checkout@v3
@@ -65,8 +65,8 @@ jobs:
with:
python-version: ${{ env.python_version }}
- - name: Install ansible-base (stable-2.14)
- run: pip install https://github.com/ansible/ansible/archive/stable-2.14.tar.gz --disable-pip-version-check
+ - name: Install ansible-base (v2.15.8)
+ run: pip install https://github.com/ansible/ansible/archive/v2.15.8.tar.gz --disable-pip-version-check
- name: Download migrated collection artifacts
uses: actions/download-artifact@v3
@@ -107,7 +107,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- ansible: [v2.9.27, v2.10.17, v2.11.12, v2.12.10, stable-2.13, stable-2.14]
+ ansible: [v2.14.13, v2.15.8, v2.16.2, stable-2.16]
steps:
- name: Set up Python ${{ env.python_version }}
uses: actions/setup-python@v4
@@ -129,6 +129,9 @@ jobs:
- name: Install the collection tarball
run: ansible-galaxy collection install .cache/collection-tarballs/*.tar.gz
+ - name: Install the ND collection (NDO dependency)
+ run: ansible-galaxy collection install cisco.nd
+
- name: Run sanity tests
run: ansible-test sanity --docker -v --color --truncate 0 --coverage
working-directory: /home/runner/.ansible/collections/ansible_collections/cisco/mso
@@ -149,11 +152,8 @@ jobs:
strategy:
fail-fast: false
matrix:
- ansible: [v2.10.17, v2.11.12, v2.12.10, stable-2.13, stable-2.14]
- python-version: [3.9]
- include:
- - ansible: v2.9.27
- python-version: 3.8
+ ansible: [v2.14.13, v2.15.8, v2.16.2, stable-2.16]
+ python-version: ['3.10']
steps:
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
@@ -198,8 +198,8 @@ jobs:
with:
python-version: ${{ env.python_version }}
- - name: Install ansible-base (stable-2.13)
- run: pip install https://github.com/ansible/ansible/archive/stable-2.13.tar.gz --disable-pip-version-check
+ - name: Install ansible-base (v2.15.8)
+ run: pip install https://github.com/ansible/ansible/archive/v2.15.8.tar.gz --disable-pip-version-check
- name: Install coverage (v4.5.4)
run: pip install coverage==4.5.4
diff --git a/ansible_collections/cisco/mso/.github/workflows/galaxy-importer.cfg b/ansible_collections/cisco/mso/.github/workflows/galaxy-importer.cfg
index 631359cf4..7208e7c1e 100644
--- a/ansible_collections/cisco/mso/.github/workflows/galaxy-importer.cfg
+++ b/ansible_collections/cisco/mso/.github/workflows/galaxy-importer.cfg
@@ -1,6 +1,6 @@
[galaxy-importer]
LOG_LEVEL_MAIN = INFO
-RUN_FLAKE8 = True
+RUN_FLAKE8 = False
RUN_ANSIBLE_DOC = True
RUN_ANSIBLE_LINT = True
RUN_ANSIBLE_TEST = False
diff --git a/ansible_collections/cisco/mso/CHANGELOG.rst b/ansible_collections/cisco/mso/CHANGELOG.rst
index 56fdfe5ee..689f7dba9 100644
--- a/ansible_collections/cisco/mso/CHANGELOG.rst
+++ b/ansible_collections/cisco/mso/CHANGELOG.rst
@@ -6,6 +6,37 @@ Cisco MSO Ansible Collection Release Notes
This changelog describes changes after version 0.0.4.
+v2.6.0
+======
+
+Release Summary
+---------------
+
+Release v2.6.0 of the ``ansible-mso`` collection on 2024-04-06.
+This changelog describes all changes made to the modules and plugins included in this collection since v2.5.0.
+
+
+Minor Changes
+-------------
+
+- Add Azure Cloud site support to mso_schema_site_contract_service_graph
+- Add Azure Cloud site support to mso_schema_site_service_graph
+- Add functionality to resolve same name in remote and local user.
+- Add l3out_template and l3out_schema arguments to mso_schema_site_external_epg (#394)
+- Add mso_schema_site_contract_service_graph module to manage site contract service graph
+- Add mso_schema_site_contract_service_graph_listener module to manage Azure site contract service graph listeners and update other modules
+- Add new parameter remote_user to add multiple remote users associated with multiple login domains
+- Add support for replacing all existing contracts with new provided contracts in a single operation with one request and adding/removing multiple contracts in multiple operations with a single request in mso_schema_template_anp_epg_contract module
+- Add support for replacing all existing static ports with new provided static ports in a single operation with one request and adding/removing multiple static ports in multiple operations with a single request in mso_schema_template_anp_epg_staticport module
+- Add support for required attributes introduced in NDO 4.2 for mso_schema_site_anp_epg_domain
+- Support for creation of schemas without templates with the mso_schema module
+
+Bugfixes
+--------
+
+- Fix TypeError for iteration on NoneType in mso_schema_template
+- Fixed the useg_subnet logic in mso_schema_template_anp_epg_useg_attribute
+
v2.5.0
======
diff --git a/ansible_collections/cisco/mso/FILES.json b/ansible_collections/cisco/mso/FILES.json
index b721a6242..e842a93b4 100644
--- a/ansible_collections/cisco/mso/FILES.json
+++ b/ansible_collections/cisco/mso/FILES.json
@@ -88,21 +88,21 @@
"name": "plugins/module_utils/mso.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "365ed0c9e88643e9282f6ed37ecb70438c0a8a8bca6140c23d394c57e40cd8e9",
+ "chksum_sha256": "efdfdb481900e55e4e343ebc46d9959b307d188bc7331bbe2f5ffc34f334314b",
"format": 1
},
{
"name": "plugins/module_utils/constants.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f1ef5582a8aadb1f63c9764a1569c37f35c4f3771362645e2c1d37893ad0b58",
+ "chksum_sha256": "b17782b7585f2093de4cd7bed8ce8ecc0ece53418ac229eec7bdf9e6133fa903",
"format": 1
},
{
"name": "plugins/module_utils/schema.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "666a8b807cc281fb6b20571e8181356150b540b310538dae977fb34c98b065f2",
+ "chksum_sha256": "e28a7319c7a1620ab5d49b24399439b2e5925fd5676b382214d1ef36f4d80637",
"format": 1
},
{
@@ -116,476 +116,490 @@
"name": "plugins/modules/mso_schema_template_contract_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f1cd0ad89ea16105dedec1ee73865c3039c0d440f51835c01bea909088200e1",
+ "chksum_sha256": "529de4ee2f32adab3f4de2228c79c6ebaf555d2f37e4e6fb2373afb50369c583",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_anp_epg_useg_attribute.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8ed6ceddad626de74e9a017e479c2a9668c8e460c705611958b0e810ea03654f",
+ "chksum_sha256": "b072d717a7c11f9144338428cc6b0298a62eb25d5204c3997c0021ff6156661d",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg_staticport.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "24c0bbb68eddf4b2dbd1920ad0dbb8f487318ed2897467c4b357878ba4a27313",
+ "chksum_sha256": "d426b1f4358a4a15936cdae01a5642a24471b0c352dbc36c0e5d2ae517620bc8",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "53b683bfe3797188a7114b2f7fd32c80f20c82ab75af2cbb52c65ef86ab34b6c",
+ "chksum_sha256": "c84cdd70071fb6d1b9fcc031ea40d0123acc96e317f65e240b02d747b169ac14",
"format": 1
},
{
"name": "plugins/modules/mso_dhcp_option_policy_option.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1d2486a946afc26f3bb7b7a8797670747848c844b9109f1782564a2ded687a1a",
+ "chksum_sha256": "eda5f9f0fc62e4bd96240718661c418432d06c8779b7beeabe2c08e91f4682c8",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_vrf_region_hub_network.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7a43523bd0dc4cfffe22440d971b3f89e85d2d9e0a50aeb39389c3c2830c4bd9",
+ "chksum_sha256": "0e46ba971fc360ce3aac486f5052d9114b370550a9696789e4abf8490db597d9",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_clone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "467bbd942d0e26497d51bb70c33338eb07079e4743700c1c256e7e2e4c5aa4ca",
+ "chksum_sha256": "fd6f1dd1edaf676366762f1d11c8d9d12cd3135f2175c28ebe126c1c815195ee",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_external_epg_selector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4363f0f76203e827914ee92e71976ddd77281b00a132e0ac3ead2b92afd00674",
+ "chksum_sha256": "710a8ea56534dfc6543988d277d0437a440fb2a941fd0d4c5f74ab08ae95be61",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b0ee7e4bcb554da6cd227ebb70187b63d1bcccd68b1dcd7bc7e18c785b942b5",
+ "chksum_sha256": "f6d7cc46a952c866b799726f06715fa28636628c6d30c7f257cca90e3d7a413a",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_bd_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "548b14f399f547ccfefc18346676a0e24cce3a7826557e8988d6a392813b138f",
+ "chksum_sha256": "c188f403fd34b45bc3fa87a4f52454f5c363b9e9e421549fa39c5c90d7666109",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_anp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "563af9420bd43908af689c4f8931a4ea5ce461008e08d45ac0ba1578d398388a",
+ "chksum_sha256": "b879cf3ed34dfdf45150bae5b96f94bd93846cc8ca414433c88b4e34503ba817",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_bd_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a57db7b1e169ac4cd985f8c754ccf15df5654b7527cc5234b3980fcd83ab3ec9",
+ "chksum_sha256": "f47b8cf5a99acd4c7d3db34263795304c160dc7afa7f537b02cdad0b2e1653ec",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_service_graph.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f61b1039f2822f8e5bc0d520e429821f67b220847a66553d7a2424680ff89c7e",
+ "chksum_sha256": "ec3b6d065bdd34f47f246bdd40edbebe1769f1115582bb85c637119d70fcc22a",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_deploy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4675f4f2242f139b0198e240e39bc0033d7807dcde46b4e5fe5cce4ab00f7a43",
+ "chksum_sha256": "9c30233ef80f83701478bfd2eab63858b92b27e24266428b2cc32b82fd7a515b",
"format": 1
},
{
"name": "plugins/modules/mso_tenant.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f6cfabf979e75755aba9b5de7485a55512bb02d1083d7c0afa97aadf6bfde44b",
+ "chksum_sha256": "ddfd5dcc9a0e553e02dc97a7aedd16c990354064af942483064c8edd76ca9eb8",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_vrf_region_cidr_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb9d0be9896f46fa894f4ee2242683cba38141c1ad826aa7fc9720b4a752143b",
+ "chksum_sha256": "99317cd35700317aa573606354f2e76e980ee1a68c02cd890ee539c19e849e18",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_vrf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cfc09a18b5f1ddb2598e9bb69241f35b4c3a967f84f529266ce8b610400f3939",
+ "chksum_sha256": "8ba10a75ea0fe7dfad2666a8a2fe33e61c8a66a6164245d480be99d38cebeeec",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg_staticleaf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "517fe0774f3853668ba3fa20a27db581974292e6a068eeaeba266fd13e7a2130",
+ "chksum_sha256": "c13a222b63c1b22f2347e563a79462d484746ea729649fb826b5c9cdb66e95fa",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_contract_service_graph.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5f117924e42571f83fb0fd7e3006938d6c7a03535c2b9b1d0e8fef1187e9d43",
+ "chksum_sha256": "bd18ce347bdc3b3b6f50be09b814515fcd954d3b604e06e1a6e6da0dbf15d835",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_external_epg_contract.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1f977a4e86c0133551d4885a8f2e738be26ff169f84bf6e75eda627e2237e8ef",
+ "chksum_sha256": "0f114737538989c09d92a90a7fa080e9132b03510b0cb3c54b011208dd7005ac",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_external_epg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cca13445dac9275a27359ba8f7904208056934c22019553342a5bd81a5927541",
+ "chksum_sha256": "1bf80882445fbc6d3831bca7dcb7932f36bc228d96a1f07fe137a7fb816bc4a5",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_bd_dhcp_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ccc7584c47937ca7a2759f4bd83766d0589d5ecbf83fa2beb75683719e739458",
+ "chksum_sha256": "a345743ad69de49554b9d0b3d615a2f77818e666e6305196b54a1c08c937d8d5",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_vrf_region_cidr.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "537ea2679378ebab08599813a7e89de4866baed013c8816499f081b440b80c8b",
+ "chksum_sha256": "57dc635bc10d4adc1060b779b7bc0f754f43119e78479049f455f12f56c8d4dd",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_anp_epg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fbd12de54e5336dc265f43bf76c59215d9583c8e09d590ccfd63acd5e346f543",
+ "chksum_sha256": "d6af8d36a24da44c06da51d5e425733dd27908bcf35fc19184578f2301a50015",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_anp_epg_contract.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dac857729a99d0a1d6d778c94565ac54def3c1a548d949643288f3ae0d7ff047",
+ "chksum_sha256": "36b5e8d57b9c7cb39227a38b15f3ff28efe3219376d088571fc35c838f39989d",
"format": 1
},
{
"name": "plugins/modules/mso_dhcp_relay_policy_provider.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "39748852f207b8d1a2f0572c8204326bc70c16799e6d414c44d70562781d76f1",
+ "chksum_sha256": "ac154937e7da1fe34cf9d6b455a71fab03007cd90138b0a58b04bdcdca32a04d",
"format": 1
},
{
"name": "plugins/modules/mso_tenant_site.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "30b1ce3e3c94d3b6fb9c8de815b1b02eef9d2ef1b2add0d26057802a5d211f64",
+ "chksum_sha256": "4b05c8f8d0708d4df336e35ee21538426502acaa0c1ae5e06c9353864cd39462",
"format": 1
},
{
"name": "plugins/modules/mso_backup.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "023cdd8db111487656d214b5664691b2524b93b8792f6833cd6e44ff24d33775",
+ "chksum_sha256": "1f95a32e7b4b2ae490378510c0b54404b73eee95de3f91781f22e91a543c357b",
"format": 1
},
{
"name": "plugins/modules/mso_site.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2dc848085c68033f3b8ef93d4c82e7a4791074736507c69b5b7e630108e1494e",
+ "chksum_sha256": "9d4f94940cf21a0b359e4f4911fcadfa94effe6bfa076f50dd18a5f4d153d49d",
"format": 1
},
{
"name": "plugins/modules/mso_remote_location.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fbc21ccb26b9b6a4a206b218c24d05996917ad200160195ac5a3bd23ce2b10fa",
+ "chksum_sha256": "926198de94a92a491d433fb8fd784e6a23f7c879e93bd87dbaa9a550be358ddc",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg_selector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f759e142e699d3013a1a625563a0bf561ac7b1a78e6a0fb511ac952a68ef7ce0",
+ "chksum_sha256": "894a28da428a3556e45cc21a2a485a9c64707a3dd4783ae3acc1620f9942101a",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_vrf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "92bf0092c6f6e72ef1d5748b2316c368b99839ab172caea71668fa44ea2a08c8",
+ "chksum_sha256": "6869be92ec1ca7893432bf677004c4260290ac34105fe610f959ca95b48f0abd",
"format": 1
},
{
"name": "plugins/modules/mso_schema_clone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d72660f2a0bb86fd807259b2f4046ea75bc7775abd2659a1ad4301bbce3b5de4",
+ "chksum_sha256": "a530da97206a358b2413103b42a7a6cd39e84a3b1c2e40368b6d13f4bd276ab2",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg_useg_attribute.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e6cd229643ea78515528641359ee0dea24bbff6a6a7f76fe23f81c9abc02c430",
+ "chksum_sha256": "7130a3af0e55ab119c7312de18a10bbd519105f36e4861fdb84cc6ad657e6bf1",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_external_epg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c42b50d3217281fab3bdbdb63831973ffa0abb7b427059338b24ec9ead91111",
+ "chksum_sha256": "4bfc2da7b937871cdae2e7e5eda88651f1e67d4a3d4b69bb18b1158a3b3608aa",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg_bulk_staticport.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7fa1e1ba14119d99731281f5edb1c29e9a00ce8e9e68dc885c14f057e8611a5a",
+ "chksum_sha256": "45fda87759808362dfb03728aff531cf4f028762e7d92c67db48e4722d552c37",
"format": 1
},
{
"name": "plugins/modules/mso_schema.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb277796d3882cd5af04d61252d31d73bd6bcbbe37bd378169fb7e9b9ca17a1d",
+ "chksum_sha256": "1a8188eb77d54445999a9aaa8d7a7e1eebb6292f8343f0087c11fd0b2d8cc25a",
"format": 1
},
{
"name": "plugins/modules/mso_service_node_type.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8b2c340e2a19be2b2a3993555500a8a07254a4fd6bbd424f787c59e50ddadd3",
+ "chksum_sha256": "b4b4e9dfd8a3cd89b293a58b2ce9de07ab8c65697b78e629167b4a41b521f513",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_bd_l3out.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a673bd1f3b2be1b8e290b0aca6b71b784ee6dcbc3b7c83e6688a69b374ac3859",
+ "chksum_sha256": "0d35a6caae8642331852296992e6ed56d20e7928b3413734b305b2eb2d166ba9",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg_domain.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eea4baa850dee443f4763f8821171b7a9018ad32863fcc9419c711b794cbaeaf",
+ "chksum_sha256": "833dbacd5ea2b4222042ce18026a3b9e9e4cc2cbc68dd264686a9c9059211ab3",
"format": 1
},
{
"name": "plugins/modules/mso_role.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "676bb9102ab59c395bc74b1e7ae88188ec2d759d243b563dc6f7c40e7954fcc5",
+ "chksum_sha256": "358b270cd1c7990681926fc112f315c8bc8720ce0c3a26a5d24b70eeac3ed4bb",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_externalepg.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cca13445dac9275a27359ba8f7904208056934c22019553342a5bd81a5927541",
+ "chksum_sha256": "1bf80882445fbc6d3831bca7dcb7932f36bc228d96a1f07fe137a7fb816bc4a5",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_external_epg_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ce326dbc4882ff9fb12721721c84184dfee85c35a31f88eed7ea4f1ee15ce95f",
+ "chksum_sha256": "284f870b6411c6b74636ebc207c04fa11ef1e5b969436dd006634a72befeaca2",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_filter_entry.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0bcd5ec3532d03574c2116dd8235fb60fa23aa60212a8f2d1d8fb8cf54ae66f1",
+ "chksum_sha256": "7b0ac723395463cad198f322ab087095e4cafec8b1d3e7ccf32e58713b6527f6",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_service_graph.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1758c7b2153df304380c61c29c5861e83e6dbabc447bb738c474755128bc4c78",
+ "chksum_sha256": "e220243eb8c8e40767439e1e2bb003ecc36ccdafa2d4b2d73d43600c4ffa10fc",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_bd.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "efa09b8140a5e1deb8ad7ee81e32d610b75475bdb510d3118cac7928443b7700",
+ "chksum_sha256": "a51c3e49422be56b26dc10e6a0c509470f60e5a35c9132674d40e384488082c0",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_anp_epg_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9a255127f9740b65860e5106edb61c5265c31e841d104328324bffb109116450",
+ "chksum_sha256": "f9d6358f5afebbbfa87cbc90a3dfadc95086a46107b05dc6d7498d0a8d7d6188",
"format": 1
},
{
"name": "plugins/modules/mso_rest.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "716c55c4720e7717076cd4c94d6fd14696ff7bbc95f8e4638be9b6cd43eacf94",
+ "chksum_sha256": "a82ada771919fc6f779c93c58a1e2db2b25f057b9b2a6c9e89a7668125298c83",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_vrf_contract.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c4c30b7dbc29b7b17217bab52b48d9f2763266ee64f059dc91a193b7f713fb24",
+ "chksum_sha256": "40dfe9ede10d01034136f30593fb9a9cc53cd1a8cbbf00860e3ef628f2e1a45f",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/mso_schema_site_contract_service_graph.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8a2ba79b3a21a299b96b1b10a68b8e0644f9da23a630133ab7296b800003d705",
"format": 1
},
{
"name": "plugins/modules/mso_schema_validate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b09b020a522340cefe979ae6d7dde26c16d57723f9c4d98568791d1bbd1009e1",
+ "chksum_sha256": "e0cf62641c2bfbbb6c145d2de5ab5bd25aae9452c54ccb403596d5a8b3dbbc65",
"format": 1
},
{
"name": "plugins/modules/mso_label.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "91f3e18abb64d487e24698602aa2c8122275077b76f7ce3e44c9c72615769a6b",
+ "chksum_sha256": "081146778e14fd64b318da7304dc6ecfe8c5c6c4bfc796c66d46cdd616ba3a0b",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_vrf_region.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d1d6ac938b724f90bee0389ba5449bd39009470c2470b491cbb9c6fa9476f7e",
+ "chksum_sha256": "8835271f837f8d881da42f73d0626f172aec10307cc162edb2c4521cc8a0bd89",
"format": 1
},
{
"name": "plugins/modules/ndo_schema_template_deploy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "245a3f6f5127f6bce09cf8be06aa8705c70f03b9cc09d9a068053a34a9ffae36",
+ "chksum_sha256": "a01d099cb2fb19db139901feff0c1e163bb2c95743fec2cef73472e7bdccc1b0",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_external_epg_selector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c3c4b25e653b0ffe17b3855a110ff5183b45a7c131deeb720e37bf0e3999512d",
+ "chksum_sha256": "816002cb3c41dadf1f71ef97e1a7e1184898411ff6e1e070ebafda0e2e55ad33",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_migrate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1e02912efe8eb9f53827a2843d0ab91aecfc57d5d11fb2b2b535d593fc0b1874",
+ "chksum_sha256": "bb665ec1b8c18427bd32d42739a1895e0587a57e23ff3bc5e3702b2ab80d5fe3",
"format": 1
},
{
"name": "plugins/modules/mso_version.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1a91a748dc001172e3a0c485848fa0fdd41831b79a0f0862a55625c9c6d78133",
+ "chksum_sha256": "31a5b738343e42b1b01cabad5eaebbed9c59a34b6bd0da4eb861c156b7ecd301",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_l3out.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e0bb66ebb85fd043104a8cbd14338e3014d16ba49a349eb39a4eacf6319ea21",
+ "chksum_sha256": "d558b5f03388d5aed0a27029cac2ed3c8e47677e42ba8c62704b591df139ebf8",
"format": 1
},
{
"name": "plugins/modules/mso_dhcp_relay_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3eb53debf9a3c8ee3bfed778e538a73e03dac02371f77ad8046e9be200f04806",
+ "chksum_sha256": "f32a44b801b801120b948cb00b7217ae8ca055f79b319a595d8e98d76060dbfd",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/mso_schema_site_contract_service_graph_listener.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "44a8c1c8db5aef031e9d37135b3812c5228ed36d0da87f2b596481f3f5aa878e",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_anp_epg_subnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6d3eb9cfffe291d742bd95c98e2222696b47b9532de5960d405390823f4195c6",
+ "chksum_sha256": "3015e6e746164b203532a58eeaf68ea796b78d5c270799d36a2c4ed595a8bccc",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_deploy_status.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c9017bda8f5590b60047f9654db54e4608064f97abf2cbae45ce455e2cde815f",
+ "chksum_sha256": "0c19b16a14e60c56623b5601791545b34e603446ac6479a228ea6736fbf9c332",
"format": 1
},
{
"name": "plugins/modules/mso_dhcp_option_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "80d5de0dec0b967c33be6f0a882ed477d774e38823f082ed928bd99acbda77e0",
+ "chksum_sha256": "ae6db0609d70bf161d7d480cea09d938657cd6be9cb66a39a3fc01e012002dd0",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_anp_epg_selector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3fd399a8567a0f217d09cd52bc98233bc66d8f95198cce9d3dca1d3c9605e2d3",
+ "chksum_sha256": "983751917e08ec653d1432d701e90decdced6948c419cbb72d9720dfdc2bca9d",
"format": 1
},
{
"name": "plugins/modules/mso_user.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5a1253f212aaef3c7f1f0a6f0d782db05d56b5943a71a3ef22f170d2b180436a",
+ "chksum_sha256": "c02cdf0bf73ef68f147964c0cbe229691cab43ff7a99004efb731ee44b540b30",
"format": 1
},
{
"name": "plugins/modules/mso_backup_schedule.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ffcb686b57665f77ba98e5c9da90371bd375651ee14a872946a6ef410795d028",
+ "chksum_sha256": "e55a6680185af141d01540448fb0ecfac8f231a0620fa15ff22a6171eae8215b",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template_bd.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bea197a237bc35514301873858b1b089474b68859e73755c97fbeef8bd9cf022",
+ "chksum_sha256": "8325e223822e77be1ff4ecf1e76cf25651e34d8564fce45ccc0378b48d64b1dc",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site_l3out.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "640901827b0efe076fc738afbb8909d60bfbbfd23ee11116f397a80ef2567e1a",
+ "chksum_sha256": "f4d248f321c95e99f1628c74264e7a254da2d4fb3d1a1a034f67f38d57c8de02",
"format": 1
},
{
"name": "plugins/modules/mso_schema_site.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a06f86812347eaddbc5b39836e8cc96703e4207a327673876883550b8109277a",
+ "chksum_sha256": "f8faf0cb27c969b2b01207ac10f42b229074b1182877b85e3c36aba061a412ba",
"format": 1
},
{
"name": "plugins/modules/mso_schema_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fd7d0b52e775c6607e2c2da18e655f9ae5f760b616f51629f3dda9dcc95bebb5",
+ "chksum_sha256": "5e2519bfffae43c962927493346ee03efa3871319d3efa75d404e1e0545a9ec9",
"format": 1
},
{
@@ -634,7 +648,7 @@
"name": "tests/integration/targets/mso_dhcp_relay_policy/tasks/main.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d9ef7c98101c518cc0689cd0c3052c7a965924473d468d9f28cf94616035f9f3",
+ "chksum_sha256": "85f785b8f6b63231054901880ced3d8ec969fdb7ff72b7d64ff211b206da9946",
"format": 1
},
{
@@ -662,7 +676,14 @@
"name": "tests/integration/targets/mso_schema_site_service_graph/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "827c0652a8363fa1585bc3087517cdcc9622f62d6937cc8e4325162c8d1f977b",
+ "chksum_sha256": "41cd65e6f3afec3bc923411ee09e65cae143297e40031fd69231c850424600d4",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_service_graph/tasks/l4_l7_devices.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "65f5132f51c9db35a1eacf4882ef937b3876178ac3b8786d6d689e8b8cb9f2a7",
"format": 1
},
{
@@ -690,7 +711,7 @@
"name": "tests/integration/targets/mso_schema_template_deploy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0c70364503504b44437583c853a4dd70dfb8ed09c3dcb60d254790cefbb0a6c5",
+ "chksum_sha256": "789b506894b3bfe0a2131f1d1ae4420732087cf71faf8c9d04a5ce395fc297d8",
"format": 1
},
{
@@ -729,6 +750,55 @@
"format": 1
},
{
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph_listener",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1a65f7665e110ee1ec5eb08742616c82786dd4ac28772447af9498c3b38d3259",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/l4_l7_devices.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "71472aecc4c6421c5cd7411003f4859eac5cbcd1922c55be179f7b55f4356723",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/pki",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/pki/admin.crt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9d690f11eea29ff905c65d4457fcff73fe9eda30f733af7ae91a6ec545e2239d",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph_listener/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4e674607496d01ce032bfdbcc3e77ecdcde02f3e9d57080a95682a0cdff6809a",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/mso_schema_site_vrf_region_cidr_subnet",
"ftype": "dir",
"chksum_type": null,
@@ -746,7 +816,7 @@
"name": "tests/integration/targets/mso_schema_site_vrf_region_cidr_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95b8ad80d173f5a830b41a0b4c6cdb523a89dadc12413e4d4f4f956a82244c04",
+ "chksum_sha256": "9e5f21f4b103f0c9e1dd0bbf9dc99e6f54ad6f565e01fdc87f49b27f365dceb9",
"format": 1
},
{
@@ -774,7 +844,7 @@
"name": "tests/integration/targets/mso_schema_template/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "69e1eb1e15a1af3fe9e08e301c4173e32f26592337ec169896a202e914747440",
+ "chksum_sha256": "c829d6782b2a3b5be8cfff70e8833555bf79c199026c342966df5c9986f7692c",
"format": 1
},
{
@@ -802,7 +872,7 @@
"name": "tests/integration/targets/mso_rest/tasks/json_template.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8cc983a7d84493d9f41cbe38b197727174afec4426f78c376bce540a4b4a4fec",
+ "chksum_sha256": "fdb29819b5ad2c704e3f93c1f6939f2fd4031932eaa71803e441179eae80accc",
"format": 1
},
{
@@ -816,42 +886,42 @@
"name": "tests/integration/targets/mso_rest/tasks/json_inline.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "79a502e927c89c5968a435bf2c2418ab416cfa47a6b41d48079eef0c36149f29",
+ "chksum_sha256": "32591469bda7ecedac44b748673e3fa362cd092db6320500e69f033d83d0e763",
"format": 1
},
{
"name": "tests/integration/targets/mso_rest/tasks/json_string.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "db213807aee3f02d301fea223f60d9e54dff6ad8ea8bdf787d20c03bf7ca98c9",
+ "chksum_sha256": "a91f997e0bda9a22e4c7f48c86534e75d1a4d339660506cca21d7aebbeecc66b",
"format": 1
},
{
"name": "tests/integration/targets/mso_rest/tasks/yaml_inline.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d3b9e0b8414481027b4b3fc2ac7b06002e835bd1af89a05a2d7800007b12af87",
+ "chksum_sha256": "fb74400224c7afb47ead1d5d9c50c0d120274c1a4a8d5dda57eb9ac7e018c227",
"format": 1
},
{
"name": "tests/integration/targets/mso_rest/tasks/yaml_string.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de348a80485987b8ccd22ced6deb28150d79e81947929908a395fd8019fab605",
+ "chksum_sha256": "e95a64f1d09d5456b7ddecc958654473ed9ae2fa6a336a692d82474c385ec554",
"format": 1
},
{
"name": "tests/integration/targets/mso_rest/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "52f1fb7f60fafa3735b17352ca4e1da195810b0edf3f2680738092e4d52fb1b1",
+ "chksum_sha256": "744643738a57bf2c1a361be092101d1566c91dba7e936168f98731fa4c33abd6",
"format": 1
},
{
"name": "tests/integration/targets/mso_rest/tasks/error_handling.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "833535c5837bd384a895d6741629bae58d64af7b2b8f5af78d288ca9ad601947",
+ "chksum_sha256": "ba05804b3cc1a2444507235a47be5397f079fc4c9f600aec06d60e22c7df29d8",
"format": 1
},
{
@@ -879,7 +949,7 @@
"name": "tests/integration/targets/mso_remote_location/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38221f3e70c4a94b31aa03a33e8da81ad05164ba82afbf2ecdb6c3e77fd3977f",
+ "chksum_sha256": "498c8d1960ddb796e2db681e180bcbbee04f0742c7c70e860de659f6979a959c",
"format": 1
},
{
@@ -942,7 +1012,7 @@
"name": "tests/integration/targets/mso_schema_template_external_epg_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5836b610052cfbdc33f4603cac14419dd92c3c64f3c56f17d557f89198055ccb",
+ "chksum_sha256": "1bc14f5f921716518b103f4580b5ebe0cd56f2e450e7ef4cd439be5872d813e0",
"format": 1
},
{
@@ -970,7 +1040,7 @@
"name": "tests/integration/targets/mso_schema_site/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fe21b23b905888b210fb78e8102768cdb990ab083ff7de03e6c6ef519e947c59",
+ "chksum_sha256": "8580f8a7b0ac76035d2bbce994214a23cbeb7c1eca01e0a22c226f0e09764622",
"format": 1
},
{
@@ -998,7 +1068,7 @@
"name": "tests/integration/targets/mso_schema/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1312bf7a3945d1864d7a94e5a5224ebdfcad2076570a76f32a211f351aae11f",
+ "chksum_sha256": "09c5abd625918899f197862d96e7ef2bc4b0fcdf56cd12520be3628979d883e4",
"format": 1
},
{
@@ -1026,7 +1096,7 @@
"name": "tests/integration/targets/mso_schema_template_migrate/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "071adadb5df6a35002c55292ca8c7435e5893be90318e66f3defe6b124345cde",
+ "chksum_sha256": "8fbbd33d4126f435b1acf37ea292e7b6a2100e1d50e9cf148363b438a550176c",
"format": 1
},
{
@@ -1054,7 +1124,7 @@
"name": "tests/integration/targets/mso_schema_template_l3out/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c254fa26dea680790cff05b10a996729ab1d4ae6d58a22f9e0870ded774c0ad1",
+ "chksum_sha256": "7b95b029ed47a194421d7e15e1acbcd410c94a4e49024d9c66ef024a3bc72d81",
"format": 1
},
{
@@ -1082,7 +1152,7 @@
"name": "tests/integration/targets/mso_schema_template_anp/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "39d7a4e61d89fcf18b1dc760e208d6f2e7293987033a87432f380c7497dcc92a",
+ "chksum_sha256": "6123445aaf9ec2240832d300da52c1c7d659653b8677a3f77b96cc6a21b3ceb9",
"format": 1
},
{
@@ -1110,7 +1180,7 @@
"name": "tests/integration/targets/ndo_schema_template_deploy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d9dc44d7e2603c394f4d0d28305b233bc2b00b0f3bc6d21f79d8f59914acc053",
+ "chksum_sha256": "cc3b4c4a0d5025a1876562002fcda8790a15797dfb6a350f8afd68371215160b",
"format": 1
},
{
@@ -1138,7 +1208,7 @@
"name": "tests/integration/targets/mso_schema_site_anp_epg_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8eaa3bd0ba02460cf49baad9c987294915aeb9dd70086caf5a5d742ef2e450f0",
+ "chksum_sha256": "2cea815660e1466bd00c33b4cf7a936f2ac0cb086c589d43e32b1ee68efd9d44",
"format": 1
},
{
@@ -1166,7 +1236,7 @@
"name": "tests/integration/targets/mso_schema_template_external_epg_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2270c9de7e7ccae07b323d7f4fa7779faa468a8bdabcf7318746dd8966a67e0e",
+ "chksum_sha256": "9e63408ec28fee5139cfc92e95275057e97544c1456a2e5eb04c097a8143dedb",
"format": 1
},
{
@@ -1194,7 +1264,7 @@
"name": "tests/integration/targets/mso_schema_clone/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "514d4e40cfb3e4dcff5bbfb105cefd20fbaeb0ea0620450eff89ac48311486d7",
+ "chksum_sha256": "8776594057c0d09a20c4767d406a00fb93ca52a7e6892b7d75c93cd479b56683",
"format": 1
},
{
@@ -1222,7 +1292,7 @@
"name": "tests/integration/targets/mso_schema_template_contract_service_graph/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "578c3318a14ef60ec71adaadcb725f767b60ab223d177aa19965ed1421b08799",
+ "chksum_sha256": "500b0a0044fbf00e9037396d503576a0b83a709c761ae3a731bb4d11ac6c826d",
"format": 1
},
{
@@ -1250,7 +1320,7 @@
"name": "tests/integration/targets/mso_schema_template_external_epg_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82a0285141349272dba64176a122887414245415ba23ce9e7edb68f2f24a5768",
+ "chksum_sha256": "b1c38ed9c13368747f30aff25ebc6cad40aefc7d7566598b60ff1b8283c99bfd",
"format": 1
},
{
@@ -1278,7 +1348,7 @@
"name": "tests/integration/targets/mso_schema_site_vrf_region/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "77efce495c27cf34aee29ad0d23857ee75862a8285cf28c7d2e36b1f7d5a21e5",
+ "chksum_sha256": "38ab5a7886ac80a23976f9628b0f969e8fa466492b14425015fcca62690fb543",
"format": 1
},
{
@@ -1306,7 +1376,7 @@
"name": "tests/integration/targets/mso_schema_template_contract_filter/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3f2ee3ce9770c0a1e82f0359641f889c34e21f1a1a357256818762ff7c34baf4",
+ "chksum_sha256": "22decfbc1454f009b51756faf9c3f40f1a7cd91cb679cfc627d9e216d5435da6",
"format": 1
},
{
@@ -1334,7 +1404,7 @@
"name": "tests/integration/targets/mso_dhcp_option_policy_option/tasks/main.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "51f135acdfc12bd620051460c18d84c139adeca91bcfbf53e44ed5c1a3879213",
+ "chksum_sha256": "dc327b7dadc2b48ade2464c00cf84e699ad01706fc05ce8a8d49bf199fe985de",
"format": 1
},
{
@@ -1362,7 +1432,7 @@
"name": "tests/integration/targets/mso_schema_site_external_epg_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e493d7a02b30e3933cdde6112452b3d8848718fd7cdbad91c02cf9ead974824c",
+ "chksum_sha256": "6916e1c25af21ecbb1cfef365adc46bd67e003bc2a12784192e8525e7d46c3bc",
"format": 1
},
{
@@ -1390,7 +1460,7 @@
"name": "tests/integration/targets/mso_backup_schedule/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "07a0e9ba07f2daa25c9fba4c9ea0ddf30f8a7c8742d23db43c606d418502fcdd",
+ "chksum_sha256": "66b6797b624c845d57b58a072c4f2136c074dcde22f963fc45ef886ea4abea19",
"format": 1
},
{
@@ -1418,7 +1488,7 @@
"name": "tests/integration/targets/mso_schema_site_anp_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d33506200b0c453f2d6d810772e4d4df6f4bf2cafa60728196bf2e0f69e6229",
+ "chksum_sha256": "2152f5760e632679d7f3950ac0d0c08087d54e97789882a6c9eaaf79c98fb966",
"format": 1
},
{
@@ -1446,7 +1516,7 @@
"name": "tests/integration/targets/mso_schema_template_bd/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "333679f0f0e047c4923b582594ef248ade0ea86781386548e12fecbb3abe071c",
+ "chksum_sha256": "3e2a080b664193f72346098ac18120d6ca516241f9cb69b1c1015e3c9053332d",
"format": 1
},
{
@@ -1474,7 +1544,7 @@
"name": "tests/integration/targets/mso_schema_site_bd/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6901d10171226d330516388d635afe119a679289eef9ef4035ac4de6353c3b94",
+ "chksum_sha256": "b6d924f071e652f1e06ffad8ca581d87b16fab76f92f7e0a554f921fe0f86405",
"format": 1
},
{
@@ -1502,7 +1572,7 @@
"name": "tests/integration/targets/mso_schema_template_external_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff9797ef3ae1245f5f8c22f8b690f2da40ee624029286bec15391a83ca808574",
+ "chksum_sha256": "ae944971b202fbcbbb4a1bbfb7322ee1e8d73f113d7e60b88da8da604ce2b8c1",
"format": 1
},
{
@@ -1537,7 +1607,7 @@
"name": "tests/integration/targets/mso_site/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b1069b4a82af6ab3a3f5c48a3e1ccd7934914ce4a01986527c8abd1b9644f60f",
+ "chksum_sha256": "78e7c19bb659638812ed34f2cc4c4a6f0d3946c7eec28e54d05a2dd04001ae6e",
"format": 1
},
{
@@ -1565,7 +1635,7 @@
"name": "tests/integration/targets/mso_backup/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "18d20201dae1300b207fb2a4aca24df285f859edb393c5f86f773bb8df08e7eb",
+ "chksum_sha256": "cfd643748dcd4bb01db6c8a5f8f93cef5c74f455187c4331eeb587a8d3fbd132",
"format": 1
},
{
@@ -1593,7 +1663,7 @@
"name": "tests/integration/targets/mso_schema_validate/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1af77eaab77c5a6b06eda3a60b2bd918b84dfa5750f6288aaad1d002d069bc6b",
+ "chksum_sha256": "8531c2bc69d731cc659e88a40e74d4172321240e00844f839e35d26891d83975",
"format": 1
},
{
@@ -1621,7 +1691,7 @@
"name": "tests/integration/targets/mso_schema_site_external_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6bdfe858336ec0d8a3fb0d5d09142ef1c2a4a0cbd99fcc389e6784ac8ddd2b41",
+ "chksum_sha256": "e054e4ebc87f0526ae3c5dd7748dc32871338deb0236d72687240382c56a47d4",
"format": 1
},
{
@@ -1649,7 +1719,7 @@
"name": "tests/integration/targets/mso_schema_site_bd_l3out/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b158c1ec848377082954461ef32fb48016b0986ac9d9a7e8b5be178410df282",
+ "chksum_sha256": "7b1dd7407d125187f7110c266063d8e98f3e03feeeadab3707fb71ed742b7850",
"format": 1
},
{
@@ -1660,6 +1730,41 @@
"format": 1
},
{
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2a29449d81e24e4858042f74b100beadb2a56264cb03c1e0cf3e9f151a09884b",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph/tasks/l4_l7_devices.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7951548c601b5038570a069c96db81056ff81e7c40f3693a0538ee8a3aec36bc",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/mso_schema_site_contract_service_graph/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4e674607496d01ce032bfdbcc3e77ecdcde02f3e9d57080a95682a0cdff6809a",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/mso_schema_template_vrf",
"ftype": "dir",
"chksum_type": null,
@@ -1677,7 +1782,7 @@
"name": "tests/integration/targets/mso_schema_template_vrf/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c7674afec5735c25d6728fe1ad92d3c18fbeb86285c8ab671d0feca2f2f1c16",
+ "chksum_sha256": "19cc140ef2b984829c7f751c6a41cbb1f58d00a1eb6d4b6259154ea72ee3bd3f",
"format": 1
},
{
@@ -1705,7 +1810,7 @@
"name": "tests/integration/targets/mso_dhcp_relay_policy_provider/tasks/main.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5d51e2b02f8d1e76e11de62f429d8ef56d434d5b2cdb69ad0b919889ff2f5936",
+ "chksum_sha256": "d0a9a51f78de0a35485537afb420626cb33bd7769a96b4227c89457307a1d1c3",
"format": 1
},
{
@@ -1740,7 +1845,7 @@
"name": "tests/integration/targets/mso_version/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e12f785897861f1ddb8774ca5decd418c4cfb07cea9d3f7d17b82e702c90c6e9",
+ "chksum_sha256": "33e95584610880663096db1a8f392693f224951d0929f54517b35823aacd426e",
"format": 1
},
{
@@ -1768,7 +1873,7 @@
"name": "tests/integration/targets/mso_dhcp_option_policy/tasks/main.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c8a3d5702a82e14a426180a493c3479435a0e19d46bd02c8493b035296d958c0",
+ "chksum_sha256": "7a264b8ac34b2a4d38201316246494316674d9d469ffc279deac501bea902745",
"format": 1
},
{
@@ -1796,7 +1901,7 @@
"name": "tests/integration/targets/mso_schema_site_anp/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "418ff7da34a7ad01685d47cc802cedff5ba29cbe769c954ee9083f682dad7ae1",
+ "chksum_sha256": "282ba92eb7c1498f5c0c1ef3159415e7e4d12f314cdaf8872b43bf536d407624",
"format": 1
},
{
@@ -1824,14 +1929,14 @@
"name": "tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/hub_network.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e1a5fd0bbf1f1adf0d4da159ccfe96f57b5c10f4e8fa48c6c76da8339b10c530",
+ "chksum_sha256": "2deeeb9bfe3db63602a8fa5bc68c733967f577f68eecdca9bae9ca4e183922c3",
"format": 1
},
{
"name": "tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ffa9f5e1ba49276fbf6d6cb24151327d6901a5a778d57e4ddb1c8ac0c722487e",
+ "chksum_sha256": "40853a8fa344161fddff84ac11064eeddf7dd2c02e79c9a50c33b81187535b18",
"format": 1
},
{
@@ -1859,7 +1964,7 @@
"name": "tests/integration/targets/mso_schema_site_anp_epg_staticport/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f4cd4ae7386ed895636f750b632a5001c004d8a8805c21de5059cfbbad3c04c4",
+ "chksum_sha256": "a56038abe8b876cf73a846293694e57e7d66a056f38b8671fa258d3efead62b1",
"format": 1
},
{
@@ -1887,7 +1992,7 @@
"name": "tests/integration/targets/mso_schema_site_vrf_region_cidr/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b28d23e8386bd853d29a9544995258c438bec534f7abd563642f0c08de3d9784",
+ "chksum_sha256": "2d778fc51d376d9b55c16782080fb33791d574f8b0ecd9e4578544f549a574ee",
"format": 1
},
{
@@ -1915,7 +2020,7 @@
"name": "tests/integration/targets/mso_schema_template_clone/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d844a496be851967b5ad5b12b7e87c97cfeb43fb9aea9a017fe1ff5eef8872c4",
+ "chksum_sha256": "bcef426421ffeff530e23ba152f73347ec7f3659a8ef27ae66e896ba8af1c072",
"format": 1
},
{
@@ -1943,7 +2048,7 @@
"name": "tests/integration/targets/mso_schema_template_bd_dhcp_policy/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "78b2e112fa8a4f86ae598358e9230f87e97032cac5c42cce6e2225b2d214684e",
+ "chksum_sha256": "bdfbb261c651a8b266d174ad8ca3fef7bab7e439c54403ca3a6da98a781e48c8",
"format": 1
},
{
@@ -1971,7 +2076,7 @@
"name": "tests/integration/targets/mso_schema_site_bd_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13b1b2addac18340cc8e491f123f1bfd6eb036b1bc9436ab49e95fb723bb652c",
+ "chksum_sha256": "20f6a89566a58b145d17e54a97f6a63740165596f8375bc8cc953cd43932fd77",
"format": 1
},
{
@@ -1999,7 +2104,7 @@
"name": "tests/integration/targets/mso_schema_template_service_graph/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "484c7ee52533c8a3945e0895aea08fc8ce43f4cbeb214f09382da2b94f8be366",
+ "chksum_sha256": "1bccf60d8d142999c6f91c1d7643877b2463f0f1bcf7816b4df16d1a53ea9e36",
"format": 1
},
{
@@ -2027,7 +2132,7 @@
"name": "tests/integration/targets/mso_tenant_site/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "47f6b866deb362cc0f408b86ce5c35d130b2020d1a9c1b417619e72e5a53eaf7",
+ "chksum_sha256": "b71bdd7e10f0354fd474ca739438281103671cbc627d2818457ac6d5ae0600cc",
"format": 1
},
{
@@ -2055,7 +2160,7 @@
"name": "tests/integration/targets/mso_schema_template_bd_subnet/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7ff362dc5f1bc93ef2020db1ec557092607256e917d8ddd430c323d6f5d8ec5f",
+ "chksum_sha256": "8b7650a13616eb890800a7cfdaf473476df824e2d5a14e537c2f757eca5bac9f",
"format": 1
},
{
@@ -2083,7 +2188,7 @@
"name": "tests/integration/targets/mso_schema_template_filter_entry/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fa3311bf4f0a496d1f4fb2ced7e15eba2fc91f94dc9d3ff03fcc90d914edfef6",
+ "chksum_sha256": "02d72c0b14dff84ed6b8a9a88a1e4a805314099f462954b400d7f47b1901d392",
"format": 1
},
{
@@ -2111,7 +2216,7 @@
"name": "tests/integration/targets/mso_schema_site_anp_epg_bulk_staticport/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "54fb49cc6419f67dbbad1d40262ad3b5d51c4397a4051dc1bf1517b9a0cc2649",
+ "chksum_sha256": "ef18b8d1183244545df0e30359f4970b019b5617634337b22a950f55e5b81c5c",
"format": 1
},
{
@@ -2139,7 +2244,7 @@
"name": "tests/integration/targets/mso_tenant/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "947a71a53705d001c273db32700e5068456b9c4485e965ce74f6f7a1b9deac21",
+ "chksum_sha256": "ddf2bf7c2a0c51332f5e567f5be3f42210128b1fc09fb3231658f10f45c24b62",
"format": 1
},
{
@@ -2167,7 +2272,7 @@
"name": "tests/integration/targets/mso_user/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4da63f32ce74b3890e7ee8d4c3c075036bbf41c12a05993ae0149e200802a69f",
+ "chksum_sha256": "ffde6cae7d1c5ea2177b965831f0398fd92f6005f9753b3ed3f5a3facf794f83",
"format": 1
},
{
@@ -2195,7 +2300,7 @@
"name": "tests/integration/targets/mso_label/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "480fe2aaf7ae221186ad81b486471d176476c07347e005255d0a399ac14c2086",
+ "chksum_sha256": "0c3d8b89ce467783f71f5f2dbe4001ef36ebc75589826490e8209164f6bf0c50",
"format": 1
},
{
@@ -2223,7 +2328,7 @@
"name": "tests/integration/targets/mso_schema_site_anp_epg_useg_attribute/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "37ede5ad61f45ac3ade6efa497636f6a60d3c53c84a018acd8381455d8bb62f0",
+ "chksum_sha256": "10619550bc02fc49ab081aae29a45c4f107e9495a5fc687403f02d59afcedd9f",
"format": 1
},
{
@@ -2251,7 +2356,7 @@
"name": "tests/integration/targets/mso_schema_template_anp_epg_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c4ffb17ea697e5f4084e51af650ea8926d15db223e0e0ae010a7954def3c6ff",
+ "chksum_sha256": "050d7f9e940a19588c94277bbc0b10df53261c2d50120c73d13185f1838eaa89",
"format": 1
},
{
@@ -2279,7 +2384,7 @@
"name": "tests/integration/targets/mso_schema_template_anp_epg_selector/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b076386dec1bbce7c25deeb36f6c674d6ba271e2d22d87241db43dd8fbf60913",
+ "chksum_sha256": "c34c10fda893cd1747d5444b2b839381fbe1c409c1f41a8188bc02f2953ceb71",
"format": 1
},
{
@@ -2307,7 +2412,7 @@
"name": "tests/integration/targets/mso_schema_template_anp_epg/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4745d027cba442156d8f6c5c441695cf796bd7a3dc2f3db5addffcff340c1268",
+ "chksum_sha256": "ea515cc4a21172eae0223fb1dfa976170dd532d1169c98e9b42dedb49fecbfc3",
"format": 1
},
{
@@ -2335,7 +2440,7 @@
"name": "tests/integration/targets/mso_schema_site_anp_epg_domain/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee1fb2b9a12e1cf8279a729d0e1931f8428bd9ebba10437d919b33e5c68bc7ea",
+ "chksum_sha256": "ff484522430e64fe87c59447052f70c597798923f81506207534863fa313743c",
"format": 1
},
{
@@ -2363,7 +2468,7 @@
"name": "tests/integration/targets/mso_schema_template_vrf_contract/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1639c0d1bda672778a81703b34dfde366b560c7e075fc78abfd42b0aadae844",
+ "chksum_sha256": "fcea17ca3703a45b1f8bd76fe56c173df8f1ac189f669488b75af72a54868449",
"format": 1
},
{
@@ -2391,21 +2496,21 @@
"name": "tests/integration/targets/mso_role/tasks/role-ro.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e6bd02045da50a15d5637fa33f5fd81cf2be74a7169ad5f3d3bb3f8bb5ddbf04",
+ "chksum_sha256": "b202d850f019300dded56caa6fe2b3191de2c0b40a6237e8dec65d98d6a10f2a",
"format": 1
},
{
"name": "tests/integration/targets/mso_role/tasks/role-rw.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71801c0349fceb078b940dd5fcec5cdf2009698f1217dffd56742ac102d21f8f",
+ "chksum_sha256": "b6afc1669d06eefe9ea8e5eb04a08909ace49d5061d31e167b6f58df20d37498",
"format": 1
},
{
"name": "tests/integration/targets/mso_role/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "65a2f97fa530d35fa0f1c647b8b3052d42d2dee2d6a9e6ea766e9eae531ff177",
+ "chksum_sha256": "9b55740c252269b29fe741e31bff2bd8552600048e321700cfee4177d20fda8c",
"format": 1
},
{
@@ -2433,7 +2538,7 @@
"name": "tests/integration/targets/mso_schema_template_anp_epg_useg_attribute/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "366babbe8a312685256b3034cb45e56c0bb3fb31347df60f368dd8d704b5ef16",
+ "chksum_sha256": "3b937b0e5e31c12044a2c595f9ade15f63310f8cd08bc759466d417b8800c6a9",
"format": 1
},
{
@@ -2461,7 +2566,7 @@
"name": "tests/integration/targets/mso_service_node_type/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0f1f0fc9edff212a859e9a1a92cabdc157a25b5458d9dd9f429cc3e867ebfaa3",
+ "chksum_sha256": "b5b140bd4b575119c42f82ab18b8c33bf3c1cf4c941e4429a3d9241c05402be4",
"format": 1
},
{
@@ -2489,7 +2594,7 @@
"name": "tests/integration/targets/mso_schema_template_deploy_status/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb8bc653c1850980ecdef451053e466effa70eec2482c9b62d997ed7a131a036",
+ "chksum_sha256": "a3f58eda151d16e67a38f2374854342959d9470b32530b36ebe82e9aad41d4a5",
"format": 1
},
{
@@ -2517,7 +2622,7 @@
"name": "tests/integration/inventory.networking",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d3f3ffdd2f2ba13a4c77372a057605170c0480c7766a1b7ee626cdac9a11bbd5",
+ "chksum_sha256": "7c41c75da3834ca94b3741249d23d91a6176740d787cb30e7205975d6954b384",
"format": 1
},
{
@@ -2552,7 +2657,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "205a2ae640e2768827a4bf733001d5294da4301f3413b1aac640fbb2a6155d03",
+ "chksum_sha256": "fba10f5ea19bbbe13b0a56de28ceb30e61d401148ab2a6d5d9d35ef88844ba68",
"format": 1
},
{
@@ -2587,21 +2692,21 @@
"name": "changelogs/.plugin-cache.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0e39bdaa5b1012ce06db1c6e59c9c3a09bb9ea6956647d966c93d2792de5819a",
+ "chksum_sha256": "e92e2ea06f1ace11275a3e3db7de2352e2f378ff8bc8416fba2c360ec14f3164",
"format": 1
},
{
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aaefd32a4575f9258e66e377433698ba78c07d641a54c47092e1064edd676036",
+ "chksum_sha256": "38ca5840b834c074ca4a92cd74bb3255a3429102b9a98f86901251de3e816bb7",
"format": 1
},
{
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "613db67fc4c860791ee0bc02b1e0ace99d9a0daae54db9cc8309fdfbf061d239",
+ "chksum_sha256": "eb8b8d99cba3d16e1d3e4341d3e9a369bc22c189514497be4453f10326816240",
"format": 1
},
{
@@ -2636,7 +2741,7 @@
"name": ".github/workflows/galaxy-importer.cfg",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "edc6f2746e7b8c7b94dea479036ba246953cf69234974b89c069c10d614dcaad",
+ "chksum_sha256": "495797aee3d8a36d013c51e137187e94b639b998c59e84b64574584c826846a8",
"format": 1
},
{
@@ -2650,7 +2755,7 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55a01eb1c79e977744677bca59563ff6dfbb3f12b0932130d4cc7a46d49deb04",
+ "chksum_sha256": "072437507f49a0e8a0a016fb40285086d18266453378f1cfbed42ede55c2b006",
"format": 1
},
{
@@ -2692,7 +2797,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e4747ba584163f6422760b76eed3d11156df1c5ccf6ca6d18417140bcc214c16",
+ "chksum_sha256": "7ea304c736eb95b9526593261392b48d14fef496e5da625f9f71d3ce64ac7aea",
"format": 1
},
{
diff --git a/ansible_collections/cisco/mso/MANIFEST.json b/ansible_collections/cisco/mso/MANIFEST.json
index 72c5f44d9..9d55dcb55 100644
--- a/ansible_collections/cisco/mso/MANIFEST.json
+++ b/ansible_collections/cisco/mso/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "cisco",
"name": "mso",
- "version": "2.5.0",
+ "version": "2.6.0",
"authors": [
"Dag Wieers (@dagwieers)",
"Nirav Katarmal (@nkatarmal-crest)",
@@ -36,7 +36,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "52400ead13bbe6a4f9a3ae26b7702c3406c1463f794330adcc7bfa8aba2fca77",
+ "chksum_sha256": "d15ff3f0354f6d6736439deb843e42f7ad91602d4e2224135b7a1f52cc739efc",
"format": 1
},
"format": 1
diff --git a/ansible_collections/cisco/mso/README.md b/ansible_collections/cisco/mso/README.md
index d83eb5297..f6d08f6f9 100644
--- a/ansible_collections/cisco/mso/README.md
+++ b/ansible_collections/cisco/mso/README.md
@@ -10,7 +10,7 @@ Modules supporting new features introduced in MSO API in specific MSO versions m
*Note: The Nexus Dashboard (ND) HTTPAPI connection plugin should be used when Cisco ACI Multi-Site is installed on Nexus Dashboard (v3.2+) or when using this collection with Nexus Dashboard Orchestrator (v3.6+).*
## Requirements
-- Ansible v2.9 or newer
+- Ansible v2.14 or newer
## Install
Ansible must be installed
@@ -46,7 +46,6 @@ Once the collection is installed, you can use it in a playbook by specifying the
anp: ANP1
epg: EPG1
state: present
- delegate_to: localhost
```
You can also use the MSO HTTPAPI connection plugin by setting the following variables in your inventory file (cisco.mso collection v1.2+).
diff --git a/ansible_collections/cisco/mso/changelogs/.plugin-cache.yaml b/ansible_collections/cisco/mso/changelogs/.plugin-cache.yaml
index 48e4fe51b..e6bda9878 100644
--- a/ansible_collections/cisco/mso/changelogs/.plugin-cache.yaml
+++ b/ansible_collections/cisco/mso/changelogs/.plugin-cache.yaml
@@ -141,8 +141,20 @@ plugins:
name: mso_schema_site_bd_subnet
namespace: ''
version_added: null
+ mso_schema_site_contract_service_graph:
+ description: Manage the service graph association with a contract in schema
+ sites
+ name: mso_schema_site_contract_service_graph
+ namespace: ''
+ version_added: null
+ mso_schema_site_contract_service_graph_listener:
+ description: Manage the listener for Azure site contract service graph in schema
+ sites
+ name: mso_schema_site_contract_service_graph_listener
+ namespace: ''
+ version_added: null
mso_schema_site_external_epg:
- description: Manage External EPG in schema of sites
+ description: Manage External EPG in schema of sites.
name: mso_schema_site_external_epg
namespace: ''
version_added: null
@@ -357,4 +369,4 @@ plugins:
strategy: {}
test: {}
vars: {}
-version: 2.5.0
+version: 2.6.0
diff --git a/ansible_collections/cisco/mso/changelogs/changelog.yaml b/ansible_collections/cisco/mso/changelogs/changelog.yaml
index 18ae8b912..f7767c577 100644
--- a/ansible_collections/cisco/mso/changelogs/changelog.yaml
+++ b/ansible_collections/cisco/mso/changelogs/changelog.yaml
@@ -3,332 +3,325 @@ releases:
0.0.5:
changes:
release_summary: New release v0.0.5
- release_date: "2020-04-07"
+ release_date: '2020-04-07'
0.0.6:
changes:
bugfixes:
- - Add aliases for backward support of permissions in role module.
- - Add integration test for mso_schema_template_db and fix un-needed push to
- API found by integration test.
- - Consistent object output on domain_associations
- - Fix EPG / External EPG Contract issue and create test for mso_schema_template_anp_epg_contract
- and mso_schema_template_external_epg_contract
- - Fix contract filter issue and add contract-filter test file
- - Fix duplicate user, add admin user to associated user list and update tenant
- test file
- - Fix intersite_multicast_source attribute issue in mso_schema_template_anp_epg
- and add the proxy_arp argument.
- - Fix mso_schema_template_anp_epg idempotancy for both EPG and EPG with contracts
- - Remove label with test domain before create it
- - Send context instead of vrf when vrf parameter is used
- - Update mso_schema_template_bd.py example for BD in another schema
+ - Add aliases for backward support of permissions in role module.
+ - Add integration test for mso_schema_template_db and fix un-needed push to
+ API found by integration test.
+ - Consistent object output on domain_associations
+ - Fix EPG / External EPG Contract issue and create test for mso_schema_template_anp_epg_contract
+ and mso_schema_template_external_epg_contract
+ - Fix contract filter issue and add contract-filter test file
+ - Fix duplicate user, add admin user to associated user list and update tenant
+ test file
+ - Fix intersite_multicast_source attribute issue in mso_schema_template_anp_epg
+ and add the proxy_arp argument.
+ - Fix mso_schema_template_anp_epg idempotancy for both EPG and EPG with contracts
+ - Remove label with test domain before create it
+ - Send context instead of vrf when vrf parameter is used
+ - Update mso_schema_template_bd.py example for BD in another schema
minor_changes:
- - ACI/MSO - Use get() dict lookups (https://github.com/ansible/ansible/pull/63074)
- - Add EPG and ANP at site level when needed
- - Add github action CI pipeline with test coverage
- - Add login domain support for authentication in all modules
- - Add support for DHCP querier to all subnet objects. Add partial test in mso_schema_template_bd
- integration test.
- - Add support for clean output if needed for debuging
- - Add test file for mso_schema_template_anp_epg
- - Added DHCP relay options and scope options to MSO schema template bd
- - Added ability to bind epg to static fex port
- - Added module to manage contracts for external EPG in Cisco MSO (https://github.com/ansible/ansible/pull/63550)
- - Added module to manage template external epg subnet for Cisco MSO (https://github.com/ansible/ansible/pull/63542)
- - Disabling tests for the role modules as API is not supported after 2.2.3i
- until further notice
- - Increased test coverage for existing module integration tests.
- - Modified fail messages for site and updated documentation
- - Moving test to Ansible v2.9.9 and increasing timelimit for mutex to 30+ min
- - Update authors.
- - Update mso_schema_site_anp.py (https://github.com/ansible/ansible/pull/67099)
- - Updated Test File Covering all conditions
- - mso_schema_site_anp_epg_staticport - Add VPC support (https://github.com/ansible/ansible/pull/62803)
+ - ACI/MSO - Use get() dict lookups (https://github.com/ansible/ansible/pull/63074)
+ - Add EPG and ANP at site level when needed
+ - Add github action CI pipeline with test coverage
+ - Add login domain support for authentication in all modules
+ - Add support for DHCP querier to all subnet objects. Add partial test in mso_schema_template_bd
+ integration test.
+ - Add support for clean output if needed for debuging
+ - Add test file for mso_schema_template_anp_epg
+ - Added DHCP relay options and scope options to MSO schema template bd
+ - Added ability to bind epg to static fex port
+ - Added module to manage contracts for external EPG in Cisco MSO (https://github.com/ansible/ansible/pull/63550)
+ - Added module to manage template external epg subnet for Cisco MSO (https://github.com/ansible/ansible/pull/63542)
+ - Disabling tests for the role modules as API is not supported after 2.2.3i
+ until further notice
+ - Increased test coverage for existing module integration tests.
+ - Modified fail messages for site and updated documentation
+ - Moving test to Ansible v2.9.9 and increasing timelimit for mutex to 30+ min
+ - Update authors.
+ - Update mso_schema_site_anp.py (https://github.com/ansible/ansible/pull/67099)
+ - Updated Test File Covering all conditions
+ - mso_schema_site_anp_epg_staticport - Add VPC support (https://github.com/ansible/ansible/pull/62803)
release_summary: New release v0.0.6
- release_date: "2020-06-13"
+ release_date: '2020-06-13'
0.0.7:
changes:
bugfixes:
- - Fix mso_schema_site_vrf_region_cidr to automatically create VRF and Region
- if not present at site level
- - Fix query condition when VRF or Region do not exist at site level
- - Remove unused regions attribute from mso_schema_template_vrf
+ - Fix mso_schema_site_vrf_region_cidr to automatically create VRF and Region
+ if not present at site level
+ - Fix query condition when VRF or Region do not exist at site level
+ - Remove unused regions attribute from mso_schema_template_vrf
minor_changes:
- - Add l3out, preferred_group and test file for mso_schema_template_externalepg
- - Add mso_schema_template_vrf_contract module and test file
- - Add new attribute choice "policy_compression" to mso_Schema_template_contract_filter
- - Add new functionality - Direct Port Channel (dpc), micro-seg-vlan and default
- values
- - Add new module for anp-epg-selector in site level
- - Add new module mso_schema_template_anp_epg_selector and its test file
- - Add new module mso_schema_vrf_contract
- - Add new module mso_tenant_site to support cloud and non-cloud sites association
- with a tenant and test file (https://github.com/CiscoDevNet/ansible-mso/pull/62)
- - Add new mso_site_external_epg_selector module and test file
- - Add site external epg and contract filter test
- - Add support for VGW attribute in mso_schema_site_vrf_region_cidr_subnet
- - Add support to set account as inactive using account_status attribute in mso_user
- - Add test for mso_schema_site_vrf_region_cidr module
- - Add test for mso_schema_site_vrf_region_cidr_subnet module
- - Add vzAny attribute in mso_schema_template_vrf
- - Automatically add ANP and EPG at site level and new test file for mso_schema_site_anp_epg_staticport
- (https://github.com/CiscoDevNet/ansible-mso/pull/55)
- - Modified External EPG module and addition of new Selector module
+ - Add l3out, preferred_group and test file for mso_schema_template_externalepg
+ - Add mso_schema_template_vrf_contract module and test file
+ - Add new attribute choice "policy_compression" to mso_Schema_template_contract_filter
+ - Add new functionality - Direct Port Channel (dpc), micro-seg-vlan and default
+ values
+ - Add new module for anp-epg-selector in site level
+ - Add new module mso_schema_template_anp_epg_selector and its test file
+ - Add new module mso_schema_vrf_contract
+ - Add new module mso_tenant_site to support cloud and non-cloud sites association
+ with a tenant and test file (https://github.com/CiscoDevNet/ansible-mso/pull/62)
+ - Add new mso_site_external_epg_selector module and test file
+ - Add site external epg and contract filter test
+ - Add support for VGW attribute in mso_schema_site_vrf_region_cidr_subnet
+ - Add support to set account as inactive using account_status attribute in mso_user
+ - Add test for mso_schema_site_vrf_region_cidr module
+ - Add test for mso_schema_site_vrf_region_cidr_subnet module
+ - Add vzAny attribute in mso_schema_template_vrf
+ - Automatically add ANP and EPG at site level and new test file for mso_schema_site_anp_epg_staticport
+ (https://github.com/CiscoDevNet/ansible-mso/pull/55)
+ - Modified External EPG module and addition of new Selector module
release_summary: New release v0.0.7
- release_date: "2020-07-08"
+ release_date: '2020-07-08'
0.0.8:
changes:
bugfixes:
- - Add login_domain to existing test.
- - Add missing tests for VRF settings and changing those settings.
- - Add test for specifying read-only roles and increase overall test coverage
- of mso_user (https://github.com/CiscoDevNet/ansible-mso/pull/77)
- - Add test to mso_schema_template_vrf, mso_schema_template_external_epg and
- mso_schema_template_anp_epg to check for API error when pushing changes to
- object with existing contract.
- - Cleanup unused imports, unused variables and branches and change a variable
- from ambiguous name to reduce warnings at Ansible Galaxy import
- - Fix API error when pushing EPG with existing contracts
- - Fix role tests to work with pre/post 2.2.4 and re-enable them
- - Fix site issue if no site present and fix test issues with MSO v3.0
- - Fixing External EPG renaming for 2.9 and later
- - Fixing L3MCast test to pass on 2.2.4
- - Fixing wrong removal of schemas
- - Test hub network module after creating region manually
- - Updating Azure site IP in inventory and add second MSO version to inventory
+ - Add login_domain to existing test.
+ - Add missing tests for VRF settings and changing those settings.
+ - Add test for specifying read-only roles and increase overall test coverage
+ of mso_user (https://github.com/CiscoDevNet/ansible-mso/pull/77)
+ - Add test to mso_schema_template_vrf, mso_schema_template_external_epg and
+ mso_schema_template_anp_epg to check for API error when pushing changes to
+ object with existing contract.
+ - Cleanup unused imports, unused variables and branches and change a variable
+ from ambiguous name to reduce warnings at Ansible Galaxy import
+ - Fix API error when pushing EPG with existing contracts
+ - Fix role tests to work with pre/post 2.2.4 and re-enable them
+ - Fix site issue if no site present and fix test issues with MSO v3.0
+ - Fixing External EPG renaming for 2.9 and later
+ - Fixing L3MCast test to pass on 2.2.4
+ - Fixing wrong removal of schemas
+ - Test hub network module after creating region manually
+ - Updating Azure site IP in inventory and add second MSO version to inventory
minor_changes:
- - Add Login Domain support to mso_site
- - Add aliases file for contract_filter module
- - Add contract information in current and previous part
- - Add new module and test file to query MSO version
- - New backup module and test file (https://github.com/CiscoDevNet/ansible-mso/pull/80)
- - Renaming mso_schema_template_externalepg module to mso_schema_template_external_epg
- while keeping both working.
- - Update cidr module, udpate attributes in hub network module and its test file
- - Use a function to reuuse duplicate part
+ - Add Login Domain support to mso_site
+ - Add aliases file for contract_filter module
+ - Add contract information in current and previous part
+ - Add new module and test file to query MSO version
+ - New backup module and test file (https://github.com/CiscoDevNet/ansible-mso/pull/80)
+ - Renaming mso_schema_template_externalepg module to mso_schema_template_external_epg
+ while keeping both working.
+ - Update cidr module, udpate attributes in hub network module and its test file
+ - Use a function to reuuse duplicate part
release_summary: New release v0.0.8
- release_date: "2020-07-21"
+ release_date: '2020-07-21'
1.0.0:
changes:
bugfixes:
- - Fix sanity issues to support 2.10.0
+ - Fix sanity issues to support 2.10.0
minor_changes:
- - Add changelog
- - Fix M() and module to use FQCN
- - Update Ansible version in CI and add 2.10.0 to sanity in CI.
- - Update Readme with supported versions
- release_summary:
- "This is the first official release of the ``cisco.mso`` collection
+ - Add changelog
+ - Fix M() and module to use FQCN
+ - Update Ansible version in CI and add 2.10.0 to sanity in CI.
+ - Update Readme with supported versions
+ release_summary: 'This is the first official release of the ``cisco.mso`` collection
on 2020-08-18.
This changelog describes all changes made to the modules and plugins included
in this collection since Ansible 2.9.0.
- "
- release_date: "2020-08-18"
+ '
+ release_date: '2020-08-18'
1.0.1:
changes:
bugfixes:
- - Fix default value for l2Stretch in mso_schema_template_bd module
- - Fix deletion of schema when wrong template is provided in single template
- schema
- - Fix examples in documentation for mso_schema_template_l3out and mso_user
- - Fix naming issue in deploy module
- - Remove author emails due to length restriction
- - Remove dead code branch in mso_schema_template
+ - Fix default value for l2Stretch in mso_schema_template_bd module
+ - Fix deletion of schema when wrong template is provided in single template
+ schema
+ - Fix examples in documentation for mso_schema_template_l3out and mso_user
+ - Fix naming issue in deploy module
+ - Remove author emails due to length restriction
+ - Remove dead code branch in mso_schema_template
minor_changes:
- - Add delete capability to mso_schema_site
- - Add env_fallback for mso_argument_spec params
- - Add non existing template deletion test
- - Add test file for mso_schema_template
- - Add test file for site_bd_subnet
- - Bump module to v1.0.1
- - Extent mso_tenant test case coverage
- release_summary:
- "Release v1.0.1 of the ``cisco.mso`` collection on 2020-10-30.
+ - Add delete capability to mso_schema_site
+ - Add env_fallback for mso_argument_spec params
+ - Add non existing template deletion test
+ - Add test file for mso_schema_template
+ - Add test file for site_bd_subnet
+ - Bump module to v1.0.1
+ - Extent mso_tenant test case coverage
+ release_summary: 'Release v1.0.1 of the ``cisco.mso`` collection on 2020-10-30.
This changelog describes all changes made to the modules and plugins included
in this collection since v1.0.0.
- "
- release_date: "2020-10-30"
+ '
+ release_date: '2020-10-30'
1.1.0:
changes:
bugfixes:
- - Fix anp idempotency issue
- - Fix crash issue when using irrelevant site-template
- - Fix default value for mso_schema state parameter
- - Fix examples for mso_schema
- - Fix galaxy-importer check warnings
- - Fix issue on mso_schema_site_vrf_region_cidr_subnet to allow an AWS subnet
- to be used for a TGW Attachment (Hub Network)
- - Fix module name in example of mso_schema_site_vrf_region
- - Fix mso_backup upload issue
- - Fix sanity test error mso_schema_site_bd
- - Fix some coding standard and improvements to contributed mso_dhcp_relay modules
- and test files
- - Fix space in asssertion
- - Fix space in site_anp_epg_domain
- - Fix space in test file
- - Remove space from template name in all modules
- - Remove space in template name
+ - Fix anp idempotency issue
+ - Fix crash issue when using irrelevant site-template
+ - Fix default value for mso_schema state parameter
+ - Fix examples for mso_schema
+ - Fix galaxy-importer check warnings
+ - Fix issue on mso_schema_site_vrf_region_cidr_subnet to allow an AWS subnet
+ to be used for a TGW Attachment (Hub Network)
+ - Fix module name in example of mso_schema_site_vrf_region
+ - Fix mso_backup upload issue
+ - Fix sanity test error mso_schema_site_bd
+ - Fix some coding standard and improvements to contributed mso_dhcp_relay modules
+ and test files
+ - Fix space in asssertion
+ - Fix space in site_anp_epg_domain
+ - Fix space in test file
+ - Remove space from template name in all modules
+ - Remove space in template name
minor_changes:
- - Add DHCP Policy Operations
- - Add SVI MAC Addreess option in mso_schema_site_bd
- - Add additional test file to add tenant from templated payload file
- - Add attribute virtual_ip to mso_schema_site_bd_subnet
- - Add capability for restore and download backup
- - Add capability to upload backup
- - Add check for undeploy under MSO version
- - Add error handeling test file
- - Add error message to display when yaml has failed to load
- - Add galaxy-importer check
- - Add galaxy-importer config
- - Add mso_dhcp_option_policy and mso_dhcp_option_policy_option and test files
- - Add new module mso_rest and test case files to support GET api method
- - Add new options to template bd and updated test file
- - Add notes to use region_cidr module to create region
- - Add task to undeploy the template from the site
- - Add tasks in test file to remove templates for mso_schema_template_migrate
- - Add test case for schema removing
- - Add test cases to verify GET, PUT, POST and DELETE API methods for sites in
- mso_rest.py
- - Add test file for mso_schema
- - Add test file for mso_schema_template_anp
- - Add test file for region module
- - Add test files yaml_inline and yaml_string to support YAML
- - Add userAssociations to tenants to resolve CI issues
- - Addition of cloud setting for ext epg
- - Changes made to payload of mso_schema_template_external_epg
- - Changes to options in template bd
- - Check warning
- - Documentation Corrected
- - Force arp flood to be true when l2unkwunicast is flood
- - Make changes to display correct status code
- - Modify mso library and updated test file
- - Modify mso_rest test files to make PATCH available, and test other methods
- against schemas
- - Move options for subnet from mso to the template_bd_subnet module
- - Python lint corrected
- - Redirect log to both stdout and log.txt file & Check warnings and errors
- - Remove creation example in document of mso_schema_site_vrf_region
- - Remove present state from mso_schema module
- - Removed unused variable in mso_schema_site_vrf_region_hub_network
- - Test DHCP Policy Provider added
- - Test file for mso_dhcp_relay_policy added
- - Test file for template_bd_subnet and new option foe module
- release_summary:
- "Release v1.1.0 of the ``cisco.mso`` collection on 2021-01-20.
+ - Add DHCP Policy Operations
+ - Add SVI MAC Addreess option in mso_schema_site_bd
+ - Add additional test file to add tenant from templated payload file
+ - Add attribute virtual_ip to mso_schema_site_bd_subnet
+ - Add capability for restore and download backup
+ - Add capability to upload backup
+ - Add check for undeploy under MSO version
+ - Add error handeling test file
+ - Add error message to display when yaml has failed to load
+ - Add galaxy-importer check
+ - Add galaxy-importer config
+ - Add mso_dhcp_option_policy and mso_dhcp_option_policy_option and test files
+ - Add new module mso_rest and test case files to support GET api method
+ - Add new options to template bd and updated test file
+ - Add notes to use region_cidr module to create region
+ - Add task to undeploy the template from the site
+ - Add tasks in test file to remove templates for mso_schema_template_migrate
+ - Add test case for schema removing
+ - Add test cases to verify GET, PUT, POST and DELETE API methods for sites in
+ mso_rest.py
+ - Add test file for mso_schema
+ - Add test file for mso_schema_template_anp
+ - Add test file for region module
+ - Add test files yaml_inline and yaml_string to support YAML
+ - Add userAssociations to tenants to resolve CI issues
+ - Addition of cloud setting for ext epg
+ - Changes made to payload of mso_schema_template_external_epg
+ - Changes to options in template bd
+ - Check warning
+ - Documentation Corrected
+ - Force arp flood to be true when l2unkwunicast is flood
+ - Make changes to display correct status code
+ - Modify mso library and updated test file
+ - Modify mso_rest test files to make PATCH available, and test other methods
+ against schemas
+ - Move options for subnet from mso to the template_bd_subnet module
+ - Python lint corrected
+ - Redirect log to both stdout and log.txt file & Check warnings and errors
+ - Remove creation example in document of mso_schema_site_vrf_region
+ - Remove present state from mso_schema module
+ - Removed unused variable in mso_schema_site_vrf_region_hub_network
+ - Test DHCP Policy Provider added
+ - Test file for mso_dhcp_relay_policy added
+ - Test file for template_bd_subnet and new option foe module
+ release_summary: 'Release v1.1.0 of the ``cisco.mso`` collection on 2021-01-20.
This changelog describes all changes made to the modules and plugins included
in this collection since v1.0.1.
- "
- release_date: "2021-01-20"
+ '
+ release_date: '2021-01-20'
1.2.0:
changes:
bugfixes:
- - Add test case and small fixes to mso_schema_site_bd_l3out module
- - Fix documentation issues accross modules
- - Fix fail_json usage accross module_utils/mso.py
- - Fix mso_rest to support HTTPAPI plugin and tests to support ND platform
- - Fix mso_user to due to error in v1 API in MSO 3.2
- - Fix path issue in mso_schema_template_migrate
- - Fixes for site level external epgs and site level L3Outs
- - Fixes to support MSO 3.3
- - Remove query of all schemas to get schema ID and only query schema ID indentity
- list API
+ - Add test case and small fixes to mso_schema_site_bd_l3out module
+ - Fix documentation issues accross modules
+ - Fix fail_json usage accross module_utils/mso.py
+ - Fix mso_rest to support HTTPAPI plugin and tests to support ND platform
+ - Fix mso_user to due to error in v1 API in MSO 3.2
+ - Fix path issue in mso_schema_template_migrate
+ - Fixes for site level external epgs and site level L3Outs
+ - Fixes to support MSO 3.3
+ - Remove query of all schemas to get schema ID and only query schema ID indentity
+ list API
minor_changes:
- - Add Ansible common HTTPAPI dependancy in galaxy.yml
- - Add HTTPAPI connection plugin support and HTTPAPI MSO connection plugin
- - Add primary and unicast_routing attributes to mso_schema_template_bd
- - Add requirements.txt for Ansible Environment support
- - Add schema and template cloning modules mso_schema_clone and mso_schema_template_clone
- - Add support cisco.nd.nd connection plugin
- - Add support for multiple DCHP policies in a BD and new module mso_schema_template_bd_dhcp_policy
- - Upgrade CI to latest Ansible version and Python 3.8
- release_summary:
- "Release v1.2.0 of the ``cisco.mso`` collection on 2021-06-02.
+ - Add Ansible common HTTPAPI dependancy in galaxy.yml
+ - Add HTTPAPI connection plugin support and HTTPAPI MSO connection plugin
+ - Add primary and unicast_routing attributes to mso_schema_template_bd
+ - Add requirements.txt for Ansible Environment support
+ - Add schema and template cloning modules mso_schema_clone and mso_schema_template_clone
+ - Add support cisco.nd.nd connection plugin
+ - Add support for multiple DCHP policies in a BD and new module mso_schema_template_bd_dhcp_policy
+ - Upgrade CI to latest Ansible version and Python 3.8
+ release_summary: 'Release v1.2.0 of the ``cisco.mso`` collection on 2021-06-02.
This changelog describes all changes made to the modules and plugins included
in this collection since v1.1.0.
- "
+ '
plugins:
httpapi:
- - description: MSO Ansible HTTPAPI Plugin.
- name: mso
- namespace: null
- release_date: "2021-06-02"
+ - description: MSO Ansible HTTPAPI Plugin.
+ name: mso
+ namespace: null
+ release_date: '2021-06-02'
1.3.0:
changes:
bugfixes:
- - Add no_log to aws_access_key and secret_key in mso_tenant_site
- - Fix MSO HTTP API to work without host, user and password module attribute
- - Fix issue with unicast_routing idemptotency in mso_schema_template_bd
- - Fix mso_schema_site_anp and mso_schema_site_anp_epg idempotency issue
- - Remove sanity ignore files and fix sanity issues that were previously ignored
+ - Add no_log to aws_access_key and secret_key in mso_tenant_site
+ - Fix MSO HTTP API to work without host, user and password module attribute
+ - Fix issue with unicast_routing idemptotency in mso_schema_template_bd
+ - Fix mso_schema_site_anp and mso_schema_site_anp_epg idempotency issue
+ - Remove sanity ignore files and fix sanity issues that were previously ignored
minor_changes:
- - Add container_overlay and underlay_context_profile support to mso_schema_site_vrf_region
- - Add description support to various modules
- - Add hosted_vrf support to mso_schema_site_vrf_region_cidr_subnet
- - Add module mso_schema_validate to check schema validations
- - Add private_link_label support to mso_schema_site_anp_epg and mso_schema_site_vrf_region_cidr_subnet
- - Add qos_level and Service EPG support to mso_schema_template_anp_epg
- - Add qos_level, action and priority support to mso_schema_template_contract_filter
- - Add schema and template description support to mso_schema_template
- - Add subnet as primary support to mso_schema_template_bd_subnet
- - Add support for automatically creating anp structure at site level when using
- mso_schema_site_anp_epg
- - Add support for encap-flood as multi_destination_flooding in mso_schema_template_bd
- - Add test file for mso_schema_site_anp, mso_schema_site_anp_epg, mso_schema_template_external_epg_subnet
- mso_schema_template_filter_entry
- - Improve scope attribute documentation in mso_schema_template_external_epg_subnet
- - Update Ansible version used in automated testing to v2.9.27, v2.10.16 and
- addition of v2.11.7 and v2.12.1
- release_summary:
- "Release v1.3.0 of the ``cisco.mso`` collection on 2021-12-18.
+ - Add container_overlay and underlay_context_profile support to mso_schema_site_vrf_region
+ - Add description support to various modules
+ - Add hosted_vrf support to mso_schema_site_vrf_region_cidr_subnet
+ - Add module mso_schema_validate to check schema validations
+ - Add private_link_label support to mso_schema_site_anp_epg and mso_schema_site_vrf_region_cidr_subnet
+ - Add qos_level and Service EPG support to mso_schema_template_anp_epg
+ - Add qos_level, action and priority support to mso_schema_template_contract_filter
+ - Add schema and template description support to mso_schema_template
+ - Add subnet as primary support to mso_schema_template_bd_subnet
+ - Add support for automatically creating anp structure at site level when using
+ mso_schema_site_anp_epg
+ - Add support for encap-flood as multi_destination_flooding in mso_schema_template_bd
+ - Add test file for mso_schema_site_anp, mso_schema_site_anp_epg, mso_schema_template_external_epg_subnet
+ mso_schema_template_filter_entry
+ - Improve scope attribute documentation in mso_schema_template_external_epg_subnet
+ - Update Ansible version used in automated testing to v2.9.27, v2.10.16 and
+ addition of v2.11.7 and v2.12.1
+ release_summary: 'Release v1.3.0 of the ``cisco.mso`` collection on 2021-12-18.
This changelog describes all changes made to the modules and plugins included
in this collection since v1.2.0.
- "
- release_date: "2021-12-18"
+ '
+ release_date: '2021-12-18'
1.4.0:
changes:
bugfixes:
- - Fix arp_entry value issue in mso_schema_template_filter_entry
- - Fix mso_schema_site_anp idempotency when children exists
- - Fix use_ssl documentation to explain usage when used with HTTPAPI connection
- plugin
+ - Fix arp_entry value issue in mso_schema_template_filter_entry
+ - Fix mso_schema_site_anp idempotency when children exists
+ - Fix use_ssl documentation to explain usage when used with HTTPAPI connection
+ plugin
minor_changes:
- - Update mso_schema_template_clone to use new method from NDO and unrestrict
- it to earlier version
- release_summary:
- "Release v1.4.0 of the ``ansible-mso`` collection on 2022-03-15.
+ - Update mso_schema_template_clone to use new method from NDO and unrestrict
+ it to earlier version
+ release_summary: 'Release v1.4.0 of the ``ansible-mso`` collection on 2022-03-15.
This changelog describes all changes made to the modules and plugins included
in this collection since v1.3.0.
- "
- release_date: "2022-03-15"
+ '
+ release_date: '2022-03-15'
2.1.0:
changes:
bugfixes:
- - Fix time issue when host running ansible is in a different timezone then NDO
- - Remove mso_guide from notes
+ - Fix time issue when host running ansible is in a different timezone then NDO
+ - Remove mso_guide from notes
deprecated_features:
- - The mso_schema_template_contract_filter contract_filter_type attribute is
- deprecated. The value is now deduced from filter_type.
+ - The mso_schema_template_contract_filter contract_filter_type attribute is
+ deprecated. The value is now deduced from filter_type.
minor_changes:
- - Add aci_remote_location module (#259)
- - Add mso_backup_schedule module (#250)
- - Add mso_chema_template_contract_service_graph module (#257)
- - Add mso_schema_template_service_graph, mso_schema_site_service_graph and mso_service_node_type
- modules (#243)
- - Add primary attribute to mso_schema_site_bd_subnet (#254)
- release_summary:
- "Release v2.1.0 of the ``ansible-mso`` collection on 2022-10-14.
+ - Add aci_remote_location module (#259)
+ - Add mso_backup_schedule module (#250)
+ - Add mso_chema_template_contract_service_graph module (#257)
+ - Add mso_schema_template_service_graph, mso_schema_site_service_graph and mso_service_node_type
+ modules (#243)
+ - Add primary attribute to mso_schema_site_bd_subnet (#254)
+ release_summary: 'Release v2.1.0 of the ``ansible-mso`` collection on 2022-10-14.
This changelog describes all changes made to the modules and plugins included
in this collection since v1.4.0.
@@ -336,97 +329,126 @@ releases:
The version was bumped directly to 2.1.0 due to a previous collection upload
issue on galaxy.
- "
- release_date: "2022-10-14"
+ '
+ release_date: '2022-10-14'
2.2.0:
changes:
bugfixes:
- - Fix MSO HTTPAPI plugin login domain issue (#317)
- - Fix deploymentImmediacy key inconsistency in the API used by mso_schema_site_anp
- and mso_schema_site_anp_epg (#283)
- - Fix mso_schema_template_bd issue when created with unicast_routing as false
- (#278)
- - Fix to be able to add multiple filter and filters with "-" in their names
- (#306)
+ - Fix MSO HTTPAPI plugin login domain issue (#317)
+ - Fix deploymentImmediacy key inconsistency in the API used by mso_schema_site_anp
+ and mso_schema_site_anp_epg (#283)
+ - Fix mso_schema_template_bd issue when created with unicast_routing as false
+ (#278)
+ - Fix to be able to add multiple filter and filters with "-" in their names
+ (#306)
minor_changes:
- - Add automatic creation of site bd when not existing in mso_schema_site_bd_subnet
- module (#263)
- - Add automatic schema validation functionality to mso_schema_template_deploy
- and ndo_schema_template_deploy (#318)
- - Add ndo_schema_template_deploy to support NDO 4+ deploy functionality (#305)
- - Add support for l3out from different template or schema in mso_schema_site_bd_l3out
- (#304)
- - Add support for orchestrator_only attribute for mso_tenant with state absent
- (#268)
- release_summary:
- "Release v2.2.0 of the ``ansible-mso`` collection on 2023-01-29.
+ - Add automatic creation of site bd when not existing in mso_schema_site_bd_subnet
+ module (#263)
+ - Add automatic schema validation functionality to mso_schema_template_deploy
+ and ndo_schema_template_deploy (#318)
+ - Add ndo_schema_template_deploy to support NDO 4+ deploy functionality (#305)
+ - Add support for l3out from different template or schema in mso_schema_site_bd_l3out
+ (#304)
+ - Add support for orchestrator_only attribute for mso_tenant with state absent
+ (#268)
+ release_summary: 'Release v2.2.0 of the ``ansible-mso`` collection on 2023-01-29.
This changelog describes all changes made to the modules and plugins included
in this collection since v2.1.0.
- "
- release_date: "2023-01-29"
+ '
+ release_date: '2023-01-29'
2.2.1:
changes:
bugfixes:
- - Fix datetime support for python2.7 in mso_backup_schedule (#323)
- release_summary:
- "Release v2.2.1 of the ``ansible-mso`` collection on 2023-01-31.
+ - Fix datetime support for python2.7 in mso_backup_schedule (#323)
+ release_summary: 'Release v2.2.1 of the ``ansible-mso`` collection on 2023-01-31.
This changelog describes all changes made to the modules and plugins included
in this collection since v2.2.0.
- "
- release_date: "2023-01-31"
+ '
+ release_date: '2023-01-31'
2.3.0:
changes:
bugfixes:
- - Fix idempotency for mso_schema_site_bd_l3out
+ - Fix idempotency for mso_schema_site_bd_l3out
minor_changes:
- - Add module mso_schema_site_anp_epg_bulk_staticport (#330)
- - Add route_reachability attribute to mso_schema_site_external_epg module (#335)
- release_summary:
- "Release v2.3.0 of the ``ansible-mso`` collection on 2023-03-30.
+ - Add module mso_schema_site_anp_epg_bulk_staticport (#330)
+ - Add route_reachability attribute to mso_schema_site_external_epg module (#335)
+ release_summary: 'Release v2.3.0 of the ``ansible-mso`` collection on 2023-03-30.
This changelog describes all changes made to the modules and plugins included
in this collection since v2.2.1.
- "
- release_date: "2023-03-30"
+ '
+ release_date: '2023-03-30'
2.4.0:
changes:
bugfixes:
- - Add attributes to payload for changed schema behaviour of deploymentImmediacy
- (deployImmediacy) and vmmDomainProperties (properties at domain level in payload)
- (#362)
- - Fix mso_backup for NDO and ND-based MSO v3.2+ (#333)
- - Fix validation condition for path in mso_schema_site_anp_epg_bulk_staticport
- module (#360)
+ - Add attributes to payload for changed schema behaviour of deploymentImmediacy
+ (deployImmediacy) and vmmDomainProperties (properties at domain level in payload)
+ (#362)
+ - Fix mso_backup for NDO and ND-based MSO v3.2+ (#333)
+ - Fix validation condition for path in mso_schema_site_anp_epg_bulk_staticport
+ module (#360)
minor_changes:
- - Add ip_data_plane_learning and preferred_group arguments to mso_schema_template_vrf
- module (#358)
- release_summary:
- "Release v2.4.0 of the ``ansible-mso`` collection on 2023-04-19.
+ - Add ip_data_plane_learning and preferred_group arguments to mso_schema_template_vrf
+ module (#358)
+ release_summary: 'Release v2.4.0 of the ``ansible-mso`` collection on 2023-04-19.
This changelog describes all changes made to the modules and plugins included
in this collection since v2.3.0.
- "
- release_date: "2023-04-19"
+ '
+ release_date: '2023-04-19'
2.5.0:
changes:
bugfixes:
- - Fix mso_tenant_site "site not found" issue on absent (#368)
+ - Fix mso_tenant_site "site not found" issue on absent (#368)
minor_changes:
- - Add login domain attribute to mso httpapi connection plugin with restructure
- of connection parameter handling
- - Add mso_schema_template_anp_epg_useg_attribute and mso_schema_site_anp_epg_useg_attribute
- modules to manage EPG uSeg attributes (#370)
- release_summary:
- "Release v2.5.0 of the ``ansible-mso`` collection on 2023-08-04.
+ - Add login domain attribute to mso httpapi connection plugin with restructure
+ of connection parameter handling
+ - Add mso_schema_template_anp_epg_useg_attribute and mso_schema_site_anp_epg_useg_attribute
+ modules to manage EPG uSeg attributes (#370)
+ release_summary: 'Release v2.5.0 of the ``ansible-mso`` collection on 2023-08-04.
This changelog describes all changes made to the modules and plugins included
in this collection since v2.4.0.
- "
- release_date: "2023-08-04"
+ '
+ release_date: '2023-08-04'
+ 2.6.0:
+ changes:
+ bugfixes:
+ - Fix TypeError for iteration on NoneType in mso_schema_template
+ - Fixed the useg_subnet logic in mso_schema_template_anp_epg_useg_attribute
+ minor_changes:
+ - Add Azure Cloud site support to mso_schema_site_contract_service_graph
+ - Add Azure Cloud site support to mso_schema_site_service_graph
+ - Add functionality to resolve same name in remote and local user.
+ - Add l3out_template and l3out_schema arguments to mso_schema_site_external_epg
+ (#394)
+ - Add mso_schema_site_contract_service_graph module to manage site contract
+ service graph
+ - Add mso_schema_site_contract_service_graph_listener module to manage Azure
+ site contract service graph listeners and update other modules
+ - Add new parameter remote_user to add multiple remote users associated with
+ multiple login domains
+ - Add support for replacing all existing contracts with new provided contracts
+ in a single operation with one request and adding/removing multiple contracts
+ in multiple operations with a single request in mso_schema_template_anp_epg_contract
+ module
+ - Add support for replacing all existing static ports with new provided static
+ ports in a single operation with one request and adding/removing multiple
+ static ports in multiple operations with a single request in mso_schema_template_anp_epg_staticport
+ module
+ - Add support for required attributes introduced in NDO 4.2 for mso_schema_site_anp_epg_domain
+ - Support for creation of schemas without templates with the mso_schema module
+ release_summary: 'Release v2.6.0 of the ``ansible-mso`` collection on 2024-04-06.
+
+ This changelog describes all changes made to the modules and plugins included
+ in this collection since v2.5.0.
+
+ '
+ release_date: '2024-04-06'
diff --git a/ansible_collections/cisco/mso/meta/runtime.yml b/ansible_collections/cisco/mso/meta/runtime.yml
index 9aeca0a48..9e42ab404 100644
--- a/ansible_collections/cisco/mso/meta/runtime.yml
+++ b/ansible_collections/cisco/mso/meta/runtime.yml
@@ -1,9 +1,14 @@
---
-requires_ansible: '>=2.9.10'
+requires_ansible: '>=2.14.0'
plugin_routing:
modules:
mso_schema_template_externalepg:
redirect: cisco.mso.mso_schema_template_external_epg
+ mso_schema_site_anp_epg_bulk_staticport:
+ deprecation:
+ removal_version: 3.0.0
+ warning_text: Use M(cisco.mso.mso_schema_site_anp_epg_staticport) with O(force_replace=true)
+ instead.
action_groups:
mso:
- mso_backup
@@ -31,6 +36,8 @@ action_groups:
- mso_schema_site_bd
- mso_schema_site_bd_l3out
- mso_schema_site_bd_subnet
+ - mso_schema_site_contract_service_graph
+ - mso_schema_site_contract_service_graph_listener
- mso_schema_site_external_epg
- mso_schema_site_external_epg_selector
- mso_schema_site_l3out
@@ -101,6 +108,8 @@ action_groups:
- mso_schema_site_bd
- mso_schema_site_bd_l3out
- mso_schema_site_bd_subnet
+ - mso_schema_site_contract_service_graph
+ - mso_schema_site_contract_service_graph_listener
- mso_schema_site_external_epg
- mso_schema_site_external_epg_selector
- mso_schema_site_l3out
diff --git a/ansible_collections/cisco/mso/plugins/module_utils/constants.py b/ansible_collections/cisco/mso/plugins/module_utils/constants.py
index 2f3e0d472..ff08019df 100644
--- a/ansible_collections/cisco/mso/plugins/module_utils/constants.py
+++ b/ansible_collections/cisco/mso/plugins/module_utils/constants.py
@@ -16,7 +16,7 @@ SERVICE_NODE_CONNECTOR_MAP = {
# 'external_epg': {'id': 'externalEpg', 'connector_type': 'route-peering'}
}
-YES_OR_NO_TO_BOOL_STRING_MAP = {"yes": "true", "no": "false"}
+YES_OR_NO_TO_BOOL_STRING_MAP = {"yes": "true", "no": "false", True: "yes", False: "no"}
NDO_4_UNIQUE_IDENTIFIERS = ["templateID", "autoRouteTargetImport", "autoRouteTargetExport"]
@@ -38,3 +38,40 @@ EPG_U_SEG_ATTR_TYPE_MAP = {
}
EPG_U_SEG_ATTR_OPERATOR_LIST = ["equals", "contains", "starts_with", "ends_with"]
+
+AZURE_L4L7_CONNECTOR_TYPE_MAP = {
+ "none": "none",
+ "redirect": "redir",
+ "source_nat": "snat",
+ "destination_nat": "dnat",
+ "source_and_destination_nat": "snat_dnat",
+}
+
+LISTENER_PROTOCOLS = ["http", "https", "tcp", "udp", "tls", "inherit"]
+
+LISTENER_SECURITY_POLICY_MAP = {
+ "default": "default",
+ "elb_sec_2016_18": "eLBSecurityPolicy-2016-08",
+ "elb_sec_fs_2018_06": "eLBSecurityPolicy-FS-2018-06",
+ "elb_sec_tls_1_2_2017_01": "eLBSecurityPolicy-TLS-1-2-2017-01",
+ "elb_sec_tls_1_2_ext_2018_06": "eLBSecurityPolicy-TLS-1-2-Ext-2018-06",
+ "elb_sec_tls_1_1_2017_01": "eLBSecurityPolicy-TLS-1-1-2017-01",
+ "elb_sec_2015_05": "eLBSecurityPolicy-2015-05",
+ "elb_sec_tls_1_0_2015_04": "eLBSecurityPolicy-TLS-1-0-2015-04",
+ "app_gw_ssl_default": "AppGwSslPolicyDefault",
+ "app_gw_ssl_2015_501": "AppGwSslPolicy20150501",
+ "app_gw_ssl_2017_401": "AppGwSslPolicy20170401",
+ "app_gw_ssl_2017_401s": "AppGwSslPolicy20170401S",
+}
+
+LISTENER_ACTION_TYPE_MAP = {"fixed_response": "fixedResponse", "forward": "forward", "redirect": "redirect", "ha_port": "haPort"}
+
+LISTENER_CONTENT_TYPE_MAP = {"text_plain": "textPlain", "text_css": "textCSS", "text_html": "textHtml", "app_js": "appJS", "app_json": "appJson"}
+
+LISTENER_REDIRECT_CODE_MAP = {
+ "unknown": "unknown",
+ "permanently_moved": "permMoved",
+ "found": "found",
+ "see_other": "seeOther",
+ "temporary_redirect": "temporary",
+}
diff --git a/ansible_collections/cisco/mso/plugins/module_utils/mso.py b/ansible_collections/cisco/mso/plugins/module_utils/mso.py
index 4bc9053ef..0f346d79b 100644
--- a/ansible_collections/cisco/mso/plugins/module_utils/mso.py
+++ b/ansible_collections/cisco/mso/plugins/module_utils/mso.py
@@ -22,7 +22,16 @@ from ansible.module_utils.six.moves.urllib.parse import urlencode, urljoin
from ansible.module_utils.urls import fetch_url
from ansible.module_utils._text import to_native, to_text
from ansible.module_utils.connection import Connection
-from ansible_collections.cisco.mso.plugins.module_utils.constants import NDO_API_VERSION_PATH_FORMAT
+from ansible_collections.cisco.mso.plugins.module_utils.constants import (
+ NDO_API_VERSION_PATH_FORMAT,
+ AZURE_L4L7_CONNECTOR_TYPE_MAP,
+ LISTENER_REDIRECT_CODE_MAP,
+ LISTENER_CONTENT_TYPE_MAP,
+ LISTENER_ACTION_TYPE_MAP,
+ LISTENER_PROTOCOLS,
+)
+from ansible_collections.cisco.nd.plugins.module_utils.nd import NDModule
+
try:
from requests_toolbelt.multipart.encoder import MultipartEncoder
@@ -50,7 +59,7 @@ def issubset(subset, superset):
return True
# Both objects have a different type
- if type(subset) != type(superset):
+ if type(subset) is not type(superset):
return False
for key, value in subset.items():
@@ -205,7 +214,11 @@ def mso_service_graph_node_spec():
def mso_service_graph_node_device_spec():
return dict(
- name=dict(type="str", required=True),
+ device_name=dict(type="str", aliases=["name"], required=True),
+ provider_connector_type=dict(type="str", choices=list(AZURE_L4L7_CONNECTOR_TYPE_MAP.keys())),
+ provider_interface=dict(type="str"),
+ consumer_connector_type=dict(type="str", choices=["none", "redirect"]),
+ consumer_interface=dict(type="str"),
)
@@ -239,6 +252,13 @@ def mso_site_anp_epg_bulk_staticport_spec():
)
+def ndo_remote_user_spec():
+ return dict(
+ name=dict(type="str", required=True),
+ login_domain=dict(type="str", required=True),
+ )
+
+
# Copied from ansible's module uri.py (url): https://github.com/ansible/ansible/blob/cdf62edc65f564fff6b7e575e084026fa7faa409/lib/ansible/modules/uri.py
def write_file(module, url, dest, content, resp, tmpsrc=None):
# create a tempfile with some test content
@@ -321,6 +341,8 @@ class MSOModule(object):
self.status = None
self.url = None
self.httpapi_logs = list()
+ self.site_type = None # on-premise or cloud
+ self.cloud_provider_type = None # aws or azure or gcp
if self.module._debug:
self.module.warn("Enable debug output because ANSIBLE_DEBUG was set.")
@@ -845,6 +867,13 @@ class MSOModule(object):
ids.append(dict(roleId=r.get("id"), accessType=access_type))
return ids
+ def lookup_site_type(self, site_data):
+ """Get site type(AWS, AZURE or physical)"""
+ site_type = site_data.get("platform")
+ if site_type == "cloud":
+ self.cloud_provider_type = site_data.get("cloudProviders")[0]
+ self.site_type = site_type
+
def lookup_site(self, site, ignore_not_found_error=False):
"""Look up a site and return its id"""
if site is None:
@@ -858,6 +887,8 @@ class MSOModule(object):
return None
if "id" not in s:
self.fail_json(msg="Site lookup failed for site '{0}': {1}".format(site, s))
+
+ self.lookup_site_type(s)
return s.get("id")
def lookup_sites(self, sites, ignore_not_found_error=False):
@@ -916,26 +947,65 @@ class MSOModule(object):
users.append("admin")
ids = []
+ if self.platform == "nd":
+ nd = NDModule(self.module)
+ remote_users = nd.request("/nexus/infra/api/aaa/v4/remoteusers", method="GET")
+ local_users = nd.request("/nexus/infra/api/aaa/v4/localusers", method="GET")
+
for user in users:
+ user_dict = dict()
if self.platform == "nd":
- u = self.get_obj("users", loginID=user, api_version="v2")
+ user_dict = self.get_user_from_list_of_users(user, local_users)
+ if user_dict is None:
+ user_dict = self.get_user_from_list_of_users(user, remote_users)
else:
- u = self.get_obj("users", username=user)
- if not u and not ignore_not_found_error:
+ user_dict = self.get_obj("users", username=user)
+ if not user_dict and not ignore_not_found_error:
self.fail_json(msg="User '{0}' is not a valid user name.".format(user))
- elif (not u or "id" not in u) and ignore_not_found_error:
+ elif (not user_dict or "id" not in user_dict) and ignore_not_found_error:
self.module.warn("User '{0}' is not a valid user name.".format(user))
return ids
- if "id" not in u:
- if "userID" not in u:
- self.fail_json(msg="User lookup failed for user '{0}': {1}".format(user, u))
- id = dict(userId=u.get("userID"))
+ if "id" not in user_dict:
+ if "userID" not in user_dict:
+ self.fail_json(msg="User lookup failed for user '{0}': {1}".format(user, user_dict))
+ id = dict(userId=user_dict.get("userID"))
else:
- id = dict(userId=u.get("id"))
+ id = dict(userId=user_dict.get("id"))
if id in ids:
self.fail_json(msg="User '{0}' is duplicate.".format(user))
ids.append(id)
+ return ids
+ def get_user_from_list_of_users(self, user_name, list_of_users, login_domain=""):
+ """Get user from list of users"""
+ for user in list_of_users.get("items"):
+ if user.get("spec").get("loginID") == user_name and (login_domain == "" or user.get("spec").get("loginDomain") == login_domain):
+ return user.get("spec")
+ return None
+
+ def lookup_remote_users(self, remote_users, ignore_not_found_error=False):
+ ids = []
+ if self.platform == "nd":
+ nd = NDModule(self.module)
+ remote_users_data = nd.request("/nexus/infra/api/aaa/v4/remoteusers", method="GET")
+ for remote_user in remote_users:
+ user_dict = dict()
+ if self.platform == "nd":
+ user_dict = self.get_user_from_list_of_users(remote_user.get("name"), remote_users_data, remote_user.get("login_domain"))
+ if not user_dict and not ignore_not_found_error:
+ self.fail_json(msg="User '{0}' is not a valid user name.".format(remote_user.get("name")))
+ elif (not user_dict or "id" not in user_dict) and ignore_not_found_error:
+ self.module.warn("User '{0}' is not a valid user name.".format(remote_user.get("name")))
+ return ids
+ if "id" not in user_dict:
+ if "userID" not in user_dict:
+ self.fail_json(msg="User lookup failed for user '{0}': {1}".format(remote_user.get("name"), user_dict))
+ id = dict(userId=user_dict.get("userID"))
+ else:
+ id = dict(userId=user_dict.get("id"))
+ if id in ids:
+ self.fail_json(msg="User '{0}' is duplicate.".format(remote_user.get("name")))
+ ids.append(id)
return ids
def create_label(self, label, label_type):
@@ -1112,7 +1182,7 @@ class MSOModule(object):
"""Create a DHCP policy from input"""
if data is None:
return None
- if type(data) == list:
+ if isinstance(data, list):
dhcps = []
for dhcp in data:
if "dhcp_option_policy" in dhcp:
@@ -1330,6 +1400,9 @@ class MSOModule(object):
return node_objs
def lookup_service_node_device(self, site_id, tenant, device_name=None, service_node_type=None, ignore_not_found_error=False):
+ if self.site_type == "cloud":
+ tenant = "{0}/{1}".format(tenant, self.site_type)
+
if service_node_type is None:
node_devices = self.query_objs("sites/{0}/aci/tenants/{1}/devices".format(site_id, tenant), key="devices")
else:
@@ -1393,3 +1466,121 @@ class MSOModule(object):
def validate_schema(self, schema_id):
return self.request("schemas/{id}/validate".format(id=schema_id), method="GET")
+
+ def input_validation(self, attr_name, attr_value, required_attributes, target_object, object_position=None, object_name=None):
+ if attr_name in (None, "") or attr_value in (None, ""):
+ self.module.fail_json(msg="The attribute and value must be set")
+
+ empty_attributes = [attribute for attribute in required_attributes if target_object.get(attribute) in (None, "", [], {}, 0)]
+
+ if object_position is not None and object_name is not None and empty_attributes:
+ self.module.fail_json(
+ msg="When the '{0}' is '{1}', the {2} attributes must be set at the object position: {3} and the object name: {4}".format(
+ attr_name, attr_value, empty_attributes, object_position, object_name
+ )
+ )
+ elif object_position is not None and object_name is None and empty_attributes:
+ self.module.fail_json(
+ msg="When the '{0}' is '{1}', the {2} attributes must be set at the object position: {3}".format(
+ attr_name, attr_value, empty_attributes, object_position
+ )
+ )
+ elif object_position is None and object_name is not None and empty_attributes:
+ self.module.fail_json(
+ msg="When the '{0}' is '{1}', the {2} attributes must be set and the object name: {3}".format(
+ attr_name, attr_value, empty_attributes, object_name
+ )
+ )
+ elif empty_attributes:
+ self.module.fail_json(msg="When the '{0}' is '{1}', the {2} attributes must be set".format(attr_name, attr_value, empty_attributes))
+
+
+def service_node_ref_str_to_dict(serviceNodeRefStr):
+ serviceNodeRefTokens = serviceNodeRefStr.split("/")
+ return dict(
+ schemaId=serviceNodeRefTokens[2],
+ serviceGraphName=serviceNodeRefTokens[6],
+ serviceNodeName=serviceNodeRefTokens[8],
+ templateName=serviceNodeRefTokens[4],
+ )
+
+
+def mso_schema_site_contract_service_graph_spec():
+ return dict(
+ cluster_interface_device=dict(type="str", required=True, aliases=["cluster_device", "device", "device_name"]),
+ provider_connector_cluster_interface=dict(
+ type="str", required=True, aliases=["provider_cluster_interface", "provider_interface", "provider_interface_name"]
+ ),
+ provider_connector_redirect_policy_tenant=dict(type="str", aliases=["provider_redirect_policy_tenant", "provider_tenant"]),
+ provider_connector_redirect_policy=dict(type="str", aliases=["provider_redirect_policy", "provider_policy"]),
+ consumer_connector_cluster_interface=dict(
+ type="str", required=True, aliases=["consumer_cluster_interface", "consumer_interface", "consumer_interface_name"]
+ ),
+ consumer_connector_redirect_policy_tenant=dict(type="str", aliases=["consumer_redirect_policy_tenant", "consumer_tenant"]),
+ consumer_connector_redirect_policy=dict(type="str", aliases=["consumer_redirect_policy", "consumer_policy"]),
+ consumer_subnet_ips=dict(type="list", elements="str"),
+ )
+
+
+def listener_ssl_certificates_spec():
+ return dict(
+ name=dict(type="str", required=True),
+ certificate_store=dict(type="str", choices=["default", "iam", "acm"], required=True),
+ )
+
+
+def listener_rules_provider_epg_ref_spec():
+ return dict(
+ schema=dict(type="str"),
+ template=dict(type="str"),
+ anp_name=dict(type="str", required=True, aliases=["anp"]),
+ epg_name=dict(type="str", required=True, aliases=["epg"]),
+ )
+
+
+def listener_rules_health_check_spec():
+ return dict(
+ port=dict(type="int"),
+ protocol=dict(type="str", choices=LISTENER_PROTOCOLS),
+ path=dict(type="str"),
+ interval=dict(type="int"),
+ timeout=dict(type="int"),
+ unhealthy_threshold=dict(type="int"),
+ use_host_from_rule=dict(type="bool"),
+ success_code=dict(type="str"),
+ host=dict(type="str"),
+ )
+
+
+def listener_rules_spec():
+ return dict(
+ name=dict(type="str", required=True),
+ floating_ip=dict(type="str"),
+ priority=dict(type="int", required=True),
+ host=dict(type="str"),
+ path=dict(type="str"),
+ action=dict(type="str"),
+ action_type=dict(type="str", required=True, choices=list(LISTENER_ACTION_TYPE_MAP)),
+ content_type=dict(type="str", choices=list(LISTENER_CONTENT_TYPE_MAP)),
+ port=dict(type="int"),
+ protocol=dict(type="str", choices=LISTENER_PROTOCOLS),
+ provider_epg=dict(
+ type="dict",
+ options=listener_rules_provider_epg_ref_spec(),
+ ),
+ url_type=dict(type="str", choices=["original", "custom"]),
+ custom_url=dict(type="str"),
+ redirect_host_name=dict(type="str"),
+ redirect_path=dict(type="str"),
+ redirect_query=dict(type="str"),
+ response_code=dict(type="str"),
+ response_body=dict(type="str"),
+ redirect_protocol=dict(type="str", choices=LISTENER_PROTOCOLS),
+ redirect_port=dict(type="int"),
+ redirect_code=dict(type="str", choices=list(LISTENER_REDIRECT_CODE_MAP)),
+ health_check=dict(
+ type="dict",
+ options=listener_rules_health_check_spec(),
+ ),
+ target_ip_type=dict(type="str", choices=["unspecified", "primary", "secondary"]),
+ )
diff --git a/ansible_collections/cisco/mso/plugins/module_utils/schema.py b/ansible_collections/cisco/mso/plugins/module_utils/schema.py
index ce1bd36c7..75da0d1de 100644
--- a/ansible_collections/cisco/mso/plugins/module_utils/schema.py
+++ b/ansible_collections/cisco/mso/plugins/module_utils/schema.py
@@ -112,6 +112,24 @@ class MSOSchema:
self.mso.fail_json(msg=msg)
self.schema_objects["template_anp_epg"] = match
+ def set_template_anp_epg_contract(self, contract_ref, relation_type, fail_module=True):
+ """
+ Get template endpoint group contract item that matches the reference and type of an contract.
+ :param contract_ref: Reference of the contract to match. -> Str
+ :param relation_type: Relation_type of the contract to match. -> Str
+ :param fail_module: When match is not found fail the ansible module. -> Bool
+ :return: Template epg item. -> Item(Int, Dict) | None
+ """
+ self.validate_schema_objects_present(["template_anp_epg"])
+ kv_list = [KVPair("contractRef", contract_ref), KVPair("relationshipType", relation_type)]
+ match, existing = self.get_object_from_list(self.schema_objects["template_anp_epg"].details.get("contractRelationships"), kv_list)
+ if not match and fail_module:
+ msg = "Provided Contract Reference '{0}' with type '{1}' not matching existing contacts(s): {2}".format(
+ contract_ref, relation_type, ", ".join(existing)
+ )
+ self.mso.fail_json(msg=msg)
+ self.schema_objects["template_anp_epg_contract"] = match
+
def set_template_anp_epg_useg_attr(self, useg_attr, fail_module=True):
"""
Get template endpoint group item that matches the name of an EPG uSeg Attribute.
@@ -237,3 +255,60 @@ class MSOSchema:
msg = "Provided Site uSeg Attribute '{0}' does not match the existing Site uSeg Attribute(s): {1}".format(useg_attr, ", ".join(existing))
self.mso.fail_json(msg=msg)
self.schema_objects["site_anp_epg_useg_attribute"] = match
+
+ def set_site_contract(self, contract_name, fail_module=True):
+ """
+ Get site contract item that matches the name of a contract.
+ :param contract_name: Name of the contract to match. -> Str
+ :param fail_module: When match is not found fail the ansible module. -> Bool
+ :return: Site contract item. -> Item(Int, Dict) | None
+ """
+ self.validate_schema_objects_present(["template", "site"])
+ kv_list = [
+ KVPair(
+ "contractRef", self.mso.contract_ref(schema_id=self.id, template=self.schema_objects["template"].details.get("name"), contract=contract_name)
+ )
+ ]
+ match, existing = self.get_object_from_list(self.schema_objects["site"].details.get("contracts"), kv_list)
+ if not match and fail_module:
+ msg = "Provided Contract '{0}' not matching existing site contract(s): {1}".format(contract_name, ", ".join(existing))
+ self.mso.fail_json(msg=msg)
+ self.schema_objects["site_contract"] = match
+
+ def set_site_service_graph(self, site_service_graph, fail_module=True):
+ """
+ Get site item that matches the name of a service graph.
+ :param service_graph: Name of the service graph to match. -> Str
+ :param fail_module: When match is not found fail the ansible module. -> Bool
+ :return: Site service graph item. -> Item(Int, Dict) | None
+ """
+ self.validate_schema_objects_present(["template", "site"])
+
+ kv_list = [
+ KVPair(
+ "serviceGraphRef",
+ self.mso.service_graph_ref(schema_id=self.id, template=self.schema_objects["template"].details.get("name"), service_graph=site_service_graph),
+ )
+ ]
+
+ site_service_graph = self.schema_objects["site"].details.get("serviceGraphs")
+ match, existing = self.get_object_from_list(site_service_graph, kv_list)
+ if not match and fail_module:
+ msg = "Provided Site Service Graph '{0}' not matching existing site service graph(s): {1}".format(site_service_graph, ", ".join(existing))
+ self.mso.fail_json(msg=msg)
+ self.schema_objects["site_service_graph"] = match
+
+ def set_site_anp_epg_static_port(self, path, fail_module=True):
+ """
+ Get site anp epg static port path item that matches the path of Static Port.
+ :param path: Path of the Static Port to match. -> Str
+ :param fail_module: When match is not found fail the ansible module. -> Bool
+ :return: Site anp epg item. -> Item(Int, Dict) | None
+ """
+ self.validate_schema_objects_present(["site_anp_epg"])
+ kv_list = [KVPair("path", path)]
+ match, existing = self.get_object_from_list(self.schema_objects["site_anp_epg"].details.get("staticPorts"), kv_list)
+ if not match and fail_module:
+ msg = "Provided Static Port Path '{0}' not matching existing static port path(s): {1}".format(path, ", ".join(existing))
+ self.mso.fail_json(msg=msg)
+ self.schema_objects["site_anp_epg_static_port"] = match
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_backup.py b/ansible_collections/cisco/mso/plugins/modules/mso_backup.py
index fc2564b82..d7ceab4fb 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_backup.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_backup.py
@@ -83,7 +83,6 @@ EXAMPLES = r"""
description: via Ansible
location_type: local
state: present
- delegate_to: localhost
- name: Create a new remote backup
cisco.mso.mso_backup:
@@ -95,7 +94,6 @@ EXAMPLES = r"""
location_type: remote
remote_location: ansible_test
state: present
- delegate_to: localhost
- name: Move backup to remote location
cisco.mso.mso_backup:
@@ -106,7 +104,6 @@ EXAMPLES = r"""
remote_location: ansible_test
remote_path: test
state: move
- delegate_to: localhost
- name: Download a backup
cisco.mso.mso_backup:
@@ -116,7 +113,6 @@ EXAMPLES = r"""
backup: Backup
destination: ./
state: download
- delegate_to: localhost
- name: Upload a backup
cisco.mso.mso_backup:
@@ -125,7 +121,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
backup: ./Backup
state: upload
- delegate_to: localhost
- name: Restore a backup
cisco.mso.mso_backup:
@@ -134,7 +129,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
backup: Backup
state: restore
- delegate_to: localhost
- name: Remove a Backup
cisco.mso.mso_backup:
@@ -143,7 +137,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
backup: Backup
state: absent
- delegate_to: localhost
- name: Query a backup
cisco.mso.mso_backup:
@@ -152,7 +145,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
backup: Backup
state: query
- delegate_to: localhost
register: query_result
- name: Query a backup with its complete name
@@ -162,7 +154,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
backup: Backup_20200721220043
state: query
- delegate_to: localhost
register: query_result
- name: Query all backups
@@ -171,7 +162,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_backup_schedule.py b/ansible_collections/cisco/mso/plugins/modules/mso_backup_schedule.py
index e97b59b2e..a96c1da97 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_backup_schedule.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_backup_schedule.py
@@ -65,7 +65,7 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
+ register: query_result
- name: Set backup schedule
cisco.mso.mso_backup_schedule:
@@ -76,7 +76,6 @@ EXAMPLES = r"""
frequency_length: 7
remote_location: ansible_test
state: present
- delegate_to: localhost
- name: Set backup schedule with date and time
cisco.mso.mso_backup_schedule:
@@ -90,7 +89,6 @@ EXAMPLES = r"""
start_time: 20:57:36
start_date: 2023-04-09
state: present
- delegate_to: localhost
- name: Delete backup schedule
cisco.mso.mso_backup_schedule:
@@ -98,7 +96,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: absent
- delegate_to: localhost
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy.py b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy.py
index e9b7f23d3..7568c4704 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy.py
@@ -56,7 +56,6 @@ EXAMPLES = r"""
description: "My Test DHCP Policy"
tenant: ansible_test
state: present
- delegate_to: localhost
- name: Remove DHCP Option Policy
cisco.mso.mso_dhcp_option_policy:
@@ -65,7 +64,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
dhcp_option_policy: my_test_dhcp_policy
state: absent
- delegate_to: localhost
- name: Query a DHCP Option Policy
cisco.mso.mso_dhcp_option_policy:
@@ -74,7 +72,7 @@ EXAMPLES = r"""
password: SomeSecretPassword
dhcp_option_policy: my_test_dhcp_policy
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all DHCP Option Policies
cisco.mso.mso_dhcp_option_policy:
@@ -82,7 +80,7 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy_option.py b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy_option.py
index f4c397c24..4d5edd14f 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy_option.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_option_policy_option.py
@@ -63,7 +63,6 @@ EXAMPLES = r"""
id: 1
data: Data stored in the option
state: present
- delegate_to: localhost
- name: Remove a option to a DHCP Option Policy
cisco.mso.mso_dhcp_option_policy_option:
@@ -73,7 +72,6 @@ EXAMPLES = r"""
dhcp_option_policy: my_test_dhcp_policy
name: ansible_test
state: absent
- delegate_to: localhost
- name: Query a option to a DHCP Option Policy
cisco.mso.mso_dhcp_option_policy_option:
@@ -83,7 +81,7 @@ EXAMPLES = r"""
dhcp_option_policy: my_test_dhcp_policy
name: ansible_test
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all option of a DHCP Option Policy
cisco.mso.mso_dhcp_option_policy_option:
@@ -92,7 +90,7 @@ EXAMPLES = r"""
password: SomeSecretPassword
dhcp_option_policy: my_test_dhcp_policy
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy.py b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy.py
index 394825feb..59fdf4db7 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy.py
@@ -55,7 +55,6 @@ EXAMPLES = r"""
description: "My Test DHCP Policy"
tenant: ansible_test
state: present
- delegate_to: localhost
- name: Remove DHCP Relay Policy
cisco.mso.mso_dhcp_relay_policy:
@@ -64,7 +63,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
dhcp_relay_policy: my_test_dhcp_policy
state: absent
- delegate_to: localhost
- name: Query a DHCP Relay Policy
cisco.mso.mso_dhcp_relay_policy:
@@ -73,7 +71,7 @@ EXAMPLES = r"""
password: SomeSecretPassword
dhcp_relay_policy: my_test_dhcp_policy
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all DHCP Relay Policies
cisco.mso.mso_dhcp_relay_policy:
@@ -81,7 +79,7 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy_provider.py b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy_provider.py
index 760d90430..e17ee92bc 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy_provider.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_dhcp_relay_policy_provider.py
@@ -82,7 +82,6 @@ EXAMPLES = r"""
application_profile: ansible_test
endpoint_group: ansible_test
state: present
- delegate_to: localhost
- name: Remove a provider to a DHCP Relay Policy
cisco.mso.mso_dhcp_relay_policy_provider:
@@ -96,7 +95,6 @@ EXAMPLES = r"""
application_profile: ansible_test
endpoint_group: ansible_test
state: absent
- delegate_to: localhost
- name: Query a provider to a DHCP Relay Policy
cisco.mso.mso_dhcp_relay_policy_provider:
@@ -110,7 +108,7 @@ EXAMPLES = r"""
application_profile: ansible_test
endpoint_group: ansible_test
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all provider of a DHCP Relay Policy
cisco.mso.mso_dhcp_relay_policy_provider:
@@ -119,7 +117,7 @@ EXAMPLES = r"""
password: SomeSecretPassword
dhcp_relay_policy: my_test_dhcp_policy
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_label.py b/ansible_collections/cisco/mso/plugins/modules/mso_label.py
index f4f05f7de..2b65de521 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_label.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_label.py
@@ -49,7 +49,6 @@ EXAMPLES = r"""
label: Belgium
type: site
state: present
- delegate_to: localhost
- name: Remove a label
cisco.mso.mso_label:
@@ -58,7 +57,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
label: Belgium
state: absent
- delegate_to: localhost
- name: Query a label
cisco.mso.mso_label:
@@ -67,7 +65,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
label: Belgium
state: query
- delegate_to: localhost
register: query_result
- name: Query all labels
@@ -76,7 +73,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_remote_location.py b/ansible_collections/cisco/mso/plugins/modules/mso_remote_location.py
index 10546563f..b3ec5e405 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_remote_location.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_remote_location.py
@@ -89,7 +89,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: backups
- name: Query a remote location
@@ -99,7 +98,7 @@ EXAMPLES = r"""
password: SomeSecretPassword
remote_location: ansible_test
state: query
- delegate_to: localhost
+ register: query_result
- name: Configure a remote location
cisco.mso.mso_remote_location:
@@ -114,7 +113,6 @@ EXAMPLES = r"""
remote_username: username
remote_password: password
state: present
- delegate_to: localhost
- name: Delete a remote location
cisco.mso.mso_remote_location:
@@ -123,7 +121,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
remote_location: ansible_test
state: absent
- delegate_to: localhost
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_rest.py b/ansible_collections/cisco/mso/plugins/modules/mso_rest.py
index ae05b093b..04387c505 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_rest.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_rest.py
@@ -83,7 +83,6 @@ EXAMPLES = r"""
"sites": [],
"_updateVersion": 0
}
- delegate_to: localhost
- name: Query schema
cisco.mso.mso_rest:
@@ -92,7 +91,7 @@ EXAMPLES = r"""
password: SomeSecretPassword
path: /mso/api/v1/schemas
method: get
- delegate_to: localhost
+ register: query_result
- name: Patch schema (YAML)
cisco.mso.mso_rest:
@@ -109,7 +108,6 @@ EXAMPLES = r"""
displayName: AP2
epgs: []
_updateVersion: 0
- delegate_to: localhost
- name: Add a tenant from a templated payload file from templates
cisco.mso.mso_rest:
@@ -119,7 +117,6 @@ EXAMPLES = r"""
method: post
path: /api/v1/tenants
content: "{{ lookup('template', 'mso/tenant.json.j2') }}"
- delegate_to: localhost
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_role.py b/ansible_collections/cisco/mso/plugins/modules/mso_role.py
index cfa4483b0..a99df655a 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_role.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_role.py
@@ -115,7 +115,6 @@ EXAMPLES = r"""
- manage-tenant-schemas
- manage-users
state: present
- delegate_to: localhost
- name: Remove a role
cisco.mso.mso_role:
@@ -124,7 +123,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
role: readOnly
state: absent
- delegate_to: localhost
- name: Query a role
cisco.mso.mso_role:
@@ -133,7 +131,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
role: readOnly
state: query
- delegate_to: localhost
register: query_result
- name: Query all roles
@@ -142,7 +139,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema.py
index 2eba13ac9..7ba2df609 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema.py
@@ -2,6 +2,8 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
+
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -18,21 +20,32 @@ description:
- Manage schemas on Cisco ACI Multi-Site.
author:
- Dag Wieers (@dagwieers)
+- Akini Ross (@akinross)
options:
schema:
description:
- The name of the schema.
type: str
aliases: [ name ]
+ id:
+ description:
+ - The id of the schema.
+ - This parameter is required when the C(schema) needs to be updated.
+ type: str
+ description:
+ description:
+ - The description of the schema.
+ type: str
state:
description:
- Use C(absent) for removing.
- Use C(query) for listing an object or multiple objects.
+ - Use C(present) for creating or updating. Only supported on versions of MSO that are 4.1 or greater.
type: str
- choices: [ absent, query ]
+ choices: [ absent, query, present ]
default: query
notes:
-- Due to restrictions of the MSO REST API this module cannot create empty schemas (i.e. schemas without templates).
+- Due to restrictions of the MSO REST API this module can only create empty schemas (i.e. schemas without templates) on versions of MSO that are 4.1 or greater.
Use the M(cisco.mso.mso_schema_template) to automatically create schemas with templates.
seealso:
- module: cisco.mso.mso_schema_site
@@ -41,6 +54,15 @@ extends_documentation_fragment: cisco.mso.modules
"""
EXAMPLES = r"""
+- name: Create schema
+ cisco.mso.mso_schema:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema 1
+ state: present
+ delegate_to: localhost
+
- name: Remove schemas
cisco.mso.mso_schema:
host: mso_host
@@ -48,7 +70,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
schema: Schema 1
state: absent
- delegate_to: localhost
- name: Query a schema
cisco.mso.mso_schema:
@@ -57,7 +78,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
schema: Schema 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all schemas
@@ -66,7 +86,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: query_result
"""
@@ -81,12 +100,9 @@ def main():
argument_spec = mso_argument_spec()
argument_spec.update(
schema=dict(type="str", aliases=["name"]),
- # messages=dict(type='dict'),
- # associations=dict(type='list'),
- # health_faults=dict(type='list'),
- # references=dict(type='dict'),
- # policy_states=dict(type='list'),
- state=dict(type="str", default="query", choices=["absent", "query"]),
+ id=dict(type="str"),
+ description=dict(type="str"),
+ state=dict(type="str", default="query", choices=["absent", "query", "present"]),
)
module = AnsibleModule(
@@ -94,28 +110,48 @@ def main():
supports_check_mode=True,
required_if=[
["state", "absent", ["schema"]],
+ ["state", "present", ["schema"]],
],
)
schema = module.params.get("schema")
+ schema_id = module.params.get("id")
+ description = module.params.get("description")
state = module.params.get("state")
mso = MSOModule(module)
-
- schema_id = None
path = "schemas"
# Query for existing object(s)
if schema:
- mso.existing = mso.get_obj(path, displayName=schema)
+ if schema_id:
+ mso.existing = mso.get_obj(path, id=schema_id)
+ else:
+ mso.existing = mso.get_obj(path, displayName=schema)
+
if mso.existing:
- schema_id = mso.existing.get("id")
+ if not schema_id:
+ schema_id = mso.existing.get("id")
path = "schemas/{id}".format(id=schema_id)
else:
mso.existing = mso.query_objs(path)
- if state == "query":
- pass
+ mso.previous = mso.existing
+ if state == "present":
+ mso.sanitize(dict(displayName=schema, id=schema_id, description=description), collate=True)
+ if mso.existing:
+ ops = []
+ if mso.existing.get("displayName") != schema:
+ ops.append(dict(op="replace", path="/displayName", value=schema))
+ if mso.existing.get("description") != description and description is not None:
+ ops.append(dict(op="replace", path="/description", value=description))
+
+ if not module.check_mode:
+ mso.request(path, method="PATCH", data=ops)
+ else:
+ if not module.check_mode:
+ mso.request(path, method="POST", data=dict(displayName=schema, description=description))
+ mso.existing = mso.proposed
elif state == "absent":
mso.previous = mso.existing
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_clone.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_clone.py
index 840fb12ca..f02322f9e 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_clone.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_clone.py
@@ -49,7 +49,6 @@ EXAMPLES = r"""
source_schema: Source_Schema
destination_schema: Destination_Schema
state: clone
- delegate_to: localhost
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site.py
index 83a5213a2..b8e1a7cda 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site.py
@@ -58,7 +58,6 @@ EXAMPLES = r"""
site: Site1
template: Template 1
state: present
- delegate_to: localhost
- name: Remove a site from a schema
cisco.mso.mso_schema_site:
@@ -69,7 +68,6 @@ EXAMPLES = r"""
site: Site1
template: Template 1
state: absent
- delegate_to: localhost
- name: Query a schema site
cisco.mso.mso_schema_site:
@@ -80,7 +78,6 @@ EXAMPLES = r"""
site: Site1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all schema sites
@@ -90,7 +87,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
schema: Schema 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp.py
index 0552b6a31..39c5225cd 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp.py
@@ -64,7 +64,6 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: present
- delegate_to: localhost
- name: Remove a site ANP
cisco.mso.mso_schema_site_anp:
@@ -76,7 +75,6 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: absent
- delegate_to: localhost
- name: Query a specific site ANP
cisco.mso.mso_schema_site_anp:
@@ -88,7 +86,6 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site ANPs
@@ -100,7 +97,6 @@ EXAMPLES = r"""
site: Site1
template: Template1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg.py
index 1c2ad6433..6c23a0ca0 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg.py
@@ -75,7 +75,6 @@ EXAMPLES = r"""
anp: ANP1
epg: EPG1
state: present
- delegate_to: localhost
- name: Remove a site EPG
cisco.mso.mso_schema_site_anp_epg:
@@ -88,7 +87,6 @@ EXAMPLES = r"""
anp: ANP1
epg: EPG1
state: absent
- delegate_to: localhost
- name: Query a specific site EPGs
cisco.mso.mso_schema_site_anp_epg:
@@ -101,7 +99,6 @@ EXAMPLES = r"""
anp: ANP1
epg: EPG1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site EPGs
@@ -114,7 +111,6 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_bulk_staticport.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_bulk_staticport.py
index eda60cfd1..aa302a991 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_bulk_staticport.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_bulk_staticport.py
@@ -164,6 +164,10 @@ notes:
seealso:
- module: cisco.mso.mso_schema_site_anp_epg
- module: cisco.mso.mso_schema_template_anp_epg
+deprecated:
+ removed_in: 3.0.0
+ alternative: Use M(cisco.mso.mso_schema_site_anp_epg_staticport) with option `force_replace=true` instead.
+ why: The module has been merged to centralise all static port functionality into M(cisco.mso.mso_schema_site_anp_epg_staticport).
extends_documentation_fragment: cisco.mso.modules
"""
@@ -190,7 +194,6 @@ EXAMPLES = r"""
- path: eth1/3
vlan: 124
state: present
- delegate_to: localhost
- name: Add a new static fex port to a site EPG
cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
@@ -215,7 +218,6 @@ EXAMPLES = r"""
vlan: 124
- fex: 151
state: present
- delegate_to: localhost
- name: Add a new static VPC to a site EPG
cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
@@ -245,7 +247,6 @@ EXAMPLES = r"""
mode: untagged
deployment_immediacy: lazy
state: present
- delegate_to: localhost
- name: Remove static ports from a site EPG
cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
@@ -258,7 +259,6 @@ EXAMPLES = r"""
anp: ANP1
epg: EPG1
state: absent
- delegate_to: localhost
- name: Query all site EPG static ports
cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
@@ -270,7 +270,6 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_domain.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_domain.py
index c684a27be..4e6097f7f 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_domain.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_domain.py
@@ -2,6 +2,8 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2019, Nirav Katarmal (@nkatarmal-crest) <nirav.katarmal@crestdatasys.com>
+# Copyright: (c) 2023, Mabille Florent (@fmabille09) <florent.mabille@smals.be>
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -18,6 +20,8 @@ description:
- Manage site-local EPG domains in schema template on Cisco ACI Multi-Site.
author:
- Nirav Katarmal (@nkatarmal-crest)
+- Mabille Florent (@fmabille09)
+- Akini Ross (@akinross)
options:
schema:
description:
@@ -68,46 +72,95 @@ options:
choices: [ immediate, lazy, pre-provision ]
micro_seg_vlan_type:
description:
- - Virtual LAN type for microsegmentation. This attribute can only be used with vmmDomain domain association.
- - vlan is currently the only accepted value.
+ - Virtual LAN type for microsegmentation. This attribute can only be used with VMM domain association.
type: str
+ choices: [ vlan ]
micro_seg_vlan:
description:
- - Virtual LAN for microsegmentation. This attribute can only be used with vmmDomain domain association.
+ - Virtual LAN for microsegmentation. This attribute can only be used with VMM domain association.
type: int
port_encap_vlan_type:
description:
- - Virtual LAN type for port encap. This attribute can only be used with vmmDomain domain association.
- - vlan is currently the only accepted value.
+ - Virtual LAN type for port encap. This attribute can only be used with VMM domain association.
type: str
+ choices: [ vlan ]
port_encap_vlan:
description:
- - Virtual LAN type for port encap. This attribute can only be used with vmmDomain domain association.
+ - Virtual LAN type for port encap. This attribute can only be used with VMM domain association.
type: int
vlan_encap_mode:
description:
- - Which VLAN enacap mode to use. This attribute can only be used with vmmDomain domain association.
+ - Which VLAN enacap mode to use. This attribute can only be used with VMM domain association.
type: str
choices: [ static, dynamic ]
allow_micro_segmentation:
description:
- - Specifies microsegmentation is enabled or not. This attribute can only be used with vmmDomain domain association.
+ - Specifies microsegmentation is enabled or not. This attribute can only be used with VMM domain association.
type: bool
switch_type:
description:
- - Which switch type to use with this domain association. This attribute can only be used with vmmDomain domain association.
+ - Which switch type to use with this domain association. This attribute can only be used with VMM domain association.
type: str
switching_mode:
description:
- - Which switching mode to use with this domain association. This attribute can only be used with vmmDomain domain association.
+ - Which switching mode to use with this domain association. This attribute can only be used with VMM domain association.
type: str
enhanced_lagpolicy_name:
description:
- - EPG enhanced lagpolicy name. This attribute can only be used with vmmDomain domain association.
+ - EPG enhanced lagpolicy name. This attribute can only be used with VMM domain association.
type: str
enhanced_lagpolicy_dn:
description:
- - Distinguished name of EPG lagpolicy. This attribute can only be used with vmmDomain domain association.
+ - Distinguished name of EPG lagpolicy. This attribute can only be used with VMM domain association.
+ type: str
+ delimiter:
+ description:
+ - Which delimiter to use with this domain association. This attribute can only be used with VMM domain association.
+ type: str
+ choices: [ '+', '|', '~', '!', '@', '^', '=' ]
+ binding_type:
+ description:
+ - Which binding_type to use with this domain association. This attribute can only be used with VMM domain association.
+ type: str
+ default: none
+ choices: [ static, dynamic, none, ephemeral ]
+ num_ports:
+ description:
+ - Number of ports for the binding type. This attribute can only be used with VMM domain association.
+ type: int
+ port_allocation:
+ description:
+ - Port allocation for the binding type. This attribute can only be used with VMM domain association and binding type in static.
+ - Required when O(binding_type=static).
+ type: str
+ choices: [ elastic, fixed ]
+ netflow_pref:
+ description:
+ - The netflow preference state of the domain association. This attribute can only be used with VMM domain association.
+ type: str
+ default: disabled
+ choices: [ enabled, disabled ]
+ allow_promiscuous:
+ description:
+ - The allow promiscuous state of the domain association. This attribute can only be used with VMM domain association.
+ type: str
+ default: reject
+ choices: [ accept, reject ]
+ forged_transmits:
+ description:
+ - The forged transmits state of the domain association. This attribute can only be used with VMM domain association.
+ type: str
+ default: reject
+ choices: [ accept, reject ]
+ mac_changes:
+ description:
+ - The mac changes state of the domain association. This attribute can only be used with VMM domain association.
+ type: str
+ default: reject
+ choices: [ accept, reject ]
+ custom_epg_name:
+ description:
+ - Which custom_epg_name to use with this domain association. This attribute can only be used with VMM domain association.
type: str
state:
description:
@@ -142,9 +195,8 @@ EXAMPLES = r"""
deployment_immediacy: lazy
resolution_immediacy: pre-provision
state: present
- delegate_to: localhost
-- name: Remove a domain from a site EPG
+- name: Add a new domain to a site EPG with all possible attributes set
cisco.mso.mso_schema_site_anp_epg_domain:
host: mso_host
username: admin
@@ -156,10 +208,28 @@ EXAMPLES = r"""
epg: EPG1
domain_association_type: vmmDomain
domain_profile: 'VMware-VMM'
- deployment_immediacy: lazy
- resolution_immediacy: pre-provision
- state: absent
- delegate_to: localhost
+ deployment_immediacy: immediate
+ resolution_immediacy: immediate
+ micro_seg_vlan_type: vlan
+ micro_seg_vlan: 100
+ port_encap_vlan_type: vlan
+ port_encap_vlan: 100
+ vlan_encap_mode: static
+ allow_micro_segmentation: true
+ switch_type: default
+ switching_mode: native
+ enhanced_lagpolicy_name: ansible_lag_name
+ enhanced_lagpolicy_dn: ansible_lag_dn
+ delimiter: '|'
+ binding_type: static
+ num_ports: 2
+ port_allocation: elastic
+ netflow_pref: enabled
+ allow_promiscuous: accept
+ forged_transmits: accept
+ mac_changes: accept
+ custom_epg_name: ansible_custom_epg
+ state: present
- name: Query a domain associated with a specific site EPG
cisco.mso.mso_schema_site_anp_epg_domain:
@@ -174,7 +244,6 @@ EXAMPLES = r"""
domain_association_type: vmmDomain
domain_profile: 'VMware-VMM'
state: query
- delegate_to: localhost
register: query_result
- name: Query all domains associated with a site EPG
@@ -188,8 +257,23 @@ EXAMPLES = r"""
anp: ANP1
epg: EPG1
state: query
- delegate_to: localhost
register: query_result
+
+- name: Remove a domain from a site EPG
+ cisco.mso.mso_schema_site_anp_epg_domain:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema1
+ site: Site1
+ template: Template1
+ anp: ANP1
+ epg: EPG1
+ domain_association_type: vmmDomain
+ domain_profile: 'VMware-VMM'
+ deployment_immediacy: lazy
+ resolution_immediacy: pre-provision
+ state: absent
"""
RETURN = r"""
@@ -212,9 +296,9 @@ def main():
deployment_immediacy=dict(type="str", choices=["immediate", "lazy"]),
resolution_immediacy=dict(type="str", choices=["immediate", "lazy", "pre-provision"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
- micro_seg_vlan_type=dict(type="str"),
+ micro_seg_vlan_type=dict(type="str", choices=["vlan"]),
micro_seg_vlan=dict(type="int"),
- port_encap_vlan_type=dict(type="str"),
+ port_encap_vlan_type=dict(type="str", choices=["vlan"]),
port_encap_vlan=dict(type="int"),
vlan_encap_mode=dict(type="str", choices=["static", "dynamic"]),
allow_micro_segmentation=dict(type="bool"),
@@ -222,6 +306,15 @@ def main():
switching_mode=dict(type="str"),
enhanced_lagpolicy_name=dict(type="str"),
enhanced_lagpolicy_dn=dict(type="str"),
+ binding_type=dict(type="str", default="none", choices=["dynamic", "ephemeral", "none", "static"]),
+ port_allocation=dict(type="str", choices=["elastic", "fixed"]),
+ num_ports=dict(type="int"),
+ netflow_pref=dict(type="str", default="disabled", choices=["enabled", "disabled"]),
+ allow_promiscuous=dict(type="str", default="reject", choices=["accept", "reject"]),
+ forged_transmits=dict(type="str", default="reject", choices=["accept", "reject"]),
+ mac_changes=dict(type="str", default="reject", choices=["accept", "reject"]),
+ delimiter=dict(type="str", choices=["+", "|", "~", "!", "@", "^", "="]),
+ custom_epg_name=dict(type="str"),
)
module = AnsibleModule(
@@ -230,6 +323,12 @@ def main():
required_if=[
["state", "absent", ["domain_association_type", "domain_profile", "deployment_immediacy", "resolution_immediacy"]],
["state", "present", ["domain_association_type", "domain_profile", "deployment_immediacy", "resolution_immediacy"]],
+ ["binding_type", "static", ["port_allocation"]],
+ ],
+ required_together=[
+ ("micro_seg_vlan_type", "micro_seg_vlan"),
+ ("port_encap_vlan_type", "port_encap_vlan"),
+ ("enhanced_lagpolicy_name", "enhanced_lagpolicy_dn"),
],
)
@@ -253,6 +352,15 @@ def main():
switching_mode = module.params.get("switching_mode")
enhanced_lagpolicy_name = module.params.get("enhanced_lagpolicy_name")
enhanced_lagpolicy_dn = module.params.get("enhanced_lagpolicy_dn")
+ binding_type = module.params.get("binding_type")
+ port_allocation = module.params.get("port_allocation")
+ num_ports = module.params.get("num_ports")
+ netflow_pref = module.params.get("netflow_pref")
+ allow_promiscuous = module.params.get("allow_promiscuous")
+ forged_transmits = module.params.get("forged_transmits")
+ mac_changes = module.params.get("mac_changes")
+ delimiter = module.params.get("delimiter")
+ custom_epg_name = module.params.get("custom_epg_name")
mso = MSOModule(module)
@@ -397,46 +505,54 @@ def main():
if domain_association_type == "vmmDomain":
vmmDomainProperties = {}
if micro_seg_vlan_type and micro_seg_vlan:
- microSegVlan = dict(vlanType=micro_seg_vlan_type, vlan=micro_seg_vlan)
- vmmDomainProperties["microSegVlan"] = microSegVlan
- elif not micro_seg_vlan_type and micro_seg_vlan:
- mso.fail_json(msg="micro_seg_vlan_type is required when micro_seg_vlan is provided.")
- elif micro_seg_vlan_type and not micro_seg_vlan:
- mso.fail_json(msg="micro_seg_vlan is required when micro_seg_vlan_type is provided.")
+ vmmDomainProperties["microSegVlan"] = dict(vlanType=micro_seg_vlan_type, vlan=micro_seg_vlan)
if port_encap_vlan_type and port_encap_vlan:
- portEncapVlan = dict(vlanType=port_encap_vlan_type, vlan=port_encap_vlan)
- vmmDomainProperties["portEncapVlan"] = portEncapVlan
- elif not port_encap_vlan_type and port_encap_vlan:
- mso.fail_json(msg="port_encap_vlan_type is required when port_encap_vlan is provided.")
- elif port_encap_vlan_type and not port_encap_vlan:
- mso.fail_json(msg="port_encap_vlan is required when port_encap_vlan_type is provided.")
+ vmmDomainProperties["portEncapVlan"] = dict(vlanType=port_encap_vlan_type, vlan=port_encap_vlan)
if vlan_encap_mode:
vmmDomainProperties["vlanEncapMode"] = vlan_encap_mode
- if allow_micro_segmentation:
+ if allow_micro_segmentation is not None:
vmmDomainProperties["allowMicroSegmentation"] = allow_micro_segmentation
+
if switch_type:
vmmDomainProperties["switchType"] = switch_type
+
if switching_mode:
vmmDomainProperties["switchingMode"] = switching_mode
if enhanced_lagpolicy_name and enhanced_lagpolicy_dn:
- enhancedLagPol = dict(name=enhanced_lagpolicy_name, dn=enhanced_lagpolicy_dn)
- epgLagPol = dict(enhancedLagPol=enhancedLagPol)
- vmmDomainProperties["epgLagPol"] = epgLagPol
- elif not enhanced_lagpolicy_name and enhanced_lagpolicy_dn:
- mso.fail_json(msg="enhanced_lagpolicy_name is required when enhanced_lagpolicy_dn is provided.")
- elif enhanced_lagpolicy_name and not enhanced_lagpolicy_dn:
- mso.fail_json(msg="enhanced_lagpolicy_dn is required when enhanced_lagpolicy_name is provided.")
+ vmmDomainProperties["epgLagPol"] = dict(enhancedLagPol=dict(name=enhanced_lagpolicy_name, dn=enhanced_lagpolicy_dn))
+
+ if delimiter:
+ vmmDomainProperties["delimiter"] = delimiter
+
+ if binding_type:
+ vmmDomainProperties["bindingType"] = binding_type
+ vmmDomainProperties["numPorts"] = num_ports
+
+ if port_allocation:
+ vmmDomainProperties["portAllocation"] = port_allocation
+
+ if netflow_pref:
+ vmmDomainProperties["netflowPref"] = netflow_pref
+
+ if allow_promiscuous:
+ vmmDomainProperties["allowPromiscuous"] = allow_promiscuous
+
+ if forged_transmits:
+ vmmDomainProperties["forgedTransmits"] = forged_transmits
+
+ if mac_changes:
+ vmmDomainProperties["macChanges"] = mac_changes
+
+ if custom_epg_name:
+ vmmDomainProperties["customEpgName"] = custom_epg_name
if vmmDomainProperties:
new_domain["vmmDomainProperties"] = vmmDomainProperties
- properties = ["allowMicroSegmentation", "epgLagPol", "switchType", "switchingMode", "vlanEncapMode", "portEncapVlan", "microSegVlan"]
- for property in properties:
- if property in vmmDomainProperties:
- new_domain[property] = vmmDomainProperties[property]
+ new_domain.update(vmmDomainProperties)
# If payload is empty, anp and EPG already exist at site level
if not payload:
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_selector.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_selector.py
index ffd3c682e..54780ceed 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_selector.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_selector.py
@@ -103,7 +103,6 @@ EXAMPLES = r"""
operator: in
value: test
state: present
- delegate_to: localhost
- name: Remove a Selector from a site EPG
cisco.mso.mso_schema_site_anp_epg_selector:
@@ -117,7 +116,6 @@ EXAMPLES = r"""
epg: EPG 1
selector: selector_1
state: absent
- delegate_to: localhost
- name: Query a specific Selector
cisco.mso.mso_schema_site_anp_epg_selector:
@@ -131,7 +129,6 @@ EXAMPLES = r"""
epg: EPG 1
selector: selector_1
state: query
- delegate_to: localhost
register: query_result
- name: Query all Selectors
@@ -145,7 +142,6 @@ EXAMPLES = r"""
anp: ANP 1
epg: EPG 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticleaf.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticleaf.py
index 01e2ac386..64a2bcddb 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticleaf.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticleaf.py
@@ -88,7 +88,6 @@ EXAMPLES = r"""
leaf: Leaf1
vlan: 123
state: present
- delegate_to: localhost
- name: Remove a static leaf from a site EPG
cisco.mso.mso_schema_site_anp_epg_staticleaf:
@@ -102,7 +101,6 @@ EXAMPLES = r"""
epg: EPG1
leaf: Leaf1
state: absent
- delegate_to: localhost
- name: Query a specific site EPG static leaf
cisco.mso.mso_schema_site_anp_epg_staticleaf:
@@ -116,7 +114,6 @@ EXAMPLES = r"""
epg: EPG1
leaf: Leaf1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site EPG static leafs
@@ -129,7 +126,6 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticport.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticport.py
index d05336c52..d22ae1fcf 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticport.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_staticport.py
@@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2019, Dag Wieers (@dagwieers) <dag@wieers.com>
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -18,6 +19,7 @@ description:
- Manage site-local EPG static ports in schema template on Cisco ACI Multi-Site.
author:
- Dag Wieers (@dagwieers)
+- Akini Ross (@akinross)
options:
schema:
description:
@@ -47,9 +49,9 @@ options:
type:
description:
- The path type of the static port
- - vpc is used for a Virtual Port Channel
- - dpc is used for a Direct Port Channel
- - port is used for a single interface
+ - C(vpc) is used for a Virtual Port Channel
+ - C(dpc) is used for a Direct Port Channel
+ - C(port) is used for a single interface
type: str
choices: [ port, vpc, dpc ]
default: port
@@ -94,6 +96,75 @@ options:
description:
- Primary micro-seg VLAN of static port.
type: int
+ force_replace:
+ description:
+ - Replaces all the configured static port(s) with the provided static port(s).
+ - This option can only be used in combination with the O(static_ports) option.
+ - In combination with the O(state=absent) and without any static port configuration all configured static port(s) will be removed.
+ type: bool
+ static_ports:
+ description:
+ - A list of Static Ports associated to this EPG.
+ - All configured Static Ports will be replaced with the provided Static Ports when used with O(force_replace=true).
+ - Only the provided Static Ports will be added, updated or removed when used with O(force_replace=false).
+ - In combination with the O(state=query) all provided Static Ports must be found else the task will fail.
+ - When I(static_ports) attributes are not provided the module attributes will be used.
+ - For each Static Ports provided in the list, the following attributes must be resolved
+ - I(static_ports.type)
+ - I(static_ports.pod)
+ - I(static_ports.leaf)
+ - I(static_ports.path)
+ - I(static_ports.vlan)
+ type: list
+ elements: dict
+ suboptions:
+ type:
+ description:
+ - The path type of the static port
+ - C(vpc) is used for a Virtual Port Channel
+ - C(dpc) is used for a Direct Port Channel
+ - C(port) is used for a single interface
+ type: str
+ choices: [ port, vpc, dpc ]
+ pod:
+ description:
+ - The pod of the static port.
+ type: str
+ leaf:
+ description:
+ - The leaf of the static port.
+ type: str
+ fex:
+ description:
+ - The fex id of the static port.
+ type: str
+ path:
+ description:
+ - The path of the static port.
+ type: str
+ vlan:
+ description:
+ - The port encapsulation VLAN id of the static port.
+ type: int
+ deployment_immediacy:
+ description:
+ - The deployment immediacy of the static port.
+ - C(immediate) means B(Deploy immediate).
+ - C(lazy) means B(Deploy on demand).
+ type: str
+ choices: [ immediate, lazy ]
+ mode:
+ description:
+ - The mode of the static port.
+ - C(native) means B(Access (802.1p)).
+ - C(regular) means B(Trunk).
+ - C(untagged) means B(Access (untagged)).
+ type: str
+ choices: [ native, regular, untagged ]
+ primary_micro_segment_vlan:
+ description:
+ - Primary micro-seg VLAN of static port.
+ type: int
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -129,7 +200,6 @@ EXAMPLES = r"""
vlan: 126
deployment_immediacy: immediate
state: present
- delegate_to: localhost
- name: Add a new static fex port to a site EPG
mso_schema_site_anp_epg_staticport:
@@ -149,7 +219,6 @@ EXAMPLES = r"""
vlan: 126
deployment_immediacy: lazy
state: present
- delegate_to: localhost
- name: Add a new static VPC to a site EPG
mso_schema_site_anp_epg_staticport:
@@ -169,9 +238,8 @@ EXAMPLES = r"""
mode: untagged
deployment_immediacy: lazy
state: present
- delegate_to: localhost
-- name: Remove a static port from a site EPG
+- name: Add two new static port to a site EPG
cisco.mso.mso_schema_site_anp_epg_staticport:
host: mso_host
username: admin
@@ -181,12 +249,40 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
epg: EPG1
- type: port
- pod: pod-1
- leaf: 101
- path: eth1/1
- state: absent
- delegate_to: localhost
+ static_ports:
+ - pod: pod-1
+ leaf: 101
+ path: eth1/1
+ vlan: 126
+ - pod: pod-2
+ leaf: 101
+ path: eth2/1
+ vlan: 128
+ deployment_immediacy: immediate
+ state: present
+
+- name: Replace all existing static pors on a site EPG with 2 new static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema1
+ site: Site1
+ template: Template1
+ anp: ANP1
+ epg: EPG1
+ force_replace: true
+ static_ports:
+ - pod: pod-1
+ leaf: 101
+ path: eth1/1
+ vlan: 126
+ - pod: pod-2
+ leaf: 101
+ path: eth2/1
+ vlan: 128
+ deployment_immediacy: immediate
+ state: present
- name: Query a specific site EPG static port
cisco.mso.mso_schema_site_anp_epg_staticport:
@@ -203,7 +299,28 @@ EXAMPLES = r"""
leaf: 101
path: eth1/1
state: query
- delegate_to: localhost
+ register: query_result
+
+- name: Query a list of static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema1
+ site: Site1
+ template: Template1
+ anp: ANP1
+ epg: EPG1
+ static_ports:
+ - pod: pod-1
+ leaf: 101
+ path: eth1/1
+ vlan: 126
+ - pod: pod-2
+ leaf: 101
+ path: eth2/1
+ vlan: 128
+ state: query
register: query_result
- name: Query all site EPG static ports
@@ -216,15 +333,66 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: query
- delegate_to: localhost
register: query_result
+
+- name: Remove a static port from a site EPG
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema1
+ site: Site1
+ template: Template1
+ anp: ANP1
+ epg: EPG1
+ type: port
+ pod: pod-1
+ leaf: 101
+ path: eth1/1
+ state: absent
+
+- name: Remove two static ports from a site EPG
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema1
+ site: Site1
+ template: Template1
+ anp: ANP1
+ epg: EPG1
+ static_ports:
+ - pod: pod-1
+ leaf: 101
+ path: eth1/1
+ vlan: 126
+ - pod: pod-2
+ leaf: 101
+ path: eth2/1
+ vlan: 128
+ deployment_immediacy: immediate
+ state: absent
+
+- name: Remove all existing static pors from a site EPG
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema1
+ site: Site1
+ template: Template1
+ anp: ANP1
+ epg: EPG1
+ force_replace: true
+ state: absent
"""
RETURN = r"""
"""
from ansible.module_utils.basic import AnsibleModule
-from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, mso_argument_spec
+from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, mso_argument_spec, mso_site_anp_epg_bulk_staticport_spec
+from ansible_collections.cisco.mso.plugins.module_utils.schema import MSOSchema
def main():
@@ -235,25 +403,23 @@ def main():
template=dict(type="str", required=True),
anp=dict(type="str", required=True),
epg=dict(type="str", required=True),
+ force_replace=dict(type="bool"),
type=dict(type="str", default="port", choices=["port", "vpc", "dpc"]),
- pod=dict(type="str"), # This parameter is not required for querying all objects
- leaf=dict(type="str"), # This parameter is not required for querying all objects
- fex=dict(type="str"), # This parameter is not required for querying all objects
- path=dict(type="str"), # This parameter is not required for querying all objects
- vlan=dict(type="int"), # This parameter is not required for querying all objects
- primary_micro_segment_vlan=dict(type="int"), # This parameter is not required for querying all objects
+ pod=dict(type="str"),
+ leaf=dict(type="str"),
+ fex=dict(type="str"),
+ path=dict(type="str"),
+ vlan=dict(type="int"),
+ primary_micro_segment_vlan=dict(type="int"),
deployment_immediacy=dict(type="str", default="lazy", choices=["immediate", "lazy"]),
mode=dict(type="str", default="untagged", choices=["native", "regular", "untagged"]),
+ static_ports=dict(type="list", elements="dict", options=mso_site_anp_epg_bulk_staticport_spec()),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
)
module = AnsibleModule(
argument_spec=argument_spec,
supports_check_mode=True,
- required_if=[
- ["state", "absent", ["type", "pod", "leaf", "path", "vlan"]],
- ["state", "present", ["type", "pod", "leaf", "path", "vlan"]],
- ],
)
schema = module.params.get("schema")
@@ -270,174 +436,247 @@ def main():
primary_micro_segment_vlan = module.params.get("primary_micro_segment_vlan")
deployment_immediacy = module.params.get("deployment_immediacy")
mode = module.params.get("mode")
+ force_replace = module.params.get("force_replace")
+ static_ports = module.params.get("static_ports")
state = module.params.get("state")
- if path_type == "port" and fex is not None:
- # Select port path for fex if fex param is used
- portpath = "topology/{0}/paths-{1}/extpaths-{2}/pathep-[{3}]".format(pod, leaf, fex, path)
- elif path_type == "vpc":
- portpath = "topology/{0}/protpaths-{1}/pathep-[{2}]".format(pod, leaf, path)
- else:
- portpath = "topology/{0}/paths-{1}/pathep-[{2}]".format(pod, leaf, path)
+ if not static_ports and state in ["present", "absent"]:
+ key_list = ["pod", "leaf", "path", "vlan"]
+ required_missing = [key for key in key_list if module.params.get(key)]
+ if len(required_missing) != 4 and not (len(required_missing) == 0 and state == "absent" and force_replace):
+ module.fail_json(
+ msg="state is present or absent but all of the following are missing: {0}.".format(
+ ", ".join([key for key in key_list if not module.params.get(key)]),
+ )
+ )
mso = MSOModule(module)
- # Get schema objects
- schema_id, schema_path, schema_obj = mso.query_schema(schema)
-
- # Get template
- templates = [t.get("name") for t in schema_obj.get("templates")]
- if template not in templates:
- mso.fail_json(msg="Provided template '{0}' does not exist. Existing templates: {1}".format(template, ", ".join(templates)))
- template_idx = templates.index(template)
-
- # Get site
- site_id = mso.lookup_site(site)
-
- # Get site_idx
- if not schema_obj.get("sites"):
- mso.fail_json(msg="No site associated with template '{0}'. Associate the site with the template using mso_schema_site.".format(template))
- sites = [(s.get("siteId"), s.get("templateName")) for s in schema_obj.get("sites")]
- sites_list = [s.get("siteId") + "/" + s.get("templateName") for s in schema_obj.get("sites")]
- if (site_id, template) not in sites:
- mso.fail_json(
- msg="Provided site/siteId/template '{0}/{1}/{2}' does not exist. "
- "Existing siteIds/templates: {3}".format(site, site_id, template, ", ".join(sites_list))
- )
-
- # Schema-access uses indexes
- site_idx = sites.index((site_id, template))
- # Path-based access uses site_id-template
- site_template = "{0}-{1}".format(site_id, template)
+ mso_schema = MSOSchema(mso, schema, template, site)
+ mso_schema.set_template_anp(anp)
+ mso_schema.set_template_anp_epg(epg)
+ mso_schema.set_site_anp(anp, False)
+ mso_schema.set_site_anp_epg(epg, False)
- payload = dict()
ops = []
- op_path = ""
-
- # Get ANP
- anp_ref = mso.anp_ref(schema_id=schema_id, template=template, anp=anp)
- anps = [a.get("anpRef") for a in schema_obj["sites"][site_idx]["anps"]]
- anps_in_temp = [a.get("name") for a in schema_obj["templates"][template_idx]["anps"]]
- if anp not in anps_in_temp:
- mso.fail_json(msg="Provided anp '{0}' does not exist. Existing anps: {1}".format(anp, ", ".join(anps)))
- else:
- # Update anp index at template level
- template_anp_idx = anps_in_temp.index(anp)
-
- # If anp not at site level but exists at template level
- if anp_ref not in anps:
- op_path = "/sites/{0}/anps/-".format(site_template)
- payload.update(
- anpRef=dict(
- schemaId=schema_id,
- templateName=template,
- anpName=anp,
- ),
- )
- else:
- # Update anp index at site level
- anp_idx = anps.index(anp_ref)
+ # Create missing site anp and site epg if not present
+ # Logic is only needed for NDO version below 4.x when validate false flag was still available
+ # This did not trigger the auto creation of site anp and site epg during template anp and epg creation or ataching site to template
+ # Coverage misses this two conditionals when testing on 4.x and above
+ if state == "present" and not mso_schema.schema_objects.get("site_anp"):
+ ops.append(
+ dict(
+ op="add",
+ path="/sites/{0}-{1}/anps/-".format(mso_schema.schema_objects.get("site").details.get("siteId"), template),
+ value=dict(epgRef=dict(schemaId=mso_schema.id, templateName=template, anpName=anp, epgName=epg)),
+ )
+ )
- # Get EPG
- epg_ref = mso.epg_ref(schema_id=schema_id, template=template, anp=anp, epg=epg)
+ if state == "present" and not mso_schema.schema_objects.get("site_anp_epg"):
+ ops.append(
+ dict(
+ op="add",
+ path="/sites/{0}-{1}/anps/{2}/epgs/-".format(mso_schema.schema_objects.get("site").details.get("siteId"), template, anp),
+ value=dict(anpRef=dict(schemaId=mso_schema.id, templateName=template, anpName=anp)),
+ )
+ )
- # If anp exists at site level
- if "anpRef" not in payload:
- epgs = [e.get("epgRef") for e in schema_obj["sites"][site_idx]["anps"][anp_idx]["epgs"]]
+ static_ports_path = "/sites/{0}-{1}/anps/{2}/epgs/{3}/staticPorts".format(
+ mso_schema.schema_objects.get("site").details.get("siteId"),
+ template,
+ anp,
+ epg,
+ )
+ static_port_path = "{0}/-".format(static_ports_path)
+
+ full_paths = []
+ if static_ports:
+ found_static_ports = []
+ found_full_paths = []
+ set_existing_static_ports(mso, mso_schema, full_paths)
+ for static_port in static_ports:
+ overwrite_static_path_unprovided_attributes(
+ mso, static_port, path_type, pod, leaf, fex, path, vlan, primary_micro_segment_vlan, deployment_immediacy, mode
+ )
+ full_path = get_full_static_path(
+ static_port.get("type"), static_port.get("pod"), static_port.get("leaf"), static_port.get("fex"), static_port.get("path")
+ )
+ mso_schema.set_site_anp_epg_static_port(full_path, False)
+ if mso_schema.schema_objects.get("site_anp_epg_static_port") is not None:
+ found_static_ports.append(mso_schema.schema_objects["site_anp_epg_static_port"].details)
+ found_full_paths.append(full_path)
+
+ elif path_type and pod and leaf and path and vlan:
+ full_path = get_full_static_path(path_type, pod, leaf, fex, path)
+ mso_schema.set_site_anp_epg_static_port(full_path, False)
+ if mso_schema.schema_objects.get("site_anp_epg_static_port") is not None:
+ mso.existing = mso_schema.schema_objects["site_anp_epg_static_port"].details
+ static_port_path = "{0}/{1}".format(static_ports_path, mso_schema.schema_objects["site_anp_epg_static_port"].index)
+ else:
+ set_existing_static_ports(mso, mso_schema, full_paths)
- # If anp already at site level AND if epg not at site level (or) anp not at site level
- if ("anpRef" not in payload and epg_ref not in epgs) or "anpRef" in payload:
- epgs_in_temp = [e.get("name") for e in schema_obj["templates"][template_idx]["anps"][template_anp_idx]["epgs"]]
+ if state == "query":
+ if static_ports:
+ if len(found_static_ports) == len(static_ports):
+ mso.existing = found_static_ports
+ else:
+ not_found_static_ports = [
+ "Provided Static Port Path '{0}' not found".format(full_paths[index])
+ for index, static_port in enumerate(static_ports)
+ if full_paths[index] not in found_full_paths
+ ]
+ mso.fail_json(msg=not_found_static_ports)
+ elif not mso.existing and full_path:
+ mso.fail_json(msg="Provided Static Port Path '{0}' not found".format(full_path))
+ mso.exit_json()
- # If EPG not at template level - Fail
- if epg not in epgs_in_temp:
- mso.fail_json(msg="Provided EPG '{0}' does not exist. Existing EPGs: {1} epgref {2}".format(epg, ", ".join(epgs_in_temp), epg_ref))
+ mso.previous = mso.existing
- # EPG at template level but not at site level. Create payload at site level for EPG
+ if state == "absent" and mso.existing:
+ if static_ports and not force_replace:
+ mso.proposed = mso.existing.copy()
+ remove_index = []
+ for found_full_path in found_full_paths:
+ if found_full_path in full_paths:
+ index = full_paths.index(found_full_path)
+ remove_index.append(index)
+ # The list index should not shift when removing static ports from the list
+ # By sorting the indexes found in reverse order, we assure that the highest index is removed first by the NDO backend
+ # This logic is to avoid removing the wrong static ports
+ for index in reversed(sorted(remove_index)):
+ mso.proposed.pop(index)
+ ops.append(dict(op="remove", path="{0}/{1}".format(static_ports_path, index)))
+ mso.sent = mso.proposed
+ elif not force_replace:
+ mso.sent = mso.existing = {}
+ ops.append(dict(op="remove", path=static_port_path))
else:
- new_epg = dict(
- epgRef=dict(
- schemaId=schema_id,
- templateName=template,
- anpName=anp,
- epgName=epg,
- )
- )
+ mso.sent = mso.proposed = mso.existing = []
+ ops.append(dict(op="remove", path=static_ports_path))
- # If anp not in payload then, anp already exists at site level. New payload will only have new EPG payload
- if "anpRef" not in payload:
- op_path = "/sites/{0}/anps/{1}/epgs/-".format(site_template, anp)
- payload = new_epg
+ elif state == "present":
+ if static_ports and force_replace:
+ mso.sent = mso.proposed = [
+ get_static_port_payload(
+ get_full_static_path(
+ static_port.get("type"),
+ static_port.get("pod"),
+ static_port.get("leaf"),
+ static_port.get("fex"),
+ static_port.get("path"),
+ ),
+ static_port.get("deployment_immediacy"),
+ static_port.get("mode"),
+ static_port.get("vlan"),
+ static_port.get("type"),
+ static_port.get("primary_micro_segment_vlan"),
+ )
+ for static_port in static_ports
+ ]
+ if mso.existing:
+ ops.append(dict(op="replace", path=static_ports_path, value=mso.sent))
+ else:
+ ops.append(dict(op="add", path=static_ports_path, value=mso.sent))
+ elif static_ports:
+ mso.sent = mso.proposed = mso.existing.copy()
+ for static_port in static_ports:
+ full_path = get_full_static_path(
+ static_port.get("type"), static_port.get("pod"), static_port.get("leaf"), static_port.get("fex"), static_port.get("path")
+ )
+ payload = get_static_port_payload(
+ full_path,
+ static_port.get("deployment_immediacy"),
+ static_port.get("mode"),
+ static_port.get("vlan"),
+ static_port.get("type"),
+ static_port.get("primary_micro_segment_vlan"),
+ )
+ if full_path not in found_full_paths:
+ ops.append(dict(op="add", path=static_port_path, value=payload))
+ mso.proposed.append(payload)
+ else:
+ index = found_full_paths.index(full_path)
+ mso.proposed[index] = payload
+ ops.append(dict(op="replace", path="{0}/{1}".format(static_ports_path, index), value=payload))
+ else:
+ payload = get_static_port_payload(full_path, deployment_immediacy, mode, vlan, path_type, primary_micro_segment_vlan)
+ mso.sanitize(payload, collate=True)
+ if mso.existing:
+ ops.append(dict(op="replace", path=static_port_path, value=mso.sent))
else:
- # If anp in payload, anp exists at site level. Update payload with EPG payload
- payload["epgs"] = [new_epg]
+ ops.append(dict(op="add", path=static_port_path, value=mso.sent))
+ mso.existing = payload
- # Update index of EPG at site level
- else:
- epg_idx = epgs.index(epg_ref)
+ mso.existing = mso.proposed
- # Get Leaf
- # If anp at site level and epg is at site level
- if "anpRef" not in payload and "epgRef" not in payload:
- portpaths = [p.get("path") for p in schema_obj.get("sites")[site_idx]["anps"][anp_idx]["epgs"][epg_idx]["staticPorts"]]
- if portpath in portpaths:
- portpath_idx = portpaths.index(portpath)
- port_path = "/sites/{0}/anps/{1}/epgs/{2}/staticPorts/{3}".format(site_template, anp, epg, portpath_idx)
- mso.existing = schema_obj.get("sites")[site_idx]["anps"][anp_idx]["epgs"][epg_idx]["staticPorts"][portpath_idx]
+ if not module.check_mode and mso.proposed != mso.previous:
+ mso.request(mso_schema.path, method="PATCH", data=ops)
- if state == "query":
- if leaf is None or vlan is None:
- mso.existing = schema_obj.get("sites")[site_idx]["anps"][anp_idx]["epgs"][epg_idx]["staticPorts"]
- elif not mso.existing:
- mso.fail_json(msg="Static port '{portpath}' not found".format(portpath=portpath))
- mso.exit_json()
+ mso.exit_json()
- ports_path = "/sites/{0}/anps/{1}/epgs/{2}/staticPorts".format(site_template, anp, epg)
- ops = []
- new_leaf = dict(
+
+def set_existing_static_ports(mso, mso_schema, full_paths):
+ mso.existing = []
+ if mso_schema.schema_objects.get("site_anp_epg"):
+ for existing_static_port in mso_schema.schema_objects["site_anp_epg"].details.get("staticPorts"):
+ full_paths.append(existing_static_port.get("path"))
+ mso.existing.append(existing_static_port)
+
+
+def get_static_port_payload(full_path, deployment_immediacy, mode, vlan, path_type, primary_micro_segment_vlan):
+ payload = dict(
deploymentImmediacy=deployment_immediacy,
mode=mode,
- path=portpath,
+ path=full_path,
portEncapVlan=vlan,
type=path_type,
)
if primary_micro_segment_vlan:
- new_leaf.update(microSegVlan=primary_micro_segment_vlan)
+ payload.update(microSegVlan=primary_micro_segment_vlan)
+ return payload
- # If payload is empty, anp and EPG already exist at site level
- if not payload:
- op_path = ports_path + "/-"
- payload = new_leaf
- # If payload exists
+def get_full_static_path(path_type, pod, leaf, fex, path):
+ if path_type == "port" and fex is not None:
+ return "topology/{0}/paths-{1}/extpaths-{2}/pathep-[{3}]".format(pod, leaf, fex, path)
+ elif path_type == "vpc":
+ return "topology/{0}/protpaths-{1}/pathep-[{2}]".format(pod, leaf, path)
else:
- # If anp already exists at site level
- if "anpRef" not in payload:
- payload["staticPorts"] = [new_leaf]
- else:
- payload["epgs"][0]["staticPorts"] = [new_leaf]
-
- mso.previous = mso.existing
- if state == "absent":
- if mso.existing:
- mso.sent = mso.existing = {}
- ops.append(dict(op="remove", path=port_path))
-
- elif state == "present":
- mso.sanitize(payload, collate=True)
-
- if mso.existing:
- ops.append(dict(op="replace", path=port_path, value=mso.sent))
- else:
- ops.append(dict(op="add", path=op_path, value=mso.sent))
-
- mso.existing = new_leaf
-
- if not module.check_mode:
- mso.request(schema_path, method="PATCH", data=ops)
-
- mso.exit_json()
+ return "topology/{0}/paths-{1}/pathep-[{2}]".format(pod, leaf, path)
+
+
+def overwrite_static_path_unprovided_attributes(mso, static_path, path_type, pod, leaf, fex, path, vlan, micro_vlan, deployment_immediacy, mode):
+ required_overwrites = []
+ if not static_path.get("type"):
+ static_path["type"] = path_type
+ if not static_path.get("pod"):
+ static_path["pod"] = pod
+ if not pod:
+ required_overwrites.append("pod")
+ if not static_path.get("leaf"):
+ static_path["leaf"] = leaf
+ if not leaf:
+ required_overwrites.append("leaf")
+ if not static_path.get("fex"):
+ static_path["fex"] = fex
+ if not static_path.get("path"):
+ static_path["path"] = path
+ if not path:
+ required_overwrites.append("path")
+ if not static_path.get("vlan"):
+ static_path["vlan"] = vlan
+ if not vlan:
+ required_overwrites.append("vlan")
+ if not static_path.get("primary_micro_segment_vlan"):
+ static_path["primary_micro_segment_vlan"] = micro_vlan
+ if not static_path.get("deployment_immediacy"):
+ static_path["deployment_immediacy"] = deployment_immediacy
+ if not static_path.get("mode"):
+ static_path["mode"] = mode
+
+ if required_overwrites:
+ mso.fail_json(msg="state is present but all of the following are missing: {0}.".format(", ".join(required_overwrites)))
if __name__ == "__main__":
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_subnet.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_subnet.py
index e5aaeba37..ba55e7c07 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_subnet.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_subnet.py
@@ -100,7 +100,6 @@ EXAMPLES = r"""
epg: EPG1
subnet: 10.0.0.0/24
state: present
- delegate_to: localhost
- name: Remove a subnet from a site EPG
cisco.mso.mso_schema_site_anp_epg_subnet:
@@ -114,7 +113,6 @@ EXAMPLES = r"""
epg: EPG1
subnet: 10.0.0.0/24
state: absent
- delegate_to: localhost
- name: Query a specific site EPG subnet
cisco.mso.mso_schema_site_anp_epg_subnet:
@@ -128,7 +126,6 @@ EXAMPLES = r"""
epg: EPG1
subnet: 10.0.0.0/24
state: query
- delegate_to: localhost
register: query_result
- name: Query all site EPG subnets
@@ -141,7 +138,6 @@ EXAMPLES = r"""
template: Template1
anp: ANP1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_useg_attribute.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_useg_attribute.py
index 3030852f5..7e69f5481 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_useg_attribute.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_anp_epg_useg_attribute.py
@@ -74,7 +74,7 @@ options:
description:
- The uSeg Subnet can only be used when the I(attribute_type) is IP.
- Use C(false) to set the custom uSeg Subnet IP address to the uSeg Attribute.
- - Use C(true) to set the uSeg Subnet IP address to 0.0.0.0.
+ - Use C(true) to set the default uSeg Subnet IP address 0.0.0.0.
type: bool
state:
description:
@@ -104,7 +104,6 @@ EXAMPLES = r"""
useg_subnet: false
value: 10.0.0.0/24
state: present
- delegate_to: localhost
- name: Query a specific EPG uSeg attr with name
cisco.mso.mso_schema_site_anp_epg_useg_attribute:
@@ -118,7 +117,7 @@ EXAMPLES = r"""
name: useg_attr_ip
site: ansible_test
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all EPG uSeg attrs
cisco.mso.mso_schema_site_anp_epg_useg_attribute:
@@ -131,7 +130,7 @@ EXAMPLES = r"""
epg: EPG 1
site: ansible_test
state: query
- delegate_to: localhost
+ register: query_result
- name: Remove a uSeg attr from an EPG with name
cisco.mso.mso_schema_site_anp_epg_useg_attribute:
@@ -145,7 +144,6 @@ EXAMPLES = r"""
site: ansible_test
name: useg_attr_ip
state: absent
- delegate_to: localhost
"""
RETURN = r"""
@@ -251,11 +249,13 @@ def main():
payload = dict(name=name, displayName=name, description=description, type=EPG_U_SEG_ATTR_TYPE_MAP[attribute_type], value=value)
if attribute_type == "ip":
- if useg_subnet is False:
- payload["fvSubnet"] = True
- else:
- payload["fvSubnet"] = False
+ if useg_subnet:
+ if value != "" and value != "0.0.0.0" and value is not None:
+ mso.fail_json(msg="The value of uSeg subnet IP should be an empty string or 0.0.0.0, when the useg_subnet is set to true.")
+ payload["fvSubnet"] = useg_subnet
payload["value"] = "0.0.0.0"
+ else:
+ payload["fvSubnet"] = useg_subnet
mso.sanitize(payload, collate=True)
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd.py
index 35c352fb6..64a798b1a 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd.py
@@ -73,7 +73,6 @@ EXAMPLES = r"""
template: Template1
bd: BD1
state: present
- delegate_to: localhost
- name: Remove a site BD
cisco.mso.mso_schema_site_bd:
@@ -85,7 +84,6 @@ EXAMPLES = r"""
template: Template1
bd: BD1
state: absent
- delegate_to: localhost
- name: Query a specific site BD
cisco.mso.mso_schema_site_bd:
@@ -97,7 +95,6 @@ EXAMPLES = r"""
template: Template1
bd: BD1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site BDs
@@ -109,7 +106,6 @@ EXAMPLES = r"""
site: Site1
template: Template1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_l3out.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_l3out.py
index 8f9581294..2f562a684 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_l3out.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_l3out.py
@@ -94,7 +94,6 @@ EXAMPLES = r"""
l3out:
name: L3out1
state: present
- delegate_to: localhost
- name: Add a new site BD l3out with different schema and template
cisco.mso.mso_schema_site_bd_l3out:
@@ -110,7 +109,6 @@ EXAMPLES = r"""
schema: Schema2
template: Template2
state: present
- delegate_to: localhost
- name: Remove a site BD l3out
cisco.mso.mso_schema_site_bd_l3out:
@@ -124,7 +122,6 @@ EXAMPLES = r"""
l3out:
name: L3out1
state: absent
- delegate_to: localhost
- name: Query a specific site BD l3out
cisco.mso.mso_schema_site_bd_l3out:
@@ -138,7 +135,6 @@ EXAMPLES = r"""
l3out:
name: L3out1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site BD l3outs
@@ -151,7 +147,6 @@ EXAMPLES = r"""
template: Template1
bd: BD1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_subnet.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_subnet.py
index c4ab52eec..9bce8c2da 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_subnet.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_bd_subnet.py
@@ -111,7 +111,6 @@ EXAMPLES = r"""
bd: BD1
subnet: 11.11.11.0/24
state: present
- delegate_to: localhost
- name: Remove a site BD subnet
cisco.mso.mso_schema_site_bd_subnet:
@@ -124,7 +123,6 @@ EXAMPLES = r"""
bd: BD1
subnet: 11.11.11.0/24
state: absent
- delegate_to: localhost
- name: Query a specific site BD subnet
cisco.mso.mso_schema_site_bd_subnet:
@@ -137,7 +135,6 @@ EXAMPLES = r"""
bd: BD1
subnet: 11.11.11.0/24
state: query
- delegate_to: localhost
register: query_result
- name: Query all site BD subnets
@@ -150,7 +147,6 @@ EXAMPLES = r"""
template: Template1
bd: BD1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph.py
new file mode 100644
index 000000000..231ee4284
--- /dev/null
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph.py
@@ -0,0 +1,376 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Sabari Jaganathan (@sajagana) <sajagana@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+
+DOCUMENTATION = r"""
+---
+module: mso_schema_site_contract_service_graph
+short_description: Manage the service graph association with a contract in schema sites
+description:
+- Manage the service graph association with a contract in schema sites on Cisco ACI Multi-Site.
+- This module is only compatible with NDO versions 3.7 and 4.2+. NDO versions 4.0 and 4.1 are not supported.
+author:
+- Sabari Jaganathan (@sajagana)
+options:
+ tenant:
+ description:
+ - The name of the tenant.
+ type: str
+ schema:
+ description:
+ - The name of the schema.
+ type: str
+ required: true
+ template:
+ description:
+ - The name of the template.
+ type: str
+ required: true
+ contract:
+ description:
+ - The name of the contract.
+ type: str
+ site:
+ description:
+ - The name of the site.
+ type: str
+ required: true
+ service_graph_schema:
+ description:
+ - The name of the schema in which the service graph is located.
+ type: str
+ service_graph_template:
+ description:
+ - The name of the template in which the service graph is located.
+ type: str
+ service_graph:
+ description:
+ - The name of the service graph to associate with the site contract.
+ type: str
+ node_relationship:
+ description:
+ - A list of nodes and their connector details associated with the Service Graph.
+ type: list
+ elements: dict
+ suboptions:
+ cluster_interface_device:
+ description:
+ - The name of the cluster interface device.
+ type: str
+ required: true
+ aliases: [ cluster_device, device, device_name ]
+ provider_connector_cluster_interface:
+ description:
+ - The name of the cluster interface for the provider connector.
+ type: str
+ required: true
+ aliases: [ provider_cluster_interface, provider_interface, provider_interface_name ]
+ provider_connector_redirect_policy_tenant:
+ description:
+ - The name of the tenant for the provider connector redirect policy.
+ type: str
+ aliases: [ provider_redirect_policy_tenant, provider_tenant ]
+ provider_connector_redirect_policy:
+ description:
+ - The name of the redirect policy for the provider connector.
+ type: str
+ aliases: [ provider_redirect_policy, provider_policy ]
+ consumer_connector_cluster_interface:
+ description:
+ - The name of the cluster interface for the consumer connector.
+ type: str
+ required: true
+ aliases: [ consumer_cluster_interface, consumer_interface, consumer_interface_name ]
+ consumer_connector_redirect_policy_tenant:
+ description:
+ - The name of the tenant for the consumer connector redirect policy.
+ type: str
+ aliases: [ consumer_redirect_policy_tenant, consumer_tenant ]
+ consumer_connector_redirect_policy:
+ description:
+ - The name of the redirect policy for the consumer connector.
+ type: str
+ aliases: [ consumer_redirect_policy, consumer_policy ]
+ consumer_subnet_ips:
+ description:
+ - The list of subnet IPs for the consumer connector.
+ - The subnet IPs option is only available for the load balancer devices.
+ type: list
+ elements: str
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+seealso:
+- module: cisco.mso.mso_schema_template_contract_service_graph
+extends_documentation_fragment: cisco.mso.modules
+"""
+
+
+EXAMPLES = r"""
+- name: Associate a service graph with a site contract
+ cisco.mso.mso_schema_site_contract_service_graph:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ schema: ansible_schema
+ template: ansible_template1
+ site: ansible_test
+ contract: Contract1
+ service_graph_schema: ansible_schema
+ service_graph_template: ansible_template1
+ service_graph: sg
+ node_relationship:
+ - cluster_interface_device: ansible_tenant_firewall1
+ provider_connector_cluster_interface: clu_if1
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if1
+ consumer_connector_redirect_policy: redirect_policy1
+ - cluster_interface_device: ansible_tenant_adc
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy: redirect_policy1
+ consumer_subnet_ips: ["1.1.1.1/24", "4.4.4.4/24"]
+ - cluster_interface_device: ansible_tenant_other
+ provider_connector_cluster_interface: clu_if4
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if4
+ consumer_connector_redirect_policy: redirect_policy1
+ state: present
+
+- name: Associate a service graph with a cloud site contract
+ cisco.mso.mso_schema_site_contract_service_graph:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ tenant: ansible_tenant
+ schema: ansible_schema
+ template: ansible_template1
+ site: ansible_test
+ contract: Contract1
+ service_graph_schema: ansible_schema
+ service_graph_template: ansible_template1
+ service_graph: sg
+ state: present
+
+- name: Query a site contract service graph with contract name
+ cisco.mso.mso_schema_site_contract_service_graph:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: ansible_schema
+ template: ansible_template1
+ contract: Contract1
+ site: ansible_test
+ state: query
+ register: query_result
+
+- name: Query all site contract service graphs associated with a site template
+ cisco.mso.mso_schema_site_contract_service_graph:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: ansible_schema
+ template: ansible_template1
+ site: ansible_test
+ state: query
+ register: query_result
+
+- name: Remove a site contract service graph with contract name
+ cisco.mso.mso_schema_site_contract_service_graph:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: ansible_schema
+ template: ansible_template1
+ site: ansible_test
+ contract: Contract1
+ state: absent
+"""
+
+RETURN = r"""
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.mso.plugins.module_utils.schema import MSOSchema
+from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, mso_argument_spec, mso_schema_site_contract_service_graph_spec
+
+
+def main():
+ argument_spec = mso_argument_spec()
+ argument_spec.update(
+ tenant=dict(type="str"),
+ schema=dict(type="str", required=True),
+ template=dict(type="str", required=True),
+ contract=dict(type="str"),
+ site=dict(type="str", required=True),
+ service_graph_schema=dict(type="str"),
+ service_graph_template=dict(type="str"),
+ service_graph=dict(type="str"),
+ node_relationship=dict(type="list", elements="dict", options=mso_schema_site_contract_service_graph_spec()),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["contract"]],
+ ["state", "present", ["contract", "service_graph"]],
+ ],
+ )
+
+ tenant = module.params.get("tenant")
+ schema = module.params.get("schema")
+ template = module.params.get("template").replace(" ", "")
+ contract = module.params.get("contract")
+ site = module.params.get("site")
+ service_graph_schema = module.params.get("service_graph_schema")
+ service_graph_template = module.params.get("service_graph_template")
+ service_graph = module.params.get("service_graph")
+ node_relationship = module.params.get("node_relationship")
+ state = module.params.get("state")
+
+ mso = MSOModule(module)
+
+ mso_schema = MSOSchema(mso, schema, template)
+ mso_schema.set_template(template)
+
+ service_graph_schema_id = schema_id = mso.lookup_schema(schema, True)
+ service_graph_reference_schema = service_graph_schema or schema
+
+ # Get service graph reference schema id if the service graph schema is not matching with the schema
+ if service_graph_reference_schema != schema:
+ service_graph_schema_id = mso.lookup_schema(service_graph_reference_schema, True)
+ if service_graph_schema_id is None:
+ mso.fail_json(msg="Provided service_graph_schema: '{0}' does not exist.".format(service_graph_schema))
+
+ service_graph_reference_schema_id = service_graph_schema_id or schema_id
+ service_graph_reference_template = service_graph_template or template
+
+ # Get site id
+ site_id = mso.lookup_site(site)
+ mso_schema.set_site(template, site)
+ mso_schema.set_site_contract(contract, False)
+
+ if mso.site_type == "on-premise" and state == "present":
+ # When site type is on-premise, both node_relationship and tenant are required
+ if node_relationship is None and tenant is None:
+ mso.fail_json(msg="The node_relationship and tenant attributes are required when state is present and site type is on-premise.")
+ elif node_relationship is None:
+ mso.fail_json(msg="The node_relationship attribute is required when state is present and site type is on-premise.")
+ elif tenant is None:
+ mso.fail_json(msg="The tenant attribute is required when state is present and site type is on-premise.")
+
+ if contract and mso_schema.schema_objects["site_contract"] is not None:
+ site_contract_service_graph = mso_schema.schema_objects["site_contract"].details.get("serviceGraphRelationship")
+ if site_contract_service_graph and service_graph:
+ site_contract_service_graph_name = site_contract_service_graph.get("serviceGraphRef").split("/")[-1]
+ if site_contract_service_graph_name == service_graph:
+ mso.existing = site_contract_service_graph
+ else:
+ mso.fail_json(msg="The service graph: {0} does not associated with the site contract: {1}.".format(service_graph, contract))
+ elif site_contract_service_graph and service_graph is None:
+ mso.existing = site_contract_service_graph
+ elif contract is not None and mso_schema.schema_objects["site_contract"] is None:
+ mso.fail_json(msg="The site contract: {0} does not exist.".format(contract))
+ elif contract is None and mso_schema.schema_objects["site"].details.get("contracts"):
+ mso.existing = [
+ contract.get("serviceGraphRelationship")
+ for contract in mso_schema.schema_objects["site"].details.get("contracts")
+ if contract.get("serviceGraphRelationship")
+ ]
+
+ if state == "query":
+ mso.exit_json()
+
+ site_contract_service_graph_path = "/sites/{0}-{1}/contracts/{2}/serviceGraphRelationship".format(site_id, service_graph_reference_template, contract)
+
+ ops = []
+ mso.previous = mso.existing
+
+ if state == "absent":
+ mso.existing = {}
+ ops.append(dict(op="remove", path=site_contract_service_graph_path))
+ elif state == "present":
+ service_graph_ref = dict(schemaId=service_graph_reference_schema_id, serviceGraphName=service_graph, templateName=service_graph_reference_template)
+ service_node_relationship = []
+ if mso.site_type == "on-premise" and node_relationship:
+ for node_index, node in enumerate(node_relationship, 1):
+ service_node_ref = dict(
+ schemaId=service_graph_reference_schema_id,
+ serviceGraphName=service_graph,
+ serviceNodeName="node{0}".format(node_index),
+ templateName=service_graph_reference_template,
+ )
+
+ consumer_subnet_ips_list = [dict(ip=subnet) for subnet in node.get("consumer_subnet_ips")] if node.get("consumer_subnet_ips") else []
+ consumer_connector = dict(
+ clusterInterface=dict(
+ dn="uni/tn-{0}/lDevVip-{1}/lIf-{2}".format(
+ tenant, node.get("cluster_interface_device"), node.get("consumer_connector_cluster_interface")
+ )
+ ),
+ redirectPolicy=dict(
+ dn="uni/tn-{0}/svcCont/svcRedirectPol-{1}".format(
+ node.get("consumer_connector_redirect_policy_tenant") or tenant, node.get("consumer_connector_redirect_policy")
+ )
+ ),
+ subnets=consumer_subnet_ips_list,
+ )
+ provider_connector = dict(
+ clusterInterface=dict(
+ dn="uni/tn-{0}/lDevVip-{1}/lIf-{2}".format(
+ tenant, node.get("cluster_interface_device"), node.get("provider_connector_cluster_interface")
+ )
+ ),
+ redirectPolicy=dict(
+ dn="uni/tn-{0}/svcCont/svcRedirectPol-{1}".format(
+ node.get("provider_connector_redirect_policy_tenant") or tenant, node.get("provider_connector_redirect_policy")
+ )
+ ),
+ )
+ service_node_relationship.append(
+ dict(consumerConnector=consumer_connector, providerConnector=provider_connector, serviceNodeRef=service_node_ref)
+ )
+
+ payload = dict(serviceGraphRef=service_graph_ref, serviceNodesRelationship=service_node_relationship)
+ elif mso.cloud_provider_type == "azure":
+ mso_schema.set_site_service_graph(service_graph)
+ service_nodes = mso_schema.schema_objects["site_service_graph"].details.get("serviceNodes", [])
+ payload = dict(
+ serviceGraphRef=service_graph_ref, serviceNodesRelationship=[dict(serviceNodeRef=sg_node.get("serviceNodeRef")) for sg_node in service_nodes]
+ )
+
+ mso.sanitize(payload, collate=True)
+
+ if mso.existing:
+ ops.append(dict(op="replace", path=site_contract_service_graph_path, value=mso.sent))
+ else:
+ ops.append(dict(op="add", path=site_contract_service_graph_path, value=mso.sent))
+
+ mso.existing = mso.proposed
+
+ if not module.check_mode:
+ mso.request(mso_schema.path, method="PATCH", data=ops)
+
+ mso.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph_listener.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph_listener.py
new file mode 100644
index 000000000..b854f0404
--- /dev/null
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_contract_service_graph_listener.py
@@ -0,0 +1,739 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2024, Sabari Jaganathan (@sajagana) <sajagana@cisco.com>
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported_by": "community"}
+
+
+DOCUMENTATION = r"""
+---
+module: mso_schema_site_contract_service_graph_listener
+short_description: Manage the listener for Azure site contract service graph in schema sites
+description:
+- Manage the listener for Azure site contract service graph in schema sites on Cisco ACI Multi-Site.
+- This module is only compatible with NDO versions 3.7 and 4.2+. NDO versions 4.0 and 4.1 are not supported.
+author:
+- Sabari Jaganathan (@sajagana)
+options:
+ tenant:
+ description:
+ - The name of the tenant.
+ type: str
+ device:
+ description:
+ - The name of the device.
+ type: str
+ aliases: [ device_name ]
+ schema:
+ description:
+ - The name of the schema.
+ type: str
+ required: true
+ template:
+ description:
+ - The name of the template.
+ type: str
+ required: true
+ contract:
+ description:
+ - The name of the contract.
+ type: str
+ required: true
+ site:
+ description:
+ - The name of the site.
+ type: str
+ required: true
+ service_node_index:
+ description:
+ - The index of the service node in the site contract service graph. The value starts from 0.
+ type: int
+ listener:
+ description:
+ - The name of the listener.
+ type: str
+ aliases: [ name, listener_name ]
+ listener_protocol:
+ description:
+ - The protocol of the listener.
+ type: str
+ choices: [ http, https, tcp, udp, tls, inherit ]
+ listener_port:
+ description:
+ - The port of the listener.
+ type: int
+ security_policy:
+ description:
+ - The security policy of the listener.
+ type: str
+ choices: [
+ default,
+ elb_sec_2016_18,
+ elb_sec_fs_2018_06,
+ elb_sec_tls_1_2_2017_01,
+ elb_sec_tls_1_2_ext_2018_06,
+ elb_sec_tls_1_1_2017_01,
+ elb_sec_2015_05,
+ elb_sec_tls_1_0_2015_04,
+ app_gw_ssl_default,
+ app_gw_ssl_2015_501,
+ app_gw_ssl_2017_401,
+ app_gw_ssl_2017_401s
+ ]
+ ssl_certificates:
+ description:
+ - The ssl certificates of the listener.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - The name of the ssl certificate.
+ type: str
+ required: true
+ certificate_store:
+ description:
+ - The certificate store of the ssl certificate.
+ type: str
+ required: true
+ choices: [ default, iam, acm ]
+ frontend_ip:
+ description:
+ - The frontend ip of the listener. Only supported for Network load balancers.
+ type: str
+ rules:
+ description:
+ - The rules of the listener.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - The name of the rule.
+ type: str
+ required: true
+ floating_ip:
+ description:
+ - The floating ip of the rule.
+ type: str
+ priority:
+ description:
+ - The priority of the rule.
+ type: int
+ required: true
+ host:
+ description:
+ - The host of the rule.
+ type: str
+ path:
+ description:
+ - The path of the rule.
+ type: str
+ action:
+ description:
+ - The action of the rule.
+ type: str
+ action_type:
+ description:
+ - The action type of the rule.
+ type: str
+ required: true
+ choices: [ fixed_response, forward, redirect, ha_port ]
+ content_type:
+ description:
+ - The content type of the rule.
+ type: str
+ choices: [ text_plain, text_css, text_html, app_js, app_json ]
+ port:
+ description:
+ - The port of the rule.
+ type: int
+ protocol:
+ description:
+ - The protocol of the rule.
+ type: str
+ choices: [ http, https, tcp, udp, tls, inherit ]
+ provider_epg:
+ description:
+ - The provider epg of the rule.
+ type: dict
+ suboptions:
+ schema:
+ description:
+ - The schema name of the provider epg reference.
+ type: str
+ template:
+ description:
+ - The template name of the provider epg reference.
+ type: str
+ anp_name:
+ description:
+ - The application profile name of the provider epg reference.
+ type: str
+ required: true
+ aliases: [ anp ]
+ epg_name:
+ description:
+ - The epg (Endpoint Group) name of the provider epg reference.
+ type: str
+ required: true
+ aliases: [ epg ]
+ url_type:
+ description:
+ - The url type of the rule.
+ type: str
+ choices: [ original, custom ]
+ custom_url:
+ description:
+ - The custom url of the rule.
+ type: str
+ redirect_host_name:
+ description:
+ - The redirect host name of the rule.
+ type: str
+ redirect_path:
+ description:
+ - The redirect path of the rule.
+ type: str
+ redirect_query:
+ description:
+ - The redirect query of the rule.
+ type: str
+ response_code:
+ description:
+ - The response code of the rule.
+ type: str
+ response_body:
+ description:
+ - The response body of the rule.
+ type: str
+ redirect_protocol:
+ description:
+ - The redirect protocol of the rule.
+ type: str
+ choices: [ http, https, tcp, udp, tls, inherit ]
+ redirect_port:
+ description:
+ - The redirect port of the rule.
+ type: int
+ redirect_code:
+ description:
+ - The redirect code of the rule.
+ type: str
+ choices: [ unknown, permanently_moved, found, see_other, temporary_redirect ]
+ health_check:
+ description:
+ - The health check of the rule.
+ type: dict
+ suboptions:
+ port:
+ description:
+ - The port of the health check.
+ type: int
+ protocol:
+ description:
+ - The protocol of the health check.
+ type: str
+ choices: [ http, https, tcp, udp, tls, inherit ]
+ path:
+ description:
+ - The path of the health check.
+ type: str
+ interval:
+ description:
+ - The interval of the health check.
+ type: int
+ timeout:
+ description:
+ - The timeout of the health check.
+ type: int
+ unhealthy_threshold:
+ description:
+ - The unhealthy threshold of the health check.
+ type: int
+ use_host_from_rule:
+ description:
+ - The use host from rule of the health check.
+ type: bool
+ host:
+ description:
+ - The host of the health check. The host attribute will be enabled when the I(use_host_from_rule) is false.
+ type: str
+ success_code:
+ description:
+ - The success code of the health check.
+ type: str
+ target_ip_type:
+ description:
+ - The target ip type of the rule.
+ type: str
+ choices: [ unspecified, primary, secondary ]
+ state:
+ description:
+ - Use C(present) or C(absent) for adding or removing.
+ - Use C(query) for listing an object or multiple objects.
+ type: str
+ choices: [ absent, present, query ]
+ default: present
+seealso:
+- module: cisco.mso.mso_schema_template_contract_service_graph
+extends_documentation_fragment: cisco.mso.modules
+"""
+
+
+EXAMPLES = r"""
+- name: Add a listener for Network Load-Balancer
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ contract: "Contract2"
+ schema: mso_schema
+ template: ansible_template1
+ site: mso_site
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: mso_tenant
+ frontend_ip: "10.10.10.10"
+ device: ans_test_nlb
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: tcp
+ interval: 5
+ unhealthy_threshold: 2
+ success_code: 200-399
+
+- name: Add a listener for Application Load-Balancer
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ contract: "Contract2"
+ schema: mso_schema
+ template: ansible_template1
+ site: mso_site
+ service_node_index: 1
+ listener: aplb_li_https
+ tenant: mso_tenant
+ device: ans_test_aplb
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: ans_test_keyring
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+
+- name: Query all listeners
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ contract: "Contract2"
+ schema: mso_schema
+ template: ansible_template1
+ site: mso_site
+ state: query
+ register: query_all_listeners
+
+- name: Query all listeners with name ans_li_common
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ contract: "Contract2"
+ schema: mso_schema
+ template: ansible_template1
+ site: mso_site
+ listener: ans_li_common
+ state: query
+ register: query_all_ans_li_common
+
+- name: Query a listener with name - aplb_li_https
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ contract: "Contract2"
+ schema: mso_schema
+ template: ansible_template1
+ site: mso_site
+ service_node_index: 1
+ listener: aplb_li_https
+ state: query
+ register: query_aplb_li_https
+
+- name: Remove an existing listener - ans_li_common
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ contract: "Contract2"
+ schema: mso_schema
+ template: ansible_template1
+ site: mso_site
+ service_node_index: 1
+ listener: aplb_li_https
+ state: absent
+"""
+
+RETURN = r"""
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.cisco.mso.plugins.module_utils.schema import MSOSchema
+from ansible_collections.cisco.mso.plugins.module_utils.mso import (
+ MSOModule,
+ mso_argument_spec,
+ listener_ssl_certificates_spec,
+ listener_rules_spec,
+)
+from ansible_collections.cisco.mso.plugins.module_utils.constants import (
+ LISTENER_REDIRECT_CODE_MAP,
+ LISTENER_CONTENT_TYPE_MAP,
+ LISTENER_ACTION_TYPE_MAP,
+ LISTENER_SECURITY_POLICY_MAP,
+ LISTENER_PROTOCOLS,
+ YES_OR_NO_TO_BOOL_STRING_MAP,
+)
+
+
+def main():
+ argument_spec = mso_argument_spec()
+ argument_spec.update(
+ tenant=dict(type="str"),
+ device=dict(type="str", aliases=["device_name"]),
+ schema=dict(type="str", required=True),
+ template=dict(type="str", required=True),
+ contract=dict(type="str", required=True),
+ site=dict(type="str", required=True),
+ service_node_index=dict(type="int"),
+ listener=dict(type="str", aliases=["name", "listener_name"]),
+ listener_protocol=dict(type="str", choices=LISTENER_PROTOCOLS),
+ listener_port=dict(type="int"),
+ security_policy=dict(type="str", choices=list(LISTENER_SECURITY_POLICY_MAP)),
+ ssl_certificates=dict(type="list", elements="dict", options=listener_ssl_certificates_spec()),
+ frontend_ip=dict(type="str"),
+ rules=dict(type="list", elements="dict", options=listener_rules_spec()),
+ state=dict(type="str", default="present", choices=["absent", "present", "query"]),
+ )
+
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ required_if=[
+ ["state", "absent", ["listener"]],
+ ["state", "present", ["listener", "listener_protocol", "listener_port", "rules"]],
+ ],
+ )
+
+ mso = MSOModule(module)
+ site = module.params.get("site")
+
+ # Get site id
+ site_id = mso.lookup_site(site)
+
+ if mso.site_type == "on-premise" or mso.cloud_provider_type != "azure":
+ mso.fail_json(msg="The Site Contract Service Graph Listener is not supported for the site: {0}.".format(site))
+
+ schema = module.params.get("schema")
+ template = module.params.get("template")
+ contract = module.params.get("contract")
+ service_node_index = module.params.get("service_node_index")
+ listener = module.params.get("listener")
+ tenant = module.params.get("tenant")
+ device = module.params.get("device")
+ listener_protocol = module.params.get("listener_protocol")
+ listener_port = module.params.get("listener_port")
+ security_policy = LISTENER_SECURITY_POLICY_MAP.get(module.params.get("security_policy"))
+ ssl_certificates = module.params.get("ssl_certificates")
+ frontend_ip = module.params.get("frontend_ip")
+ rules = module.params.get("rules")
+ state = module.params.get("state")
+
+ if listener_protocol == "https":
+ mso.input_validation("listener_protocol", "https", ["security_policy", "ssl_certificates"], module.params, None, object_name=listener)
+
+ mso_schema = MSOSchema(mso, schema, template)
+ mso_schema.set_template(template)
+ schema_id = mso.lookup_schema(schema, True)
+ mso_schema.set_site(template, site)
+ mso_schema.set_site_contract(contract, False)
+
+ service_graph_ref = mso_schema.schema_objects["site_contract"].details.get("serviceGraphRelationship", {}).get("serviceGraphRef")
+ service_nodes = mso_schema.schema_objects["site_contract"].details.get("serviceGraphRelationship", {}).get("serviceNodesRelationship", [])
+
+ parent_present = False
+
+ if service_graph_ref is None:
+ mso.fail_json(msg="The site contract: {0} is not associated with a service graph.".format(contract))
+ # Parent object present check
+ else:
+ if service_node_index is not None and service_node_index >= 0:
+ if len(service_nodes) > 0 and len(service_nodes) > service_node_index:
+ service_node = service_nodes[service_node_index]
+ # Query all listeners under a contract service node
+ # The below condition was never false if the service graph was created properly, but condition is required to avoid error
+ if service_node.get("serviceNodeRef") and service_node.get("serviceNodeRef").split("/")[-1] == "node{0}".format(service_node_index + 1):
+ listeners = service_node.get("deviceConfiguration", {}).get("cloudLoadBalancer", {}).get("listeners", [])
+ if listeners:
+ parent_present = True
+ if listener:
+ for listener_data in listeners:
+ if listener_data.get("name") == listener:
+ mso.existing = listener_data
+ break
+ else:
+ mso.existing = listeners
+ else:
+ mso.fail_json(
+ msg="The service_node_index: {0} is not matching with the service node reference: {1}.".format(
+ service_node_index, service_node.get("serviceNodeRef")
+ )
+ )
+ else:
+ mso.fail_json(msg="The service_node_index: {0} is out of range.".format(service_node_index))
+
+ # Query all listeners under a contract does not require service_node_index, so the below condition is required
+ elif state == "query":
+ # Query all listeners under a contract
+ for service_node in service_nodes:
+ listeners = service_node.get("deviceConfiguration", {}).get("cloudLoadBalancer", {}).get("listeners", [])
+ if listener:
+ for listener_data in listeners:
+ # Query a listener under a contract service node
+ if listener_data.get("name") == listener:
+ mso.existing = ([listener_data] + mso.existing) if mso.existing else [listener_data]
+ break
+ else:
+ mso.existing = (listeners + mso.existing) if mso.existing else listeners
+
+ else:
+ mso.fail_json(msg="The service_node_index: {0} is not valid.".format(service_node_index))
+
+ if state == "query":
+ mso.exit_json()
+
+ ops = []
+ mso.previous = mso.existing
+
+ parent_object = {}
+
+ if state == "present":
+ # Parent object creation logic begins
+ if device is None and parent_present is False:
+ mso.fail_json(msg="The 'device' name is required to initialize the parent object.")
+
+ elif device is not None and parent_present is False:
+ query_device_data = mso.lookup_service_node_device(site_id, tenant, device_name=device)
+
+ if query_device_data.get("deviceVendorType") == "NATIVELB" and (
+ query_device_data.get("devType") == "application" or query_device_data.get("devType") == "network"
+ ):
+ mso_schema.set_site_service_graph(service_graph_ref.split("/")[-1])
+
+ for sg in mso_schema.schema_objects["site_service_graph"].details.get("serviceNodes", []):
+ if device == sg.get("device").get("dn").split("/")[-1].split("-")[-1]:
+ parent_object = dict(deviceConfiguration=dict(cloudLoadBalancer=dict(listeners=[])), serviceNodeRef=sg.get("serviceNodeRef"))
+ break
+ else:
+ mso.fail_json(
+ msg="Listener is not supported for the 'service_node_index': {0} is associated with the Third-Party {1} device.".format(
+ service_node_index, "Load Balancer" if query_device_data.get("deviceVendorType") == "ADC" else "Firewall"
+ )
+ )
+ # Parent object creation logic ends
+
+ # Listener object creation logic begins
+ listener_object = dict(
+ name=listener,
+ protocol=listener_protocol,
+ port=listener_port,
+ secPolicy=security_policy,
+ )
+
+ if frontend_ip:
+ mso.input_validation("frontend_ip", frontend_ip, ["tenant", "device"], module.params, None, object_name=listener)
+ listener_object["nlbDevIp"] = dict(name=frontend_ip, dn="uni/tn-{0}/clb-{1}/vip-{2}".format(tenant, device, frontend_ip))
+
+ if ssl_certificates:
+ listener_object["certificates"] = [
+ {
+ "name": ssl_certificate.get("name"),
+ "tDn": "uni/tn-{0}/certstore".format(tenant),
+ "default": True,
+ "store": ssl_certificate.get("certificate_store"),
+ }
+ for ssl_certificate in ssl_certificates
+ ]
+
+ # Rules object creation logic
+ rules_data = []
+
+ for position, rule in enumerate(rules, 0):
+ if (listener_protocol == "http" and rule.get("protocol") == "http") or (listener_protocol == "https" and rule.get("protocol") == "https"):
+ mso.fail_json(msg="When the 'listener_protocol' is '{0}', the rule 'protocol' must be '{1}'".format(listener_protocol, rule.get("protocol")))
+
+ if rule.get("action_type") == "redirect":
+ mso.input_validation(
+ "action_type", "redirect", ["redirect_protocol", "redirect_port", "url_type", "redirect_code"], rule, position, rule.get("name")
+ )
+ elif rule.get("action_type") == "forward":
+ mso.input_validation("action_type", "forward", ["protocol", "port", "health_check"], rule, position, rule.get("name"))
+
+ if rule.get("url_type") == "custom":
+ mso.input_validation(
+ "url_type", "custom", ["redirect_host_name", "redirect_path", "redirect_query", "response_code"], rule, position, rule.get("name")
+ )
+
+ rule_data = dict(
+ name=rule.get("name"),
+ floatingIp=rule.get("floating_ip"),
+ index=rule.get("priority"),
+ host=rule.get("host"),
+ path=rule.get("path"),
+ action=rule.get("action"),
+ actionType=LISTENER_ACTION_TYPE_MAP.get(rule.get("action_type")),
+ contentType=LISTENER_CONTENT_TYPE_MAP.get(rule.get("content_type")),
+ port=rule.get("port"),
+ protocol=rule.get("protocol"),
+ urlType=rule.get("url_type"),
+ customURL=rule.get("custom_url"),
+ redirectHostName=rule.get("redirect_host_name"),
+ redirectPath=rule.get("redirect_path"),
+ redirectQuery=rule.get("redirect_query"),
+ responseCode=rule.get("response_code"),
+ responseBody=rule.get("response_body"),
+ redirectProtocol=rule.get("redirect_protocol"),
+ redirectPort=rule.get("redirect_port"),
+ redirectCode=LISTENER_REDIRECT_CODE_MAP.get(rule.get("redirect_code")),
+ targetIpType=rule.get("target_ip_type"),
+ )
+
+ if listener_protocol in ["tcp", "udp"]:
+ mso.input_validation("listener_protocol", "tcp/udp", ["health_check"], rule)
+
+ provider_epg = rule.get("provider_epg")
+ if provider_epg:
+ rule_data["providerEpgRef"] = "/schemas/{0}/templates/{1}/anps/{2}/epgs/{3}".format(
+ provider_epg.get("schema") or schema_id,
+ provider_epg.get("template_name") or template,
+ provider_epg.get("anp_name"),
+ provider_epg.get("epg_name"),
+ )
+
+ health_check = rule.get("health_check")
+ if health_check:
+ if listener_protocol in ["tcp", "udp"]:
+ if health_check.get("protocol") == "tcp":
+ mso.input_validation("health_check - 'protocol'", "tcp", ["port", "unhealthy_threshold", "interval"], health_check)
+ elif health_check.get("protocol") in ["http", "https"]:
+ mso.input_validation("health_check - 'protocol'", "http/https", ["port", "path", "unhealthy_threshold", "interval"], health_check)
+ elif (listener_protocol == "http" and health_check.get("protocol") == "https") or (
+ listener_protocol == "https" and health_check.get("protocol") == "http"
+ ):
+ mso.input_validation(
+ "health_check - 'protocol'", "http/https", ["port", "path", "unhealthy_threshold", "timeout", "interval"], health_check
+ )
+ else:
+ mso.fail_json(
+ msg=(
+ "The 'listener_protocol': {0} and the health_check protocol: {1} "
+ + "is not a valid configuration at the object position: {2} and the object name: {3}"
+ ).format(listener_protocol, health_check.get("protocol"), position, rule.get("name"))
+ )
+
+ health_check_data = dict(
+ port=health_check.get("port"),
+ protocol=health_check.get("protocol"),
+ path=health_check.get("path"),
+ interval=health_check.get("interval"),
+ timeout=health_check.get("timeout"),
+ unhealthyThreshold=health_check.get("unhealthy_threshold"),
+ successCode=health_check.get("success_code"),
+ useHostFromRule=YES_OR_NO_TO_BOOL_STRING_MAP.get(health_check.get("use_host_from_rule")),
+ host=health_check.get("host"),
+ )
+
+ rule_data["healthCheck"] = health_check_data
+
+ rules_data.append(rule_data)
+
+ listener_object["rules"] = rules_data
+
+ if parent_present:
+ # Update an existing listener
+ if mso.existing:
+ listener_path = (
+ "/sites/{0}-{1}/contracts/{2}/serviceGraphRelationship/serviceNodesRelationship/{3}/deviceConfiguration/cloudLoadBalancer/listeners/{4}"
+ ).format(site_id, template, contract, service_node_index, listener)
+ op = "replace"
+ else:
+ # Create a new listener
+ listener_path = (
+ "/sites/{0}-{1}/contracts/{2}/serviceGraphRelationship/serviceNodesRelationship/{3}/deviceConfiguration/cloudLoadBalancer/listeners/-"
+ ).format(site_id, template, contract, service_node_index)
+ op = "add"
+ parent_object = listener_object
+ else:
+ # Create a new listener with parent object
+ listener_path = "/sites/{0}-{1}/contracts/{2}/serviceGraphRelationship/serviceNodesRelationship/{3}".format(
+ site_id, template, contract, service_node_index
+ )
+ op = "replace"
+ parent_object["deviceConfiguration"]["cloudLoadBalancer"]["listeners"].append(listener_object)
+
+ mso.sanitize(parent_object, collate=True)
+ ops.append(dict(op=op, path=listener_path, value=mso.sent))
+
+ elif state == "absent":
+ if mso.existing:
+ listener_path = (
+ "/sites/{0}-{1}/contracts/{2}/serviceGraphRelationship/serviceNodesRelationship/{3}/deviceConfiguration/cloudLoadBalancer/listeners/{4}"
+ ).format(site_id, template, contract, service_node_index, listener)
+ ops.append(dict(op="remove", path=listener_path))
+
+ mso.existing = mso.proposed
+
+ if not module.check_mode:
+ mso.request(mso_schema.path, method="PATCH", data=ops)
+
+ mso.exit_json()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg.py
index dff4cf152..ee48df378 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg.py
@@ -1,7 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
-# Copyright: (c) 2021, Anvitha Jain (@anvitha-jain) <anvjain@cisco.com>
+# Copyright: (c) 2021, 2023, Anvitha Jain (@anvitha-jain) <anvjain@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -13,7 +13,7 @@ ANSIBLE_METADATA = {"metadata_version": "1.1", "status": ["preview"], "supported
DOCUMENTATION = r"""
---
module: mso_schema_site_external_epg
-short_description: Manage External EPG in schema of sites
+short_description: Manage External EPG in schema of sites.
description:
- Manage External EPG in schema of sites on Cisco ACI Multi-Site.
- This module can only be used on versions of MSO that are 3.3 or greater.
@@ -34,6 +34,19 @@ options:
description:
- The L3Out associated with the external epg.
- Required when site is of type on-premise.
+ - In NDO versions over 4.2, the parameter is accessible only when an external EPG is
+ - linked to the current schema-template's VRF.
+ type: str
+ aliases: [ l3out_name ]
+ l3out_schema:
+ description:
+ - The schema that defines the referenced L3Out.
+ - If this parameter is unspecified, it defaults to the current schema.
+ type: str
+ l3out_template:
+ description:
+ - The template that defines the referenced L3Out.
+ - If this parameter is unspecified, it defaults to the current template.
type: str
external_epg:
description:
@@ -75,7 +88,6 @@ EXAMPLES = r"""
external_epg: External EPG 1
l3out: L3out1
state: present
- delegate_to: localhost
- name: Remove a Site External EPG
cisco.mso.mso_schema_site_external_epg:
@@ -87,7 +99,6 @@ EXAMPLES = r"""
external_epg: External EPG 1
l3out: L3out1
state: absent
- delegate_to: localhost
- name: Query a Site External EPG
cisco.mso.mso_schema_site_external_epg:
@@ -99,7 +110,7 @@ EXAMPLES = r"""
external_epg: External EPG 1
l3out: L3out1
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all Site External EPGs
cisco.mso.mso_schema_site_external_epg:
@@ -109,7 +120,7 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
@@ -126,7 +137,9 @@ def main():
schema=dict(type="str", required=True),
template=dict(type="str", required=True),
site=dict(type="str", required=True),
- l3out=dict(type="str"),
+ l3out=dict(type="str", aliases=["l3out_name"]),
+ l3out_schema=dict(type="str"),
+ l3out_template=dict(type="str"),
external_epg=dict(type="str", aliases=["name"]),
route_reachability=dict(type="str", default="internet", choices=["internet", "site-ext"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
@@ -142,15 +155,21 @@ def main():
)
schema = module.params.get("schema")
- template = module.params.get("template")
+ template = module.params.get("template").replace(" ", "")
site = module.params.get("site")
external_epg = module.params.get("external_epg")
l3out = module.params.get("l3out")
+ l3out_schema = module.params.get("l3out_schema")
+ l3out_template = module.params.get("l3out_template")
route_reachability = module.params.get("route_reachability")
state = module.params.get("state")
mso = MSOModule(module)
+ l3out_template = template if l3out_template is None else l3out_template.replace(" ", "")
+ l3out_schema = schema if l3out_schema is None else l3out_schema
+ l3out_schema_id = mso.lookup_schema(l3out_schema)
+
mso_schema = MSOSchema(mso, schema, template, site)
mso_objects = mso_schema.schema_objects
@@ -175,7 +194,6 @@ def main():
ops = []
l3out_dn = ""
-
if state == "query":
if external_epg is None:
mso.existing = mso_objects.get("site").details.get("externalEpgs")
@@ -208,8 +226,8 @@ def main():
),
l3outDn=l3out_dn,
l3outRef=dict(
- schemaId=mso_schema.id,
- templateName=template,
+ schemaId=l3out_schema_id,
+ templateName=l3out_template,
l3outName=l3out,
),
routeReachabilityInternetType=route_reachability,
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg_selector.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg_selector.py
index 001ebf2b5..e4081cebe 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg_selector.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_external_epg_selector.py
@@ -94,7 +94,6 @@ EXAMPLES = r"""
operator: equals
value: 10.0.0.0
state: present
- delegate_to: localhost
- name: Remove a Selector
cisco.mso.mso_schema_site_external_epg_selector:
@@ -107,7 +106,6 @@ EXAMPLES = r"""
external_epg: ext1
selector: test
state: absent
- delegate_to: localhost
- name: Query a specific Selector
cisco.mso.mso_schema_site_external_epg_selector:
@@ -120,7 +118,6 @@ EXAMPLES = r"""
external_epg: ext1
selector: selector_1
state: query
- delegate_to: localhost
register: query_result
- name: Query all Selectors
@@ -133,7 +130,6 @@ EXAMPLES = r"""
site: azure_ansible_test
external_epg: ext1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_l3out.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_l3out.py
index 4741e4bd7..4293d7253 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_l3out.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_l3out.py
@@ -89,7 +89,6 @@ EXAMPLES = r"""
template: TemplateName
schema: schemaName
state: present
- delegate_to: localhost
- name: Remove a site L3Out
cisco.mso.mso_schema_site_l3out:
@@ -101,7 +100,6 @@ EXAMPLES = r"""
template: Template1
l3out: L3out1
state: absent
- delegate_to: localhost
- name: Query a specific site L3Out
cisco.mso.mso_schema_site_l3out:
@@ -113,7 +111,6 @@ EXAMPLES = r"""
template: Template1
l3out: L3out1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site l3outs
@@ -125,7 +122,6 @@ EXAMPLES = r"""
site: Site1
template: Template1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_service_graph.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_service_graph.py
index 9495a501d..29919152d 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_service_graph.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_service_graph.py
@@ -50,11 +50,32 @@ options:
type: list
elements: dict
suboptions:
- name:
+ device_name:
description:
- The name of the device
required: true
type: str
+ aliases: [ name ]
+ provider_interface:
+ description:
+ - The name of the provider interface for the Azure CNC L4-L7 device.
+ type: str
+ provider_connector_type:
+ description:
+ - The provider connector type for the Azure CNC site service graph.
+ - Defaults to C(none) when unset during creation.
+ type: str
+ choices: [ none, redirect, source_nat, destination_nat, source_and_destination_nat ]
+ consumer_interface:
+ description:
+ - The name of the consumer interface for the Azure CNC L4-L7 device.
+ type: str
+ consumer_connector_type:
+ description:
+ - The consumer connector type for the Azure CNC site service graph.
+ - Defaults to C(none) when unset during creation.
+ type: str
+ choices: [ none, redirect ]
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -81,7 +102,28 @@ EXAMPLES = r"""
- name: ansible_test_adc
- name: ansible_test_other
state: present
- delegate_to: localhost
+
+- name: Add a Site service graph for the Azure cloud CNC
+ cisco.mso.mso_schema_site_service_graph:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema1
+ template: Template1
+ service_graph: SG1
+ site: site1
+ tenant: tenant1
+ devices:
+ - name: ans_tnt_firewall1
+ provider_connector_type: source_nat
+ provider_interface: TP_FW_Inf1
+ consumer_connector_type: redirect
+ consumer_interface: TP_FW_Inf1
+ - name: ans_tnt_app_lb
+ - name: ans_tnt_other
+ provider_connector_type: destination_nat
+ consumer_connector_type: redirect
+ state: present
- name: Remove a Service Graph
cisco.mso.mso_schema_site_service_graph_node:
@@ -93,7 +135,6 @@ EXAMPLES = r"""
service_graph: SG1
site: site1
state: absent
- delegate_to: localhost
- name: Query a specific Service Graph
cisco.mso.mso_schema_site_service_graph_node:
@@ -105,7 +146,7 @@ EXAMPLES = r"""
service_graph: SG1
site: site1
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all Service Graphs
cisco.mso.mso_schema_site_service_graph_node:
@@ -116,14 +157,21 @@ EXAMPLES = r"""
template: Template1
site: site1
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
"""
+
from ansible.module_utils.basic import AnsibleModule
-from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, mso_argument_spec, mso_service_graph_node_device_spec
+from ansible_collections.cisco.mso.plugins.module_utils.mso import (
+ MSOModule,
+ mso_argument_spec,
+ mso_service_graph_node_device_spec,
+ service_node_ref_str_to_dict,
+)
+from ansible_collections.cisco.mso.plugins.module_utils.constants import AZURE_L4L7_CONNECTOR_TYPE_MAP
def main():
@@ -206,17 +254,25 @@ def main():
ops = []
mso.previous = mso.existing
+ if mso.previous.get("serviceNodes") is not None and len(mso.previous.get("serviceNodes")) > 0:
+ for node in mso.previous.get("serviceNodes"):
+ node["serviceNodeRef"] = service_node_ref_str_to_dict(node.get("serviceNodeRef"))
+
+ devices_payload = []
+
if state == "absent":
if mso.existing:
mso.sent = mso.existing = {}
ops.append(dict(op="remove", path=service_graph_path))
elif state == "present":
- devices_payload = []
service_graphs = templates[template_idx]["serviceGraphs"]
+ service_node_types_from_template = []
for graph in service_graphs:
if graph.get("name") == service_graph:
service_node_types_from_template = graph["serviceNodes"]
+ break
+
user_number_devices = len(devices)
number_of_nodes_in_template = len(service_node_types_from_template)
if user_number_devices != number_of_nodes_in_template:
@@ -227,29 +283,77 @@ def main():
)
if devices is not None:
- service_node_type_names_from_template = [type.get("name") for type in service_node_types_from_template]
+ query_device_data = mso.lookup_service_node_device(site_id, tenant, device_name=None, service_node_type=None)
for index, device in enumerate(devices):
- template_node_type = service_node_type_names_from_template[index]
- apic_type = "OTHERS"
- if template_node_type == "firewall":
- apic_type = "FW"
- elif template_node_type == "load-balancer":
- apic_type = "ADC"
- query_device_data = mso.lookup_service_node_device(site_id, tenant, device.get("name"), apic_type)
- devices_payload.append(
- dict(
- device=dict(
- dn=query_device_data.get("dn"),
- funcTyp=query_device_data.get("funcType"),
- ),
- serviceNodeRef=dict(
- serviceNodeName=template_node_type,
- serviceGraphName=service_graph,
- templateName=template,
- schemaId=schema_id,
- ),
- ),
- )
+ if query_device_data:
+ for device_data in query_device_data:
+ if device.get("device_name") == device_data.get("dn").split("/")[-1].split("-")[-1]:
+ device_payload = dict()
+ device_payload["device"] = dict(
+ dn=device_data.get("dn"),
+ funcType=device_data.get("funcType"),
+ )
+ device_payload["serviceNodeRef"] = dict(
+ serviceNodeName="node{0}".format(index + 1),
+ serviceGraphName=service_graph,
+ templateName=template,
+ schemaId=schema_id,
+ )
+
+ if mso.cloud_provider_type == "azure":
+ consumer_interface = device.get("consumer_interface")
+ provider_interface = device.get("provider_interface")
+ provider_connector_type = device.get("provider_connector_type")
+ consumer_connector_type = device.get("consumer_connector_type")
+
+ if (
+ device_data.get("deviceVendorType") == "NATIVELB"
+ and device_data.get("devType") == "application"
+ and (
+ consumer_interface is not None
+ or provider_interface is not None
+ or provider_connector_type is not None
+ or consumer_connector_type is not None
+ )
+ ):
+ # Application Load Balancer - Consumer Interface, Consumer Connector Type,
+ # Provider Interface, Provider Connector Type - not supported
+ mso.fail_json(
+ msg="Unsupported attributes: provider_connector_type, provider_interface, "
+ + "consumer_connector_type, consumer_interface should be 'None' for the "
+ + "Application Load Balancer device."
+ )
+ elif (
+ device_data.get("deviceVendorType") == "NATIVELB"
+ and device_data.get("devType") == "network"
+ and (consumer_interface is not None or provider_interface is not None)
+ ):
+ # Network Load Balancer - Consumer Interface, Provider Interface - not supported
+ mso.fail_json(
+ msg="Unsupported attributes: provider_interface and consumer_interface should "
+ + "be 'None' for the Network Load Balancer device."
+ )
+ elif (
+ device_data.get("deviceVendorType") == "ADC"
+ and device_data.get("devType") == "CLOUD"
+ and (provider_connector_type is not None or consumer_connector_type is not None)
+ ):
+ # Third-Party Load Balancer - Consumer Connector Type,
+ # Provider Connector Type - not supported
+ mso.fail_json(
+ msg="Unsupported attributes: provider_connector_type and "
+ + "consumer_connector_type should be 'None' for the "
+ + "Third-Party Load Balancer."
+ )
+
+ # (FW) Third-Party Firewall - Consumer Interface, Consumer Connector Type,
+ # Provider Interface, Provider Connector Type - supported
+ device_payload["consumerInterface"] = consumer_interface
+ device_payload["providerInterface"] = provider_interface
+ device_payload["providerConnectorType"] = AZURE_L4L7_CONNECTOR_TYPE_MAP.get(provider_connector_type)
+ device_payload["consumerConnectorType"] = AZURE_L4L7_CONNECTOR_TYPE_MAP.get(consumer_connector_type)
+
+ devices_payload.append(device_payload)
payload = dict(
serviceGraphRef=dict(
@@ -263,6 +367,8 @@ def main():
mso.sanitize(payload, collate=True)
if not mso.existing:
+ # The site service graph reference will be added automatically when the site is associated with the template
+ # So the add(create) part will not be used for the NDO v4.2
ops.append(dict(op="add", path=service_graphs_path, value=payload))
else:
ops.append(dict(op="replace", path=service_graph_path, value=mso.sent))
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf.py
index a0b864a8b..42de06ab7 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf.py
@@ -63,7 +63,6 @@ EXAMPLES = r"""
template: Template1
vrf: VRF1
state: present
- delegate_to: localhost
- name: Remove a site VRF
cisco.mso.mso_schema_site_vrf:
@@ -75,7 +74,6 @@ EXAMPLES = r"""
template: Template1
vrf: VRF1
state: absent
- delegate_to: localhost
- name: Query a specific site VRF
cisco.mso.mso_schema_site_vrf:
@@ -87,7 +85,6 @@ EXAMPLES = r"""
template: Template1
vrf: VRF1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site VRFs
@@ -99,7 +96,6 @@ EXAMPLES = r"""
site: Site1
template: Template1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region.py
index 5ac5804e6..6863426ad 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region.py
@@ -101,7 +101,6 @@ EXAMPLES = r"""
region: us-west-1
vpn_gateway_router: false
state: present
- delegate_to: localhost
- name: Remove a site VRF region
cisco.mso.mso_schema_site_vrf_region:
@@ -114,7 +113,6 @@ EXAMPLES = r"""
vrf: VRF1
region: us-west-1
state: absent
- delegate_to: localhost
- name: Query a specific site VRF region
cisco.mso.mso_schema_site_vrf_region:
@@ -127,7 +125,6 @@ EXAMPLES = r"""
vrf: VRF1
region: us-west-1
state: query
- delegate_to: localhost
register: query_result
- name: Query all site VRF regions
@@ -140,7 +137,6 @@ EXAMPLES = r"""
template: Template1
vrf: VRF1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr.py
index ef409f710..b2a8e4f33 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr.py
@@ -87,7 +87,6 @@ EXAMPLES = r"""
region: us-west-1
cidr: 14.14.14.1/24
state: present
- delegate_to: localhost
- name: Remove a site VRF region CIDR
cisco.mso.mso_schema_site_vrf_region_cidr:
@@ -101,7 +100,6 @@ EXAMPLES = r"""
region: us-west-1
cidr: 14.14.14.1/24
state: absent
- delegate_to: localhost
- name: Query a specific site VRF region CIDR
cisco.mso.mso_schema_site_vrf_region_cidr:
@@ -115,7 +113,6 @@ EXAMPLES = r"""
region: us-west-1
cidr: 14.14.14.1/24
state: query
- delegate_to: localhost
register: query_result
- name: Query all site VRF region CIDR
@@ -129,7 +126,6 @@ EXAMPLES = r"""
vrf: VRF1
region: us-west-1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr_subnet.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr_subnet.py
index 85a00ea9c..a8cd42ca5 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr_subnet.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_cidr_subnet.py
@@ -113,7 +113,6 @@ EXAMPLES = r"""
subnet: 14.14.14.2/24
zone: us-west-1a
state: present
- delegate_to: localhost
- name: Remove a site VRF region CIDR subnet
cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
@@ -128,7 +127,6 @@ EXAMPLES = r"""
cidr: 14.14.14.1/24
subnet: 14.14.14.2/24
state: absent
- delegate_to: localhost
- name: Query a specific site VRF region CIDR subnet
cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
@@ -143,7 +141,6 @@ EXAMPLES = r"""
cidr: 14.14.14.1/24
subnet: 14.14.14.2/24
state: query
- delegate_to: localhost
register: query_result
- name: Query all site VRF region CIDR subnet
@@ -158,7 +155,6 @@ EXAMPLES = r"""
region: us-west-1
cidr: 14.14.14.1/24
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_hub_network.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_hub_network.py
index 9df7bab4f..3d0cf4f3c 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_hub_network.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_site_vrf_region_hub_network.py
@@ -93,7 +93,6 @@ EXAMPLES = r"""
name: hub-default
tenant: infra
state: present
- delegate_to: localhost
- name: Remove a site VRF region hub network
cisco.mso.mso_schema_site_vrf_region_hub_network:
@@ -105,7 +104,6 @@ EXAMPLES = r"""
template: Template1
vrf: VRF1
state: absent
- delegate_to: localhost
- name: Query site VRF region hub network
cisco.mso.mso_schema_site_vrf_region_hub_network:
@@ -118,7 +116,6 @@ EXAMPLES = r"""
vrf: VRF1
region: us-west-1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template.py
index 6f4ece9ca..bd0fa8fef 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template.py
@@ -2,6 +2,8 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
+
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -18,12 +20,12 @@ description:
- Manage templates on Cisco ACI Multi-Site.
author:
- Dag Wieers (@dagwieers)
+- Akini Ross (@akinross)
options:
tenant:
description:
- The tenant used for this template.
type: str
- required: true
schema:
description:
- The name of the schema.
@@ -50,6 +52,7 @@ options:
description:
- Use C(present) or C(absent) for adding or removing.
- Use C(query) for listing an object or multiple objects.
+ - Using C(present) on empty schemas M(cisco.mso.mso_schema) is supported on versions of MSO that are 4.2 or greater.
type: str
choices: [ absent, present, query ]
default: present
@@ -71,7 +74,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: present
- delegate_to: localhost
- name: Remove a template from a schema
cisco.mso.mso_schema_template:
@@ -82,7 +84,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: absent
- delegate_to: localhost
- name: Query a template
cisco.mso.mso_schema_template:
@@ -93,7 +94,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all templates
@@ -104,7 +104,6 @@ EXAMPLES = r"""
tenant: Tenant 1
schema: Schema 1
state: query
- delegate_to: localhost
register: query_result
"""
@@ -118,7 +117,7 @@ from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, ms
def main():
argument_spec = mso_argument_spec()
argument_spec.update(
- tenant=dict(type="str", required=True),
+ tenant=dict(type="str"),
schema=dict(type="str", required=True),
schema_description=dict(type="str"),
template_description=dict(type="str"),
@@ -132,7 +131,7 @@ def main():
supports_check_mode=True,
required_if=[
["state", "absent", ["template"]],
- ["state", "present", ["template"]],
+ ["state", "present", ["template", "tenant"]],
],
)
@@ -157,13 +156,11 @@ def main():
schema_path = "schemas/{id}".format(**schema_obj)
# Get template
- templates = [t.get("name") for t in schema_obj.get("templates")]
+ templates = schema_obj.get("templates") if schema_obj.get("templates") is not None else []
if template:
- if template in templates:
- template_idx = templates.index(template)
- mso.existing = schema_obj.get("templates")[template_idx]
+ mso.existing = next((item for item in templates if item.get("name") == template), {})
else:
- mso.existing = schema_obj.get("templates")
+ mso.existing = templates
else:
schema_path = "schemas"
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp.py
index 9922750f8..f37b95237 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp.py
@@ -65,7 +65,6 @@ EXAMPLES = r"""
template: Template 1
anp: ANP 1
state: present
- delegate_to: localhost
- name: Remove an ANP
cisco.mso.mso_schema_template_anp:
@@ -76,7 +75,6 @@ EXAMPLES = r"""
template: Template 1
anp: ANP 1
state: absent
- delegate_to: localhost
- name: Query a specific ANPs
cisco.mso.mso_schema_template_anp:
@@ -86,7 +84,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all ANPs
@@ -97,7 +94,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg.py
index 6c021e7f7..b5a26f31c 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg.py
@@ -212,7 +212,6 @@ EXAMPLES = r"""
vrf:
name: vrf1
state: present
- delegate_to: localhost
- name: Add a new EPG with preferred group.
cisco.mso.mso_schema_template_anp_epg:
@@ -225,7 +224,6 @@ EXAMPLES = r"""
epg: EPG 1
state: present
preferred_group: true
- delegate_to: localhost
- name: Remove an EPG
cisco.mso.mso_schema_template_anp_epg:
@@ -241,7 +239,6 @@ EXAMPLES = r"""
vrf:
name: vrf1
state: absent
- delegate_to: localhost
- name: Query a specific EPG
cisco.mso.mso_schema_template_anp_epg:
@@ -257,7 +254,6 @@ EXAMPLES = r"""
vrf:
name: vrf1
state: query
- delegate_to: localhost
register: query_result
- name: Query all EPGs
@@ -274,7 +270,6 @@ EXAMPLES = r"""
vrf:
name: vrf1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_contract.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_contract.py
index d8c881d5d..3563e78f9 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_contract.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_contract.py
@@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com>
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -18,15 +19,16 @@ description:
- Manage EPG contracts in schema templates on Cisco ACI Multi-Site.
author:
- Dag Wieers (@dagwieers)
+- Akini Ross (@akinross)
options:
schema:
description:
- - The name of the schema.
+ - The name of the Schema.
type: str
required: true
template:
description:
- - The name of the template to change.
+ - The name of the Template.
type: str
required: true
anp:
@@ -36,31 +38,70 @@ options:
required: true
epg:
description:
- - The name of the EPG to manage.
+ - The name of the EPG.
type: str
required: true
+ force_replace:
+ description:
+ - Replaces all the configured contract(s) with the provided contract(s).
+ - This option can only be used in combination with the O(contracts) option.
+ - In combination with the O(state=absent) and without any contract configuration all configured static port(s) will be removed.
+ type: bool
contract:
description:
- - A contract associated to this EPG.
+ - The Contract associated to this EPG.
+ - This option can not be used in combination with the I(contracts) option.
type: dict
suboptions:
name:
description:
- - The name of the Contract to associate with.
+ - The name of the Contract.
+ required: true
+ type: str
+ schema:
+ description:
+ - The name of the Schema that defines the referenced Contract.
+ - If this parameter is unspecified, it defaults to the current schema.
+ type: str
+ template:
+ description:
+ - The name of the Template that defines the referenced Contract.
+ - If this parameter is unspecified, it defaults to the current schema.
+ type: str
+ type:
+ description:
+ - The type of the Contract.
+ type: str
+ required: true
+ choices: [ consumer, provider ]
+ contracts:
+ description:
+ - A list of Contracts associated to this EPG.
+ - This option can not be used in combination with the O(contract) option.
+ - All configured contract(s) will be replaced with the provided contract(s) when used with O(force_replace=true).
+ - Only the provided contract(s) will be added, updated or removed when used with O(force_replace=false).
+ - In combination with the O(state=query) all provided contract(s) must be found else the task will fail.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - The name of the Contract.
required: true
type: str
schema:
description:
- - The schema that defines the referenced BD.
+ - The name of the Schema that defines the referenced Contract.
- If this parameter is unspecified, it defaults to the current schema.
type: str
template:
description:
- - The template that defines the referenced BD.
+ - The name of the Template that defines the referenced Contract.
+ - If this parameter is unspecified, it defaults to the current schema.
type: str
type:
description:
- - The type of contract.
+ - The type of the Contract.
type: str
required: true
choices: [ consumer, provider ]
@@ -91,9 +132,8 @@ EXAMPLES = r"""
name: Contract 1
type: consumer
state: present
- delegate_to: localhost
-- name: Remove a Contract
+- name: Add 2 contracts to an EPG
cisco.mso.mso_schema_template_anp_epg_contract:
host: mso_host
username: admin
@@ -102,10 +142,29 @@ EXAMPLES = r"""
template: Template 1
anp: ANP 1
epg: EPG 1
- contract:
- name: Contract 1
- state: absent
- delegate_to: localhost
+ contracts:
+ - name: Contract 1
+ type: provider
+ - name: Contract 1
+ type: consumer
+ state: present
+
+- name: Replace all existing contracts on an EPG with 2 new contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema 1
+ template: Template 1
+ anp: ANP 1
+ epg: EPG 1
+ force_replace: true
+ contracts:
+ - name: Contract 2
+ type: provider
+ - name: Contract 2
+ type: consumer
+ state: present
- name: Query a specific Contract
cisco.mso.mso_schema_template_anp_epg_contract:
@@ -118,8 +177,25 @@ EXAMPLES = r"""
epg: EPG 1
contract:
name: Contract 1
+ type: consumer
+ state: query
+ register: query_result
+
+- name: Query a list of Contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema 1
+ template: Template 1
+ anp: ANP 1
+ epg: EPG 1
+ contracts:
+ - name: Contract 2
+ type: provider
+ - name: Contract 2
+ type: consumer
state: query
- delegate_to: localhost
register: query_result
- name: Query all Contracts
@@ -131,8 +207,48 @@ EXAMPLES = r"""
template: Template 1
anp: ANP 1
state: query
- delegate_to: localhost
register: query_result
+
+- name: Remove a Contract
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema 1
+ template: Template 1
+ anp: ANP 1
+ epg: EPG 1
+ contract:
+ name: Contract 1
+ state: absent
+
+- name: Remove 2 contracts to an EPG
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema 1
+ template: Template 1
+ anp: ANP 1
+ epg: EPG 1
+ contracts:
+ - name: Contract 1
+ type: provider
+ - name: Contract 1
+ type: consumer
+ state: absent
+
+- name: Remove all existing contracts from an EPG
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema 1
+ template: Template 1
+ anp: ANP 1
+ epg: EPG 1
+ force_replace: true
+ state: absent
"""
RETURN = r"""
@@ -140,6 +256,7 @@ RETURN = r"""
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, mso_argument_spec, mso_contractref_spec
+from ansible_collections.cisco.mso.plugins.module_utils.schema import MSOSchema
def main():
@@ -149,7 +266,9 @@ def main():
template=dict(type="str", required=True),
anp=dict(type="str", required=True),
epg=dict(type="str", required=True),
+ force_replace=dict(type="bool"),
contract=dict(type="dict", options=mso_contractref_spec()),
+ contracts=dict(type="list", elements="dict", options=mso_contractref_spec()),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
)
@@ -157,8 +276,12 @@ def main():
argument_spec=argument_spec,
supports_check_mode=True,
required_if=[
- ["state", "absent", ["contract"]],
- ["state", "present", ["contract"]],
+ ["state", "absent", ["contract", "contracts", "force_replace"], True],
+ ["state", "present", ["contract", "contracts"], True],
+ ],
+ mutually_exclusive=[
+ ["contract", "contracts"],
+ ["contract", "force_replace"],
],
)
@@ -166,97 +289,160 @@ def main():
template = module.params.get("template").replace(" ", "")
anp = module.params.get("anp")
epg = module.params.get("epg")
+ force_replace = module.params.get("force_replace")
contract = module.params.get("contract")
- if contract is not None and contract.get("template") is not None:
- contract["template"] = contract.get("template").replace(" ", "")
+ contracts = module.params.get("contracts")
state = module.params.get("state")
mso = MSOModule(module)
+ mso_schema = MSOSchema(mso, schema, template)
+ mso_schema.set_template(template)
+ mso_schema.set_template_anp(anp)
+ mso_schema.set_template_anp_epg(epg)
+
+ # Schema dict is used as a cache store for schema id lookups
+ # This is done to limit the amount of schema id lookups when schema is not specified for multiple contracts
+ schema_cache = {mso_schema.schema_name: mso_schema.id}
if contract:
- if contract.get("schema") is None:
- contract["schema"] = schema
- contract["schema_id"] = mso.lookup_schema(contract.get("schema"))
- if contract.get("template") is None:
- contract["template"] = template
-
- # Get schema
- schema_id, schema_path, schema_obj = mso.query_schema(schema)
-
- # Get template
- templates = [t.get("name") for t in schema_obj.get("templates")]
- if template not in templates:
- mso.fail_json(msg="Provided template '{0}' does not exist. Existing templates: {1}".format(template, ", ".join(templates)))
- template_idx = templates.index(template)
-
- # Get ANP
- anps = [a.get("name") for a in schema_obj.get("templates")[template_idx]["anps"]]
- if anp not in anps:
- mso.fail_json(msg="Provided anp '{0}' does not exist. Existing anps: {1}".format(anp, ", ".join(anps)))
- anp_idx = anps.index(anp)
-
- # Get EPG
- epgs = [e.get("name") for e in schema_obj.get("templates")[template_idx]["anps"][anp_idx]["epgs"]]
- if epg not in epgs:
- mso.fail_json(msg="Provided epg '{epg}' does not exist. Existing epgs: {epgs}".format(epg=epg, epgs=", ".join(epgs)))
- epg_idx = epgs.index(epg)
-
- # Get Contract
+ overwrite_contract_schema_and_template(mso, contract, schema, schema_cache, template)
+ elif contracts:
+ for contract_dict in contracts:
+ overwrite_contract_schema_and_template(mso, contract_dict, schema, schema_cache, template)
+
+ contracts_path = "/templates/{0}/anps/{1}/epgs/{2}/contractRelationships".format(template, anp, epg)
+ contract_path = "{0}/-".format(contracts_path)
+ ops = []
+
if contract:
- contracts = [
- (c.get("contractRef"), c.get("relationshipType"))
- for c in schema_obj.get("templates")[template_idx]["anps"][anp_idx]["epgs"][epg_idx]["contractRelationships"]
- ]
contract_ref = mso.contract_ref(**contract)
- if (contract_ref, contract.get("type")) in contracts:
- contract_idx = contracts.index((contract_ref, contract.get("type")))
- contract_path = "/templates/{0}/anps/{1}/epgs/{2}/contractRelationships/{3}".format(template, anp, epg, contract_idx)
- mso.existing = schema_obj.get("templates")[template_idx]["anps"][anp_idx]["epgs"][epg_idx]["contractRelationships"][contract_idx]
+ mso_schema.set_template_anp_epg_contract(contract_ref, contract.get("type"), False)
+ if mso_schema.schema_objects.get("template_anp_epg_contract") is not None:
+ mso.existing = get_contract_payload_from_schema(mso, mso_schema)
+ contract_path = "{0}/{1}".format(contracts_path, mso_schema.schema_objects["template_anp_epg_contract"].index)
+ else:
+ found_contracts = []
+ set_existing_contracts(mso, mso_schema)
+ if contracts:
+ for contract_details in contracts:
+ contract_ref = mso.contract_ref(**contract_details)
+ mso_schema.set_template_anp_epg_contract(contract_ref, contract_details.get("type"), False)
+ if mso_schema.schema_objects.get("template_anp_epg_contract") is not None:
+ found_contracts.append(get_contract_payload_from_schema(mso, mso_schema))
if state == "query":
- if not contract:
- mso.existing = schema_obj.get("templates")[template_idx]["anps"][anp_idx]["epgs"][epg_idx]["contractRelationships"]
+ if contracts:
+ if len(found_contracts) == len(contracts):
+ mso.existing = found_contracts
+ else:
+ not_found_contracts = [
+ "Contract with Reference '{0}' and type '{1}' not found".format(mso.contract_ref(**contract), contract.get("type"))
+ for contract in contracts
+ if contract not in found_contracts
+ ]
+ mso.fail_json(msg=not_found_contracts)
elif not mso.existing:
- mso.fail_json(msg="Contract '{0}' not found".format(contract_ref))
-
- if "contractRef" in mso.existing:
- mso.existing["contractRef"] = mso.dict_from_ref(mso.existing.get("contractRef"))
+ mso.fail_json(msg="Contract with Reference '{0}' and type '{1}' not found".format(contract_ref, contract.get("type")))
mso.exit_json()
- contracts_path = "/templates/{0}/anps/{1}/epgs/{2}/contractRelationships".format(template, anp, epg)
- ops = []
-
mso.previous = mso.existing
- if state == "absent":
- if mso.existing:
- mso.sent = mso.existing = {}
+
+ if state == "absent" and mso.existing:
+ if contract:
+ mso.sent = mso.proposed = {}
ops.append(dict(op="remove", path=contract_path))
+ elif force_replace:
+ mso.sent = mso.proposed = []
+ ops.append(dict(op="remove", path=contracts_path))
+ else:
+ mso.proposed = mso.existing.copy()
+ remove_index = []
+ for contract in contracts:
+ payload = get_contract_payload(contract)
+ if any(True if payload == found_contract else False for found_contract in found_contracts):
+ mso.proposed.remove(payload)
+ remove_index.append(mso.existing.index(payload))
+ # The list index should not shift when removing contracts from the list
+ # By sorting the indexes found in reverse order, we assure that the highest index is removed first by the NDO backend
+ # This logic is to avoid removing the wrong contract
+ for index in reversed(sorted(remove_index)):
+ ops.append(dict(op="remove", path="{0}/{1}".format(contracts_path, index)))
+ mso.sent = mso.proposed
elif state == "present":
- payload = dict(
- relationshipType=contract.get("type"),
- contractRef=dict(
- contractName=contract.get("name"),
- templateName=contract.get("template"),
- schemaId=contract.get("schema_id"),
- ),
+ if contract:
+ mso.sanitize(get_contract_payload(contract), collate=True)
+ if not mso.existing:
+ ops.append(dict(op="add", path=contract_path, value=mso.sent))
+ elif force_replace:
+ mso.sent = mso.proposed = [get_contract_payload(contract) for contract in contracts]
+ if mso.existing:
+ ops.append(dict(op="replace", path=contracts_path, value=mso.sent))
+ else:
+ ops.append(dict(op="add", path=contracts_path, value=mso.sent))
+ else:
+ mso.sent = []
+ mso.proposed = mso.existing.copy()
+ for contract in contracts:
+ payload = get_contract_payload(contract)
+ if payload not in mso.existing:
+ mso.proposed.append(payload)
+ # Only add the operation list if the contract is not already present
+ # This is to avoid adding the same contract multiple times
+ # Replace operation is not required because there are no attributes that can be changed except the contract itself
+ if not force_replace and not any(True if payload == found_contract else False for found_contract in found_contracts):
+ ops.append(dict(op="add", path=contract_path, value=payload))
+ mso.sent.append(payload)
+
+ mso.existing = mso.proposed
+
+ if not module.check_mode and mso.proposed != mso.previous:
+ mso.request(mso_schema.path, method="PATCH", data=ops)
+
+ mso.exit_json()
+
+
+def set_existing_contracts(mso, mso_schema):
+ mso.existing = []
+ for existing_contract in mso_schema.schema_objects["template_anp_epg"].details.get("contractRelationships"):
+ mso.existing.append(
+ dict(
+ relationshipType=existing_contract.get("relationshipType"),
+ contractRef=mso.dict_from_ref(existing_contract.get("contractRef")),
+ )
)
- mso.sanitize(payload, collate=True)
- if mso.existing:
- ops.append(dict(op="replace", path=contract_path, value=mso.sent))
- else:
- ops.append(dict(op="add", path=contracts_path + "/-", value=mso.sent))
+def get_contract_payload_from_schema(mso, mso_schema):
+ return dict(
+ relationshipType=mso_schema.schema_objects["template_anp_epg_contract"].details.get("relationshipType"),
+ contractRef=mso.dict_from_ref(mso_schema.schema_objects["template_anp_epg_contract"].details.get("contractRef")),
+ )
- mso.existing = mso.proposed
- if "contractRef" in mso.previous:
- mso.previous["contractRef"] = mso.dict_from_ref(mso.previous.get("contractRef"))
- if not module.check_mode and mso.proposed != mso.previous:
- mso.request(schema_path, method="PATCH", data=ops)
+def get_contract_payload(contract):
+ return dict(
+ relationshipType=contract.get("type"),
+ contractRef=dict(
+ contractName=contract.get("name"),
+ templateName=contract.get("template"),
+ schemaId=contract.get("schema_id"),
+ ),
+ )
- mso.exit_json()
+
+def overwrite_contract_schema_and_template(mso, contract, epg_schema_name, schema_cache, epg_template_name):
+ if contract.get("schema") is None:
+ contract["schema"] = epg_schema_name
+ contract["schema_id"] = schema_cache.get(epg_schema_name)
+ else:
+ schema_id = schema_cache.get(contract.get("schema"))
+ contract["schema_id"] = schema_id if schema_id else mso.lookup_schema(contract.get("schema"))
+
+ if contract.get("template") is None:
+ contract["template"] = epg_template_name
+ else:
+ contract["template"] = contract.get("template").replace(" ", "")
if __name__ == "__main__":
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_selector.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_selector.py
index bd98fc321..f479fe807 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_selector.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_selector.py
@@ -94,7 +94,6 @@ EXAMPLES = r"""
operator: in
value: test
state: present
- delegate_to: localhost
- name: Remove a Selector
cisco.mso.mso_schema_template_anp_epg_selector:
@@ -107,7 +106,6 @@ EXAMPLES = r"""
epg: EPG 1
selector: selector_1
state: absent
- delegate_to: localhost
- name: Query a specific Selector
cisco.mso.mso_schema_template_anp_epg_selector:
@@ -120,7 +118,6 @@ EXAMPLES = r"""
epg: EPG 1
selector: selector_1
state: query
- delegate_to: localhost
register: query_result
- name: Query all Selectors
@@ -133,7 +130,6 @@ EXAMPLES = r"""
anp: ANP 1
epg: EPG 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_subnet.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_subnet.py
index b060ddd5e..2a88803b3 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_subnet.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_subnet.py
@@ -89,7 +89,6 @@ EXAMPLES = r"""
epg: EPG 1
subnet: 10.0.0.0/24
state: present
- delegate_to: localhost
- name: Remove a subnet from an EPG
cisco.mso.mso_schema_template_anp_epg_subnet:
@@ -102,7 +101,6 @@ EXAMPLES = r"""
epg: EPG 1
subnet: 10.0.0.0/24
state: absent
- delegate_to: localhost
- name: Query a specific EPG subnet
cisco.mso.mso_schema_template_anp_epg_subnet:
@@ -115,7 +113,6 @@ EXAMPLES = r"""
epg: EPG 1
subnet: 10.0.0.0/24
state: query
- delegate_to: localhost
register: query_result
- name: Query all EPGs subnets
@@ -127,7 +124,6 @@ EXAMPLES = r"""
template: Template 1
anp: ANP 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_useg_attribute.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_useg_attribute.py
index 1f61e95de..0e9b8178e 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_useg_attribute.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_anp_epg_useg_attribute.py
@@ -69,7 +69,7 @@ options:
description:
- The uSeg Subnet can only be used when the I(attribute_type) is IP.
- Use C(false) to set the custom uSeg Subnet IP address to the uSeg Attribute.
- - Use C(true) to set the uSeg Subnet IP address to 0.0.0.0.
+ - Use C(true) to set the default uSeg Subnet IP address 0.0.0.0.
type: bool
state:
description:
@@ -98,7 +98,6 @@ EXAMPLES = r"""
useg_subnet: false
value: 10.0.0.0/24
state: present
- delegate_to: localhost
- name: Query a specific EPG uSeg attr with name
cisco.mso.mso_schema_template_anp_epg_useg_attribute:
@@ -111,7 +110,6 @@ EXAMPLES = r"""
epg: EPG 1
name: useg_attr_ip
state: query
- delegate_to: localhost
register: query_result
- name: Query all EPG uSeg attrs
@@ -124,7 +122,6 @@ EXAMPLES = r"""
anp: ANP 1
epg: EPG 1
state: query
- delegate_to: localhost
register: query_result
- name: Remove a uSeg attr from an EPG with name
@@ -138,7 +135,6 @@ EXAMPLES = r"""
epg: EPG 1
name: useg_attr_ip
state: absent
- delegate_to: localhost
"""
RETURN = r"""
@@ -233,11 +229,13 @@ def main():
payload = dict(name=name, displayName=name, description=description, type=EPG_U_SEG_ATTR_TYPE_MAP[attribute_type], value=value)
if attribute_type == "ip":
- if useg_subnet is False:
- payload["fvSubnet"] = True
- else:
- payload["fvSubnet"] = False
+ if useg_subnet:
+ if value != "" and value != "0.0.0.0" and value is not None:
+ mso.fail_json(msg="The value of uSeg subnet IP should be an empty string or 0.0.0.0, when the useg_subnet is set to true.")
+ payload["fvSubnet"] = useg_subnet
payload["value"] = "0.0.0.0"
+ else:
+ payload["fvSubnet"] = useg_subnet
mso.sanitize(payload, collate=True)
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd.py
index 0793e844d..ca2f9445d 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd.py
@@ -250,7 +250,6 @@ EXAMPLES = r"""
vrf:
name: VRF1
state: present
- delegate_to: localhost
- name: Add a new BD from another Schema
mso_schema_template_bd:
@@ -265,7 +264,6 @@ EXAMPLES = r"""
schema: Schema Origin
template: Template Origin
state: present
- delegate_to: localhost
- name: Add bd with options available on version 3.1
mso_schema_template_bd:
@@ -357,7 +355,6 @@ EXAMPLES = r"""
name: ansible_test_option
version: 1
state: present
- delegate_to: localhost
- name: Remove a BD
cisco.mso.mso_schema_template_bd:
@@ -368,7 +365,6 @@ EXAMPLES = r"""
template: Template 1
bd: BD1
state: absent
- delegate_to: localhost
- name: Query a specific BD
cisco.mso.mso_schema_template_bd:
@@ -379,7 +375,6 @@ EXAMPLES = r"""
template: Template 1
bd: BD1
state: query
- delegate_to: localhost
register: query_result
- name: Query all BDs
@@ -390,7 +385,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_dhcp_policy.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_dhcp_policy.py
index 64fe360ea..095e5b668 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_dhcp_policy.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_dhcp_policy.py
@@ -85,7 +85,6 @@ EXAMPLES = r"""
name: ansible_test_option
version: 1
state: present
- delegate_to: localhost
- name: Remove a DHCP policy from a BD
cisco.mso.mso_schema_template_bd_dhcp_policy:
@@ -98,7 +97,6 @@ EXAMPLES = r"""
name: ansible_test
version: 1
state: absent
- delegate_to: localhost
- name: Query a specific BD DHCP Policy
cisco.mso.mso_schema_template_bd_dhcp_policy:
@@ -110,7 +108,6 @@ EXAMPLES = r"""
bd: BD 1
name: ansible_test
state: query
- delegate_to: localhost
register: query_result
- name: Query all BD DHCP Policies
@@ -122,7 +119,6 @@ EXAMPLES = r"""
template: Template 1
bd: BD 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_subnet.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_subnet.py
index cc55eea7b..e4ae628e4 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_subnet.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_bd_subnet.py
@@ -98,7 +98,6 @@ EXAMPLES = r"""
bd: BD 1
subnet: 10.0.0.0/24
state: present
- delegate_to: localhost
- name: Remove a subset from a BD
cisco.mso.mso_schema_template_bd_subnet:
@@ -110,7 +109,6 @@ EXAMPLES = r"""
bd: BD 1
subnet: 10.0.0.0/24
state: absent
- delegate_to: localhost
- name: Query a specific BD subnet
cisco.mso.mso_schema_template_bd_subnet:
@@ -122,7 +120,6 @@ EXAMPLES = r"""
bd: BD 1
subnet: 10.0.0.0/24
state: query
- delegate_to: localhost
register: query_result
- name: Query all BD subnets
@@ -134,7 +131,6 @@ EXAMPLES = r"""
template: Template 1
bd: BD 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_clone.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_clone.py
index 0cd41779f..dd1d1e067 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_clone.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_clone.py
@@ -69,7 +69,6 @@ EXAMPLES = r"""
destination_template_name: Template1_clone
destination_template_display_name: Template1_clone
state: clone
- delegate_to: localhost
- name: Clone template to different schema
cisco.mso.mso_schema_template_clone:
@@ -83,7 +82,6 @@ EXAMPLES = r"""
destination_template_name: Cloned_template_1
destination_template_display_name: Cloned_template_1
state: clone
- delegate_to: localhost
- name: Clone template in the same schema but different tenant attached
cisco.mso.mso_schema_template_clone:
@@ -96,7 +94,6 @@ EXAMPLES = r"""
source_template_name: Template1_clone
destination_template_name: Template1_clone_2
state: clone
- delegate_to: localhost
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_filter.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_filter.py
index 11bf08731..cb2ac1b0d 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_filter.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_filter.py
@@ -128,7 +128,6 @@ EXAMPLES = r"""
contract_scope: global
filter: Filter 1
state: present
- delegate_to: localhost
- name: Remove a contract filter
cisco.mso.mso_schema_template_contract_filter:
@@ -140,7 +139,6 @@ EXAMPLES = r"""
contract: Contract 1
filter: Filter 1
state: absent
- delegate_to: localhost
- name: Query a specific contract filter
cisco.mso.mso_schema_template_contract_filter:
@@ -152,7 +150,6 @@ EXAMPLES = r"""
contract: Contract 1
filter: Filter 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all contract filters
@@ -164,7 +161,6 @@ EXAMPLES = r"""
template: Template 1
contract: Contract 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_service_graph.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_service_graph.py
index 0e398843b..deaa82e18 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_service_graph.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_contract_service_graph.py
@@ -113,7 +113,6 @@ EXAMPLES = r"""
consumer: b2
filter: Filter 1
state: present
- delegate_to: localhost
- name: Remove a contract service graph
cisco.mso.mso_schema_template_contract_service_graph:
@@ -125,7 +124,6 @@ EXAMPLES = r"""
contract: Contract 1
service_graph: SG1
state: absent
- delegate_to: localhost
- name: Query a contract service graph
cisco.mso.mso_schema_template_contract_service_graph:
@@ -136,7 +134,6 @@ EXAMPLES = r"""
template: Template 1
contract: Contract 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy.py
index 49df465c5..d3714d184 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy.py
@@ -60,7 +60,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: deploy
- delegate_to: localhost
- name: Undeploy a schema template
cisco.mso.mso_schema_template_deploy:
@@ -71,7 +70,6 @@ EXAMPLES = r"""
template: Template 1
site: Site 1
state: undeploy
- delegate_to: localhost
- name: Get deployment status
cisco.mso.mso_schema:
@@ -81,7 +79,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: status
- delegate_to: localhost
register: status_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy_status.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy_status.py
index 707ad7320..768694905 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy_status.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_deploy_status.py
@@ -51,7 +51,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
- name: Query status of objects using site
@@ -62,7 +61,6 @@ EXAMPLES = r"""
schema: Schema 1
site: ansible_test
state: query
- delegate_to: localhost
register: query_result
- name: Query status of objects in a template associated with a site
@@ -74,7 +72,6 @@ EXAMPLES = r"""
template: Template 1
site: ansible_test
state: query
- delegate_to: localhost
register: query_result
- name: Query status of objects in all templates
@@ -84,7 +81,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
schema: Schema 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg.py
index ce201913f..3da65c7f5 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg.py
@@ -138,7 +138,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: present
- delegate_to: localhost
- name: Add a new external EPG with external epg in cloud
cisco.mso.mso_schema_template_external_epg:
@@ -158,7 +157,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: present
- delegate_to: localhost
- name: Remove an external EPG
cisco.mso.mso_schema_template_external_epg:
@@ -169,7 +167,6 @@ EXAMPLES = r"""
template: Template 1
external_epg: external EPG1
state: absent
- delegate_to: localhost
- name: Query a specific external EPGs
cisco.mso.mso_schema_template_external_epg:
@@ -180,7 +177,6 @@ EXAMPLES = r"""
template: Template 1
external_epg: external EPG1
state: query
- delegate_to: localhost
register: query_result
- name: Query all external EPGs
@@ -191,7 +187,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_contract.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_contract.py
index 4029175bc..3b13c8020 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_contract.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_contract.py
@@ -85,7 +85,6 @@ EXAMPLES = r"""
name: Contract 1
type: consumer
state: present
- delegate_to: localhost
- name: Remove a Contract
cisco.mso.mso_schema_template_external_epg_contract:
@@ -98,7 +97,6 @@ EXAMPLES = r"""
contract:
name: Contract 1
state: absent
- delegate_to: localhost
- name: Query a specific Contract
cisco.mso.mso_schema_template_external_epg_contract:
@@ -111,7 +109,6 @@ EXAMPLES = r"""
contract:
name: Contract 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all Contracts
@@ -122,7 +119,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_selector.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_selector.py
index 7d4b93b27..679c4ee27 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_selector.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_selector.py
@@ -90,7 +90,6 @@ EXAMPLES = r"""
operator: equals
value: 10.0.0.0
state: present
- delegate_to: localhost
- name: Remove a Selector
cisco.mso.mso_schema_template_external_epg_selector:
@@ -102,7 +101,6 @@ EXAMPLES = r"""
external_epg: extEPG 1
selector: selector_1
state: absent
- delegate_to: localhost
- name: Query a specific Selector
cisco.mso.mso_schema_template_external_epg_selector:
@@ -114,7 +112,6 @@ EXAMPLES = r"""
external_epg: extEPG 1
selector: selector_1
state: query
- delegate_to: localhost
register: query_result
- name: Query all Selectors
@@ -126,7 +123,6 @@ EXAMPLES = r"""
template: Template 1
external_epg: extEPG 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_subnet.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_subnet.py
index c7512c2ee..7339312a0 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_subnet.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_external_epg_subnet.py
@@ -50,6 +50,7 @@ options:
- The C(shared-security) for Shared Security Import can only be used when External Subnets for External EPG is present
type: list
elements: str
+ default: []
aggregate:
description:
- The aggregate option aggregates shared routes for the subnet.
@@ -57,6 +58,7 @@ options:
- The C(shared-rtctrl) option can only be used when scope parameter Shared Route Control in the Route Control section is selected.
type: list
elements: str
+ default: []
state:
description:
- Use C(present) or C(absent) for adding or removing.
@@ -80,7 +82,6 @@ EXAMPLES = r"""
external_epg: EPG 1
subnet: 10.0.0.0/24
state: present
- delegate_to: localhost
- name: Remove a subnet from an External EPG
cisco.mso.mso_schema_template_external_epg_subnet:
@@ -92,7 +93,6 @@ EXAMPLES = r"""
external_epg: EPG 1
subnet: 10.0.0.0/24
state: absent
- delegate_to: localhost
- name: Query a specific External EPG subnet
cisco.mso.mso_schema_template_external_epg_subnet:
@@ -104,7 +104,6 @@ EXAMPLES = r"""
external_epg: EPG 1
subnet: 10.0.0.0/24
state: query
- delegate_to: localhost
register: query_result
- name: Query all External EPGs subnets
@@ -115,7 +114,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_externalepg.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_externalepg.py
index ce201913f..3da65c7f5 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_externalepg.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_externalepg.py
@@ -138,7 +138,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: present
- delegate_to: localhost
- name: Add a new external EPG with external epg in cloud
cisco.mso.mso_schema_template_external_epg:
@@ -158,7 +157,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: present
- delegate_to: localhost
- name: Remove an external EPG
cisco.mso.mso_schema_template_external_epg:
@@ -169,7 +167,6 @@ EXAMPLES = r"""
template: Template 1
external_epg: external EPG1
state: absent
- delegate_to: localhost
- name: Query a specific external EPGs
cisco.mso.mso_schema_template_external_epg:
@@ -180,7 +177,6 @@ EXAMPLES = r"""
template: Template 1
external_epg: external EPG1
state: query
- delegate_to: localhost
register: query_result
- name: Query all external EPGs
@@ -191,7 +187,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_filter_entry.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_filter_entry.py
index c0ab485a4..5bf69bde1 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_filter_entry.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_filter_entry.py
@@ -132,7 +132,6 @@ EXAMPLES = r"""
template: Template 1
filter: Filter 1
state: present
- delegate_to: localhost
- name: Remove a filter entry
cisco.mso.mso_schema_template_filter_entry:
@@ -143,7 +142,6 @@ EXAMPLES = r"""
template: Template 1
filter: Filter 1
state: absent
- delegate_to: localhost
- name: Query a specific filter entry
cisco.mso.mso_schema_template_filter_entry:
@@ -154,7 +152,6 @@ EXAMPLES = r"""
template: Template 1
filter: Filter 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all filter entries
@@ -165,7 +162,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_l3out.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_l3out.py
index 4b8c1b66d..eb7857df8 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_l3out.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_l3out.py
@@ -87,7 +87,6 @@ EXAMPLES = r"""
schema: vrfSchema
template: vrfTemplate
state: present
- delegate_to: localhost
- name: Remove an L3out
cisco.mso.mso_schema_template_l3out:
@@ -98,7 +97,6 @@ EXAMPLES = r"""
template: Template 1
l3out: L3out 1
state: absent
- delegate_to: localhost
- name: Query a specific L3outs
cisco.mso.mso_schema_template_l3out:
@@ -110,7 +108,6 @@ EXAMPLES = r"""
template: Template 1
l3out: L3out 1
state: query
- delegate_to: localhost
register: query_result
- name: Query all L3outs
@@ -122,7 +119,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_migrate.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_migrate.py
index d0e15b8d0..35fa0d205 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_migrate.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_migrate.py
@@ -84,7 +84,6 @@ EXAMPLES = r"""
- epg: EPG1
anp: ANP
state: present
- delegate_to: localhost
- name: Migration of objects between templates of different schema
mso_schema_template_migrate:
@@ -101,7 +100,6 @@ EXAMPLES = r"""
- epg: EPG1
anp: ANP
state: present
- delegate_to: localhost
- name: Migration of BD object between templates of same schema
mso_schema_template_migrate:
@@ -116,7 +114,6 @@ EXAMPLES = r"""
- BD
- BD1
state: present
- delegate_to: localhost
- name: Migration of BD object between templates of different schema
mso_schema_template_migrate:
@@ -131,7 +128,6 @@ EXAMPLES = r"""
- BD
- BD1
state: present
- delegate_to: localhost
- name: Migration of EPG objects between templates of same schema
mso_schema_template_migrate:
@@ -148,7 +144,6 @@ EXAMPLES = r"""
- epg: EPG2
anp: ANP2
state: present
- delegate_to: localhost
- name: Migration of EPG objects between templates of different schema
mso_schema_template_migrate:
@@ -165,7 +160,6 @@ EXAMPLES = r"""
- epg: EPG2
anp: ANP2
state: present
- delegate_to: localhost
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_service_graph.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_service_graph.py
index 70fadd804..d304673dc 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_service_graph.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_service_graph.py
@@ -83,7 +83,6 @@ EXAMPLES = r"""
- type: other
- type: load-balancer
state: present
- delegate_to: localhost
- name: Remove a Service Graph
cisco.mso.mso_schema_template_service_graph:
@@ -94,7 +93,6 @@ EXAMPLES = r"""
template: Template1
service_graph: graph1
state: absent
- delegate_to: localhost
- name: Query a specific Service Graph
cisco.mso.mso_schema_template_service_graph:
@@ -105,7 +103,7 @@ EXAMPLES = r"""
template: Template1
service_graph: graph1
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all Service Graphs
cisco.mso.mso_schema_template_service_graph:
@@ -115,7 +113,7 @@ EXAMPLES = r"""
schema: Schema1
template: Template1
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
@@ -215,14 +213,15 @@ def main():
node_name = node.get("type")
if node_name in service_node_types:
service_node_index = service_node_index + 1
+ service_node_name = "node{0}".format(service_node_index)
for node_data in query_node_data:
if node_data["name"] == node_name:
payload = dict(
- name=node_name,
+ name=service_node_name,
serviceNodeTypeId=node_data.get("id"),
index=service_node_index,
serviceNodeRef=dict(
- serviceNodeName=node_name,
+ serviceNodeName=service_node_name,
serviceGraphName=service_graph,
templateName=template,
schemaId=schema_id,
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf.py
index efafd2387..84464c312 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf.py
@@ -79,7 +79,6 @@ EXAMPLES = r"""
template: Template 1
vrf: VRF 1
state: present
- delegate_to: localhost
- name: Remove an VRF
cisco.mso.mso_schema_template_vrf:
@@ -90,7 +89,6 @@ EXAMPLES = r"""
template: Template 1
vrf: VRF1
state: absent
- delegate_to: localhost
- name: Query a specific VRFs
cisco.mso.mso_schema_template_vrf:
@@ -101,7 +99,6 @@ EXAMPLES = r"""
template: Template 1
vrf: VRF1
state: query
- delegate_to: localhost
register: query_result
- name: Query all VRFs
@@ -112,7 +109,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf_contract.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf_contract.py
index eaef8235c..fbfb96352 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf_contract.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_template_vrf_contract.py
@@ -84,7 +84,6 @@ EXAMPLES = r"""
name: Contract 1
type: consumer
state: present
- delegate_to: localhost
- name: Remove a Contract
cisco.mso.mso_schema_template_vrf_contract:
@@ -98,7 +97,6 @@ EXAMPLES = r"""
name: Contract 1
type: consumer
state: absent
- delegate_to: localhost
- name: Query a specific Contract
cisco.mso.mso_schema_template_vrf_contract:
@@ -112,7 +110,6 @@ EXAMPLES = r"""
name: Contract 1
type: consumer
state: query
- delegate_to: localhost
register: query_result
- name: Query all Contracts
@@ -124,7 +121,6 @@ EXAMPLES = r"""
template: Template 1
vrf: VRF 1
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_schema_validate.py b/ansible_collections/cisco/mso/plugins/modules/mso_schema_validate.py
index a4a4f6cd0..35b082618 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_schema_validate.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_schema_validate.py
@@ -35,11 +35,19 @@ options:
default: query
choices: [ query ]
seealso:
-- module: cisco.mso.mso_schema_template_external_epg
+- module: cisco.mso.mso_schema
extends_documentation_fragment: cisco.mso.modules
"""
EXAMPLES = r"""
+ - name: Get Validation status
+ mso_schema_validate:
+ host: mso_host
+ username: admin
+ password: SomeSecretPassword
+ schema: Schema 1
+ state: query
+ register: query_validate
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_service_node_type.py b/ansible_collections/cisco/mso/plugins/modules/mso_service_node_type.py
index b8319256b..eace7bd26 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_service_node_type.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_service_node_type.py
@@ -46,7 +46,6 @@ EXAMPLES = r"""
name: ips
display_name: ips
state: present
- delegate_to: localhost
- name: Remove a Service Node Type
cisco.mso.mso_schema_service_node:
@@ -55,7 +54,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
name: ips
state: absent
- delegate_to: localhost
- name: Query a specific Service Node Type
cisco.mso.mso_schema_service_node:
@@ -64,7 +62,7 @@ EXAMPLES = r"""
password: SomeSecretPassword
name: ips
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all Service Node Types
cisco.mso.mso_schema_service_node:
@@ -72,7 +70,7 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_site.py b/ansible_collections/cisco/mso/plugins/modules/mso_site.py
index a3778d28a..d12f935bc 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_site.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_site.py
@@ -110,7 +110,6 @@ EXAMPLES = r"""
latitude: 50.887318
longitude: 4.447084
state: present
- delegate_to: localhost
- name: Remove a site
cisco.mso.mso_site:
@@ -119,7 +118,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
site: north_europe
state: absent
- delegate_to: localhost
- name: Query a site
cisco.mso.mso_site:
@@ -128,7 +126,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
site: north_europe
state: query
- delegate_to: localhost
register: query_result
- name: Query all sites
@@ -137,7 +134,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_tenant.py b/ansible_collections/cisco/mso/plugins/modules/mso_tenant.py
index 17aa457e3..b1caf3cbe 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_tenant.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_tenant.py
@@ -3,6 +3,7 @@
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com>
# Copyright: (c) 2020, Cindy Zhao (@cizhao) <cizhao@cisco.com>
+# Copyright: (c) 2023, Anvitha Jain (@anvjain) <anvjain@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
@@ -40,6 +41,22 @@ options:
- Admin user is always added to the associated user list irrespective of this parameter being used.
type: list
elements: str
+ remote_users:
+ description:
+ - A list of associated remote users for this tenant.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - The name of the associated remote user for this tenant.
+ required: true
+ type: str
+ login_domain:
+ description:
+ - Domain name of the associated remote user for this tenant.
+ required: true
+ type: str
sites:
description:
- A list of associated sites for this tenant.
@@ -73,7 +90,6 @@ EXAMPLES = r"""
display_name: North European Datacenter
description: This tenant manages the NEDC environment.
state: present
- delegate_to: localhost
- name: Remove a tenant from MSO and Site/APIC
cisco.mso.mso_tenant:
@@ -83,7 +99,6 @@ EXAMPLES = r"""
tenant: north_europe
orchestrator_only: no
state: absent
- delegate_to: localhost
- name: Remove a tenant from MSO only
cisco.mso.mso_tenant:
@@ -93,7 +108,6 @@ EXAMPLES = r"""
tenant: north_europe
orchestrator_only: yes
state: absent
- delegate_to: localhost
- name: Query a tenant
cisco.mso.mso_tenant:
@@ -102,7 +116,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
tenant: north_europe
state: query
- delegate_to: localhost
register: query_result
- name: Query all tenants
@@ -111,7 +124,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: query_result
"""
@@ -119,7 +131,7 @@ RETURN = r"""
"""
from ansible.module_utils.basic import AnsibleModule
-from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, mso_argument_spec
+from ansible_collections.cisco.mso.plugins.module_utils.mso import MSOModule, mso_argument_spec, ndo_remote_user_spec
from ansible_collections.cisco.mso.plugins.module_utils.constants import YES_OR_NO_TO_BOOL_STRING_MAP
@@ -130,6 +142,7 @@ def main():
display_name=dict(type="str"),
tenant=dict(type="str", aliases=["name"]),
users=dict(type="list", elements="str"),
+ remote_users=dict(type="list", elements="dict", options=ndo_remote_user_spec()),
sites=dict(type="list", elements="str"),
orchestrator_only=dict(type="str", default="yes", choices=["yes", "no"]),
state=dict(type="str", default="present", choices=["absent", "present", "query"]),
@@ -149,13 +162,10 @@ def main():
tenant = module.params.get("tenant")
orchestrator_only = module.params.get("orchestrator_only")
state = module.params.get("state")
+ remote_users = module.params.get("remote_users")
mso = MSOModule(module)
- # Convert sites and users
- sites = mso.lookup_sites(module.params.get("sites"))
- users = mso.lookup_users(module.params.get("users"))
-
tenant_id = None
path = "tenants"
@@ -182,6 +192,12 @@ def main():
mso.existing = mso.request(path, method="DELETE")
elif state == "present":
+ # Convert sites and users
+ sites = mso.lookup_sites(module.params.get("sites"))
+ users = mso.lookup_users(module.params.get("users"))
+ if remote_users is not None:
+ users += mso.lookup_remote_users(remote_users)
+
mso.previous = mso.existing
payload = dict(
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_tenant_site.py b/ansible_collections/cisco/mso/plugins/modules/mso_tenant_site.py
index 4b9c2af56..895403e12 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_tenant_site.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_tenant_site.py
@@ -114,7 +114,6 @@ EXAMPLES = r"""
tenant: tenant_name
site: site_name
state: present
- delegate_to: localhost
- name: Associate AWS site with a tenant, with aws_trusted set to true
cisco.mso.mso_tenant_site:
@@ -126,7 +125,6 @@ EXAMPLES = r"""
cloud_account: '000000000000'
aws_trusted: true
state: present
- delegate_to: localhost
- name: Associate AWS site with a tenant, with aws_trusted set to false
cisco.mso.mso_tenant_site:
@@ -141,7 +139,6 @@ EXAMPLES = r"""
secret_key: '0'
aws_account_org: false
state: present
- delegate_to: localhost
- name: Associate Azure site in managed mode
mso.cisco.mso_tenant_site:
@@ -155,7 +152,6 @@ EXAMPLES = r"""
azure_subscription_id: '9'
azure_application_id: '100'
state: present
- delegate_to: localhost
- name: Associate Azure site in unmanaged mode
mso.cisco.mso_tenant_site:
@@ -173,7 +169,6 @@ EXAMPLES = r"""
azure_active_directory_id: '32'
azure_active_directory_name: CiscoINSBUAd
state: present
- delegate_to: localhost
- name: Dissociate a site
cisco.mso.mso_tenant_site:
@@ -183,7 +178,6 @@ EXAMPLES = r"""
tenant: tenant_name
site: site_name
state: absent
- delegate_to: localhost
- name: Query a site
cisco.mso.mso_tenant_site:
@@ -193,7 +187,7 @@ EXAMPLES = r"""
tenant: tenant_name
site: site_name
state: query
- delegate_to: localhost
+ register: query_result
- name: Query all sites of a tenant
cisco.mso.mso_tenant_site:
@@ -202,7 +196,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
tenant: tenant_name
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_user.py b/ansible_collections/cisco/mso/plugins/modules/mso_user.py
index 37127a7f1..d74088206 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_user.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_user.py
@@ -87,7 +87,6 @@ EXAMPLES = r"""
user: admin
user_password: newPassword
state: present
- delegate_to: localhost
- name: Add a new user
cisco.mso.mso_user:
@@ -107,7 +106,6 @@ EXAMPLES = r"""
- name: schemaManager
access_type: read
state: present
- delegate_to: localhost
- name: Add a new user
cisco.mso.mso_user:
@@ -122,7 +120,6 @@ EXAMPLES = r"""
phone: +32 478 436 299
roles:
- powerUser
- delegate_to: localhost
- name: Remove a user
cisco.mso.mso_user:
@@ -132,7 +129,6 @@ EXAMPLES = r"""
validate_certs: false
user: dag
state: absent
- delegate_to: localhost
- name: Query a user
cisco.mso.mso_user:
@@ -142,7 +138,6 @@ EXAMPLES = r"""
validate_certs: false
user: dag
state: query
- delegate_to: localhost
register: query_result
- name: Query all users
@@ -152,7 +147,6 @@ EXAMPLES = r"""
password: SomeSecretPassword
validate_certs: false
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/mso_version.py b/ansible_collections/cisco/mso/plugins/modules/mso_version.py
index 19668afb4..f2c0ce8a1 100644
--- a/ansible_collections/cisco/mso/plugins/modules/mso_version.py
+++ b/ansible_collections/cisco/mso/plugins/modules/mso_version.py
@@ -35,7 +35,6 @@ EXAMPLES = r"""
username: admin
password: SomeSecretPassword
state: query
- delegate_to: localhost
register: query_result
"""
diff --git a/ansible_collections/cisco/mso/plugins/modules/ndo_schema_template_deploy.py b/ansible_collections/cisco/mso/plugins/modules/ndo_schema_template_deploy.py
index b8bdb63ae..f1971280e 100644
--- a/ansible_collections/cisco/mso/plugins/modules/ndo_schema_template_deploy.py
+++ b/ansible_collections/cisco/mso/plugins/modules/ndo_schema_template_deploy.py
@@ -61,7 +61,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: deploy
- delegate_to: localhost
- name: Redeploy a schema template
cisco.mso.ndo_schema_template_deploy:
@@ -71,7 +70,6 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: redeploy
- delegate_to: localhost
- name: Undeploy a schema template
cisco.mso.ndo_schema_template_deploy:
@@ -82,7 +80,6 @@ EXAMPLES = r"""
template: Template 1
sites: [ Site1, Site2 ]
state: undeploy
- delegate_to: localhost
- name: Query a schema template deploy status
cisco.mso.ndo_schema_template_deploy:
@@ -92,7 +89,7 @@ EXAMPLES = r"""
schema: Schema 1
template: Template 1
state: query
- delegate_to: localhost
+ register: query_result
"""
RETURN = r"""
diff --git a/ansible_collections/cisco/mso/tests/integration/inventory.networking b/ansible_collections/cisco/mso/tests/integration/inventory.networking
index 590ee6685..b4a333570 100644
--- a/ansible_collections/cisco/mso/tests/integration/inventory.networking
+++ b/ansible_collections/cisco/mso/tests/integration/inventory.networking
@@ -6,8 +6,8 @@ lh-dmz1-pod1-mso-v311 ansible_host=173.36.219.11 ansible_connection=local mso_ho
ndo
[ndo]
-lh-dmz1-pod1-ndo-v371 ansible_host=173.36.219.30 ansible_connection=ansible.netcommon.httpapi ansible_network_os=cisco.nd.nd mso_hostname=173.36.219.30
-lh-dmz1-pod1-ndo-v411 ansible_host=173.36.219.32 ansible_connection=ansible.netcommon.httpapi ansible_network_os=cisco.nd.nd mso_hostname=173.36.219.32
+lh-dmz1-pod1-ndo-v421 ansible_host=173.36.219.30 ansible_connection=ansible.netcommon.httpapi ansible_network_os=cisco.nd.nd mso_hostname=173.36.219.30
+lh-dmz1-pod1-ndo-v412 ansible_host=173.36.219.32 ansible_connection=ansible.netcommon.httpapi ansible_network_os=cisco.nd.nd mso_hostname=173.36.219.32
[all:vars]
mso_username=ansible_github_ci
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_backup/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_backup/tasks/main.yml
index 9fe4d1a9a..c266ff1a6 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_backup/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_backup/tasks/main.yml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,13 +22,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Clear tenant
- mso_tenant: &tenant1_absent
+ cisco.mso.mso_tenant: &tenant1_absent
<<: *mso_info
tenant: Tenant1
display_name: Test_Tenant
@@ -53,13 +53,13 @@
state: present
- name: Query all backups
- mso_backup: &query_all_backups
+ cisco.mso.mso_backup: &query_all_backups
<<: *mso_info
state: query
register: query_ansibleBackup_for_delete
- name: Remove all backups
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup_id: '{{ item.id }}'
state: absent
@@ -70,7 +70,7 @@
when: version.current.version is version('3.2', '<')
block:
- name: Create local ansibleBackup1 in check mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup1
description: via Ansible
@@ -80,12 +80,12 @@
check_mode: true
- name: Verify local cm_add_ansibleBackup1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_ansibleBackup1 is changed
- name: Create local ansibleBackup1 in normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup1
description: via Ansible
@@ -94,7 +94,7 @@
register: nm_add_ansibleBackup1
- name: Query ansibleBackup1 to check if it exists
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup1
state: query
@@ -107,13 +107,13 @@
delay: 10
- name: Verify nm_add_ansibleBackup1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_ansibleBackup1 is changed
- check_ansibleBackup1.current[0].backupEntry.metadata.name is match("ansibleBackup1_[0-9a-zA-Z]*")
- name: Create local ansibleBackup3 in normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup3
description: via Ansible
@@ -122,7 +122,7 @@
register: nm_add_ansibleBackup3
- name: Query ansibleBackup3 to check if it exists
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup3
state: query
@@ -136,7 +136,7 @@
delay: 10
- name: Assertions check for create local ansibleBackup3 in normal mode
- assert:
+ ansible.builtin.assert:
that:
- query_ansibleBackup3 is not changed
- query_ansibleBackup3.current.0.status.statusType == "success"
@@ -145,7 +145,7 @@
# Creating duplicate backups with the name of ansibleBackup3 - to validate "Multiple backups with same name found" error message
- name: Create local ansibleBackup3 in normal mode again
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup3
description: via Ansible
@@ -154,7 +154,7 @@
register: nm_add_ansibleBackup3_again
- name: Query duplicate ansibleBackup3 to check if it exists
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup3
state: query
@@ -168,7 +168,7 @@
delay: 10
- name: Assertions check for create local ansibleBackup3 in normal mode again
- assert:
+ ansible.builtin.assert:
that:
- query_ansibleBackup3_again is not changed
- query_ansibleBackup3_again.current.1.status.statusType == "success"
@@ -180,7 +180,7 @@
when: version.current.version is version('3.2', '<')
block:
- name: Move ansibleBackup1 from local to remote location in check mode
- mso_backup: &move_ab1_cm
+ cisco.mso.mso_backup: &move_ab1_cm
<<: *mso_info
remote_location: ansible_test
remote_path: ""
@@ -191,12 +191,12 @@
register: move_ab1_cm
- name: Move ansibleBackup1 from local to remote location in normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *move_ab1_cm
register: move_ab1_nm
- name: Move a non existent backup from local location to remote
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: non_existent_backup
remote_location: ansible_test
@@ -206,7 +206,7 @@
ignore_errors: true
- name: Move a ansibleBackup3 from local location to remote - check mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup3
remote_location: ansible_test
@@ -216,7 +216,7 @@
ignore_errors: true
- name: Move a ansibleBackup3 from local location to remote - normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackup3
remote_location: ansible_test
@@ -226,7 +226,7 @@
ignore_errors: true
- name: Assertions check for move a backup from local location to remote location
- assert:
+ ansible.builtin.assert:
that:
- move_ab1_cm is changed
- move_ab1_nm is changed
@@ -236,7 +236,7 @@
# Create Remote backup - For all version
- name: Create ansibleBackupRemote1 in check mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackupRemote1
description: Remote via Ansible
@@ -248,7 +248,7 @@
register: cm_add_ansibleBackupRemote1
- name: Create ansibleBackupRemote1 in normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackupRemote1
description: Remote via Ansible
@@ -259,7 +259,7 @@
register: nm_add_ansibleBackupRemote1
- name: Query ansibleBackupRemote1 to check if it exists
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: ansibleBackupRemote1
state: query
@@ -272,7 +272,7 @@
delay: 10
- name: Assertions check for the backups present on the remote location
- assert:
+ ansible.builtin.assert:
that:
- cm_add_ansibleBackupRemote1 is changed
- nm_add_ansibleBackupRemote1 is changed
@@ -280,13 +280,13 @@
# Remove additional backups - to handle "Multiple backups with same name" during the download
- name: Query all backups to handle "Multiple backups with same name" during the download
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
state: query
register: query_ansibleBackup_for_delete
- name: Delete all backups except for one to handle "Multiple backups with same name" during the download
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup_id: '{{ item.id }}'
state: absent
@@ -301,7 +301,7 @@
mode: '0755'
- name: Download non existent backup
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: non_existent_backup
destination: './{{mso_hostname}}'
@@ -310,7 +310,7 @@
register: download_non_existent_backup
- name: Download ansibleBackupRemote1 in check mode
- mso_backup: &download_ab1_cm
+ cisco.mso.mso_backup: &download_ab1_cm
<<: *mso_info
backup: ansibleBackupRemote1
destination: './{{mso_hostname}}'
@@ -319,12 +319,12 @@
register: download_ab1_cm
- name: Download ansibleBackupRemote1 in normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *download_ab1_cm
register: download_ab1_nm
- name: Assertions check for download a backup form MSO/NDO
- assert:
+ ansible.builtin.assert:
that:
- download_ab1_cm is changed
- download_ab1_nm is changed
@@ -332,7 +332,7 @@
# Find Backup
- name: Find backup
- find:
+ ansible.builtin.find:
paths: './{{mso_hostname}}'
patterns: "*.tar.gz"
register: backup_match
@@ -342,7 +342,7 @@
when: version.current.version is version('3.2', '<')
block:
- name: Upload a backup from local machine to local location in check mode
- mso_backup: &upload_backup_to_local_cm
+ cisco.mso.mso_backup: &upload_backup_to_local_cm
<<: *mso_info
backup: "{{ backup_match.files[0].path }}"
state: upload
@@ -350,12 +350,12 @@
check_mode: true
- name: Upload a backup from local machine to local location in normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *upload_backup_to_local_cm
register: upload_backup_to_local_nm
- name: Upload a non existent backup from local machine to local location
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: non_existent_backup
state: upload
@@ -363,7 +363,7 @@
ignore_errors: true
- name: Assertions check for the upload a backup form local machine to local location
- assert:
+ ansible.builtin.assert:
that:
- upload_backup_to_local_cm is changed
- upload_backup_to_local_nm is changed
@@ -372,12 +372,12 @@
# Upload backup to remote location for all platforms
# To Support NDO Backup upload
- name: Check present working directory with Shell command
- shell:
+ ansible.builtin.shell:
"pwd"
register: present_working_directory
- name: Upload an existing backup from local machine to remote location - check mode
- mso_backup: &upload_backup_cm
+ cisco.mso.mso_backup: &upload_backup_cm
<<: *mso_info
backup: "{{present_working_directory.stdout}}/{{ backup_match.files[0].path }}"
location_type: remote
@@ -388,7 +388,7 @@
register: upload_backup_cm
- name: Upload an existing backup from local machine to remote location - normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *upload_backup_cm
register: upload_backup_nm
ignore_errors: true
@@ -400,25 +400,25 @@
- upload_backup_nm.current == []
block:
- name: Query all backups - clear existing backups before uploading - to handle "Backup already existing issue"
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
state: query
register: query_ansibleBackup_for_delete
- name: Delete all backups from MSO/NDO before uploading the backup form local machine
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup_id: '{{ item.id }}'
state: absent
loop: '{{ query_ansibleBackup_for_delete.current | list | sort(attribute="name", reverse=True) }}'
- name: Upload an existing backup from local machine to remote location - normal mode - after removing existing backups
- mso_backup:
+ cisco.mso.mso_backup:
<<: *upload_backup_cm
register: upload_backup_nm
- name: Upload a non existent backup from local location
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: non_existent_backup
location_type: remote
@@ -429,7 +429,7 @@
ignore_errors: true
- name: Assertions check for the upload a backup form local machine to remote location
- assert:
+ ansible.builtin.assert:
that:
- upload_non_existent_backup is not changed
- "{{ 'Upload failed due to' in upload_non_existent_backup.msg }}"
@@ -442,21 +442,21 @@
when:
- version.current.version is version('2.2.4e', '!=')
- version.current.version is version('3.2', '<')
- set_fact:
+ ansible.builtin.set_fact:
uploaded_backup_name: '{{ upload_backup_nm.current.backupEntry.metadata.name.split("_") | first }}'
- name: Set Uploaded Backup Name for NDO
when:
- version.current.version is version('2.2.4e', '!=')
- version.current.version is version('3.2', '>=')
- set_fact:
+ ansible.builtin.set_fact:
uploaded_backup_name: '{{ upload_backup_nm.current.body.backupEntry.metadata.name.split("_") | first }}'
- name: Restore backup check
when: version.current.version is version('2.2.4e', '!=')
block:
- name: Restore non existent backup
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup: non_existent_backup
state: restore
@@ -465,13 +465,13 @@
register: restore_non_existent_backup
- name: Add a new tenant
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant1_absent
state: present
register: tenant1_present
- name: Restore {{ uploaded_backup_name }} in check mode
- mso_backup: &restore_backup_cm
+ cisco.mso.mso_backup: &restore_backup_cm
<<: *mso_info
backup: '{{ uploaded_backup_name }}'
state: restore
@@ -480,23 +480,23 @@
register: restore_backup_cm
- name: Restore {{ uploaded_backup_name }} in normal mode
- mso_backup:
+ cisco.mso.mso_backup:
<<: *restore_backup_cm
register: restore_backup_nm
- name: Query Tenant1 after restoring the backup
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant1_absent
state: query
register: query_tenant1
- name: Restore {{ uploaded_backup_name }} in normal mode - idempotency check
- mso_backup:
+ cisco.mso.mso_backup:
<<: *restore_backup_cm
register: idm_restore_backup_nm
- name: Assertions check for the backup restore
- assert:
+ ansible.builtin.assert:
that:
- restore_non_existent_backup.msg is match ("Backup 'non_existent_backup' does not exist")
- restore_backup_cm is changed
@@ -509,25 +509,25 @@
# Cleaning part
# Remove all other backups
- name: Query all backups before deleting
- mso_backup:
+ cisco.mso.mso_backup:
<<: *query_all_backups
state: query
register: query_all_backups_bf_delete
- name: Ensure backups does not exists
- mso_backup:
+ cisco.mso.mso_backup:
<<: *mso_info
backup_id: '{{ item.id }}'
state: absent
loop: '{{ query_all_backups_bf_delete.current | list | sort(attribute="name", reverse=True) }}'
- name: Query all backups after deleting - to ensure all are absent
- mso_backup:
+ cisco.mso.mso_backup:
<<: *query_all_backups
register: query_all_backups_af_delete
- name: Assertions check for the query and remove all backups
- assert:
+ ansible.builtin.assert:
that:
- query_all_backups_bf_delete is not changed
- query_all_backups_af_delete is not changed
@@ -541,6 +541,6 @@
# Remove Tenant1
- name: Ensure Tenant1 is absent
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant1_absent
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_backup_schedule/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_backup_schedule/tasks/main.yml
index 1a50284f8..02f6885aa 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_backup_schedule/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_backup_schedule/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -25,7 +25,6 @@
cisco.mso.mso_backup_schedule:
<<: *mso_info
state: absent
- delegate_to: localhost
- name: Ensure remote location is present
cisco.mso.mso_remote_location:
@@ -45,11 +44,10 @@
cisco.mso.mso_backup_schedule:
<<: *mso_info
state: query
- delegate_to: localhost
register: no_schedule
- name: Verify empty backup schedule
- assert:
+ ansible.builtin.assert:
that:
- no_schedule is not changed
- no_schedule.current == {}
@@ -62,7 +60,6 @@
remote_location: ansible_test
state: present
check_mode: true
- delegate_to: localhost
register: cm_schedule_create
- name: Set backup schedule (normal mode)
@@ -72,12 +69,11 @@
frequency_length: 7
remote_location: ansible_test
state: present
- delegate_to: localhost
register: nm_schedule_create
# add date tests
- name: Verify success set backup schedule
- assert:
+ ansible.builtin.assert:
that:
- cm_schedule_create is changed
- cm_schedule_create.current.intervalLength == 7
@@ -97,7 +93,6 @@
remote_location: ansible_test
state: present
check_mode: true
- delegate_to: localhost
register: cm_schedule_adjust
- name: Adjust backup schedule (normal mode)
@@ -107,11 +102,10 @@
frequency_length: 1
remote_location: ansible_test
state: present
- delegate_to: localhost
register: nm_schedule_adjust
- name: Verify success set backup schedule
- assert:
+ ansible.builtin.assert:
that:
- cm_schedule_adjust is changed
- cm_schedule_adjust.current.intervalLength == 1
@@ -126,11 +120,10 @@
cisco.mso.mso_backup_schedule:
<<: *mso_info
state: query
- delegate_to: localhost
register: schedule
- name: Verify success get backup schedule
- assert:
+ ansible.builtin.assert:
that:
- schedule is not changed
- nm_schedule_adjust.current.timeInterval.length == 1
@@ -142,23 +135,20 @@
<<: *mso_info
state: absent
check_mode: true
- delegate_to: localhost
- name: Delete backup schedule (normal mode)
cisco.mso.mso_backup_schedule:
<<: *mso_info
state: absent
- delegate_to: localhost
- name: Get empty backup schedule
cisco.mso.mso_backup_schedule:
<<: *mso_info
state: query
- delegate_to: localhost
register: no_schedule
- name: Verify empty backup schedule
- assert:
+ ansible.builtin.assert:
that:
- no_schedule is not changed
- no_schedule.current == {}
@@ -171,7 +161,6 @@
frequency_length: 7
remote_location: ansible_test
state: present
- delegate_to: localhost
register: nm_schedule_incorrect_time
ignore_errors: true
@@ -183,7 +172,6 @@
frequency_length: 7
remote_location: ansible_test
state: present
- delegate_to: localhost
register: nm_schedule_incorrect_date
ignore_errors: true
@@ -195,7 +183,6 @@
frequency_length: 7
remote_location: ansible_test
state: present
- delegate_to: localhost
register: nm_schedule_incorrect_date_from_start_date
ignore_errors: true
@@ -207,12 +194,11 @@
frequency_length: 7
remote_location: ansible_test
state: present
- delegate_to: localhost
register: nm_schedule_incorrect_time_from_start_time
ignore_errors: true
- name: Verify error messages
- assert:
+ ansible.builtin.assert:
that:
- nm_schedule_incorrect_time is failed
- nm_schedule_incorrect_time.msg.startswith("Failed to parse time format")
@@ -233,11 +219,10 @@
remote_location: ansible_test
remote_path: remote_add
state: present
- delegate_to: localhost
register: nm_schedule_full
- name: Verify success set backup schedule
- assert:
+ ansible.builtin.assert:
that:
- nm_schedule_full is changed
- nm_schedule_full.current.timeInterval.length == 1
@@ -250,17 +235,15 @@
cisco.mso.mso_backup_schedule:
<<: *mso_info
state: absent
- delegate_to: localhost
- name: Get empty backup schedule
cisco.mso.mso_backup_schedule:
<<: *mso_info
state: query
- delegate_to: localhost
register: no_schedule
- name: Verify empty backup schedule
- assert:
+ ansible.builtin.assert:
that:
- no_schedule is not changed
- - no_schedule.current == {} \ No newline at end of file
+ - no_schedule.current == {}
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy/tasks/main.yaml b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy/tasks/main.yaml
index b24749eb6..5d8225553 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy/tasks/main.yaml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy/tasks/main.yaml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
#CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,7 +22,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -31,7 +31,7 @@
when: version.current.version is version('4.0', '<')
block:
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -40,7 +40,7 @@
register: ansible_tenant
- name: Stop consuming DHCP Policy CLIENT_BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -51,7 +51,7 @@
ignore_errors: true
- name: Stop consuming DHCP Policy ansible_test_2
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -60,7 +60,7 @@
ignore_errors: true
- name: Stop consuming DHCP Policy ansible_test_multiple_dhcp
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -69,7 +69,7 @@
ignore_errors: true
- name: Stop consuming DHCP Policy ansible_test_5
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test_2") }}'
template: Template 5
@@ -78,7 +78,7 @@
ignore_errors: true
- name: Remove DHCP Option Policies
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
state: absent
@@ -91,7 +91,7 @@
# ADD DHCP Policy
- name: Add a new DHCP Option Policy 1 (check mode)
- mso_dhcp_option_policy: &create_dhcp
+ cisco.mso.mso_dhcp_option_policy: &create_dhcp
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
description: "My Test DHCP Policy 1"
@@ -101,12 +101,12 @@
register: dhcp_pol1_cm
- name: Add a new DHCP Option Policy 1 (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *create_dhcp
register: dhcp_pol1_nm
- name: Verify dhcp_pol1_cm and dhcp_pol1_nm
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_cm is changed
- dhcp_pol1_nm is changed
@@ -117,18 +117,18 @@
- dhcp_pol1_cm.current.tenantId == dhcp_pol1_nm.current.tenantId == ansible_tenant.current.id
- name: Add a new DHCP Option Policy 1 again (check mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *create_dhcp
check_mode: true
register: dhcp_pol1_again_cm
- name: Add a new DHCP Option Policy 1 again (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *create_dhcp
register: dhcp_pol1_again_nm
- name: Verify dhcp_pol1_again_cm and dhcp_pol1_again_nm
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_again_cm is not changed
- dhcp_pol1_again_nm is not changed
@@ -139,25 +139,25 @@
- dhcp_pol1_again_cm.current.tenantId == dhcp_pol1_again_nm.current.tenantId == ansible_tenant.current.id
- name: Add a new DHCP Option Policy 2 (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *create_dhcp
dhcp_option_policy: ansible_dhcp_option_2
- name: Change DHCP Option Policy 1 description (check mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *create_dhcp
description: "My Changed Test DHCP Policy 1"
check_mode: true
register: change_dhcp_pol1_cm
- name: Change DHCP Option Policy 1 description (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *create_dhcp
description: "My Changed Test DHCP Policy 1"
register: change_dhcp_pol1_nm
- name: Verify change_dhcp_pol1_cm and change_dhcp_pol1_nm
- assert:
+ ansible.builtin.assert:
that:
- change_dhcp_pol1_cm is changed
- change_dhcp_pol1_nm is changed
@@ -169,7 +169,7 @@
# QUERY A DHCP OPTION POLICY
- name: Query DHCP Option Policy 1 (check mode)
- mso_dhcp_option_policy: &query_dhcp
+ cisco.mso.mso_dhcp_option_policy: &query_dhcp
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
state: query
@@ -177,12 +177,12 @@
register: dhcp_pol1_query_cm
- name: Query DHCP Option Policy 1 (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *query_dhcp
register: dhcp_pol1_query_nm
- name: Verify dhcp_pol1_query
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_query_cm is not changed
- dhcp_pol1_query_nm is not changed
@@ -193,33 +193,33 @@
# QUERY A NON-EXISTING DHCP OPTION POLICY
- name: Query non-existing DHCP Option Policy (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: non_existing
state: query
register: quey_non_dhcp_pol
- name: Verify quey_non_dhcp_pol
- assert:
+ ansible.builtin.assert:
that:
- quey_non_dhcp_pol is not changed
# QUERY ALL DHCP OPTION POLICIES
- name: Query all DHCP Option Policies (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
state: query
register: dhcp_policies_query
- name: Verify dhcp_policies_query
- assert:
+ ansible.builtin.assert:
that:
- dhcp_policies_query is not changed
- dhcp_policies_query.current | length == 2
# REMOVE DHCP POLICY
- name: Remove DHCP Option Policy 1 (check mode)
- mso_dhcp_option_policy: &remove_dhcp
+ cisco.mso.mso_dhcp_option_policy: &remove_dhcp
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
state: absent
@@ -227,12 +227,12 @@
register: dhcp_pol1_removed_cm
- name: Remove DHCP Option Policy 1 (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *remove_dhcp
register: dhcp_pol1_removed_nm
- name: Verify dhcp_policies_removed
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_removed_cm is changed
- dhcp_pol1_removed_nm is changed
@@ -240,18 +240,18 @@
# REMOVE DHCP POLICY AGAIN
- name: Remove DHCP Option Policy 1 again (check mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *remove_dhcp
check_mode: true
register: dhcp_pol1_removed_again_cm
- name: Remove DHCP Option Policy 1 again (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *remove_dhcp
register: dhcp_pol1_removed_again_nm
- name: Verify dhcp_pol1_removed_again
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_removed_again_cm is not changed
- dhcp_pol1_removed_again_nm is not changed
@@ -261,7 +261,7 @@
# USE A NON-EXISTING TENANT
- name: Non Existing Tenant for DHCP Option Policy 3 (normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_3
description: "My Test DHCP Policy 3"
@@ -271,14 +271,14 @@
register: nm_non_existing_tenant
- name: Verify nm_non_existing_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_tenant is not changed
- nm_non_existing_tenant.msg == "Tenant 'non_existing' is not valid tenant name."
# CLEAN UP
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -289,7 +289,7 @@
ignore_errors: true
- name: Remove DHCP Option Policies
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy_option/tasks/main.yaml b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy_option/tasks/main.yaml
index f6a79204f..b7c5cd66f 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy_option/tasks/main.yaml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_option_policy_option/tasks/main.yaml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
#CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,7 +22,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -31,7 +31,7 @@
when: version.current.version is version('4.0', '<')
block:
- name: Remove options from DHCP Option Policy
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
name: "{{ item }}"
@@ -42,7 +42,7 @@
ignore_errors: true
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -53,7 +53,7 @@
ignore_errors: true
- name: Remove DHCP Relay Policy 1
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
@@ -62,7 +62,7 @@
- ansible_dhcp_relay_2
- name: Remove DHCP Option Policies
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
state: absent
@@ -72,7 +72,7 @@
- ansible_dhcp_option_2
- name: Undeploy sites in schema 1 template 1
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 1
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -86,7 +86,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Undeploy sites in schema 1 template 2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 2
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -100,7 +100,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -109,7 +109,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -118,7 +118,7 @@
register: tenant_ansible
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -126,7 +126,7 @@
state: present
- name: Add a new VRF
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -134,7 +134,7 @@
state: present
- name: Add BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -145,7 +145,7 @@
# ADD DHCP RELAY AND OPTION POLICY
- name: Add a new DHCP Option Policy 1 (Normal mode)
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
description: "My Test DHCP Policy 1"
@@ -153,7 +153,7 @@
state: present
- name: Add a new DHCP Relay Policy 1 (Normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
description: "My Test DHCP Policy 1"
@@ -162,7 +162,7 @@
# ADD OPTION TO DHCP OPTION POLICY
- name: Add Option to DHCP Option Policy (check mode)
- mso_dhcp_option_policy_option: &create_option
+ cisco.mso.mso_dhcp_option_policy_option: &create_option
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
name: ansibletest
@@ -173,12 +173,12 @@
register: dhcp_pol1_opt1_cm
- name: Add Option to DHCP Option Policy (normal mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *create_option
register: dhcp_pol1_opt1_nm
- name: Verify dhcp_pol1_opt1
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt1_cm is changed
- dhcp_pol1_opt1_nm is changed
@@ -187,18 +187,18 @@
- dhcp_pol1_opt1_cm.current.data == dhcp_pol1_opt1_nm.current.data == 'DHCP Data'
- name: Add Option to DHCP Option Policy again (check mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *create_option
check_mode: true
register: dhcp_pol1_opt1_again_cm
- name: Add Option to DHCP Option Policy again (normal mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *create_option
register: dhcp_pol1_opt1_again_nm
- name: Verify dhcp_pol1_opt1_again
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt1_again_cm is not changed
- dhcp_pol1_opt1_again_nm is not changed
@@ -207,20 +207,20 @@
- dhcp_pol1_opt1_again_cm.current.data == dhcp_pol1_opt1_again_nm.current.data == 'DHCP Data'
- name: Change Option IP to DHCP Option Policy (check mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *create_option
data: Changed DHCP Data
check_mode: true
register: dhcp_pol1_opt1_change_cm
- name: Change Option IP to DHCP Option Policy (normal mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *create_option
data: Changed DHCP Data
register: dhcp_pol1_opt1_change_nm
- name: Verify dhcp_pol1_opt1_change
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt1_change_cm is changed
- dhcp_pol1_opt1_change_nm is changed
@@ -229,20 +229,20 @@
- dhcp_pol1_opt1_change_cm.current.data == dhcp_pol1_opt1_change_nm.current.data == 'Changed DHCP Data'
- name: Add 2nd Option to DHCP Option Policy (check mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *create_option
name: ansibletest2
check_mode: true
register: dhcp_pol1_opt2_cm
- name: Add 2nd Option to DHCP Option Policy (normal mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *create_option
name: ansibletest2
register: dhcp_pol1_opt2_nm
- name: Verify dhcp_pol1_opt2
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt2_cm is changed
- dhcp_pol1_opt2_nm is changed
@@ -252,7 +252,7 @@
# QUERY OPTION FROM DHCP OPTION POLICY
- name: Query Option from DHCP Option Policy (check mode)
- mso_dhcp_option_policy_option: &query_option
+ cisco.mso.mso_dhcp_option_policy_option: &query_option
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
name: ansibletest
@@ -260,26 +260,26 @@
register: dhcp_pol1_opt1_query_cm
- name: Query Option from DHCP Option Policy (normal mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *query_option
register: dhcp_pol1_opt1_query_nm
- name: Query nonexisting Option from DHCP Option Policy
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *query_option
name: nonexisting
state: query
register: dhcp_pol1_opt1_query_non_existing
- name: Query all Options from a DHCP Option Policy
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
state: query
register: dhcp_pol1_query_all
- name: Verify all query variables
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt1_query_cm is not changed
- dhcp_pol1_opt1_query_nm is not changed
@@ -293,7 +293,7 @@
# REMOVE OPTION FROM DHCP OPTION POLICY
- name: Remove Option from DHCP Option Policy (check mode)
- mso_dhcp_option_policy_option: &delete_option
+ cisco.mso.mso_dhcp_option_policy_option: &delete_option
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
name: ansibletest
@@ -302,64 +302,64 @@
register: dhcp_pol1_opt1_del_cm
- name: Remove Option from DHCP Option Policy (normal mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *delete_option
register: dhcp_pol1_opt1_del_nm
- name: Verify dhcp_pol1_opt1_del
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt1_del_cm is changed
- dhcp_pol1_opt1_del_nm is changed
- dhcp_pol1_opt1_del_cm.current == dhcp_pol1_opt1_del_nm.current == {}
- name: Remove Option from DHCP Option Policy again (check mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *delete_option
check_mode: true
register: dhcp_pol1_opt1_del_again_cm
- name: Remove Option from DHCP Option Policy again (normal mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *delete_option
register: dhcp_pol1_opt1_del_again_nm
- name: Verify dhcp_pol1_opt1_again_del
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt1_del_again_cm is not changed
- dhcp_pol1_opt1_del_again_nm is not changed
- dhcp_pol1_opt1_del_again_cm.current == dhcp_pol1_opt1_del_again_nm.current == {}
- name: Remove Non-Existing Option
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *delete_option
name: nonexisting
register: dhcp_pol1_opt1_del_nm_non_existing
- name: Verify dhcp_pol1_opt1_del_nm_non_existing
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_opt1_del_nm_non_existing is not changed
- dhcp_pol1_opt1_del_nm_non_existing.current == {}
# CONSUME DHCP POLICIES
- name: Get DHCP Relay Policy version
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
state: query
register: dhcp_relay_policy_version
- name: Get DHCP Option Policy version
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
state: query
register: dhcp_option_policy_version
- name: Consume DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -376,7 +376,7 @@
register: bd_dhcp_policy
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -388,7 +388,7 @@
# QUERY OPTION FROM non_existing DHCP OPTION POLICY
- name: Query Option from DHCP Option Policy (check mode)
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *mso_info
dhcp_option_policy: nonexisting
state: query
@@ -396,14 +396,14 @@
register: dhcp_non_existing
- name: Verify dhcp_non_existing
- assert:
+ ansible.builtin.assert:
that:
- dhcp_non_existing is not changed
- dhcp_non_existing.msg == "DHCP Option Policy 'nonexisting' is not a valid DHCP Option Policy name."
# CLEAN UP
- name: Remove options from DHCP Option Policy
- mso_dhcp_option_policy_option:
+ cisco.mso.mso_dhcp_option_policy_option:
<<: *mso_info
dhcp_option_policy: ansible_dhcp_option_1
name: "{{ item }}"
@@ -414,7 +414,7 @@
ignore_errors: true
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -425,7 +425,7 @@
ignore_errors: true
- name: Remove DHCP Relay Policy 1
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
@@ -434,7 +434,7 @@
- ansible_dhcp_relay_2
- name: Remove DHCP Option Policies
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy/tasks/main.yaml b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy/tasks/main.yaml
index 4a7db2dca..a500c12f9 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy/tasks/main.yaml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy/tasks/main.yaml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
#CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,7 +21,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -30,7 +30,7 @@
when: version.current.version is version('4.0', '<')
block:
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -39,7 +39,7 @@
register: ansible_tenant
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -50,7 +50,7 @@
ignore_errors: true
- name: Remove DHCP Relay Policy 1
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
@@ -63,7 +63,7 @@
# ADD DHCP Policy
- name: Add a new DHCP Relay Policy 1 (check mode)
- mso_dhcp_relay_policy: &create_dhcp
+ cisco.mso.mso_dhcp_relay_policy: &create_dhcp
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
description: "My Test DHCP Policy 1"
@@ -73,12 +73,12 @@
register: dhcp_pol1_cm
- name: Add a new DHCP Relay Policy 1 (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *create_dhcp
register: dhcp_pol1_nm
- name: Verify dhcp_pol1_cm and dhcp_pol1_nm
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_cm is changed
- dhcp_pol1_nm is changed
@@ -89,18 +89,18 @@
- dhcp_pol1_cm.current.tenantId == dhcp_pol1_nm.current.tenantId == ansible_tenant.current.id
- name: Add a new DHCP Relay Policy 1 again (check mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *create_dhcp
check_mode: true
register: dhcp_pol1_again_cm
- name: Add a new DHCP Relay Policy 1 again (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *create_dhcp
register: dhcp_pol1_again_nm
- name: Verify dhcp_pol1_again_cm and dhcp_pol1_again_nm
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_again_cm is not changed
- dhcp_pol1_again_nm is not changed
@@ -111,25 +111,25 @@
- dhcp_pol1_again_cm.current.tenantId == dhcp_pol1_again_nm.current.tenantId == ansible_tenant.current.id
- name: Add a new DHCP Relay Policy 2 (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *create_dhcp
dhcp_relay_policy: ansible_dhcp_relay_2
- name: Change DHCP Relay Policy 1 description (check mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *create_dhcp
description: "My Changed Test DHCP Policy 1"
check_mode: true
register: change_dhcp_pol1_cm
- name: Change DHCP Relay Policy 1 description (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *create_dhcp
description: "My Changed Test DHCP Policy 1"
register: change_dhcp_pol1_nm
- name: Verify change_dhcp_pol1_cm and change_dhcp_pol1_nm
- assert:
+ ansible.builtin.assert:
that:
- change_dhcp_pol1_cm is changed
- change_dhcp_pol1_nm is changed
@@ -141,7 +141,7 @@
# QUERY A DHCP RELAY POLICY
- name: Query DHCP Relay Policy 1 (check mode)
- mso_dhcp_relay_policy: &query_dhcp
+ cisco.mso.mso_dhcp_relay_policy: &query_dhcp
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
state: query
@@ -149,12 +149,12 @@
register: dhcp_pol1_query_cm
- name: Query DHCP Relay Policy 1 (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *query_dhcp
register: dhcp_pol1_query_nm
- name: Verify dhcp_pol1_query
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_query_cm is not changed
- dhcp_pol1_query_nm is not changed
@@ -165,33 +165,33 @@
# QUERY A NON-EXISTING DHCP RELAY POLICY
- name: Query non-existing DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: non_existing
state: query
register: quey_non_dhcp_pol
- name: Verify quey_non_dhcp_pol
- assert:
+ ansible.builtin.assert:
that:
- quey_non_dhcp_pol is not changed
# QUERY ALL DHCP RELAY POLICIES
- name: Query all DHCP Relay Policies (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
state: query
register: dhcp_policies_query
- name: Verify dhcp_policies_query
- assert:
+ ansible.builtin.assert:
that:
- dhcp_policies_query is not changed
- dhcp_policies_query.current | length == 2
# REMOVE DHCP POLICY
- name: Remove DHCP Relay Policy 1 (check mode)
- mso_dhcp_relay_policy: &remove_dhcp
+ cisco.mso.mso_dhcp_relay_policy: &remove_dhcp
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
state: absent
@@ -199,12 +199,12 @@
register: dhcp_pol1_removed_cm
- name: Remove DHCP Relay Policy 1 (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *remove_dhcp
register: dhcp_pol1_removed_nm
- name: Verify dhcp_policies_removed
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_removed_cm is changed
- dhcp_pol1_removed_nm is changed
@@ -212,18 +212,18 @@
# REMOVE DHCP POLICY AGAIN
- name: Remove DHCP Relay Policy 1 again (check mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *remove_dhcp
check_mode: true
register: dhcp_pol1_removed_again_cm
- name: Remove DHCP Relay Policy 1 again (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *remove_dhcp
register: dhcp_pol1_removed_again_nm
- name: Verify dhcp_pol1_removed_again
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_removed_again_cm is not changed
- dhcp_pol1_removed_again_nm is not changed
@@ -233,7 +233,7 @@
# USE A NON-EXISTING TENANT
- name: Non Existing Tenant for DHCP Relay Policy 3 (normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_3
description: "My Test DHCP Policy 3"
@@ -243,14 +243,14 @@
register: nm_non_existing_tenant
- name: Verify nm_non_existing_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_tenant is not changed
- nm_non_existing_tenant.msg == "Tenant 'non_existing' is not valid tenant name."
# CLEAN UP DHCP POLICIES
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -261,7 +261,7 @@
ignore_errors: true
- name: Remove DHCP Relay Policy 1
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy_provider/tasks/main.yaml b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy_provider/tasks/main.yaml
index 828a34424..a3506099c 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy_provider/tasks/main.yaml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_dhcp_relay_policy_provider/tasks/main.yaml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
#CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,7 +21,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -30,7 +30,7 @@
when: version.current.version is version('4.0', '<')
block:
- name: Remove EXT_EPGs Providers from DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -44,7 +44,7 @@
- EXT_EPG_2
- name: Remove EXT_EPGs Providers from DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -59,7 +59,7 @@
- EPG_2
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -70,7 +70,7 @@
ignore_errors: true
- name: Remove DHCP Relay Policies
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
@@ -80,7 +80,7 @@
- ansible_dhcp_relay_2
- name: Undeploy sites in schema 1 template 1
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 1
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -94,7 +94,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Undeploy sites in schema 1 template 2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 2
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -108,7 +108,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -117,7 +117,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -126,7 +126,7 @@
register: tenant_ansible
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -135,7 +135,7 @@
# CREATE EPG PROVIDER
- name: Add a new VRF
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -143,7 +143,7 @@
state: present
- name: Add a new BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -153,7 +153,7 @@
state: present
- name: Add 2nd BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -163,7 +163,7 @@
state: present
- name: Add a new ANP
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -171,7 +171,7 @@
state: present
- name: Add a new EPG
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -184,7 +184,7 @@
state: present
- name: Add 2nd EPG
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -197,7 +197,7 @@
state: present
- name: Add a new L3out
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -240,7 +240,7 @@
# ADD DHCP RELAY POLICY
- name: Add a new DHCP Relay Policy 1 (Normal mode)
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
description: "My Test DHCP Policy 1"
@@ -249,7 +249,7 @@
# ADD PROVIDER TO DHCP RELAY POLICY
- name: Add Provider to DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider: &create_provider
+ cisco.mso.mso_dhcp_relay_policy_provider: &create_provider
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
ip: "1.1.1.1"
@@ -263,12 +263,12 @@
register: dhcp_pol1_prov1_cm
- name: Add Provider to DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider
register: dhcp_pol1_prov1_nm
- name: Verify dhcp_pol1_prov1
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov1_cm is changed
- dhcp_pol1_prov1_nm is changed
@@ -283,18 +283,18 @@
- dhcp_pol1_prov1_nm.current.tenantId == tenant_ansible.current.id
- name: Add Provider to DHCP Relay Policy again (check mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider
check_mode: true
register: dhcp_pol1_prov1_again_cm
- name: Add Provider to DHCP Relay Policy again (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider
register: dhcp_pol1_prov1_again_nm
- name: Verify dhcp_pol1_prov1_again
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov1_again_cm is not changed
- dhcp_pol1_prov1_again_nm is not changed
@@ -309,20 +309,20 @@
- dhcp_pol1_prov1_again_nm.current.tenantId == tenant_ansible.current.id
- name: Change Provider IP to DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider
ip: "2.2.2.2"
check_mode: true
register: dhcp_pol1_prov1_change_cm
- name: Change Provider IP to DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider
ip: "2.2.2.2"
register: dhcp_pol1_prov1_change_nm
- name: Verify dhcp_pol1_prov1_change
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov1_change_cm is changed
- dhcp_pol1_prov1_change_nm is changed
@@ -337,7 +337,7 @@
- dhcp_pol1_prov1_change_nm.current.tenantId == tenant_ansible.current.id
- name: Add 2nd Provider (EPG_2) to DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider
ip: "2.2.2.2"
endpoint_group: EPG_2
@@ -345,14 +345,14 @@
register: dhcp_pol1_prov2_cm
- name: Add 2nd Provider (EPG_2) to DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider
ip: "2.2.2.2"
endpoint_group: EPG_2
register: dhcp_pol1_prov2_nm
- name: Add 3rd Provider (EXT_EPG_1) to DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider: &create_provider_external_epg
+ cisco.mso.mso_dhcp_relay_policy_provider: &create_provider_external_epg
<<: *create_provider
ip: "2.2.2.2"
external_endpoint_group: EXT_EPG_1
@@ -362,26 +362,26 @@
register: dhcp_pol1_prov3_cm
- name: Add 3rd Provider (EXT_EPG_1) to DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider_external_epg
external_endpoint_group: EXT_EPG_1
register: dhcp_pol1_prov3_nm
- name: Add 4th Provider (EXT_EPG_2) to DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider_external_epg
external_endpoint_group: EXT_EPG_2
check_mode: true
register: dhcp_pol1_prov4_cm
- name: Add 4th Provider (EXT_EPG_2) to DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *create_provider_external_epg
external_endpoint_group: EXT_EPG_2
register: dhcp_pol1_prov4_nm
- name: Verify dhcp_pol1_prov2, dhcp_pol1_prov3 and dhcp_pol1_prov4
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov2_cm is changed
- dhcp_pol1_prov2_nm is changed
@@ -409,7 +409,7 @@
# ADD DHCP RELAY PROVIDER WITH WRONG Attributes
- name: Add Provider to DHCP Relay Policy - wrong tenant (Normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
ip: "2.2.2.2"
@@ -423,7 +423,7 @@
register: dhcp_pol1_prov2_nm_ten_wrong
- name: Add Provider to DHCP Relay Policy - wrong Schema (Normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
ip: "2.2.2.2"
@@ -437,7 +437,7 @@
register: dhcp_pol1_prov2_nm_sch_wrong
- name: Verify dhcp_pol1_prov2_nm_ten_wrong, dhcp_pol1_prov2_nm_sch_wrong & dhcp_pol1_prov2_nm_tmp_wrong
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov2_nm_ten_wrong is not changed
- dhcp_pol1_prov2_nm_ten_wrong.msg == "Tenant 'ansible_test_wrong' is not valid tenant name."
@@ -447,7 +447,7 @@
# QUERY PROVIDER FROM DHCP RELAY POLICY
- name: Query Provider from DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider: &query_provider
+ cisco.mso.mso_dhcp_relay_policy_provider: &query_provider
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -459,26 +459,26 @@
register: dhcp_pol1_prov1_query_cm
- name: Query Provider from DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *query_provider
register: dhcp_pol1_prov1_query_nm
- name: Query non_existing Provider from DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *query_provider
endpoint_group: non_existing
state: query
register: dhcp_pol1_prov1_query_non_existing
- name: Query all Providers from a DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
state: query
register: dhcp_pol1_query_all
- name: Verify all query variables
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov1_query_cm is not changed
- dhcp_pol1_prov1_query_nm is not changed
@@ -496,7 +496,7 @@
# REMOVE PROVIDER FROM DHCP RELAY POLICY
- name: Remove Provider (EXT_EPG) from DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider: &delete_provider
+ cisco.mso.mso_dhcp_relay_policy_provider: &delete_provider
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -508,43 +508,43 @@
register: dhcp_pol1_prov1_del_cm
- name: Remove Provider (EXT_EPG) from DHCP Relay Policy (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *delete_provider
register: dhcp_pol1_prov1_del_nm
- name: Verify dhcp_pol1_prov1_del
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov1_del_cm is changed
- dhcp_pol1_prov1_del_nm is changed
- dhcp_pol1_prov1_del_cm.current == dhcp_pol1_prov1_del_nm.current == {}
- name: Remove Provider (EXT_EPG) from DHCP Relay Policy again (check mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *delete_provider
check_mode: true
register: dhcp_pol1_prov1_del_again_cm
- name: Remove Provider (EXT_EPG) from DHCP Relay Policy again (normal mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *delete_provider
register: dhcp_pol1_prov1_del_again_nm
- name: Verify dhcp_pol1_prov1_again_del
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov1_del_again_cm is not changed
- dhcp_pol1_prov1_del_again_nm is not changed
- dhcp_pol1_prov1_del_again_cm.current == dhcp_pol1_prov1_del_again_nm.current == {}
- name: Remove Non-Existing Provider (EXT_EPG)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *delete_provider
external_endpoint_group: non_existing
register: dhcp_pol1_prov1_del_nm_non_existing
- name: Remove Provider without epg or ext_epg
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -555,7 +555,7 @@
register: dhcp_pol1_prov1_del_none
- name: Verify dhcp_pol1_prov1_del_nm_non_existing
- assert:
+ ansible.builtin.assert:
that:
- dhcp_pol1_prov1_del_nm_non_existing is not changed
- dhcp_pol1_prov1_del_none is not changed
@@ -564,14 +564,14 @@
# CONSUME DHCP POLICIES
- name: Get DHCP Relay Policy version
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
state: query
register: dhcp_relay_policy_version
- name: Consume DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -585,7 +585,7 @@
register: bd_dhcp_policy
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -597,7 +597,7 @@
# QUERY PROVIDER FROM non_existing DHCP RELAY POLICY
- name: Query Provider from DHCP Relay Policy (check mode)
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: non_existing
state: query
@@ -605,14 +605,14 @@
register: dhcp_non_existing
- name: Verify dhcp_non_existing
- assert:
+ ansible.builtin.assert:
that:
- dhcp_non_existing is not changed
- dhcp_non_existing.msg == "DHCP Relay Policy 'non_existing' is not a valid DHCP Relay Policy name."
# CLEAN UP
- name: Remove EXT_EPGs Providers from DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -626,7 +626,7 @@
- EXT_EPG_2
- name: Remove EXT_EPGs Providers from DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -641,7 +641,7 @@
- EPG_2
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -652,7 +652,7 @@
ignore_errors: true
- name: Remove DHCP Relay Policies
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_label/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_label/tasks/main.yml
index fffb0ce78..e9e2e5a46 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_label/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_label/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,7 +22,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -31,14 +31,14 @@
when: version.current.version is version('3.2', '<')
block:
- name: GET auth radius providers
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/auth/providers/radius
method: get
register: radius_providers
- name: Add auth radius provider
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/auth/providers/radius
method: post
@@ -57,25 +57,25 @@
when: mso_radius_server not in (radius_providers.jsondata.radiusProviders | map(attribute='host'))
- name: GET login domains
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/auth/domains
method: get
register: login_domains
- name: GET auth radius providers again after creation
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/auth/providers/radius
method: get
register: radius_providers
- name: GET auth radius provider ID
- set_fact:
+ ansible.builtin.set_fact:
radius_provider_id: "{{ (radius_providers.jsondata.radiusProviders | selectattr('host', 'eq', mso_radius_server) | first)['id'] }}"
- name: Add test login domain
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/auth/domains
method: post
@@ -95,7 +95,7 @@
# REMOVE DHCP POLICY
- name: Remove DHCP Option Policy
- mso_dhcp_option_policy: &remove_dhcp
+ cisco.mso.mso_dhcp_option_policy: &remove_dhcp
<<: *mso_info
dhcp_option_policy: '{{ item }}'
state: absent
@@ -104,7 +104,7 @@
- ansible_dhcp_option_2
- name: Remove DHCP Relay Policy
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
@@ -113,19 +113,19 @@
- ansible_dhcp_relay_2
- name: Remove label ansible_test
- mso_label: &label_absent
+ cisco.mso.mso_label: &label_absent
<<: *mso_info
label: ansible_test
state: absent
- name: Remove label ansible_test2
- mso_label:
+ cisco.mso.mso_label:
<<: *label_absent
label: ansible_test2
register: cm_remove_label
- name: Remove label ansible_test3
- mso_label: &domain_label_absent
+ cisco.mso.mso_label: &domain_label_absent
<<: *mso_info
state: absent
label: ansible_test3
@@ -133,14 +133,14 @@
register: nm_remove_label3
- name: Remove label ansible_test4
- mso_label:
+ cisco.mso.mso_label:
<<: *domain_label_absent
label: ansible_test4
login_domain: '{{ mso_login_domain | default("test") }}'
# ADD LABEL
- name: Add label (check_mode)
- mso_label: &label_present
+ cisco.mso.mso_label: &label_present
<<: *mso_info
label: ansible_test
state: present
@@ -148,7 +148,7 @@
register: cm_add_label
- name: Verify cm_add_label
- assert:
+ ansible.builtin.assert:
that:
- cm_add_label is changed
- cm_add_label.previous == {}
@@ -157,11 +157,11 @@
- cm_add_label.current.type == 'site'
- name: Add label (normal mode)
- mso_label: *label_present
+ cisco.mso.mso_label: *label_present
register: nm_add_label
- name: Verify nm_add_label
- assert:
+ ansible.builtin.assert:
that:
- nm_add_label is changed
- nm_add_label.previous == {}
@@ -170,12 +170,12 @@
- nm_add_label.current.type == 'site'
- name: Add label again (check_mode)
- mso_label: *label_present
+ cisco.mso.mso_label: *label_present
check_mode: true
register: cm_add_label_again
- name: Verify cm_add_label_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_label_again is not changed
- cm_add_label_again.previous.displayName == 'ansible_test'
@@ -185,11 +185,11 @@
- cm_add_label_again.current.type == 'site'
- name: Add label again (normal mode)
- mso_label: *label_present
+ cisco.mso.mso_label: *label_present
register: nm_add_label_again
- name: Verify nm_add_label_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_label_again is not changed
- nm_add_label_again.previous.displayName == 'ansible_test'
@@ -201,7 +201,7 @@
# CHANGE LABEL
# - name: Change label (check_mode)
-# mso_label:
+# cisco.mso.mso_label:
# <<: *label_present
# label_id: '{{ nm_add_label.current.id }}'
# label: ansible_test2
@@ -209,7 +209,7 @@
# register: cm_change_label
# - name: Verify cm_change_label
-# assert:
+# ansible.builtin.assert:
# that:
# - cm_change_label is changed
# - cm_change_label.current.displayName == 'ansible_test2'
@@ -217,7 +217,7 @@
# - cm_change_label.current.type == 'site'
# - name: Change label (normal mode)
-# mso_label:
+# cisco.mso.mso_label:
# <<: *label_present
# label_id: '{{ nm_add_label.current.id }}'
# label: ansible_test2
@@ -225,7 +225,7 @@
# register: nm_change_label
# - name: Verify nm_change_label
-# assert:
+# ansible.builtin.assert:
# that:
# - nm_change_label is changed
# - cm_change_label.current.displayName == 'ansible_test2'
@@ -233,7 +233,7 @@
# - nm_change_label.current.type == 'site'
# - name: Change label again (check_mode)
-# mso_label:
+# cisco.mso.mso_label:
# <<: *label_present
# label_id: '{{ nm_add_label.current.id }}'
# label: ansible_test2
@@ -241,7 +241,7 @@
# register: cm_change_label_again
# - name: Verify cm_change_label_again
-# assert:
+# ansible.builtin.assert:
# that:
# - cm_change_label_again is not changed
# - cm_change_label_again.current.displayName == 'ansible_test2'
@@ -249,14 +249,14 @@
# - cm_change_label_again.current.type == 'site'
# - name: Change label again (normal mode)
-# mso_label:
+# cisco.mso.mso_label:
# <<: *label_present
# label_id: '{{ nm_add_label.current.id }}'
# label: ansible_test2
# register: nm_change_label_again
# - name: Verify nm_change_label_again
-# assert:
+# ansible.builtin.assert:
# that:
# - nm_change_label_again is not changed
# - nm_change_label_again.current.displayName == 'ansible_test2'
@@ -266,18 +266,18 @@
# QUERY ALL LABELS
- name: Query all labels (check_mode)
- mso_label: &label_query
+ cisco.mso.mso_label: &label_query
<<: *mso_info
state: query
check_mode: true
register: cm_query_all_labels
- name: Query all labels (normal mode)
- mso_label: *label_query
+ cisco.mso.mso_label: *label_query
register: nm_query_all_labels
- name: Verify query_all_labels
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_labels is not changed
- nm_query_all_labels is not changed
@@ -288,20 +288,20 @@
# QUERY A LABEL
- name: Query our label (check mode)
- mso_label:
+ cisco.mso.mso_label:
<<: *label_query
label: ansible_test
check_mode: true
register: cm_query_label
- name: Query our label (normal mode)
- mso_label:
+ cisco.mso.mso_label:
<<: *label_query
label: ansible_test
register: nm_query_label
- name: Verify query_label
- assert:
+ ansible.builtin.assert:
that:
- cm_query_label is not changed
- cm_query_label.current.displayName == 'ansible_test'
@@ -316,43 +316,43 @@
# REMOVE LABEL
- name: Remove label (check_mode)
- mso_label: *label_absent
+ cisco.mso.mso_label: *label_absent
check_mode: true
register: cm_remove_label
- name: Verify cm_remove_label
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_label is changed
- cm_remove_label.current == {}
- name: Remove label (normal mode)
- mso_label: *label_absent
+ cisco.mso.mso_label: *label_absent
register: nm_remove_label
- name: Verify nm_remove_label
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_label is changed
- nm_remove_label.current == {}
- name: Remove label again (check_mode)
- mso_label: *label_absent
+ cisco.mso.mso_label: *label_absent
check_mode: true
register: cm_remove_label_again
- name: Verify cm_remove_label_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_label_again is not changed
- cm_remove_label_again.current == {}
- name: Remove label again (normal mode)
- mso_label: *label_absent
+ cisco.mso.mso_label: *label_absent
register: nm_remove_label_again
- name: Verify nm_remove_label_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_label_again is not changed
- nm_remove_label_again.current == {}
@@ -360,21 +360,21 @@
# QUERY NON-EXISTING LABEL
- name: Query non-existing label (check_mode)
- mso_label:
+ cisco.mso.mso_label:
<<: *label_query
label: ansible_test
check_mode: true
register: cm_query_non_label
- name: Query non-existing label (normal mode)
- mso_label:
+ cisco.mso.mso_label:
<<: *label_query
label: ansible_test
register: nm_query_non_label
# TODO: Implement more tests
- name: Verify query_non_label
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_label is not changed
- nm_query_non_label is not changed
@@ -382,7 +382,7 @@
# add label with login domain
- name: Add label local domain(normal mode)
- mso_label: &domain_label_present
+ cisco.mso.mso_label: &domain_label_present
<<: *mso_info
state: present
label: ansible_test3
@@ -390,21 +390,21 @@
register: label_local_domain
- name: Verify label_local_domain
- assert:
+ ansible.builtin.assert:
that:
- label_local_domain is changed
- label_local_domain.current.displayName == 'ansible_test3'
- label_local_domain.current.type == 'site'
- name: Add label test domain(normal mode)
- mso_label:
+ cisco.mso.mso_label:
<<: *domain_label_present
label: ansible_test4
login_domain: '{{ mso_login_domain | default("test") }}'
register: label_test_domain
- name: Verify label_test_domain
- assert:
+ ansible.builtin.assert:
that:
- label_test_domain is changed
- label_test_domain.current.displayName == 'ansible_test4'
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_remote_location/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_remote_location/tasks/main.yml
index aa543f959..d5d00010d 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_remote_location/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_remote_location/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -25,7 +25,6 @@
cisco.mso.mso_backup:
<<: *mso_info
state: query
- delegate_to: localhost
register: backups
- name: Ensure all backups with link to remote location ansible_test are removed
@@ -38,14 +37,12 @@
- item.location.locationType is defined
- item.location.locationType == "remote"
loop: "{{ backups.current | sort(attribute='name', reverse=True) }}"
- delegate_to: localhost
- name: Ensure remote location ansible_test is removed
cisco.mso.mso_remote_location:
<<: *mso_info
remote_location: ansible_test
state: absent
- delegate_to: localhost
- name: Configure remote location scp (check mode)
cisco.mso.mso_remote_location: &remote_location
@@ -59,17 +56,15 @@
remote_password: '{{ mso_remote_location_password | default(mso_password) }}'
state: present
check_mode: true
- delegate_to: localhost
register: cm_config_remote
- name: Configure remote location scp
cisco.mso.mso_remote_location:
<<: *remote_location
- delegate_to: localhost
register: nm_config_remote
- name: Verify configuration
- assert:
+ ansible.builtin.assert:
that:
- cm_config_remote is changed
- cm_config_remote.current.name == "ansible_test"
@@ -92,11 +87,10 @@
- name: Configure remote location again
cisco.mso.mso_remote_location:
<<: *remote_location
- delegate_to: localhost
register: nm_config_remote_again
- name: Verify configuration after again
- assert:
+ ansible.builtin.assert:
that:
- nm_config_remote_again is not changed
@@ -105,18 +99,16 @@
<<: *remote_location
description: changed_description
check_mode: true
- delegate_to: localhost
register: cm_change_config_remote_description
- name: Change remote location description
cisco.mso.mso_remote_location:
<<: *remote_location
description: changed_description
- delegate_to: localhost
register: nm_change_config_remote_description
- name: Verify configuration change
- assert:
+ ansible.builtin.assert:
that:
- cm_change_config_remote_description is changed
- cm_change_config_remote_description.current.description == "changed_description"
@@ -127,14 +119,12 @@
cisco.mso.mso_remote_location:
<<: *remote_location
state: query
- delegate_to: localhost
register: nm_query_remote
- name: Query all remote locations
cisco.mso.mso_remote_location:
<<: *mso_info
state: query
- delegate_to: localhost
register: nm_query_all_remotes
- name: Query non existing remote location
@@ -143,11 +133,10 @@
remote_location: non_existing
state: query
ignore_errors: true
- delegate_to: localhost
register: nm_query_non_existing
- name: Verify queries
- assert:
+ ansible.builtin.assert:
that:
- nm_query_remote is not changed
- nm_query_remote.current | type_debug == "dict"
@@ -161,18 +150,16 @@
<<: *remote_location
state: absent
check_mode: true
- delegate_to: localhost
register: cm_delete_config_remote
- name: Remove remote location
cisco.mso.mso_remote_location:
<<: *remote_location
state: absent
- delegate_to: localhost
register: nm_delete_config_remote
- name: Verify delete
- assert:
+ ansible.builtin.assert:
that:
- cm_delete_config_remote is changed
- cm_delete_config_remote.current == {}
@@ -190,18 +177,16 @@
<<: *remote_location
remote_path: '{{ mso_remote_location_alternate_path | default("/home/"~mso_username) }}'
check_mode: true
- delegate_to: localhost
register: cm_config_remote_different_path
- name: Configure remote location different path
cisco.mso.mso_remote_location:
<<: *remote_location
remote_path: '{{ mso_remote_location_alternate_path | default("/home/"~mso_username) }}'
- delegate_to: localhost
register: nm_config_remote_different_path
- name: Verify configuration different path
- assert:
+ ansible.builtin.assert:
that:
- cm_config_remote_different_path is changed
- cm_config_remote_different_path.current.credential.remotePath == '{{ mso_remote_location_alternate_path | default("/home/"~mso_username) }}'
@@ -212,25 +197,22 @@
cisco.mso.mso_remote_location:
<<: *remote_location
state: absent
- delegate_to: localhost
- name: Configure remote location sftp (check mode)
cisco.mso.mso_remote_location:
<<: *remote_location
remote_protocol: sftp
check_mode: true
- delegate_to: localhost
register: cm_config_remote_sftp
- name: Configure remote location sftp
cisco.mso.mso_remote_location:
<<: *remote_location
remote_protocol: sftp
- delegate_to: localhost
register: nm_config_remote_sftp
- name: Verify configuration sftp
- assert:
+ ansible.builtin.assert:
that:
- cm_config_remote_sftp is changed
- cm_config_remote_sftp.current.credential.protocolType == "sftp"
@@ -241,7 +223,6 @@
cisco.mso.mso_remote_location:
<<: *remote_location
state: absent
- delegate_to: localhost
- name: Configure remote location ssh (check mode)
cisco.mso.mso_remote_location: &remote_location_ssh
@@ -249,17 +230,15 @@
authentication_type: ssh
remote_ssh_key: "{{ lookup('file', 'pki/rsa') }}"
check_mode: true
- delegate_to: localhost
register: cm_config_remote_ssh
- name: Configure remote location ssh
cisco.mso.mso_remote_location:
<<: *remote_location_ssh
- delegate_to: localhost
register: nm_config_remote_ssh
- name: Verify configuration ssh
- assert:
+ ansible.builtin.assert:
that:
- cm_config_remote_ssh is changed
- cm_config_remote_ssh.current.credential.authType == "sshKey"
@@ -270,7 +249,6 @@
cisco.mso.mso_remote_location:
<<: *remote_location_ssh
state: absent
- delegate_to: localhost
- name: Configure remote location ssh with passphrase (check mode)
cisco.mso.mso_remote_location: &remote_location_ssh_pass
@@ -279,17 +257,15 @@
remote_ssh_key: "{{ lookup('file', 'pki/rsa-passphrase') }}"
remote_ssh_passphrase: '{{ mso_output_level | default("ansible") }}'
check_mode: true
- delegate_to: localhost
register: cm_config_remote_ssh_pass
- name: Configure remote location ssh with passphrase
cisco.mso.mso_remote_location:
<<: *remote_location_ssh_pass
- delegate_to: localhost
register: nm_config_remote_ssh_pass
- name: Verify configuration ssh
- assert:
+ ansible.builtin.assert:
that:
- cm_config_remote_ssh_pass is changed
- cm_config_remote_ssh_pass.current.credential.authType == "sshKey"
@@ -300,4 +276,3 @@
cisco.mso.mso_remote_location:
<<: *remote_location_ssh_pass
state: absent
- delegate_to: localhost \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/error_handling.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/error_handling.yml
index 63a241918..456220eac 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/error_handling.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/error_handling.yml
@@ -5,14 +5,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# SET VARs
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,7 +23,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -45,7 +45,7 @@
register: error_on_missing_required_param
- name: Verify error_on_missing_required_param
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_required_param is failed
- 'error_on_missing_required_param.msg == "missing required arguments: path"'
@@ -73,19 +73,19 @@
register: error_on_name_resolution
- name: Verify error_on_name_resolution
- assert:
+ ansible.builtin.assert:
that:
- error_on_name_resolution is failed
- name: Verify error_on_name_resolution
- assert:
+ ansible.builtin.assert:
that:
- error_on_name_resolution.msg is search("Name or service not known")
when:
- version.current.version is version('3.7', '>=')
- name: Error on invalid path
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/tenant
method: post
@@ -100,14 +100,14 @@
register: error_on_invalid_path
- name: Verify error_on_invalid_path
- assert:
+ ansible.builtin.assert:
that:
- error_on_invalid_path is failed
- error_on_invalid_path.status == 404
when: version.current.version is version('3.0.0a', '<') or version.current.version is version('3.2', '>=')
- name: Verify error_on_invalid_path
- assert:
+ ansible.builtin.assert:
that:
- error_on_invalid_path is failed
- error_on_invalid_path.status == 405
@@ -126,7 +126,7 @@
register: error_on_missing_attributes
- name: Verify error_on_missing_attributes
- assert:
+ ansible.builtin.assert:
that:
- error_on_missing_attributes is failed
- error_on_missing_attributes.status == 400
@@ -147,7 +147,7 @@
register: error_on_input_validation
- name: Verify error_on_input_validation
- assert:
+ ansible.builtin.assert:
that:
- error_on_input_validation is failed
- error_on_input_validation.status == 400
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_inline.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_inline.yml
index 252733c29..9eff34f24 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_inline.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_inline.yml
@@ -5,14 +5,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,13 +23,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove EXT_EPGs Providers from DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -43,7 +43,7 @@
- EXT_EPG_2
- name: Remove EXT_EPGs Providers from DHCP Relay Policy
- mso_dhcp_relay_policy_provider:
+ cisco.mso.mso_dhcp_relay_policy_provider:
<<: *mso_info
dhcp_relay_policy: ansible_dhcp_relay_1
tenant: ansible_test
@@ -58,7 +58,7 @@
- EPG_2
- name: Stop consuming DHCP Policy
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -69,7 +69,7 @@
ignore_errors: true
- name: Remove DHCP Relay Policies
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
state: absent
@@ -79,7 +79,7 @@
- ansible_dhcp_relay_2
- name: Remove DHCP Option Policies
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
state: absent
@@ -101,7 +101,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Remove tenant ansible_test
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
state: absent
@@ -109,20 +109,20 @@
# QUERY SCHEMAS
- name: Query schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: get
register: query_all_schema
- name: Verify query_all_schema in json_inline
- assert:
+ ansible.builtin.assert:
that:
- query_all_schema is not changed
# QUERY A USER
- name: Query our user
- mso_user:
+ cisco.mso.mso_user:
<<: *mso_info
state: query
user: '{{ mso_username }}'
@@ -130,14 +130,14 @@
register: query_user_id
- name: Verify query_user_id
- assert:
+ ansible.builtin.assert:
that:
- query_user_id is not changed
- query_user_id.current.username == '{{ mso_username }}'
# ADD tenant
- name: Add tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/tenants
method: post
@@ -155,14 +155,14 @@
register: add_tenant
- name: Verify add_tenant in json_inline
- assert:
+ ansible.builtin.assert:
that:
- add_tenant is changed
- add_tenant.jsondata.displayName == 'ansible_test'
# ADD schema
- name: Add schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: post
@@ -190,14 +190,14 @@
register: add_schema
- name: Verify add_schema in json_inline
- assert:
+ ansible.builtin.assert:
that:
- add_schema is changed
- add_schema.jsondata.displayName == 'ansible_test'
# PUT schema
- name: Put schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
port: 443
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
@@ -226,14 +226,14 @@
register: put_schema
- name: Verify put_schema in json_inline
- assert:
+ ansible.builtin.assert:
that:
- put_schema is changed
- put_schema.jsondata.displayName == 'ansible_test_2'
# PATCH schema
- name: Patch schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: patch
@@ -249,12 +249,12 @@
register: patch_schema
- name: Verify patch_schema in json_inline
- assert:
+ ansible.builtin.assert:
that:
- patch_schema is changed
- name: Verify patch_schema in json_inline
- assert:
+ ansible.builtin.assert:
that:
- patch_schema.jsondata.templates[0].anps[0].displayName == 'AP2'
# MSO 3.3 PATCH does not return anything anymore.
@@ -262,28 +262,28 @@
# DELETE the schema
- name: Delete the schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: delete
register: delete_schema
- name: Verify delete_schema in json_inline
- assert:
+ ansible.builtin.assert:
that:
- delete_schema is changed
- delete_schema.jsondata == None
# DELETE TENANT
- name: Delete the tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/tenants/{{ add_tenant.jsondata.id }}"
method: delete
register: delete_tenant
- name: Verify delete_tenant in json_inline
- assert:
+ ansible.builtin.assert:
that:
- delete_tenant is changed
- delete_tenant.jsondata == None \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_string.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_string.yml
index 9a9df1ea7..821e3e701 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_string.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_string.yml
@@ -5,14 +5,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,7 +23,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -38,27 +38,27 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove tenant ansible_test
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
state: absent
# QUERY SCHEMAS
- name: Query schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: get
register: query_all_schema
- name: Verify query_all_schema
- assert:
+ ansible.builtin.assert:
that:
- query_all_schema is not changed
# QUERY A USER
- name: Query our user
- mso_user:
+ cisco.mso.mso_user:
<<: *mso_info
state: query
user: '{{ mso_username }}'
@@ -66,14 +66,14 @@
register: query_user_id
- name: Verify query_user_id
- assert:
+ ansible.builtin.assert:
that:
- query_user_id is not changed
- query_user_id.current.username == '{{ mso_username }}'
# ADD tenant
- name: Add tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/tenants
method: post
@@ -91,14 +91,14 @@
register: add_tenant
- name: Verify add_tenant in json_string
- assert:
+ ansible.builtin.assert:
that:
- add_tenant is changed
- add_tenant.jsondata.displayName == 'ansible_test'
# ADD schema
- name: Add schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: post
@@ -126,14 +126,14 @@
register: add_schema
- name: Verify add_schema in json_string
- assert:
+ ansible.builtin.assert:
that:
- add_schema is changed
- add_schema.jsondata.displayName == 'ansible_test'
# PUT schema
- name: Put schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: put
@@ -161,14 +161,14 @@
register: put_schema
- name: Verify put_schema in json_string
- assert:
+ ansible.builtin.assert:
that:
- put_schema is changed
- put_schema.jsondata.displayName == 'ansible_test_2'
# PATCH schema
- name: Patch schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: patch
@@ -184,12 +184,12 @@
register: patch_schema
- name: Verify patch_schema in json_string
- assert:
+ ansible.builtin.assert:
that:
- patch_schema is changed
- name: Verify patch_schema in json_string
- assert:
+ ansible.builtin.assert:
that:
- patch_schema.jsondata.templates[0].anps[0].displayName == 'AP2'
# MSO 3.3 PATCH does not return anything anymore.
@@ -197,28 +197,28 @@
# DELETE the schema
- name: Delete the schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: delete
register: delete_schema
- name: Verify delete_schema in json_string
- assert:
+ ansible.builtin.assert:
that:
- delete_schema is changed
- delete_schema.jsondata == None
# DELETE TENANT
- name: Delete the tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/tenants/{{ add_tenant.jsondata.id }}"
method: delete
register: delete_tenant
- name: Verify delete_tenant in json_string
- assert:
+ ansible.builtin.assert:
that:
- delete_tenant is changed
- delete_tenant.jsondata == None \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_template.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_template.yml
index 622b3d21d..ab04225ea 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_template.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/json_template.yml
@@ -5,14 +5,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -32,14 +32,14 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove tenant ansible_test
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
state: absent
# QUERY A USER
- name: Query our user
- mso_user:
+ cisco.mso.mso_user:
<<: *mso_info
state: query
user: '{{ mso_username }}'
@@ -47,13 +47,13 @@
register: query_user_id
- name: Verify query_user_id
- assert:
+ ansible.builtin.assert:
that:
- query_user_id is not changed
- query_user_id.current.username == '{{ mso_username }}'
- name: Add a tenant from a templated payload file from templates
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /api/v1/tenants
method: post
@@ -61,7 +61,7 @@
register: add_tenant
- name: Verify add_tenant in json_string
- assert:
+ ansible.builtin.assert:
that:
- add_tenant is changed
- add_tenant.jsondata.displayName == 'ansible_test' \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/main.yml
index 22851bf72..97ef2840b 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/main.yml
@@ -5,24 +5,24 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
-- include_tasks: json_inline.yml
+- ansible.builtin.include_tasks: json_inline.yml
tags: json_inline
-- include_tasks: json_string.yml
+- ansible.builtin.include_tasks: json_string.yml
tags: json_string
-- include_tasks: json_template.yml
+- ansible.builtin.include_tasks: json_template.yml
tags: json_template
-- include_tasks: yaml_inline.yml
+- ansible.builtin.include_tasks: yaml_inline.yml
tags: yaml_inline
-- include_tasks: yaml_string.yml
+- ansible.builtin.include_tasks: yaml_string.yml
tags: yaml_string
-- include_tasks: error_handling.yml
+- ansible.builtin.include_tasks: error_handling.yml
tags: error_handling
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_inline.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_inline.yml
index 1fe44f283..f038d9c81 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_inline.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_inline.yml
@@ -5,14 +5,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,7 +23,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -38,27 +38,27 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove tenant ansible_test
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
state: absent
# QUERY SCHEMAS
- name: Query schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: get
register: query_all_schema
- name: Verify query_all_schema
- assert:
+ ansible.builtin.assert:
that:
- query_all_schema is not changed
# QUERY A USER
- name: Query our user
- mso_user:
+ cisco.mso.mso_user:
<<: *mso_info
state: query
user: '{{ mso_username }}'
@@ -66,14 +66,14 @@
register: query_user_id
- name: Verify query_user_id
- assert:
+ ansible.builtin.assert:
that:
- query_user_id is not changed
- query_user_id.current.username == '{{ mso_username }}'
# ADD tenant
- name: Add tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/tenants
method: post
@@ -88,14 +88,14 @@
register: add_tenant
- name: Verify add_tenant in yaml_inline
- assert:
+ ansible.builtin.assert:
that:
- add_tenant is changed
- add_tenant.jsondata.displayName == 'ansible_test'
# ADD schema
- name: Add schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: post
@@ -120,14 +120,14 @@
register: add_schema
- name: Verify add_schema in yaml_inline
- assert:
+ ansible.builtin.assert:
that:
- add_schema is changed
- add_schema.jsondata.displayName == 'ansible_test'
# PUT schema
- name: Put schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: put
@@ -152,14 +152,14 @@
register: put_schema
- name: Verify put_schema in yaml_inline
- assert:
+ ansible.builtin.assert:
that:
- put_schema is changed
- put_schema.jsondata.displayName == 'ansible_test_2'
# PATCH schema
- name: Patch schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: patch
@@ -174,12 +174,12 @@
register: patch_schema
- name: Verify patch_schema in yaml_inline
- assert:
+ ansible.builtin.assert:
that:
- patch_schema is changed
- name: Verify patch_schema in yaml_inline
- assert:
+ ansible.builtin.assert:
that:
- patch_schema.jsondata.templates[0].anps[0].displayName == 'AP2'
# MSO 3.3 PATCH does not return anything anymore.
@@ -187,28 +187,28 @@
# DELETE the schema
- name: Delete the schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: delete
register: delete_schema
- name: Verify delete_schema in yaml_inline
- assert:
+ ansible.builtin.assert:
that:
- delete_schema is changed
- delete_schema.jsondata == None
# DELETE TENANT
- name: Delete the tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/tenants/{{ add_tenant.jsondata.id }}"
method: delete
register: delete_tenant
- name: Verify delete_tenant in yaml_inline
- assert:
+ ansible.builtin.assert:
that:
- delete_tenant is changed
- delete_tenant.jsondata == None \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_string.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_string.yml
index 5d9cfb05e..1824d2210 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_string.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_rest/tasks/yaml_string.yml
@@ -5,14 +5,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,7 +23,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -38,27 +38,27 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove tenant ansible_test
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
state: absent
# QUERY SCHEMAS
- name: Query schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: get
register: query_all_schema
- name: Verify query_all_schema
- assert:
+ ansible.builtin.assert:
that:
- query_all_schema is not changed
# QUERY A USER
- name: Query our user
- mso_user:
+ cisco.mso.mso_user:
<<: *mso_info
state: query
user: '{{ mso_username }}'
@@ -66,14 +66,14 @@
register: query_user_id
- name: Verify query_user_id
- assert:
+ ansible.builtin.assert:
that:
- query_user_id is not changed
- query_user_id.current.username == '{{ mso_username }}'
# ADD tenant
- name: Add tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/tenants
method: post
@@ -88,14 +88,14 @@
register: add_tenant
- name: Verify add_tenant in yaml_string
- assert:
+ ansible.builtin.assert:
that:
- add_tenant is changed
- add_tenant.jsondata.displayName == 'ansible_test'
# ADD schema
- name: Add schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: /mso/api/v1/schemas
method: post
@@ -120,14 +120,14 @@
register: add_schema
- name: Verify add_schema in yaml_string
- assert:
+ ansible.builtin.assert:
that:
- add_schema is changed
- add_schema.jsondata.displayName == 'ansible_test'
# PUT schema
- name: Put schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: put
@@ -152,14 +152,14 @@
register: put_schema
- name: Verify put_schema in yaml_string
- assert:
+ ansible.builtin.assert:
that:
- put_schema is changed
- put_schema.jsondata.displayName == 'ansible_test_2'
# PATCH schema
- name: Patch schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: patch
@@ -174,12 +174,12 @@
register: patch_schema
- name: Verify patch_schema in yaml_string
- assert:
+ ansible.builtin.assert:
that:
- patch_schema is changed
- name: Verify patch_schema in yaml_string
- assert:
+ ansible.builtin.assert:
that:
- patch_schema.jsondata.templates[0].anps[0].displayName == 'AP2'
# MSO 3.3 PATCH does not return anything anymore.
@@ -187,28 +187,28 @@
# DELETE the schema
- name: Delete the schema
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/schemas/{{ add_schema.jsondata.id }}"
method: delete
register: delete_schema
- name: Verify delete_schema in yaml_string
- assert:
+ ansible.builtin.assert:
that:
- delete_schema is changed
- delete_schema.jsondata == None
# DELETE TENANT
- name: Delete the tenant
- mso_rest:
+ cisco.mso.mso_rest:
<<: *mso_info
path: "/mso/api/v1/tenants/{{ add_tenant.jsondata.id }}"
method: delete
register: delete_tenant
- name: Verify delete_tenant in yaml_string
- assert:
+ ansible.builtin.assert:
that:
- delete_tenant is changed
- delete_tenant.jsondata == None \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/main.yml
index a27a0e166..e081f3fcf 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,23 +22,23 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Set version vars
- set_fact:
- mso_rw: true
+ ansible.builtin.set_fact:
+ cisco.mso.mso_rw: true
when:
- version.current.version is version('2.2.4', '<')
- name: Import tasks if RW of role in this MSO version
- import_tasks: role-rw.yml
+ ansible.builtin.import_tasks: role-rw.yml
when: mso_rw is defined
- name: Import tasks if RO of role in this MSO version
- import_tasks: role-ro.yml
+ ansible.builtin.import_tasks: role-ro.yml
when:
- mso_rw is not defined
- version.current.version is version('3.2', '<') \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-ro.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-ro.yml
index 730202a9d..00cd5a955 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-ro.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-ro.yml
@@ -7,7 +7,7 @@
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -20,18 +20,18 @@
# QUERY ALL ROLES
- name: Query all roles (check_mode)
- mso_role: &role_query
+ cisco.mso.mso_role: &role_query
<<: *mso_info
state: query
check_mode: true
register: cm_query_all_roles
- name: Query all roles (normal mode)
- mso_role: *role_query
+ cisco.mso.mso_role: *role_query
register: nm_query_all_roles
- name: Verify query_all_roles
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_roles is not changed
- nm_query_all_roles is not changed
@@ -41,20 +41,20 @@
# QUERY A ROLE
- name: Query our role
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: powerUser
check_mode: true
register: cm_query_role
- name: Query our role
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: powerUser
register: nm_query_role
- name: Verify query_role
- assert:
+ ansible.builtin.assert:
that:
- cm_query_role is not changed
- cm_query_role.current.description == 'Elevates this user to \"admin\"'
@@ -67,21 +67,21 @@
# QUERY NON-EXISTING ROLE
- name: Query non-existing role (check_mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: non-existing-role
check_mode: true
register: cm_query_non_role
- name: Query non-existing role (normal mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: non-existing-role
register: nm_query_non_role
# TODO: Implement more tests
- name: Verify query_non_role
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_role is not changed
- nm_query_non_role is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-rw.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-rw.yml
index 82db67640..398a9579c 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-rw.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_role/tasks/role-rw.yml
@@ -7,7 +7,7 @@
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -18,13 +18,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Remove role ansible_test
- mso_role: &role_absent
+ cisco.mso.mso_role: &role_absent
<<: *mso_info
role: ansible_test
state: absent
- name: Remove role ansible_test2
- mso_role:
+ cisco.mso.mso_role:
<<: *role_absent
role: ansible_test2
register: cm_remove_role
@@ -32,7 +32,7 @@
# ADD ROLE
- name: Add role (check_mode)
- mso_role: &role_present
+ cisco.mso.mso_role: &role_present
<<: *mso_info
role: ansible_test
description: Ansible test role
@@ -43,7 +43,7 @@
register: cm_add_role
- name: Verify cm_add_role
- assert:
+ ansible.builtin.assert:
that:
- cm_add_role is changed
- cm_add_role.previous == {}
@@ -52,11 +52,11 @@
- cm_add_role.current.id is not defined
- name: Add role (normal mode)
- mso_role: *role_present
+ cisco.mso.mso_role: *role_present
register: nm_add_role
- name: Verify nm_add_role
- assert:
+ ansible.builtin.assert:
that:
- nm_add_role is changed
- nm_add_role.previous == {}
@@ -65,12 +65,12 @@
- nm_add_role.current.id is defined
- name: Add role again (check_mode)
- mso_role: *role_present
+ cisco.mso.mso_role: *role_present
check_mode: true
register: cm_add_role_again
- name: Verify cm_add_role_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_role_again is not changed
- cm_add_role_again.previous.description == 'Ansible test role'
@@ -80,11 +80,11 @@
- cm_add_role_again.current.id == nm_add_role.current.id
- name: Add role again (normal mode)
- mso_role: *role_present
+ cisco.mso.mso_role: *role_present
register: nm_add_role_again
- name: Verify nm_add_role_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_role_again is not changed
- nm_add_role_again.previous.description == 'Ansible test role'
@@ -96,7 +96,7 @@
# CHANGE ROLE
- name: Change role (check_mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_present
role: ansible_test
description: Ansible test role 2
@@ -104,7 +104,7 @@
register: cm_change_role
- name: Verify cm_change_role
- assert:
+ ansible.builtin.assert:
that:
- cm_change_role is changed
- cm_change_role.current.description == 'Ansible test role 2'
@@ -112,7 +112,7 @@
- cm_change_role.current.id == nm_add_role.current.id
- name: Change role (normal mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_present
role: ansible_test
description: Ansible test role 2
@@ -120,7 +120,7 @@
register: nm_change_role
- name: Verify nm_change_role
- assert:
+ ansible.builtin.assert:
that:
- nm_change_role is changed
- nm_change_role.current.description == 'Ansible test role 2'
@@ -128,7 +128,7 @@
- nm_change_role.current.id == nm_add_role.current.id
- name: Change role again (check_mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_present
role: ansible_test
description: Ansible test role 2
@@ -136,7 +136,7 @@
register: cm_change_role_again
- name: Verify cm_change_role_again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_role_again is not changed
- cm_change_role_again.current.description == 'Ansible test role 2'
@@ -144,14 +144,14 @@
- cm_change_role_again.current.id == nm_add_role.current.id
- name: Change role again (normal mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_present
role: ansible_test
description: Ansible test role 2
register: nm_change_role_again
- name: Verify nm_change_role_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_role_again is not changed
- nm_change_role_again.current.description == 'Ansible test role 2'
@@ -161,18 +161,18 @@
# QUERY ALL ROLES
- name: Query all roles (check_mode)
- mso_role: &role_query
+ cisco.mso.mso_role: &role_query
<<: *mso_info
state: query
check_mode: true
register: cm_query_all_roles
- name: Query all roles (normal mode)
- mso_role: *role_query
+ cisco.mso.mso_role: *role_query
register: nm_query_all_roles
- name: Verify query_all_roles
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_roles is not changed
- nm_query_all_roles is not changed
@@ -182,20 +182,20 @@
# QUERY A ROLE
- name: Query our role
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: ansible_test
check_mode: true
register: cm_query_role
- name: Query our role
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: ansible_test
register: nm_query_role
- name: Verify query_role
- assert:
+ ansible.builtin.assert:
that:
- cm_query_role is not changed
- cm_query_role.current.description == 'Ansible test role 2'
@@ -210,43 +210,43 @@
# REMOVE ROLE
- name: Remove role (check_mode)
- mso_role: *role_absent
+ cisco.mso.mso_role: *role_absent
check_mode: true
register: cm_remove_role
- name: Verify cm_remove_role
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_role is changed
- cm_remove_role.current == {}
- name: Remove role (normal mode)
- mso_role: *role_absent
+ cisco.mso.mso_role: *role_absent
register: nm_remove_role
- name: Verify nm_remove_role
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_role is changed
- nm_remove_role.current == {}
- name: Remove role again (check_mode)
- mso_role: *role_absent
+ cisco.mso.mso_role: *role_absent
check_mode: true
register: cm_remove_role_again
- name: Verify cm_remove_role_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_role_again is not changed
- cm_remove_role_again.current == {}
- name: Remove role again (normal mode)
- mso_role: *role_absent
+ cisco.mso.mso_role: *role_absent
register: nm_remove_role_again
- name: Verify nm_remove_role_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_role_again is not changed
- nm_remove_role_again.current == {}
@@ -254,21 +254,21 @@
# QUERY NON-EXISTING ROLE
- name: Query non-existing role (check_mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: non-existing-role
check_mode: true
register: cm_query_non_role
- name: Query non-existing role (normal mode)
- mso_role:
+ cisco.mso.mso_role:
<<: *role_query
role: non-existing-role
register: nm_query_non_role
# TODO: Implement more tests
- name: Verify query_non_role
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_role is not changed
- nm_query_non_role is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema/tasks/main.yml
index 84613d63a..d7c586b61 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema/tasks/main.yml
@@ -1,16 +1,17 @@
# Test code for the MSO modules
# Copyright: (c) 2020, Cindy Zhao (@cizhao) <cizhao@cisco.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -20,6 +21,12 @@
use_proxy: '{{ mso_use_proxy | default(true) }}'
output_level: '{{ mso_output_level | default("info") }}'
+- name: Query MSO version
+ cisco.mso.mso_version:
+ <<: *mso_info
+ state: query
+ register: version
+
- name: Remove schemas
cisco.mso.mso_schema:
<<: *mso_info
@@ -71,7 +78,7 @@
register: query_one
- name: Verify query_all and query_one
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_one is not changed
@@ -94,7 +101,7 @@
register: nm_rm_schema
- name: Verify rm_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_rm_schema is changed
- cm_rm_schema.previous.displayName == "ansible_test"
@@ -111,7 +118,135 @@
register: query_non_existing
- name: Verify query_non_existing
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing is not changed
- query_non_existing.current == {}
+
+# TEST BLOCK FOR MSO VERSION >= 4.1 WHICH ALLOW FOR SCHEMA WITHOUT TEMPLATES
+- name: Execute tasks only for MSO version >= 4.1
+ when: version.current.version is version('4.1', '>=')
+ block:
+
+ - name: Ensure schema without templatess are not present
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ item }}'
+ state: absent
+ loop:
+ - "ansible_test"
+ - "ansible_test_2"
+
+ - name: Create a schema without templates (check_mode)
+ cisco.mso.mso_schema: &ansible_test
+ <<: *mso_info
+ schema: ansible_test
+ description: ansible_test_descr
+ state: present
+ check_mode: true
+ register: cm_create_ansible_test
+
+ - name: Create a schema without templates
+ cisco.mso.mso_schema:
+ <<: *ansible_test
+ register: nm_create_ansible_test
+
+ - name: Create a schema without templates again
+ cisco.mso.mso_schema:
+ <<: *ansible_test
+ register: nm_create_ansible_test_again
+
+ - name: Verify schema without templates creation
+ ansible.builtin.assert:
+ that:
+ - cm_create_ansible_test is changed
+ - cm_create_ansible_test.current.displayName == 'ansible_test'
+ - cm_create_ansible_test.current.description == 'ansible_test_descr'
+ - cm_create_ansible_test.proposed.displayName == 'ansible_test'
+ - cm_create_ansible_test.proposed.description == 'ansible_test_descr'
+ - cm_create_ansible_test.previous == {}
+ - nm_create_ansible_test is changed
+ - nm_create_ansible_test.current.displayName == 'ansible_test'
+ - nm_create_ansible_test.current.description == 'ansible_test_descr'
+ - nm_create_ansible_test.proposed.displayName == 'ansible_test'
+ - nm_create_ansible_test.proposed.description == 'ansible_test_descr'
+ # Commented due to description bug in schema where description is set on id specific but not schemas endpoint
+ # - nm_create_ansible_test_again is not changed
+ - nm_create_ansible_test_again.current.displayName == 'ansible_test'
+ - nm_create_ansible_test_again.current.description == 'ansible_test_descr'
+ - nm_create_ansible_test_again.previous.displayName == 'ansible_test'
+ # - nm_create_ansible_test_again.previous.description == 'ansible_test_descr'
+
+ - name: Change a schema without templates display name (check_mode)
+ cisco.mso.mso_schema: &ansible_test_2
+ <<: *mso_info
+ schema: ansible_test_2
+ id: "{{ nm_create_ansible_test_again.current.id }}"
+ description: ansible_test_descr_changed
+ state: present
+ check_mode: true
+ register: cm_change_ansible_test
+
+ - name: Change a schema without templates display name
+ cisco.mso.mso_schema:
+ <<: *ansible_test_2
+ register: nm_change_ansible_test
+
+ - name: Change a schema without templates display name again
+ cisco.mso.mso_schema:
+ <<: *ansible_test_2
+ register: nm_change_ansible_test_again
+
+ - name: Verify schema without templates change
+ ansible.builtin.assert:
+ that:
+ - cm_change_ansible_test is changed
+ - cm_change_ansible_test.current.displayName == 'ansible_test_2'
+ - cm_change_ansible_test.current.description == 'ansible_test_descr_changed'
+ - cm_change_ansible_test.proposed.displayName == 'ansible_test_2'
+ - cm_change_ansible_test.proposed.description == 'ansible_test_descr_changed'
+ - cm_change_ansible_test.previous.displayName == 'ansible_test'
+ # - cm_change_ansible_test.previous.description == 'ansible_test_descr'
+ - nm_change_ansible_test is changed
+ - nm_change_ansible_test.current.displayName == 'ansible_test_2'
+ - nm_change_ansible_test.current.description == 'ansible_test_descr_changed'
+ - nm_change_ansible_test.previous.displayName == 'ansible_test'
+ # - nm_change_ansible_test.previous.description == 'ansible_test_descr'
+ - nm_change_ansible_test_again is not changed
+ - nm_change_ansible_test_again.current.displayName == 'ansible_test_2'
+ - nm_change_ansible_test_again.current.description == 'ansible_test_descr_changed'
+ - nm_change_ansible_test_again.previous.displayName == 'ansible_test_2'
+ # - nm_change_ansible_test_again.previous.description == 'ansible_test_descr_changed'
+
+ - name: Remove a schema without templates (check_mode)
+ cisco.mso.mso_schema: &ansible_test_remove
+ <<: *mso_info
+ schema: ansible_test_2
+ state: absent
+ check_mode: true
+ register: cm_remove_ansible_test
+
+ - name: Remove a schema without templates
+ cisco.mso.mso_schema:
+ <<: *ansible_test_remove
+ register: nm_remove_ansible_test
+
+ - name: Remove a schema without templates again
+ cisco.mso.mso_schema:
+ <<: *ansible_test_remove
+ register: nm_remove_ansible_test_again
+
+ - name: Verify schema without templates removal
+ ansible.builtin.assert:
+ that:
+ - cm_remove_ansible_test is changed
+ - cm_remove_ansible_test.current == {}
+ - cm_remove_ansible_test.previous.displayName == 'ansible_test_2'
+ # - cm_remove_ansible_test.previous.description == 'ansible_test_descr_changed'
+ - nm_remove_ansible_test is changed
+ - nm_remove_ansible_test.current == {}
+ - nm_remove_ansible_test.previous.displayName == 'ansible_test_2'
+ # - nm_remove_ansible_test.previous.description == 'ansible_test_descr_changed'
+ - nm_remove_ansible_test_again is not changed
+ - nm_remove_ansible_test_again.current == {}
+ - nm_remove_ansible_test_again.previous == {}
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_clone/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_clone/tasks/main.yml
index e26bf45d5..fd6a35e14 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_clone/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_clone/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -31,7 +31,7 @@
- Source_Schema
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -42,7 +42,7 @@
state: present
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -64,7 +64,7 @@
- { template: Template 3}
- name: Ensure VRF exist
- mso_schema_template_vrf: &vrf_present
+ cisco.mso.mso_schema_template_vrf: &vrf_present
<<: *mso_info
schema: Source_Schema
template: Template1
@@ -72,7 +72,7 @@
state: present
- name: Add bd in Source schema
- mso_schema_template_bd: &bd_present
+ cisco.mso.mso_schema_template_bd: &bd_present
<<: *mso_info
schema: Source_Schema
template: Template1
@@ -90,7 +90,7 @@
register: add_schema
- name: Verify add_schema
- assert:
+ ansible.builtin.assert:
that:
- add_schema is changed
- add_schema.previous == {}
@@ -106,7 +106,7 @@
register: add_same_schema
- name: Verify add_same_schema
- assert:
+ ansible.builtin.assert:
that:
- add_same_schema is not changed
- add_same_schema.current == {}
@@ -122,7 +122,7 @@
register: add_existing_schema
- name: Verify add_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- add_existing_schema is not changed
- add_existing_schema.msg == "Schema with the name 'Destination_Schema' already exists. Please use another name."
@@ -137,7 +137,7 @@
register: add_existing_schema
- name: Verify add_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- add_existing_schema is not changed
- add_existing_schema.msg == "Provided schema 'Source_Schema_1' does not exist."
@@ -153,6 +153,6 @@
- Source_Schema
- name: Verify rm_schema
- assert:
+ ansible.builtin.assert:
that:
- rm_schema is changed \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site/tasks/main.yml
index 6eede75ae..5e356a0fd 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,7 +21,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -33,7 +33,7 @@
ignore_errors: true
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -42,7 +42,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -53,7 +53,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -63,7 +63,7 @@
state: present
- name: Ensure schema 1 with Template 1 and Template 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -74,7 +74,7 @@
- { template: Template 2}
- name: Add a new site to a schema with Template 1 in check mode
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -84,13 +84,13 @@
register: add_site_cm
- name: Verify add_site_cm
- assert:
+ ansible.builtin.assert:
that:
- add_site_cm.current.siteId is match ("[0-9a-zA-Z]*")
- add_site_cm.current.templateName == "Template1"
- name: Add a new site to a schema with Template 1 in normal mode
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -99,13 +99,13 @@
register: add_site_nm
- name: Verify add_site_nm
- assert:
+ ansible.builtin.assert:
that:
- add_site_nm.current.siteId is match ("[0-9a-zA-Z]*")
- add_site_nm.current.templateName == "Template1"
- name: Add a new site to a schema in normal mode again
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -114,13 +114,13 @@
register: add_site_nm_again
- name: Verify add_site_nm_again
- assert:
+ ansible.builtin.assert:
that:
- add_site_nm_again is not changed
- add_site_nm_again.current.siteId is match ("[0-9a-zA-Z]*")
- name: Add a new site to a schema with Template 2 in normal mode
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -130,7 +130,7 @@
register: add_site_temp2_nm
- name: Verify add_site_temp2_nm
- assert:
+ ansible.builtin.assert:
that:
- add_site_temp2_nm.current.siteId is match ("[0-9a-zA-Z]*")
- add_site_temp2_nm.current.templateName == "Template2"
@@ -144,7 +144,7 @@
- add_site_temp2_nm.sent.templateName == "Template2"
- name: Query a schema site
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -153,21 +153,21 @@
register: query_site
- name: Query all schema sites
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
register: query_all_sites
- name: Verify query_site and query_all_sites
- assert:
+ ansible.builtin.assert:
that:
- query_site is not changed
- query_all_sites is not changed
- query_all_sites.current | length == 2
- name: Remove a site from a schema with Template1
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -176,7 +176,7 @@
register: rm_site_temp1
- name: Remove a site from a schema with Template2
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -185,7 +185,7 @@
register: rm_site_temp2
- name: Verify rm_site_temp1 and rm_site_temp2
- assert:
+ ansible.builtin.assert:
that:
- rm_site_temp1 is changed
- rm_site_temp1.current == {}
@@ -193,7 +193,7 @@
- rm_site_temp2.current == {}
- name: Remove a site from a schema with Template2 again
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -202,13 +202,13 @@
register: rm_site_again
- name: Verify rm_site_again
- assert:
+ ansible.builtin.assert:
that:
- rm_site_again is not changed
# USE NON-EXISTING STATE
- name: non_existing_state state
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -218,14 +218,14 @@
register: non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- non_existing_state is not changed
- non_existing_state.msg == "value of state must be one of{{':'}} absent, present, query, got{{':'}} non_existing_state"
# USE A NON_EXISTING_SCHEMA
- name: non_existing_schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -235,14 +235,14 @@
register: non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- non_existing_schema is not changed
- non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
# USE A NON_EXISTING_TEMPLATE
- name: non_existing_template
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -252,13 +252,13 @@
register: non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- non_existing_template is not changed
- non_existing_template.msg == "Template 'non_existing_template' not found"
- name: Template attribute absent in task
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -267,7 +267,7 @@
register: absent_template
- name: Verify absent_template
- assert:
+ ansible.builtin.assert:
that:
- absent_template is not changed
- absent_template.current == [] \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp/tasks/main.yml
index 9faffb376..03909d8cf 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp/tasks/main.yml
@@ -3,13 +3,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -20,13 +20,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -35,7 +35,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure physical site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -46,7 +46,7 @@
state: present
- name: Ensure aws site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -57,7 +57,7 @@
state: present
- name: Ensure azure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -68,7 +68,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -79,7 +79,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -87,14 +87,14 @@
state: present
- name: Associate non-cloud site with ansible_test again in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
state: present
- name: Associate aws site with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -106,7 +106,7 @@
register: aaws_nm
- name: Associate azure site with access_type not present, with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -115,7 +115,7 @@
register: aazure_shared_nm
- name: Ensure schema 1 with Template 1, and Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -127,7 +127,7 @@
- { template: Template 3}
- name: Ensure schema 2 with Template 4 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -135,7 +135,7 @@
state: present
- name: Add cloud site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{item.site}}'
@@ -146,7 +146,7 @@
- { site: 'aws_{{ mso_site | default("ansible_test") }}', template: 'Template 2' }
- name: Add physical site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -154,7 +154,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 3
@@ -162,7 +162,7 @@
state: present
- name: Add BD1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 3
@@ -172,7 +172,7 @@
state: present
- name: Ensure ANPs exist at template level
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{item.schema}}'
template: '{{ item.template }}'
@@ -187,7 +187,7 @@
- { schema: '{{ mso_schema | default("ansible_test") }}_2', template: 'Template 4', anp: 'ANP_4' }
- name: Ensure EPGs exist at template level
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 3
@@ -204,7 +204,7 @@
state: present
- name: Add ANP to site azure (check_mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -215,7 +215,7 @@
register: cm_add_anp
- name: Add ANP to site azure (normal mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -225,20 +225,20 @@
register: nm_add_anp
- name: Verify add_anp values
- assert:
+ ansible.builtin.assert:
that:
- cm_add_anp.current.anpRef.anpName == 'ANP'
- nm_add_anp.current.anpRef.anpName == 'ANP'
- name: Verify add_anp change
- assert:
+ ansible.builtin.assert:
that:
- cm_add_anp is changed
- nm_add_anp is changed
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Add ANP to site aws
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -248,18 +248,18 @@
register: add_anp
- name: Verify add_anp value
- assert:
+ ansible.builtin.assert:
that:
- add_anp.current.anpRef.anpName == 'ANP_2'
- name: Verify add_anp change
- assert:
+ ansible.builtin.assert:
that:
- add_anp is changed
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Add ANPs to site
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
site: '{{ item.site }}'
schema: '{{ item.schema }}'
@@ -272,7 +272,7 @@
- { site: '{{ mso_site | default("ansible_test") }}', schema: '{{ mso_schema | default("ansible_test") }}', template: 'Template 3', anp: 'ANP_3_2' }
- name: Add a new site EPG for idempotency check
- mso_schema_site_anp_epg: &idempotency_vmm
+ cisco.mso.mso_schema_site_anp_epg: &idempotency_vmm
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: 'Template 3'
@@ -284,7 +284,7 @@
# Test due to inconsistency in attributes REQUEST/RESPONSE API
# MSO Error 400: Bad Request: (0)(0)(0)(0)/deploymentImmediacy error.path.missing
- name: Add new site domain to site EPG for idempotency check
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *idempotency_vmm
domain_association_type: vmmDomain
domain_profile: 'VMware-VMM'
@@ -293,7 +293,7 @@
state: present
- name: Add ANPs to site again
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -303,14 +303,14 @@
register: add_anp_again
- name: Verify add_anp_again
- assert:
+ ansible.builtin.assert:
that:
- add_anp_again is not changed
- add_anp_again.current.anpRef.anpName == 'ANP_3'
# QUERY ANPs
- name: Query specific ANP (normal mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -320,12 +320,12 @@
register: query_anp
- name: Verify query_anp
- assert:
+ ansible.builtin.assert:
that:
- query_anp is not changed
- name: Query all ANPs (normal mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -334,14 +334,14 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all | length >= 3
# DELETE the ANP
- name: Delete ANP3 (normal mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -351,13 +351,13 @@
register: delete_anp
- name: Verify delete_anp
- assert:
+ ansible.builtin.assert:
that:
- delete_anp is changed
- delete_anp.current == {}
- name: Delete ANP1 again
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -367,14 +367,14 @@
register: delete_anp_again
- name: Verify delete_anp_again
- assert:
+ ansible.builtin.assert:
that:
- delete_anp_again is not changed
- delete_anp_again.current == {}
# QUERY NON-EXISTING ANP
- name: Query non-existing ANP (normal mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -385,14 +385,14 @@
register: nm_query_non_anp
- name: Verify query_non_anp
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_anp is not changed
- nm_query_non_anp.msg == "ANP 'non_existing_anp' not found"
# USE A NON-EXISTING STATE
- name: Non-existing state (normal_mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -403,14 +403,14 @@
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_state is not changed
- nm_non_existing_state.msg == "value of state must be one of{{':'}} absent, present, query, got{{':'}} non-existing-state"
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema (normal_mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: non-existing-schema
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -421,14 +421,14 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_schema is not changed
- nm_non_existing_schema.msg == "Provided schema 'non-existing-schema' does not exist."
# USE A NON-EXISTING SITE
- name: Non-existing site (normal_mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non-existing-site
@@ -439,14 +439,14 @@
register: nm_non_existing_site
- name: Verify non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_site is not changed
- nm_non_existing_site.msg == "Site 'non-existing-site' is not a valid site name."
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add ANP to Template without any site associated (normal mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -457,14 +457,14 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- nm_no_site_associated is not changed
- nm_no_site_associated.msg == "No site associated with template 'Template4'. Associate the site with the template using mso_schema_site."
# USE A NON-EXISTING SITE-TEMPLATE
- name: Non-existing site-template (normal_mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -475,7 +475,7 @@
register: nm_non_existing_site_template
- name: Verify non_existing_site_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_site_template is not changed
- nm_non_existing_site_template.msg is match("Provided site/siteId/template 'ansible_test/[0-9a-zA-Z]*/Template2' does not exist. Existing siteIds/templates{{':'}} [0-9a-zA-Z]*/Template1, [0-9a-zA-Z]*/Template2, [0-9a-zA-Z]*/Template3") \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg/tasks/main.yml
index 8373a629f..28e836a55 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg/tasks/main.yml
@@ -3,13 +3,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -20,13 +20,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -35,7 +35,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -47,7 +47,7 @@
ignore_errors: true
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -55,7 +55,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -66,14 +66,14 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Associate non-cloud site with ansible_test again in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
state: present
- name: Associate aws site with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -85,7 +85,7 @@
register: aaws_nm
- name: Associate azure site with access_type not present, with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -94,7 +94,7 @@
register: aazure_shared_nm
- name: Ensure schema 1 with Template 1, and Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -106,7 +106,7 @@
- { template: Template 3}
- name: Ensure schema 2 with Template 4 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -114,7 +114,7 @@
state: present
- name: Add cloud site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{item.site}}'
@@ -126,7 +126,7 @@
when: version.current.version is version('3', '<') or version.current.version is version('3.2', '>=')
- name: Add physical site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -137,7 +137,7 @@
- { template: 'Template 1' }
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: '{{ item.template }}'
@@ -148,7 +148,7 @@
- { template: 'Template 3' }
- name: Add BD1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: '{{ item.template }}'
@@ -161,7 +161,7 @@
- { template: 'Template 3' }
- name: Ensure ANPs exist at template level
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{item.schema}}'
template: '{{ item.template }}'
@@ -173,7 +173,7 @@
- { schema: '{{ mso_schema | default("ansible_test") }}_2', template: 'Template 4', anp: 'ANP_4' }
- name: Ensure ANP exist at template level
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 3
@@ -181,7 +181,7 @@
state: present
- name: Ensure EPGs exist at template level
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -202,7 +202,7 @@
- { schema: '{{ mso_schema | default("ansible_test") }}_2', template: 'Template 4', anp: 'ANP_4', epg: 'ansible_test_4' }
- name: Ensure EPGs exist at template level
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 3
@@ -219,7 +219,7 @@
state: present
- name: Add ANP to site
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -229,7 +229,7 @@
# ADD ANP EPGs to SITE
- name: Add new EPG to site after adding ANP to site (check_mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -241,7 +241,7 @@
register: cm_add_epg
- name: Add new EPG to site after adding ANP to site (normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -252,7 +252,7 @@
register: nm_add_epg
- name: Verify add_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg is changed
- nm_add_epg is changed
@@ -263,7 +263,7 @@
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Add new EPG to site after adding ANP to site again
- mso_schema_site_anp_epg: &idempotency_vmm
+ cisco.mso.mso_schema_site_anp_epg: &idempotency_vmm
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -274,7 +274,7 @@
register: add_epg_again
- name: Verify add_epg_again
- assert:
+ ansible.builtin.assert:
that:
- add_epg_again is not changed
- add_epg_again.current.epgRef.anpName == 'ANP_3'
@@ -283,7 +283,7 @@
# Test due to inconsistency in attributes REQUEST/RESPONSE API
# MSO Error 400: Bad Request: (0)(0)(0)(0)/deploymentImmediacy error.path.missing
- name: Add new site domain to site EPG for idempotency check
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *idempotency_vmm
domain_association_type: vmmDomain
domain_profile: 'VMware-VMM'
@@ -292,19 +292,19 @@
state: present
- name: Add new EPG to site after adding ANP to site again
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *idempotency_vmm
register: add_epg_again_with_vmm
- name: Verify add_epg_again with vmm
- assert:
+ ansible.builtin.assert:
that:
- add_epg_again is not changed
- add_epg_again.current.epgRef.anpName == 'ANP_3'
- add_epg_again.current.epgRef.epgName == 'ansible_test_3'
- name: Add new EPG to site without adding ANPs to site
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -315,7 +315,7 @@
register: add_epg_no_anp
- name: Verify add_epg_no_anp
- assert:
+ ansible.builtin.assert:
that:
- add_epg_no_anp is changed
- add_epg_no_anp.current.epgs.0.epgRef.anpName == 'ANP'
@@ -323,7 +323,7 @@
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Add new EPG to site without adding ANPs to site again (ANP already exists from previous run)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -334,7 +334,7 @@
register: add_epg_no_anp_again
- name: Verify add_epg_no_anp_again
- assert:
+ ansible.builtin.assert:
that:
- add_epg_no_anp_again is not changed
- add_epg_no_anp_again.current.epgRef.anpName == 'ANP'
@@ -342,7 +342,7 @@
# QUERY EPGs
- name: Query all EPGs with ANP (normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -352,12 +352,12 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- name: Query specific EPG1 (normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -368,13 +368,13 @@
register: query_epg
- name: Verify query_epg
- assert:
+ ansible.builtin.assert:
that:
- query_epg is not changed
# DELETE the EPG
- name: Delete EPG1 (normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -385,14 +385,14 @@
register: delete_epg
- name: Verify delete_epg
- assert:
+ ansible.builtin.assert:
that:
- delete_epg is changed
- delete_epg.current == {}
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Delete EPG1 again
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -403,14 +403,14 @@
register: delete_epg_again
- name: Verify delete_epg_again
- assert:
+ ansible.builtin.assert:
that:
- delete_epg_again is not changed
- delete_epg_again.current == {}
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG in template (normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -422,14 +422,14 @@
register: nm_query_non_epg
- name: Verify query_non_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_epg is not changed
- nm_query_non_epg.msg == "Provided EPG 'non_existing_epg' does not exist. Existing EPGs{{':'}} ansible_test_3"
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG in site level
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -441,14 +441,14 @@
register: query_non_epg
- name: Verify query_non_epg
- assert:
+ ansible.builtin.assert:
that:
- query_non_epg is not changed
- query_non_epg.msg == "EPG 'ansible_test_1' not found"
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Delete anp
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -458,7 +458,7 @@
# QUERY NON-EXISTING ANP
- name: Query non-existing ANP in template(normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -470,14 +470,14 @@
register: nm_query_non_anp
- name: Verify query_non_anp
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_anp is not changed
- nm_query_non_anp.msg == "Provided anp 'non_existing_anp' does not exist. Existing anps{{':'}} ANP_3"
# QUERY NON-EXISTING ANP
- name: Query non-existing ANP at site level(normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 3
@@ -488,7 +488,7 @@
register: nm_query_non_anp
- name: Verify query_non_anp
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_anp is not changed
- nm_query_non_anp.msg == "Provided anp 'ANP_3' does not exist at site level."
@@ -496,7 +496,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state (normal_mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -508,14 +508,14 @@
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_state is not changed
- nm_non_existing_state.msg == "value of state must be one of{{':'}} absent, present, query, got{{':'}} non-existing-state"
# # USE A NON-EXISTING TEMPLATE
- name: Non-existing template (normal_mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -527,14 +527,14 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_template is not changed
- nm_non_existing_template.msg == "Provided template 'non-existing-template' does not exist. Existing templates{{':'}} Template1, Template2, Template3"
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema (normal_mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: non-existing-schema
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -546,14 +546,14 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_schema is not changed
- nm_non_existing_schema.msg == "Provided schema 'non-existing-schema' does not exist."
# USE A NON-EXISTING SITE
- name: Non-existing site (normal_mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non-existing-site
@@ -565,14 +565,14 @@
register: nm_non_existing_site
- name: Verify non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_site is not changed
- nm_non_existing_site.msg == "Site 'non-existing-site' is not a valid site name."
# USE A NON-EXISTING SITE-TEMPLATE
- name: Non-existing site-template (normal_mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -584,14 +584,14 @@
register: nm_non_existing_site_template
- name: Verify non_existing_site_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_site_template is not changed
- nm_non_existing_site_template.msg is match("Provided site/siteId/template 'ansible_test/[0-9a-zA-Z]*/Template2' does not exist. Existing siteIds/templates{{':'}} [0-9a-zA-Z]*/Template1, [0-9a-zA-Z]*/Template2, [0-9a-zA-Z]*/Template3, [0-9a-zA-Z]*/Template1")
when: version.current.version is version('3', '<') or version.current.version is version('3.2', '>=')
- name: Verify non_existing_site_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_site_template is not changed
- nm_non_existing_site_template.msg is match("Provided site/siteId/template 'ansible_test/[0-9a-zA-Z]*/Template2' does not exist. Existing siteIds/templates{{':'}} [0-9a-zA-Z]*/Template3, [0-9a-zA-Z]*/Template1")
@@ -599,7 +599,7 @@
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add EPG to Template without any site associated (normal mode)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -611,7 +611,7 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- nm_no_site_associated is not changed
- nm_no_site_associated.msg == "No site associated with template 'Template4'. Associate the site with the template using mso_schema_site."
@@ -622,7 +622,7 @@
when: version.current.version is version('3.3', '>=')
block:
- name: Remove physical site from schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -630,7 +630,7 @@
state: absent
- name: Ensure region for VRF1 at site level exists
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -641,7 +641,7 @@
state: present
- name: Ensure Private Link Label in Azure VRF subnet exist (MSO >3.3)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -654,7 +654,7 @@
zone: null
- name: Ensure another Private Link Label in Azure VRF subnet exist (MSO >3.3)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -666,7 +666,7 @@
private_link_label: 'PLL'
- name: Add new EPG service type parameters (for version greater than 3.3)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -683,7 +683,7 @@
state: present
- name: Add private link label to the EPG (for version greater than 3.3)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -694,7 +694,7 @@
state: present
- name: Change private link label in the EPG (for version greater than 3.3)
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_bulk_staticport/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_bulk_staticport/tasks/main.yml
index 0fc8943fd..2940874aa 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_bulk_staticport/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_bulk_staticport/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,7 +21,7 @@
output_level: '{{ mso_output_level | default("debug") }}'
- name: Remove Schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -30,7 +30,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -41,7 +41,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -52,7 +52,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -62,7 +62,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -73,7 +73,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -81,7 +81,7 @@
state: present
- name: Add a new site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -89,7 +89,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -97,7 +97,7 @@
state: present
- name: Add BD1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -107,7 +107,7 @@
state: present
- name: Ensure Template 1 with AP1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -115,7 +115,7 @@
state: present
- name: Ensure Template 1 and AP1 with EPG1 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -128,7 +128,7 @@
state: present
- name: Ensure Template 1 and AP1 with EPG3 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -141,7 +141,7 @@
state: present
- name: Ensure Template 1 with AP2 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -149,7 +149,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG2 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -162,7 +162,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG4 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -175,7 +175,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG6 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -189,7 +189,7 @@
# ADD STATIC PORTS
- name: Add static port 1 to site EPG1 of AP1 (check mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -216,7 +216,7 @@
register: cm_add_stat1e1
- name: Verify cm_add_stat1e1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_stat1e1 is changed
- cm_add_stat1e1.previous == []
@@ -235,7 +235,7 @@
- cm_add_stat1e1.current|length == 3
- name: Add static port 1 to site EPG1 of AP1 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport: &add_static_port_1
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport: &add_static_port_1
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -261,7 +261,7 @@
register: nm_add_stat1e1
- name: Verify nm_add_stat1e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e1 is changed
- nm_add_stat1e1.previous == []
@@ -280,7 +280,7 @@
- nm_add_stat1e1.current|length ==3
- name: Add static port 3 (vpc) to site EPG1 of AP1 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *add_static_port_1
static_ports:
- path: eth1/2
@@ -298,7 +298,7 @@
register: nm_add_stat3e1
- name: Verify nm_add_stat3e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat3e1 is changed
- nm_add_stat3e1.previous != []
@@ -310,7 +310,7 @@
- nm_add_stat3e1.current|length > nm_add_stat1e1.current|length # verifying length of current task (nm_add_stat3e1) is greater than the previous task (nm_add_stat1e1)
- name: Add static port 2 (dpc) to EPG6 of AP2 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -334,7 +334,7 @@
register: nm_add_stat2e6
- name: Verify nm_add_stat2e6
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat2e6 is changed
- nm_add_stat2e6.previous == []
@@ -346,7 +346,7 @@
- nm_add_stat2e6.current[0].type == 'dpc'
- name: Add static port 2 to site EPG2 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport: &static_port_2
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport: &static_port_2
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -368,7 +368,7 @@
register: nm_add_stat2e2
- name: Verify nm_add_stat2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat2e2 is changed
- nm_add_stat2e2.previous == []
@@ -380,19 +380,19 @@
# ADD EXISTING STATIC PORT
- name: Add static port 1 to site EPG1 again (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *static_port_2
state: present
register: nm_add_stat1e1_2
- name: Verify nm_add_stat1e1_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e1_2 is not changed
# ADD STATIC FEX PORT
- name: Add static fex port to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *static_port_2
static_ports:
- path: eth1/2
@@ -407,7 +407,7 @@
register: nm_add_statfex
- name: Verify nm_add_statfex
- assert:
+ ansible.builtin.assert:
that:
- nm_add_statfex is changed
- nm_add_statfex.previous != []
@@ -419,7 +419,7 @@
# QUERY STATIC PORTS
- name: Query STATIC PORTS of site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -430,37 +430,37 @@
register: nm_query_statse1
- name: Verify nm_query_statse1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_statse1 is not changed
#REMOVE STATIC PORT
- name: Remove all static ports from EPG2 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *static_port_2
state: absent
register: nm_remove_stat2e2
- name: Verify nm_remove_stat2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_stat2e2 is changed
- name: Remove all static ports from EPG2 again(normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *static_port_2
state: absent
ignore_errors: true
register: nm_remove_again_stat2e2
- name: Verify nm_remove_again_stat2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_again_stat2e2 is not changed
# VERIFY NON EXISTENT 'DEPLOYMENT IMMEDIACY', 'TYPE' AND 'MODE'
- name: Add static port 1 to site EPG4 with AP2 with no deployment immediacy, type and mode (normal mode)
- mso_schema_site_anp_epg_bulk_staticport: &add_static_port
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport: &add_static_port
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -478,7 +478,7 @@
register: nm_add_stat_no_di_type_mode
- name: Verify nm_add_stat_no_di_type_mode
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat_no_di_type_mode.current[0].deploymentImmediacy == 'lazy'
- nm_add_stat_no_di_type_mode.current[0].mode == 'untagged'
@@ -486,7 +486,7 @@
# VERIFY NON EXISTENT parent values.
- name: Add static port 1 to site EPG4 with AP2 with no parent values (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -502,7 +502,7 @@
register: nm_add_stat_no_parent
- name: Verify nm_add_stat_no_parent
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat_no_parent.current[0].deploymentImmediacy == 'lazy'
- nm_add_stat_no_parent.current[0].mode == 'untagged'
@@ -510,7 +510,7 @@
# VERIFY NON EXISTENT required values.
- name: Add static port 1 to site EPG4 with AP2 with missing required values (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -524,14 +524,14 @@
register: nm_add_stat_no_req
- name: Verify nm_add_stat_no_req
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat_no_req is not changed
- nm_add_stat_no_req.msg == "state is present but all of the following are missing{{':'}} pod, leaf, path, vlan."
# VERIFY path in each leaf within a pod is unique (pod->leaf->path)
- name: Add static port 1 to site EPG4 with AP2 with missing required values (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -552,14 +552,14 @@
register: nm_add_unique_path
- name: Verify nm_add_unique_path
- assert:
+ ansible.builtin.assert:
that:
- nm_add_unique_path is not changed
- nm_add_unique_path.msg == "Each leaf in a pod of a static port should have an unique path."
# USE NON-EXISTING EPG and ANP AT TEMPLATE LEVEL
- name: Add static port 1 to non-existent site EPG5 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *add_static_port
anp: AP5
epg: EPG5
@@ -568,13 +568,13 @@
register: nm_add_stat1e5
- name: Verify nm_add_stat1e5
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e5 is not changed
# USE NON-EXISTING EPG AT TEMPLATE LEVEL
- name: Add static port 1 to non-existent site EPG5 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *add_static_port
anp: AP1
epg: EPG6
@@ -583,55 +583,55 @@
register: nm_add_stat1e6
- name: Verify nm_add_stat1e6
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e6 is not changed
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for static port
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *add_static_port
schema: non_existing_schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_schema is not changed
- nm_non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for static port (normal_mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *add_static_port
template: non_existing_template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_template is not changed
- nm_non_existing_template.msg == "Provided template 'non_existing_template' not matching existing template(s){{':'}} Template1, Template2"
# USE A NON-EXISTING SITE
- name: Non-existing site for static port (normal_mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *add_static_port
site: 'non_existing_site'
ignore_errors: true
register: nm_non_existing_site
- name: Verify non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_site is not changed
- nm_non_existing_site.msg == "Site 'non_existing_site' is not a valid site name."
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site EPG static port association to Template 3 without any site associated (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *add_static_port
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -640,14 +640,14 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- nm_no_site_associated is not changed
- nm_no_site_associated.msg == "No sites associated with schema 'ansible_test_2'. Associate the site with the schema using (M) mso_schema_site."
# Add static port 3 after adding ANP and EPG to site
- name: Add a new site to a schema 2
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -655,7 +655,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -663,7 +663,7 @@
state: present
- name: Add BD1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -673,7 +673,7 @@
state: present
- name: Ensure Template 3 with AP1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -681,7 +681,7 @@
state: present
- name: Ensure Template 3 and AP1 with EPG1 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -694,7 +694,7 @@
state: present
- name: Add new ANP to site
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}_2'
@@ -704,7 +704,7 @@
register: cm_add_epg
- name: Add new EPG to site after adding ANP to site
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}_2'
@@ -715,7 +715,7 @@
register: cm_add_epg
- name: Add static port to site EPG1 in schema 2 (normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -738,7 +738,7 @@
register: nm_add_stat3
- name: Verify nm_add_stat3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat3 is changed
- nm_add_stat3.previous == []
@@ -749,7 +749,7 @@
- nm_add_stat3.current[0].type == 'port'
- name: Add static port to site EPG1 in schema 2 again without static_ports(normal mode)
- mso_schema_site_anp_epg_bulk_staticport:
+ cisco.mso.mso_schema_site_anp_epg_bulk_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -768,7 +768,7 @@
register: nm_add_no_static_port
- name: Verify nm_add_no_static_port
- assert:
+ ansible.builtin.assert:
that:
- nm_add_no_static_port is not changed
- nm_add_no_static_port.msg == "state is present but all of the following are missing{{':'}} static_ports"
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_domain/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_domain/tasks/main.yml
index 24b953a0f..969f9c449 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_domain/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_domain/tasks/main.yml
@@ -2,17 +2,18 @@
# Copyright: (c) 2020, Lionel Hercot (@lhercot) <lhercot@cisco.com>
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com> (based on mso_site test case)
# Copyright: (c) 2020, Shreyas Srish (@shrsr) <ssrish@cisco.com>
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,7 +24,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Remove Schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -32,7 +33,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -43,7 +44,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -55,7 +56,7 @@
ignore_errors: true
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -65,7 +66,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -76,7 +77,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -84,7 +85,7 @@
state: present
- name: Add a new site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -92,7 +93,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -100,7 +101,7 @@
state: present
- name: Add BD1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -110,7 +111,7 @@
state: present
- name: Ensure Template 1 with AP1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -118,7 +119,7 @@
state: present
- name: Ensure Template 1 and AP1 with EPG1 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -131,7 +132,7 @@
state: present
- name: Ensure Template 1 and AP1 with EPG3 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -144,7 +145,7 @@
state: present
- name: Ensure Template 1 with AP2 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -152,7 +153,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG2 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -165,7 +166,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG4 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -179,7 +180,7 @@
# ADD DOMAINS
- name: Add domain 1 to site EPG1 with AP1 (check mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -195,7 +196,7 @@
register: cm_add_dom1e1
- name: Verify cm_add_dom1e1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dom1e1 is changed
- cm_add_dom1e1.previous == {}
@@ -205,7 +206,7 @@
- cm_add_dom1e1.current.resolutionImmediacy == 'pre-provision'
- name: Add domain 1 to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -220,7 +221,7 @@
register: nm_add_dom1e1
- name: Verify nm_add_dom1e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom1e1 is changed
- nm_add_dom1e1.previous == {}
@@ -230,7 +231,7 @@
- nm_add_dom1e1.current.resolutionImmediacy == 'pre-provision'
- name: Add domain 2 to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -245,7 +246,7 @@
register: nm_add_dom2e1
- name: Verify nm_add_dom2e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom2e1 is changed
- nm_add_dom2e1.previous == {}
@@ -255,7 +256,7 @@
- nm_add_dom2e1.current.resolutionImmediacy == 'pre-provision'
- name: Add domain 3 to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -270,7 +271,7 @@
register: nm_add_dom3e1
- name: Verify nm_add_dom3e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom3e1 is changed
- nm_add_dom3e1.previous != {}
@@ -280,7 +281,7 @@
- nm_add_dom3e1.current.resolutionImmediacy == 'lazy'
- name: Add domain1 to site EPG3 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -295,7 +296,7 @@
register: nm_add_dom1e3
- name: Verify nm_add_dom1e2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom1e3 is changed
- nm_add_dom1e3.previous == {}
@@ -305,7 +306,7 @@
- nm_add_dom1e3.current.resolutionImmediacy == 'lazy'
- name: Add domain 2 to EPG2 (check mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -321,7 +322,7 @@
register: cm_add_dom2e2
- name: Verify cm_add_dom2e2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dom2e2 is changed
- cm_add_dom2e2.previous == {}
@@ -332,7 +333,7 @@
# QUERY DOMAINS
- name: Query domains of site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -343,13 +344,13 @@
register: nm_query_domse1
- name: Verify nm_query_domse1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_domse1 is not changed
# QUERY A DOMAIN
- name: Query domain3 of site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -364,13 +365,13 @@
register: nm_query_dom3e1
- name: Verify nm_query_dom3e1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_dom3e1 is not changed
# QUERY REMOVED DOMAIN
- name: Add domain 2 to site EPG2 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -385,7 +386,7 @@
register: nm_add_dom2e2
- name: Verify nm_add_dom2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom2e2 is changed
- nm_add_dom2e2.previous == {}
@@ -395,7 +396,7 @@
- nm_add_dom2e2.current.resolutionImmediacy == 'pre-provision'
- name: Remove domain2 from EPG2 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -410,12 +411,12 @@
register: nm_remove_dom2e2
- name: Verify nm_remove_dom2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_dom2e2 is changed
- name: Query removed domain2 from EPG2 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -431,13 +432,13 @@
register: nm_non_existent_dom2e2
- name: Verify non_existing_domain
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existent_dom2e2 is not changed
- nm_non_existent_dom2e2.msg == "Domain association 'physicalDomain/phys' not found"
- name: Remove domain2 from EPG2 again(normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -453,13 +454,13 @@
register: nm_remove_again_dom2e2
- name: Verify nm_remove_again_dom2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_again_dom2e2 is not changed
# ADD EXISTING DOMAIN
- name: Add domain 1 to site EPG1 again (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -474,13 +475,13 @@
register: nm_add_dom1e1_2
- name: Verify nm_add_dom1e1_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom1e1_2 is not changed
# ADD DOMAIN WITH NO STATE
- name: Add domain 1 to site EPG1 again with no state (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -495,13 +496,13 @@
register: nm_add_stateless_dom1e1_2
- name: Verify nm_add_stateless_dom1e1_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stateless_dom1e1_2 is not changed
# ADD OTHER DOMAIN OPTIONS
- name: Add domain l3ExtDomain to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -516,7 +517,7 @@
register: nm_add_doml3
- name: Verify nm_add_doml3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_doml3 is changed
- nm_add_doml3.previous == {}
@@ -526,7 +527,7 @@
- nm_add_doml3.current.resolutionImmediacy == 'lazy'
- name: Add domain l2ExtDomain to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -542,7 +543,7 @@
register: nm_add_doml2
- name: Verify nm_add_doml2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_doml2 is changed
- nm_add_doml2.previous == {}
@@ -552,7 +553,7 @@
- nm_add_doml2.current.resolutionImmediacy == 'lazy'
- name: Add domain fibreChannel to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -567,7 +568,7 @@
register: nm_add_domfc
- name: Verify nm_add_domfc
- assert:
+ ansible.builtin.assert:
that:
- nm_add_domfc is changed
- nm_add_domfc.previous == {}
@@ -578,7 +579,7 @@
# USE OTHER ATTRIBUTES OF VMM DOMAIN
- name: Add domain vmm to site EPG2 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain: &domain_ap1_epg2
+ cisco.mso.mso_schema_site_anp_epg_domain: &domain_ap1_epg2
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -588,7 +589,7 @@
domain_association_type: vmmDomain
domain_profile: 'VMware-VMM'
deployment_immediacy: immediate
- resolution_immediacy: lazy
+ resolution_immediacy: immediate
micro_seg_vlan_type: 'vlan'
micro_seg_vlan: 100
port_encap_vlan_type: 'vlan'
@@ -599,17 +600,26 @@
switching_mode: native
enhanced_lagpolicy_name: 'ansible_check_name'
enhanced_lagpolicy_dn: 'ansible_check'
+ delimiter: '|'
+ binding_type: static
+ num_ports: 2
+ port_allocation: elastic
+ netflow_pref: enabled
+ allow_promiscuous: accept
+ forged_transmits: accept
+ mac_changes: accept
+ custom_epg_name: ansible_custom_epg
state: present
register: nm_add_domvmprop
- name: Query domain vmms attached to site EPG2 with AP2
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *domain_ap1_epg2
state: query
register: nm_query_domvmprop
- name: Verify domain vmm to site EPG2 with AP2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_domvmprop is changed
- nm_add_domvmprop.previous == {}
@@ -623,10 +633,19 @@
- nm_add_domvmprop.current.microSegVlan.vlanType == "vlan"
- nm_add_domvmprop.current.portEncapVlan.vlan == 100
- nm_add_domvmprop.current.portEncapVlan.vlanType == "vlan"
- - nm_add_domvmprop.current.resolutionImmediacy == "lazy"
+ - nm_add_domvmprop.current.resolutionImmediacy == "immediate"
- nm_add_domvmprop.current.switchType == "default"
- nm_add_domvmprop.current.switchingMode == "native"
- nm_add_domvmprop.current.vlanEncapMode == "static"
+ - nm_add_domvmprop.current.delimiter == "|"
+ - nm_add_domvmprop.current.bindingType == "static"
+ - nm_add_domvmprop.current.numPorts == 2
+ - nm_add_domvmprop.current.portAllocation == "elastic"
+ - nm_add_domvmprop.current.netflowPref == "enabled"
+ - nm_add_domvmprop.current.allowPromiscuous == "accept"
+ - nm_add_domvmprop.current.forgedTransmits == "accept"
+ - nm_add_domvmprop.current.macChanges == "accept"
+ - nm_add_domvmprop.current.customEpgName == "ansible_custom_epg"
- nm_add_domvmprop.current.vmmDomainProperties.allowMicroSegmentation == true
- nm_add_domvmprop.current.vmmDomainProperties.epgLagPol.enhancedLagPol.dn == "ansible_check"
- nm_add_domvmprop.current.vmmDomainProperties.epgLagPol.enhancedLagPol.name == "ansible_check_name"
@@ -637,6 +656,15 @@
- nm_add_domvmprop.current.vmmDomainProperties.switchType == "default"
- nm_add_domvmprop.current.vmmDomainProperties.switchingMode == "native"
- nm_add_domvmprop.current.vmmDomainProperties.vlanEncapMode == "static"
+ - nm_add_domvmprop.current.vmmDomainProperties.delimiter == "|"
+ - nm_add_domvmprop.current.vmmDomainProperties.bindingType == "static"
+ - nm_add_domvmprop.current.vmmDomainProperties.numPorts == 2
+ - nm_add_domvmprop.current.vmmDomainProperties.portAllocation == "elastic"
+ - nm_add_domvmprop.current.vmmDomainProperties.netflowPref == "enabled"
+ - nm_add_domvmprop.current.vmmDomainProperties.allowPromiscuous == "accept"
+ - nm_add_domvmprop.current.vmmDomainProperties.forgedTransmits == "accept"
+ - nm_add_domvmprop.current.vmmDomainProperties.macChanges == "accept"
+ - nm_add_domvmprop.current.vmmDomainProperties.customEpgName == "ansible_custom_epg"
- nm_query_domvmprop.current.allowMicroSegmentation == true
- nm_query_domvmprop.current.deployImmediacy == "immediate"
- nm_query_domvmprop.current.dn == "uni/vmmp-VMware/dom-VMware-VMM"
@@ -646,20 +674,29 @@
- nm_query_domvmprop.current.microSegVlan.vlanType == "vlan"
- nm_query_domvmprop.current.portEncapVlan.vlan == 100
- nm_query_domvmprop.current.portEncapVlan.vlanType == "vlan"
- - nm_query_domvmprop.current.resolutionImmediacy == "lazy"
+ - nm_query_domvmprop.current.resolutionImmediacy == "immediate"
- nm_query_domvmprop.current.switchType == "default"
- nm_query_domvmprop.current.switchingMode == "native"
- nm_query_domvmprop.current.vlanEncapMode == "static"
+ - nm_query_domvmprop.current.delimiter == "|"
+ - nm_query_domvmprop.current.bindingType == "static"
+ - nm_query_domvmprop.current.numPorts == 2
+ - nm_query_domvmprop.current.portAllocation == "elastic"
+ - nm_query_domvmprop.current.netflowPref == "enabled"
+ - nm_query_domvmprop.current.allowPromiscuous == "accept"
+ - nm_query_domvmprop.current.forgedTransmits == "accept"
+ - nm_query_domvmprop.current.macChanges == "accept"
+ - nm_query_domvmprop.current.customEpgName == "ansible_custom_epg"
- name: Add another domain vmm to site EPG2 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *domain_ap1_epg2
domain_profile: 'TEST'
state: present
register: nm_add_another_domvmprop
- name: Query all domains vmms attached to site EPG2 with AP2
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -670,14 +707,14 @@
register: nm_query_another_domvmprop
- name: Verify domain vmm to site EPG2 with AP2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_another_domvmprop is changed
- nm_query_another_domvmprop is not changed
- nm_query_another_domvmprop.current | length == 2
-- name: Add domain vmm to site EPG4 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain:
+- name: Error binding type static and port_allocation not provided (error mode)
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -688,28 +725,36 @@
domain_profile: 'VMware-VMM'
deployment_immediacy: lazy
resolution_immediacy: lazy
- micro_seg_vlan: 100
- port_encap_vlan_type: 'vlan'
- port_encap_vlan: 100
- vlan_encap_mode: static
- allow_micro_segmentation: true
- switch_type: 'default'
- switching_mode: native
- enhanced_lagpolicy_name: 'ansible_check'
- enhanced_lagpolicy_dn: 'ansible_check'
+ binding_type: static
state: present
ignore_errors: true
- register: nm_add_domvmprop1
+ register: err_binding_type_static
-- name: Verify nm_add_domvmprop1
- assert:
+- name: Verify binding type static error
+ ansible.builtin.assert:
that:
- - nm_add_domvmprop1 is not changed
- - nm_add_domvmprop1.previous == {}
- - nm_add_domvmprop1.msg == "micro_seg_vlan_type is required when micro_seg_vlan is provided."
+ - err_binding_type_static is not changed
+ - err_binding_type_static.msg == "binding_type is static but all of the following are missing{{":"}} port_allocation"
+
+- name: Error micro_seg_vlan and micro_seg_vlan_type not provided (error mode)
+ cisco.mso.mso_schema_site_anp_epg_domain:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ site: '{{ mso_site | default("ansible_test") }}'
+ template: Template 1
+ anp: AP2
+ epg: EPG4
+ domain_association_type: vmmDomain
+ domain_profile: 'VMware-VMM'
+ deployment_immediacy: lazy
+ resolution_immediacy: lazy
+ micro_seg_vlan: 100
+ state: present
+ ignore_errors: true
+ register: err_no_micro_seg_vlan_type
-- name: Add domain vmm to site EPG4 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain:
+- name: Error micro_seg_vlan_type and micro_seg_vlan not provided (error mode)
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -721,26 +766,20 @@
deployment_immediacy: lazy
resolution_immediacy: lazy
micro_seg_vlan_type: 'vlan'
- port_encap_vlan_type: 'vlan'
- port_encap_vlan: 100
- vlan_encap_mode: static
- allow_micro_segmentation: true
- switch_type: 'default'
- switching_mode: native
- enhanced_lagpolicy_name: 'ansible_check'
- enhanced_lagpolicy_dn: 'ansible_check'
state: present
ignore_errors: true
- register: nm_add_domvmprop2
+ register: err_no_micro_seg_vlan
-- name: Verify nm_add_domvmprop2
- assert:
+- name: Verify micro segmentation vlan error
+ ansible.builtin.assert:
that:
- - nm_add_domvmprop2 is not changed
- - nm_add_domvmprop2.msg == "micro_seg_vlan is required when micro_seg_vlan_type is provided."
+ - err_no_micro_seg_vlan_type is not changed
+ - err_no_micro_seg_vlan_type.msg == "parameters are required together{{":"}} micro_seg_vlan_type, micro_seg_vlan"
+ - err_no_micro_seg_vlan is not changed
+ - err_no_micro_seg_vlan.msg == "parameters are required together{{":"}} micro_seg_vlan_type, micro_seg_vlan"
-- name: Add domain vmm to site EPG4 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain:
+- name: Error port_encap_vlan and port_encap_vlan_type not provided (error mode)
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -751,27 +790,13 @@
domain_profile: 'VMware-VMM'
deployment_immediacy: lazy
resolution_immediacy: lazy
- micro_seg_vlan_type: 'vlan'
- micro_seg_vlan: 100
port_encap_vlan: 100
- vlan_encap_mode: static
- allow_micro_segmentation: true
- switch_type: 'default'
- switching_mode: native
- enhanced_lagpolicy_name: 'ansible_check'
- enhanced_lagpolicy_dn: ''
state: present
ignore_errors: true
- register: nm_add_domvmprop3
+ register: err_no_port_encap_vlan_type
-- name: Verify nm_add_domvmprop3
- assert:
- that:
- - nm_add_domvmprop3 is not changed
- - nm_add_domvmprop3.msg == "port_encap_vlan_type is required when port_encap_vlan is provided."
-
-- name: Add domain vmm to site EPG4 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain:
+- name: Error port_encap_vlan_type and port_encap_vlan not provided (error mode)
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -782,27 +807,21 @@
domain_profile: 'VMware-VMM'
deployment_immediacy: lazy
resolution_immediacy: lazy
- micro_seg_vlan_type: 'vlan'
- micro_seg_vlan: 100
port_encap_vlan_type: 'vlan'
- vlan_encap_mode: static
- allow_micro_segmentation: true
- switch_type: 'default'
- switching_mode: native
- enhanced_lagpolicy_name: 'ansible_check'
- enhanced_lagpolicy_dn: 'ansible_check'
state: present
ignore_errors: true
- register: nm_add_domvmprop4
+ register: err_no_port_encap_vlan
-- name: Verify nm_add_domvmprop4
- assert:
+- name: Verify port encap vlan error
+ ansible.builtin.assert:
that:
- - nm_add_domvmprop4 is not changed
- - nm_add_domvmprop4.msg == "port_encap_vlan is required when port_encap_vlan_type is provided."
+ - err_no_port_encap_vlan_type is not changed
+ - err_no_port_encap_vlan_type.msg == "parameters are required together{{":"}} port_encap_vlan_type, port_encap_vlan"
+ - err_no_port_encap_vlan is not changed
+ - err_no_port_encap_vlan.msg == "parameters are required together{{":"}} port_encap_vlan_type, port_encap_vlan"
-- name: Add domain vmm to site EPG4 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain:
+- name: Error enhanced_lagpolicy_dn and enhanced_lagpolicy_name not provided (error mode)
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -813,27 +832,13 @@
domain_profile: 'VMware-VMM'
deployment_immediacy: lazy
resolution_immediacy: lazy
- micro_seg_vlan_type: 'vlan'
- micro_seg_vlan: 100
- port_encap_vlan_type: 'vlan'
- port_encap_vlan: 100
- vlan_encap_mode: static
- allow_micro_segmentation: true
- switch_type: 'default'
- switching_mode: native
enhanced_lagpolicy_dn: 'ansible_check'
state: present
ignore_errors: true
- register: nm_add_domvmprop5
-
-- name: Verify nm_add_domvmprop5
- assert:
- that:
- - nm_add_domvmprop5 is not changed
- - nm_add_domvmprop5.msg == "enhanced_lagpolicy_name is required when enhanced_lagpolicy_dn is provided."
+ register: err_no_enhanced_lagpolicy_name
-- name: Add domain vmm to site EPG4 with AP2 (normal mode)
- mso_schema_site_anp_epg_domain:
+- name: Error enhanced_lagpolicy_name and enhanced_lagpolicy_dn not provided (error mode)
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -844,28 +849,22 @@
domain_profile: 'VMware-VMM'
deployment_immediacy: lazy
resolution_immediacy: lazy
- micro_seg_vlan_type: 'vlan'
- micro_seg_vlan: 100
- port_encap_vlan_type: 'vlan'
- port_encap_vlan: 100
- vlan_encap_mode: static
- allow_micro_segmentation: true
- switch_type: 'default'
- switching_mode: native
enhanced_lagpolicy_name: 'ansible_check'
state: present
ignore_errors: true
- register: nm_add_domvmprop6
+ register: err_no_enhanced_lagpolicy_dn
- name: Verify nm_add_domvmprop6
- assert:
+ ansible.builtin.assert:
that:
- - nm_add_domvmprop6 is not changed
- - nm_add_domvmprop6.msg == "enhanced_lagpolicy_dn is required when enhanced_lagpolicy_name is provided."
+ - err_no_enhanced_lagpolicy_name is not changed
+ - err_no_enhanced_lagpolicy_name.msg == "parameters are required together{{":"}} enhanced_lagpolicy_name, enhanced_lagpolicy_dn"
+ - err_no_enhanced_lagpolicy_dn is not changed
+ - err_no_enhanced_lagpolicy_dn.msg == "parameters are required together{{":"}} enhanced_lagpolicy_name, enhanced_lagpolicy_dn"
# USE NON-EXISTING EPG and ANP AT TEMPLATE LEVEL
- name: Add domain 1 to non-existent site EPG5 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -881,13 +880,13 @@
register: nm_add_dom1e5
- name: Verify nm_add_dom1e5
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom1e5 is not changed
# USE NON-EXISTING EPG AT TEMPLATE LEVEL
- name: Add domain 1 to non-existent site EPG5 (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -903,13 +902,13 @@
register: nm_add_dom1e6
- name: Verify nm_add_dom1e6
- assert:
+ ansible.builtin.assert:
that:
- nm_add_dom1e6 is not changed
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for domain (check_mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -925,7 +924,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for domain (normal_mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -940,7 +939,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -949,7 +948,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for domain (check_mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -965,7 +964,7 @@
register: cm_non_existing_template
- name: Non-existing template for domain (normal_mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -980,7 +979,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -989,7 +988,7 @@
# USE A NON-EXISTING SITE
- name: Non-existing site for domain (check_mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -1005,7 +1004,7 @@
register: cm_non_existing_site
- name: Non-existing site for domain (normal_mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -1020,7 +1019,7 @@
register: nm_non_existing_site
- name: Verify non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site is not changed
- nm_non_existing_site is not changed
@@ -1030,7 +1029,7 @@
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site EPG domain association to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -1046,7 +1045,7 @@
register: cm_no_site_associated
- name: Add site EPG domain association to Template 3 without any site associated (normal mode)
- mso_schema_site_anp_epg_domain:
+ cisco.mso.mso_schema_site_anp_epg_domain:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -1061,7 +1060,7 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_selector/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_selector/tasks/main.yml
index ec69a7c47..1660e8e4c 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_selector/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_selector/tasks/main.yml
@@ -6,13 +6,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,13 +23,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -38,7 +38,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure azure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -49,7 +49,7 @@
state: present
- name: Ensure aws site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -60,7 +60,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -71,7 +71,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -81,7 +81,7 @@
state: present
- name: Associate aws site with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -93,7 +93,7 @@
register: aaws_nm
- name: Associate azure site with access_type not present, with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -102,7 +102,7 @@
register: aazure_shared_nm
- name: Ensure schema 1 with Template 1, and Template 2, Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -114,7 +114,7 @@
- { template: Template 3}
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -122,7 +122,7 @@
state: present
- name: Add aws site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -134,7 +134,7 @@
when: version.current.version is version('3', '<')
- name: Add azure site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -146,7 +146,7 @@
when: version.current.version is version('3', '<')
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -154,7 +154,7 @@
state: present
- name: Ensure ANP exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -165,7 +165,7 @@
- { schema: '{{ mso_schema | default("ansible_test") }}', template: 'Template 2' }
- name: Add a new CIDR in VRF1 at site level
- mso_schema_site_vrf_region_cidr: &mso_present
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -181,7 +181,7 @@
# ADD EPGs
- name: Ensure EPGs exist
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -197,7 +197,7 @@
- { schema: '{{ mso_schema | default("ansible_test") }}', template: 'Template 1', epg: 'ansible_test_2' }
- name: Add Selector to EPG (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -208,7 +208,7 @@
register: nm_add_selector_1
- name: Verify nm_add_selector_1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_1 is changed
- nm_add_selector_1.previous == {}
@@ -216,7 +216,7 @@
- nm_add_selector_1.current.expressions == []
- name: Add Selector 2 to EPG (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -231,7 +231,7 @@
register: nm_add_selector_2
- name: Verify nm_add_selector_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_2 is changed
- nm_add_selector_2.previous == {}
@@ -242,7 +242,7 @@
# ADD SELECTORS to site EPG
- name: Add selector site_selector_1 to site EPG ansible_test_1 with ANP (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -255,7 +255,7 @@
register: cm_add_site_selector_1
- name: Verify cm_add_site_selector_1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_selector_1.current.name == "site_selector_1"
- cm_add_site_selector_1.current.expressions == []
@@ -263,7 +263,7 @@
- cm_add_site_selector_1.previous == {}
- name: Add selector site_selector_1 to site EPG ansible_test_1 with ANP (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -275,7 +275,7 @@
register: nm_add_site_selector_1
- name: Verify nm_add_site_selector_1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selector_1.current.name == "site_selector_1"
- nm_add_site_selector_1.current.expressions == []
@@ -284,7 +284,7 @@
# Add selector 1 again
- name: Add selector site_selector_1 to site EPG ansible_test_1 with ANP again (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -296,14 +296,14 @@
register: nm_add_site_selector_1_again
- name: Verify nm_add_site_selector_1_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selector_1_again is not changed
- nm_add_site_selector_1_again.current.name == "site_selector_1" == nm_add_site_selector_1_again.previous.name
- nm_add_site_selector_1_again.current.expressions == [] == nm_add_site_selector_1_again.previous.expressions
- name: Add Selector 1 to site EPG with space in selector name (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -316,13 +316,13 @@
register: nm_add_selector1_with_space_in_name
- name: Verify nm_add_selector1_with_space_in_name
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector1_with_space_in_name is not changed
- nm_add_selector1_with_space_in_name.msg == "There should not be any space in selector name."
- name: Add Selector 2 to site EPG with space in expression type (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -339,13 +339,13 @@
register: nm_add_selector2_with_space_in_expression_type
- name: Verify nm_add_selector2_with_space_in_expression_type
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector2_with_space_in_expression_type is not changed
- nm_add_selector2_with_space_in_expression_type.msg == "There should not be any space in 'type' attribute of expression 'expression 2'"
- name: Add Selector 2 to site EPG (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -362,7 +362,7 @@
register: cm_add_site_selector_2
- name: Verify cm_add_selector_2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_selector_2 is changed
- cm_add_site_selector_2.previous == {}
@@ -372,7 +372,7 @@
- cm_add_site_selector_2.current.expressions[0].value == "test"
- name: Add Selector_2 to site EPG (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -388,7 +388,7 @@
register: nm_add_site_selector_2
- name: Verify nm_add_site_selector_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selector_2 is changed
- nm_add_site_selector_2.previous == {}
@@ -398,7 +398,7 @@
- nm_add_site_selector_2.current.expressions[0].value == "test"
- name: Change Selector 2 - keyExist(normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -415,13 +415,13 @@
register: nm_change_site_selector_2_key_exist
- name: Verify nm_change_site_selector_2_key_exist
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site_selector_2_key_exist is not changed
- nm_change_site_selector_2_key_exist.msg == "Attribute 'value' is not supported for operator 'has_key' in expression 'expression_5'"
- name: Change Selector 2 - keyNotExist (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -438,13 +438,13 @@
register: nm_change_site_selector_2_key_not_exist
- name: Verify nm_change_site_selector_2_key_not_exist
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site_selector_2_key_not_exist is not changed
- nm_change_site_selector_2_key_not_exist.msg == "Attribute 'value' is not supported for operator 'does_not_have_key' in expression 'expression_6'"
- name: Change Selector 2 - equals (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -460,14 +460,14 @@
register: nm_change_site_selector_2_equals
- name: Verify nm_change_site_selector_2_equals
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site_selector_2_equals is not changed
- nm_change_site_selector_2_equals.msg == "Attribute 'value' needed for operator 'equals' in expression 'expression_6'"
# Remove site ANP
- name: Remove site ANP (normal_mode)
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -476,7 +476,7 @@
state: absent
- name: Query site ANP
- mso_schema_site_anp:
+ cisco.mso.mso_schema_site_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -487,14 +487,14 @@
register: query_site_ANP
- name: Verify query_site_ANP
- assert:
+ ansible.builtin.assert:
that:
- query_site_ANP.msg == "ANP 'ANP' not found"
when: version.current.version is version('4.0', '<') # no error msg is returned in NDO4.0 because site will be present when template is defined
# Query without site ANP
- name: Query site_selectors without site ANP
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -506,7 +506,7 @@
register: query_without_site_ANP
- name: Verify query_without_site_ANP
- assert:
+ ansible.builtin.assert:
that:
- query_without_site_ANP is not changed
- query_without_site_ANP.msg == "Anp 'ANP' does not exist in site level."
@@ -514,7 +514,7 @@
# - name: Add selector without ANP exist in site level
- name: Add site selector 3 without site ANP exist (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -530,7 +530,7 @@
register: nm_add_site_selector_3_without_anp
- name: Verify nm_add_site_selector_3_without_anp
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selector_3_without_anp is changed
- nm_add_site_selector_3_without_anp.previous == {}
@@ -541,7 +541,7 @@
# Remove site level EPG
- name: Remove site EPG
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -552,7 +552,7 @@
# Query without site level EPG
- name: Query site_selectors without site EPG
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -564,14 +564,14 @@
register: query_without_site_EPG
- name: Verify query_without_site_EPG
- assert:
+ ansible.builtin.assert:
that:
- query_without_site_EPG is not changed
- query_without_site_EPG.msg == "Epg 'ansible_test_1' does not exist in site level."
when: version.current.version is version('4.0', '<') # no error msg is returned in NDO4.0 because site will be present when template is defined
- name: Add site selector 1 without site EPG exist (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -583,7 +583,7 @@
register: nm_add_site_selector_1_without_epg
- name: Verify nm_add_site_selector_1_without_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selector_1_without_epg is changed
- nm_add_site_selector_1_without_epg.previous == {}
@@ -591,7 +591,7 @@
- nm_add_site_selector_1_without_epg.current.expressions == []
- name: Add site_selector_1 site_selector_2 site_selector_3 again
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -611,13 +611,13 @@
register: nm_add_site_selectors_again
- name: Verify nm_add_site_selectors_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selectors_again is changed
# Query all selectors
- name: Query selectors to site EPG
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -628,7 +628,7 @@
register: query_all_site_selectors
- name: Verify query_all_site_selectors
- assert:
+ ansible.builtin.assert:
that:
- query_all_site_selectors is not changed
- query_all_site_selectors.current | length == 3
@@ -647,7 +647,7 @@
# Query sepecific seletor to site EPG
- name: Query selector to site EPG
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -659,7 +659,7 @@
register: query_site_selector_1
- name: Verify query_site_selector_1
- assert:
+ ansible.builtin.assert:
that:
- query_site_selector_1 is not changed
- query_site_selector_1.current.name == "site_selector_1"
@@ -668,7 +668,7 @@
- query_site_selector_1.current.expressions[0].value == "test"
- name: Remove site selector 3 (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -680,13 +680,13 @@
register: nm_remove_site_selector_3
- name: Verify nm_remove_site_selector_3
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_site_selector_3 is changed
- nm_remove_site_selector_3.current == {}
- name: Remove site selector 3 again (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -698,14 +698,14 @@
register: nm_remove_site_selector_3_again
- name: Verify nm_remove_site_selector_3_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_site_selector_3_again is not changed
- nm_remove_site_selector_3_again.current == {}
# QUERY NON-EXISTING Selector to EPG
- name: Query non-existing selector (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -719,7 +719,7 @@
register: cm_query_non_selector
- name: Query non-existing selector (normal mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -732,7 +732,7 @@
register: nm_query_non_selector
- name: Verify cm_query_non_selector and nm_query_non_selector
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_selector is not changed
- nm_query_non_selector is not changed
@@ -742,7 +742,7 @@
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -756,7 +756,7 @@
register: cm_query_non_epg
- name: Query non-existing EPG (normal mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -769,7 +769,7 @@
register: nm_query_non_epg
- name: Verify query_non_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_epg is not changed
- nm_query_non_epg is not changed
@@ -778,7 +778,7 @@
# QUERY NON-EXISTING ANP
- name: Query non-existing ANP (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -792,7 +792,7 @@
register: cm_query_non_anp
- name: Query non-existing ANP (normal mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -805,7 +805,7 @@
register: nm_query_non_anp
- name: Verify query_non_anp
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_anp is not changed
- nm_query_non_anp is not changed
@@ -814,7 +814,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -828,7 +828,7 @@
register: cm_non_existing_state
- name: Non-existing state (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -841,7 +841,7 @@
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -850,7 +850,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -864,7 +864,7 @@
register: cm_non_existing_template
- name: Non-existing template (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -877,7 +877,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -886,7 +886,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: non-existing-schema
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -900,7 +900,7 @@
register: cm_non_existing_schema
- name: Non-existing schema (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: non-existing-schema
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -913,7 +913,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -922,7 +922,7 @@
# USE A NON-EXISTING SITE
- name: Non-existing site (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non-existing-site
@@ -936,7 +936,7 @@
register: cm_non_existing_site
- name: Non-existing site (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non-existing-site
@@ -949,7 +949,7 @@
register: nm_non_existing_site
- name: Verify non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site is not changed
- nm_non_existing_site is not changed
@@ -958,7 +958,7 @@
# USE A NON-EXISTING SITE-TEMPLATE
- name: Non-existing site-template (check_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -972,7 +972,7 @@
register: cm_non_existing_site_template
- name: Non-existing site-template (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -985,7 +985,7 @@
register: nm_non_existing_site_template
- name: Verify non_existing_site_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site_template is not changed
- nm_non_existing_site_template is not changed
@@ -993,7 +993,7 @@
- cm_non_existing_site_template.msg == nm_non_existing_site_template.msg == "Provided site-template association 'aws_{{ mso_site | default("ansible_test") }}-Template3' does not exist."
- name: Add Selector_4 to site EPG (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -1009,13 +1009,13 @@
register: nm_add_site_selector_4
- name: Verify nm_add_site_selector_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selector_4 is not changed
- nm_add_site_selector_4.msg == "Operator 'has_key' is not supported when expression type is 'ip_address'"
- name: Add Selector_4 to site EPG again (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -1031,13 +1031,13 @@
register: nm_add_site_selector_4_again
- name: Verify nm_add_site_selector_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_selector_4_again is changed
- nm_add_site_selector_4_again.current.name == "site_selector_4"
- name: Add azure site_selector_1 to site EPG (normal_mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -1054,14 +1054,14 @@
register: nm_add_azure_site_selector_1
- name: Verify nm_add_azure_site_selector_1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_azure_site_selector_1 is not changed
- nm_add_azure_site_selector_1.msg == "Type 'zone' is only supported for aws"
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site EPG selector to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -1079,7 +1079,7 @@
register: cm_no_site_associated
- name: Add site EPG selector to Template 3 without any site associated (normal mode)
- mso_schema_site_anp_epg_selector:
+ cisco.mso.mso_schema_site_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -1096,7 +1096,7 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_staticport/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_staticport/tasks/main.yml
index cb50a64e6..054ec970e 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_staticport/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_staticport/tasks/main.yml
@@ -1,4 +1,5 @@
# Test code for the MSO modules
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
# Copyright: (c) 2020, Lionel Hercot (@lhercot) <lhercot@cisco.com>
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com> (based on mso_site test case)
# Copyright: (c) 2020, Shreyas Srish (@shrsr) <ssrish@cisco.com>
@@ -6,13 +7,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,7 +24,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Remove Schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -32,7 +33,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -43,7 +44,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -54,7 +55,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -64,7 +65,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -75,7 +76,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -83,7 +84,7 @@
state: present
- name: Add a new site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -91,7 +92,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -99,7 +100,7 @@
state: present
- name: Add BD1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -109,7 +110,7 @@
state: present
- name: Ensure Template 1 with AP1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -117,7 +118,7 @@
state: present
- name: Ensure Template 1 and AP1 with EPG1 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -130,7 +131,7 @@
state: present
- name: Ensure Template 1 and AP1 with EPG3 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -143,7 +144,7 @@
state: present
- name: Ensure Template 1 with AP2 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -151,7 +152,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG2 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -164,7 +165,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG4 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -177,7 +178,7 @@
state: present
- name: Ensure Template 1 and AP2 with EPG6 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -191,7 +192,7 @@
# ADD STATIC PORTS
- name: Add static port 1 to site EPG1 of AP1 (check mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -210,7 +211,7 @@
register: cm_add_stat1e1
- name: Verify cm_add_stat1e1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_stat1e1 is changed
- cm_add_stat1e1.previous == {}
@@ -221,7 +222,7 @@
- cm_add_stat1e1.current.type == 'port'
- name: Add static port 1 to site EPG1 of AP1 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -238,7 +239,7 @@
register: nm_add_stat1e1
- name: Verify nm_add_stat1e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e1 is changed
- nm_add_stat1e1.previous == {}
@@ -249,7 +250,7 @@
- nm_add_stat1e1.current.type == 'port'
- name: Add static port 2 to site EPG1 of AP1 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -268,7 +269,7 @@
register: nm_add_stat2e1
- name: Verify nm_add_stat2e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat2e1 is changed
- nm_add_stat2e1.previous == {}
@@ -280,7 +281,7 @@
- name: Add static port 3 (vpc) to site EPG1 of AP1 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -298,7 +299,7 @@
register: nm_add_stat3e1
- name: Verify nm_add_stat3e1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat3e1 is changed
- nm_add_stat3e1.previous == {}
@@ -309,7 +310,7 @@
- nm_add_stat3e1.current.type == 'vpc'
- name: Add static port 1 to site EPG3 of AP1 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -327,7 +328,7 @@
register: nm_add_stat1e3
- name: Verify nm_add_stat1e3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e3 is changed
- nm_add_stat1e3.previous == {}
@@ -338,7 +339,7 @@
- nm_add_stat1e3.current.type == 'port'
- name: Add static port 2 (dpc) to EPG6 of AP2 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -357,7 +358,7 @@
register: nm_add_stat2e6
- name: Verify nm_add_stat2e6
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat2e6 is changed
- nm_add_stat2e6.previous == {}
@@ -370,7 +371,7 @@
# QUERY STATIC PORTS
- name: Query STATIC PORTS of site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -381,13 +382,13 @@
register: nm_query_statse1
- name: Verify nm_query_statse1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_statse1 is not changed
# QUERY A STATIC PORT
- name: Query static port 3 (vpc) of site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -405,13 +406,13 @@
register: nm_query_stat3e1
- name: Verify nm_query_stat3e1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_stat3e1 is not changed
# QUERY REMOVED STATIC PORT
- name: Add static port 2 to site EPG2 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -429,7 +430,7 @@
register: nm_add_stat2e2
- name: Verify nm_add_stat2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat2e2 is changed
- nm_add_stat2e2.previous == {}
@@ -440,7 +441,7 @@
- nm_add_stat2e2.current.type == 'port'
- name: Remove static port 2 from EPG2 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -458,12 +459,12 @@
register: nm_remove_stat2e2
- name: Verify nm_remove_stat2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_stat2e2 is changed
- name: Query removed static port 2 from EPG2 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -482,13 +483,13 @@
register: nm_non_existent_dom2e2
- name: Verify non_existing_domain
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existent_dom2e2 is not changed
- - nm_non_existent_dom2e2.msg == "Static port 'topology/pod-2/paths-102/pathep-[eth1/2]' not found"
+ - nm_non_existent_dom2e2.msg == "Provided Static Port Path 'topology/pod-2/paths-102/pathep-[eth1/2]' not found"
- name: Remove static port 2 from EPG2 again(normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -507,13 +508,13 @@
register: nm_remove_again_stat2e2
- name: Verify nm_remove_again_stat2e2
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_again_stat2e2 is not changed
# ADD EXISTING STATIC PORT
- name: Add static port 1 to site EPG1 again (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -531,13 +532,13 @@
register: nm_add_stat1e1_2
- name: Verify nm_add_stat1e1_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e1_2 is not changed
# ADD STATIC PORT WITH NO STATE
- name: Add static port 1 to site EPG1 again with no state (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -555,13 +556,13 @@
register: nm_add_stateless_stat1e1_2
- name: Verify nm_add_stateless_stat1e1_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stateless_stat1e1_2 is not changed
# ADD STATIC FEX PORT
- name: Add static fex port to site EPG1 with AP1 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -580,7 +581,7 @@
register: nm_add_statfex
- name: Verify nm_add_statfex
- assert:
+ ansible.builtin.assert:
that:
- nm_add_statfex is changed
- nm_add_statfex.previous == {}
@@ -592,7 +593,7 @@
# VERIFY NON EXISTENT DEPLOYMENT IMMEDIACY
- name: Add static port 1 to site EPG4 with AP2 with no deployment immediacy (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -609,13 +610,13 @@
register: nm_add_stat_di
- name: Verify nm_add_stat_di
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat_di.current.deploymentImmediacy == 'lazy'
# VERIFY NON EXISTENT MODE
- name: Add static port 1 to site EPG4 with AP2 with no mode (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -632,13 +633,13 @@
register: nm_add_stat_mode
- name: Verify nm_add_stat_mode
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat_mode.current.mode == 'untagged'
# USE NON-EXISTING EPG and ANP AT TEMPLATE LEVEL
- name: Add static port 1 to non-existent site EPG5 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -657,13 +658,13 @@
register: nm_add_stat1e5
- name: Verify nm_add_stat1e5
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e5 is not changed
# USE NON-EXISTING EPG AT TEMPLATE LEVEL
- name: Add static port 1 to non-existent site EPG5 (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -681,13 +682,13 @@
register: nm_add_stat1e6
- name: Verify nm_add_stat1e6
- assert:
+ ansible.builtin.assert:
that:
- nm_add_stat1e6 is not changed
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for static port (check_mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -706,7 +707,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for static port (normal_mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -724,7 +725,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -733,7 +734,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for static port (check_mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -752,7 +753,7 @@
register: cm_non_existing_template
- name: Non-existing template for static port (normal_mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -770,16 +771,16 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
- cm_non_existing_template == nm_non_existing_template
- - cm_non_existing_template.msg == nm_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1, Template2"
+ - cm_non_existing_template.msg == nm_non_existing_template.msg == "Provided template 'non_existing_template' not matching existing template(s){{":"}} Template1, Template2"
# USE A NON-EXISTING SITE
- name: Non-existing site for static port (check_mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -798,7 +799,7 @@
register: cm_non_existing_site
- name: Non-existing site for static port (normal_mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -816,17 +817,17 @@
register: nm_non_existing_site
- name: Verify non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site is not changed
- nm_non_existing_site is not changed
- cm_non_existing_site == nm_non_existing_site
- - cm_non_existing_site.msg is match("Provided site/siteId/template 'ansible_test/[0-9a-zA-Z]*/Template2' does not exist. Existing siteIds/templates{{':'}} [0-9a-zA-Z]*/Template1")
- - nm_non_existing_site.msg is match("Provided site/siteId/template 'ansible_test/[0-9a-zA-Z]*/Template2' does not exist. Existing siteIds/templates{{':'}} [0-9a-zA-Z]*/Template1")
+ - cm_non_existing_site.msg == "Provided site 'ansible_test' not associated with template 'Template2'. Site is currently associated with template(s){{':'}} Template1"
+ - nm_non_existing_site.msg == "Provided site 'ansible_test' not associated with template 'Template2'. Site is currently associated with template(s){{':'}} Template1"
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site EPG static port association to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -845,7 +846,7 @@
register: cm_no_site_associated
- name: Add site EPG static port association to Template 3 without any site associated (normal mode)
- mso_schema_site_anp_epg_staticport:
+ cisco.mso.mso_schema_site_anp_epg_staticport:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -863,8 +864,557 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
- - cm_no_site_associated.msg == nm_no_site_associated.msg == "No site associated with template 'Template3'. Associate the site with the template using mso_schema_site." \ No newline at end of file
+ - cm_no_site_associated.msg == nm_no_site_associated.msg == "No sites associated with schema 'ansible_test_2'. Associate the site with the schema using (M) mso_schema_site."
+
+# TESTS IN BULK
+
+# SETUP TEST ENVIRONMENT FOR BULK
+
+- name: Remove Schemas for bulk
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ item }}'
+ state: absent
+ loop:
+ - '{{ mso_schema | default("ansible_test") }}_2'
+ - '{{ mso_schema | default("ansible_test") }}'
+
+- name: Create schema ansible_test with template_bulk
+ cisco.mso.mso_schema_template:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ tenant: ansible_test
+ template: template_bulk
+
+- name: Create vrf_bulk in template_bulk
+ cisco.mso.mso_schema_template_vrf:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: template_bulk
+ vrf: vrf_bulk
+
+- name: Create bd_bulk in template_bulk
+ cisco.mso.mso_schema_template_bd:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: template_bulk
+ bd: bd_bulk
+ vrf:
+ name: vrf_bulk
+
+- name: Create anp_bulk in template_bulk
+ cisco.mso.mso_schema_template_anp: &anp_bulk
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: template_bulk
+ anp: anp_bulk
+
+- name: Create EPG in template_bulk
+ cisco.mso.mso_schema_template_anp_epg:
+ <<: *anp_bulk
+ epg: epg_bulk
+ bd:
+ name: bd_bulk
+ vrf:
+ name: vrf_bulk
+
+- name: Add site to template_bulk
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ site: '{{ mso_site | default("ansible_test") }}'
+ template: template_bulk
+
+- name: Set facts for static_ports
+ ansible.builtin.set_fact:
+ static_ports_present: []
+ static_ports_present_2: []
+ static_ports_absent: []
+ static_ports_absent_2: []
+
+- name: Create static_ports list for appending
+ ansible.builtin.set_fact:
+ static_ports_present: "{{ static_ports_present + [{'pod': 'pod-1', 'leaf': '101', 'path': 'eth1/%s' | format(item), 'vlan': '110%s' | format(item)}] }}"
+ static_ports_present_2: "{{ static_ports_present_2 + [{'pod': 'pod-1', 'leaf': '101', 'path': 'eth2/%s' | format(item), 'vlan': '120%s' | format(item)}] }}"
+ loop: "{{ range(0, 10, 1) | list }}"
+
+- name: Create static_ports list for removing
+ ansible.builtin.set_fact:
+ static_ports_absent: "{{ static_ports_absent + [{'pod': 'pod-1', 'leaf': '101', 'path': 'eth1/%s' | format(item), 'vlan': '110%s' | format(item)}] }}"
+ static_ports_absent_2: "{{ static_ports_absent_2 + [{'pod': 'pod-1', 'leaf': '101', 'path': 'eth2/%s' | format(item), 'vlan': '120%s' | format(item)}] }}"
+ loop: "{{ range(0, 10, 2) | list }}"
+
+# CREATE AND UPDATE TESTS FOR BULK
+
+- name: Append static ports (check_mode)
+ cisco.mso.mso_schema_site_anp_epg_staticport: &static_ports_append
+ <<: *anp_bulk
+ epg: epg_bulk
+ site: '{{ mso_site | default("ansible_test") }}'
+ static_ports: "{{ static_ports_present }}"
+ register: cm_append_static_ports
+ check_mode: true
+
+- name: Append static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ register: nm_append_static_ports
+
+- name: Append static ports again
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ register: nm_append_static_ports_again
+
+- name: Append additional static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ static_ports: "{{ static_ports_present_2 }}"
+ register: nm_append_static_ports_2
+
+- name: Verify appending static ports
+ ansible.builtin.assert:
+ that:
+ - cm_append_static_ports is changed
+ - cm_append_static_ports.previous == []
+ - cm_append_static_ports.current | length == 10
+ - cm_append_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - cm_append_static_ports.current.0.portEncapVlan == 1100
+ - cm_append_static_ports.current.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - cm_append_static_ports.current.3.portEncapVlan == 1103
+ - cm_append_static_ports.current.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - cm_append_static_ports.current.9.portEncapVlan == 1109
+ - nm_append_static_ports is changed
+ - nm_append_static_ports.previous == []
+ - nm_append_static_ports.current | length == 10
+ - nm_append_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_append_static_ports.current.0.portEncapVlan == 1100
+ - nm_append_static_ports.current.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_append_static_ports.current.3.portEncapVlan == 1103
+ - nm_append_static_ports.current.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_append_static_ports.current.9.portEncapVlan == 1109
+ - nm_append_static_ports_again is not changed
+ - nm_append_static_ports_again.previous | length == 10
+ - nm_append_static_ports_again.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_append_static_ports_again.previous.0.portEncapVlan == 1100
+ - nm_append_static_ports_again.previous.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_append_static_ports_again.previous.3.portEncapVlan == 1103
+ - nm_append_static_ports_again.previous.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_append_static_ports_again.previous.9.portEncapVlan == 1109
+ - nm_append_static_ports_again.current | length == 10
+ - nm_append_static_ports_again.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_append_static_ports_again.current.0.portEncapVlan == 1100
+ - nm_append_static_ports_again.current.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_append_static_ports_again.current.3.portEncapVlan == 1103
+ - nm_append_static_ports_again.current.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_append_static_ports_again.current.9.portEncapVlan == 1109
+ - nm_append_static_ports_2 is changed
+ - nm_append_static_ports_2.previous | length == 10
+ - nm_append_static_ports_2.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_append_static_ports_2.previous.0.portEncapVlan == 1100
+ - nm_append_static_ports_2.previous.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_append_static_ports_2.previous.3.portEncapVlan == 1103
+ - nm_append_static_ports_2.previous.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_append_static_ports_2.previous.9.portEncapVlan == 1109
+ - nm_append_static_ports_2.current | length == 20
+ - nm_append_static_ports_2.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_append_static_ports_2.current.0.portEncapVlan == 1100
+ - nm_append_static_ports_2.current.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_append_static_ports_2.current.3.portEncapVlan == 1103
+ - nm_append_static_ports_2.current.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_append_static_ports_2.current.9.portEncapVlan == 1109
+ - nm_append_static_ports_2.current.10.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_append_static_ports_2.current.10.portEncapVlan == 1200
+ - nm_append_static_ports_2.current.13.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_append_static_ports_2.current.13.portEncapVlan == 1203
+ - nm_append_static_ports_2.current.19.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_append_static_ports_2.current.19.portEncapVlan == 1209
+
+# REMOVE AND UPDATE TESTS FOR BULK
+
+- name: Remove static ports (check_mode)
+ cisco.mso.mso_schema_site_anp_epg_staticport: &static_ports_remove
+ <<: *static_ports_append
+ static_ports: "{{ static_ports_absent }}"
+ state: absent
+ register: cm_remove_static_ports
+ check_mode: true
+
+- name: Remove static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_remove
+ register: nm_remove_static_ports
+
+- name: Remove static ports again
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_remove
+ register: nm_remove_static_ports_again
+
+- name: Remove additional static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_remove
+ static_ports: "{{ static_ports_absent_2 }}"
+ register: nm_remove_static_ports_2
+
+- name: Verify removing static ports
+ ansible.builtin.assert:
+ that:
+ - cm_remove_static_ports is changed
+ - cm_remove_static_ports.previous | length == 20
+ - cm_remove_static_ports.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - cm_remove_static_ports.previous.0.portEncapVlan == 1100
+ - cm_remove_static_ports.previous.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - cm_remove_static_ports.previous.3.portEncapVlan == 1103
+ - cm_remove_static_ports.previous.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - cm_remove_static_ports.previous.9.portEncapVlan == 1109
+ - cm_remove_static_ports.previous.10.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - cm_remove_static_ports.previous.10.portEncapVlan == 1200
+ - cm_remove_static_ports.previous.13.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - cm_remove_static_ports.previous.13.portEncapVlan == 1203
+ - cm_remove_static_ports.previous.19.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - cm_remove_static_ports.previous.19.portEncapVlan == 1209
+ - cm_remove_static_ports.current | length == 15
+ - cm_remove_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - cm_remove_static_ports.current.0.portEncapVlan == 1101
+ - cm_remove_static_ports.current.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - cm_remove_static_ports.current.2.portEncapVlan == 1105
+ - cm_remove_static_ports.current.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - cm_remove_static_ports.current.4.portEncapVlan == 1109
+ - cm_remove_static_ports.current.5.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - cm_remove_static_ports.current.5.portEncapVlan == 1200
+ - cm_remove_static_ports.current.8.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - cm_remove_static_ports.current.8.portEncapVlan == 1203
+ - cm_remove_static_ports.current.14.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - cm_remove_static_ports.current.14.portEncapVlan == 1209
+ - nm_remove_static_ports is changed
+ - nm_remove_static_ports.previous | length == 20
+ - nm_remove_static_ports.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_remove_static_ports.previous.0.portEncapVlan == 1100
+ - nm_remove_static_ports.previous.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_remove_static_ports.previous.3.portEncapVlan == 1103
+ - nm_remove_static_ports.previous.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_remove_static_ports.previous.9.portEncapVlan == 1109
+ - nm_remove_static_ports.previous.10.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_remove_static_ports.previous.10.portEncapVlan == 1200
+ - nm_remove_static_ports.previous.13.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_remove_static_ports.previous.13.portEncapVlan == 1203
+ - nm_remove_static_ports.previous.19.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_remove_static_ports.previous.19.portEncapVlan == 1209
+ - nm_remove_static_ports.current | length == 15
+ - nm_remove_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - nm_remove_static_ports.current.0.portEncapVlan == 1101
+ - nm_remove_static_ports.current.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - nm_remove_static_ports.current.2.portEncapVlan == 1105
+ - nm_remove_static_ports.current.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_remove_static_ports.current.4.portEncapVlan == 1109
+ - nm_remove_static_ports.current.5.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_remove_static_ports.current.5.portEncapVlan == 1200
+ - nm_remove_static_ports.current.8.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_remove_static_ports.current.8.portEncapVlan == 1203
+ - nm_remove_static_ports.current.14.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_remove_static_ports.current.14.portEncapVlan == 1209
+ - nm_remove_static_ports_again is not changed
+ - nm_remove_static_ports_again.previous | length == 15
+ - nm_remove_static_ports_again.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - nm_remove_static_ports_again.previous.0.portEncapVlan == 1101
+ - nm_remove_static_ports_again.previous.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - nm_remove_static_ports_again.previous.2.portEncapVlan == 1105
+ - nm_remove_static_ports_again.previous.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_remove_static_ports_again.previous.4.portEncapVlan == 1109
+ - nm_remove_static_ports_again.previous.5.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_remove_static_ports_again.previous.5.portEncapVlan == 1200
+ - nm_remove_static_ports_again.previous.8.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_remove_static_ports_again.previous.8.portEncapVlan == 1203
+ - nm_remove_static_ports_again.previous.14.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_remove_static_ports_again.previous.14.portEncapVlan == 1209
+ - nm_remove_static_ports_again.current | length == 15
+ - nm_remove_static_ports_again.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - nm_remove_static_ports_again.current.0.portEncapVlan == 1101
+ - nm_remove_static_ports_again.current.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - nm_remove_static_ports_again.current.2.portEncapVlan == 1105
+ - nm_remove_static_ports_again.current.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_remove_static_ports_again.current.4.portEncapVlan == 1109
+ - nm_remove_static_ports_again.current.5.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_remove_static_ports_again.current.5.portEncapVlan == 1200
+ - nm_remove_static_ports_again.current.8.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_remove_static_ports_again.current.8.portEncapVlan == 1203
+ - nm_remove_static_ports_again.current.14.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_remove_static_ports_again.current.14.portEncapVlan == 1209
+ - nm_remove_static_ports_2 is changed
+ - nm_remove_static_ports_2.previous | length == 15
+ - nm_remove_static_ports_2.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - nm_remove_static_ports_2.previous.0.portEncapVlan == 1101
+ - nm_remove_static_ports_2.previous.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - nm_remove_static_ports_2.previous.2.portEncapVlan == 1105
+ - nm_remove_static_ports_2.previous.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_remove_static_ports_2.previous.4.portEncapVlan == 1109
+ - nm_remove_static_ports_2.previous.5.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_remove_static_ports_2.previous.5.portEncapVlan == 1200
+ - nm_remove_static_ports_2.previous.8.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_remove_static_ports_2.previous.8.portEncapVlan == 1203
+ - nm_remove_static_ports_2.previous.14.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_remove_static_ports_2.previous.14.portEncapVlan == 1209
+ - nm_remove_static_ports_2.current | length == 10
+ - nm_remove_static_ports_2.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - nm_remove_static_ports_2.current.0.portEncapVlan == 1101
+ - nm_remove_static_ports_2.current.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - nm_remove_static_ports_2.current.2.portEncapVlan == 1105
+ - nm_remove_static_ports_2.current.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_remove_static_ports_2.current.4.portEncapVlan == 1109
+ - nm_remove_static_ports_2.current.5.path == "topology/pod-1/paths-101/pathep-[eth2/1]"
+ - nm_remove_static_ports_2.current.5.portEncapVlan == 1201
+ - nm_remove_static_ports_2.current.7.path == "topology/pod-1/paths-101/pathep-[eth2/5]"
+ - nm_remove_static_ports_2.current.7.portEncapVlan == 1205
+ - nm_remove_static_ports_2.current.9.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_remove_static_ports_2.current.9.portEncapVlan == 1209
+
+# FORCE REPLACE TESTS
+
+- name: Force replace static ports with static ports (check_mode)
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ force_replace: true
+ register: cm_force_replace_provider_static_ports
+ check_mode: true
+
+- name: Force replace static ports with static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ force_replace: true
+ register: nm_force_replace_provider_static_ports
+
+- name: Force replace static ports with static ports again
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ force_replace: true
+ register: nm_force_replace_provider_static_ports_again
+
+- name: Force replace static ports with new static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ static_ports: "{{ static_ports_present_2 }}"
+ force_replace: true
+ register: nm_force_replace_new_static_ports
+
+- name: Verify force replacing static ports
+ ansible.builtin.assert:
+ that:
+ - cm_force_replace_provider_static_ports is changed
+ - cm_force_replace_provider_static_ports.previous | length == 10
+ - cm_force_replace_provider_static_ports.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - cm_force_replace_provider_static_ports.previous.0.portEncapVlan == 1101
+ - cm_force_replace_provider_static_ports.previous.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - cm_force_replace_provider_static_ports.previous.2.portEncapVlan == 1105
+ - cm_force_replace_provider_static_ports.previous.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - cm_force_replace_provider_static_ports.previous.4.portEncapVlan == 1109
+ - cm_force_replace_provider_static_ports.previous.5.path == "topology/pod-1/paths-101/pathep-[eth2/1]"
+ - cm_force_replace_provider_static_ports.previous.5.portEncapVlan == 1201
+ - cm_force_replace_provider_static_ports.previous.7.path == "topology/pod-1/paths-101/pathep-[eth2/5]"
+ - cm_force_replace_provider_static_ports.previous.7.portEncapVlan == 1205
+ - cm_force_replace_provider_static_ports.previous.9.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - cm_force_replace_provider_static_ports.previous.9.portEncapVlan == 1209
+ - cm_force_replace_provider_static_ports.current | length == 10
+ - cm_force_replace_provider_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - cm_force_replace_provider_static_ports.current.0.portEncapVlan == 1100
+ - cm_force_replace_provider_static_ports.current.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - cm_force_replace_provider_static_ports.current.3.portEncapVlan == 1103
+ - cm_force_replace_provider_static_ports.current.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - cm_force_replace_provider_static_ports.current.9.portEncapVlan == 1109
+ - cm_force_replace_provider_static_ports.current | length == 10
+ - nm_force_replace_provider_static_ports is changed
+ - nm_force_replace_provider_static_ports.previous | length == 10
+ - nm_force_replace_provider_static_ports.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - nm_force_replace_provider_static_ports.previous.0.portEncapVlan == 1101
+ - nm_force_replace_provider_static_ports.previous.2.path == "topology/pod-1/paths-101/pathep-[eth1/5]"
+ - nm_force_replace_provider_static_ports.previous.2.portEncapVlan == 1105
+ - nm_force_replace_provider_static_ports.previous.4.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_force_replace_provider_static_ports.previous.4.portEncapVlan == 1109
+ - nm_force_replace_provider_static_ports.previous.5.path == "topology/pod-1/paths-101/pathep-[eth2/1]"
+ - nm_force_replace_provider_static_ports.previous.5.portEncapVlan == 1201
+ - nm_force_replace_provider_static_ports.previous.7.path == "topology/pod-1/paths-101/pathep-[eth2/5]"
+ - nm_force_replace_provider_static_ports.previous.7.portEncapVlan == 1205
+ - nm_force_replace_provider_static_ports.previous.9.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_force_replace_provider_static_ports.previous.9.portEncapVlan == 1209
+ - nm_force_replace_provider_static_ports.current | length == 10
+ - nm_force_replace_provider_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_force_replace_provider_static_ports.current.0.portEncapVlan == 1100
+ - nm_force_replace_provider_static_ports.current.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_force_replace_provider_static_ports.current.3.portEncapVlan == 1103
+ - nm_force_replace_provider_static_ports.current.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_force_replace_provider_static_ports.current.9.portEncapVlan == 1109
+ - nm_force_replace_provider_static_ports_again is not changed
+ - nm_force_replace_provider_static_ports_again.previous | length == 10
+ - nm_force_replace_provider_static_ports_again.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_force_replace_provider_static_ports_again.previous.0.portEncapVlan == 1100
+ - nm_force_replace_provider_static_ports_again.previous.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_force_replace_provider_static_ports_again.previous.3.portEncapVlan == 1103
+ - nm_force_replace_provider_static_ports_again.previous.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_force_replace_provider_static_ports_again.previous.9.portEncapVlan == 1109
+ - nm_force_replace_provider_static_ports_again.current | length == 10
+ - nm_force_replace_provider_static_ports_again.current.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_force_replace_provider_static_ports_again.current.0.portEncapVlan == 1100
+ - nm_force_replace_provider_static_ports_again.current.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_force_replace_provider_static_ports_again.current.3.portEncapVlan == 1103
+ - nm_force_replace_provider_static_ports_again.current.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_force_replace_provider_static_ports_again.current.9.portEncapVlan == 1109
+ - nm_force_replace_new_static_ports.previous | length == 10
+ - nm_force_replace_new_static_ports.previous.0.path == "topology/pod-1/paths-101/pathep-[eth1/0]"
+ - nm_force_replace_new_static_ports.previous.0.portEncapVlan == 1100
+ - nm_force_replace_new_static_ports.previous.3.path == "topology/pod-1/paths-101/pathep-[eth1/3]"
+ - nm_force_replace_new_static_ports.previous.3.portEncapVlan == 1103
+ - nm_force_replace_new_static_ports.previous.9.path == "topology/pod-1/paths-101/pathep-[eth1/9]"
+ - nm_force_replace_new_static_ports.previous.9.portEncapVlan == 1109
+ - nm_force_replace_new_static_ports.current | length == 10
+ - nm_force_replace_new_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_force_replace_new_static_ports.current.0.portEncapVlan == 1200
+ - nm_force_replace_new_static_ports.current.3.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_force_replace_new_static_ports.current.3.portEncapVlan == 1203
+ - nm_force_replace_new_static_ports.current.9.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_force_replace_new_static_ports.current.9.portEncapVlan == 1209
+
+# QUERY TESTS FOR BULK
+
+- name: Query static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ static_ports: "{{ static_ports_present_2 }}"
+ state: query
+ register: nm_query_static_ports
+
+- name: Create static ports without input (error)
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *anp_bulk
+ epg: epg_bulk
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: present
+ register: err_present_static_ports
+ ignore_errors: true
+
+- name: Query static ports with non existing static ports (error)
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *static_ports_append
+ static_ports:
+ - leaf: 101
+ pod: pod-1
+ path: eth1/40
+ type: port
+ vlan: 1100
+ - leaf: 201
+ pod: pod-1
+ path: eth1/41
+ type: port
+ vlan: 1101
+ state: query
+ register: err_query_static_ports
+ ignore_errors: true
+
+- name: Verify queries for bulk
+ ansible.builtin.assert:
+ that:
+ - err_present_static_ports is failed
+ - err_present_static_ports.msg == "state is present or absent but all of the following are missing{{":"}} pod, leaf, path, vlan."
+ - nm_query_static_ports is not changed
+ - nm_query_static_ports.current | length == 10
+ - nm_query_static_ports.current.0.path == "topology/pod-1/paths-101/pathep-[eth2/0]"
+ - nm_query_static_ports.current.0.portEncapVlan == 1200
+ - nm_query_static_ports.current.3.path == "topology/pod-1/paths-101/pathep-[eth2/3]"
+ - nm_query_static_ports.current.3.portEncapVlan == 1203
+ - nm_query_static_ports.current.9.path == "topology/pod-1/paths-101/pathep-[eth2/9]"
+ - nm_query_static_ports.current.9.portEncapVlan == 1209
+ - err_query_static_ports is failed
+ - err_query_static_ports.msg.0 == "Provided Static Port Path 'topology/pod-1/paths-101/pathep-[eth2/0]' not found"
+ - err_query_static_ports.msg.1 == "Provided Static Port Path 'topology/pod-1/paths-101/pathep-[eth2/1]' not found"
+
+# FORCE REMOVE ALL CONTRACTS
+
+- name: Force remove all static ports
+ cisco.mso.mso_schema_site_anp_epg_staticport: &force_remove_all
+ <<: *anp_bulk
+ epg: epg_bulk
+ site: '{{ mso_site | default("ansible_test") }}'
+ force_replace: true
+ state: absent
+ register: force_remove_all_static_ports
+
+- name: Create new static ports without existing contracts
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *force_remove_all
+ static_ports:
+ - leaf: 101
+ pod: pod-1
+ path: eth1/40
+ type: port
+ vlan: 1100
+ state: present
+ register: force_remove_all_new_static
+
+- name: Force remove all static ports again
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *force_remove_all
+
+- name: Verify force remove all static ports
+ ansible.builtin.assert:
+ that:
+ - force_remove_all_static_ports is changed
+ - force_remove_all_static_ports.previous | length == 10
+ - force_remove_all_static_ports.current == []
+ - force_remove_all_new_static is changed
+ - force_remove_all_new_static.previous == []
+ - force_remove_all_new_static.current | length == 1
+
+# OVERWRITE ARGUMENTS
+
+- name: Overwrite static port arguments (error)
+ cisco.mso.mso_schema_site_anp_epg_staticport: &overwrite_static_ports
+ <<: *anp_bulk
+ epg: epg_bulk
+ site: '{{ mso_site | default("ansible_test") }}'
+ leaf: 201
+ pod: pod-1
+ static_ports:
+ - type: port
+ register: err_overwrite_static_ports
+ ignore_errors: true
+
+- name: Overwrite static other port arguments (error)
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *anp_bulk
+ epg: epg_bulk
+ site: '{{ mso_site | default("ansible_test") }}'
+ path: eth1/41
+ vlan: 1101
+ static_ports:
+ - type: port
+ register: err_overwrite_static_ports_other
+ ignore_errors: true
+
+- name: Overwrite static port arguments
+ cisco.mso.mso_schema_site_anp_epg_staticport:
+ <<: *overwrite_static_ports
+ path: eth1/41
+ vlan: 1101
+ register: overwrite_static_ports
+ ignore_errors: true
+
+- name: Verify overwrite static port arguments
+ ansible.builtin.assert:
+ that:
+ - err_overwrite_static_ports is failed
+ - err_overwrite_static_ports.msg == "state is present but all of the following are missing{{":"}} path, vlan."
+ - err_overwrite_static_ports_other is failed
+ - err_overwrite_static_ports_other.msg == "state is present but all of the following are missing{{":"}} pod, leaf."
+ - overwrite_static_ports is changed
+ - overwrite_static_ports.current.0.path == "topology/pod-1/paths-201/pathep-[eth1/41]"
+ - overwrite_static_ports.current.0.portEncapVlan == 1101
+ - overwrite_static_ports.current.0.type == "port"
+
+# CLEAN UP TEST ENVIRONMENT
+
+- name: Remove schemas
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: ansible_test
+ state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_useg_attribute/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_useg_attribute/tasks/main.yml
index 9ba4c846a..889d7e83d 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_useg_attribute/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_anp_epg_useg_attribute/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: "{{ mso_hostname }}"
username: "{{ mso_username }}"
@@ -23,13 +23,13 @@
# Setup Part
- name: Remove schemas
- mso_schema: &ansible_test_schema_absent
+ cisco.mso.mso_schema: &ansible_test_schema_absent
<<: *mso_info
schema: ansible_test
state: absent
- name: Ensure ansible_test tenant absent
- mso_tenant: &ansible_test_tenant_absent
+ cisco.mso.mso_tenant: &ansible_test_tenant_absent
<<: *mso_info
tenant: ansible_test
users:
@@ -37,12 +37,12 @@
state: absent
- name: Ensure ansible_test tenant present
- mso_tenant: &ansible_test_tenant_present
+ cisco.mso.mso_tenant: &ansible_test_tenant_present
<<: *ansible_test_tenant_absent
state: present
- name: Ensure ansible_test schema with ans_test_template exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: ansible_test
tenant: ansible_test
@@ -50,7 +50,7 @@
state: present
- name: Ensure ans_test_anp exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -76,7 +76,7 @@
state: present
- name: Ensure ans_test_epg exist
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -90,7 +90,7 @@
state: present
- name: Ensure ans_test_epg_2 exist without useg_epg
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -103,14 +103,14 @@
state: present
- name: Associate a ansible_test site with a ansible_test tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: ansible_test
state: present
- name: Ensure ansible_test site associated with ansible_test schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: ansible_test
site: ansible_test
@@ -118,7 +118,7 @@
state: present
- name: Add ans_test_epg to the ansible_test site
- mso_schema_site_anp_epg:
+ cisco.mso.mso_schema_site_anp_epg:
<<: *mso_info
site: ansible_test
schema: ansible_test
@@ -137,7 +137,7 @@
# Test Part
# Note: Ignore the below task, which is used to reference the attributes to other tasks
- name: Invalid test - check for missing required attributes error message
- mso_schema_site_anp_epg_useg_attribute: &useg_attribute_present
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute: &useg_attribute_present
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -150,7 +150,7 @@
register: ans_test_uSeg_1_nt
- name: ans_test_uSeg_1 present - attribute_type - ip, useg_subnet - true, without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *mso_info
site: ansible_test
schema: ansible_test
@@ -163,7 +163,7 @@
register: ans_test_uSeg_1
- name: Invalid test - ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_2
attribute_type: ip
@@ -171,70 +171,83 @@
ignore_errors: true
register: ans_test_uSeg_2_nt
+- name: Invalid test - ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - true, with value
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
+ <<: *useg_attribute_present
+ name: ans_test_uSeg_2
+ attribute_type: ip
+ useg_subnet: true
+ value: 1.2.3.4
+ ignore_errors: true
+ register: ans_test_uSeg_2_nt1
+
- name: ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, with value - check mode
- mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_2_cm_present
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_2_cm_present
<<: *useg_attribute_present
name: ans_test_uSeg_2
attribute_type: ip
useg_subnet: false
- value: 11.22.33.44/24
+ value: 11.22.33.44
check_mode: true
register: ans_test_uSeg_2_cm_present
- name: ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, with value - normal mode
- mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_2_nm_present
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_2_nm_present
<<: *ans_test_uSeg_2_cm_present
+ output_level: debug
register: ans_test_uSeg_2_nm_present
- name: ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, with value - normal mode again
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *ans_test_uSeg_2_nm_present
+ output_level: debug
register: ans_test_uSeg_2_nm_present_again
- name: Assertions check for add ans_test_uSeg_1 and ans_test_uSeg_2 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_1 is changed
- ans_test_uSeg_1.current != {}
- ans_test_uSeg_1.current.name == "ans_test_uSeg_1"
- ans_test_uSeg_1.current.type == "ip"
- ans_test_uSeg_1.current.value == "0.0.0.0"
- - ans_test_uSeg_1.current.fvSubnet == false
+ - ans_test_uSeg_1.current.fvSubnet == true
- ans_test_uSeg_1.current.description == "ans_test_uSeg_1"
- ans_test_uSeg_2_nt is not changed
- ans_test_uSeg_2_nt.msg == "useg_subnet is False but all of the following are missing{{':'}} value"
+ - ans_test_uSeg_2_nt1 is not changed
+ - ans_test_uSeg_2_nt1.msg == "The value of uSeg subnet IP should be an empty string or 0.0.0.0, when the useg_subnet is set to true."
- ans_test_uSeg_2_cm_present is changed
- ans_test_uSeg_2_cm_present.current != {}
- ans_test_uSeg_2_cm_present.previous == {}
- ans_test_uSeg_2_cm_present.current.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_cm_present.current.type == "ip"
- - ans_test_uSeg_2_cm_present.current.value == "11.22.33.44/24"
- - ans_test_uSeg_2_cm_present.current.fvSubnet == true
+ - ans_test_uSeg_2_cm_present.current.value == "11.22.33.44"
+ - ans_test_uSeg_2_cm_present.current.fvSubnet == false
- ans_test_uSeg_2_cm_present.current.description == "uSeg Attr object created using Ansible"
- ans_test_uSeg_2_nm_present is changed
- ans_test_uSeg_2_nm_present.current != {}
- ans_test_uSeg_2_nm_present.previous == {}
- ans_test_uSeg_2_nm_present.current.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_nm_present.current.type == "ip"
- - ans_test_uSeg_2_nm_present.current.value == "11.22.33.44/24"
- - ans_test_uSeg_2_nm_present.current.fvSubnet == true
+ - ans_test_uSeg_2_nm_present.current.value == "11.22.33.44"
+ - ans_test_uSeg_2_nm_present.sent.fvSubnet == false
- ans_test_uSeg_2_nm_present.current.description == "uSeg Attr object created using Ansible"
- ans_test_uSeg_2_nm_present_again is not changed
- ans_test_uSeg_2_nm_present_again.current != {}
- ans_test_uSeg_2_nm_present_again.previous != {}
- ans_test_uSeg_2_nm_present_again.current.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_nm_present_again.current.type == "ip"
- - ans_test_uSeg_2_nm_present_again.current.value == "11.22.33.44/24"
- - ans_test_uSeg_2_nm_present_again.current.fvSubnet == true
+ - ans_test_uSeg_2_nm_present_again.current.value == "11.22.33.44"
+ - ans_test_uSeg_2_nm_present_again.sent.fvSubnet == false
- ans_test_uSeg_2_nm_present_again.current.description == "uSeg Attr object created using Ansible"
- ans_test_uSeg_2_nm_present_again.previous.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_nm_present_again.previous.type == "ip"
- - ans_test_uSeg_2_nm_present_again.previous.value == "11.22.33.44/24"
- - ans_test_uSeg_2_nm_present_again.previous.fvSubnet == true
+ - ans_test_uSeg_2_nm_present_again.previous.value == "11.22.33.44"
- ans_test_uSeg_2_nm_present_again.previous.description == "uSeg Attr object created using Ansible"
- name: Invalid test - ans_test_uSeg_3 present - attribute_type - mac and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_3
attribute_type: mac
@@ -242,7 +255,7 @@
register: ans_test_uSeg_3_nt
- name: ans_test_uSeg_3 present - attribute_type - mac and with value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_3
attribute_type: mac
@@ -250,7 +263,7 @@
register: ans_test_uSeg_3
- name: Assertions check for add ans_test_uSeg_3 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_3_nt is not changed
- ans_test_uSeg_3_nt.msg == "Failed due to invalid 'value' and the attribute_type is{{':'}} mac."
@@ -263,7 +276,7 @@
- ans_test_uSeg_3.current.value == "aa:bb:cc:dd:ee:ff"
- name: Invalid test - ans_test_uSeg_4 present - attribute_type - dns and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_4
attribute_type: dns
@@ -271,7 +284,7 @@
register: ans_test_uSeg_4_nt
- name: ans_test_uSeg_4 present - attribute_type - dns and with value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_4
attribute_type: dns
@@ -279,7 +292,7 @@
register: ans_test_uSeg_4
- name: Assertions check for add ans_test_uSeg_4 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_4_nt is not changed
- ans_test_uSeg_4_nt.msg == "Failed due to invalid 'value' and the attribute_type is{{':'}} dns."
@@ -292,7 +305,7 @@
- ans_test_uSeg_4.current.value == "test_dns_value"
- name: Invalid test - ans_test_uSeg_6 present - attribute_type - vm_datacenter and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
attribute_type: vm_datacenter
@@ -301,7 +314,7 @@
register: ans_test_uSeg_6_nt
- name: Invalid test - ans_test_uSeg_6 present - attribute_type - vm_datacenter, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
attribute_type: vm_datacenter
@@ -310,7 +323,7 @@
register: ans_test_uSeg_6_nt1
- name: ans_test_uSeg_6 present - attribute_type - vm_datacenter, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
attribute_type: vm_datacenter
@@ -319,7 +332,7 @@
register: ans_test_uSeg_6
- name: Assertions check for add ans_test_uSeg_6 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_6_nt is not changed
- ans_test_uSeg_6_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_datacenter."
@@ -334,7 +347,7 @@
- ans_test_uSeg_6.current.value == "test_vm_datacenter_value"
- name: Invalid test - ans_test_uSeg_7 present - attribute_type - vm_hypervisor_identifier and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_7
attribute_type: vm_hypervisor_identifier
@@ -343,7 +356,7 @@
register: ans_test_uSeg_7_nt
- name: Invalid test - ans_test_uSeg_7 present - attribute_type - vm_hypervisor_identifier, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_7
attribute_type: vm_hypervisor_identifier
@@ -352,7 +365,7 @@
register: ans_test_uSeg_7_nt1
- name: ans_test_uSeg_7 present - attribute_type - vm_hypervisor_identifier, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_7
attribute_type: vm_hypervisor_identifier
@@ -361,7 +374,7 @@
register: ans_test_uSeg_7
- name: Assertions check for add ans_test_uSeg_7 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_7_nt is not changed
- ans_test_uSeg_7_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_hypervisor_identifier."
@@ -376,7 +389,7 @@
- ans_test_uSeg_7.current.value == "test_vm_hypervisor_identifier_value"
- name: Invalid test - ans_test_uSeg_8 present - attribute_type - vm_operating_system and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_8
attribute_type: vm_operating_system
@@ -385,7 +398,7 @@
register: ans_test_uSeg_8_nt
- name: Invalid test - ans_test_uSeg_8 present - attribute_type - vm_operating_system, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_8
attribute_type: vm_operating_system
@@ -394,7 +407,7 @@
register: ans_test_uSeg_8_nt1
- name: ans_test_uSeg_8 present - attribute_type - vm_operating_system, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_8
attribute_type: vm_operating_system
@@ -403,7 +416,7 @@
register: ans_test_uSeg_8
- name: Assertions check for add ans_test_uSeg_8 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_8_nt is not changed
- ans_test_uSeg_8_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_operating_system."
@@ -418,7 +431,7 @@
- ans_test_uSeg_8.current.value == "test_vm_operating_system_value"
- name: Invalid test - ans_test_uSeg_9 present - attribute_type - vm_tag and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_9
attribute_type: vm_tag
@@ -427,7 +440,7 @@
register: ans_test_uSeg_9_nt
- name: Invalid test - ans_test_uSeg_9 present - attribute_type - vm_tag, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_9
attribute_type: vm_tag
@@ -436,7 +449,7 @@
register: ans_test_uSeg_9_nt1
- name: ans_test_uSeg_9 present - attribute_type - vm_tag, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_9
attribute_type: vm_tag
@@ -445,7 +458,7 @@
register: ans_test_uSeg_9
- name: Assertions check for add ans_test_uSeg_9 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_9_nt is not changed
- ans_test_uSeg_9_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_tag."
@@ -460,7 +473,7 @@
- ans_test_uSeg_9.current.value == "test_vm_tag_value"
- name: Invalid test - ans_test_uSeg_10 present - attribute_type - vm_identifier and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_10
attribute_type: vm_identifier
@@ -469,7 +482,7 @@
register: ans_test_uSeg_10_nt
- name: Invalid test - ans_test_uSeg_10 present - attribute_type - vm_identifier, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_10
attribute_type: vm_identifier
@@ -478,7 +491,7 @@
register: ans_test_uSeg_10_nt1
- name: ans_test_uSeg_10 present - attribute_type - vm_identifier, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_10
attribute_type: vm_identifier
@@ -487,7 +500,7 @@
register: ans_test_uSeg_10
- name: Assertions check for add ans_test_uSeg_10 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_10_nt is not changed
- ans_test_uSeg_10_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_identifier."
@@ -502,7 +515,7 @@
- ans_test_uSeg_10.current.value == "test_vm_identifier_value"
- name: Invalid test - ans_test_uSeg_11 present - attribute_type - vmm_domain and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_11
attribute_type: vmm_domain
@@ -511,7 +524,7 @@
register: ans_test_uSeg_11_nt
- name: Invalid test - ans_test_uSeg_11 present - attribute_type - vmm_domain, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_11
attribute_type: vmm_domain
@@ -520,7 +533,7 @@
register: ans_test_uSeg_11_nt1
- name: ans_test_uSeg_11 present - attribute_type - vmm_domain, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_11
attribute_type: vmm_domain
@@ -529,7 +542,7 @@
register: ans_test_uSeg_11
- name: Assertions check for add ans_test_uSeg_11 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_11_nt is not changed
- ans_test_uSeg_11_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vmm_domain."
@@ -544,7 +557,7 @@
- ans_test_uSeg_11.current.value == "test_vmm_domain_value"
- name: Invalid test - ans_test_uSeg_12 present - attribute_type - vm_name and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_12
attribute_type: vm_name
@@ -553,7 +566,7 @@
register: ans_test_uSeg_12_nt
- name: Invalid test - ans_test_uSeg_12 present - attribute_type - vm_name, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_12
attribute_type: vm_name
@@ -562,7 +575,7 @@
register: ans_test_uSeg_12_nt1
- name: ans_test_uSeg_12 present - attribute_type - vm_name, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_12
attribute_type: vm_name
@@ -571,7 +584,7 @@
register: ans_test_uSeg_12
- name: Assertions check for add ans_test_uSeg_12 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_12_nt is not changed
- ans_test_uSeg_12_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_name."
@@ -586,7 +599,7 @@
- ans_test_uSeg_12.current.value == "test_vm_value"
- name: Invalid test - ans_test_uSeg_13 present - attribute_type - vnic_dn and without operator
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_13
attribute_type: vnic_dn
@@ -595,7 +608,7 @@
register: ans_test_uSeg_13_nt
- name: Invalid test - ans_test_uSeg_13 present - attribute_type - vnic_dn, operator - equals and without value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_13
attribute_type: vnic_dn
@@ -604,7 +617,7 @@
register: ans_test_uSeg_13_nt1
- name: ans_test_uSeg_13 present - attribute_type - vnic_dn, operator - equals and value
- mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_13_present
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_13_present
<<: *useg_attribute_present
name: ans_test_uSeg_13
attribute_type: vnic_dn
@@ -613,7 +626,7 @@
register: ans_test_uSeg_13
- name: Assertions check for add ans_test_uSeg_12 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_13_nt is not changed
- ans_test_uSeg_13_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vnic_dn."
@@ -629,7 +642,7 @@
# Query Part
- name: Invalid test - Query an uSeg Attr with name - invalid_useg_attr
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: invalid_useg_attr
state: query
@@ -637,20 +650,20 @@
ignore_errors: true
- name: Query an uSeg Attr with name - ans_test_uSeg_1
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
state: query
register: query_a_useg_6
- name: Query all uSeg Attrs
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
state: query
register: query_all_useg_objects
- name: Assertions check for query uSeg Attr objects
- assert:
+ ansible.builtin.assert:
that:
- invalid_useg_attr is not changed
- invalid_useg_attr.msg == "The uSeg Attribute{{':'}} invalid_useg_attr not found."
@@ -664,21 +677,21 @@
# Update Part
- name: Update ans_test_uSeg_13 object description and value
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *ans_test_uSeg_13_present
description: "ans_test_uSeg_13 updated!"
value: test_vnic_dn_value_updated
register: ans_test_uSeg_13_update
- name: Query an uSeg Attr with name - ans_test_uSeg_13 to check the updated changes
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_13
state: query
register: query_a_useg_object_with_name
- name: Assertions check for update ans_test_uSeg_13 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_13_update is changed
- ans_test_uSeg_13_update.current != {}
@@ -700,7 +713,7 @@
# Cleanup Part
- name: ans_test_uSeg_1 absent with check mode
- mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_1_cm_absent
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_1_cm_absent
<<: *useg_attribute_present
name: ans_test_uSeg_1
state: absent
@@ -708,17 +721,17 @@
register: ans_test_uSeg_1_cm_absent
- name: ans_test_uSeg_1 absent with normal mode
- mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_1_nm_absent
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute: &ans_test_uSeg_1_nm_absent
<<: *ans_test_uSeg_1_cm_absent
register: ans_test_uSeg_1_nm_absent
- name: ans_test_uSeg_1 absent with normal mode again
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *ans_test_uSeg_1_nm_absent
register: ans_test_uSeg_1_nm_absent_again
- name: Assertions check for ans_test_uSeg_1 absent
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_1_cm_absent is changed
- ans_test_uSeg_1_cm_absent.current == {}
@@ -731,7 +744,7 @@
- ans_test_uSeg_1_nm_absent_again.previous == {}
- name: Query all uSeg Attrs - invalid template name
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
template: ans_test_template_123
state: query
@@ -739,7 +752,7 @@
register: query_invalid_template
- name: Query all uSeg Attrs - invalid Application Profile name
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
anp: ans_test_anp_123
state: query
@@ -747,7 +760,7 @@
register: query_invalid_ap
- name: Query all uSeg Attrs - invalid EPG name
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
epg: ans_test_epg_123
state: query
@@ -755,7 +768,7 @@
register: query_invalid_epg
- name: Invalid test - ans_test_anp_123 present under ans_test_epg_2
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
epg: ans_test_epg_2
name: ans_test_anp_123
@@ -765,7 +778,7 @@
register: ans_test_epg_2_nt
- name: Assertions check for invalid inputs
- assert:
+ ansible.builtin.assert:
that:
- query_invalid_template is not changed
- query_invalid_template.msg is match("Provided template 'ans_test_template_123' not matching existing template.+")
@@ -786,27 +799,25 @@
state: undeploy
- name: Remove ansible_test schema to delete all uSeg Attr objects
- mso_schema:
+ cisco.mso.mso_schema:
<<: *ansible_test_schema_absent
schema: ansible_test
state: absent
# To check all uSeg Attrs removed from the machine
- name: Query all uSeg Attrs - Cleanup Part
- mso_schema_site_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_site_anp_epg_useg_attribute:
<<: *useg_attribute_present
state: query
ignore_errors: true
register: query_useg_absent_check
- name: Assertions check for query all uSeg Attrs - Cleanup Part
- assert:
+ ansible.builtin.assert:
that:
- query_useg_absent_check is not changed
- query_useg_absent_check.current == {}
- name: Remove ansible_test tenant
- mso_tenant:
- <<: *ansible_test_tenant_present
- state: absent
- <<: *mso_info
+ cisco.mso.mso_tenant:
+ <<: *ansible_test_tenant_absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd/tasks/main.yml
index a7de528ea..c7770dfb6 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd/tasks/main.yml
@@ -7,13 +7,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -24,13 +24,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -42,7 +42,7 @@
ignore_errors: true
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -51,7 +51,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -62,7 +62,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -72,7 +72,7 @@
state: present
- name: Ensure schema 1 with Template 1, and Template 2, Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -84,7 +84,7 @@
- { template: Template 3}
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -92,7 +92,7 @@
state: present
- name: Add physical site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -103,7 +103,7 @@
- { template: Template 2}
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -112,7 +112,7 @@
state: present
- name: Ensure ansible_test_1 BD does not exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -122,7 +122,7 @@
state: absent
- name: Add template BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -133,7 +133,7 @@
register: nm_add_bd
- name: Verify nm_add_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd is changed
- nm_add_bd.previous == {}
@@ -142,7 +142,7 @@
- nm_add_bd.current.vrfRef.vrfName == "VRF1"
- name: Add template BD 2
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -154,7 +154,7 @@
register: nm_add_bd_2
- name: Verify nm_add_bd_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_2 is changed
- nm_add_bd_2.previous == {}
@@ -163,7 +163,7 @@
- nm_add_bd_2.current.vrfRef.vrfName == "VRF1"
- name: Add template BD 3
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -175,7 +175,7 @@
register: nm_add_bd_3
- name: Verify nm_add_bd_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_3 is changed
- nm_add_bd_3.previous == {}
@@ -184,7 +184,7 @@
- nm_add_bd_3.current.vrfRef.vrfName == "VRF1"
- name: Add template BD 4
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -196,7 +196,7 @@
register: nm_add_bd_4
- name: Verify nm_add_bd_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_4 is changed
- nm_add_bd_4.previous == {}
@@ -205,7 +205,7 @@
- nm_add_bd_4.current.vrfRef.vrfName == "VRF1"
- name: Add site BD (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -216,21 +216,21 @@
register: cm_add_site_bd
- name: Verify cm_add_site_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_bd.current.bdRef.bdName == "ansible_test_1"
- cm_add_site_bd.current.bdRef.templateName == "Template1"
- cm_add_site_bd.current.hostBasedRouting == false
- name: Verify cm_add_site_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_bd is changed
- cm_add_site_bd.previous == {}
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Add site BD (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -240,7 +240,7 @@
register: nm_add_site_bd
- name: Verify nm_add_site_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd.current.bdRef.bdName == "ansible_test_1"
- nm_add_site_bd.current.bdRef.templateName == "Template1"
@@ -248,14 +248,14 @@
- cm_add_site_bd.current.bdRef.schemaId == nm_add_site_bd.current.bdRef.schemaId
- name: Verify nm_add_site_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd is changed
- nm_add_site_bd.previous == {}
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Add site BD again (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -266,7 +266,7 @@
register: cm_add_site_bd_again
- name: Add site BD again (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -276,14 +276,14 @@
register: nm_add_site_bd_again
- name: Verify cm_add_site_bd_again and nm_add_site_bd_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_bd_again is not changed
- nm_add_site_bd_again is not changed
- cm_add_site_bd_again.previous.bdRef.bdName == nm_add_site_bd_again.previous.bdRef.bdName == cm_add_site_bd_again.current.bdRef.bdName == nm_add_site_bd_again.current.bdRef.bdName == "ansible_test_1"
- name: Change site BD (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -295,7 +295,7 @@
register: cm_change_site_bd
- name: Change site BD (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -306,7 +306,7 @@
register: nm_change_site_bd
- name: Verify cm_change_site_bd and nm_change_site_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_change_site_bd is changed
- nm_change_site_bd is changed
@@ -318,7 +318,7 @@
- nm_change_site_bd.current.hostBasedRouting == true
- name: Add site BD with host_route (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -330,7 +330,7 @@
register: cm_add_site_bd_with_host_route
- name: Add site BD with host_route (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -341,7 +341,7 @@
register: nm_add_site_bd_with_host_route
- name: Verify cm_add_site_bd_with_host_route and nm_add_site_bd_with_host_route
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_bd_with_host_route is changed
- nm_add_site_bd_with_host_route is changed
@@ -349,14 +349,14 @@
- nm_add_site_bd_with_host_route.current.hostBasedRouting == true
- name: Verify cm_add_site_bd_with_host_route and nm_add_site_bd_with_host_route
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_bd_with_host_route.previous == {}
- nm_add_site_bd_with_host_route.previous == {}
when: version.current.version is version('4.0', '<') # already present when template is defined, thus previous exists
- name: Add site BD 3 (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -367,7 +367,7 @@
register: nm_add_site_bd_3
- name: Verify nm_add_site_bd_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_3 is changed
- nm_add_site_bd_3.current.hostBasedRouting == true
@@ -375,13 +375,13 @@
- nm_add_site_bd_3.current.bdRef.templateName == "Template1"
- name: Verify nm_add_site_bd_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_3.previous == {}
when: version.current.version is version('4.0', '<') # already be present when template is defined, thus previous exists
- name: Add site BD 4 (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -392,7 +392,7 @@
register: nm_add_site_bd_4
- name: Verify nm_add_site_bd_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_4 is changed
- nm_add_site_bd_4.current.mac == "00:22:23:F1:21:F9"
@@ -400,13 +400,13 @@
- nm_add_site_bd_4.current.bdRef.templateName == "Template1"
- name: Verify nm_add_site_bd_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_4.previous == {}
when: version.current.version is version('4.0', '<') # already be present when template is defined, thus previous exists
- name: Query a specific BD (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -417,7 +417,7 @@
register: cm_query_bd_2
- name: Query a specific BD (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -427,7 +427,7 @@
register: nm_query_bd_2
- name: Verify cm_query_bd_2 and nm_query_bd_2
- assert:
+ ansible.builtin.assert:
that:
- cm_query_bd_2 is not changed
- nm_query_bd_2 is not changed
@@ -437,7 +437,7 @@
- cm_query_bd_2.current.hostBasedRouting == nm_query_bd_2.current.hostBasedRouting == true
- name: Query all BDs (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -447,7 +447,7 @@
register: cm_query_all_bd
- name: Query all BDs (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -456,7 +456,7 @@
register: nm_query_all_bd
- name: Verify cm_query_all_bd and cm_query_all_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_bd is not changed
- nm_query_all_bd is not changed
@@ -468,7 +468,7 @@
- cm_query_all_bd.current[1].bdRef.templateName == nm_query_all_bd.current[1].bdRef.templateName == "Template1"
- name: Remove BD 2 (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -479,7 +479,7 @@
register: cm_remove_site_bd_2
- name: Remove BD 2 (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -489,7 +489,7 @@
register: nm_remove_site_bd_2
- name: Verify cm_remove_site_bd_2 and nm_remove_site_bd_2
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_site_bd_2 is changed
- nm_remove_site_bd_2 is changed
@@ -499,7 +499,7 @@
- cm_remove_site_bd_2.current == nm_remove_site_bd_2.current == {}
- name: Remove BD 2 again(normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -509,14 +509,14 @@
register: nm_remove_site_bd_2_again
- name: Verify nm_remove_site_bd_2_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_site_bd_2_again is not changed
- nm_remove_site_bd_2_again.previous == nm_remove_site_bd_2_again.current == {}
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Query site without BD (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -525,7 +525,7 @@
register: nm_query_without_bd
- name: Verify nm_query_without_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_query_without_bd is not changed
- nm_query_without_bd.current == []
@@ -534,7 +534,7 @@
# QUERY NON-EXISTING BD
- name: Query non-existing BD (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -546,7 +546,7 @@
register: cm_query_non_bd
- name: Query non-existing BD (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -557,7 +557,7 @@
register: nm_query_non_bd
- name: Verify cm_query_non_bd and nm_query_non_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_bd is not changed
- nm_query_non_bd is not changed
@@ -565,7 +565,7 @@
# USE NON-EXISTING STATE
- name: non_existing_state state (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -576,7 +576,7 @@
register: cm_non_existing_state
- name: non_existing_state state (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -587,7 +587,7 @@
register: nm_non_existing_state
- name: Verify cm_non_existing_state and nm_non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -595,7 +595,7 @@
# USE A NON_EXISTING_TEMPLATE
- name: non_existing_template (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -607,7 +607,7 @@
register: cm_non_existing_template
- name: non_existing_template (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -618,7 +618,7 @@
register: nm_non_existing_template
- name: Verify cm_non_existing_template and nm_non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -626,7 +626,7 @@
# USE A NON_EXISTING_SCHEMA
- name: non_existing_schema (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -638,7 +638,7 @@
register: cm_non_existing_schema
- name: non_existing_schema (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -649,7 +649,7 @@
register: nm_non_existing_schema
- name: Verify cm_non_existing_schema and nm_non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -657,7 +657,7 @@
# USE A NON_EXISTING_SITE
- name: non_existing_site (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non_existing_site
@@ -669,7 +669,7 @@
register: cm_non_existing_site
- name: non_existing_site (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non_existing_site
@@ -680,7 +680,7 @@
register: nm_non_existing_site
- name: Verify cm_non_existing_site and nm_non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site is not changed
- nm_non_existing_site is not changed
@@ -688,7 +688,7 @@
# USE A NON_EXISTING_SITE_TEMPLATE
- name: non_existing_site_template (check_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -700,7 +700,7 @@
register: cm_non_existing_site_template
- name: non_existing_site_template (normal_mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -711,7 +711,7 @@
register: nm_non_existing_site_template
- name: Verify cm_non_existing_site_template and nm_non_existing_site_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site_template is not changed
- nm_non_existing_site_template is not changed
@@ -719,7 +719,7 @@
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site BD to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -731,7 +731,7 @@
register: cm_no_site_associated
- name: Add site BD to Template 3 without any site associated (normal mode)
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -742,7 +742,7 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_l3out/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_l3out/tasks/main.yml
index 1e1914522..aaaf61b2f 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_l3out/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_l3out/tasks/main.yml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,13 +22,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -38,7 +38,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -49,7 +49,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -60,7 +60,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -70,7 +70,7 @@
state: present
- name: Ensure schema with Template1 and Template2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -81,7 +81,7 @@
- { template: Template2}
- name: Ensure schema 2 with Template3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -89,7 +89,7 @@
state: present
- name: Add physical site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -97,7 +97,7 @@
state: present
- name: Add physical site to a schema2
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -105,7 +105,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -113,7 +113,7 @@
state: present
- name: Ensure VRF2 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -121,7 +121,7 @@
state: present
- name: Ensure VRF3 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template3
@@ -129,7 +129,7 @@
state: present
- name: Add template BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -140,7 +140,7 @@
register: nm_add_bd
- name: Verify nm_add_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd is changed
- nm_add_bd.previous == {}
@@ -149,7 +149,7 @@
- nm_add_bd.current.vrfRef.vrfName == "VRF1"
- name: Add a new L3out
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -160,7 +160,7 @@
register: nm_add_l3out
- name: Add a new L3out2 in different template
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -171,7 +171,7 @@
register: nm_add_l3out
- name: Add a new L3out3 in different schema
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template3
@@ -182,13 +182,13 @@
register: nm_add_l3out
- name: Verify nm_add_l3out
- assert:
+ ansible.builtin.assert:
that:
- nm_add_l3out is changed
- nm_add_l3out.previous == {}
- name: Add BD to site
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -198,21 +198,21 @@
register: nm_add_site_bd
- name: Verify nm_add_site_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd.current.bdRef.bdName == "ansible_test_1"
- nm_add_site_bd.current.bdRef.templateName == "Template1"
- nm_add_site_bd.current.hostBasedRouting == false
- name: Verify nm_add_site_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd is changed
- nm_add_site_bd.previous == {}
when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
- name: Add l3out to BD Site
- mso_schema_site_bd_l3out: &site_bd_l3out_again
+ cisco.mso.mso_schema_site_bd_l3out: &site_bd_l3out_again
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -224,12 +224,12 @@
register: nm_bd_site_l3out
- name: Add l3out to BD Site again
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *site_bd_l3out_again
register: nm_bd_site_l3out_again
- name: Verify nm_bd_site_l3out
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_site_l3out is changed
- nm_bd_site_l3out.previous == {}
@@ -237,7 +237,7 @@
- nm_bd_site_l3out_again is not changed
- name: Query a specific BD site l3out
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -249,13 +249,13 @@
register: query_result
- name: Verify query_result
- assert:
+ ansible.builtin.assert:
that:
- query_result is not changed
- nm_bd_site_l3out.current.l3outName == "L3out1"
- name: Add l3out2 from different template to BD Site
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -268,7 +268,7 @@
register: nm_bd_site_l3out2
- name: Add l3out3 from different schema to BD Site
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -282,7 +282,7 @@
register: nm_bd_site_l3out3
- name: Verify nm_bd_site_l3out2 and nm_bd_site_l3out3
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_site_l3out2 is changed
- nm_bd_site_l3out2.previous == {}
@@ -292,7 +292,7 @@
- nm_bd_site_l3out3.current.l3outName == "L3out3"
- name: Query all BD site l3outs
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -302,7 +302,7 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current.0.l3outName == "L3out1"
@@ -311,7 +311,7 @@
# Checking error conditions
- name: Use non_existing template
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -324,7 +324,7 @@
register: non_existing_template
- name: Use non_existing BD
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -335,7 +335,7 @@
register: non_existing_bd
- name: Query non_existing BD site L3out
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -348,7 +348,7 @@
register: non_existing_l3out
- name: Verify error query
- assert:
+ ansible.builtin.assert:
that:
- non_existing_template is not changed
- non_existing_template.msg == "Provided template 'non_existing_template' not matching existing template(s){{':'}} Template1, Template2"
@@ -359,7 +359,7 @@
# Check addition of l3out to Site BD without adding BD to site
- name: Remove l3out from BD Site
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -371,14 +371,14 @@
register: remove_bd_site_l3out
- name: Verify remove_bd_site_l3out
- assert:
+ ansible.builtin.assert:
that:
- remove_bd_site_l3out is changed
- remove_bd_site_l3out.previous.l3outName == "L3out1"
- remove_bd_site_l3out.current == {}
- name: Remove BD from site
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -388,7 +388,7 @@
register: nm_remove_site_bd
- name: Verify nm_remove_site_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_site_bd is changed
- nm_remove_site_bd.previous.bdRef.bdName == "ansible_test_1"
@@ -396,7 +396,7 @@
- nm_remove_site_bd.current == {}
- name: Remove template BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -405,13 +405,13 @@
register: nm_remove_bd
- name: Verify nm_remove_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_bd is changed
- nm_remove_bd.current == {}
- name: Add new template BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -422,13 +422,13 @@
register: nm_add_bd_template
- name: Verify nm_add_bd_template
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_template is changed
- nm_add_bd_template.previous == {}
- name: Add a new l3 out to BD (BD not associated to Site)
- mso_schema_site_bd_l3out:
+ cisco.mso.mso_schema_site_bd_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -440,7 +440,7 @@
register: add_bd_site_l3out
- name: Verify add_bd_site_l3out
- assert:
+ ansible.builtin.assert:
that:
- add_bd_site_l3out is changed
- add_bd_site_l3out.previous == {}
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_subnet/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_subnet/tasks/main.yml
index 1f6f94c02..9da901308 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_bd_subnet/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,13 +21,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -36,7 +36,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -47,7 +47,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -58,7 +58,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -68,7 +68,7 @@
state: present
- name: Ensure schema 1 with Template1, Template2, Template4 and Template5
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -81,7 +81,7 @@
- Template5
- name: Ensure schema 2 with Template3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -89,7 +89,7 @@
state: present
- name: Add physical site to templates
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -101,7 +101,7 @@
- Template5
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -110,7 +110,7 @@
state: present
- name: Add template BD to Template1 for create in site subnet
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -123,7 +123,7 @@
state: present
- name: Add template BD to Template3
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template3
@@ -136,7 +136,7 @@
register: nm_add_bd_template_3
- name: Add template BD to Template2
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -149,7 +149,7 @@
register: nm_add_bd_template_2
- name: Add template BD to Template4
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template4
@@ -162,7 +162,7 @@
register: nm_add_bd_template_4
- name: Add template BD to Template1 without disabling layer2_stretch
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -173,7 +173,7 @@
register: nm_add_bd
- name: Add site BD
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -183,7 +183,7 @@
register: nm_add_site_bd
- name: Add site BD subnet with layer2_stretch enabled
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -195,12 +195,12 @@
register: add_site_bd_subnet_with_l2Stretch_enabled
- name: Verify add_site_bd_subnet_with_l2Stretch_enabled
- assert:
+ ansible.builtin.assert:
that:
- add_site_bd_subnet_with_l2Stretch_enabled.msg == "The l2Stretch of template bd should be false in order to create a site bd subnet. Set l2Stretch as false using mso_schema_template_bd"
- name: Disable layer2_stretch in template BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -212,7 +212,7 @@
register: nm_add_bd
- name: Add site BD subnet with layer2_stretch disabled (check_mode)
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -224,7 +224,7 @@
register: cm_add_site_bd_subnet
- name: Verify cm_add_site_bd_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_bd_subnet is changed
- cm_add_site_bd_subnet.previous == {}
@@ -236,7 +236,7 @@
- cm_add_site_bd_subnet.current.querier == False
- name: Add site BD subnet with layer2_stretch disabled (normal_mode)
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -247,7 +247,7 @@
register: nm_add_site_bd_subnet
- name: Verify nm_add_site_bd_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_subnet is changed
- nm_add_site_bd_subnet.previous == {}
@@ -259,7 +259,7 @@
- nm_add_site_bd_subnet.current.querier == False
- name: Add site BD subnet again
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -270,12 +270,12 @@
register: nm_add_site_bd_subnet_again
- name: Verify nm_add_site_bd_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_subnet_again is not changed
- name: Add another site BD subnet
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -291,7 +291,7 @@
register: nm_add_another_site_bd_subnet
- name: Verify nm_add_another_site_bd_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_add_another_site_bd_subnet is changed
- nm_add_another_site_bd_subnet.previous == {}
@@ -302,7 +302,7 @@
- nm_add_another_site_bd_subnet.current.querier == true
- name: Add BD ansible_test_5 to Schema1, template5
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template5
@@ -315,7 +315,7 @@
state: present
- name: Add site BD5
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -324,7 +324,7 @@
state: present
- name: Add site BD5 subnet with layer2_stretch disabled (normal_mode)
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -341,7 +341,7 @@
register: nm_add_site_bd_subnet5
- name: Verify nm_add_site_bd_subnet5 for a version that's < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_subnet5 is changed
- nm_add_site_bd_subnet5.previous == {}
@@ -354,7 +354,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_add_site_bd_subnet5 for a version that's >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_subnet5 is changed
- nm_add_site_bd_subnet5.previous == {}
@@ -368,13 +368,13 @@
when: version.current.version is version('3.1.1g', '>=')
- name: Verify nm_add_site_bd_subnet5 for a version that's >= 3.1.1h
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_subnet5.current.primary == True
when: version.current.version is version('3.1.1h', '>=')
- name: Add site BD subnet with non existing site bd (normal_mode)
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -385,7 +385,7 @@
register: nm_add_site_bd_subnet_and_site_bd
- name: Verify nm_add_site_bd_subnet_and_site_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_subnet_and_site_bd is changed
- nm_add_site_bd_subnet_and_site_bd.previous == {}
@@ -397,7 +397,7 @@
- nm_add_site_bd_subnet_and_site_bd.current.querier == False
- name: Query site bd
- mso_schema_site_bd:
+ cisco.mso.mso_schema_site_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -407,12 +407,12 @@
register: query_site_bd
- name: Verify query_site_bd
- assert:
+ ansible.builtin.assert:
that:
- query_site_bd.current.bdRef.bdName == "ansible_test_site_bd_from_subnet"
- name: Add site BD subnet with now existing site bd again (normal_mode)
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -423,12 +423,12 @@
register: nm_add_site_bd_subnet_and_site_bd_again
- name: Verify nm_add_site_bd_subnet_and_site_bd_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_bd_subnet_and_site_bd_again is not changed
- name: Query all subnets
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -438,7 +438,7 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length == 2
@@ -446,7 +446,7 @@
- query_all.current.1.ip == "10.10.10.1/16"
- name: Query a specific site BD subnet
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -457,13 +457,13 @@
register: query_subnet
- name: Verify query_subnet
- assert:
+ ansible.builtin.assert:
that:
- query_subnet is not changed
- query_subnet.current.ip == "10.1.0.1/16"
- name: Query a specific site BD5 subnet
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -474,14 +474,14 @@
register: query_subnet5
- name: Verify query_subnet5 for version before 3.1
- assert:
+ ansible.builtin.assert:
that:
- query_subnet5 is not changed
- query_subnet5.current.ip == "10.1.0.5/16"
when: version.current.version is version('3.1.1g', '<')
- name: Verify query_subnet5 for 3.1 version and later
- assert:
+ ansible.builtin.assert:
that:
- query_subnet5 is not changed
- query_subnet5.current.ip == "10.1.0.5/16"
@@ -489,13 +489,13 @@
when: version.current.version is version('3.1.1g', '>=')
- name: Verify query_subnet5 for 3.1.1h version and later
- assert:
+ ansible.builtin.assert:
that:
- query_subnet5.current.primary == true
when: version.current.version is version('3.1.1h', '>=')
- name: Remove a site BD subnet
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -506,14 +506,14 @@
register: rm_subnet
- name: Verify rm_subnet
- assert:
+ ansible.builtin.assert:
that:
- rm_subnet is changed
- rm_subnet.current == {}
- rm_subnet.previous.ip == "10.1.0.1/16"
- name: Remove the site BD subnet again
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -524,13 +524,13 @@
register: rm_subnet_again
- name: Verify rm_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- rm_subnet_again is not changed
- rm_subnet_again.previous == rm_subnet_again.current == {}
- name: Remove a site BD 5 subnet
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -541,7 +541,7 @@
register: rm_subnet5
- name: Verify rm_subnet5
- assert:
+ ansible.builtin.assert:
that:
- rm_subnet5 is changed
- rm_subnet5.current == {}
@@ -549,7 +549,7 @@
# Use non_existing_schema
- name: Query subnet by non_existing_schema
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -561,13 +561,13 @@
register: non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
# Use non_existing_template
- name: Query subnet by non_existing_template
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -579,13 +579,13 @@
register: non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- non_existing_template.msg == "Provided template 'non_existing_template' not matching existing template(s){{':'}} Template1, Template2, Template4, Template5"
# Use non_existing_template_bd
- name: Query subnet by non_existing_template_bd
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -597,13 +597,13 @@
register: non_existing_template_bd
- name: Verify non_existing_template_bd
- assert:
+ ansible.builtin.assert:
that:
- non_existing_template_bd.msg == "Provided BD 'non_existing_template_bd' not matching existing bd(s){{':'}} ansible_test_site_bd_from_subnet, ansible_test_1"
# Use template without site associated
- name: Query with no site associated to template
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -615,13 +615,13 @@
register: template_without_sites
- name: Verify template_without_sites
- assert:
+ ansible.builtin.assert:
that:
- template_without_sites.msg == "No sites associated with schema 'ansible_test_2'. Associate the site with the schema using (M) mso_schema_site."
# Use non_existing_subnet
- name: Query with non_existing_subnet
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -633,13 +633,13 @@
register: non_existing_subnet
- name: Verify non_existing_subnet
- assert:
+ ansible.builtin.assert:
that:
- non_existing_subnet.msg.startswith("Provided subnet 'non_existing_subnet' not matching existing site bd subnet(s){{':'}}")
# Use non_existing_site_template_association
- name: Query with non_existing_site_template_association
- mso_schema_site_bd_subnet:
+ cisco.mso.mso_schema_site_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -651,12 +651,12 @@
register: non_existing_site_template_association
- name: Verify non_existing_site_template_association
- assert:
+ ansible.builtin.assert:
that:
- non_existing_site_template_association.msg == "Provided site 'ansible_test' not associated with template 'Template4'. Site is currently associated with template(s){{':'}} Template1, Template2, Template5"
- name: Remove schemas for next ci test case
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/aliases b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/aliases
new file mode 100644
index 000000000..5042c9c09
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/aliases
@@ -0,0 +1,2 @@
+# No ACI MultiSite infrastructure, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/l4_l7_devices.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/l4_l7_devices.yml
new file mode 100644
index 000000000..e7bacfa91
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/l4_l7_devices.yml
@@ -0,0 +1,312 @@
+# Test code for the MSO modules
+# Copyright: (c) 2024, Sabari Jaganathan (@sajagana) <sajagana@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI MultiSite host, username and password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
+ when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
+
+# CLEAN ENVIRONMENT
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: "{{ apic_validate_certs | default(false) }}"
+ use_ssl: "{{ apic_use_ssl | default(true) }}"
+ use_proxy: "{{ apic_use_proxy | default(true) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: aci_version
+
+- name: Remove an existing tenant on APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ name: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
+
+- name: Add a tenant on APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ name: '{{ mso_tenant | default("ansible_test") }}'
+
+# Site type checking for L4-L7 Device configuration
+# QUERY OBJECTS
+- name: Query cloud provider object
+ cisco.aci.aci_cloud_provider:
+ <<: *aci_info
+ state: query
+ register: query_cloud
+ when: aci_version.current.0.topSystem.attributes.version is version('4.1', '>=')
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ query_cloud:
+ current: []
+ when: aci_version.current.0.topSystem.attributes.version is version('4.1', '<')
+
+- name: Verify query_cloud for all sites
+ ansible.builtin.assert:
+ that:
+ - query_cloud is not changed
+
+- name: Verify query_cloud for Cloud Sites
+ ansible.builtin.assert:
+ that:
+ - query_cloud is not changed
+ - query_cloud.current.0.cloudProvP.attributes.environment == "public-cloud"
+ - '"vendor" in query_cloud.current.0.cloudProvP.attributes'
+ when:
+ - query_cloud.current | length > 0 # This condition will execute only cloud sites
+
+# Cloud Site block
+- name: Execute tasks only for cloud sites
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+ block:
+ - name: Add azure_vrf to the {{ mso_tenant | default("ansible_test") }}
+ cisco.aci.aci_vrf:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ vrf: azure_vrf
+
+ - name: Add azure_ctxprof to the {{ mso_tenant | default("ansible_test") }}
+ cisco.aci.aci_cloud_ctx_profile:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ cloud: azure
+ name: azure_ctxprof
+ vrf: azure_vrf
+ region: westus2
+ primary_cidr: "1.1.1.2/32"
+ state: present
+
+ - name: Add the subnet to the azure_ctxprof
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: api/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32].json
+ method: post
+ content:
+ cloudSubnet:
+ attributes:
+ ip: 1.1.1.2/32
+ name: azure_ctxprof_cidr
+ children:
+ - cloudRsZoneAttach:
+ attributes:
+ tDn: "uni/clouddomp/provp-azure/region-westus2/zone-default"
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_adc device - ThirdParty_LB
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/cld-{{ mso_tenant | default("ansible_test") }}_adc.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ targetMode: unspecified
+ name: '{{ mso_tenant | default("ansible_test") }}_adc'
+ svcType: ADC
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-{{ mso_tenant | default("ansible_test") }}/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_LB_Inf
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_LB_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_firewall1 device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/cld-{{ mso_tenant | default("ansible_test") }}_firewall1.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ svcType: FW
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-{{ mso_tenant | default("ansible_test") }}/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_FW_Inf1
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_FW_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_firewall2 device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/cld-{{ mso_tenant | default("ansible_test") }}_firewall2.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_firewall2'
+ svcType: FW
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-{{ mso_tenant | default("ansible_test") }}/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_FW_Inf2
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_FW_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_other device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_other.json
+ method: post
+ content:
+ cloudLB:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_other'
+ type: network
+ children:
+ - cloudRsLDevToCloudSubnet:
+ attributes:
+ tDn: 'uni/tn-{{ mso_tenant | default("ansible_test") }}/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32]'
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_app_lb device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_app_lb.json
+ method: post
+ content:
+ cloudLB:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_app_lb'
+ type: application
+ children:
+ - cloudRsLDevToCloudSubnet:
+ attributes:
+ tDn: 'uni/tn-{{ mso_tenant | default("ansible_test") }}/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32]'
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current | length == 0 # Non-Cloud Site block
+ block:
+ - name: Remove the redirect_policy2 from the common tenant - setup part
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: "/api/node/mo/uni/tn-common/svcCont.json"
+ method: post
+ content:
+ vnsSvcRedirectPol:
+ attributes:
+ name: redirect_policy2
+ status: deleted
+
+ - name: Remove ansible_tenant from the APIC - setup part
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
+
+ - name: Add ansible_tenant to the APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: present
+
+ - name: Add devices and cluster interfaces to the ansible_tenant
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: "/api/node/mo/uni/tn-{{ item.tenant }}.json"
+ method: post
+ content:
+ vnsLDevVip:
+ attributes:
+ svcType: "{{ item.type }}"
+ managed: "false"
+ name: "{{ item.name }}"
+ children:
+ - vnsCDev:
+ attributes:
+ name: "{{ item.name }}"
+ children:
+ - vnsCIf:
+ attributes:
+ name: "{{ item.concrete_interface }}"
+ children:
+ - vnsRsCIfPathAtt:
+ attributes:
+ tDn: "topology/pod-1/paths-101/pathep-[eth1/1]"
+ - vnsLIf:
+ attributes:
+ name: "{{ item.cluster_interface }}"
+ children:
+ - vnsRsCIfAttN:
+ attributes:
+ tDn: "uni/tn-{{ item.tenant }}/lDevVip-{{ item.name }}/cDev-{{ item.name }}/cIf-[{{ item.concrete_interface }}]"
+ - vnsLIf:
+ attributes:
+ name: "{{ item.cluster_interface }}_2"
+ children:
+ - vnsRsCIfAttN:
+ attributes:
+ tDn: "uni/tn-{{ item.tenant }}/lDevVip-{{ item.name }}/cDev-{{ item.name }}/cIf-[{{ item.concrete_interface }}]"
+
+ loop:
+ - {
+ tenant: '{{ mso_tenant | default("ansible_test") }}',
+ type: FW,
+ name: ansible_tenant_firewall1,
+ cluster_interface: clu_if1,
+ concrete_interface: cn_if1,
+ }
+ - {
+ tenant: '{{ mso_tenant | default("ansible_test") }}',
+ type: ADC,
+ name: ansible_tenant_adc,
+ cluster_interface: clu_if3,
+ concrete_interface: cn_if3,
+ }
+ - {
+ tenant: '{{ mso_tenant | default("ansible_test") }}',
+ type: OTHERS,
+ name: ansible_tenant_other,
+ cluster_interface: clu_if4,
+ concrete_interface: cn_if4,
+ }
+
+ - name: Add redirect policies to the common and ansible_tenant tenants
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: "/api/node/mo/uni/tn-{{ item.tenant }}/svcCont.json"
+ method: post
+ content:
+ vnsSvcRedirectPol:
+ attributes:
+ name: "{{ item.name }}"
+ loop:
+ - {
+ tenant: '{{ mso_tenant | default("ansible_test") }}',
+ name: redirect_policy1,
+ }
+ - { tenant: common, name: redirect_policy2 }
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/main.yml
new file mode 100644
index 000000000..ebee2fb2a
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph/tasks/main.yml
@@ -0,0 +1,935 @@
+# Test code for the MSO modules
+# Copyright: (c) 2024, Sabari Jaganathan (@sajagana) <sajagana@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI MultiSite host, username and password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
+ when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
+
+# CLEAN ENVIRONMENT
+- name: Set vars
+ ansible.builtin.set_fact:
+ mso_info: &mso_info
+ host: "{{ mso_hostname }}"
+ username: "{{ mso_username }}"
+ password: "{{ mso_password }}"
+ validate_certs: "{{ mso_validate_certs | default(false) }}"
+ use_ssl: "{{ mso_use_ssl | default(true) }}"
+ use_proxy: "{{ mso_use_proxy | default(false) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+ aci_info: &aci_info
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: "{{ apic_validate_certs | default(false) }}"
+ use_ssl: "{{ apic_use_ssl | default(true) }}"
+ use_proxy: "{{ apic_use_proxy | default(true) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+
+# Setup part begins
+- name: Set ansible_network_os to cisco.aci.aci and ansible_connection to local
+ ansible.builtin.set_fact:
+ ansible_connection: local
+ ansible_network_os: cisco.aci.aci
+
+- name: Reset the ansible_connection to access the APIC
+ ansible.builtin.meta: reset_connection
+
+- name: Include tasks for L4-L7 devices
+ ansible.builtin.include_tasks: l4_l7_devices.yml
+
+- name: Set ansible_network_os to cisco.nd.nd and ansible_connection to ansible.netcommon.httpapi
+ ansible.builtin.set_fact:
+ ansible_connection: ansible.netcommon.httpapi
+ ansible_network_os: cisco.nd.nd
+
+- name: Reset the ansible_connection to access the MSO/NDO
+ ansible.builtin.meta: reset_connection
+
+- name: Remove ansible_schema to start the test - setup part
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ state: absent
+
+- name: Remove {{ mso_tenant | default("ansible_test") }} tenant to start the test - setup part
+ cisco.mso.mso_tenant:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
+
+- name: Add {{ mso_tenant | default("ansible_test") }} tenant
+ cisco.mso.mso_tenant:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ users: ["{{ mso_username }}"]
+ state: present
+
+- name: Associate Azure site with '{{ mso_tenant | default("ansible_test") }}'
+ cisco.mso.mso_tenant_site:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ site: ansible_test
+ state: present
+ when:
+ - query_cloud.current | length == 0
+
+- name: Associate Azure site with '{{ mso_tenant | default("ansible_test") }}' # Azure Task
+ cisco.mso.mso_tenant_site:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ site: azure_ansible_test_2
+ cloud_account: "uni/tn-{{ mso_tenant | default('ansible_test') }}/act-[{{ azure_cloud_account | default(123) }}]-vendor-azure"
+ state: present
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+
+- name: Ensure ansible_schema with ansible_template1 and ansible_template2 exist
+ cisco.mso.mso_schema_template:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ template: "{{ item }}"
+ state: present
+ loop:
+ - "ansible_template1"
+ - "ansible_template2"
+
+- name: Create ansible_service_graph schema template service graph
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ service_graph: "ansible_service_graph"
+ display_name: "ansible_service_graph"
+ service_nodes:
+ - type: firewall
+ - type: load-balancer
+ - type: other
+ filter_after_first_node: allow_all
+ state: present
+
+- name: Bind ansible_test site with ansible_template1 and ansible_template2
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "{{ item }}"
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: present
+ loop:
+ - "ansible_template1"
+ - "ansible_template2"
+
+- name: Configure the site service graph ansible_service_graph
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ service_graph: "ansible_service_graph"
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ devices:
+ - name: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ - name: '{{ mso_tenant | default("ansible_test") }}_adc'
+ - name: '{{ mso_tenant | default("ansible_test") }}_other'
+ state: present
+
+- name: Add Filter1 to ansible_template1
+ cisco.mso.mso_schema_template_filter_entry: &filter_present
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ filter: Filter1
+ entry: Filter1Entry
+ state: present
+
+- name: Add Filter2 to ansible_template1
+ cisco.mso.mso_schema_template_filter_entry:
+ <<: *filter_present
+ filter: Filter2
+ entry: Filter2Entry
+ state: present
+
+- name: Add Contracts to the ansible_template1
+ cisco.mso.mso_schema_template_contract_filter:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ contract: "{{ item }}"
+ filter: Filter1
+ state: present
+ loop:
+ - Contract1
+ - Contract2
+ - Contract3
+
+- name: Add a VRF1 to ansible_template1
+ cisco.mso.mso_schema_template_vrf:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ vrf: VRF1
+ state: present
+
+- name: Add a VRF2 to ansible_template1
+ cisco.mso.mso_schema_template_vrf:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ vrf: VRF2
+ state: present
+
+- name: Add BD1 to ansible_template1
+ cisco.mso.mso_schema_template_bd:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ bd: BD1
+ vrf:
+ name: VRF1
+ state: present
+
+- name: Add BD2 to ansible_template1
+ cisco.mso.mso_schema_template_bd:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ bd: BD2
+ vrf:
+ name: VRF2
+ state: present
+
+- name: Add AP1 to ansible_template1
+ cisco.mso.mso_schema_template_anp:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ state: present
+
+- name: Add EPG1 to AP1 in ansible_template1
+ cisco.mso.mso_schema_template_anp_epg:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ epg: EPG1
+ bd:
+ name: BD1
+ vrf:
+ name: VRF1
+ state: present
+
+- name: Bind Contract1 and 2 with EPG1 provider
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ epg: EPG1
+ contract:
+ name: "{{ item }}"
+ type: provider
+ state: present
+ loop:
+ - Contract1
+ - Contract2
+
+- name: Bind Contract1 with EPG1 consumer
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ epg: EPG1
+ contract:
+ name: "{{ item }}"
+ type: consumer
+ state: present
+ loop:
+ - Contract1
+ - Contract2
+
+- name: Bind Contract1 and 2 with template service graph - ansible_service_graph
+ cisco.mso.mso_schema_template_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ contract: "{{ item }}"
+ service_graph: ansible_service_graph
+ service_nodes:
+ - provider: BD1
+ consumer: BD2
+ - provider: BD1
+ consumer: BD2
+ - provider: BD1
+ consumer: BD2
+ state: present
+ loop:
+ - Contract1
+ - Contract2
+
+# Test part
+# Azure tests part
+- name: Execute tasks only for cloud sites
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+ block:
+ - name: Add Service Graph 1 at site level for the Azure site service graph test # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ service_graph: ansible_service_graph
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ devices:
+ - name: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ provider_connector_type: source_nat
+ provider_interface: TP_FW_Inf1
+ consumer_connector_type: redirect
+ consumer_interface: TP_FW_Inf1
+ - name: '{{ mso_tenant | default("ansible_test") }}_app_lb'
+ - name: '{{ mso_tenant | default("ansible_test") }}_other'
+ provider_connector_type: destination_nat
+ consumer_connector_type: redirect
+ state: present
+ output_level: debug
+ register: az_sg1_cm_present
+
+ - name: Bind the Contract1 with site service graph - ansible_service_graph - check_mode # Azure Task
+ cisco.mso.mso_schema_site_contract_service_graph: &az_add_site_con_sg_cm
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph_schema: '{{ mso_schema | default("ansible_schema") }}'
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph
+ state: present
+ output_level: debug
+ check_mode: true
+ register: az_add_site_con_sg_cm
+
+ - name: Bind the Contract1 with site service graph - ansible_service_graph - normal_mode # Azure Task
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *az_add_site_con_sg_cm
+ register: az_add_site_con_sg_nm
+
+ - name: Bind the Contract1 with site service graph - ansible_service_graph - normal_mode again # Azure Task
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *az_add_site_con_sg_cm
+ register: az_add_site_con_sg_nm_again
+
+ - name: Assertions check for the bind site contract service graph
+ ansible.builtin.assert:
+ that:
+ - az_add_site_con_sg_cm is changed
+ - az_add_site_con_sg_cm.current != {}
+ - az_add_site_con_sg_cm.previous == {}
+ - az_add_site_con_sg_cm.current.serviceNodesRelationship.0.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node1")
+ - az_add_site_con_sg_cm.current.serviceNodesRelationship.1.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node2")
+ - az_add_site_con_sg_cm.current.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+ - az_add_site_con_sg_cm.proposed.serviceNodesRelationship.0.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node1")
+ - az_add_site_con_sg_cm.proposed.serviceNodesRelationship.1.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node2")
+ - az_add_site_con_sg_cm.proposed.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+ - az_add_site_con_sg_nm is changed
+ - az_add_site_con_sg_nm.current != {}
+ - az_add_site_con_sg_nm.previous == {}
+ - az_add_site_con_sg_nm.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - az_add_site_con_sg_nm.current.serviceGraphRef.templateName == "ansible_template1"
+ - az_add_site_con_sg_nm.current.serviceNodesRelationship.0.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node1")
+ - az_add_site_con_sg_nm.current.serviceNodesRelationship.1.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node2")
+ - az_add_site_con_sg_nm.current.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+ - az_add_site_con_sg_nm.proposed.serviceNodesRelationship.0.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node1")
+ - az_add_site_con_sg_nm.proposed.serviceNodesRelationship.1.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node2")
+ - az_add_site_con_sg_nm.proposed.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+ - az_add_site_con_sg_nm_again is not changed
+ - az_add_site_con_sg_nm_again.current != {}
+ - az_add_site_con_sg_nm_again.previous != {}
+ - az_add_site_con_sg_nm_again.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - az_add_site_con_sg_nm_again.current.serviceGraphRef.templateName == "ansible_template1"
+ - az_add_site_con_sg_nm_again.previous.serviceNodesRelationship.0.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node1")
+ - az_add_site_con_sg_nm_again.previous.serviceNodesRelationship.1.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node2")
+ - az_add_site_con_sg_nm_again.previous.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+ - az_add_site_con_sg_nm_again.previous.serviceNodesRelationship.0.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node1")
+ - az_add_site_con_sg_nm_again.previous.serviceNodesRelationship.1.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node2")
+ - az_add_site_con_sg_nm_again.previous.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+
+# Non-Cloud sites part
+- name: Execute tasks only for non-cloud sites
+ when:
+ - query_cloud.current | length == 0
+ block:
+ - name: Bind the Contract1 with site service graph - ansible_service_graph - check_mode
+ cisco.mso.mso_schema_site_contract_service_graph: &add_site_con_sg_cm
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph_schema: '{{ mso_schema | default("ansible_schema") }}'
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph
+ node_relationship:
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ provider_connector_cluster_interface: clu_if1
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if1
+ consumer_connector_redirect_policy: redirect_policy1
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_adc'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy: redirect_policy1
+ consumer_subnet_ips: ["1.1.1.1/24", "4.4.4.4/24"]
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_other'
+ provider_connector_cluster_interface: clu_if4
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if4
+ consumer_connector_redirect_policy: redirect_policy1
+ state: present
+ output_level: debug
+ check_mode: true
+ register: add_sg_cm
+
+ - name: Bind the Contract1 with site service graph - ansible_service_graph - normal_mode
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *add_site_con_sg_cm
+ contract: Contract1
+ register: add_sg_nm
+
+ - name: Bind the Contract2 with site service graph - ansible_service_graph - normal_mode
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *add_site_con_sg_cm
+ contract: Contract2
+ register: add_sg_nm_c2
+
+ - name: Bind the Contract1 with site service graph - ansible_service_graph - normal_mode - again
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *add_site_con_sg_cm
+ contract: Contract1
+ register: add_sg_nm_again
+
+ - name: Assertions check for the bind site contract service graph
+ ansible.builtin.assert:
+ that:
+ - add_sg_cm is changed
+ - add_sg_cm.current != {}
+ - add_sg_cm.previous == {}
+ - add_sg_cm.current.serviceNodesRelationship.0.serviceNodeRef.serviceGraphName == "ansible_service_graph"
+ - add_sg_cm.current.serviceNodesRelationship.0.serviceNodeRef.serviceNodeName == "node1"
+ - add_sg_cm.current.serviceNodesRelationship.0.serviceNodeRef.templateName == "ansible_template1"
+ - add_sg_cm.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - add_sg_cm.current.serviceGraphRef.templateName == "ansible_template1"
+ - add_sg_cm.current.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - add_sg_cm.current.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - add_sg_cm.current.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.4/24"
+ - add_sg_cm.current.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - add_sg_cm.current.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - add_sg_cm.current.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - add_sg_cm.current.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - add_sg_cm.proposed.serviceNodesRelationship.0.serviceNodeRef.serviceGraphName == "ansible_service_graph"
+ - add_sg_cm.proposed.serviceNodesRelationship.0.serviceNodeRef.serviceNodeName == "node1"
+ - add_sg_cm.proposed.serviceNodesRelationship.0.serviceNodeRef.templateName == "ansible_template1"
+ - add_sg_cm.proposed.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - add_sg_cm.proposed.serviceGraphRef.templateName == "ansible_template1"
+ - add_sg_cm.proposed.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - add_sg_cm.proposed.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - add_sg_cm.proposed.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.4/24"
+ - add_sg_cm.proposed.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - add_sg_cm.proposed.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - add_sg_cm.proposed.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - add_sg_cm.proposed.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - add_sg_nm is changed
+ - add_sg_nm.current != {}
+ - add_sg_nm.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - add_sg_nm.current.serviceGraphRef.templateName == "ansible_template1"
+ - add_sg_nm.current.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - add_sg_nm.current.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - add_sg_nm.current.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.4/24"
+ - add_sg_nm.current.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - add_sg_nm.current.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - add_sg_nm.current.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - add_sg_nm.current.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - add_sg_nm.previous == {}
+ - add_sg_nm_again is not changed
+ - add_sg_nm_again.current != {}
+ - add_sg_nm_again.previous != {}
+ - add_sg_nm_again.previous.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - add_sg_nm_again.previous.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - add_sg_nm_again.previous.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.4/24"
+ - add_sg_nm_again.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - add_sg_nm_again.current.serviceGraphRef.templateName == "ansible_template1"
+ - add_sg_nm_again.current.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+
+ - name: Update the Contract1 - site service graph - ansible_service_graph - node properties - check_mode
+ cisco.mso.mso_schema_site_contract_service_graph: &update_site_con_sg_cm
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph_schema: '{{ mso_schema | default("ansible_schema") }}'
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph
+ node_relationship:
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ provider_connector_cluster_interface: clu_if1
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if1
+ consumer_connector_redirect_policy: redirect_policy1
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_adc'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy: redirect_policy1
+ consumer_subnet_ips: ["1.1.1.1/24", "4.4.4.3/24"]
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_other'
+ provider_connector_cluster_interface: clu_if4
+ provider_connector_redirect_policy_tenant: common
+ provider_connector_redirect_policy: redirect_policy2
+ consumer_connector_cluster_interface: clu_if4
+ consumer_connector_redirect_policy_tenant: common
+ consumer_connector_redirect_policy: redirect_policy2
+ state: present
+ output_level: debug
+ check_mode: true
+ register: update_sg_cm
+
+ - name: Update the Contract1 - site service graph - ansible_service_graph - node properties - normal_mode
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *update_site_con_sg_cm
+ register: update_sg_nm
+
+ - name: Update the Contract1 - site service graph - ansible_service_graph - node properties - normal_mode again
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *update_site_con_sg_cm
+ register: update_sg_nm_again
+
+ - name: Assertions check for the update site contract service graph
+ ansible.builtin.assert:
+ that:
+ - update_sg_cm is changed
+ - update_sg_cm.current != {}
+ - update_sg_cm.previous != {}
+ - update_sg_cm.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - update_sg_cm.current.serviceGraphRef.templateName == "ansible_template1"
+ - update_sg_cm.current.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - update_sg_cm.current.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - update_sg_cm.current.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.3/24"
+ - update_sg_cm.previous.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - update_sg_cm.previous.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - update_sg_cm.previous.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.4/24"
+ - update_sg_cm.proposed.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - update_sg_cm.proposed.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - update_sg_cm.proposed.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.3/24"
+ - update_sg_cm.current.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_cm.current.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - update_sg_cm.current.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_cm.current.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - update_sg_cm.proposed.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_cm.proposed.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - update_sg_cm.proposed.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_cm.proposed.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - update_sg_cm.previous.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_cm.previous.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - update_sg_cm.previous.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_cm.previous.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - update_sg_nm is changed
+ - update_sg_nm.current != {}
+ - update_sg_nm.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - update_sg_nm.current.serviceGraphRef.templateName == "ansible_template1"
+ - update_sg_nm.current.serviceNodesRelationship.0.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_firewall1/lIf-clu_if1"
+ - update_sg_nm.current.serviceNodesRelationship.0.consumerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - update_sg_nm.current.serviceNodesRelationship.0.consumerConnector.subnets | length == 0
+ - update_sg_nm.current.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - update_sg_nm.current.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - update_sg_nm.current.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.3/24"
+ - update_sg_nm.previous.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - update_sg_nm.previous.serviceNodesRelationship.1.consumerConnector.subnets.0.ip == "1.1.1.1/24"
+ - update_sg_nm.previous.serviceNodesRelationship.1.consumerConnector.subnets.1.ip == "4.4.4.4/24"
+ - update_sg_nm.current.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_nm.current.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - update_sg_nm.current.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_nm.current.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - update_sg_nm.previous.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_nm.previous.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - update_sg_nm.previous.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - update_sg_nm.previous.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - update_sg_nm_again is not changed
+ - update_sg_nm_again.current != {}
+ - update_sg_nm_again.current.serviceGraphRef.serviceGraphName == "ansible_service_graph"
+ - update_sg_nm_again.current.serviceGraphRef.templateName == "ansible_template1"
+
+ - name: Negative test - Add site contract service graph with invalid service_graph
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph_invalid
+ node_relationship:
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ provider_connector_cluster_interface: clu_if1
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if1
+ consumer_connector_redirect_policy: redirect_policy1
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_adc'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy: redirect_policy1
+ consumer_subnet_ips: ["1.1.1.1/24", "4.4.4.4/24"]
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_other'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy_tenant: common
+ provider_connector_redirect_policy: redirect_policy2
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy_tenant: common
+ consumer_connector_redirect_policy: redirect_policy2
+ state: present
+ ignore_errors: true
+ register: nt_add_sg_with_invalid_sg
+
+ - name: Negative test - use invalid service graph schema to check the failure
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph_schema: '{{ mso_schema | default("ansible_schema") }}_temp'
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph
+ node_relationship:
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ provider_connector_cluster_interface: clu_if1
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if1
+ consumer_connector_redirect_policy: redirect_policy1
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_adc'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy: redirect_policy1
+ consumer_subnet_ips: ["1.1.1.1/24", "4.4.4.4/24"]
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_other'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy_tenant: common
+ provider_connector_redirect_policy: redirect_policy2
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy_tenant: common
+ consumer_connector_redirect_policy: redirect_policy2
+ state: present
+ ignore_errors: true
+ register: nt_with_invalid_sg_schema
+
+ - name: Negative test - Add site contract service graph without node_relationship and tenant
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph: ansible_service_graph
+ state: present
+ ignore_errors: true
+ register: nt_add_sg_without_node_relationship_and_tenant
+
+ - name: Negative test - Add site contract service graph without node_relationship
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph: ansible_service_graph
+ state: present
+ ignore_errors: true
+ register: nt_add_sg_without_node_relationship
+
+ - name: Negative test - Add site contract service graph without tenant
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph
+ node_relationship:
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ provider_connector_cluster_interface: clu_if1
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if1
+ consumer_connector_redirect_policy: redirect_policy1
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_adc'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy: redirect_policy1
+ consumer_subnet_ips: ["1.1.1.1/24", "4.4.4.4/24"]
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_other'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy_tenant: common
+ provider_connector_redirect_policy: redirect_policy2
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy_tenant: common
+ consumer_connector_redirect_policy: redirect_policy2
+ state: present
+ ignore_errors: true
+ register: nt_add_sg_without_tenant
+
+ - name: Negative test - Add site contract service graph without tenant
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph_invalid
+ node_relationship:
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ provider_connector_cluster_interface: clu_if1
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if1
+ consumer_connector_redirect_policy: redirect_policy1
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_adc'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy: redirect_policy1
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy: redirect_policy1
+ consumer_subnet_ips: ["1.1.1.1/24", "4.4.4.4/24"]
+ - cluster_interface_device: '{{ mso_tenant | default("ansible_test") }}_other'
+ provider_connector_cluster_interface: clu_if3
+ provider_connector_redirect_policy_tenant: common
+ provider_connector_redirect_policy: redirect_policy2
+ consumer_connector_cluster_interface: clu_if3
+ consumer_connector_redirect_policy_tenant: common
+ consumer_connector_redirect_policy: redirect_policy2
+ state: present
+ ignore_errors: true
+ register: nt_add_sg_without_tenant
+
+ - name: Assertions check for the negative site contract tests
+ ansible.builtin.assert:
+ that:
+ - nt_with_invalid_sg_schema is not changed
+ - nt_with_invalid_sg_schema.current == {}
+ - nt_with_invalid_sg_schema.msg == "Provided service_graph_schema{{':'}} 'ansible_schema_temp' does not exist."
+ - nt_add_sg_without_node_relationship_and_tenant is not changed
+ - nt_add_sg_without_node_relationship_and_tenant.current == {}
+ - nt_add_sg_without_node_relationship_and_tenant.msg == "The node_relationship and tenant attributes are required when state is present and site type is on-premise."
+ - nt_add_sg_without_node_relationship is not changed
+ - nt_add_sg_without_node_relationship.current == {}
+ - nt_add_sg_without_node_relationship.msg == "The node_relationship attribute is required when state is present and site type is on-premise."
+ - nt_add_sg_without_tenant is not changed
+ - nt_add_sg_without_tenant.current == {}
+ - nt_add_sg_without_tenant.msg == "The tenant attribute is required when state is present and site type is on-premise."
+ - nt_add_sg_with_invalid_sg is not changed
+ - nt_add_sg_with_invalid_sg.msg == "The service graph{{':'}} ansible_service_graph_invalid does not associated with the site contract{{':'}} Contract1."
+
+ - name: Query a empty site contract without passing the service graph name
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract3
+ state: query
+ register: query_empty_contract_without_sg_name
+
+ - name: Query a invalid site contract without passing the service graph value
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract4
+ state: query
+ ignore_errors: true
+ register: query_invalid_contract_sg
+
+ - name: Query all site contract service graphs with an empty template
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template2
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_graph: ansible_service_graph
+ state: query
+ register: query_all_sg_with_empty_template
+
+ - name: Query a site contract - Contract1 service graph without passing service graph name
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ contract: Contract1
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: query
+ register: query_sg_without_name
+
+ - name: Query all site contract service graphs without passing the service_graph and contract name
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: query
+ register: query_all_sg_without_contract_sg
+
+ - name: Assertions check for the query results
+ ansible.builtin.assert:
+ that:
+ - query_empty_contract_without_sg_name is not changed
+ - query_empty_contract_without_sg_name.current == {}
+ - query_invalid_contract_sg is not changed
+ - query_invalid_contract_sg.current == {}
+ - query_invalid_contract_sg.msg == "The site contract{{':'}} Contract4 does not exist."
+ - query_all_sg_with_empty_template is not changed
+ - query_all_sg_with_empty_template.current == {}
+ - query_sg_without_name is not changed
+ - query_sg_without_name.current != {}
+ - query_sg_without_name.current.serviceGraphRef is match(".+/templates/ansible_template1/serviceGraphs/ansible_service_graph")
+ - query_sg_without_name.current.serviceNodesRelationship | length == 3
+ - query_sg_without_name.current.serviceNodesRelationship.0.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_firewall1/lIf-clu_if1"
+ - query_sg_without_name.current.serviceNodesRelationship.0.consumerConnector.redirectPolicy.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/svcCont/svcRedirectPol-redirect_policy1"
+ - query_sg_without_name.current.serviceNodesRelationship.0.consumerConnector.subnets | length == 0
+ - query_sg_without_name.current.serviceNodesRelationship.0.providerConnector.subnets | length == 0
+ - query_sg_without_name.current.serviceNodesRelationship.0.serviceNodeRef is match(".+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node1")
+ - query_all_sg_without_contract_sg is not changed
+ - query_all_sg_without_contract_sg.current | length == 2
+ - query_all_sg_without_contract_sg.current.0.serviceGraphRef is match(".+/templates/ansible_template1/serviceGraphs/ansible_service_graph")
+ - query_all_sg_without_contract_sg.current.1.serviceGraphRef is match(".+/templates/ansible_template1/serviceGraphs/ansible_service_graph")
+ - query_all_sg_without_contract_sg.current.0.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - query_all_sg_without_contract_sg.current.0.serviceNodesRelationship.1.providerConnector.subnets | length == 0
+ - query_all_sg_without_contract_sg.current.0.serviceNodesRelationship.2.consumerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - query_all_sg_without_contract_sg.current.0.serviceNodesRelationship.2.consumerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+ - query_all_sg_without_contract_sg.current.0.serviceNodesRelationship.2.providerConnector.redirectPolicy.dn == "uni/tn-common/svcCont/svcRedirectPol-redirect_policy2"
+ - query_all_sg_without_contract_sg.current.0.serviceNodesRelationship.2.providerConnector.clusterInterface.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/lDevVip-{{ mso_tenant | default("ansible_test") }}_other/lIf-clu_if4"
+
+ - name: Remove the site contract Contract1 - service graph from the ansible_template1 - check_mode
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ state: absent
+ output_level: debug
+ check_mode: true
+ register: site_con_sg_absent_cm
+
+ - name: Remove the site contract Contract1 - service graph from the ansible_template1 - normal_mode
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ state: absent
+ register: site_con_sg_absent_nm
+
+ - name: Remove the site contract Contract1 - service graph from the ansible_template1 - normal_mode again
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ state: absent
+ ignore_errors: true
+ register: site_con_sg_absent_nm_again
+
+ - name: Assertions check for remove the site contract Contract1 - service graph from the ansible_template1
+ ansible.builtin.assert:
+ that:
+ - site_con_sg_absent_cm is changed
+ - site_con_sg_absent_cm.current == {}
+ - site_con_sg_absent_cm.previous != {}
+ - site_con_sg_absent_cm.previous.serviceGraphRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph")
+ - site_con_sg_absent_cm.previous.serviceNodesRelationship | length == 3
+ - site_con_sg_absent_cm.previous.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - site_con_sg_absent_cm.previous.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+ - site_con_sg_absent_cm.proposed == {}
+ - site_con_sg_absent_cm.sent == {}
+ - site_con_sg_absent_nm is changed
+ - site_con_sg_absent_nm.current == {}
+ - site_con_sg_absent_nm.previous != {}
+ - site_con_sg_absent_nm.previous.serviceGraphRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph")
+ - site_con_sg_absent_nm.previous.serviceNodesRelationship | length == 3
+ - site_con_sg_absent_nm.previous.serviceNodesRelationship.1.consumerConnector.subnets | length == 2
+ - site_con_sg_absent_nm.previous.serviceNodesRelationship.2.serviceNodeRef is match("/schemas/.+/templates/ansible_template1/serviceGraphs/ansible_service_graph/serviceNodes/node3")
+ - site_con_sg_absent_nm_again is not changed
+ - site_con_sg_absent_nm_again.current == {}
+ - site_con_sg_absent_nm_again.previous == {}
+ - site_con_sg_absent_nm_again.msg is match("MSO Error 400{{':'}} error in remove for path{{':'}} '/sites/0/contracts/0/serviceGraphRelationship'{{':'}} unable to remove nonexistent key{{':'}} serviceGraphRelationship{{':'}} missing value")
+
+# Cleanup part
+
+- name: Remove the site association for the ansible_schema templates
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "{{ item }}"
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: present
+ loop:
+ - "ansible_template1"
+ - "ansible_template2"
+
+- name: Remove the ansible_schema schema
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ state: absent
+
+- name: Remove the {{ mso_tenant | default("ansible_test") }} tenant
+ cisco.mso.mso_tenant:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
+
+- name: Set ansible_network_os to cisco.aci.aci and ansible_connection to local
+ ansible.builtin.set_fact:
+ ansible_connection: local
+ ansible_network_os: cisco.aci.aci
+
+- name: Reset the ansible_connection to access the APIC
+ ansible.builtin.meta: reset_connection
+
+- name: Remove the common tenant redirect policy
+ cisco.aci.aci_rest:
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: no
+ path: "/api/node/mo/uni/tn-common/svcCont.json"
+ method: post
+ content:
+ vnsSvcRedirectPol:
+ attributes:
+ name: redirect_policy2
+ status: deleted
+
+- name: Remove the {{ mso_tenant | default("ansible_test") }} from the APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/aliases b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/aliases
new file mode 100644
index 000000000..5042c9c09
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/aliases
@@ -0,0 +1,2 @@
+# No ACI MultiSite infrastructure, so not enabled
+# unsupported
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/l4_l7_devices.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/l4_l7_devices.yml
new file mode 100644
index 000000000..5c325ba44
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/l4_l7_devices.yml
@@ -0,0 +1,222 @@
+# Test code for the MSO modules
+# Copyright: (c) 2024, Sabari Jaganathan (@sajagana) <sajagana@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI MultiSite host, username and password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
+ when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
+
+# CLEAN ENVIRONMENT
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: "{{ apic_validate_certs | default(false) }}"
+ use_ssl: "{{ apic_use_ssl | default(true) }}"
+ use_proxy: "{{ apic_use_proxy | default(true) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: aci_version
+
+- name: Remove an existing tenant on APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ name: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
+
+- name: Add a tenant on APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ name: '{{ mso_tenant | default("ansible_test") }}'
+
+# Site type checking for L4-L7 Device configuration
+# QUERY OBJECTS
+- name: Query cloud provider object
+ cisco.aci.aci_cloud_provider:
+ <<: *aci_info
+ state: query
+ register: query_cloud
+ when: aci_version.current.0.topSystem.attributes.version is version('4.1', '>=')
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ query_cloud:
+ current: []
+ when: aci_version.current.0.topSystem.attributes.version is version('4.1', '<')
+
+- name: Verify query_cloud for all sites
+ ansible.builtin.assert:
+ that:
+ - query_cloud is not changed
+
+- name: Verify query_cloud for Cloud Sites
+ ansible.builtin.assert:
+ that:
+ - query_cloud is not changed
+ - query_cloud.current.0.cloudProvP.attributes.environment == "public-cloud"
+ - '"vendor" in query_cloud.current.0.cloudProvP.attributes'
+ when:
+ - query_cloud.current | length > 0 # This condition will execute only cloud sites
+
+# Cloud Site block
+- name: Execute tasks only for cloud sites
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+ block:
+ - name: Add azure_vrf to the {{ mso_tenant | default("ansible_test") }}
+ cisco.aci.aci_vrf:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ vrf: azure_vrf
+
+ - name: Add azure_ctxprof to the {{ mso_tenant | default("ansible_test") }}
+ cisco.aci.aci_cloud_ctx_profile:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ cloud: azure
+ name: azure_ctxprof
+ vrf: azure_vrf
+ region: westus2
+ primary_cidr: "1.1.1.2/32"
+ state: present
+
+ - name: Add the subnet to the azure_ctxprof
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: api/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32].json
+ method: post
+ content:
+ cloudSubnet:
+ attributes:
+ ip: 1.1.1.2/32
+ name: azure_ctxprof_cidr
+ children:
+ - cloudRsZoneAttach:
+ attributes:
+ tDn: "uni/clouddomp/provp-azure/region-westus2/zone-default"
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_tplb device - ThirdParty_LB
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/cld-{{ mso_tenant | default("ansible_test") }}_tplb.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ targetMode: unspecified
+ name: '{{ mso_tenant | default("ansible_test") }}_tplb'
+ svcType: ADC
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-{{ mso_tenant | default("ansible_test") }}/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_LB_Inf
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_LB_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_firewall1 device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/cld-{{ mso_tenant | default("ansible_test") }}_firewall1.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ svcType: FW
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-{{ mso_tenant | default("ansible_test") }}/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_FW_Inf1
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_FW_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_nlb device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_nlb.json
+ method: post
+ content:
+ cloudLB:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ type: network
+ children:
+ - cloudRsLDevToCloudSubnet:
+ attributes:
+ tDn: 'uni/tn-{{ mso_tenant | default("ansible_test") }}/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32]'
+ - cloudVip:
+ attributes:
+ name: 10.10.10.10
+
+ - name: Add the {{ mso_tenant | default("ansible_test") }}_aplb device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_aplb.json
+ method: post
+ content:
+ cloudLB:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ type: application
+ children:
+ - cloudRsLDevToCloudSubnet:
+ attributes:
+ tDn: 'uni/tn-{{ mso_tenant | default("ansible_test") }}/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32]'
+
+ - name: Add certificate store to the {{ mso_tenant | default("ansible_test") }} tenant
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/certstore.json
+ method: post
+ content:
+ cloudCertStore:
+ attributes:
+ name: default
+
+ - name: Add certificate authority to the {{ mso_tenant | default("ansible_test") }} tenant
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/certstore/tp-{{ mso_tenant | default("ansible_test") }}_ca.json
+ method: post
+ content:
+ pkiTP:
+ attributes:
+ certChain: '{{ lookup("file", "pki/admin.crt") }}'
+ name: '{{ mso_tenant | default("ansible_test") }}_ca'
+
+ - name: Add key ring to the {{ mso_tenant | default("ansible_test") }} tenant
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-{{ mso_tenant | default("ansible_test") }}/certstore/keyring-{{ mso_tenant | default("ansible_test") }}_keyring.json
+ method: post
+ content:
+ pkiKeyRing:
+ attributes:
+ name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ tp: '{{ mso_tenant | default("ansible_test") }}_ca'
+ modulus: mod2048
+ adminState: started
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/main.yml
new file mode 100644
index 000000000..7552c563d
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/main.yml
@@ -0,0 +1,1604 @@
+# Test code for the MSO modules
+# Copyright: (c) 2024, Sabari Jaganathan (@sajagana) <sajagana@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI MultiSite host, username and password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
+ when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
+
+# CLEAN ENVIRONMENT
+- name: Set vars
+ ansible.builtin.set_fact:
+ mso_info: &mso_info
+ host: "{{ mso_hostname }}"
+ username: "{{ mso_username }}"
+ password: "{{ mso_password }}"
+ validate_certs: "{{ mso_validate_certs | default(false) }}"
+ use_ssl: "{{ mso_use_ssl | default(true) }}"
+ use_proxy: "{{ mso_use_proxy | default(false) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+ aci_info: &aci_info
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: "{{ apic_validate_certs | default(false) }}"
+ use_ssl: "{{ apic_use_ssl | default(true) }}"
+ use_proxy: "{{ apic_use_proxy | default(true) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+
+# Setup part begins
+- name: Set ansible_network_os to cisco.aci.aci and ansible_connection to local
+ ansible.builtin.set_fact:
+ ansible_connection: local
+ ansible_network_os: cisco.aci.aci
+
+- name: Reset the ansible_connection to access the APIC
+ ansible.builtin.meta: reset_connection
+
+- name: Include tasks for L4-L7 devices
+ ansible.builtin.include_tasks: l4_l7_devices.yml
+
+- name: Set ansible_network_os to cisco.nd.nd and ansible_connection to ansible.netcommon.httpapi
+ ansible.builtin.set_fact:
+ ansible_connection: ansible.netcommon.httpapi
+ ansible_network_os: cisco.nd.nd
+
+- name: Reset the ansible_connection to access the MSO/NDO
+ ansible.builtin.meta: reset_connection
+
+- name: Remove ansible_schema to start the test - setup part
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ state: absent
+
+- name: Remove {{ mso_tenant | default("ansible_test") }} tenant to start the test - setup part
+ cisco.mso.mso_tenant:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
+
+- name: Add {{ mso_tenant | default("ansible_test") }} tenant
+ cisco.mso.mso_tenant:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ users: ["{{ mso_username }}"]
+ state: present
+
+- name: Associate Azure site with '{{ mso_tenant | default("ansible_test") }}'
+ cisco.mso.mso_tenant_site:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ site: azure_ansible_test_2
+ cloud_account: "uni/tn-{{ mso_tenant | default('ansible_test') }}/act-[{{ azure_cloud_account | default(123) }}]-vendor-azure"
+ state: present
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+
+- name: Ensure ansible_schema with ansible_template1 and ansible_template2 exist
+ cisco.mso.mso_schema_template:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ template: "{{ item }}"
+ state: present
+ loop:
+ - "ansible_template1"
+ - "ansible_template2"
+
+- name: Create ansible_service_graph schema template service graph
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ service_graph: "ansible_service_graph"
+ display_name: "ansible_service_graph"
+ service_nodes:
+ - type: firewall
+ - type: load-balancer
+ filter_after_first_node: allow_all
+ state: present
+
+- name: Create ansible_service_graph2 schema template service graph
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ service_graph: "ansible_service_graph2"
+ display_name: "ansible_service_graph2"
+ service_nodes:
+ - type: load-balancer
+ - type: load-balancer
+ filter_after_first_node: allow_all
+ state: present
+
+- name: Bind ansible_test site with ansible_template1 and ansible_template2
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "{{ item }}"
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: present
+ loop:
+ - "ansible_template1"
+
+- name: Add Filter1 to ansible_template1
+ cisco.mso.mso_schema_template_filter_entry:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ filter: Filter1
+ entry: Filter1Entry
+ state: present
+
+- name: Add Contracts to the ansible_template1
+ cisco.mso.mso_schema_template_contract_filter:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ contract: "{{ item }}"
+ filter: Filter1
+ state: present
+ loop:
+ - Contract1
+ - Contract2
+ - Contract3
+
+- name: Add a VRF1 to ansible_template1
+ cisco.mso.mso_schema_template_vrf:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ vrf: VRF1
+ state: present
+
+- name: Add BD1 to ansible_template1
+ cisco.mso.mso_schema_template_bd:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ bd: BD1
+ vrf:
+ name: VRF1
+ state: present
+
+- name: Add AP1 to ansible_template1
+ cisco.mso.mso_schema_template_anp:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ state: present
+
+- name: Add EPG1 to AP1 in ansible_template1
+ cisco.mso.mso_schema_template_anp_epg:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ epg: EPG1
+ bd:
+ name: BD1
+ vrf:
+ name: VRF1
+ state: present
+
+- name: Bind Contract1 and 2 with EPG1 provider
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ epg: EPG1
+ contract:
+ name: "{{ item }}"
+ type: provider
+ state: present
+ loop:
+ - Contract1
+ - Contract2
+
+- name: Bind Contract1 with EPG1 consumer
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ anp: AP1
+ epg: EPG1
+ contract:
+ name: "{{ item }}"
+ type: consumer
+ state: present
+ loop:
+ - Contract1
+ - Contract2
+ - Contract3
+
+- name: Bind Contract1 with template service graph - ansible_service_graph
+ cisco.mso.mso_schema_template_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ contract: Contract1
+ service_graph: ansible_service_graph
+ service_nodes:
+ - provider: BD1
+ consumer: BD1
+ - provider: BD1
+ consumer: BD1
+ state: present
+
+- name: Bind Contract2 with template service graph - ansible_service_graph2
+ cisco.mso.mso_schema_template_contract_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "ansible_template1"
+ contract: Contract2
+ service_graph: ansible_service_graph2
+ service_nodes:
+ - provider: BD1
+ consumer: BD1
+ - provider: BD1
+ consumer: BD1
+ state: present
+
+- name: Add site VRF region CIDR to the VRF1
+ cisco.mso.mso_schema_site_vrf_region_cidr:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ vrf: VRF1
+ region: westus2
+ cidr: 14.14.14.1/24
+ state: present
+
+- name: Execute tasks only for cloud sites
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+ block:
+ - name: Add Service Graph 1 at site level for the Azure site service graph test
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ service_graph: ansible_service_graph
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ devices:
+ - name: '{{ mso_tenant | default("ansible_test") }}_firewall1' # Third-Party Firewall - Listener not supported
+ - name: '{{ mso_tenant | default("ansible_test") }}_tplb' # Third-Party Load Balancer - Listener not supported
+ state: present
+ register: az_sg1_cm_present
+
+ - name: Add Service Graph 2 at site level for the Azure site service graph test
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ service_graph: ansible_service_graph2
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ devices:
+ - name: '{{ mso_tenant | default("ansible_test") }}_nlb' # Network Load Balancer - Listener supported
+ - name: '{{ mso_tenant | default("ansible_test") }}_aplb' # Application Load Balancer - Listener supported
+ state: present
+ register: az_sg1_cm_present
+
+ - name: Bind the Contract1 with site service graph - ansible_service_graph
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract1
+ service_graph_schema: '{{ mso_schema | default("ansible_schema") }}'
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph
+ state: present
+ register: az_add_site_con_sg_cm
+
+ - name: Bind the Contract2 with site service graph - ansible_service_graph2
+ cisco.mso.mso_schema_site_contract_service_graph:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ contract: Contract2
+ service_graph_schema: '{{ mso_schema | default("ansible_schema") }}'
+ service_graph_template: ansible_template1
+ service_graph: ansible_service_graph2
+ state: present
+ register: az_add_site_con_sg_cm
+
+# Test part
+- name: Negative test - add listener - nlb_li_tcp without device when the parent is not present
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: tcp
+ interval: 5
+ unhealthy_threshold: 2
+ success_code: 200-399
+ ignore_errors: true
+ register: nt_add_listener_without_device
+
+- name: Add listener - nlb_li_tcp - check_mode
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: tcp
+ interval: 5
+ unhealthy_threshold: 2
+ success_code: 200-399
+ output_level: debug
+ check_mode: true
+ register: add_nlb_li_tcp_cm
+
+- name: Add listener - nlb_li_tcp - normal_mode
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: tcp
+ interval: 5
+ unhealthy_threshold: 2
+ success_code: 200-399
+ register: add_nlb_li_tcp_nm
+
+- name: Add listener - nlb_li_tcp normal_mode again
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: tcp
+ interval: 5
+ unhealthy_threshold: 2
+ success_code: 200-399
+ register: add_nlb_li_tcp_nm_again
+
+- name: Add listener - nlb_li_udp without device when the parent is present
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_udp
+ listener_port: 80
+ listener_protocol: udp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ security_policy: default
+ rules:
+ - name: rule2
+ priority: 2
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: tcp
+ interval: 5
+ unhealthy_threshold: 2
+ success_code: 200-399
+ ignore_errors: true
+ register: add_nlb_li_udp
+
+- name: Add listener - ans_li_common - udp
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: ans_li_common
+ listener_port: 80
+ listener_protocol: udp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: common3
+ priority: 3
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: http
+ path: health_check_path
+ interval: 5
+ unhealthy_threshold: 2
+ success_code: 200-399
+ register: add_ans_li_common_udp
+
+- name: Add listener - aplb_li_https
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true # "yes" - host should be empty in the rule
+ success_code: "200"
+ target_ip_type: unspecified
+ register: add_aplb_li_https
+
+- name: Add listener - aplb_li_http
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener: aplb_li_http
+ listener_port: 80
+ listener_protocol: http
+ security_policy: default
+ rules:
+ - name: rule2
+ priority: 2
+ action_type: forward
+ port: 443
+ protocol: https
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 443
+ protocol: https
+ path: "/"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ host: use_host_from_rule
+ use_host_from_rule: false # "no"(unchecked) - host should be specified in the rule
+ success_code: "200"
+ target_ip_type: unspecified
+ register: add_aplb_li_http
+
+- name: Add listener - ans_li_common - http
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener: ans_li_common
+ listener_port: 80
+ listener_protocol: http
+ security_policy: default
+ rules:
+ - name: rule3
+ priority: 3
+ action_type: forward
+ port: 443
+ protocol: https
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 443
+ protocol: https
+ path: "/"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ host: use_host_from_rule
+ use_host_from_rule: false
+ success_code: "200"
+ target_ip_type: unspecified
+ register: add_ans_li_common_http
+
+- name: Assertions check for the add listeners test
+ ansible.builtin.assert:
+ that:
+ - nt_add_listener_without_device is not changed
+ - nt_add_listener_without_device.current == {}
+ - nt_add_listener_without_device.msg == "The 'device' name is required to initialize the parent object."
+ - add_nlb_li_tcp_cm is changed
+ - add_nlb_li_tcp_cm.current != {}
+ - add_nlb_li_tcp_cm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.name == "nlb_li_tcp"
+ - add_nlb_li_tcp_cm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.nlbDevIp.name == "10.10.10.10"
+ - add_nlb_li_tcp_cm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.nlbDevIp.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_nlb/vip-10.10.10.10"
+ - add_nlb_li_tcp_cm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.protocol == "tcp"
+ - add_nlb_li_tcp_cm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.index == 1
+ - add_nlb_li_tcp_cm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.name == "rule1"
+ - add_nlb_li_tcp_cm.proposed != {}
+ - add_nlb_li_tcp_cm.proposed.deviceConfiguration.cloudLoadBalancer.listeners.0.name == "nlb_li_tcp"
+ - add_nlb_li_tcp_cm.proposed.deviceConfiguration.cloudLoadBalancer.listeners.0.nlbDevIp.name == "10.10.10.10"
+ - add_nlb_li_tcp_cm.proposed.deviceConfiguration.cloudLoadBalancer.listeners.0.nlbDevIp.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_nlb/vip-10.10.10.10"
+ - add_nlb_li_tcp_cm.proposed.deviceConfiguration.cloudLoadBalancer.listeners.0.protocol == "tcp"
+ - add_nlb_li_tcp_cm.proposed.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.index == 1
+ - add_nlb_li_tcp_cm.proposed.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.name == "rule1"
+ - add_nlb_li_tcp_nm is changed
+ - add_nlb_li_tcp_nm.current != {}
+ - add_nlb_li_tcp_nm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.name == "nlb_li_tcp"
+ - add_nlb_li_tcp_nm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.nlbDevIp.name == "10.10.10.10"
+ - add_nlb_li_tcp_nm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.nlbDevIp.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_nlb/vip-10.10.10.10"
+ - add_nlb_li_tcp_nm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.protocol == "tcp"
+ - add_nlb_li_tcp_nm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.index == 1
+ - add_nlb_li_tcp_nm.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.name == "rule1"
+ - add_nlb_li_tcp_nm.previous == {}
+ - add_nlb_li_tcp_nm_again is not changed
+ - add_nlb_li_tcp_nm_again.current.name == "nlb_li_tcp"
+ - add_nlb_li_tcp_nm_again.current.nlbDevIp.name == "10.10.10.10"
+ - add_nlb_li_tcp_nm_again.current.nlbDevIp.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_nlb/vip-10.10.10.10"
+ - add_nlb_li_tcp_nm_again.current.protocol == "tcp"
+ - add_nlb_li_tcp_nm_again.current.rules.0.index == 1
+ - add_nlb_li_tcp_nm_again.current.rules.0.name == "rule1"
+ - add_nlb_li_udp is not changed
+ - add_nlb_li_udp.msg == "When the 'frontend_ip' is '10.10.10.10', the ['device'] attributes must be set and the object name{{':'}} nlb_li_udp"
+ - add_ans_li_common_udp is changed
+ - add_ans_li_common_udp.current.name == "ans_li_common"
+ - add_ans_li_common_udp.current.protocol == "udp"
+ - add_ans_li_common_udp.current.nlbDevIp.name == "10.10.10.10"
+ - add_ans_li_common_udp.current.nlbDevIp.dn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/clb-{{ mso_tenant | default("ansible_test") }}_nlb/vip-10.10.10.10"
+ - add_aplb_li_https is changed
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.name == "aplb_li_https"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.protocol == "https"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.port == 443
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.certificates.0.default == true
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.certificates.0.name == "ans_li_tenant_keyring"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.certificates.0.store == "default"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.certificates.0.tDn == "uni/tn-{{ mso_tenant | default("ansible_test") }}/certstore"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.index == 1
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.name == "rule1"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.protocol == "http"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.actionType == "forward"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.healthCheck.protocol == "http"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.healthCheck.path == "health_check_path"
+ - add_aplb_li_https.current.deviceConfiguration.cloudLoadBalancer.listeners.0.rules.0.providerEpgRef is match("/schemas/.+/templates/ansible_template1/anps/AP1/epgs/EPG1")
+ - add_aplb_li_http is changed
+ - add_aplb_li_http.current.name == "aplb_li_http"
+ - add_aplb_li_http.current.protocol == "http"
+ - add_aplb_li_http.current.rules.0.healthCheck.host == "use_host_from_rule"
+ - add_aplb_li_http.current.rules.0.healthCheck.useHostFromRule == "no"
+ - add_aplb_li_http.current.rules.0.healthCheck.protocol == "https"
+ - add_ans_li_common_http is changed
+ - add_ans_li_common_http.current.name == "ans_li_common"
+ - add_ans_li_common_http.current.protocol == "http"
+ - add_ans_li_common_http.current.rules.0.healthCheck.protocol == "https"
+ - add_ans_li_common_http.current.rules.0.healthCheck.host == "use_host_from_rule"
+ - add_ans_li_common_http.current.rules.0.healthCheck.useHostFromRule == "no"
+ - add_ans_li_common_http.current.rules.0.actionType == "forward"
+ - add_ans_li_common_http.current.rules.0.protocol == "https"
+ - add_ans_li_common_http.current.rules.0.name == "rule3"
+ - add_ans_li_common_http.current.rules.0.providerEpgRef is match("/schemas/.+/templates/ansible_template1/anps/AP1/epgs/EPG1")
+
+- name: Update listener - ans_li_common rule health_check property - timeout value 30 to 60
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener: ans_li_common
+ listener_port: 80
+ listener_protocol: http
+ security_policy: default
+ rules:
+ - name: rule3
+ priority: 3
+ action_type: forward
+ port: 443
+ protocol: https
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 443
+ protocol: https
+ path: "/"
+ interval: 30
+ timeout: 60
+ unhealthy_threshold: 3
+ host: use_host_from_rule
+ use_host_from_rule: false
+ success_code: "200"
+ target_ip_type: unspecified
+ register: update_ans_li_common
+
+- name: Update listener - ans_li_common with invalid service_node_index 5
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 5
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener: ans_li_common
+ listener_port: 80
+ listener_protocol: http
+ security_policy: default
+ rules:
+ - name: rule3
+ priority: 3
+ action_type: forward
+ port: 443
+ protocol: https
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 443
+ protocol: https
+ path: "/"
+ interval: 30
+ timeout: 60
+ unhealthy_threshold: 3
+ host: use_host_from_rule
+ use_host_from_rule: false
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_update_ans_li_common
+
+- name: Assertions check for the update listeners test
+ ansible.builtin.assert:
+ that:
+ - update_ans_li_common is changed
+ - update_ans_li_common.current.name == "ans_li_common"
+ - update_ans_li_common.current.protocol == "http"
+ - update_ans_li_common.current.rules.0.actionType == "forward"
+ - update_ans_li_common.current.rules.0.providerEpgRef is match( "/schemas/.+/templates/ansible_template1/anps/AP1/epgs/EPG1")
+ - update_ans_li_common.current.rules.0.protocol == "https"
+ - update_ans_li_common.current.rules.0.healthCheck.protocol == "https"
+ - nt_update_ans_li_common is not changed
+ - nt_update_ans_li_common.msg == "The service_node_index{{':'}} 5 is out of range."
+
+- name: Query all listeners
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: query
+ register: query_all_listeners
+
+- name: Query all listeners with service_node_index 0
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ state: query
+ register: node1_query_all_listeners
+
+- name: Query all listeners with name ans_li_common without service_node_index
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ listener: ans_li_common
+ state: query
+ register: query_all_ans_li_common
+
+- name: Query a listener with name ans_li_common and service_node_index 0
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ listener: ans_li_common
+ service_node_index: 0
+ state: query
+ register: query_a_ans_li_common
+
+- name: Query an invalid listener with name invalid_ans_li_common - under Contract2
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ listener: invalid_ans_li_common
+ state: query
+ register: nt_query_c1_listeners
+
+- name: Query an invalid listener with name invalid_ans_li_common - under Contract2 with service_node_index 1
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ listener: invalid_ans_li_common
+ service_node_index: 1
+ state: query
+ register: nt_query_invalid_listener_node1
+
+- name: Assertions check for the query listeners test
+ ansible.builtin.assert:
+ that:
+ - query_all_listeners is not changed
+ - query_all_listeners.current | length >= 5
+ - node1_query_all_listeners is not changed
+ - node1_query_all_listeners.current | length == 2
+ - query_all_ans_li_common is not changed
+ - query_all_ans_li_common.current | length == 2
+ - query_all_ans_li_common.current.0.name == "ans_li_common"
+ - query_all_ans_li_common.current.1.name == "ans_li_common"
+ - query_a_ans_li_common is not changed
+ - query_a_ans_li_common.current != {}
+ - query_a_ans_li_common.current.name == "ans_li_common"
+ - nt_query_c1_listeners is not changed
+ - nt_query_c1_listeners.current == {}
+ - nt_query_invalid_listener_node1 is not changed
+ - nt_query_invalid_listener_node1.current == {}
+
+- name: Query all listeners under Contract1 - Negative test
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract1"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ listener: invalid_ans_li_common
+ state: query
+ register: nt_query_all_c1_listeners
+
+- name: Query all listeners under Contract1 with service_node_index 1 - Negative test
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract1"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ listener: invalid_ans_li_common
+ service_node_index: 1
+ state: query
+ register: nt_query_c1_listeners
+
+- name: Assertions check for the query listeners negative test
+ ansible.builtin.assert:
+ that:
+ - nt_query_all_c1_listeners is not changed
+ - nt_query_all_c1_listeners.current == {}
+ - nt_query_c1_listeners is not changed
+ - nt_query_c1_listeners.current == {}
+
+- name: Negative test - query all listeners with the non-cloud site
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract1"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: "ansible_test"
+ service_node_index: 0
+ state: query
+ ignore_errors: true
+ register: nt_non_cloud_site
+
+- name: Negative test - add listener - nt_aplb_li_https - ssl cert missing
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: https
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_lp_https_ssl_cert_missing
+
+- name: Negative test - add listener - nt_aplb_li_https - Contract3 SG Ref missing
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract3"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_invalid_contract3
+
+- name: Negative test - add listener - nt_aplb_li_https - with invalid device
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract3"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb_invalid'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_invalid_device
+
+- name: Negative test - add listener - nt_fw_li_https to the Third-Party Firewall
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract1"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nt_fw_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_firewall1'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_tp_fw_listener
+
+- name: Negative test - add listener - nt_tplb_li_https to the Third-Party load-balancer
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract1"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_tplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_tplb'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_tp_lb_listener
+
+- name: Negative test - add listener - nt_aplb_li_https - with same listener and rule protocol - https
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: https
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_lp_and_rp_https
+
+- name: Negative test - add listener - nt_aplb_li_https - with same listener and rule protocol - http
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: http
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_lp_and_rp_http
+
+- name: Negative test - add listener - nt_aplb_li_https - rule action_type is redirect
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: redirect
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_action_type_redirect
+
+- name: Negative test - add listener - nt_aplb_li_https - rule action_type is forward
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_action_type_forward
+
+- name: Negative test - add listener - nt_aplb_li_https - rule url_type is custom
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 1
+ listener: nt_aplb_li_https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ device: '{{ mso_tenant | default("ansible_test") }}_aplb'
+ listener_port: 443
+ listener_protocol: https
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: http
+ provider_epg_ref:
+ anp_name: AP1
+ epg_name: EPG1
+ url_type: custom
+ health_check:
+ port: 80
+ protocol: http
+ path: "health_check_path"
+ interval: 30
+ timeout: 30
+ unhealthy_threshold: 3
+ use_host_from_rule: true
+ success_code: "200"
+ target_ip_type: unspecified
+ ignore_errors: true
+ register: nt_url_type_custom
+
+- name: Negative test - add listener - nlb_li_tcp - listener protocol is tcp/udp - health_check missing
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ ignore_errors: true
+ register: nt_lp_tcp_udp_hp_missing
+
+- name: Negative test - add listener - nlb_li_tcp - listener protocol is tcp/udp - health_check protocol tcp - unhealthy_threshold missing
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: tcp
+ interval: 5
+ success_code: 200-399
+ ignore_errors: true
+ register: nt_lp_tcp_udp_hp_tcp_ut_missing
+
+- name: Negative test - add listener - nlb_li_tcp - listener protocol is tcp/udp - health_check protocol http/https - unhealthy_threshold missing
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_tcp
+ listener_port: 80
+ listener_protocol: tcp
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: http
+ interval: 5
+ success_code: 200-399
+ ignore_errors: true
+ register: nt_lp_tcp_udp_hp_http_https_ut_missing
+
+- name: Negative test - add listener - nlb_li_http - listener protocol is http - health_check protocol https - unhealthy_threshold missing
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_http
+ listener_port: 80
+ listener_protocol: http
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: https
+ interval: 5
+ success_code: 200-399
+ ignore_errors: true
+ register: nt_lp_http_hp_https_ut_missing
+
+- name: Negative test - add listener - nlb_li_http - listener protocol is http - health_check protocol http
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_http
+ listener_port: 80
+ listener_protocol: http
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: http
+ interval: 5
+ success_code: 200-399
+ ignore_errors: true
+ register: nt_lp_http_hp_http
+
+- name: Negative test - add listener - nlb_li_https - listener protocol is https - health_check protocol https
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: nlb_li_https
+ listener_port: 80
+ listener_protocol: https
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ frontend_ip: "10.10.10.10"
+ device: '{{ mso_tenant | default("ansible_test") }}_nlb'
+ security_policy: default
+ ssl_certificates:
+ - name: '{{ mso_tenant | default("ansible_test") }}_keyring'
+ certificate_store: default
+ rules:
+ - name: rule1
+ priority: 1
+ action_type: forward
+ port: 80
+ protocol: tcp
+ health_check:
+ port: 80
+ protocol: https
+ interval: 5
+ success_code: 200-399
+ ignore_errors: true
+ register: nt_lp_https_hp_https
+
+- name: Negative test - remove a listener - ans_li_common - with invalid service_node_index is -1
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: -1
+ listener: ans_li_common
+ state: absent
+ ignore_errors: true
+ register: rm_ans_li_common_nm_again
+
+- name: Assertions check for the listeners negative test
+ ansible.builtin.assert:
+ that:
+ - nt_non_cloud_site is not changed
+ - nt_non_cloud_site.msg == "The Site Contract Service Graph Listener is not supported for the site{{':'}} ansible_test."
+ - nt_lp_https_ssl_cert_missing is not changed
+ - nt_lp_https_ssl_cert_missing.msg == "When the 'listener_protocol' is 'https', the ['security_policy', 'ssl_certificates'] attributes must be set and the object name{{':'}} nt_aplb_li_https"
+ - nt_invalid_contract3 is not changed
+ - nt_invalid_contract3.msg == "The site contract{{':'}} Contract3 is not associated with a service graph."
+ - nt_invalid_device is not changed
+ - nt_invalid_device.msg == "The site contract{{':'}} Contract3 is not associated with a service graph."
+ - nt_tp_fw_listener is not changed
+ - nt_tp_fw_listener.msg == "Listener is not supported for the 'service_node_index'{{':'}} 0 is associated with the Third-Party Firewall device."
+ - nt_tp_lb_listener is not changed
+ - nt_tp_lb_listener.msg == "Listener is not supported for the 'service_node_index'{{':'}} 1 is associated with the Third-Party Load Balancer device."
+ - nt_lp_and_rp_https is not changed
+ - nt_lp_and_rp_https.msg == "When the 'listener_protocol' is 'https', the rule 'protocol' must be 'https'"
+ - nt_lp_and_rp_http is not changed
+ - nt_lp_and_rp_http.msg == "When the 'listener_protocol' is 'http', the rule 'protocol' must be 'http'"
+ - nt_action_type_redirect is not changed
+ - nt_action_type_redirect.msg == "When the 'action_type' is 'redirect', the ['redirect_protocol', 'redirect_port', 'url_type', 'redirect_code'] attributes must be set at the object position{{':'}} 0 and the object name{{':'}} rule1"
+ - nt_action_type_forward is not changed
+ - nt_action_type_forward.msg == "When the 'action_type' is 'forward', the ['health_check'] attributes must be set at the object position{{':'}} 0 and the object name{{':'}} rule1"
+ - nt_url_type_custom is not changed
+ - nt_url_type_custom.msg == "When the 'url_type' is 'custom', the ['redirect_host_name', 'redirect_path', 'redirect_query', 'response_code'] attributes must be set at the object position{{':'}} 0 and the object name{{':'}} rule1"
+ - nt_lp_tcp_udp_hp_missing is not changed
+ - nt_lp_tcp_udp_hp_missing.msg == "When the 'action_type' is 'forward', the ['health_check'] attributes must be set at the object position{{':'}} 0 and the object name{{':'}} rule1"
+ - nt_lp_tcp_udp_hp_tcp_ut_missing is not changed
+ - nt_lp_tcp_udp_hp_tcp_ut_missing.msg == "When the 'health_check - 'protocol'' is 'tcp', the ['unhealthy_threshold'] attributes must be set"
+ - nt_lp_tcp_udp_hp_http_https_ut_missing is not changed
+ - nt_lp_tcp_udp_hp_http_https_ut_missing.msg == "When the 'health_check - 'protocol'' is 'http/https', the ['path', 'unhealthy_threshold'] attributes must be set"
+ - nt_lp_http_hp_https_ut_missing is not changed
+ - nt_lp_http_hp_https_ut_missing.msg == "When the 'health_check - 'protocol'' is 'http/https', the ['path', 'unhealthy_threshold', 'timeout'] attributes must be set"
+ - nt_lp_http_hp_http is not changed
+ - nt_lp_http_hp_http.msg == "The 'listener_protocol'{{':'}} http and the health_check protocol{{':'}} http is not a valid configuration at the object position{{':'}} 0 and the object name{{':'}} rule1"
+ - nt_lp_https_hp_https is not changed
+ - nt_lp_https_hp_https.msg == "The 'listener_protocol'{{':'}} https and the health_check protocol{{':'}} https is not a valid configuration at the object position{{':'}} 0 and the object name{{':'}} rule1"
+ - rm_ans_li_common_nm_again is not changed
+ - rm_ans_li_common_nm_again.msg == "The service_node_index{{':'}} -1 is not valid."
+
+- name: Remove an existing listener - ans_li_common - check_mode
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: ans_li_common
+ state: absent
+ output_level: debug
+ check_mode: true
+ register: rm_ans_li_common_cm
+
+- name: Remove an existing listener - ans_li_common - normal_mode
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: ans_li_common
+ state: absent
+ register: rm_ans_li_common_nm
+
+- name: Remove an existing listener - ans_li_common - normal_mode again
+ cisco.mso.mso_schema_site_contract_service_graph_listener:
+ <<: *mso_info
+ contract: "Contract2"
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: ansible_template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_node_index: 0
+ listener: ans_li_common
+ state: absent
+ register: rm_ans_li_common_nm_again
+
+- name: Assertions check for remove listeners
+ ansible.builtin.assert:
+ that:
+ - rm_ans_li_common_cm is changed
+ - rm_ans_li_common_cm.current == {}
+ - rm_ans_li_common_cm.previous != {}
+ - rm_ans_li_common_cm.previous.name == "ans_li_common"
+ - rm_ans_li_common_cm.previous.protocol == "udp"
+ - rm_ans_li_common_cm.proposed == {}
+ - rm_ans_li_common_nm is changed
+ - rm_ans_li_common_nm.current == {}
+ - rm_ans_li_common_nm.previous != {}
+ - rm_ans_li_common_nm.previous.name == "ans_li_common"
+ - rm_ans_li_common_nm.previous.protocol == "udp"
+ - rm_ans_li_common_nm_again is not changed
+ - rm_ans_li_common_nm_again.current == {}
+ - rm_ans_li_common_nm_again.previous == {}
+
+# Cleanup part
+- name: Remove the site association for the ansible_schema templates
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ template: "{{ item }}"
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: present
+ loop:
+ - "ansible_template1"
+ - "ansible_template2"
+
+- name: Remove the ansible_schema schema
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_schema") }}'
+ state: absent
+
+- name: Remove the {{ mso_tenant | default("ansible_test") }} tenant
+ cisco.mso.mso_tenant:
+ <<: *mso_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
+
+- name: Set ansible_network_os to cisco.aci.aci and ansible_connection to local
+ ansible.builtin.set_fact:
+ ansible_connection: local
+ ansible_network_os: cisco.aci.aci
+
+- name: Reset the ansible_connection to access the APIC
+ ansible.builtin.meta: reset_connection
+
+- name: Remove the common tenant redirect policy
+ cisco.aci.aci_rest:
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: no
+ path: "/api/node/mo/uni/tn-common/svcCont.json"
+ method: post
+ content:
+ vnsSvcRedirectPol:
+ attributes:
+ name: redirect_policy2
+ status: deleted
+
+- name: Remove the {{ mso_tenant | default("ansible_test") }} from the APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ tenant: '{{ mso_tenant | default("ansible_test") }}'
+ state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/pki/admin.crt b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/pki/admin.crt
new file mode 100644
index 000000000..1f797a4c2
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_contract_service_graph_listener/tasks/pki/admin.crt
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICODCCAaGgAwIBAgIJAIt8XMntue0VMA0GCSqGSIb3DQEBCwUAMDQxDjAMBgNV
+BAMMBUFkbWluMRUwEwYDVQQKDAxZb3VyIENvbXBhbnkxCzAJBgNVBAYTAlVTMCAX
+DTE4MDEwOTAwNTk0NFoYDzIxMTcxMjE2MDA1OTQ0WjA0MQ4wDAYDVQQDDAVBZG1p
+bjEVMBMGA1UECgwMWW91ciBDb21wYW55MQswCQYDVQQGEwJVUzCBnzANBgkqhkiG
+9w0BAQEFAAOBjQAwgYkCgYEAohG/7axtt7CbSaMP7r+2mhTKbNgh0Ww36C7Ta14i
+v+VmLyKkQHnXinKGhp6uy3Nug+15a+eIu7CrgpBVMQeCiWfsnwRocKcQJWIYDrWl
+XHxGQn31yYKR6mylE7Dcj3rMFybnyhezr5D8GcP85YRPmwG9H2hO/0Y1FUnWu9Iw
+AQkCAwEAAaNQME4wHQYDVR0OBBYEFD0jLXfpkrU/ChzRvfruRs/fy1VXMB8GA1Ud
+IwQYMBaAFD0jLXfpkrU/ChzRvfruRs/fy1VXMAwGA1UdEwQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADgYEAOmvre+5tgZ0+F3DgsfxNQqLTrGiBgGCIymPkP/cBXXkNuJyl
+3ac7tArHQc7WEA4U2R2rZbEq8FC3UJJm4nUVtCPvEh3G9OhN2xwYev79yt6pIn/l
+KU0Td2OpVyo0eLqjoX5u2G90IBWzhyjFbo+CcKMrSVKj1YOdG0E3OuiJf00=
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg/tasks/main.yml
index 5b8c799db..8dc05d9fb 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg/tasks/main.yml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,13 +22,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -37,7 +37,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -48,7 +48,7 @@
state: present
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -59,7 +59,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -70,7 +70,7 @@
ignore_errors: true
- name: Associate non-cloud site with ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
@@ -78,12 +78,12 @@
register: add_ncs
- name: Verify add_ncs
- assert:
+ ansible.builtin.assert:
that:
- add_ncs is not changed
- name: Remove a site from a schema with Template1 and Template2
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -91,11 +91,13 @@
state: absent
ignore_errors: true
loop:
+ - Template4
+ - Template3
- Template2
- Template1
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -105,7 +107,7 @@
# Ensure pre requisites exist
- name: Ensure schema 1 with Template1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -115,9 +117,10 @@
- Template1
- Template2
- Template3
+ - Template4
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -125,15 +128,23 @@
state: present
- name: Ensure VRF2 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
vrf: VRF2
state: present
+- name: Ensure VRF3 exists
+ cisco.mso.mso_schema_template_vrf:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template3
+ vrf: VRF3
+ state: present
+
- name: Ensure L3Out1 Exists
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -143,7 +154,7 @@
state: present
- name: Ensure L3Out2 Exists
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -152,9 +163,19 @@
l3out: L3out2
state: present
+- name: Ensure L3Out3 Exists
+ cisco.mso.mso_schema_template_l3out:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template3
+ vrf:
+ name: VRF3
+ l3out: L3out3
+ state: present
+
# ADD external EPG to template
- name: Add external EPG at template level(check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -172,7 +193,7 @@
register: cm_add_epg
- name: Verify cm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg is changed
- cm_add_epg.previous == {}
@@ -181,7 +202,7 @@
- cm_add_epg.current.vrfRef.vrfName == "VRF1"
- name: Add external EPG at template level(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -198,7 +219,7 @@
register: nm_add_epg
- name: Verify nm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg is changed
- nm_add_epg.previous == {}
@@ -213,7 +234,7 @@
block:
# Associate site to schema/template after creating External EPG
- name: Add non-cloud site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -222,13 +243,13 @@
register: add_site
- name: Verify add_site
- assert:
+ ansible.builtin.assert:
that:
- add_site.current.siteId is match ("[0-9a-zA-Z]*")
- add_site.current.templateName == "Template1"
- name: Add site L3Out (normal_mode)
- mso_schema_site_l3out:
+ cisco.mso.mso_schema_site_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -244,7 +265,7 @@
# ADD External EPGs to site
- name: ADD External EPG1 to site (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -256,20 +277,20 @@
register: cm_add_epg
- name: Verify cm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg.current.externalEpgRef.externalEpgName == "ansible_test_1"
- cm_add_epg.current.externalEpgRef.templateName == "Template1"
- name: Verify cm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg is changed
- cm_add_epg.previous == {}
- when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
+ when: version.current.version is version('4.0', '<')
- name: Add external EPG to site (normal mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -280,21 +301,21 @@
register: nm_add_epg
- name: Verify nm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg.current.externalEpgRef.externalEpgName == "ansible_test_1"
- nm_add_epg.current.externalEpgRef.templateName == "Template1"
- cm_add_epg.current.externalEpgRef.schemaId == nm_add_epg.current.externalEpgRef.schemaId
- name: Verify nm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg is changed
- nm_add_epg.previous == {}
- when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
+ when: version.current.version is version('4.0', '<')
- name: ADD External EPG1 to site again
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -305,7 +326,7 @@
register: add_epg_again
- name: Verify add_epg_again
- assert:
+ ansible.builtin.assert:
that:
- add_epg_again is not changed
- add_epg_again.current.externalEpgRef.externalEpgName == "ansible_test_1"
@@ -313,7 +334,7 @@
# QUERY ALL EPG
- name: Query all external EPGs in site (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -323,7 +344,7 @@
register: cm_query_all_epgs
- name: Query all EPG (normal mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -332,14 +353,14 @@
register: nm_query_all_epgs
- name: Verify query_all_epgs
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_epgs is not changed
- nm_query_all_epgs is not changed
# QUERY AN EPG
- name: Query epg 1(check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -351,7 +372,7 @@
register: cm_query_epg_1
- name: Query epg 1(normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -362,13 +383,13 @@
register: nm_query_epg_1
- name: Verify cm_query_epg_1 and nm_query_epg_1
- assert:
+ ansible.builtin.assert:
that:
- cm_query_epg_1 is not changed
- nm_query_epg_1 is not changed
- name: Query epg 1 without l3Out
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -378,13 +399,13 @@
register: nm_query_epg_l3out
- name: Verify nm_query_epg_l3out
- assert:
+ ansible.builtin.assert:
that:
- nm_query_epg_l3out is not changed
# REMOVE EPG
- name: Remove EPG (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -396,13 +417,13 @@
register: cm_remove_epg
- name: Verify cm_remove_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_epg is changed
- cm_remove_epg.current == {}
- name: Remove EPG (normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -413,7 +434,7 @@
register: nm_remove_epg
- name: Add site external EPG without L3Out when template external EPG type is on-premise (normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -424,13 +445,13 @@
register: nm_add_epg_no_l3out
- name: Verify nm_add_epg_no_l3out
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_no_l3out is not changed
- nm_add_epg_no_l3out.msg == "L3Out cannot be empty when template external EPG type is 'on-premise'."
- name: Remove external EPG at template level
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -439,14 +460,14 @@
register: nm_remove_epg
- name: Verify nm_remove_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_epg is changed
- nm_remove_epg.current == {}
# Associate site to schema/template before creating External EPG
- name: Add non-cloud site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -456,14 +477,30 @@
register: add_site
- name: Verify add_site
- assert:
+ ansible.builtin.assert:
that:
- add_site.current.siteId is match ("[0-9a-zA-Z]*")
- add_site.current.templateName == "Template2"
+ - name: Add non-cloud site to a schema
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ site: '{{ mso_site | default("ansible_test") }}'
+ template: Template3
+ state: present
+ when: version.current.version is version('3.3', '>=')
+ register: add_site
+
+ - name: Verify add_site
+ assert:
+ that:
+ - add_site.current.siteId is match ("[0-9a-zA-Z]*")
+ - add_site.current.templateName == "Template3"
+
# Create template External EPG after site association
- name: Add external EPG (at template level)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -480,7 +517,7 @@
register: nm_add_ex_epg
- name: Verify nm_add_ex_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_ex_epg is changed
- nm_add_ex_epg.previous == {}
@@ -488,7 +525,7 @@
- nm_add_ex_epg.current.vrfRef.vrfName == "VRF2"
- name: Add external EPG to site (normal mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -499,21 +536,177 @@
register: nm_add_epg
- name: Verify nm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg.current.externalEpgRef.externalEpgName == "ansible_test_2"
- nm_add_epg.current.externalEpgRef.templateName == "Template2"
- name: Verify nm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg is changed
- nm_add_epg.previous == {}
- when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
+ when: version.current.version is version('4.0', '<')
+
+ # Verify L3Out association at site level External EPG
+
+ # 1. Verifying External EPG association with VRFs of different templates in same schema
+ - name: Execute tasks only for MSO version < 4.0
+ when: version.current.version is version('4.0', '<')
+ block:
+ # 1.1. Verifying External EPG association with VRF in the same template of the same schema
+ - name: Add external EPG 1 at Template1 and associate it with the VRF1 in the Template1
+ cisco.mso.mso_schema_template_external_epg:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ external_epg: ansible_test_1
+ vrf:
+ name: VRF1
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ state: present
+ register: add_epg1
+
+ - name: Verify add External EPG 1
+ assert:
+ that:
+ - add_epg1 is changed
+ - add_epg1.previous == {}
+ - add_epg1.current.name == "ansible_test_1"
+ - add_epg1.current.vrfRef.templateName == "Template1"
+ - add_epg1.current.vrfRef.vrfName == "VRF1"
+ - add_epg1.current.vrfRef.schemaId == add_epg1.current.vrfRef.schemaId
+
+ - name: Add external EPG to site and associate it with the L3Out1 in Template1
+ cisco.mso.mso_schema_site_external_epg:
+ <<: *mso_info
+ site: '{{ mso_site | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ external_epg: ansible_test_1
+ l3out: L3out1
+ l3out_template: Template1
+ l3out_schema: '{{ mso_schema | default("ansible_test") }}'
+ state: present
+ register: add_epg_site_1
+
+ - name: Verify add_epg_site_1
+ assert:
+ that:
+ - add_epg_site_1.current.externalEpgRef.externalEpgName == "ansible_test_1"
+ - add_epg_site_1.current.externalEpgRef.templateName == "Template1"
+
+ - name: Verify add_epg_site_1
+ assert:
+ that:
+ - add_epg_site_1 is changed
+ - add_epg_site_1.previous == {}
+
+ - name: Add external EPG to site and associate it with the L3Out3 in Template3 (VRF in same template)
+ cisco.mso.mso_schema_site_external_epg:
+ <<: *mso_info
+ site: '{{ mso_site | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ external_epg: ansible_test_1
+ l3out: L3out3
+ l3out_template: Template3
+ l3out_schema: '{{ mso_schema | default("ansible_test") }}'
+ state: present
+ register: add_epg_site1_l3out3
+
+ - name: Verify add_epg_site1_l3out3
+ assert:
+ that:
+ - add_epg_site1_l3out3.current.externalEpgRef.externalEpgName == "ansible_test_1"
+ - add_epg_site1_l3out3.current.externalEpgRef.templateName == "Template1"
+
+ - name: Verify add_epg_site1_l3out3
+ assert:
+ that:
+ - add_epg_site1_l3out3 is changed
+ - add_epg_site1_l3out3.previous.l3outDn == "uni/tn-ansible_test/out-L3out1"
+
+ # 1.2. Verifying External EPG association with VRF in the different template of the same schema
+ - name: Add external EPG 1 at Template1 and associate it with the VRF3 in Template3
+ cisco.mso.mso_schema_template_external_epg:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ external_epg: ansible_test_3
+ vrf:
+ name: VRF3
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template3
+ state: present
+ register: add_epg3
+
+ - name: Verify add External EPG 3
+ assert:
+ that:
+ - add_epg3 is changed
+ - add_epg3.previous == {}
+ - add_epg3.current.name == "ansible_test_3"
+ - add_epg3.current.vrfRef.templateName == "Template3"
+ - add_epg3.current.vrfRef.vrfName == "VRF3"
+ - add_epg3.current.vrfRef.schemaId == add_epg3.current.vrfRef.schemaId
+
+ # ExternalEpg and its L3Out are associated with different VRF in a template
+ - name: Add external EPG to site and associate it with the L3Out1 in Template1
+ cisco.mso.mso_schema_site_external_epg:
+ <<: *mso_info
+ site: '{{ mso_site | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ external_epg: ansible_test_3
+ l3out: L3out1
+ l3out_template: Template1
+ l3out_schema: '{{ mso_schema | default("ansible_test") }}'
+ state: present
+ register: add_epg_site_3
+
+ - name: Verify add_epg_site_3
+ assert:
+ that:
+ - add_epg_site_3.current.externalEpgRef.externalEpgName == "ansible_test_3"
+ - add_epg_site_3.current.externalEpgRef.templateName == "Template1"
+ - add_epg_site_3.current.l3outRef is match('/schemas/[0-9a-zA-Z]*/templates/Template1/l3outs/L3out1')
+
+ - name: Verify add_epg_site_3
+ assert:
+ that:
+ - add_epg_site_3 is changed
+ - add_epg_site_3.previous == {}
+
+ - name: Add external EPG to site and associate it with the L3Out3 in Template3
+ cisco.mso.mso_schema_site_external_epg:
+ <<: *mso_info
+ site: '{{ mso_site | default("ansible_test") }}'
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ external_epg: ansible_test_3
+ l3out: L3out3
+ l3out_template: Template3
+ l3out_schema: '{{ mso_schema | default("ansible_test") }}'
+ state: present
+ register: add_epg_site_3_l3out3
+
+ - name: Verify add_epg_site_3_l3out3
+ assert:
+ that:
+ - add_epg_site_3_l3out3.current.externalEpgRef.externalEpgName == "ansible_test_1"
+ - add_epg_site_3_l3out3.current.externalEpgRef.templateName == "Template1"
+
+ - name: Verify add_epg_site_3_l3out3
+ assert:
+ that:
+ - add_epg_site_3_l3out3 is changed
+ - add_epg_site_3_l3out3.previous == {}
# QUERY NON-EXISTING external EPG
- name: Query non-existing External EPG (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -526,7 +719,7 @@
register: cm_query_non_external_epg
- name: Query non-existing External EPG (normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -538,7 +731,7 @@
register: nm_query_non_external_epg
- name: Verify cm_query_non_external_epg and nm_query_non_external_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_external_epg is not changed
- nm_query_non_external_epg is not changed
@@ -546,7 +739,7 @@
# USE NON-EXISTING STATE
- name: non_existing_state state (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -558,7 +751,7 @@
register: cm_non_existing_state
- name: non_existing_state state (normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -570,7 +763,7 @@
register: nm_non_existing_state
- name: Verify cm_non_existing_state and nm_non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -578,7 +771,7 @@
# USE A NON_EXISTING_TEMPLATE
- name: non_existing_template (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -591,7 +784,7 @@
register: cm_non_existing_template
- name: non_existing_template site association(normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -603,15 +796,15 @@
register: nm_non_existing_template
- name: Verify cm_non_existing_template and nm_non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
- - cm_non_existing_template.msg == nm_non_existing_template.msg == "Provided template 'non_existing_template' not matching existing template(s){{':'}} Template1, Template2, Template3"
+ - cm_non_existing_template.msg == nm_non_existing_template.msg == "Provided template 'non_existing_template' not matching existing template(s){{':'}} Template1, Template2, Template3, Template4"
# USE A NON_EXISTING_SCHEMA
- name: non_existing_schema (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -624,7 +817,7 @@
register: cm_non_existing_schema
- name: non_existing_schema (normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: non_existing_schema
site: '{{ mso_site | default("ansible_test") }}'
@@ -636,7 +829,7 @@
register: nm_non_existing_schema
- name: Verify cm_non_existing_schema and nm_non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -644,7 +837,7 @@
# USE A NON_EXISTING_SITE
- name: non_existing_site (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non_existing_site
@@ -657,7 +850,7 @@
register: cm_non_existing_site
- name: non_existing_site (normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: non_existing_site
@@ -669,7 +862,7 @@
register: nm_non_existing_site
- name: Verify cm_non_existing_site and nm_non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site is not changed
- nm_non_existing_site is not changed
@@ -677,11 +870,11 @@
# USE A NON_EXISTING_SITE_TEMPLATE
- name: non_existing_site_template (check_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
- template: Template3
+ template: Template4
external_epg: ansible_test_2
l3out: L3out1
state: query
@@ -690,11 +883,11 @@
register: cm_non_existing_site_template
- name: non_existing_site_template (normal_mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
- template: Template3
+ template: Template4
external_epg: ansible_test_2
l3out: L3out1
state: query
@@ -702,32 +895,32 @@
register: nm_non_existing_site_template
- name: Verify cm_non_existing_site_template and nm_non_existing_site_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site_template is not changed
- nm_non_existing_site_template is not changed
- - cm_non_existing_site_template.msg == nm_non_existing_site_template.msg == "Provided site 'ansible_test' not associated with template 'Template3'. Site is currently associated with template(s){{':'}} Template1, Template2"
+ - cm_non_existing_site_template.msg == nm_non_existing_site_template.msg == "Provided site 'ansible_test' not associated with template 'Template4'. Site is currently associated with template(s){{':'}} Template1, Template2, Template3"
# USE A TEMPLATE WITHOUT ANY SITE
- - name: Add site L3Out to Schema Template2 without any site associated (check mode)
- mso_schema_site_external_epg:
+ - name: Add site External EPG to Schema Template4 without any site associated (check mode)
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
- template: Template3
- external_epg: ansible_test_2
+ template: Template4
+ external_epg: ansible_test_4
l3out: L3out1
state: present
check_mode: true
ignore_errors: true
register: cm_no_site_associated
- - name: Add site L3Out to Template2 without any site associated (normal mode)
- mso_schema_site_external_epg:
+ - name: Add site External EPG to Template4 without any site associated (normal mode)
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
- template: Template3
+ template: Template4
external_epg: ansible_test_2
l3out: L3out1
state: present
@@ -735,99 +928,99 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
- - cm_no_site_associated.msg == nm_no_site_associated.msg == "Provided site 'ansible_test' not associated with template 'Template3'. Site is currently associated with template(s){{':'}} Template1, Template2"
+ - cm_no_site_associated.msg == nm_no_site_associated.msg == "Provided site 'ansible_test' not associated with template 'Template4'. Site is currently associated with template(s){{':'}} Template1, Template2, Template3"
# Verify route_reachability argument when template_external_epg is associated with Azure site and
# template_external_epg type argument is set to cloud
- name: Ensure ANP exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template2
- anp: ANP2
+ template: Template4
+ anp: ANP4
state: present
-- name: Ensure VRF3 exists
- mso_schema_template_vrf:
+- name: Ensure VRF4 exists
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template3
- vrf: VRF3
+ template: Template4
+ vrf: VRF4
state: present
-- name: Ensure L3Out3 Exists
- mso_schema_template_l3out:
+- name: Ensure L3Out4 Exists
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template3
+ template: Template4
vrf:
- name: VRF3
- l3out: L3out3
+ name: VRF4
+ l3out: L3out4
state: present
-- name: Add external EPG3 at template3 level type cloud (normal mode)
- mso_schema_template_external_epg:
+- name: Add external EPG4 at template4 level type cloud (normal mode)
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template3
- external_epg: ext_epg_3
+ template: Template4
+ external_epg: ext_epg_4
type: cloud
vrf:
- name: VRF3
+ name: VRF4
schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template3
+ template: Template4
anp:
- name: ANP3
+ name: ANP4
schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template3
+ template: Template4
state: present
- register: nm_add_ext_epg_3
+ register: nm_add_ext_epg_4
-- name: Add azure site to a schema Template3
- mso_schema_site:
+- name: Add azure site to a schema Template4
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
- template: Template3
+ template: Template4
state: present
when: version.current.version is version('3.3', '>=')
register: add_cloud_site
- name: Add external EPG to site (normal mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
- template: Template3
- external_epg: ext_epg_3
+ template: Template4
+ external_epg: ext_epg_4
route_reachability: site-ext
state: present
register: nm_add_ext_epg_site
- name: Verify nm_add_ext_epg_site
- assert:
+ ansible.builtin.assert:
that:
- - nm_add_ext_epg_site.current.externalEpgRef.externalEpgName == "ext_epg_3"
+ - nm_add_ext_epg_site.current.externalEpgRef.externalEpgName == "ext_epg_4"
- nm_add_ext_epg_site.current.routeReachabilityInternetType == "site-ext"
- name: Add external EPG to site again(normal mode)
- mso_schema_site_external_epg:
+ cisco.mso.mso_schema_site_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
- template: Template3
- external_epg: ext_epg_3
+ template: Template4
+ external_epg: ext_epg_4
route_reachability: site-ext
state: present
register: nm_add_ext_epg_site_again
- name: Verify nm_add_ext_epg_site_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_ext_epg_site_again is not changed
- - nm_add_ext_epg_site_again.current.externalEpgRef.externalEpgName == "ext_epg_3"
+ - nm_add_ext_epg_site_again.current.externalEpgRef.externalEpgName == "ext_epg_4"
- nm_add_ext_epg_site_again.current.routeReachabilityInternetType == "site-ext" \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg_selector/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg_selector/tasks/main.yml
index 3701ba781..49e821980 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg_selector/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_external_epg_selector/tasks/main.yml
@@ -6,13 +6,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,13 +23,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure azure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -40,7 +40,7 @@
state: present
- name: Ensure aws site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -51,7 +51,7 @@
state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -60,7 +60,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -71,7 +71,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -81,7 +81,7 @@
state: present
- name: Associate aws site with ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -92,7 +92,7 @@
state: present
- name: Associate azure site with ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -100,7 +100,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -111,7 +111,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -119,7 +119,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -127,7 +127,7 @@
state: present
- name: Ensure Template 1 with AP1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -135,7 +135,7 @@
state: present
- name: Ensure L3Out Exists
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -145,7 +145,7 @@
state: present
- name: Ensure External EPG1 exists
- mso_schema_template_externalepg:
+ cisco.mso.mso_schema_template_externalepg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -165,7 +165,7 @@
state: present
- name: Ensure External EPG2 exists
- mso_schema_template_externalepg:
+ cisco.mso.mso_schema_template_externalepg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -185,7 +185,7 @@
state: present
- name: Add Azure site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -194,7 +194,7 @@
when: version.current.version is version('3', '<')
- name: Add AWS site to a schema
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -203,7 +203,7 @@
when: version.current.version is version('3', '<')
- name: Add a new CIDR in VRF1 at site level
- mso_schema_site_vrf_region_cidr: &mso_present
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -219,7 +219,7 @@
# ADD SELECTORS
- name: Add a selector to Azure in check mode
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -235,7 +235,7 @@
register: cm_azure_e1
- name: Verify cm_azure_e1
- assert:
+ ansible.builtin.assert:
that:
- cm_azure_e1 is changed
- cm_azure_e1.previous == {}
@@ -244,7 +244,7 @@
- name: Add a selector to Azure in normal mode
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -259,7 +259,7 @@
register: nm_azure_e1
- name: Verify nm_azure_e1
- assert:
+ ansible.builtin.assert:
that:
- nm_azure_e1 is changed
- nm_azure_e1.previous == {}
@@ -267,7 +267,7 @@
- nm_azure_e1.current.subnets[0].name == 'e1'
- name: Add a selector to AWS in normal mode
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -282,7 +282,7 @@
register: nm_aws_e2
- name: Verify nm_aws_e2
- assert:
+ ansible.builtin.assert:
that:
- nm_aws_e2 is changed
- nm_aws_e2.previous == {}
@@ -290,7 +290,7 @@
- nm_aws_e2.current.subnets[0].name == 'e2'
- name: Add a selector to AWS in normal mode again
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -305,12 +305,12 @@
register: nm_aws_e1_again
- name: Verify nm_aws_e1_again
- assert:
+ ansible.builtin.assert:
that:
- nm_aws_e1_again is not changed
- name: Add a selector to AWS in normal mode again with no expressions
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -322,14 +322,14 @@
register: nm_aws_e1_again_noexp
- name: Verify nm_aws_e1_again_noexp
- assert:
+ ansible.builtin.assert:
that:
- nm_aws_e1_again_noexp is not changed
- nm_aws_e1_again_noexp.msg == "Missing expressions in selector"
# QUERY A SELECTOR
- name: Query a selector of Azure
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -340,13 +340,13 @@
register: query_azure_e1
- name: Verify query_azure_e1
- assert:
+ ansible.builtin.assert:
that:
- query_azure_e1 is not changed
# QUERY ALL
- name: Query all selectors of Azure
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -356,13 +356,13 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
# REMOVE A SELECTOR
- name: Remove a selector of Azure
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -373,12 +373,12 @@
register: remove_azure_e1
- name: Verify remove_azure_e1
- assert:
+ ansible.builtin.assert:
that:
- remove_azure_e1 is changed
- name: Remove a selector of Azure again
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -390,13 +390,13 @@
register: remove_azure_e1_again
- name: Verify remove_azure_e1_again
- assert:
+ ansible.builtin.assert:
that:
- remove_azure_e1_again is not changed
# QUERY REMOVED SELECTOR
- name: Query a removed selector of Azure
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -408,13 +408,13 @@
register: query_removed_azure_e1
- name: Verify query_removed_azure_e1
- assert:
+ ansible.builtin.assert:
that:
- query_removed_azure_e1 is not changed
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for selector (check_mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: non_existing_schema
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -425,7 +425,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for selector (normal_mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: non_existing_schema
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -435,7 +435,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -444,7 +444,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for selector (check_mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -455,7 +455,7 @@
register: cm_non_existing_template
- name: Non-existing template for selector (normal_mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -465,7 +465,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -474,7 +474,7 @@
# USE A NON-EXISTING SITE
- name: Non-existing site for static port (check_mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -485,7 +485,7 @@
register: cm_non_existing_site
- name: Non-existing site for static port (normal_mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -495,7 +495,7 @@
register: nm_non_existing_site
- name: Verify non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site is not changed
- nm_non_existing_site is not changed
@@ -505,7 +505,7 @@
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site external EPG selector to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -516,7 +516,7 @@
register: cm_no_site_associated
- name: Add site external EPG selector to Template 3 without any site associated (normal mode)
- mso_schema_site_external_epg_selector:
+ cisco.mso.mso_schema_site_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -526,7 +526,7 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/l4_l7_devices.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/l4_l7_devices.yml
new file mode 100644
index 000000000..1d5585200
--- /dev/null
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/l4_l7_devices.yml
@@ -0,0 +1,237 @@
+# Test code for the MSO modules
+# Copyright: (c) 2024, Sabari Jaganathan (@sajagana) <sajagana@cisco.com>
+
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+- name: Test that we have an ACI MultiSite host, username and password
+ ansible.builtin.fail:
+ msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
+ when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
+
+# CLEAN ENVIRONMENT
+- name: Set vars
+ ansible.builtin.set_fact:
+ aci_info: &aci_info
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: "{{ apic_validate_certs | default(false) }}"
+ use_ssl: "{{ apic_use_ssl | default(true) }}"
+ use_proxy: "{{ apic_use_proxy | default(true) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+
+- name: Query system information
+ cisco.aci.aci_system:
+ <<: *aci_info
+ id: 1
+ state: query
+ register: aci_version
+
+- name: Remove an existing tenant on APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ name: ansible_test
+ state: absent
+
+- name: Add a tenant on APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ name: ansible_test
+
+# Site type checking for L4-L7 Device configuration
+# QUERY OBJECTS
+- name: Query cloud provider object
+ cisco.aci.aci_cloud_provider:
+ <<: *aci_info
+ state: query
+ register: query_cloud
+ when: aci_version.current.0.topSystem.attributes.version is version('4.1', '>=')
+
+- name: Set vars
+ ansible.builtin.set_fact:
+ query_cloud:
+ current: []
+ when: aci_version.current.0.topSystem.attributes.version is version('4.1', '<')
+
+- name: Verify query_cloud for all sites
+ ansible.builtin.assert:
+ that:
+ - query_cloud is not changed
+
+- name: Verify query_cloud for Cloud Sites
+ ansible.builtin.assert:
+ that:
+ - query_cloud is not changed
+ - query_cloud.current.0.cloudProvP.attributes.environment == "public-cloud"
+ - '"vendor" in query_cloud.current.0.cloudProvP.attributes'
+ when:
+ - query_cloud.current | length > 0 # This condition will execute only cloud sites
+
+# Cloud Site block
+- name: Execute tasks only for cloud sites
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+ block:
+ - name: Add azure_vrf to the ansible_test
+ cisco.aci.aci_vrf:
+ <<: *aci_info
+ tenant: ansible_test
+ vrf: azure_vrf
+
+ - name: Add azure_ctxprof to the ansible_test
+ cisco.aci.aci_cloud_ctx_profile:
+ <<: *aci_info
+ tenant: ansible_test
+ cloud: azure
+ name: azure_ctxprof
+ vrf: azure_vrf
+ region: westus2
+ primary_cidr: "1.1.1.2/32"
+ state: present
+
+ - name: Add the subnet to the azure_ctxprof
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: api/mo/uni/tn-ansible_test/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32].json
+ method: post
+ content:
+ cloudSubnet:
+ attributes:
+ ip: 1.1.1.2/32
+ name: azure_ctxprof_cidr
+ children:
+ - cloudRsZoneAttach:
+ attributes:
+ tDn: "uni/clouddomp/provp-azure/region-westus2/zone-default"
+
+ - name: Add the ansible_test_adc device - ThirdParty_LB
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-ansible_test/cld-ansible_test_adc.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ targetMode: unspecified
+ name: ansible_test_adc
+ svcType: ADC
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-ansible_test/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_LB_Inf
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_LB_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the ansible_test_firewall1 device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-ansible_test/cld-ansible_test_firewall1.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ name: ansible_test_firewall1
+ svcType: FW
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-ansible_test/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_FW_Inf1
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_FW_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the ansible_test_firewall2 device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-ansible_test/cld-ansible_test_firewall2.json
+ method: post
+ content:
+ cloudLDev:
+ attributes:
+ name: ansible_test_firewall2
+ svcType: FW
+ children:
+ - cloudRsLDevToCtx:
+ attributes:
+ tDn: uni/tn-ansible_test/ctx-azure_vrf
+ - cloudLIf:
+ attributes:
+ allowAll: "yes"
+ name: TP_FW_Inf2
+ children:
+ - cloudEPSelector:
+ attributes:
+ name: TP_FW_Inf_Selector
+ matchExpression: IP=='1.1.1.1'
+
+ - name: Add the ansible_test_other device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-ansible_test/clb-ansible_test_other.json
+ method: post
+ content:
+ cloudLB:
+ attributes:
+ name: ansible_test_other
+ type: network
+ children:
+ - cloudRsLDevToCloudSubnet:
+ attributes:
+ tDn: "uni/tn-ansible_test/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32]"
+
+ - name: Add the ansible_test_app_lb device
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-ansible_test/clb-ansible_test_app_lb.json
+ method: post
+ content:
+ cloudLB:
+ attributes:
+ name: ansible_test_app_lb
+ type: application
+ children:
+ - cloudRsLDevToCloudSubnet:
+ attributes:
+ tDn: "uni/tn-ansible_test/ctxprofile-azure_ctxprof/cidr-[1.1.1.2/32]/subnet-[1.1.1.2/32]"
+
+- name: Execute tasks only for non-cloud sites
+ when: query_cloud.current | length == 0 # Non-Cloud Site block
+ block:
+ - name: Add devices to APIC
+ cisco.aci.aci_rest:
+ <<: *aci_info
+ path: /api/node/mo/uni/tn-ansible_test.json
+ method: post
+ content:
+ vnsLDevVip:
+ attributes:
+ svcType: "{{ item.type }}"
+ managed: "false"
+ name: "{{ item.name }}"
+ children:
+ - vnsCDev:
+ attributes:
+ name: "{{ item.name }}"
+ loop:
+ - type: FW
+ name: ansible_test_firewall1
+ - type: FW
+ name: ansible_test_firewall2
+ - type: ADC
+ name: ansible_test_adc
+ - type: OTHERS
+ name: ansible_test_other
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/main.yml
index a9b60bab6..369fde0b7 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_service_graph/tasks/main.yml
@@ -4,25 +4,32 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
- msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
+ ansible.builtin.fail:
+ msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
-
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
- host: '{{ mso_hostname }}'
- username: '{{ mso_username }}'
- password: '{{ mso_password }}'
- validate_certs: '{{ mso_validate_certs | default(false) }}'
- use_ssl: '{{ mso_use_ssl | default(true) }}'
- use_proxy: '{{ mso_use_proxy | default(false) }}'
+ host: "{{ mso_hostname }}"
+ username: "{{ mso_username }}"
+ password: "{{ mso_password }}"
+ validate_certs: "{{ mso_validate_certs | default(false) }}"
+ use_ssl: "{{ mso_use_ssl | default(true) }}"
+ use_proxy: "{{ mso_use_proxy | default(false) }}"
+ output_level: '{{ mso_output_level | default("info") }}'
+ aci_info: &aci_info
+ host: "{{ apic_hostname }}"
+ username: "{{ apic_username }}"
+ password: "{{ apic_password }}"
+ validate_certs: "{{ apic_validate_certs | default(false) }}"
+ use_ssl: "{{ apic_use_ssl | default(true) }}"
+ use_proxy: "{{ apic_use_proxy | default(true) }}"
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -32,764 +39,1161 @@
- name: Execute tasks only for MSO version >= 3.3
when: version.current.version is version('3.3', '>=')
block:
- - name: Ensure site exists
- cisco.mso.mso_site:
- <<: *mso_info
- site: '{{ mso_site | default("ansible_test") }}'
- apic_username: '{{ apic_username }}'
- apic_password: '{{ apic_password }}'
- apic_site_id: '{{ apic_site_id | default(101) }}'
- urls:
- - https://{{ apic_hostname }}
- state: present
- ignore_errors: true
-
- - name: Remove schemas
- cisco.mso.mso_schema:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- state: absent
-
- - name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
- <<: *mso_info
- tenant: ansible_test
- site: '{{ item }}'
- state: absent
- loop:
- - '{{ mso_site | default("ansible_test") }}'
- - 'aws_{{ mso_site | default("ansible_test") }}'
- - 'azure_{{ mso_site | default("ansible_test") }}'
-
- - name: Ensure tenant ansible_test exist
- cisco.mso.mso_tenant:
- <<: *mso_info
- tenant: ansible_test
- users:
- - '{{ mso_username }}'
- state: present
-
- - name: Associate site with ansible_test
- cisco.mso.mso_tenant_site:
- <<: *mso_info
- tenant: ansible_test
- site: '{{ mso_site | default("ansible_test") }}'
- state: present
-
- - name: Add a tenant on APIC
- cisco.aci.aci_tenant:
- host: '{{ apic_hostname }}'
- username: '{{ apic_username }}'
- password: '{{ apic_password }}'
- validate_certs: no
- name: "ansible_test"
-
- - name: Add devices to APIC
- cisco.aci.aci_rest:
- host: '{{ apic_hostname }}'
- username: '{{ apic_username }}'
- password: '{{ apic_password }}'
- validate_certs: no
- path: /api/node/mo/uni/tn-ansible_test.json
- method: post
- content:
- vnsLDevVip:
- attributes:
- svcType: '{{ item.type }}'
- managed: 'false'
- name: '{{ item.name }}'
- children:
- - vnsCDev:
- attributes:
- name: '{{ item.name }}'
- loop:
- - { type: FW, name: ansible_test_firewall1 }
- - { type: FW, name: ansible_test_firewall2 }
- - { type: ADC, name: ansible_test_adc }
- - { type: OTHERS, name: ansible_test_other }
-
- - name: Ensure schema 1 with Template1 and 2 exist
- cisco.mso.mso_schema_template:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- tenant: ansible_test
- template: '{{ item }}'
- state: present
- loop:
- - 'Template1'
- - 'Template2'
-
- - name: Ensure schema 2 with Template1 exists
- cisco.mso.mso_schema_template:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}_2'
- tenant: ansible_test
- template: Template1
- state: present
-
- - name: Add Node1
- cisco.mso.mso_service_node_type:
- <<: *mso_info
- name: ansible_test_other1
- display_name: ansible_test_other1
- state: present
-
- - name: Add Node2
- cisco.mso.mso_service_node_type:
- <<: *mso_info
- name: ansible_test_other2
- display_name: ansible_test_other2
- state: present
-
- - name: Create a service graph 1 at Template level
- cisco.mso.mso_schema_template_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- display_name: sg1
- service_nodes:
- - type: firewall
- filter_after_first_node: allow_all
- state: present
-
- - name: Create service graph 2 at Template level
- cisco.mso.mso_schema_template_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG2
- display_name: sg2
- service_nodes:
- - type: firewall
- - type: load-balancer
- filter_after_first_node: allow_all
- state: present
- register: sg1_again
-
- - name: Create service graph 3 at Template level
- cisco.mso.mso_schema_template_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG3
- display_name: sg3
- service_nodes:
- - type: firewall
- - type: load-balancer
- - type: other
- filter_after_first_node: allow_all
- state: present
- register: sg1_again
-
- - name: Create a service graph 4 at Template level
- cisco.mso.mso_schema_template_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- display_name: sg4
- service_nodes:
- - type: other
- - type: load-balancer
- - type: firewall
- filter_after_first_node: filters_from_contract
- state: present
-
- - name: Create a service graph 5 at Template level
- cisco.mso.mso_schema_template_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG5
- display_name: sg5
- service_nodes:
- - type: other
- - type: firewall
- - type: firewall
- filter_after_first_node: filters_from_contract
- state: present
-
- - name: Create a service graph 6 at Template level
- cisco.mso.mso_schema_template_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG6
- display_name: sg6
- service_nodes:
- - type: other
- - type: other
- - type: other
- filter_after_first_node: filters_from_contract
- state: present
-
- - name: Create a service graph 7 at Template level
- cisco.mso.mso_schema_template_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG7
- display_name: sg7
- service_nodes:
- - type: load-balancer
- - type: load-balancer
- filter_after_first_node: filters_from_contract
- state: present
-
- - name: Add physical site to a schema
- cisco.mso.mso_schema_site:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- site: '{{ mso_site | default("ansible_test") }}'
- template: Template1
- state: present
-
- - name: Add a new Graph at site level (check mode)
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall1
- state: present
- register: cm_sg1
- check_mode: true
-
- - name: Verify cm_sg1
- assert:
- that:
- - cm_sg1 is changed
- - cm_sg1.current.serviceGraphRef.serviceGraphName == "SG1"
- - cm_sg1.current.serviceGraphRef.templateName == "Template1"
- - cm_sg1.current.serviceNodes | length == 1
- - cm_sg1.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
-
- - name: Add a new Graph SG1 at site level (normal mode)
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall1
- state: present
- register: nm_sg1
-
- - name: Verify change_sg1
- assert:
- that:
- - nm_sg1 is changed
- - nm_sg1.current.serviceGraphRef.serviceGraphName == "SG1"
- - nm_sg1.current.serviceGraphRef.templateName == "Template1"
- - nm_sg1.current.serviceNodes | length == 1
- - nm_sg1.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
-
- - name: Add Graph SG1 at site level again
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall1
- state: present
- register: nm_sg1_again
-
- - name: Verify change_sg1
- assert:
- that:
- - nm_sg1_again is not changed
- - nm_sg1_again.current.serviceGraphRef.serviceGraphName == "SG1"
- - nm_sg1_again.current.serviceGraphRef.templateName == "Template1"
- - nm_sg1_again.current.serviceNodes | length == 1
- - nm_sg1_again.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
-
- - name: Change service graph SG1 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall2
- state: present
- register: change_sg1
-
- - name: Verify change_sg1
- assert:
- that:
- - change_sg1 is changed
- - change_sg1.current.serviceGraphRef.serviceGraphName == "SG1"
- - change_sg1.current.serviceGraphRef.templateName == "Template1"
- - change_sg1.current.serviceNodes | length == 1
- - change_sg1.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall2"
-
- - name: Add a new Graph SG2 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG2
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall1
- - name: ansible_test_adc
- state: present
- register: sg2
-
- - name: Verify sg2
- assert:
- that:
- - sg2 is changed
- - sg2.current.serviceGraphRef.serviceGraphName == "SG2"
- - sg2.current.serviceGraphRef.templateName == "Template1"
- - sg2.current.serviceNodes | length == 2
- - sg2.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
- - sg2.current.serviceNodes.1.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_adc"
-
- - name: Add a new Graph SG3 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG3
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall1
- - name: ansible_test_adc
- - name: ansible_test_other
- state: present
- register: sg3
-
- - name: Verify sg3
- assert:
- that:
- - sg3 is changed
- - sg3.current.serviceGraphRef.serviceGraphName == "SG3"
- - sg3.current.serviceGraphRef.templateName == "Template1"
- - sg3.current.serviceNodes | length == 3
- - sg3.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
- - sg3.current.serviceNodes.1.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_adc"
- - sg3.current.serviceNodes.2.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_other"
-
- - name: Add a new Graph SG4 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_other
- - name: ansible_test_adc
- - name: ansible_test_firewall1
- state: present
- register: sg4
-
- - name: Verify sg4
- assert:
- that:
- - sg4 is changed
- - sg4.current.serviceGraphRef.serviceGraphName == "SG4"
- - sg4.current.serviceGraphRef.templateName == "Template1"
- - sg4.current.serviceNodes | length == 3
- - sg4.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_other"
- - sg4.current.serviceNodes.1.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_adc"
- - sg4.current.serviceNodes.2.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
-
- - name: Change Graph SG4 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_other
- - name: ansible_test_adc
- - name: ansible_test_firewall2
- state: present
- register: change1_sg4
-
- - name: Verify change1_sg4
- assert:
- that:
- - change1_sg4 is changed
- - change1_sg4.current.serviceGraphRef.serviceGraphName == "SG4"
- - change1_sg4.current.serviceGraphRef.templateName == "Template1"
- - change1_sg4.current.serviceNodes | length == 3
- - change1_sg4.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_other"
- - change1_sg4.current.serviceNodes.1.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_adc"
- - change1_sg4.current.serviceNodes.2.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall2"
-
- - name: Change Graph SG4 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_other
- state: present
- ignore_errors: true
- register: change2_sg4
-
- - name: Verify change2_sg4
- assert:
- that:
- - change2_sg4 is not changed
- - change2_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '1' service node(s) were given for the service graph"
-
- - name: Change Graph SG4 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_adc
- state: present
- ignore_errors: true
- register: change3_sg4
-
- - name: Verify change3_sg4
- assert:
- that:
- - change3_sg4 is not changed
- - change3_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '1' service node(s) were given for the service graph"
-
- - name: Change Graph SG4 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall1
- state: present
- ignore_errors: true
- register: change4_sg4
-
- - name: Verify change4_sg4
- assert:
- that:
- - change4_sg4 is not changed
- - change4_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '1' service node(s) were given for the service graph"
-
- - name: Change Graph SG4 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_other
- - name: ansible_test_adc
- state: present
- ignore_errors: true
- register: change5_sg4
-
- - name: Verify change5_sg4
- assert:
- that:
- - change5_sg4 is not changed
- - change5_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '2' service node(s) were given for the service graph"
-
- - name: Change Graph SG4 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG4
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_other
- - name: ansible_test_other
- - name: ansible_test_adc
- state: present
- ignore_errors: true
- register: change6_sg4
-
- - name: Verify change6_sg4
- assert:
- that:
- - change6_sg4 is not changed
- - change6_sg4.msg == "Provided device 'ansible_test_other' of type 'ADC' does not exist."
-
- - name: Add Graph SG5 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG5
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_other
- - name: ansible_test_firewall1
- - name: ansible_test_firewall1
- state: present
- register: sg5
-
- - name: Verify sg5
- assert:
- that:
- - sg5 is changed
- - sg5.current.serviceGraphRef.serviceGraphName == "SG5"
- - sg5.current.serviceGraphRef.templateName == "Template1"
- - sg5.current.serviceNodes | length == 3
- - sg5.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_other"
- - sg5.current.serviceNodes.1.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
- - sg5.current.serviceNodes.2.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_firewall1"
-
- - name: Add Graph SG6 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG6
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_other
- - name: ansible_test_other
- - name: ansible_test_other
- state: present
- register: sg6
-
- - name: Verify sg6
- assert:
- that:
- - sg6 is changed
- - sg6.current.serviceGraphRef.serviceGraphName == "SG6"
- - sg6.current.serviceGraphRef.templateName == "Template1"
- - sg6.current.serviceNodes | length == 3
- - sg6.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_other"
- - sg6.current.serviceNodes.1.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_other"
- - sg6.current.serviceNodes.2.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_other"
-
- - name: Add Graph SG7 at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG7
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- devices:
- - name: ansible_test_adc
- - name: ansible_test_adc
- state: present
- register: sg7
-
- - name: Verify sg7
- assert:
- that:
- - sg7 is changed
- - sg7.current.serviceGraphRef.serviceGraphName == "SG7"
- - sg7.current.serviceGraphRef.templateName == "Template1"
- - sg7.current.serviceNodes | length == 2
- - sg7.current.serviceNodes.0.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_adc"
- - sg7.current.serviceNodes.1.device.dn == "uni/tn-ansible_test/lDevVip-ansible_test_adc"
-
- - name: Query service graph SG at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- state: query
- register: query_sg
-
- - name: Verify query_sg
- assert:
- that:
- - query_sg is not changed
- - query_sg.current.serviceGraphRef is match("/schemas/[0-9a-zA-Z]*/templates/Template1/serviceGraphs/SG1")
-
- - name: Query all service graphs at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- state: query
- register: query_all
-
- - name: Verify query_all
- assert:
- that:
- - query_all is not changed
- - query_all.current | length == 7
-
- - name: Query non_existing service graph at site level
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- site: '{{ mso_site | default("ansible_test") }}'
- service_graph: non_existent
- tenant: ansible_test
- state: query
- ignore_errors: true
- register: query_non_existing_sg
-
- - name: Verify query_non_existing_sg
- assert:
- that:
- - query_non_existing_sg.msg == "Service Graph 'non_existent' not found"
-
- - name: Use non_existing schema
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: non_existing_schema
- template: Template1
- service_graph: SG
- tenant: ansible_test
- site: '{{ mso_site | default("ansible_test") }}'
- state: query
- ignore_errors: true
- register: query_non_existing_schema
-
- - name: Verify non_existing_schema
- assert:
- that:
- - query_non_existing_schema is not changed
- - query_non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
-
- - name: Use non_existing template
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: non_existing_template
- service_graph: SG
- tenant: ansible_test
- site: '{{ mso_site | default("ansible_test") }}'
- state: query
- ignore_errors: true
- register: query_non_existing_template
-
- - name: Verify query_non_existing_template
- assert:
- that:
- - query_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1, Template2"
-
- - name: Use non_existing_site_template
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- site: '{{ mso_site | default("ansible_test") }}'
- service_graph: SG
- template: Template2
- tenant: ansible_test
- state: query
- ignore_errors: true
- register: nm_non_existing_site_template
-
- - name: Verify cm_non_existing_site_template and nm_non_existing_site_template
- assert:
- that:
- - nm_non_existing_site_template is not changed
- - nm_non_existing_site_template.msg == "Provided site-template association 'ansible_test-Template2' does not exist."
-
- - name: Add site Service Graph to Template2 without any site association
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}_2'
- site: '{{ mso_site | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- tenant: ansible_test
- devices:
- - name: ansible_test_firewall2
- state: present
- ignore_errors: true
- register: nm_no_site_associated
-
- - name: Verify nm_no_site_associated
- assert:
- that:
- - nm_no_site_associated is not changed
- - nm_no_site_associated.msg == "No site associated with template 'Template1'. Associate the site with the template using mso_schema_site."
-
- - name: Remove service graph from site level(check mode)
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- site: '{{ mso_site | default("ansible_test") }}'
- tenant: ansible_test
- state: absent
- register: rm_sg_cm
- check_mode: true
-
- - name: Verify rm_sg_cm
- assert:
- that:
- - rm_sg_cm is changed
- - rm_sg_cm.current == {}
- - rm_sg_cm.previous.serviceGraphRef is match("/schemas/[0-9a-zA-Z]*/templates/Template1/serviceGraphs/SG1")
-
- - name: Remove service graph from site level (normal mode)
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- tenant: ansible_test
- site: '{{ mso_site | default("ansible_test") }}'
- state: absent
- register: rm_sg
-
- - name: Verify rm_sg
- assert:
- that:
- - rm_sg is changed
- - rm_sg.current == {}
- - rm_sg.previous.serviceGraphRef is match("/schemas/[0-9a-zA-Z]*/templates/Template1/serviceGraphs/SG1")
-
- - name: Remove service graph again
- cisco.mso.mso_schema_site_service_graph:
- <<: *mso_info
- schema: '{{ mso_schema | default("ansible_test") }}'
- template: Template1
- service_graph: SG1
- tenant: ansible_test
- site: '{{ mso_site | default("ansible_test") }}'
- state: absent
- register: rm_sg_again
-
- - name: Verify rm_sg_again
- assert:
- that:
- - rm_sg_again is not changed
- - rm_sg_again.current == {}
- - rm_sg_again.previous == {}
- when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
+ - name: Ensure site exists
+ cisco.mso.mso_site:
+ <<: *mso_info
+ site: '{{ mso_site | default("ansible_test") }}'
+ apic_username: "{{ apic_username }}"
+ apic_password: "{{ apic_password }}"
+ apic_site_id: "{{ apic_site_id | default(101) }}"
+ urls:
+ - https://{{ apic_hostname }}
+ state: present
+ ignore_errors: true
+
+ - name: Remove schemas
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ state: absent
+
+ - name: Ensure sites removed from tenant ansible_test
+ cisco.mso.mso_tenant_site:
+ <<: *mso_info
+ tenant: ansible_test
+ site: "{{ item }}"
+ state: absent
+ loop:
+ - '{{ mso_site | default("ansible_test") }}'
+ - 'aws_{{ mso_site | default("ansible_test") }}'
+ - 'azure_{{ mso_site | default("ansible_test") }}'
+ - '{{ mso_site | default("azure_ansible_test_2") }}'
+ ignore_errors: true
+
+ - name: Ensure tenant ansible_test exist
+ cisco.mso.mso_tenant:
+ <<: *mso_info
+ tenant: ansible_test
+ users:
+ - "{{ mso_username }}"
+ state: present
+
+ - name: Set ansible_network_os to cisco.aci.aci and ansible_connection to local
+ ansible.builtin.set_fact:
+ ansible_connection: local
+ ansible_network_os: cisco.aci.aci
+
+ - name: Reset the ansible_connection to access the APIC
+ ansible.builtin.meta: reset_connection
+
+ - name: Include tasks for L4-L7 devices
+ ansible.builtin.include_tasks: l4_l7_devices.yml
+
+ - name: Set ansible_network_os to cisco.nd.nd and ansible_connection to ansible.netcommon.httpapi
+ ansible.builtin.set_fact:
+ ansible_connection: ansible.netcommon.httpapi
+ ansible_network_os: cisco.nd.nd
+
+ - name: Reset the ansible_connection to access the MSO/NDO
+ ansible.builtin.meta: reset_connection
+
+ - name: Associate site with ansible_test
+ cisco.mso.mso_tenant_site:
+ <<: *mso_info
+ tenant: ansible_test
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: present
+ when:
+ - query_cloud.current | length == 0
+
+ - name: Associate Azure site with ansible_test # Azure Task
+ cisco.mso.mso_tenant_site:
+ <<: *mso_info
+ tenant: ansible_test
+ site: azure_ansible_test_2
+ cloud_account: "uni/tn-{{ mso_tenant | default('ansible_test') }}/act-[{{ azure_cloud_account | default(123) }}]-vendor-azure"
+ state: present
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+
+ - name: Ensure schema 1 with Template1, 2 and 3 exist
+ cisco.mso.mso_schema_template:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ tenant: ansible_test
+ template: "{{ item }}"
+ state: present
+ loop:
+ - "Template1"
+ - "Template2"
+ - "Template3" # Azure Task
+
+ - name: Ensure schema 2 with Template1 exists
+ cisco.mso.mso_schema_template:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}_2'
+ tenant: ansible_test
+ template: Template1
+ state: present
+
+ - name: Add Node1
+ cisco.mso.mso_service_node_type:
+ <<: *mso_info
+ name: ansible_test_other1
+ display_name: ansible_test_other1
+ state: present
+
+ - name: Add Node2
+ cisco.mso.mso_service_node_type:
+ <<: *mso_info
+ name: ansible_test_other2
+ display_name: ansible_test_other2
+ state: present
+
+ - name: Create a service graph 1 at Template level
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ display_name: sg1
+ service_nodes:
+ - type: firewall
+ filter_after_first_node: allow_all
+ state: present
+
+ - name: Create service graph 2 at Template level
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG2
+ display_name: sg2
+ service_nodes:
+ - type: firewall
+ - type: load-balancer
+ filter_after_first_node: allow_all
+ state: present
+ register: sg1_again
+
+ - name: Create service graph 3 at Template level
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG3
+ display_name: sg3
+ service_nodes:
+ - type: firewall
+ - type: load-balancer
+ - type: other
+ filter_after_first_node: allow_all
+ state: present
+ register: sg1_again
+
+ - name: Create a service graph 4 at Template level
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG4
+ display_name: sg4
+ service_nodes:
+ - type: other
+ - type: load-balancer
+ - type: firewall
+ filter_after_first_node: filters_from_contract
+ state: present
+
+ - name: Create a service graph 5 at Template level
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG5
+ display_name: sg5
+ service_nodes:
+ - type: other
+ - type: firewall
+ - type: firewall
+ filter_after_first_node: filters_from_contract
+ state: present
+
+ - name: Create a service graph 6 at Template level
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG6
+ display_name: sg6
+ service_nodes:
+ - type: other
+ - type: other
+ - type: other
+ filter_after_first_node: filters_from_contract
+ state: present
+
+ - name: Create a service graph 7 at Template level
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG7
+ display_name: sg7
+ service_nodes:
+ - type: load-balancer
+ - type: load-balancer
+ filter_after_first_node: filters_from_contract
+ state: present
+
+ - name: Add physical site to a schema
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ site: '{{ mso_site | default("ansible_test") }}'
+ template: Template1
+ state: present
+
+ - name: Add a new Graph at site level (check mode)
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall1
+ state: present
+ register: cm_sg1
+ check_mode: true
+
+ - name: Verify cm_sg1
+ ansible.builtin.assert:
+ that:
+ - cm_sg1 is changed
+ - cm_sg1.current.serviceGraphRef.serviceGraphName == "SG1"
+ - cm_sg1.current.serviceGraphRef.templateName == "Template1"
+ - cm_sg1.current.serviceNodes | length == 1
+ - cm_sg1.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+
+ - name: Add a new Graph SG1 at site level (normal mode)
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall1
+ state: present
+ register: nm_sg1
+
+ - name: Verify change_sg1
+ ansible.builtin.assert:
+ that:
+ - nm_sg1 is changed
+ - nm_sg1.current.serviceGraphRef.serviceGraphName == "SG1"
+ - nm_sg1.current.serviceGraphRef.templateName == "Template1"
+ - nm_sg1.current.serviceNodes | length == 1
+ - nm_sg1.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+
+ - name: Add Graph SG1 at site level again
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall1
+ state: present
+ register: nm_sg1_again
+
+ - name: Verify change_sg1
+ ansible.builtin.assert:
+ that:
+ - nm_sg1_again is not changed
+ - nm_sg1_again.current.serviceGraphRef.serviceGraphName == "SG1"
+ - nm_sg1_again.current.serviceGraphRef.templateName == "Template1"
+ - nm_sg1_again.current.serviceNodes | length == 1
+ - nm_sg1_again.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+
+ - name: Change service graph SG1 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall2
+ state: present
+ register: change_sg1
+
+ - name: Verify change_sg1
+ ansible.builtin.assert:
+ that:
+ - change_sg1 is changed
+ - change_sg1.current.serviceGraphRef.serviceGraphName == "SG1"
+ - change_sg1.current.serviceGraphRef.templateName == "Template1"
+ - change_sg1.current.serviceNodes | length == 1
+ - change_sg1.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall2")
+
+ - name: Add a new Graph SG2 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG2
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall1
+ - name: ansible_test_adc
+ state: present
+ register: sg2
+
+ - name: Verify sg2
+ ansible.builtin.assert:
+ that:
+ - sg2 is changed
+ - sg2.current.serviceGraphRef.serviceGraphName == "SG2"
+ - sg2.current.serviceGraphRef.templateName == "Template1"
+ - sg2.current.serviceNodes | length == 2
+ - sg2.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - sg2.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+
+ - name: Add a new Graph SG3 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG3
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall1
+ - name: ansible_test_adc
+ - name: ansible_test_other
+ state: present
+ register: sg3
+
+ - name: Verify sg3
+ ansible.builtin.assert:
+ that:
+ - sg3 is changed
+ - sg3.current.serviceGraphRef.serviceGraphName == "SG3"
+ - sg3.current.serviceGraphRef.templateName == "Template1"
+ - sg3.current.serviceNodes | length == 3
+ - sg3.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - sg3.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+ - sg3.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+
+ - name: Add a new Graph SG4 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG4
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_other
+ - name: ansible_test_adc
+ - name: ansible_test_firewall1
+ state: present
+ register: sg4
+
+ - name: Verify sg4
+ ansible.builtin.assert:
+ that:
+ - sg4 is changed
+ - sg4.current.serviceGraphRef.serviceGraphName == "SG4"
+ - sg4.current.serviceGraphRef.templateName == "Template1"
+ - sg4.current.serviceNodes | length == 3
+ - sg4.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - sg4.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+ - sg4.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+
+ - name: Change Graph SG4 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG4
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_other
+ - name: ansible_test_adc
+ - name: ansible_test_firewall2
+ state: present
+ register: change1_sg4
+
+ - name: Verify change1_sg4
+ ansible.builtin.assert:
+ that:
+ - change1_sg4 is changed
+ - change1_sg4.current.serviceGraphRef.serviceGraphName == "SG4"
+ - change1_sg4.current.serviceGraphRef.templateName == "Template1"
+ - change1_sg4.current.serviceNodes | length == 3
+ - change1_sg4.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - change1_sg4.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+ - change1_sg4.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall2")
+
+ - name: Change Graph SG4 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG4
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_other
+ state: present
+ ignore_errors: true
+ register: change2_sg4
+
+ - name: Verify change2_sg4
+ ansible.builtin.assert:
+ that:
+ - change2_sg4 is not changed
+ - change2_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '1' service node(s) were given for the service graph"
+
+ - name: Change Graph SG4 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG4
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_adc
+ state: present
+ ignore_errors: true
+ register: change3_sg4
+
+ - name: Verify change3_sg4
+ ansible.builtin.assert:
+ that:
+ - change3_sg4 is not changed
+ - change3_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '1' service node(s) were given for the service graph"
+
+ - name: Change Graph SG4 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG4
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall1
+ state: present
+ ignore_errors: true
+ register: change4_sg4
+
+ - name: Verify change4_sg4
+ ansible.builtin.assert:
+ that:
+ - change4_sg4 is not changed
+ - change4_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '1' service node(s) were given for the service graph"
+
+ - name: Change Graph SG4 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG4
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_other
+ - name: ansible_test_adc
+ state: present
+ ignore_errors: true
+ register: change5_sg4
+
+ - name: Verify change5_sg4
+ ansible.builtin.assert:
+ that:
+ - change5_sg4 is not changed
+ - change5_sg4.msg == "Service Graph 'SG4' has '3' service node type(s) but '2' service node(s) were given for the service graph"
+
+ - name: Add Graph SG5 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG5
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_other
+ - name: ansible_test_firewall1
+ - name: ansible_test_firewall1
+ state: present
+ register: sg5
+
+ - name: Verify sg5
+ ansible.builtin.assert:
+ that:
+ - sg5 is changed
+ - sg5.current.serviceGraphRef.serviceGraphName == "SG5"
+ - sg5.current.serviceGraphRef.templateName == "Template1"
+ - sg5.current.serviceNodes | length == 3
+ - sg5.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - sg5.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - sg5.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+
+ - name: Add Graph SG6 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG6
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_other
+ - name: ansible_test_other
+ - name: ansible_test_other
+ state: present
+ register: sg6
+
+ - name: Verify sg6
+ ansible.builtin.assert:
+ that:
+ - sg6 is changed
+ - sg6.current.serviceGraphRef.serviceGraphName == "SG6"
+ - sg6.current.serviceGraphRef.templateName == "Template1"
+ - sg6.current.serviceNodes | length == 3
+ - sg6.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - sg6.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - sg6.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+
+ - name: Add Graph SG7 at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG7
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_adc
+ - name: ansible_test_adc
+ state: present
+ register: sg7
+
+ - name: Verify sg7
+ ansible.builtin.assert:
+ that:
+ - sg7 is changed
+ - sg7.current.serviceGraphRef.serviceGraphName == "SG7"
+ - sg7.current.serviceGraphRef.templateName == "Template1"
+ - sg7.current.serviceNodes | length == 2
+ - sg7.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+ - sg7.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+
+ - name: Query service graph SG at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ state: query
+ register: query_sg
+
+ - name: Verify query_sg
+ ansible.builtin.assert:
+ that:
+ - query_sg is not changed
+ - query_sg.current.serviceGraphRef is match("/schemas/[0-9a-zA-Z]*/templates/Template1/serviceGraphs/SG1")
+
+ - name: Query all service graphs at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ state: query
+ register: query_all
+
+ - name: Verify query_all
+ ansible.builtin.assert:
+ that:
+ - query_all is not changed
+ - query_all.current | length == 7
+
+ # Azure tests part
+ - name: Execute tasks only for cloud sites
+ when:
+ - query_cloud.current | length > 0
+ - query_cloud.current.0.cloudProvP.attributes.vendor == "azure"
+ block:
+ - name: Create a service graph 1 at Template3 for the Azure site service graph test # Azure Task
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template3
+ service_graph: SG1
+ display_name: sg1
+ service_nodes:
+ - type: firewall
+ - type: load-balancer
+ - type: other
+ filter_after_first_node: allow_all
+ state: present
+
+ - name: Create a service graph 2 at Template3 for the Azure site service graph test # Azure Task
+ cisco.mso.mso_schema_template_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template3
+ service_graph: SG2
+ display_name: sg2
+ service_nodes:
+ - type: other
+ filter_after_first_node: allow_all
+ state: present
+
+ - name: Add Azure site to a schema Template3 for the Azure site service graph test # Azure Task
+ cisco.mso.mso_schema_site:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ site: '{{ mso_site | default("ansible_test") }}'
+ template: Template3
+ state: present
+
+ - name: Add Service Graph 1 at site level for the Azure site service graph test - check_mode # Azure Task
+ cisco.mso.mso_schema_site_service_graph: &az_sg1_cm_present
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template3
+ service_graph: SG1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall1
+ provider_connector_type: source_nat
+ provider_interface: TP_FW_Inf1
+ consumer_connector_type: redirect
+ consumer_interface: TP_FW_Inf1
+ - name: ansible_test_app_lb
+ - name: ansible_test_other
+ provider_connector_type: destination_nat
+ consumer_connector_type: redirect
+ state: present
+ output_level: debug
+ register: az_sg1_cm_present
+ check_mode: true
+
+ - name: Add Service Graph 1 at site level for the Azure site service graph test - normal_mode # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_sg1_cm_present
+ output_level: debug
+ register: az_sg1_nm_present
+
+ - name: Add Service Graph 1 at site level for the Azure site service graph test - normal_mode again # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_sg1_cm_present
+ register: az_sg1_nm_present_again
+
+ - name: Add Service Graph 2 at site level for the Azure site service graph test # Azure Task
+ cisco.mso.mso_schema_site_service_graph: &az_sg2_nm_present
+ <<: *az_sg1_cm_present
+ service_graph: SG2
+ devices:
+ - name: ansible_test_firewall2
+ provider_connector_type: destination_nat
+ provider_interface: TP_FW_Inf12
+ consumer_connector_type: redirect
+ consumer_interface: TP_FW_Inf2
+ state: present
+ register: az_sg2_nm_present
+
+ - name: Assertions check for the add Azure site service graph
+ ansible.builtin.assert:
+ that:
+ - az_sg1_cm_present is changed
+ - az_sg1_cm_present.current.serviceGraphRef.serviceGraphName == "SG1"
+ - az_sg1_cm_present.current.serviceGraphRef.templateName == "Template3"
+ - az_sg1_cm_present.current.serviceNodes | length == 3
+ - az_sg1_cm_present.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - az_sg1_cm_present.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_sg1_cm_present.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - az_sg1_cm_present.previous.serviceNodes is none
+ - az_sg1_cm_present.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG1")
+ - az_sg1_cm_present.proposed.serviceGraphRef.serviceGraphName == "SG1"
+ - az_sg1_cm_present.proposed.serviceGraphRef.templateName == "Template3"
+ - az_sg1_cm_present.proposed.serviceNodes | length == 3
+ - az_sg1_cm_present.proposed.serviceNodes.0.consumerConnectorType == "redir"
+ - az_sg1_cm_present.proposed.serviceNodes.0.consumerInterface == "TP_FW_Inf1"
+ - az_sg1_cm_present.proposed.serviceNodes.0.device.dn == "uni/tn-ansible_test/cld-ansible_test_firewall1"
+ - az_sg1_cm_present.proposed.serviceNodes.0.providerConnectorType == "snat"
+ - az_sg1_cm_present.proposed.serviceNodes.0.providerInterface == "TP_FW_Inf1"
+ - az_sg1_cm_present.proposed.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG1"
+ - az_sg1_cm_present.proposed.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_sg1_cm_present.proposed.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_sg1_cm_present.proposed.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_sg1_cm_present.proposed.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - az_sg1_nm_present is changed
+ - az_sg1_nm_present.current.serviceGraphRef.serviceGraphName == "SG1"
+ - az_sg1_nm_present.current.serviceGraphRef.templateName == "Template3"
+ - az_sg1_nm_present.current.serviceNodes | length == 3
+ - az_sg1_nm_present.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - az_sg1_nm_present.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_sg1_nm_present.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - az_sg1_nm_present.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG1")
+ - az_sg1_nm_present.previous.serviceNodes is none
+ - az_sg1_nm_present_again is not changed
+ - az_sg1_nm_present_again.current.serviceGraphRef.serviceGraphName == "SG1"
+ - az_sg1_nm_present_again.current.serviceGraphRef.templateName == "Template3"
+ - az_sg1_nm_present_again.current.serviceNodes | length == 3
+ - az_sg1_nm_present_again.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - az_sg1_nm_present_again.current.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_sg1_nm_present_again.current.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - az_sg1_nm_present_again.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG1")
+ - az_sg1_nm_present_again.previous.serviceNodes | length == 3
+ - az_sg1_nm_present_again.previous.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - az_sg1_nm_present_again.previous.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_sg1_nm_present_again.previous.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - az_sg2_nm_present is changed
+ - az_sg2_nm_present.current.serviceGraphRef.serviceGraphName == "SG2"
+ - az_sg2_nm_present.current.serviceGraphRef.templateName == "Template3"
+ - az_sg2_nm_present.current.serviceNodes | length == 1
+ - az_sg2_nm_present.current.serviceNodes.0.consumerConnectorType == "redir"
+ - az_sg2_nm_present.current.serviceNodes.0.consumerInterface == "TP_FW_Inf2"
+ - az_sg2_nm_present.current.serviceNodes.0.providerConnectorType == "dnat"
+ - az_sg2_nm_present.current.serviceNodes.0.providerInterface == "TP_FW_Inf12"
+ - az_sg2_nm_present.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall2")
+ - az_sg2_nm_present.current.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_sg2_nm_present.current.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_sg2_nm_present.current.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_sg2_nm_present.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2")
+ - az_sg2_nm_present.previous.serviceNodes is none
+
+ - name: Update Service Graph 2 node with ansible_test_app_lb - check_mode # Azure Task
+ cisco.mso.mso_schema_site_service_graph: &az_update_sg2_cm
+ <<: *az_sg2_nm_present
+ service_graph: SG2
+ devices:
+ - name: ansible_test_app_lb
+ state: present
+ output_level: debug
+ register: az_update_sg2_cm
+ check_mode: true
+
+ - name: Update Service Graph 2 node with ansible_test_app_lb - normal_mode # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_update_sg2_cm
+ output_level: debug
+ register: az_update_sg2_nm
+
+ - name: Update Service Graph 2 node with ansible_test_app_lb - normal_mode again # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_update_sg2_cm
+ register: az_update_sg2_nm_again
+
+ - name: Update Service Graph 2 node with ansible_test_app_lb - Negative Test # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_update_sg2_cm
+ devices:
+ - name: ansible_test_app_lb
+ provider_connector_type: destination_nat
+ consumer_connector_type: redirect
+ state: present
+ output_level: debug
+ register: nt_ansible_test_app_lb
+ ignore_errors: true
+
+ - name: Update Service Graph 2 node with ansible_test_other # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_update_sg2_cm
+ devices:
+ - name: ansible_test_other
+ provider_connector_type: source_and_destination_nat
+ consumer_connector_type: none
+ state: present
+ register: pt_ansible_test_other
+
+ - name: Update Service Graph 2 node with ansible_test_other - Negative Test # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_update_sg2_cm
+ devices:
+ - name: ansible_test_other
+ provider_connector_type: source_and_destination_nat
+ consumer_connector_type: none
+ consumer_interface: invalid_inf
+ state: present
+ output_level: debug
+ register: nt_ansible_test_other
+ ignore_errors: true
+
+ - name: Update Service Graph 2 node with ansible_test_adc # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_update_sg2_cm
+ devices:
+ - name: ansible_test_adc
+ provider_interface: TP_LB_Inf
+ consumer_interface: TP_LB_Inf
+ state: present
+ register: pt_ansible_test_adc
+
+ - name: Assertions check for the update Azure site service graph
+ ansible.builtin.assert:
+ that:
+ - az_update_sg2_cm is changed
+ - az_update_sg2_cm.current.serviceGraphRef.serviceGraphName == "SG2"
+ - az_update_sg2_cm.current.serviceGraphRef.templateName == "Template3"
+ - az_update_sg2_cm.current.serviceNodes | length == 1
+ - az_update_sg2_cm.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_update_sg2_cm.current.serviceNodes.0.device.funcType == "GoTo"
+ - az_update_sg2_cm.current.serviceNodes.0.consumerConnectorType is none
+ - az_update_sg2_cm.current.serviceNodes.0.consumerInterface is none
+ - az_update_sg2_cm.current.serviceNodes.0.providerConnectorType is none
+ - az_update_sg2_cm.current.serviceNodes.0.providerInterface is none
+ - az_update_sg2_cm.current.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_update_sg2_cm.current.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_update_sg2_cm.current.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_update_sg2_cm.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2")
+ - az_update_sg2_cm.previous.serviceNodes | length == 1
+ - az_update_sg2_cm.previous.serviceNodes.0.consumerConnectorType == "redir"
+ - az_update_sg2_cm.previous.serviceNodes.0.consumerInterface == "TP_FW_Inf2"
+ - az_update_sg2_cm.previous.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall2")
+ - az_update_sg2_cm.previous.serviceNodes.0.device.funcType == "GoTo"
+ - az_update_sg2_cm.previous.serviceNodes.0.providerConnectorType == "dnat"
+ - az_update_sg2_cm.previous.serviceNodes.0.providerInterface == "TP_FW_Inf12"
+ - az_update_sg2_cm.previous.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_update_sg2_cm.previous.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_update_sg2_cm.previous.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_update_sg2_cm.proposed.serviceGraphRef.serviceGraphName == "SG2"
+ - az_update_sg2_cm.proposed.serviceGraphRef.templateName == "Template3"
+ - az_update_sg2_cm.proposed.serviceNodes | length == 1
+ - az_update_sg2_cm.proposed.serviceNodes.0.consumerConnectorType is none
+ - az_update_sg2_cm.proposed.serviceNodes.0.consumerInterface is none
+ - az_update_sg2_cm.proposed.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_update_sg2_cm.proposed.serviceNodes.0.device.funcType == "GoTo"
+ - az_update_sg2_cm.proposed.serviceNodes.0.providerConnectorType is none
+ - az_update_sg2_cm.proposed.serviceNodes.0.providerInterface is none
+ - az_update_sg2_cm.proposed.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_update_sg2_cm.proposed.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_update_sg2_cm.proposed.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_update_sg2_nm is changed
+ - az_update_sg2_nm.current.serviceGraphRef.serviceGraphName == "SG2"
+ - az_update_sg2_nm.current.serviceGraphRef.templateName == "Template3"
+ - az_update_sg2_nm.current.serviceNodes | length == 1
+ - az_update_sg2_nm.current.serviceNodes.0.consumerConnectorType is none
+ - az_update_sg2_nm.current.serviceNodes.0.consumerInterface is none
+ - az_update_sg2_nm.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_update_sg2_nm.current.serviceNodes.0.providerConnectorType is none
+ - az_update_sg2_nm.current.serviceNodes.0.providerInterface is none
+ - az_update_sg2_nm.current.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_update_sg2_nm.current.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_update_sg2_nm.current.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_update_sg2_nm.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2")
+ - az_update_sg2_nm.previous.serviceNodes | length == 1
+ - az_update_sg2_nm.previous.serviceNodes.0.consumerConnectorType == "redir"
+ - az_update_sg2_nm.previous.serviceNodes.0.consumerInterface == "TP_FW_Inf2"
+ - az_update_sg2_nm.previous.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall2")
+ - az_update_sg2_nm.previous.serviceNodes.0.device.funcType == "GoTo"
+ - az_update_sg2_nm.previous.serviceNodes.0.providerConnectorType == "dnat"
+ - az_update_sg2_nm.previous.serviceNodes.0.providerInterface == "TP_FW_Inf12"
+ - az_update_sg2_nm.previous.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_update_sg2_nm.previous.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_update_sg2_nm.previous.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_update_sg2_nm_again is not changed
+ - az_update_sg2_nm_again.current.serviceGraphRef.serviceGraphName == "SG2"
+ - az_update_sg2_nm_again.current.serviceGraphRef.templateName == "Template3"
+ - az_update_sg2_nm_again.current.serviceNodes | length == 1
+ - az_update_sg2_nm_again.current.serviceNodes.0.consumerConnectorType is none
+ - az_update_sg2_nm_again.current.serviceNodes.0.consumerInterface is none
+ - az_update_sg2_nm_again.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_update_sg2_nm_again.current.serviceNodes.0.providerConnectorType is none
+ - az_update_sg2_nm_again.current.serviceNodes.0.providerInterface is none
+ - az_update_sg2_nm_again.current.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_update_sg2_nm_again.current.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_update_sg2_nm_again.current.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - az_update_sg2_nm_again.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2")
+ - az_update_sg2_nm_again.previous.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_update_sg2_nm_again.previous.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - az_update_sg2_nm_again.previous.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - az_update_sg2_nm_again.previous.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - pt_ansible_test_adc is changed
+ - pt_ansible_test_adc.current.serviceGraphRef
+ - pt_ansible_test_adc.current.serviceGraphRef.serviceGraphName == "SG2"
+ - pt_ansible_test_adc.current.serviceGraphRef.templateName == "Template3"
+ - pt_ansible_test_adc.current.serviceNodes.0.consumerConnectorType is none
+ - pt_ansible_test_adc.current.serviceNodes.0.consumerInterface == "TP_LB_Inf"
+ - pt_ansible_test_adc.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+ - pt_ansible_test_adc.current.serviceNodes.0.providerConnectorType is none
+ - pt_ansible_test_adc.current.serviceNodes.0.providerInterface == "TP_LB_Inf"
+ - pt_ansible_test_adc.current.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - pt_ansible_test_adc.current.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - pt_ansible_test_adc.current.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - pt_ansible_test_adc.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2")
+ - pt_ansible_test_adc.previous.serviceNodes.0.consumerConnectorType == "none"
+ - pt_ansible_test_adc.previous.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - pt_ansible_test_adc.previous.serviceNodes.0.providerConnectorType == "snat_dnat"
+ - pt_ansible_test_adc.previous.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - pt_ansible_test_adc.previous.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - pt_ansible_test_adc.previous.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - pt_ansible_test_other is changed
+ - pt_ansible_test_other.current.serviceGraphRef.serviceGraphName == "SG2"
+ - pt_ansible_test_other.current.serviceGraphRef.templateName == "Template3"
+ - pt_ansible_test_other.current.serviceNodes.0.consumerConnectorType == "none"
+ - pt_ansible_test_other.current.serviceNodes.0.consumerInterface is none
+ - pt_ansible_test_other.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - pt_ansible_test_other.current.serviceNodes.0.providerConnectorType == "snat_dnat"
+ - pt_ansible_test_other.current.serviceNodes.0.providerInterface is none
+ - pt_ansible_test_other.current.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - pt_ansible_test_other.current.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - pt_ansible_test_other.current.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+ - pt_ansible_test_other.previous.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2")
+ - pt_ansible_test_other.previous.serviceNodes | length == 1
+ - pt_ansible_test_other.previous.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - pt_ansible_test_other.previous.serviceNodes.0.serviceNodeRef.serviceGraphName == "SG2"
+ - pt_ansible_test_other.previous.serviceNodes.0.serviceNodeRef.serviceNodeName == "node1"
+ - pt_ansible_test_other.previous.serviceNodes.0.serviceNodeRef.templateName == "Template3"
+
+ - name: Update Service Graph 2 node with ansible_test_adc - Negative Test # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_update_sg2_cm
+ devices:
+ - name: ansible_test_adc
+ provider_interface: TP_LB_Inf
+ consumer_interface: TP_LB_Inf
+ consumer_connector_type: none
+ state: present
+ output_level: debug
+ register: nt_ansible_test_adc
+ ignore_errors: true
+
+ - name: Assertions check for the Azure site service graph negative tests
+ ansible.builtin.assert:
+ that:
+ - nt_ansible_test_adc is not changed
+ - nt_ansible_test_adc.msg is match("Unsupported attributes{{':'}} provider_connector_type and consumer_connector_type should be 'None' for the Third-Party Load Balancer.")
+ - nt_ansible_test_other is not changed
+ - nt_ansible_test_other.msg is match("Unsupported attributes{{':'}} provider_interface and consumer_interface should be 'None' for the Network Load Balancer device.")
+ - nt_ansible_test_app_lb is not changed
+ - nt_ansible_test_app_lb.msg is match("Unsupported attributes{{':'}} provider_connector_type, provider_interface, consumer_connector_type, consumer_interface should be 'None' for the Application Load Balancer device.")
+
+ - name: Query all service graphs at Azure site level # Azure Task
+ cisco.mso.mso_schema_site_service_graph: &az_site_sg_query_all
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template3
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ state: query
+ register: az_site_sg_query_all
+
+ - name: Query a service graph with name at Azure site level # Azure Task
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *az_site_sg_query_all
+ service_graph: SG2
+ state: query
+ register: az_site_sg_query_sg2
+
+ - name: Assertions check for the query Azure site service graph
+ ansible.builtin.assert:
+ that:
+ - az_site_sg_query_all is not changed
+ - az_site_sg_query_all.current | length == 2
+ - az_site_sg_query_all.current.0.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG1")
+ - az_site_sg_query_all.current.0.serviceNodes | length == 3
+ - az_site_sg_query_all.current.0.serviceNodes.0.consumerConnectorType == "redir"
+ - az_site_sg_query_all.current.0.serviceNodes.0.consumerInterface == "TP_FW_Inf1"
+ - az_site_sg_query_all.current.0.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_firewall1")
+ - az_site_sg_query_all.current.0.serviceNodes.0.device.funcType == "GoTo"
+ - az_site_sg_query_all.current.0.serviceNodes.0.providerConnectorType == "snat"
+ - az_site_sg_query_all.current.0.serviceNodes.0.providerInterface == "TP_FW_Inf1"
+ - az_site_sg_query_all.current.0.serviceNodes.0.serviceNodeRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG1/serviceNodes/node1")
+ - az_site_sg_query_all.current.0.serviceNodes.1.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_app_lb")
+ - az_site_sg_query_all.current.0.serviceNodes.1.serviceNodeRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG1/serviceNodes/node2")
+ - az_site_sg_query_all.current.0.serviceNodes.2.consumerConnectorType == "redir"
+ - az_site_sg_query_all.current.0.serviceNodes.2.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_other")
+ - az_site_sg_query_all.current.0.serviceNodes.2.providerConnectorType == "dnat"
+ - az_site_sg_query_all.current.0.serviceNodes.2.serviceNodeRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG1/serviceNodes/node3")
+ - az_site_sg_query_sg2 is not changed
+ - az_site_sg_query_sg2.current.serviceGraphRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2")
+ - az_site_sg_query_sg2.current.serviceNodes | length == 1
+ - az_site_sg_query_sg2.current.serviceNodes.0.consumerInterface == "TP_LB_Inf"
+ - az_site_sg_query_sg2.current.serviceNodes.0.device.dn is match("uni/tn-ansible_test/(lDevVip|clb|cld)-ansible_test_adc")
+ - az_site_sg_query_sg2.current.serviceNodes.0.device.funcType == "GoTo"
+ - az_site_sg_query_sg2.current.serviceNodes.0.providerInterface == "TP_LB_Inf"
+ - az_site_sg_query_sg2.current.serviceNodes.0.serviceNodeRef is match("/schemas/.+/templates/Template3/serviceGraphs/SG2/serviceNodes/node1")
+ # Azure tests ends
+
+ - name: Query non_existing service graph at site level
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_graph: non_existent
+ tenant: ansible_test
+ state: query
+ ignore_errors: true
+ register: query_non_existing_sg
+
+ - name: Verify query_non_existing_sg
+ ansible.builtin.assert:
+ that:
+ - query_non_existing_sg.msg == "Service Graph 'non_existent' not found"
+
+ - name: Use non_existing schema
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: non_existing_schema
+ template: Template1
+ service_graph: SG
+ tenant: ansible_test
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: query
+ ignore_errors: true
+ register: query_non_existing_schema
+
+ - name: Verify non_existing_schema
+ ansible.builtin.assert:
+ that:
+ - query_non_existing_schema is not changed
+ - query_non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
+
+ - name: Use non_existing template
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: non_existing_template
+ service_graph: SG
+ tenant: ansible_test
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: query
+ ignore_errors: true
+ register: query_non_existing_template
+
+ - name: Verify query_non_existing_template
+ ansible.builtin.assert:
+ that:
+ - query_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1, Template2, Template3"
+
+ - name: Use non_existing_site_template
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ site: '{{ mso_site | default("ansible_test") }}'
+ service_graph: SG
+ template: Template2
+ tenant: ansible_test
+ state: query
+ ignore_errors: true
+ register: nm_non_existing_site_template
+
+ - name: Verify cm_non_existing_site_template and nm_non_existing_site_template
+ ansible.builtin.assert:
+ that:
+ - nm_non_existing_site_template is not changed
+ - nm_non_existing_site_template.msg is match("Provided site-template association '.+' does not exist.")
+
+ - name: Add site Service Graph to Template2 without any site association
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}_2'
+ site: '{{ mso_site | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ tenant: ansible_test
+ devices:
+ - name: ansible_test_firewall2
+ state: present
+ ignore_errors: true
+ register: nm_no_site_associated
+
+ - name: Verify nm_no_site_associated
+ ansible.builtin.assert:
+ that:
+ - nm_no_site_associated is not changed
+ - nm_no_site_associated.msg == "No site associated with template 'Template1'. Associate the site with the template using mso_schema_site."
+
+ - name: Remove service graph from site level(check mode)
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ site: '{{ mso_site | default("ansible_test") }}'
+ tenant: ansible_test
+ state: absent
+ register: rm_sg_cm
+ check_mode: true
+
+ - name: Verify rm_sg_cm
+ ansible.builtin.assert:
+ that:
+ - rm_sg_cm is changed
+ - rm_sg_cm.current == {}
+ - rm_sg_cm.previous.serviceGraphRef is match("/schemas/[0-9a-zA-Z]*/templates/Template1/serviceGraphs/SG1")
+
+ - name: Remove service graph from site level (normal mode)
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ tenant: ansible_test
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: absent
+ register: rm_sg
+
+ - name: Verify rm_sg
+ ansible.builtin.assert:
+ that:
+ - rm_sg is changed
+ - rm_sg.current == {}
+ - rm_sg.previous.serviceGraphRef is match("/schemas/[0-9a-zA-Z]*/templates/Template1/serviceGraphs/SG1")
+
+ - name: Remove service graph again
+ cisco.mso.mso_schema_site_service_graph:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: Template1
+ service_graph: SG1
+ tenant: ansible_test
+ site: '{{ mso_site | default("ansible_test") }}'
+ state: absent
+ register: rm_sg_again
+
+ - name: Verify rm_sg_again
+ ansible.builtin.assert:
+ that:
+ - rm_sg_again is not changed
+ - rm_sg_again.current == {}
+ - rm_sg_again.previous == {}
+ when: version.current.version is version('4.0', '<') # no change in NDO4.0 because site will already be present when template is defined
+
+ # To clear the ACI Config
+ - name: Set ansible_network_os to cisco.aci.aci and ansible_connection to local
+ ansible.builtin.set_fact:
+ ansible_connection: local
+ ansible_network_os: cisco.aci.aci
+
+ - name: Reset the ansible_connection to access the APIC
+ ansible.builtin.meta: reset_connection
+
+ - name: Remove the ansible_test tenant from APIC
+ cisco.aci.aci_tenant:
+ <<: *aci_info
+ name: ansible_test
+ state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region/tasks/main.yml
index c31a31eeb..315a4d94d 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region/tasks/main.yml
@@ -5,7 +5,7 @@
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -19,13 +19,13 @@
'{{ mso_site | default(\"ansible_test\") }}']"
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure aws site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -36,7 +36,7 @@
state: present
- name: Ensure azure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -47,7 +47,7 @@
state: present
- name: Remove Schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -56,7 +56,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -67,7 +67,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -75,7 +75,7 @@
state: present
- name: Ensure AWS site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -85,7 +85,7 @@
state: present
- name: Ensure Azure site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -93,7 +93,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -104,7 +104,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -112,7 +112,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -120,7 +120,7 @@
state: present
- name: Add region and cidr in VRF1 at AWS site level
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -133,7 +133,7 @@
register: aws_add_region_cidr
- name: Add region and cidr in VRF1 at Azure site level
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -146,7 +146,7 @@
register: azure_add_region_cidr
- name: Add another region and cidr in VRF1 at AWS site level
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -159,7 +159,7 @@
register: aws_add_another_region_cidr
- name: Add another region and cidr in VRF1 at Azure site level
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -176,7 +176,7 @@
when: version.current.version is version('3.3', '>=')
block:
- name: Ensure VRF2 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -184,7 +184,7 @@
state: present
- name: Add region and cidr in VRF2 at Azure site level
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -197,7 +197,7 @@
register: azure_add_another_region_cidr
- name: Add region and cidr in VRF2 at AWS site level
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -210,7 +210,7 @@
register: azure_add_another_region_cidr
- name: Add context underlay parameters in VRF1 at Azure site level
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -225,7 +225,7 @@
register: azure_add_context_underlay
- name: Add context underlay parameters in VRF1 at AWS site level
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -240,7 +240,7 @@
register: aws_add_context_underlay
- name: Verify add_context_underlay
- assert:
+ ansible.builtin.assert:
that:
- azure_add_context_underlay is changed
- azure_add_context_underlay.current.contextProfileType == "container-overlay"
@@ -248,31 +248,31 @@
- aws_add_context_underlay.current.contextProfileType == "container-overlay"
- name: Get Validation status
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
register: query_validate
- name: Verify query_validate
- assert:
+ ansible.builtin.assert:
that:
- query_validate is not changed
- name: Verify query_validate result < 4.0
- assert:
+ ansible.builtin.assert:
that:
- query_validate.current.result == "true"
when: version.current.version is version('4.0', '<')
- name: Verify query_validate result => 4.0
- assert:
+ ansible.builtin.assert:
that:
- query_validate.current.result == true
when: version.current.version is version('4.0', '>=')
- name: Query all aws regions
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -282,7 +282,7 @@
register: aws_query_all
- name: Query all azure regions
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -292,7 +292,7 @@
register: azure_query_all
- name: Query specific aws region
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -303,7 +303,7 @@
register: aws_query_region
- name: Query specific azure region
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -314,7 +314,7 @@
register: azure_query_region
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- aws_query_all is not changed
- azure_query_all is not changed
@@ -332,7 +332,7 @@
- azure_query_region.current.cidrs.0.subnets == []
- name: Remove aws VRF region (check mode)
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -344,7 +344,7 @@
register: cm_rm_aws_region
- name: Remove aws VRF region (normal mode)
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -355,7 +355,7 @@
register: nm_rm_aws_region
- name: Remove azure VRF region (check mode)
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -367,7 +367,7 @@
register: cm_rm_azure_region
- name: Remove azure VRF region (normal mode)
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -378,7 +378,7 @@
register: nm_rm_azure_region
- name: Verify deletion
- assert:
+ ansible.builtin.assert:
that:
- cm_rm_aws_region is changed
- nm_rm_aws_region is changed
@@ -418,7 +418,7 @@
register: add_vpn_gateway_router_azure
- name: Verify adding VPN Gateway Router
- assert:
+ ansible.builtin.assert:
that:
- add_vpn_gateway_router_aws.current.isVpnGatewayRouter == add_vpn_gateway_router_azure.current.isVpnGatewayRouter == true
when: version.current.version is version('3.0.0a', '>=')
@@ -478,7 +478,7 @@
register: nm_rm_vpn_gateway_router_azure
- name: Verify removing VPN Gateway Router
- assert:
+ ansible.builtin.assert:
that:
- cm_rm_vpn_gateway_router_aws is changed
- nm_rm_vpn_gateway_router_aws is changed
@@ -491,7 +491,7 @@
when: version.current.version is version('3.0.0a', '>=')
- name: Use non_existing schema
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: non_existing
template: Template 1
@@ -503,7 +503,7 @@
ignore_errors: true
- name: Use non_existing site
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -515,7 +515,7 @@
ignore_errors: true
- name: Use non_existing site/template association
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -527,7 +527,7 @@
ignore_errors: true
- name: Use non_existing VRF
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -539,7 +539,7 @@
ignore_errors: true
- name: Use non_existing region
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -551,7 +551,7 @@
ignore_errors: true
- name: Verify non_existing
- assert:
+ ansible.builtin.assert:
that:
- non_existing_schema.msg == "Provided schema 'non_existing' does not exist."
- non_existing_site.msg == "Site 'non_existing' is not a valid site name."
@@ -559,19 +559,19 @@
- non_existing_region.msg == "Region 'non_existing' not found"
- name: Verify non_existing (version < 3.3)
- assert:
+ ansible.builtin.assert:
that:
- non_existing_vrf.msg == "Provided vrf 'non_existing' does not exist. Existing vrfs{{':'}} VRF1"
when: version.current.version is version('3.3', '<')
- name: Verify non_existing (version >= 3.3)
- assert:
+ ansible.builtin.assert:
that:
- non_existing_vrf.msg == "Provided vrf 'non_existing' does not exist. Existing vrfs{{':'}} VRF1, VRF2"
when: version.current.version is version('3.3', '>=')
- name: Delete non_existing region
- mso_schema_site_vrf_region:
+ cisco.mso.mso_schema_site_vrf_region:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -582,7 +582,7 @@
register: rm_non_existing_region
- name: Verify rm_non_existing_region
- assert:
+ ansible.builtin.assert:
that:
- rm_non_existing_region is not changed
- rm_non_existing_region.previous == rm_non_existing_region.current == {} \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr/tasks/main.yml
index 64d08821c..c818b6e59 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr/tasks/main.yml
@@ -7,13 +7,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -27,13 +27,13 @@
'{{ mso_site | default(\"ansible_test\") }}']"
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -44,7 +44,7 @@
state: present
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -55,7 +55,7 @@
state: present
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -66,7 +66,7 @@
state: present
- name: Remove Schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -75,7 +75,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -86,7 +86,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
sites:
@@ -96,7 +96,7 @@
state: present
- name: Ensure AWS site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -106,7 +106,7 @@
state: present
- name: Ensure Azure site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -114,7 +114,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -125,7 +125,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -133,7 +133,7 @@
state: present
- name: Add physical site to Template 1
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -141,7 +141,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -153,7 +153,7 @@
- { schema: '{{ mso_schema | default("ansible_test") }}_2', template: 'Template 3' }
- name: Ensure VRF2 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -162,7 +162,7 @@
when: version.current.version is version('3', '<')
- name: Ensure VRF1 exists at Site level for the physical site
- mso_schema_site_vrf:
+ cisco.mso.mso_schema_site_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -172,7 +172,7 @@
# ADD SUBNET
- name: Add a new CIDR in VRF1 at AWS site level (check mode)
- mso_schema_site_vrf_region_cidr: &mso_present
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -186,7 +186,7 @@
register: cm_add_cidr
- name: Verify cm_add_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cidr is changed
- cm_add_cidr.previous == {}
@@ -194,12 +194,12 @@
- cm_add_cidr.current.primary == true
- name: Add a new CIDR in VRF1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
register: nm_add_cidr
- name: Verify nm_add_cidr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr is changed
- nm_add_cidr.previous == {}
@@ -207,31 +207,31 @@
- nm_add_cidr.current.primary == true
- name: Add same CIDR in VRF1 at AWS site level (check mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
register: cm_add_cidr_again
- name: Verify cm_add_cidr_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cidr_again is not changed
- cm_add_cidr_again.current.ip == cm_add_cidr_again.previous.ip == '10.0.0.0/16'
- cm_add_cidr_again.current.primary == cm_add_cidr_again.previous.primary == true
- name: Add same CIDR in VRF1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
register: nm_add_cidr_again
- name: Verify nm_add_cidr_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr_again is not changed
- nm_add_cidr_again.current.ip == nm_add_cidr_again.previous.ip == '10.0.0.0/16'
- nm_add_cidr_again.current.primary == nm_add_cidr_again.previous.primary == true
- name: Add a CIDR in VRF1 at Azure site level (check mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -241,7 +241,7 @@
register: cm_add_cidr_2
- name: Verify cm_add_cidr_2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cidr_2 is changed
- cm_add_cidr_2.previous == {}
@@ -249,7 +249,7 @@
- cm_add_cidr_2.current.primary == true
- name: Add a CIDR in VRF1 at Azure site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -258,7 +258,7 @@
register: nm_add_cidr_2
- name: Verify nm_add_cidr_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr_2 is changed
- nm_add_cidr_2.previous == {}
@@ -266,7 +266,7 @@
- nm_add_cidr_2.current.primary == true
- name: Add a second CIDR in VRF1 at AWS site level (check mode)
- mso_schema_site_vrf_region_cidr: &mso_present_2
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_present_2
<<: *mso_present
site: 'aws_{{ mso_site | default("ansible_test") }}'
region: us-west-1
@@ -276,7 +276,7 @@
register: cm_add_cidr_3
- name: Verify cm_add_cidr_3
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cidr_3 is changed
- cm_add_cidr_3.previous == {}
@@ -284,12 +284,12 @@
- cm_add_cidr_3.current.primary == false
- name: Add a second CIDR in VRF1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present_2
register: nm_add_cidr_3
- name: Verify nm_add_cidr_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr_3 is changed
- nm_add_cidr_3.previous == {}
@@ -297,7 +297,7 @@
- nm_add_cidr_3.current.primary == false
- name: Add a second CIDR in VRF1 at Azure site level (check mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -307,7 +307,7 @@
register: cm_add_cidr_4
- name: Verify cm_add_cidr_4
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cidr_4 is changed
- cm_add_cidr_4.previous == {}
@@ -315,7 +315,7 @@
- cm_add_cidr_4.current.primary == false
- name: Add a second CIDR in VRF1 at Azure site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -324,7 +324,7 @@
register: nm_add_cidr_4
- name: Verify nm_add_cidr_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr_4 is changed
- nm_add_cidr_4.previous == {}
@@ -333,7 +333,7 @@
# QUERY CIDR
- name: Query CIDR in VRF1 at AWS site level (check mode)
- mso_schema_site_vrf_region_cidr: &mso_query
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_query
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -346,19 +346,19 @@
register: cm_query_cidr
- name: Verify cm_query_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_query_cidr is not changed
- cm_query_cidr.current.ip == '10.0.0.0/16'
- cm_query_cidr.current.primary == true
- name: Query CIDR in VRF1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
register: nm_query_cidr
- name: Query CIDR in VRF1 at Azure site level (check mode)
- mso_schema_site_vrf_region_cidr: &mso_query_2
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_query_2
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -371,19 +371,19 @@
register: cm_query_cidr_2
- name: Verify cm_query_cidr_2
- assert:
+ ansible.builtin.assert:
that:
- cm_query_cidr_2 is not changed
- cm_query_cidr_2.current.ip == '10.1.0.0/16'
- cm_query_cidr_2.current.primary == true
- name: Query CIDR in VRF1 at Azure site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query_2
register: nm_query_cidr_2
- name: Verify nm_query_cidr_2
- assert:
+ ansible.builtin.assert:
that:
- nm_query_cidr_2 is not changed
- nm_query_cidr_2.current.ip == '10.1.0.0/16'
@@ -391,7 +391,7 @@
# QUERY ALL CIDR
- name: Query all CIDR in VRF1 at AWS site level (check mode)
- mso_schema_site_vrf_region_cidr: &mso_query_all
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_query_all
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -403,7 +403,7 @@
register: cm_query_cidr_all_aws
- name: Query CIDR in VRF1 at Azure site level (check mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query_all
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -412,7 +412,7 @@
register: cm_query_cidr_all_azure
- name: Verify cm_query_cidr_all_aws and cm_query_cidr_all_azure
- assert:
+ ansible.builtin.assert:
that:
- cm_query_cidr_all_aws is not changed
- cm_query_cidr_all_aws.current[0].ip == '10.0.0.0/16'
@@ -426,19 +426,19 @@
- cm_query_cidr_all_azure.current[1].primary == false
- name: Query CIDR in VRF1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query_all
register: nm_query_cidr_all_aws
- name: Query CIDR in VRF1 at Azure site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query_all
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
register: nm_query_cidr_all_azure
- name: Verify nm_query_cidr_all_aws and nm_query_cidr_all_azure
- assert:
+ ansible.builtin.assert:
that:
- nm_query_cidr_all_aws is not changed
- nm_query_cidr_all_aws.current[0].ip == '10.0.0.0/16'
@@ -452,14 +452,14 @@
- nm_query_cidr_all_azure.current[1].primary == false
- name: Query CIDR in VRF2 (not present a Site level) for AWS Site (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query_all
vrf: VRF2
ignore_errors: true
register: nm_query_cidr_all_aws_2
- name: Query CIDR in VRF1 (with VRF present a Site level) for Physical Site (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query_all
site: '{{ mso_site | default("ansible_test") }}'
vrf: VRF1
@@ -467,7 +467,7 @@
register: nm_query_cidr_all_aws_3
- name: Verify nm_query_cidr_all_aws_2 and nm_query_cidr_all_aws_3
- assert:
+ ansible.builtin.assert:
that:
- nm_query_cidr_all_aws_2.msg == "Provided vrf 'VRF2' does not exist at site level."
- nm_query_cidr_all_aws_3.msg == "Provided region 'us-west-1' does not exist. Existing regions{{':'}} "
@@ -475,58 +475,58 @@
# REMOVE CIDR
- name: Remove CIDR (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present_2
state: absent
check_mode: true
register: cm_remove_cidr
- name: Verify cm_remove_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_cidr is changed
- cm_remove_cidr.current == {}
- name: Remove CIDR (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present_2
state: absent
register: nm_remove_cidr
- name: Verify nm_remove_cidr
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_cidr is changed
- nm_remove_cidr.current == {}
- name: Remove CIDR again (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present_2
state: absent
check_mode: true
register: cm_remove_cidr_again
- name: Verify cm_remove_cidr_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_cidr_again is not changed
- cm_remove_cidr_again.current == {}
- name: Remove CIDR again (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present_2
state: absent
register: nm_remove_cidr_again
- name: Verify nm_remove_cidr_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_cidr_again is not changed
- nm_remove_cidr_again.current == {}
# QUERY NON-EXISTING CIDR
- name: Query non-existing CIDR (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
cidr: non_existing_cidr
check_mode: true
@@ -534,14 +534,14 @@
register: cm_query_non_cidr
- name: Query non-existing CIDR (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
cidr: non_existing_cidr
ignore_errors: true
register: nm_query_non_cidr
- name: Verify query_non_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_cidr is not changed
- nm_query_non_cidr is not changed
@@ -550,7 +550,7 @@
# QUERY NON-EXISTING region
- name: Query non-existing region (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
region: non_existing_region
check_mode: true
@@ -558,14 +558,14 @@
register: cm_query_non_region
- name: Query non-existing region (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
region: non_existing_region
ignore_errors: true
register: nm_query_non_region
- name: Verify query_non_region
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_region is not changed
- nm_query_non_region is not changed
@@ -574,7 +574,7 @@
# QUERY NON-EXISTING VRF
- name: Query non-existing VRF (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
vrf: non_existing_vrf
check_mode: true
@@ -582,28 +582,28 @@
register: cm_query_non_vrf
- name: Query non-existing VRF (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
vrf: non_existing_vrf
ignore_errors: true
register: nm_query_non_vrf
- name: Verify query_non_vrf
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_vrf is not changed
- nm_query_non_vrf is not changed
- cm_query_non_vrf == nm_query_non_vrf
- name: Verify query_non_vrf (version < 3.0)
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_vrf.msg == nm_query_non_vrf.msg == "Provided vrf 'non_existing_vrf' does not exist. Existing vrfs{{':'}} VRF1, VRF2"
when: version.current.version is version('3', '<')
# USE A NON-EXISTING STATE
- name: Non-existing state for site cidr (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
state: non-existing-state
check_mode: true
@@ -611,14 +611,14 @@
register: cm_non_existing_state
- name: Non-existing state for site cidr (normal_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -627,7 +627,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for site cidr (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
schema: non-existing-schema
check_mode: true
@@ -635,14 +635,14 @@
register: cm_non_existing_schema
- name: Non-existing schema for site cidr (normal_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
schema: non-existing-schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -651,7 +651,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for site cidr (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
template: non-existing-template
check_mode: true
@@ -659,14 +659,14 @@
register: cm_non_existing_template
- name: Non-existing template for site cidr (normal_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
template: non-existing-template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -675,7 +675,7 @@
# USE A NON-ASSOCIATED TEMPLATE
- name: Non-associated template for site cidr (check_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
template: Template 2
check_mode: true
@@ -683,14 +683,14 @@
register: cm_non_associated_template
- name: Non-associated template for site cidr (normal_mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_query
template: Template 2
ignore_errors: true
register: nm_non_associated_template
- name: Verify non_associated_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_associated_template is not changed
- nm_non_associated_template is not changed
@@ -700,7 +700,7 @@
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site VRF region cidr to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -708,14 +708,14 @@
register: cm_no_site_associated
- name: Add site VRF region cidr to Template 3 without any site associated (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is changed
- nm_no_site_associated is changed \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr_subnet/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr_subnet/tasks/main.yml
index e5e8d3ca7..0858d5cf3 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_cidr_subnet/tasks/main.yml
@@ -8,13 +8,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -27,13 +27,13 @@
{ 'site': 'azure_{{ mso_site | default(\"ansible_test\") }}', 'region': 'westus', 'cidr': '10.1.0.0/16'}]"
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -44,7 +44,7 @@
state: present
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -55,7 +55,7 @@
state: present
- name: Remove Schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -64,7 +64,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -75,7 +75,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -83,7 +83,7 @@
state: present
- name: Ensure AWS site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -93,7 +93,7 @@
state: present
- name: Ensure Azure site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -101,7 +101,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -112,7 +112,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -120,7 +120,7 @@
state: present
- name: Add a new sites to a Template 1
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ item.site }}'
@@ -130,7 +130,7 @@
when: version.current.version is version('3', '<')
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -138,7 +138,7 @@
state: present
- name: Ensure region for VRF1 at site level exists
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -152,7 +152,7 @@
# ADD SUBNET
- name: Add a new subnet to AWS CIDR in VRF1 at site level (check mode)
- mso_schema_site_vrf_region_cidr_subnet: &mso_present
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet: &mso_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -167,7 +167,7 @@
register: cm_add_subnet
- name: Verify cm_add_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_add_subnet is changed
- cm_add_subnet.previous == {}
@@ -175,12 +175,12 @@
- cm_add_subnet.current.zone == 'us-west-1a'
- name: Add a new subnet to AWS CIDR in VRF1 at site level (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
register: nm_add_subnet
- name: Verify nm_add_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet is changed
- nm_add_subnet.previous == {}
@@ -188,31 +188,31 @@
- nm_add_subnet.current.zone == 'us-west-1a'
- name: Add same subnet again to AWS CIDR in VRF1 at site level (check mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
register: cm_add_subnet_again
- name: Verify cm_add_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_subnet_again is not changed
- cm_add_subnet_again.current.ip == cm_add_subnet_again.previous.ip == '10.0.0.0/24'
- cm_add_subnet_again.current.zone == cm_add_subnet_again.previous.zone == 'us-west-1a'
- name: Add same subnet again to AWS CIDR in VRF1 at site level (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
register: nm_add_subnet_again
- name: Verify nm_add_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_again is not changed
- nm_add_subnet_again.current.ip == nm_add_subnet_again.previous.ip == '10.0.0.0/24'
- nm_add_subnet_again.current.zone == nm_add_subnet_again.previous.zone == 'us-west-1a'
- name: Add a new subnet to Azure CIDR in VRF1 at site level (check mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -223,7 +223,7 @@
register: cm_add_subnet_2
- name: Verify cm_add_subnet_2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_subnet_2 is changed
- cm_add_subnet_2.previous == {}
@@ -231,7 +231,7 @@
- cm_add_subnet_2.current.zone == ''
- name: Add a new subnet to Azure CIDR in VRF1 at site level (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -241,7 +241,7 @@
register: nm_add_subnet_2
- name: Verify nm_add_subnet_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_2 is changed
- nm_add_subnet_2.previous == {}
@@ -249,7 +249,7 @@
- nm_add_subnet_2.current.zone == ''
- name: Add a second subnet to Azure CIDR in VRF1 at site level for VGW (check mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -261,7 +261,7 @@
register: cm_add_subnet_3
- name: Verify cm_add_subnet_3
- assert:
+ ansible.builtin.assert:
that:
- cm_add_subnet_3 is changed
- cm_add_subnet_3.previous == {}
@@ -271,7 +271,7 @@
# VGW
- name: Add a second subnet to Azure CIDR in VRF1 at site level for VGW (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -282,7 +282,7 @@
register: nm_add_subnet_3
- name: Verify nm_add_subnet_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_3 is changed
- nm_add_subnet_3.previous == {}
@@ -292,7 +292,7 @@
# Private Link Label
- name: Add a new subnet to Azure CIDR in VRF1 at site level for Private Link Label (MSO >3.3)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -304,7 +304,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_add_subnet_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_4 is changed
- nm_add_subnet_4.current.ip == '10.1.0.0/24'
@@ -313,7 +313,7 @@
# QUERY SUBNETS
- name: Query subnet to AWS CIDR in VRF1 at site level (check mode)
- mso_schema_site_vrf_region_cidr_subnet: &mso_query
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet: &mso_query
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -327,25 +327,25 @@
register: cm_query_subnet
- name: Verify cm_query_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_query_subnet is not changed
- cm_query_subnet.current.ip == '10.0.0.0/24'
- cm_query_subnet.current.zone == 'us-west-1a'
- name: Query subnet to AWS CIDR in VRF1 at site level (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
register: nm_query_subnet
- name: Verify nm_query_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_query_subnet is not changed
# QUERY ALL SUBNETS
- name: Query all subnets to AWS CIDR in VRF1 at site level (check mode)
- mso_schema_site_vrf_region_cidr_subnet: &mso_query_all
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet: &mso_query_all
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -358,7 +358,7 @@
register: cm_query_subnet_all_aws
- name: Query all subnets to Azure CIDR in VRF1 at site level (check mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query_all
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -368,7 +368,7 @@
register: cm_query_subnet_all_azure
- name: Verify cm_query_subnet_all_aws and cm_query_subnet_all_azure
- assert:
+ ansible.builtin.assert:
that:
- cm_query_subnet_all_aws is not changed
- cm_query_subnet_all_aws.current[0].ip == '10.0.0.0/24'
@@ -378,7 +378,7 @@
- cm_query_subnet_all_azure.current[1].ip == '10.1.1.0/24'
- name: Verify cm_query_subnet_all_aws and cm_query_subnet_all_azure zone
- assert:
+ ansible.builtin.assert:
that:
- cm_query_subnet_all_azure.current[0].zone == ''
- cm_query_subnet_all_azure.current[1].zone == ''
@@ -386,19 +386,19 @@
- name: Verify cm_query_subnet_all_aws and cm_query_subnet_all_azure zone
- assert:
+ ansible.builtin.assert:
that:
- cm_query_subnet_all_azure.current[0].zone == 'default'
- cm_query_subnet_all_azure.current[1].zone == 'default'
when: version.current.version is version('4.0', '>=')
- name: Query subnet to AWS CIDR in VRF1 at site level (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query_all
register: nm_query_subnet_all_aws
- name: Query subnet to AWS CIDR in VRF1 at site level (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query_all
site: 'azure_{{ mso_site | default("ansible_test") }}'
region: westus
@@ -407,7 +407,7 @@
register: nm_query_subnet_all_azure
- name: Verify nm_query_subnet_all_aws and nm_query_subnet_all_azure
- assert:
+ ansible.builtin.assert:
that:
- nm_query_subnet_all_aws is not changed
- nm_query_subnet_all_aws.current[0].ip == '10.0.0.0/24'
@@ -417,7 +417,7 @@
- nm_query_subnet_all_azure.current[1].ip == '10.1.1.0/24'
- name: Verify cm_query_subnet_all_aws and cm_query_subnet_all_azure zone
- assert:
+ ansible.builtin.assert:
that:
- nm_query_subnet_all_azure.current[0].zone == ''
- nm_query_subnet_all_azure.current[1].zone == ''
@@ -425,7 +425,7 @@
- name: Verify cm_query_subnet_all_aws and cm_query_subnet_all_azure zone
- assert:
+ ansible.builtin.assert:
that:
- nm_query_subnet_all_azure.current[0].zone == 'default'
- nm_query_subnet_all_azure.current[1].zone == 'default'
@@ -436,7 +436,7 @@
when: version.current.version is version('3.3', '>=')
block:
- name: Ensure VRF2 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -444,7 +444,7 @@
state: present
- name: Add a secondary CIDR in VRF1 at AWS site level
- mso_schema_site_vrf_region_cidr: &secondary_cidr
+ cisco.mso.mso_schema_site_vrf_region_cidr: &secondary_cidr
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -456,7 +456,7 @@
register: nm_add_cidr_3
- name: Verify nm_add_cidr_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr_3 is changed
- nm_add_cidr_3.previous == {}
@@ -464,7 +464,7 @@
- nm_add_cidr_3.current.primary == false
- name: Add a secondary CIDR in VRF1 at Azure site level
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *secondary_cidr
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -476,7 +476,7 @@
register: nm_add_cidr_4
- name: Verify nm_add_cidr_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr_4 is changed
- nm_add_cidr_4.previous == {}
@@ -484,7 +484,7 @@
- nm_add_cidr_4.current.primary == false
- name: Add hosted vrf parameters in VRF1 at Azure site level
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -500,7 +500,7 @@
register: azure_add_hosted_vrf
- name: Verify azure_add_hosted_vrf
- assert:
+ ansible.builtin.assert:
that:
- azure_add_hosted_vrf is changed
- azure_add_hosted_vrf.previous == {}
@@ -508,7 +508,7 @@
- azure_add_hosted_vrf.current.vrfRef.vrfName == 'VRF2'
- name: Add hosted vrf parameters in VRF1 at AWS site level
- mso_schema_site_vrf_region_cidr_subnet: &aws_cidr
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet: &aws_cidr
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -524,7 +524,7 @@
register: aws_add_hosted_vrf
- name: Verify aws_add_hosted_vrf
- assert:
+ ansible.builtin.assert:
that:
- aws_add_hosted_vrf is changed
- aws_add_hosted_vrf.previous == {}
@@ -532,89 +532,89 @@
- aws_add_hosted_vrf.current.vrfRef.vrfName == 'VRF2'
- name: Get Validation status
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
register: query_validate
- name: Verify query_validate
- assert:
+ ansible.builtin.assert:
that:
- query_validate is not changed
- name: Verify query_validate result < 4.0
- assert:
+ ansible.builtin.assert:
that:
- query_validate.current.result == "true"
when: version.current.version is version('4.0', '<')
- name: Verify query_validate result => 4.0
- assert:
+ ansible.builtin.assert:
that:
- query_validate.current.result == true
when: version.current.version is version('4.0', '>=')
# REMOVE SUBNETS
- name: Remove Subnet from CIDR (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
state: absent
check_mode: true
register: cm_remove_subnet
- name: Verify cm_remove_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_subnet is changed
- cm_remove_subnet.current == {}
- name: Remove Subnet from CIDR (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
state: absent
register: nm_remove_subnet
- name: Verify nm_remove_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_subnet is changed
- nm_remove_subnet.current == {}
- name: Remove Subnet from CIDR again (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
state: absent
check_mode: true
register: cm_remove_subnet_again
- name: Verify cm_remove_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_subnet_again is not changed
- cm_remove_subnet_again.current == {}
- name: Remove Subnet from CIDR again (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_present
state: absent
register: nm_remove_subnet_again
- name: Verify nm_remove_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_subnet_again is not changed
- nm_remove_subnet_again.current == {}
- name: Remove Subnet from CIDR (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *aws_cidr
state: absent
register: remove_subnet
when: version.current.version is version('3.3', '>=')
- name: Verify nm_remove_subnet
- assert:
+ ansible.builtin.assert:
that:
- remove_subnet is changed
- remove_subnet.current == {}
@@ -622,7 +622,7 @@
# QUERY NON-EXISTING subnet in CIDR
- name: Query non-existing subnet (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
subnet: non_existing_subnet
check_mode: true
@@ -630,14 +630,14 @@
register: cm_query_non_subnet
- name: Query non-existing subnet (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
subnet: non_existing_subnet
ignore_errors: true
register: nm_query_non_subnet
- name: Verify query_non_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_subnet is not changed
- nm_query_non_subnet is not changed
@@ -647,7 +647,7 @@
# QUERY NON-EXISTING CIDR
- name: Query non-existing CIDR (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
cidr: non_existing_cidr
check_mode: true
@@ -655,34 +655,34 @@
register: cm_query_non_cidr
- name: Query non-existing CIDR (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
cidr: non_existing_cidr
ignore_errors: true
register: nm_query_non_cidr
- name: Verify query_non_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_cidr is not changed
- nm_query_non_cidr is not changed
- cm_query_non_cidr == nm_query_non_cidr
- name: Verify query_non_cidr value (version < 3.3)
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_cidr.msg == nm_query_non_cidr.msg == "Provided CIDR IP 'non_existing_cidr' does not exist. Existing CIDR IPs{{':'}} 10.0.0.0/16. Use mso_schema_site_vrf_region_cidr to create it."
when: version.current.version is version('3.3', '<')
- name: Verify query_non_cidr value (version >= 3.3)
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_cidr.msg == nm_query_non_cidr.msg == "Provided CIDR IP 'non_existing_cidr' does not exist. Existing CIDR IPs{{':'}} 10.0.0.0/16, 10.2.0.0/16. Use mso_schema_site_vrf_region_cidr to create it."
when: version.current.version is version('3.3', '>=')
# QUERY NON-EXISTING region
- name: Query non-existing region (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
region: non_existing_region
check_mode: true
@@ -690,14 +690,14 @@
register: cm_query_non_region
- name: Query non-existing region (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
region: non_existing_region
ignore_errors: true
register: nm_query_non_region
- name: Verify query_non_region
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_region is not changed
- nm_query_non_region is not changed
@@ -706,7 +706,7 @@
# QUERY NON-EXISTING VRF
- name: Query non-existing VRF (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
vrf: non_existing_vrf
check_mode: true
@@ -714,14 +714,14 @@
register: cm_query_non_vrf
- name: Query non-existing VRF (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
vrf: non_existing_vrf
ignore_errors: true
register: nm_query_non_vrf
- name: Verify query_non_vrf
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_vrf is not changed
- nm_query_non_vrf is not changed
@@ -730,7 +730,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state for site cidr subnet (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
state: non-existing-state
check_mode: true
@@ -738,14 +738,14 @@
register: cm_non_existing_state
- name: Non-existing state for site cidr subnet (normal_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -754,7 +754,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for site cidr subnet (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
schema: non-existing-schema
check_mode: true
@@ -762,14 +762,14 @@
register: cm_non_existing_schema
- name: Non-existing schema for site cidr subnet (normal_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
schema: non-existing-schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -778,7 +778,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for site cidr subnet (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
template: non-existing-template
check_mode: true
@@ -786,14 +786,14 @@
register: cm_non_existing_template
- name: Non-existing template for site cidr subnet (normal_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
template: non-existing-template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -802,7 +802,7 @@
# USE A NON-ASSOCIATED TEMPLATE
- name: Non-associated template for site cidr subnet (check_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
template: Template 2
check_mode: true
@@ -810,14 +810,14 @@
register: cm_non_associated_template
- name: Non-associated template for site cidr subnet (normal_mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
template: Template 2
ignore_errors: true
register: nm_non_associated_template
- name: Verify non_associated_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_associated_template is not changed
- nm_non_associated_template is not changed
@@ -827,7 +827,7 @@
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site cidr subnet to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -836,7 +836,7 @@
register: cm_no_site_associated
- name: Add site cidr subnet to Template 3 without any site associated (normal mode)
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -844,7 +844,7 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
@@ -852,7 +852,7 @@
# Checking if issue when adding subnet to Hub Network (#126)
- name: Add hub network in VRF1 region us-west-1 at AWS site level
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -865,7 +865,7 @@
state: present
- name: Add a new subnet to AWS CIDR in VRF1 at site level
- mso_schema_site_vrf_region_cidr_subnet:
+ cisco.mso.mso_schema_site_vrf_region_cidr_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -880,7 +880,7 @@
register: nm_add_subnet_hub_network
- name: Verify nm_add_subnet_hub_network
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_hub_network is changed
- nm_add_subnet_hub_network.current.usage == 'gateway' \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/hub_network.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/hub_network.yml
index 33fde6710..61936621a 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/hub_network.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/hub_network.yml
@@ -6,7 +6,7 @@
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -20,7 +20,7 @@
'{{ mso_site | default(\"ansible_test\") }}']"
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -31,7 +31,7 @@
state: present
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -42,7 +42,7 @@
state: present
- name: Remove Schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -51,7 +51,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure sites removed from tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -62,7 +62,7 @@
- 'azure_{{ mso_site | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
# sites:
@@ -72,7 +72,7 @@
state: present
- name: Ensure AWS site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -82,7 +82,7 @@
state: present
- name: Ensure Azure site is present under tenant ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -90,7 +90,7 @@
state: present
- name: Ensure schema 1 with Template 1 and 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -101,7 +101,7 @@
- Template 2
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -109,7 +109,7 @@
state: present
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -117,7 +117,7 @@
state: present
- name: Add a new CIDR in VRF1 at AWS site level (check mode)
- mso_schema_site_vrf_region_cidr: &mso_present
+ cisco.mso.mso_schema_site_vrf_region_cidr: &mso_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -131,7 +131,7 @@
register: cm_add_cidr
- name: Verify cm_add_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cidr is changed
- cm_add_cidr.previous == {}
@@ -139,12 +139,12 @@
- cm_add_cidr.current.primary == true
- name: Add a new CIDR in VRF1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *mso_present
register: nm_add_cidr
- name: Verify nm_add_cidr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr is changed
- nm_add_cidr.previous == {}
@@ -153,7 +153,7 @@
# ADD Hub Network
- name: Add hub network in VRF1 region us-west-1 at AWS site level (check mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -168,7 +168,7 @@
register: cm_add_hub_network
- name: Add hub network in VRF1 region us-west-1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -182,7 +182,7 @@
register: nm_add_hub_network
- name: Verify cm_add_hub_network and nm_add_hub_network
- assert:
+ ansible.builtin.assert:
that:
- cm_add_hub_network is changed
- nm_add_hub_network is changed
@@ -195,7 +195,7 @@
# Add hub network again
- name: Add hub network again in VRF1 region us-west-1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -209,7 +209,7 @@
register: nm_add_hub_network_again
- name: Verify nm_add_hub_network_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_hub_network_again is not changed
- nm_add_hub_network_again.previous.name == nm_add_hub_network_again.current.name == "hub-test"
@@ -217,7 +217,7 @@
# Update hub network
- name: Update hub network in VRF1 region us-west-1 at AWS site level (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -232,7 +232,7 @@
register: cm_update_hub_network
- name: Update hub network in VRF1 region us-west-1 at AWS site level (normal_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -246,7 +246,7 @@
register: nm_update_hub_network
- name: Verify cm_update_hub_network and nm_update_hub_network
- assert:
+ ansible.builtin.assert:
that:
- cm_update_hub_network is changed
- nm_update_hub_network is changed
@@ -261,7 +261,7 @@
# Query Hub Network
- name: Query hub network in VRF1 region us-west-1 at AWS site level
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -273,7 +273,7 @@
register: cm_query_hub_network
- name: Verify cm_query_hub_network
- assert:
+ ansible.builtin.assert:
that:
- cm_query_hub_network is not changed
- cm_query_hub_network.current.name == "hub-default"
@@ -281,7 +281,7 @@
# Remove Hub Network
- name: Remove hub network in VRF1 region us-west-1 at AWS site level (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -293,7 +293,7 @@
register: cm_remove_hub_network
- name: Remove hub network in VRF1 region us-west-1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -304,7 +304,7 @@
register: nm_remove_hub_network
- name: Verify cm_remove_hub_network and nm_remove_hub_network
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_hub_network is changed
- cm_remove_hub_network.current == {}
@@ -317,7 +317,7 @@
# Remove Hub Network again
- name: Remove again hub network in VRF1 region us-west-1 at AWS site level (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -329,7 +329,7 @@
register: cm_remove_hub_network_again
- name: Remove again hub network in VRF1 region us-west-1 at AWS site level (normal_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -340,7 +340,7 @@
register: nm_remove_hub_network_again
- name: Verify cm_remove_hub_network_again and nm_remove_hub_network_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_hub_network_again is not changed
- nm_remove_hub_network_again is not changed
@@ -349,7 +349,7 @@
# query when hub network does not exist
- name: Query non_existing_hub_network
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -361,13 +361,13 @@
register: query_non_existing_hub_network
- name: Verify query_non_existing_hub_network
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing_hub_network.msg == "Hub network not found"
# Re-Add hub network
- name: Re-Add hub network in VRF1 region us-west-1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -381,7 +381,7 @@
register: re_add_hub_network
- name: Verify re_add_hub_network
- assert:
+ ansible.builtin.assert:
that:
- re_add_hub_network is changed
- re_add_hub_network.previous == {}
@@ -390,7 +390,7 @@
# QUERY NON-EXISTING region
- name: Query non-existing region (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -403,7 +403,7 @@
register: cm_query_non_region
- name: Query non-existing region (normal mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -415,7 +415,7 @@
register: nm_query_non_region
- name: Verify query_non_region
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_region is not changed
- nm_query_non_region is not changed
@@ -424,7 +424,7 @@
# QUERY NON-EXISTING VRF
- name: Query non-existing VRF (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -437,7 +437,7 @@
register: cm_query_non_vrf
- name: Query non-existing VRF (normal mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -449,7 +449,7 @@
register: nm_query_non_vrf
- name: Verify query_non_vrf
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_vrf is not changed
- nm_query_non_vrf is not changed
@@ -458,7 +458,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state for site hub network (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -471,7 +471,7 @@
register: cm_non_existing_state
- name: Non-existing state for hub network (normal_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -483,7 +483,7 @@
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -492,7 +492,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for site hub network (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -505,7 +505,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for site hub network (normal_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -517,7 +517,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -526,7 +526,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for site hub network (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -539,7 +539,7 @@
register: cm_non_existing_template
- name: Non-existing template for site hub network (normal_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -551,7 +551,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -560,7 +560,7 @@
# USE A NON_EXISTING_SITE_TEMPLATE
- name: non_existing_site_template (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -573,7 +573,7 @@
register: cm_non_existing_site_template
- name: non_existing_site_template (normal_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -585,7 +585,7 @@
register: nm_non_existing_site_template
- name: Verify cm_non_existing_site_template and nm_non_existing_site_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site_template is not changed
- nm_non_existing_site_template is not changed
@@ -593,7 +593,7 @@
# USE A NON_EXISTING_SITE
- name: non_existing_site (check_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -606,7 +606,7 @@
register: cm_non_existing_site
- name: non_existing_site (normal_mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -618,7 +618,7 @@
register: nm_non_existing_site
- name: Verify cm_non_existing_site and nm_non_existing_site
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_site is not changed
- nm_non_existing_site is not changed
@@ -626,7 +626,7 @@
# use mso_schema_site_vrf_region_cidr_subnet module to update region
- name: Add a new CIDR in VRF1 at AWS site level (check mode)
- mso_schema_site_vrf_region_cidr: &cidr_present
+ cisco.mso.mso_schema_site_vrf_region_cidr: &cidr_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -640,7 +640,7 @@
register: cm_add_cidr
- name: Verify cm_add_cidr
- assert:
+ ansible.builtin.assert:
that:
- cm_add_cidr is changed
- cm_add_cidr.previous == {}
@@ -648,12 +648,12 @@
- cm_add_cidr.current.primary == false
- name: Add a new CIDR in VRF1 at AWS site level (normal mode)
- mso_schema_site_vrf_region_cidr:
+ cisco.mso.mso_schema_site_vrf_region_cidr:
<<: *cidr_present
register: nm_add_cidr
- name: Verify nm_add_cidr
- assert:
+ ansible.builtin.assert:
that:
- nm_add_cidr is changed
- nm_add_cidr.previous == {}
@@ -662,7 +662,7 @@
# query hub network after using mso_schema_site_vrf_region_cidr_subnet module to update region
- name: Query hub_network after region updated
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -673,7 +673,7 @@
register: query_after_region_update
- name: Verify query_after_region_update
- assert:
+ ansible.builtin.assert:
that:
- query_after_region_update is not changed
- query_after_region_update.current.name == "hub-test"
@@ -681,7 +681,7 @@
# USE A TEMPLATE WITHOUT ANY SITE
- name: Add site VRF region hub network to Schema 2 Template 3 without any site associated (check mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -697,7 +697,7 @@
register: cm_no_site_associated
- name: Add site VRF region hub network to Template 3 without any site associated (normal mode)
- mso_schema_site_vrf_region_hub_network:
+ cisco.mso.mso_schema_site_vrf_region_hub_network:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -712,7 +712,7 @@
register: nm_no_site_associated
- name: Verify cm_no_site_associated and nm_no_site_associated
- assert:
+ ansible.builtin.assert:
that:
- cm_no_site_associated is not changed
- nm_no_site_associated is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/main.yml
index 6eb612ad0..a282da449 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_site_vrf_region_hub_network/tasks/main.yml
@@ -5,13 +5,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,7 +22,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template/tasks/main.yml
index 9823bcfd4..c3da18453 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template/tasks/main.yml
@@ -1,16 +1,17 @@
# Test code for the MSO modules
# Copyright: (c) 2020, Shreyas Srish (@shrsr) <ssrish@cisco.com>
+# Copyright: (c) 2023, Akini Ross (@akinross) <akinross@cisco.com>
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,13 +22,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -39,7 +40,7 @@
ignore_errors: true
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -49,7 +50,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: '{{ item }}'
users:
@@ -62,7 +63,7 @@
- 'ansible_test_2'
- name: Ensure schema 1 with Template 1 exists in check mode
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -72,7 +73,7 @@
register: add_template1_schema1_cm
- name: Ensure schema 1 with Template 1 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -81,7 +82,7 @@
register: add_template1_schema1
- name: Ensure schema 1 with Template 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -90,7 +91,7 @@
register: add_template2_schema1
- name: Ensure schema 2 with Template 3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -99,7 +100,7 @@
register: add_template3_schema2
- name: Ensure schema 2 with Template 3 exists again
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -108,7 +109,7 @@
register: add_template3_schema2_again
- name: Ensure schema 3 with Template 1 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_3'
tenant: ansible_test
@@ -117,7 +118,7 @@
register: add_template1_schema3
- name: Ensure schema 3 with Template 2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_3'
tenant: ansible_test_2
@@ -126,7 +127,7 @@
register: add_template2_schema3
- name: Update display name of Template 3 in schema 2
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -136,7 +137,7 @@
register: update_template3_schema2
- name: Verify add
- assert:
+ ansible.builtin.assert:
that:
- add_template1_schema1_cm is changed
- add_template1_schema1_cm.current.name == 'Template1'
@@ -155,7 +156,7 @@
- update_template3_schema2.current.displayName == 'Temp 3'
- name: Query Template 1 in Schema 1
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -164,7 +165,7 @@
register: query_template1_schema1
- name: Query all Templates in Schema 1
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -172,7 +173,7 @@
register: query_all_templates_schema1
- name: Query Template 1 in Schema 3
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_3'
tenant: ansible_test
@@ -181,7 +182,7 @@
register: query_template1_schema3
- name: Query Template 2 in Schema 3
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_3'
tenant: ansible_test_2
@@ -190,7 +191,7 @@
register: query_template2_schema3
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- query_template1_schema1 is not changed
- query_template1_schema1.current.name == 'Template1'
@@ -202,7 +203,7 @@
- query_template2_schema3.current.name == 'Template2'
- name: Remove Template 1 of Schema 1
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -212,7 +213,7 @@
register: remove_template1_schema1
- name: Remove Template 2 of Schema 1
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -221,7 +222,7 @@
register: remove_template2_schema1
- name: Remove non_existing_template
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -231,7 +232,7 @@
register: remove_template_non_existing_template
- name: Remove Template 3 in schema 2 in check mode
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -241,7 +242,7 @@
register: remove_template3_schema2_cm
- name: Remove Template 3 in schema 2 in normal mode
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -250,7 +251,7 @@
register: remove_template3_schema2_nm
- name: Remove Template 3 in schema 2 again
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -259,7 +260,7 @@
register: remove_template3_schema2_nm_again
- name: Remove Template 1 of Schema 3
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_3'
tenant: ansible_test
@@ -268,7 +269,7 @@
register: remove_template1_schema3
- name: Remove Template 2 of Schema 3
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_3'
tenant: ansible_test_2
@@ -277,7 +278,7 @@
register: remove_template2_schema3
- name: non_existing_schema
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: non_schema
tenant: ansible_test
@@ -287,7 +288,7 @@
register: remove_template_non_existing_schema
- name: Verify remove
- assert:
+ ansible.builtin.assert:
that:
- remove_template1_schema1.current == {}
- remove_template1_schema1.previous.name == 'Template1'
@@ -307,7 +308,7 @@
# USE NON-EXISTING STATE
- name: non_existing_state state
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -317,14 +318,14 @@
register: non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- non_existing_state is not changed
- non_existing_state.msg == "value of state must be one of{{':'}} absent, present, query, got{{':'}} non_existing_state"
# USE A NON_EXISTING_TEMPLATE
- name: non_existing_template
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -334,13 +335,13 @@
register: non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- non_existing_template is not changed
- non_existing_template.msg == "Template 'non_existing_template' not found"
- name: Template attribute absent in task
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: non_schema
tenant: ansible_test
@@ -349,13 +350,13 @@
register: absent_template
- name: Verify absent_template
- assert:
+ ansible.builtin.assert:
that:
- absent_template is not changed
- absent_template.current == []
- name: Update description schema 1 with Template 1 when version is greater than 3.3
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
schema_description: "this is schema"
@@ -367,14 +368,14 @@
when: version.current.version is version('3.3', '>=')
- name: Verify add description
- assert:
+ ansible.builtin.assert:
that:
- add_description is changed
when: version.current.version is version('3.3', '>=')
# REMOVE Schemas for next CI Run
- name: Remove schemas for next ci test
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -385,7 +386,84 @@
# REMOVE Tenant2 specific to this test case
- name: Remove tenant2
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test_2
- state: absent \ No newline at end of file
+ state: absent
+
+# TEST BLOCK FOR MSO VERSION >= 4.1 WHICH ALLOW FOR SCHEMA WITHOUT TEMPLATES
+- name: Execute tasks only for MSO version >= 4.1
+ when: version.current.version is version('4.1', '>=')
+ block:
+
+ - name: Ensure schema without templates is not present
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: ansible_test
+ state: absent
+
+ - name: Create a schema without templates
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: ansible_test
+ state: present
+
+ - name: Query all templates in schema without templates
+ cisco.mso.mso_schema_template:
+ <<: *mso_info
+ schema: ansible_test
+ state: query
+ register: query_all_templates_ansible_test
+
+ - name: Verify schema without templates creation has no templates
+ ansible.builtin.assert:
+ that:
+ - query_all_templates_ansible_test.current == []
+
+ # Templates are not allowed to do PATCH add operation on schema without templates in earlier versions
+ # Error would be: "message": "add operation does not apply: doc is missing path: \"/templates/-\": missing value"
+ - name: Create a template in schema without templates for version >= 4.2
+ cisco.mso.mso_schema_template: &ansible_test_template
+ <<: *mso_info
+ schema: ansible_test
+ tenant: ansible_test
+ template: template_1
+ state: present
+ register: create_template_in_ansible_test
+ when: version.current.version is version('4.2', '>=')
+
+ - name: Verify creation of template in schema without templates for version >= 4.2
+ ansible.builtin.assert:
+ that:
+ - create_template_in_ansible_test is changed
+ - create_template_in_ansible_test.current.displayName == "template_1"
+ when: version.current.version is version('4.2', '>=')
+
+ - name: Remove a template in schema without templates
+ cisco.mso.mso_schema_template:
+ <<: *ansible_test_template
+ state: absent
+ register: remove_template_in_ansible_test
+
+ - name: Remove schema without templates
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: ansible_test
+ state: absent
+ register: remove_ansible_test
+
+ - name: Verify schema without templates creation is removed
+ ansible.builtin.assert:
+ that:
+ - remove_template_in_ansible_test is not changed
+ - remove_template_in_ansible_test.current == {}
+ - remove_ansible_test is changed
+ when: version.current.version is version('4.2', '<')
+
+ - name: Verify schema without templates creation is removed
+ ansible.builtin.assert:
+ that:
+ - remove_template_in_ansible_test is changed
+ - remove_template_in_ansible_test.current == {}
+ - remove_ansible_test is not changed
+ when: version.current.version is version('4.2', '>=')
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp/tasks/main.yml
index bbd5bb1cb..0084bfcd6 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,13 +22,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -38,13 +38,13 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove tenant2
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test_2
state: absent
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -52,7 +52,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -60,7 +60,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -68,7 +68,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -76,7 +76,7 @@
state: present
- name: Ensure ANP exist (check_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -86,7 +86,7 @@
register: cm_create_anp
- name: Ensure ANP exist (normal_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -95,7 +95,7 @@
register: nm_create_anp
- name: Create ANP again (normal_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -104,7 +104,7 @@
register: nm_create_anp_again
- name: Verify cm_create_anp, nm_create_anp and nm_create_anp_again
- assert:
+ ansible.builtin.assert:
that:
- cm_create_anp is changed
- nm_create_anp is changed
@@ -123,7 +123,7 @@
- nm_create_anp_again.current.epgs == []
- name: Create another anp (normal_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -133,7 +133,7 @@
register: nm_create_another_anp
- name: Verify nm_create_another_anp
- assert:
+ ansible.builtin.assert:
that:
- nm_create_another_anp is changed
- nm_create_another_anp.previous == {}
@@ -144,7 +144,7 @@
# Add description for version >= 3.3
- name: Create another anp with description(normal_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -156,7 +156,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_create_another_anp with description
- assert:
+ ansible.builtin.assert:
that:
- nm_create_another_anp is changed
- nm_create_another_anp.previous == {}
@@ -167,7 +167,7 @@
when: version.current.version is version('3.3', '>=')
- name: Change anp (normal_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -177,7 +177,7 @@
register: nm_change_anp
- name: Verify nm_change_anp
- assert:
+ ansible.builtin.assert:
that:
- nm_change_anp is changed
- nm_change_anp.previous.name == nm_change_anp.current.name == "ANP"
@@ -186,7 +186,7 @@
- nm_change_anp.previous.epgs == nm_change_anp.current.epgs == []
- name: Query anp
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -195,7 +195,7 @@
register: query_anp
- name: Verify query_anp
- assert:
+ ansible.builtin.assert:
that:
- query_anp is not changed
- query_anp.current.name == "ANP"
@@ -203,7 +203,7 @@
- query_anp.current.displayName == "displayName for ANP"
- name: Query all
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -211,21 +211,21 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length == 2
when: version.current.version is version('3.3', '<')
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length == 3
when: version.current.version is version('3.3', '>=')
- name: Query non_existing anp
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -235,12 +235,12 @@
register: query_non_existing_anp
- name: Verify query_non_existing_anp
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing_anp.msg == "ANP 'non_existing_anp' not found"
- name: Use non_existing schema
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: non_existing_schema
template: Template 1
@@ -250,7 +250,7 @@
register: query_non_existing_schema
- name: Use non_existing template
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non_existing_template
@@ -260,13 +260,13 @@
register: query_non_existing_template
- name: Verify query_non_existing_schema and query_non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
- query_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1, Template2"
- name: Remove anp (check_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -276,7 +276,7 @@
register: cm_rm_anp
- name: Remove anp (normal_mode)
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -285,7 +285,7 @@
register: nm_rm_anp
- name: Verify cm_rm_anp and nm_rm_anp
- assert:
+ ansible.builtin.assert:
that:
- cm_rm_anp is changed
- nm_rm_anp is changed
@@ -296,7 +296,7 @@
- nm_rm_anp.previous.epgs == cm_rm_anp.previous.epgs == []
- name: Remove anp again
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -305,7 +305,7 @@
register: nm_rm_anp_again
- name: Verify nm_rm_anp_again
- assert:
+ ansible.builtin.assert:
that:
- nm_rm_anp_again is not changed
- nm_rm_anp_again.previous == nm_rm_anp_again.current == {}
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg/tasks/main.yml
index a4af6fb6d..16fdddc28 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg/tasks/main.yml
@@ -7,14 +7,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -25,13 +25,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -40,7 +40,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
users:
@@ -48,7 +48,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -56,7 +56,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -64,7 +64,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -72,7 +72,7 @@
state: present
- name: Ensure VRF exist
- mso_schema_template_vrf: &vrf_present
+ cisco.mso.mso_schema_template_vrf: &vrf_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -81,13 +81,13 @@
state: present
- name: Ensure VRF2 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
vrf: VRF2
state: present
- name: Ensure VRF3 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -95,7 +95,7 @@
state: present
- name: Ensure VRF4 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -103,7 +103,7 @@
state: present
- name: Ensure ANP exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -111,7 +111,7 @@
state: present
- name: Ensure ANP2 exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -119,7 +119,7 @@
state: present
- name: Ensure ANP3 exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -127,7 +127,7 @@
state: present
- name: Ensure Filter 1 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -136,7 +136,7 @@
state: present
- name: Ensure Contract1 exist
- mso_schema_template_contract_filter: &contract_present
+ cisco.mso.mso_schema_template_contract_filter: &contract_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -147,7 +147,7 @@
state: present
- name: Ensure Filter 2 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -156,7 +156,7 @@
state: present
- name: Ensure Contract2 exist
- mso_schema_template_contract_filter: &contract2_present
+ cisco.mso.mso_schema_template_contract_filter: &contract2_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -167,7 +167,7 @@
state: present
- name: Ensure ansible_test_1 BD exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -178,7 +178,7 @@
state: present
- name: Ensure ansible_test_2 BD exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -190,7 +190,7 @@
state: present
- name: Ensure ansible_test_3 BD exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -203,7 +203,7 @@
state: present
- name: Ensure ansible_test_4 BD exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -217,7 +217,7 @@
# ADD EPG
- name: Add EPG (check_mode)
- mso_schema_template_anp_epg: &epg_present
+ cisco.mso.mso_schema_template_anp_epg: &epg_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -232,7 +232,7 @@
register: cm_add_epg
- name: Verify cm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg is changed
- cm_add_epg.previous == {}
@@ -243,12 +243,12 @@
- cm_add_epg.current.bdRef.bdName == "ansible_test_1"
- name: Add EPG (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
register: nm_add_epg
- name: Verify nm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg is changed
- nm_add_epg.previous == {}
@@ -261,13 +261,13 @@
- cm_add_epg.current.bdRef.schemaId == nm_add_epg.current.bdRef.schemaId
- name: Add EPG again (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
check_mode: true
register: cm_add_epg_again
- name: Verify cm_add_epg_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg_again is not changed
- cm_add_epg_again.current.name == cm_add_epg_again.previous.name == "ansible_test_1"
@@ -280,12 +280,12 @@
- name: Add EPG again (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
register: nm_add_epg_again
- name: Verify nm_add_epg_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_again is not changed
- nm_add_epg_again.current.name == nm_add_epg_again.previous.name == "ansible_test_1"
@@ -297,13 +297,13 @@
- nm_add_epg_again.previous.bdRef.schemaId == nm_add_epg_again.current.bdRef.schemaId
- name: Add EPG 2 (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
schema: '{{ mso_schema | default("ansible_test") }}'
epg: ansible_test_2
- name: Add EPG 3 in template of schema 1(normal mode)
- mso_schema_template_anp_epg: &epg_schema_1_template_2
+ cisco.mso.mso_schema_template_anp_epg: &epg_schema_1_template_2
<<: *epg_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -338,7 +338,7 @@
register: nm_add_epg_3
- name: Add EPG 4 in template3 of schema 2(normal mode)
- mso_schema_template_anp_epg: &epg_schema_2_template_3
+ cisco.mso.mso_schema_template_anp_epg: &epg_schema_2_template_3
<<: *epg_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -355,7 +355,7 @@
register: nm_add_epg_4
- name: Verify nm_add_epg_3 and nm_add_epg_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_3 is changed
- nm_add_epg_4 is changed
@@ -397,7 +397,7 @@
# CHANGE EPG
- name: Change EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
vrf:
name: VRF2
@@ -407,7 +407,7 @@
register: cm_change_epg
- name: Verify cm_change_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_change_epg is changed
- cm_change_epg.current.name == 'ansible_test_1'
@@ -418,7 +418,7 @@
- cm_change_epg.current.bdRef.schemaId == cm_change_epg.previous.bdRef.schemaId
- name: Change EPG (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
vrf:
name: VRF2
@@ -428,7 +428,7 @@
register: nm_change_epg
- name: Verify nm_change_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg is changed
- nm_change_epg.current.name == 'ansible_test_1'
@@ -439,7 +439,7 @@
- nm_change_epg.current.bdRef.schemaId == nm_change_epg.previous.bdRef.schemaId
- name: Change EPG again (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
vrf:
name: VRF2
@@ -449,7 +449,7 @@
register: cm_change_epg_again
- name: Verify cm_change_epg_again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_epg_again is not changed
- cm_change_epg_again.current.name == 'ansible_test_1'
@@ -460,7 +460,7 @@
- cm_change_epg_again.current.bdRef.schemaId == cm_change_epg_again.previous.bdRef.schemaId
- name: Change EPG again (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
vrf:
name: VRF2
@@ -469,7 +469,7 @@
register: nm_change_epg_again
- name: Verify nm_change_epg_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_again is not changed
- nm_change_epg_again.current.name == 'ansible_test_1'
@@ -480,7 +480,7 @@
- nm_change_epg_again.current.bdRef.schemaId == nm_change_epg_again.previous.bdRef.schemaId
- name: Change EPG to VRF in different template (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_schema_1_template_2
vrf:
name: VRF
@@ -491,7 +491,7 @@
register: nm_change_epg_vrf3
- name: Change EPG 4 to VRF (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_schema_2_template_3
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -508,7 +508,7 @@
register: nm_change_epg_vrf4
- name: Verify nm_change_epg_vrf3 and nm_change_epg_vrf4
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_vrf3 is changed
- nm_change_epg_vrf3.current.name == 'ansible_test_3'
@@ -521,7 +521,7 @@
- nm_change_epg_vrf4.current.vrfRef.templateName == nm_change_epg_vrf4.current.bdRef.templateName == "Template1"
- name: Change EPG 1 settings(normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -547,7 +547,7 @@
register: nm_change_epg_1_settings
- name: Change EPG 1 subnets (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -571,7 +571,7 @@
register: nm_change_epg_1_subnets
- name: Verify nm_change_epg_1_subnets
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_1_settings is changed
- nm_change_epg_1_settings.current.name == "ansible_test_1"
@@ -633,7 +633,7 @@
# # QUERY ALL EPGs
- name: Query all EPGs in an ANP (check_mode)
- mso_schema_template_anp_epg: &epg_query
+ cisco.mso.mso_schema_template_anp_epg: &epg_query
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -643,12 +643,12 @@
register: cm_query_all_epgs
- name: Query all EPGs (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
register: nm_query_all_epgs
- name: Verify query_all_epgs
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_epgs is not changed
- nm_query_all_epgs is not changed
@@ -657,20 +657,20 @@
# QUERY AN EPG
- name: Query EPG 1 (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: ansible_test_1
check_mode: true
register: cm_query_epg_1
- name: Query EPG 1 (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: ansible_test_1
register: nm_query_epg_1
- name: Query EPG 3 (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
template: Template 2
anp: ANP2
@@ -678,7 +678,7 @@
register: nm_query_epg_3
- name: Query EPG 4 (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -687,7 +687,7 @@
register: nm_query_epg_4
- name: Verify query_epg_x
- assert:
+ ansible.builtin.assert:
that:
- cm_query_epg_1 is not changed
- nm_query_epg_1 is not changed
@@ -752,57 +752,57 @@
# REMOVE EPG
- name: Remove EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
state: absent
check_mode: true
register: cm_remove_epg
- name: Verify cm_remove_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_epg is changed
- cm_remove_epg.current == {}
- name: Remove EPG (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
state: absent
register: nm_remove_epg
- name: Verify nm_remove_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_epg is changed
- nm_remove_epg.current == {}
- name: Remove EPG again (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
state: absent
check_mode: true
register: cm_remove_epg_again
- name: Verify cm_remove_epg_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_epg_again is not changed
- cm_remove_epg_again.current == {}
- name: Remove EPG again (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
state: absent
register: nm_remove_epg_again
- name: Verify nm_remove_epg_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_epg_again is not changed
- nm_remove_epg_again.current == {}
- name: Remove EPG (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -817,7 +817,7 @@
- version.current.version is version('3.3', '>=')
block:
- name: Add EPG (for version greater than 3.3)
- mso_schema_template_anp_epg: &new_epg
+ cisco.mso.mso_schema_template_anp_epg: &new_epg
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -828,13 +828,13 @@
register: add_epg_desc
- name: Verify Add description
- assert:
+ ansible.builtin.assert:
that:
- add_epg_desc is changed
- add_epg_desc.current.description == "Description of ANP EPG"
- name: Remove EPG (for version greater than 3.3)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *new_epg
state: absent
@@ -843,7 +843,7 @@
- version.current.version is version('4.0', '>=')
block:
- name: Add EPG service type parameters (for version greater than 4.0)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *new_epg
epg_type: 'service'
deployment_type: 'third_party'
@@ -852,7 +852,7 @@
register: service_type_epg
- name: Add EPG service type parameters (for version greater than 4.0) with error
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *new_epg
epg_type: 'service'
deployment_type: 'third_party'
@@ -862,7 +862,7 @@
register: service_type_epg_error
- name: Verify service type error
- assert:
+ ansible.builtin.assert:
that:
- service_type_epg_error.msg == "MSO Error 400{{':'}} EPG{{':'}} ansible_test_1 in Schema{{':'}} ansible_test , Template{{':'}} Template1 DeploymentType{{':'}} saas, AccessType {{':'}}publicAndPrivateType, Combination is not supported"
@@ -873,7 +873,7 @@
- version.current.version is version('4.0', '<')
block:
- name: Add EPG service type parameters (for version greater than 3.3 and less than 4.0)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *new_epg
epg_type: 'service'
deployment_type: 'third_party'
@@ -882,7 +882,7 @@
register: add_epg
- name: Get Validation status for service type parameters
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
@@ -890,13 +890,13 @@
register: query_validate
- name: Verify validation
- assert:
+ ansible.builtin.assert:
that:
- query_validate is not changed
- query_validate.msg == "MSO Error 400{{':'}} Bad Request{{':'}} Patch Failed, Received{{':'}} For Deployment type 'Third-party' access type 'PublicAndPrivate' is not supported exception while trying to update schema"
- name: Add EPG service type parameters (for version greater than 3.3 and less than 4.0)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *new_epg
epg_type: 'service'
deployment_type: 'cloud_native'
@@ -905,7 +905,7 @@
register: add_epg
- name: Get Validation status for service type parameters
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
@@ -913,13 +913,13 @@
register: query_validate
- name: Verify validation
- assert:
+ ansible.builtin.assert:
that:
- query_validate is not changed
- query_validate.current.result == "true"
- name: Add new EPG service type parameters (for version greater than 3.3 and less than 4.0)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *new_epg
epg_type: 'service'
deployment_type: 'third_party'
@@ -928,7 +928,7 @@
register: add_epg
- name: Get Validation status for service type parameters
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
@@ -936,14 +936,14 @@
register: query_validate
- name: Verify validation
- assert:
+ ansible.builtin.assert:
that:
- query_validate is not changed
- query_validate.current.result == "true"
# Add QoS level to EPG
- name: Add EPG (for version greater than 3.1)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
name: ansible_test_5
qos_level: 'level2'
@@ -951,14 +951,14 @@
when: version.current.version is version('3.1', '>=')
- name: Verify Add contract for version greater than 3.1
- assert:
+ ansible.builtin.assert:
that:
- add_epg is changed
when: version.current.version is version('3.1', '>=')
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: non_existing_epg
check_mode: true
@@ -966,14 +966,14 @@
register: cm_query_non_epg
- name: Query non-existing EPG (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: non_existing_epg
ignore_errors: true
register: nm_query_non_epg
- name: Verify query_non_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_epg is not changed
- nm_query_non_epg is not changed
@@ -982,7 +982,7 @@
# QUERY NON-EXISTING ANP
- name: Query non-existing ANP (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
anp: non_existing_anp
check_mode: true
@@ -990,14 +990,14 @@
register: cm_query_non_anp
- name: Query non-existing ANP (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
anp: non_existing_anp
ignore_errors: true
register: nm_query_non_anp
- name: Verify query_non_anp
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_anp is not changed
- nm_query_non_anp is not changed
@@ -1006,7 +1006,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state for EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: ansible_test_2
state: non-existing-state
@@ -1015,7 +1015,7 @@
register: cm_non_existing_state
- name: Non-existing state for EPG (normal_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: ansible_test_2
state: non-existing-state
@@ -1023,7 +1023,7 @@
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -1032,7 +1032,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
schema: non-existing-schema
epg: ansible_test_2
@@ -1041,7 +1041,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for EPG (normal_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
schema: non-existing-schema
epg: ansible_test_2
@@ -1049,7 +1049,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -1057,7 +1057,7 @@
- cm_non_existing_schema.msg == nm_non_existing_schema.msg == "Provided schema 'non-existing-schema' does not exist."
- name: Non-existing BD schema for EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
epg: ansible_test_2
bd:
@@ -1069,7 +1069,7 @@
register: cm_non_existing_bd_schema
- name: Non-existing BD schema for EPG (normal_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
epg: ansible_test_2
bd:
@@ -1080,7 +1080,7 @@
register: nm_non_existing_bd_schema
- name: Verify non_existing_bd_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_bd_schema is not changed
- nm_non_existing_bd_schema is not changed
@@ -1088,7 +1088,7 @@
- cm_non_existing_bd_schema.msg == nm_non_existing_bd_schema.msg == "Referenced schema 'non-existing-schema' in bdref does not exist"
- name: Non-existing VRF schema for EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
epg: ansible_test_2
vrf:
@@ -1100,7 +1100,7 @@
register: cm_non_existing_vrf_schema
- name: Non-existing VRF schema for EPG (normal_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
epg: ansible_test_2
vrf:
@@ -1111,7 +1111,7 @@
register: nm_non_existing_vrf_schema
- name: Verify non_existing_vrf_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_vrf_schema is not changed
- nm_non_existing_vrf_schema is not changed
@@ -1120,7 +1120,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for EPG (check_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
template: non-existing-template
epg: ansible_test_2
@@ -1129,7 +1129,7 @@
register: cm_non_existing_template
- name: Non-existing template for EPG (normal_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
template: non-existing-template
epg: ansible_test_2
@@ -1137,7 +1137,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -1146,12 +1146,12 @@
# Checking if contract are removed after re-applying an EPG. (#13 | #62137)
- name: Reset EPG 3 in template of schema 1 to avoid cyclic circles (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_schema_1_template_2
register: nm_add_epg_3
- name: Add Contracts to EPG 2
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1169,41 +1169,41 @@
- { name: Contract2, template: Template 2, type: provider }
- name: Query EPG 2
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: ansible_test_2
register: nm_query_contract_epg
- name: Verify that 4 contracts are in EPG 2 using nm_query_contract_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_query_contract_epg.current.contractRelationships | length == 4
- name: Add EPG 2 again (normal_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
epg: ansible_test_2
register: nm_add_epg_2_again
- name: Verify that EPG 2 didn't change
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_2_again is not changed
- name: Query EPG 2
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: ansible_test_2
register: nm_query_contract_epg
- name: Verify that 4 contracts are in EPG 2 using nm_query_contract_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_query_contract_epg.current.contractRelationships | length == 4
# Checking if issue when querying EPG and VRF is not defined (#66)
- name: Add new test EPG 3 (normal mode)
- mso_schema_template_anp_epg: &epg_present_2
+ cisco.mso.mso_schema_template_anp_epg: &epg_present_2
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1214,19 +1214,19 @@
register: nm_add_epg_3
- name: Verify nm_add_epg_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_3 is changed
- nm_add_epg_3.current.name == 'ansible_test_3'
- "'vrfRef' not in nm_add_epg_3.current"
- name: Query test EPG 3
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present_2
register: nm_query_epg_3
- name: Verify nm_query_epg_3
- assert:
+ ansible.builtin.assert:
that:
- nm_query_epg_3 is not changed
- nm_query_epg_3.current.name == 'ansible_test_3'
@@ -1234,7 +1234,7 @@
# Checking if modifying an EPG with existing contracts throw an MSO error. (#82)
- name: Change EPG 2 to add VRF (normal_mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
epg: ansible_test_2
vrf:
@@ -1244,7 +1244,7 @@
register: nm_change_epg_2_vrf
- name: Verify that EPG 2 did change
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_2_vrf is changed
- nm_change_epg_2_vrf.current.vrfRef.templateName == "Template1"
@@ -1252,12 +1252,12 @@
- nm_change_epg_2_vrf.current.bdRef.bdName == "ansible_test_2"
- name: Query EPG 2
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_query
epg: ansible_test_2
register: nm_query_contract_epg_2
- name: Verify that 4 contracts are in EPG 2 using nm_query_contract_epg_2
- assert:
+ ansible.builtin.assert:
that:
- nm_query_contract_epg_2.current.contractRelationships | length == 4 \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_contract/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_contract/tasks/main.yml
index 0027cfda4..9ffe1b7fe 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_contract/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_contract/tasks/main.yml
@@ -1,17 +1,17 @@
# Test code for the MSO modules
+# Copyright: (c) 2024, Akini Ross (@akinross) <akinross@cisco.com>
# Copyright: (c) 2020, Lionel Hercot (@lhercot) <lhercot@cisco.com>
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com> (based on mso_site test case)
-#
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,7 +23,7 @@
# CLEAN ENVIRONMENT
# - name: Ensure site exist
-# mso_site: &site_present
+# cisco.mso.mso_site: &site_present
# host: '{{ mso_hostname }}'
# username: '{{ mso_username }}'
# password: '{{ mso_password }}'
@@ -40,7 +40,7 @@
# state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -49,7 +49,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
users:
@@ -59,7 +59,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -67,7 +67,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -75,7 +75,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -83,7 +83,7 @@
state: present
- name: Ensure ANP exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -94,7 +94,7 @@
- { schema: '{{ mso_schema | default("ansible_test") }}_2', template: 'Template 3' }
- name: Ensure Filter 1 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -103,7 +103,7 @@
state: present
- name: Ensure Contract1 exist
- mso_schema_template_contract_filter: &contract_present
+ cisco.mso.mso_schema_template_contract_filter: &contract_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -114,7 +114,7 @@
state: present
- name: Ensure Filter 2 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -123,7 +123,7 @@
state: present
- name: Ensure Contract2 exist
- mso_schema_template_contract_filter: &contract2_present
+ cisco.mso.mso_schema_template_contract_filter: &contract2_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -134,7 +134,7 @@
state: present
- name: Ensure EPGs exist
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -147,7 +147,7 @@
# ADD Contract to EPG
- name: Add Contract1 to EPG (check_mode)
- mso_schema_template_anp_epg_contract: &contract_epg_present
+ cisco.mso.mso_schema_template_anp_epg_contract: &contract_epg_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -161,7 +161,7 @@
register: cm_add_contract_rel
- name: Verify cm_add_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract_rel is changed
- cm_add_contract_rel.previous == {}
@@ -170,12 +170,12 @@
- cm_add_contract_rel.current.relationshipType == "consumer"
- name: Add Contract to EPG (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
register: nm_add_contract_rel
- name: Verify nm_add_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_rel is changed
- nm_add_contract_rel.previous == {}
@@ -185,13 +185,13 @@
- cm_add_contract_rel.current.contractRef.schemaId == nm_add_contract_rel.current.contractRef.schemaId
- name: Add Contract to EPG again (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
check_mode: true
register: cm_add_contract_rel_again
- name: Verify cm_add_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract_rel_again is not changed
- cm_add_contract_rel_again.previous.contractRef.templateName == "Template1"
@@ -204,12 +204,12 @@
- name: Add Contract to EPG again (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
register: nm_add_contract_rel_again
- name: Verify nm_add_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_rel_again is not changed
- nm_add_contract_rel_again.previous.contractRef.templateName == "Template1"
@@ -221,7 +221,7 @@
- nm_add_contract_rel_again.previous.contractRef.schemaId == nm_add_contract_rel_again.current.contractRef.schemaId
- name: Add Contract1 to EPG - provider (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
contract:
name: Contract1
@@ -229,7 +229,7 @@
register: nm_add_contract1_rel_provider
- name: Add Contract2 to EPG - consumer (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
contract:
name: Contract2
@@ -238,7 +238,7 @@
register: nm_add_contract2_rel_consumer
- name: Add Contract1 to EPG 3 - provider (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -252,7 +252,7 @@
register: nm_add_contract3_rel_provider
- name: Verify nm_add_contract1_rel_provider, nm_add_contract2_rel_consumer and nm_add_contract3_rel_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_rel_provider is changed
- nm_add_contract2_rel_consumer is changed
@@ -267,7 +267,7 @@
# # QUERY ALL Contract to EPG
- name: Query all contract relationship for EPG (check_mode)
- mso_schema_template_anp_epg_contract: &contract_epg_query
+ cisco.mso.mso_schema_template_anp_epg_contract: &contract_epg_query
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -278,12 +278,12 @@
register: cm_query_all_contract_rels
- name: Query all contract relationship for EPG (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
register: nm_query_all_contract_rels
- name: Verify query_all_contract_rels
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_contract_rels is not changed
- nm_query_all_contract_rels is not changed
@@ -292,7 +292,7 @@
# QUERY A Contract to EPG
- name: Query Contract1 relationship for EPG - consumer (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract1
@@ -301,7 +301,7 @@
register: cm_query_contract1_consumer_rel
- name: Query Contract1 relationship for EPG - consumer (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract1
@@ -309,7 +309,7 @@
register: nm_query_contract1_consumer_rel
- name: Query Contract1 relationship for EPG - provider (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract1
@@ -317,7 +317,7 @@
register: nm_query_contract1_provider_rel
- name: Query Contract1 relationship for EPG - consumer (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract2
@@ -326,7 +326,7 @@
register: nm_query_contract2_consumer_rel
- name: Query Contract1 relationship for EPG - provider (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -340,7 +340,7 @@
register: nm_query_contract3_provider_rel
- name: Verify query_contractX_YYYYY_rel
- assert:
+ ansible.builtin.assert:
that:
- cm_query_contract1_consumer_rel is not changed
- nm_query_contract1_consumer_rel is not changed
@@ -359,51 +359,51 @@
# REMOVE Contract to EPG
- name: Remove Contract to EPG (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
state: absent
check_mode: true
register: cm_remove_contract_rel
- name: Verify cm_remove_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_contract_rel is changed
- cm_remove_contract_rel.current == {}
- name: Remove Contract to EPG (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
state: absent
register: nm_remove_contract_rel
- name: Verify nm_remove_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract_rel is changed
- nm_remove_contract_rel.current == {}
- name: Remove Contract to EPG again (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
state: absent
check_mode: true
register: cm_remove_contract_rel_again
- name: Verify cm_remove_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_contract_rel_again is not changed
- cm_remove_contract_rel_again.current == {}
- name: Remove Contract to EPG again (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_present
state: absent
register: nm_remove_contract_rel_again
- name: Verify nm_remove_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract_rel_again is not changed
- nm_remove_contract_rel_again.current == {}
@@ -411,7 +411,7 @@
# QUERY NON-EXISTING Contract to EPG
- name: Query non-existing contract (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: non_existing_contract
@@ -421,7 +421,7 @@
register: cm_query_non_contract
- name: Query non-existing contract (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: non_existing_contract
@@ -430,17 +430,17 @@
register: nm_query_non_contract
- name: Verify query_non_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_contract is not changed
- nm_query_non_contract is not changed
- cm_query_non_contract == nm_query_non_contract
- - cm_query_non_contract.msg is match("Contract '/schemas/[0-9a-zA-Z]*/templates/Template1/contracts/non_existing_contract' not found")
- - nm_query_non_contract.msg is match("Contract '/schemas/[0-9a-zA-Z]*/templates/Template1/contracts/non_existing_contract' not found")
+ - cm_query_non_contract.msg is match("Contract with Reference '/schemas/[0-9a-zA-Z]*/templates/Template1/contracts/non_existing_contract' and type 'provider' not found")
+ - nm_query_non_contract.msg is match("Contract with Reference '/schemas/[0-9a-zA-Z]*/templates/Template1/contracts/non_existing_contract' and type 'provider' not found")
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
epg: non_existing_epg
check_mode: true
@@ -448,23 +448,23 @@
register: cm_query_non_epg
- name: Query non-existing EPG (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
epg: non_existing_epg
ignore_errors: true
register: nm_query_non_epg
- name: Verify query_non_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_epg is not changed
- nm_query_non_epg is not changed
- cm_query_non_epg == nm_query_non_epg
- - cm_query_non_epg.msg == nm_query_non_epg.msg == "Provided epg 'non_existing_epg' does not exist. Existing epgs{{':'}} ansible_test_1"
+ - cm_query_non_epg.msg == nm_query_non_epg.msg == "Provided EPG 'non_existing_epg' not matching existing epg(s){{":"}} ansible_test_1"
# QUERY NON-EXISTING ANP
- name: Query non-existing ANP (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
anp: non_existing_anp
check_mode: true
@@ -472,23 +472,23 @@
register: cm_query_non_anp
- name: Query non-existing ANP (normal mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
anp: non_existing_anp
ignore_errors: true
register: nm_query_non_anp
- name: Verify query_non_anp
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_anp is not changed
- nm_query_non_anp is not changed
- cm_query_non_anp == nm_query_non_anp
- - cm_query_non_anp.msg == nm_query_non_anp.msg == "Provided anp 'non_existing_anp' does not exist. Existing anps{{':'}} ANP"
+ - cm_query_non_anp.msg == nm_query_non_anp.msg == "Provided ANP 'non_existing_anp' not matching existing anp(s){{":"}} ANP"
# USE A NON-EXISTING STATE
- name: Non-existing state for contract relationship (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
state: non-existing-state
check_mode: true
@@ -496,14 +496,14 @@
register: cm_non_existing_state
- name: Non-existing state for contract relationship (normal_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -512,7 +512,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for contract relationship (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
schema: non-existing-schema
check_mode: true
@@ -520,14 +520,14 @@
register: cm_non_existing_schema
- name: Non-existing schema for contract relationship (normal_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
schema: non-existing-schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -535,7 +535,7 @@
- cm_non_existing_schema.msg == nm_non_existing_schema.msg == "Provided schema 'non-existing-schema' does not exist."
- name: Non-existing contract schema for contract relationship (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract1
@@ -547,7 +547,7 @@
register: cm_non_existing_contract_schema
- name: Non-existing contract schema for contract relationship (normal_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract1
@@ -558,7 +558,7 @@
register: nm_non_existing_contract_schema
- name: Verify non_existing_contract_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_contract_schema is not changed
- nm_non_existing_contract_schema is not changed
@@ -567,7 +567,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for contract relationship (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
template: non-existing-template
check_mode: true
@@ -575,22 +575,22 @@
register: cm_non_existing_template
- name: Non-existing template for contract relationship (normal_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
template: non-existing-template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
- cm_non_existing_template == nm_non_existing_template
- - cm_non_existing_template.msg == nm_non_existing_template.msg == "Provided template 'non-existing-template' does not exist. Existing templates{{':'}} Template1, Template2"
+ - cm_non_existing_template.msg == nm_non_existing_template.msg == "Provided template 'non-existing-template' not matching existing template(s){{":"}} Template1, Template2"
- name: Non-existing contract template for contract relationship (check_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract1
@@ -601,7 +601,7 @@
register: cm_non_existing_contract_template
- name: Non-existing contract template for contract relationship (normal_mode)
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *contract_epg_query
contract:
name: Contract1
@@ -611,10 +611,502 @@
register: nm_non_existing_contract_template
- name: Verify non_existing_contract_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_contract_template is not changed
- nm_non_existing_contract_template is not changed
- cm_non_existing_contract_template == nm_non_existing_contract_template
- - cm_non_existing_contract_template.msg is match("Contract '/schemas/[0-9a-zA-Z]*/templates/non-existing-template/contracts/Contract1' not found")
- - nm_non_existing_contract_template.msg is match("Contract '/schemas/[0-9a-zA-Z]*/templates/non-existing-template/contracts/Contract1' not found") \ No newline at end of file
+ - cm_non_existing_contract_template.msg is match("Contract with Reference '/schemas/[0-9a-zA-Z]*/templates/non-existing-template/contracts/Contract1' and type 'provider' not found")
+ - nm_non_existing_contract_template.msg is match("Contract with Reference '/schemas/[0-9a-zA-Z]*/templates/non-existing-template/contracts/Contract1' and type 'provider' not found")
+
+# TESTS IN BULK
+
+# SETUP TEST ENVIRONMENT FOR BULK
+
+- name: Create template_bulk in schema ansible_test
+ cisco.mso.mso_schema_template: &bulk_template_present
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: template_bulk
+ tenant: ansible_test
+
+- name: Create filter_bulk in template_bulk
+ cisco.mso.mso_schema_template_filter_entry:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: template_bulk
+ filter: filter_bulk
+ entry: filter_entry_bulk
+
+- name: Create 20 contract_bulk_x in template_bulk
+ cisco.mso.mso_schema_template_contract_filter:
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: template_bulk
+ contract: "contract_bulk_{{ item }}"
+ filter: filter_bulk
+ loop: "{{ range(1, 21, 1) | list }}"
+
+- name: Create ANP in template_bulk
+ cisco.mso.mso_schema_template_anp: &anp_bulk
+ <<: *mso_info
+ schema: '{{ mso_schema | default("ansible_test") }}'
+ template: template_bulk
+ anp: anp_bulk
+
+- name: Create EPG in template_bulk
+ cisco.mso.mso_schema_template_anp_epg: &epg_bulk
+ <<: *anp_bulk
+ epg: epg_bulk
+
+- name: Set facts for provider contracts
+ ansible.builtin.set_fact:
+ provider_contracts_present: []
+ provider_contracts_absent: []
+ consumer_contracts_present: []
+ consumer_contracts_absent: []
+
+- name: Create contracts list for appending
+ ansible.builtin.set_fact:
+ provider_contracts_present: "{{ provider_contracts_present + [{'name': 'contract_bulk_%s' | format(item), 'type': 'provider'}] }}"
+ consumer_contracts_present: "{{ consumer_contracts_present + [{'name': 'contract_bulk_%s' | format(item), 'type': 'consumer'}] }}"
+ loop: "{{ range(1, 21, 1) | list }}"
+
+- name: Create contracts list for removing
+ ansible.builtin.set_fact:
+ provider_contracts_absent: "{{ provider_contracts_absent + [{'name': 'contract_bulk_%s' | format(item), 'type': 'provider'}] }}"
+ consumer_contracts_absent: "{{ consumer_contracts_absent + [{'name': 'contract_bulk_%s' | format(item), 'type': 'consumer'}] }}"
+ loop: "{{ range(1, 21, 2) | list }}"
+
+# CREATE AND UPDATE TESTS FOR BULK
+
+- name: Append provider contracts (check_mode)
+ cisco.mso.mso_schema_template_anp_epg_contract: &provider_contracts_append
+ <<: *epg_bulk
+ contracts: "{{ provider_contracts_present }}"
+ register: cm_append_provider_contracts
+ check_mode: true
+
+- name: Append provider contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ register: nm_append_provider_contracts
+
+- name: Append provider contracts again
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ register: nm_append_provider_contracts_again
+
+- name: Append consumer contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ contracts: "{{ consumer_contracts_present }}"
+ register: nm_append_consumer_contracts
+
+- name: Verify appending contracts
+ ansible.builtin.assert:
+ that:
+ - cm_append_provider_contracts is changed
+ - cm_append_provider_contracts.previous == []
+ - cm_append_provider_contracts.current | length == 20
+ - cm_append_provider_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - cm_append_provider_contracts.current.0.relationshipType == "provider"
+ - cm_append_provider_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - cm_append_provider_contracts.current.9.relationshipType == "provider"
+ - cm_append_provider_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - cm_append_provider_contracts.current.19.relationshipType == "provider"
+ - nm_append_provider_contracts is changed
+ - nm_append_provider_contracts.previous == []
+ - nm_append_provider_contracts.current | length == 20
+ - nm_append_provider_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - nm_append_provider_contracts.current.0.relationshipType == "provider"
+ - nm_append_provider_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - nm_append_provider_contracts.current.9.relationshipType == "provider"
+ - nm_append_provider_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_append_provider_contracts.current.19.relationshipType == "provider"
+ - nm_append_provider_contracts_again is not changed
+ - nm_append_provider_contracts_again.previous.0.contractRef.contractName == "contract_bulk_1"
+ - nm_append_provider_contracts_again.previous.0.relationshipType == "provider"
+ - nm_append_provider_contracts_again.previous.9.contractRef.contractName == "contract_bulk_10"
+ - nm_append_provider_contracts_again.previous.9.relationshipType == "provider"
+ - nm_append_provider_contracts_again.previous.19.contractRef.contractName == "contract_bulk_20"
+ - nm_append_provider_contracts_again.previous.19.relationshipType == "provider"
+ - nm_append_provider_contracts_again.current | length == 20
+ - nm_append_provider_contracts_again.current.0.contractRef.contractName == "contract_bulk_1"
+ - nm_append_provider_contracts_again.current.0.relationshipType == "provider"
+ - nm_append_provider_contracts_again.current.9.contractRef.contractName == "contract_bulk_10"
+ - nm_append_provider_contracts_again.current.9.relationshipType == "provider"
+ - nm_append_provider_contracts_again.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_append_provider_contracts_again.current.19.relationshipType == "provider"
+ - nm_append_consumer_contracts is changed
+ - nm_append_consumer_contracts.previous.0.contractRef.contractName == "contract_bulk_1"
+ - nm_append_consumer_contracts.previous.0.relationshipType == "provider"
+ - nm_append_consumer_contracts.previous.9.contractRef.contractName == "contract_bulk_10"
+ - nm_append_consumer_contracts.previous.9.relationshipType == "provider"
+ - nm_append_consumer_contracts.previous.19.contractRef.contractName == "contract_bulk_20"
+ - nm_append_consumer_contracts.previous.19.relationshipType == "provider"
+ - nm_append_consumer_contracts.current | length == 40
+ - nm_append_consumer_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - nm_append_consumer_contracts.current.0.relationshipType == "provider"
+ - nm_append_consumer_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - nm_append_consumer_contracts.current.9.relationshipType == "provider"
+ - nm_append_consumer_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_append_consumer_contracts.current.19.relationshipType == "provider"
+ - nm_append_consumer_contracts.current.20.contractRef.contractName == "contract_bulk_1"
+ - nm_append_consumer_contracts.current.20.relationshipType == "consumer"
+ - nm_append_consumer_contracts.current.29.contractRef.contractName == "contract_bulk_10"
+ - nm_append_consumer_contracts.current.29.relationshipType == "consumer"
+ - nm_append_consumer_contracts.current.39.contractRef.contractName == "contract_bulk_20"
+ - nm_append_consumer_contracts.current.39.relationshipType == "consumer"
+
+# REMOVE TESTS FOR BULK
+
+- name: Remove provider contracts (check_mode)
+ cisco.mso.mso_schema_template_anp_epg_contract: &provider_contracts_remove
+ <<: *epg_bulk
+ contracts: "{{ provider_contracts_absent }}"
+ state: absent
+ register: cm_remove_provider_contracts
+ check_mode: true
+
+- name: Remove provider contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_remove
+ register: nm_remove_provider_contracts
+
+- name: Remove provider contracts again
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_remove
+ register: nm_remove_provider_contracts_again
+
+- name: Remove consumer contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_remove
+ contracts: "{{ consumer_contracts_absent }}"
+ register: nm_remove_consumer_contracts
+
+- name: Verify removing contracts
+ ansible.builtin.assert:
+ that:
+ - cm_remove_provider_contracts is changed
+ - cm_remove_provider_contracts.previous | length == 40
+ - cm_remove_provider_contracts.previous.0.contractRef.contractName == "contract_bulk_1"
+ - cm_remove_provider_contracts.previous.0.relationshipType == "provider"
+ - cm_remove_provider_contracts.previous.9.contractRef.contractName == "contract_bulk_10"
+ - cm_remove_provider_contracts.previous.9.relationshipType == "provider"
+ - cm_remove_provider_contracts.previous.19.contractRef.contractName == "contract_bulk_20"
+ - cm_remove_provider_contracts.previous.19.relationshipType == "provider"
+ - cm_remove_provider_contracts.previous.20.contractRef.contractName == "contract_bulk_1"
+ - cm_remove_provider_contracts.previous.20.relationshipType == "consumer"
+ - cm_remove_provider_contracts.previous.29.contractRef.contractName == "contract_bulk_10"
+ - cm_remove_provider_contracts.previous.29.relationshipType == "consumer"
+ - cm_remove_provider_contracts.previous.39.contractRef.contractName == "contract_bulk_20"
+ - cm_remove_provider_contracts.previous.39.relationshipType == "consumer"
+ - cm_remove_provider_contracts.current | length == 30
+ - cm_remove_provider_contracts.current.0.contractRef.contractName == "contract_bulk_2"
+ - cm_remove_provider_contracts.current.0.relationshipType == "provider"
+ - cm_remove_provider_contracts.current.4.contractRef.contractName == "contract_bulk_10"
+ - cm_remove_provider_contracts.current.4.relationshipType == "provider"
+ - cm_remove_provider_contracts.current.9.contractRef.contractName == "contract_bulk_20"
+ - cm_remove_provider_contracts.current.9.relationshipType == "provider"
+ - cm_remove_provider_contracts.current.10.contractRef.contractName == "contract_bulk_1"
+ - cm_remove_provider_contracts.current.10.relationshipType == "consumer"
+ - cm_remove_provider_contracts.current.19.contractRef.contractName == "contract_bulk_10"
+ - cm_remove_provider_contracts.current.19.relationshipType == "consumer"
+ - cm_remove_provider_contracts.current.29.contractRef.contractName == "contract_bulk_20"
+ - cm_remove_provider_contracts.current.29.relationshipType == "consumer"
+ - nm_remove_provider_contracts is changed
+ - nm_remove_provider_contracts.previous | length == 40
+ - nm_remove_provider_contracts.previous.0.contractRef.contractName == "contract_bulk_1"
+ - nm_remove_provider_contracts.previous.0.relationshipType == "provider"
+ - nm_remove_provider_contracts.previous.9.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts.previous.9.relationshipType == "provider"
+ - nm_remove_provider_contracts.previous.19.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts.previous.19.relationshipType == "provider"
+ - nm_remove_provider_contracts.previous.20.contractRef.contractName == "contract_bulk_1"
+ - nm_remove_provider_contracts.previous.20.relationshipType == "consumer"
+ - nm_remove_provider_contracts.previous.29.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts.previous.29.relationshipType == "consumer"
+ - nm_remove_provider_contracts.previous.39.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts.previous.39.relationshipType == "consumer"
+ - nm_remove_provider_contracts.current | length == 30
+ - nm_remove_provider_contracts.current.0.contractRef.contractName == "contract_bulk_2"
+ - nm_remove_provider_contracts.current.0.relationshipType == "provider"
+ - nm_remove_provider_contracts.current.4.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts.current.4.relationshipType == "provider"
+ - nm_remove_provider_contracts.current.9.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts.current.9.relationshipType == "provider"
+ - nm_remove_provider_contracts.current.10.contractRef.contractName == "contract_bulk_1"
+ - nm_remove_provider_contracts.current.10.relationshipType == "consumer"
+ - nm_remove_provider_contracts.current.19.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts.current.19.relationshipType == "consumer"
+ - nm_remove_provider_contracts.current.29.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts.current.29.relationshipType == "consumer"
+ - nm_remove_provider_contracts_again is not changed
+ - nm_remove_provider_contracts_again.previous | length == 30
+ - nm_remove_provider_contracts_again.previous.0.contractRef.contractName == "contract_bulk_2"
+ - nm_remove_provider_contracts_again.previous.0.relationshipType == "provider"
+ - nm_remove_provider_contracts_again.previous.4.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts_again.previous.4.relationshipType == "provider"
+ - nm_remove_provider_contracts_again.previous.9.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts_again.previous.9.relationshipType == "provider"
+ - nm_remove_provider_contracts_again.previous.10.contractRef.contractName == "contract_bulk_1"
+ - nm_remove_provider_contracts_again.previous.10.relationshipType == "consumer"
+ - nm_remove_provider_contracts_again.previous.19.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts_again.previous.19.relationshipType == "consumer"
+ - nm_remove_provider_contracts_again.previous.29.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts_again.previous.29.relationshipType == "consumer"
+ - nm_remove_provider_contracts_again.current | length == 30
+ - nm_remove_provider_contracts_again.current.0.contractRef.contractName == "contract_bulk_2"
+ - nm_remove_provider_contracts_again.current.0.relationshipType == "provider"
+ - nm_remove_provider_contracts_again.current.4.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts_again.current.4.relationshipType == "provider"
+ - nm_remove_provider_contracts_again.current.9.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts_again.current.9.relationshipType == "provider"
+ - nm_remove_provider_contracts_again.current.10.contractRef.contractName == "contract_bulk_1"
+ - nm_remove_provider_contracts_again.current.10.relationshipType == "consumer"
+ - nm_remove_provider_contracts_again.current.19.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_provider_contracts_again.current.19.relationshipType == "consumer"
+ - nm_remove_provider_contracts_again.current.29.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_provider_contracts_again.current.29.relationshipType == "consumer"
+ - nm_remove_consumer_contracts is changed
+ - nm_remove_consumer_contracts.previous | length == 30
+ - nm_remove_consumer_contracts.previous.0.contractRef.contractName == "contract_bulk_2"
+ - nm_remove_consumer_contracts.previous.0.relationshipType == "provider"
+ - nm_remove_consumer_contracts.previous.4.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_consumer_contracts.previous.4.relationshipType == "provider"
+ - nm_remove_consumer_contracts.previous.9.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_consumer_contracts.previous.9.relationshipType == "provider"
+ - nm_remove_consumer_contracts.previous.10.contractRef.contractName == "contract_bulk_1"
+ - nm_remove_consumer_contracts.previous.10.relationshipType == "consumer"
+ - nm_remove_consumer_contracts.previous.19.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_consumer_contracts.previous.19.relationshipType == "consumer"
+ - nm_remove_consumer_contracts.previous.29.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_consumer_contracts.previous.29.relationshipType == "consumer"
+ - nm_remove_consumer_contracts.current | length == 20
+ - nm_remove_consumer_contracts.current.0.contractRef.contractName == "contract_bulk_2"
+ - nm_remove_consumer_contracts.current.0.relationshipType == "provider"
+ - nm_remove_consumer_contracts.current.4.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_consumer_contracts.current.4.relationshipType == "provider"
+ - nm_remove_consumer_contracts.current.9.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_consumer_contracts.current.9.relationshipType == "provider"
+ - nm_remove_consumer_contracts.current.10.contractRef.contractName == "contract_bulk_2"
+ - nm_remove_consumer_contracts.current.10.relationshipType == "consumer"
+ - nm_remove_consumer_contracts.current.14.contractRef.contractName == "contract_bulk_10"
+ - nm_remove_consumer_contracts.current.14.relationshipType == "consumer"
+ - nm_remove_consumer_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_remove_consumer_contracts.current.19.relationshipType == "consumer"
+
+# FORCE REPLACE TESTS
+
+- name: Force replace contracts with contracts (check_mode)
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ force_replace: true
+ register: cm_force_replace_provider_contracts
+ check_mode: true
+
+- name: Force replace contracts with contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ force_replace: true
+ register: nm_force_replace_provider_contracts
+
+- name: Force replace contracts with contracts again
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ force_replace: true
+ register: nm_force_replace_provider_contracts_again
+
+- name: Force replace contracts with new contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ contracts: "{{ consumer_contracts_present }}"
+ force_replace: true
+ register: nm_force_replace_consumer_contracts
+
+- name: Verify force replacing contracts
+ ansible.builtin.assert:
+ that:
+ - cm_force_replace_provider_contracts is changed
+ - cm_force_replace_provider_contracts.previous | length == 20
+ - cm_force_replace_provider_contracts.previous.0.contractRef.contractName == "contract_bulk_2"
+ - cm_force_replace_provider_contracts.previous.0.relationshipType == "provider"
+ - cm_force_replace_provider_contracts.previous.4.contractRef.contractName == "contract_bulk_10"
+ - cm_force_replace_provider_contracts.previous.4.relationshipType == "provider"
+ - cm_force_replace_provider_contracts.previous.9.contractRef.contractName == "contract_bulk_20"
+ - cm_force_replace_provider_contracts.previous.9.relationshipType == "provider"
+ - cm_force_replace_provider_contracts.previous.10.contractRef.contractName == "contract_bulk_2"
+ - cm_force_replace_provider_contracts.previous.10.relationshipType == "consumer"
+ - cm_force_replace_provider_contracts.previous.14.contractRef.contractName == "contract_bulk_10"
+ - cm_force_replace_provider_contracts.previous.14.relationshipType == "consumer"
+ - cm_force_replace_provider_contracts.previous.19.contractRef.contractName == "contract_bulk_20"
+ - cm_force_replace_provider_contracts.previous.19.relationshipType == "consumer"
+ - cm_force_replace_provider_contracts.current | length == 20
+ - cm_force_replace_provider_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - cm_force_replace_provider_contracts.current.0.relationshipType == "provider"
+ - cm_force_replace_provider_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - cm_force_replace_provider_contracts.current.9.relationshipType == "provider"
+ - cm_force_replace_provider_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - cm_force_replace_provider_contracts.current.19.relationshipType == "provider"
+ - nm_force_replace_provider_contracts is changed
+ - nm_force_replace_provider_contracts.previous | length == 20
+ - nm_force_replace_provider_contracts.previous.0.contractRef.contractName == "contract_bulk_2"
+ - nm_force_replace_provider_contracts.previous.0.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.previous.4.contractRef.contractName == "contract_bulk_10"
+ - nm_force_replace_provider_contracts.previous.4.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.previous.9.contractRef.contractName == "contract_bulk_20"
+ - nm_force_replace_provider_contracts.previous.9.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.previous.10.contractRef.contractName == "contract_bulk_2"
+ - nm_force_replace_provider_contracts.previous.10.relationshipType == "consumer"
+ - nm_force_replace_provider_contracts.previous.14.contractRef.contractName == "contract_bulk_10"
+ - nm_force_replace_provider_contracts.previous.14.relationshipType == "consumer"
+ - nm_force_replace_provider_contracts.previous.19.contractRef.contractName == "contract_bulk_20"
+ - nm_force_replace_provider_contracts.previous.19.relationshipType == "consumer"
+ - nm_force_replace_provider_contracts.current | length == 20
+ - nm_force_replace_provider_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - nm_force_replace_provider_contracts.current.0.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - nm_force_replace_provider_contracts.current.9.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_force_replace_provider_contracts.current.19.relationshipType == "provider"
+ - nm_force_replace_provider_contracts_again is not changed
+ - nm_force_replace_provider_contracts_again.previous | length == 20
+ - nm_force_replace_provider_contracts_again.previous.0.contractRef.contractName == "contract_bulk_1"
+ - nm_force_replace_provider_contracts_again.previous.0.relationshipType == "provider"
+ - nm_force_replace_provider_contracts_again.previous.9.contractRef.contractName == "contract_bulk_10"
+ - nm_force_replace_provider_contracts_again.previous.9.relationshipType == "provider"
+ - nm_force_replace_provider_contracts_again.previous.19.contractRef.contractName == "contract_bulk_20"
+ - nm_force_replace_provider_contracts_again.previous.19.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.current | length == 20
+ - nm_force_replace_provider_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - nm_force_replace_provider_contracts.current.0.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - nm_force_replace_provider_contracts.current.9.relationshipType == "provider"
+ - nm_force_replace_provider_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_force_replace_provider_contracts.current.19.relationshipType == "provider"
+ - nm_force_replace_consumer_contracts.current | length == 20
+ - nm_force_replace_consumer_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - nm_force_replace_consumer_contracts.current.0.relationshipType == "consumer"
+ - nm_force_replace_consumer_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - nm_force_replace_consumer_contracts.current.9.relationshipType == "consumer"
+ - nm_force_replace_consumer_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_force_replace_consumer_contracts.current.19.relationshipType == "consumer"
+
+# QUERY TESTS FOR BULK
+
+- name: Query contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ contracts: "{{ consumer_contracts_present }}"
+ state: query
+ register: nm_query_contracts
+
+- name: Query contracts with non existing contracts (error)
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ contracts:
+ - name: non_contract_3
+ type: provider
+ - name: non_contract_3
+ type: consumer
+ state: query
+ register: err_query_contracts
+ ignore_errors: true
+
+- name: Verify queries for bulk
+ ansible.builtin.assert:
+ that:
+ - nm_query_contracts is not changed
+ - nm_query_contracts.current | length == 20
+ - nm_query_contracts.current.0.contractRef.contractName == "contract_bulk_1"
+ - nm_query_contracts.current.0.relationshipType == "consumer"
+ - nm_query_contracts.current.9.contractRef.contractName == "contract_bulk_10"
+ - nm_query_contracts.current.9.relationshipType == "consumer"
+ - nm_query_contracts.current.19.contractRef.contractName == "contract_bulk_20"
+ - nm_query_contracts.current.19.relationshipType == "consumer"
+ - err_query_contracts is failed
+ - err_query_contracts.msg.0 is match("Contract with Reference '/schemas/[0-9a-zA-Z]*/templates/template_bulk/contracts/non_contract_3' and type 'provider' not found")
+ - err_query_contracts.msg.1 is match("Contract with Reference '/schemas/[0-9a-zA-Z]*/templates/template_bulk/contracts/non_contract_3' and type 'consumer' not found")
+
+# ERROR TESTS FOR BULK
+
+- name: Mutually exclusive contract and contracts (error)
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ contract:
+ - name: contract_bulk_1
+ type: provider
+ register: err_mutually_exclusive_contract_and_contracts
+ ignore_errors: true
+
+- name: Mutually exclusive contract and force_replace (error)
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *epg_bulk
+ contract:
+ - name: contract_bulk_1
+ type: provider
+ force_replace: true
+ register: err_mutually_exclusive_contract_and_force_replace
+ ignore_errors: true
+
+- name: Missing required attributes for present (error)
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *epg_bulk
+ register: err_missing_required_attributes_present
+ ignore_errors: true
+
+- name: Missing required attributes for absent (error)
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *epg_bulk
+ state: absent
+ register: err_missing_required_attributes_absent
+ ignore_errors: true
+
+- name: Verify queries for bulk
+ ansible.builtin.assert:
+ that:
+ - err_mutually_exclusive_contract_and_contracts is failed
+ - err_mutually_exclusive_contract_and_contracts.msg == "parameters are mutually exclusive{{":"}} contract|contracts"
+ - err_mutually_exclusive_contract_and_force_replace is failed
+ - err_mutually_exclusive_contract_and_force_replace.msg == "parameters are mutually exclusive{{":"}} contract|force_replace"
+ - err_missing_required_attributes_present is failed
+ - err_missing_required_attributes_present.msg == "state is present but any of the following are missing{{":"}} contract, contracts"
+ - err_missing_required_attributes_absent is failed
+ - err_missing_required_attributes_absent.msg == "state is absent but any of the following are missing{{":"}} contract, contracts, force_replace"
+
+# FORCE REMOVE ALL CONTRACTS
+
+- name: Force remove all contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *epg_bulk
+ force_replace: true
+ state: absent
+ register: force_remove_all_contracts
+
+- name: Force replace all contracts without existing contracts
+ cisco.mso.mso_schema_template_anp_epg_contract:
+ <<: *provider_contracts_append
+ force_replace: true
+ register: force_replace_all_contracts_without_existing_contracts
+
+- name: Verify froce removing all contracts
+ ansible.builtin.assert:
+ that:
+ - force_remove_all_contracts is changed
+ - force_remove_all_contracts.previous | length == 20
+ - force_remove_all_contracts.current == []
+ - force_replace_all_contracts_without_existing_contracts is changed
+ - force_replace_all_contracts_without_existing_contracts.previous == []
+ - force_replace_all_contracts_without_existing_contracts.current | length == 20
+
+# CLEAN UP TEST ENVIRONMENT
+
+- name: Remove schemas
+ cisco.mso.mso_schema:
+ <<: *mso_info
+ schema: '{{ item }}'
+ state: absent
+ loop:
+ - '{{ mso_schema | default("ansible_test") }}_2'
+ - '{{ mso_schema | default("ansible_test") }}'
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_selector/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_selector/tasks/main.yml
index 013b96b71..0b3264d09 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_selector/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_selector/tasks/main.yml
@@ -6,14 +6,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -24,13 +24,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
# - name: Ensure site exist
-# mso_site: &site_present
+# cisco.mso.mso_site: &site_present
# host: '{{ mso_hostname }}'
# username: '{{ mso_username }}'
# password: '{{ mso_password }}'
@@ -47,7 +47,7 @@
# state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -56,7 +56,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -66,7 +66,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -74,7 +74,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -82,7 +82,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -90,7 +90,7 @@
state: present
- name: Ensure ANP exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -102,7 +102,7 @@
# ADD EPGs
- name: Ensure EPGs exist
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ item.schema }}'
template: '{{ item.template }}'
@@ -115,7 +115,7 @@
# ADD Selector to EPG
- name: Add Selector to EPG (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -127,7 +127,7 @@
register: cm_add_selector_1
- name: Verify cm_add_selector_1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_selector_1 is changed
- cm_add_selector_1.previous == {}
@@ -135,7 +135,7 @@
- cm_add_selector_1.current.expressions == []
- name: Add Selector 1 to EPG with space in selector name (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -147,13 +147,13 @@
register: nm_add_selector1_with_space_in_name
- name: Verify nm_add_selector1_with_space_in_name
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector1_with_space_in_name is not changed
- nm_add_selector1_with_space_in_name.msg == "There should not be any space in selector name."
- name: Add Selector to EPG (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -164,7 +164,7 @@
register: nm_add_selector_1
- name: Verify nm_add_selector_1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_1 is changed
- nm_add_selector_1.previous == {}
@@ -172,7 +172,7 @@
- nm_add_selector_1.current.expressions == []
- name: Add Selector to EPG again (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -184,7 +184,7 @@
register: cm_add_selector_1_again
- name: Verify cm_add_selector_1_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_selector_1_again is not changed
- cm_add_selector_1_again.previous.name == "selector_1"
@@ -193,7 +193,7 @@
- cm_add_selector_1_again.current.expressions == []
- name: Add Selector to EPG again (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -204,7 +204,7 @@
register: nm_add_selector_1_again
- name: Verify nm_add_selector_1_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_1_again is not changed
- nm_add_selector_1_again.previous.name == "selector_1"
@@ -213,7 +213,7 @@
- nm_add_selector_1_again.current.expressions == []
- name: Add Selector 2 to EPG (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -229,7 +229,7 @@
register: cm_add_selector_2
- name: Verify cm_add_selector_2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_selector_2 is changed
- cm_add_selector_2.previous == {}
@@ -239,7 +239,7 @@
- cm_add_selector_2.current.expressions[0].value == "test"
- name: Add Selector 2 to EPG (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -254,7 +254,7 @@
register: nm_add_selector_2
- name: Verify nm_add_selector_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_2 is changed
- nm_add_selector_2.previous == {}
@@ -264,7 +264,7 @@
- nm_add_selector_2.current.expressions[0].value == "test"
- name: Add Selector 2 to EPG with space in expression type (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -280,13 +280,13 @@
register: nm_add_selector2_with_space_in_expression_type
- name: Verify nm_add_selector2_with_space_in_expression_type
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector2_with_space_in_expression_type is not changed
- nm_add_selector2_with_space_in_expression_type.msg == "There should not be any space in 'type' attribute of expression 'expression 1'"
- name: Change Selector 2 - keyExist(normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -302,13 +302,13 @@
register: nm_change_selector_2_key_exist
- name: Verify nm_change_selector_2_key_exist
- assert:
+ ansible.builtin.assert:
that:
- nm_change_selector_2_key_exist is not changed
- nm_change_selector_2_key_exist.msg == "Attribute 'value' is not supported for operator 'has_key' in expression 'expression_5'"
- name: Change Selector 2 - keyNotExist (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -324,13 +324,13 @@
register: nm_change_selector_2_key_not_exist
- name: Verify nm_change_selector_2_key_not_exist
- assert:
+ ansible.builtin.assert:
that:
- nm_change_selector_2_key_not_exist is not changed
- nm_change_selector_2_key_not_exist.msg == "Attribute 'value' is not supported for operator 'does_not_have_key' in expression 'expression_6'"
- name: Change Selector 2 - equals (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -345,13 +345,13 @@
register: nm_change_selector_2_equals
- name: Verify nm_change_selector_2_equals
- assert:
+ ansible.builtin.assert:
that:
- nm_change_selector_2_equals is not changed
- nm_change_selector_2_equals.msg == "Attribute 'value' needed for operator 'equals' in expression 'expression_6'"
- name: Change Selector 2 expressions (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -380,14 +380,14 @@
register: nm_change_selector_2
- name: Verify nm_change_selector_2
- assert:
+ ansible.builtin.assert:
that:
- nm_change_selector_2 is changed
- nm_change_selector_2.current.name == "selector_2"
- nm_change_selector_2.current.expressions | length == 6
- name: Change Selector 2 expressions again (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -416,14 +416,14 @@
register: nm_change_selector_2_again
- name: Verify nm_change_selector_2_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_selector_2_again is not changed
- nm_change_selector_2_again.current.name == "selector_2"
- nm_change_selector_2_again.current.expressions | length == 6
- name: Query all selectors (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -434,7 +434,7 @@
register: cm_query_all_selectors
- name: Verify cm_query_all_selectors
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_selectors is not changed
- cm_query_all_selectors.current | length == 2
@@ -444,7 +444,7 @@
- cm_query_all_selectors.current[1].expressions | length == 6
- name: Query all selectors (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -454,7 +454,7 @@
register: nm_query_all_selectors
- name: Verify nm_query_all_selectors
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_selectors is not changed
- nm_query_all_selectors.current | length == 2
@@ -464,7 +464,7 @@
- nm_query_all_selectors.current[1].expressions | length == 6
- name: Query specific selector (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -476,14 +476,14 @@
register: cm_query_selector1
- name: Verify cm_query_selector1
- assert:
+ ansible.builtin.assert:
that:
- cm_query_selector1 is not changed
- cm_query_selector1.current.name == "selector_1"
- cm_query_selector1.current.expressions == []
- name: Query specific selector (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -494,14 +494,14 @@
register: nm_query_selector1
- name: Verify nm_query_selector1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_selector1 is not changed
- nm_query_selector1.current.name == "selector_1"
- nm_query_selector1.current.expressions == []
- name: Query specific selector2 (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -512,7 +512,7 @@
register: nm_query_selector2
- name: Verify nm_query_selector2
- assert:
+ ansible.builtin.assert:
that:
- nm_query_selector2 is not changed
- nm_query_selector2.current.name == "selector_2"
@@ -537,7 +537,7 @@
- nm_query_selector2.current.expressions[5].value == ""
# - name: Remove selector 1 (check_mode)
-# mso_schema_template_anp_epg_selector:
+# cisco.mso.mso_schema_template_anp_epg_selector:
# <<: *mso_info
# schema: '{{ mso_schema | default("ansible_test") }}'
# template: Template 1
@@ -549,13 +549,13 @@
# register: cm_remove_selector_1
# - name: Verify cm_remove_selector_1
-# assert:
+# ansible.builtin.assert:
# that:
# - cm_remove_selector_1 is changed
# - cm_remove_selector_1.current == {}
# - name: Remove selector 1 (normal_mode)
-# mso_schema_template_anp_epg_selector:
+# cisco.mso.mso_schema_template_anp_epg_selector:
# <<: *mso_info
# schema: '{{ mso_schema | default("ansible_test") }}'
# template: Template 1
@@ -566,13 +566,13 @@
# register: nm_remove_selector_1
# - name: Verify nm_remove_selector_1
-# assert:
+# ansible.builtin.assert:
# that:
# - nm_remove_selector_1 is changed
# - nm_remove_selector_1.current == {}
- name: Remove selector 2 (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -583,14 +583,14 @@
register: nm_remove_selector_2
- name: Verify nm_remove_selector_2
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_selector_2 is changed
- nm_remove_selector_2.current == {}
# QUERY NON-EXISTING Selector to EPG
- name: Query non-existing selector (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -603,7 +603,7 @@
register: cm_query_non_selector
- name: Query non-existing selector (normal mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -615,7 +615,7 @@
register: nm_query_non_selector
- name: Verify cm_query_non_selector and nm_query_non_selector
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_selector is not changed
- nm_query_non_selector is not changed
@@ -625,7 +625,7 @@
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -638,7 +638,7 @@
register: cm_query_non_epg
- name: Query non-existing EPG (normal mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -650,7 +650,7 @@
register: nm_query_non_epg
- name: Verify query_non_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_epg is not changed
- nm_query_non_epg is not changed
@@ -659,7 +659,7 @@
# QUERY NON-EXISTING ANP
- name: Query non-existing ANP (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -672,7 +672,7 @@
register: cm_query_non_anp
- name: Query non-existing ANP (normal mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -684,7 +684,7 @@
register: nm_query_non_anp
- name: Verify query_non_anp
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_anp is not changed
- nm_query_non_anp is not changed
@@ -693,7 +693,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -706,7 +706,7 @@
register: cm_non_existing_state
- name: Non-existing state (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -718,7 +718,7 @@
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -727,7 +727,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -740,7 +740,7 @@
register: cm_non_existing_template
- name: Non-existing template (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -752,7 +752,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -761,7 +761,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema (check_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -774,7 +774,7 @@
register: cm_non_existing_schema
- name: Non-existing schema (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -786,7 +786,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_useg_attribute/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_useg_attribute/tasks/main.yml
index ef17edac1..8445b226c 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_useg_attribute/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_anp_epg_useg_attribute/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: "{{ mso_hostname }}"
username: "{{ mso_username }}"
@@ -23,13 +23,13 @@
# Setup Part
- name: Remove schemas
- mso_schema: &ansible_schema_absent
+ cisco.mso.mso_schema: &ansible_schema_absent
<<: *mso_info
schema: ansible_test
state: absent
- name: Ensure ansible_test tenant absent
- mso_tenant: &ansible_tenant_absent
+ cisco.mso.mso_tenant: &ansible_tenant_absent
<<: *mso_info
tenant: ansible_test
users:
@@ -37,12 +37,12 @@
state: absent
- name: Ensure ansible_test tenant present
- mso_tenant: &ansible_tenant_present
+ cisco.mso.mso_tenant: &ansible_tenant_present
<<: *ansible_tenant_absent
state: present
- name: Ensure ansible_test schema with ans_test_template exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: ansible_test
tenant: ansible_test
@@ -50,7 +50,7 @@
state: present
- name: Ensure ans_test_anp exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -58,7 +58,7 @@
state: present
- name: Ensure ans_test_epg exist
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -68,7 +68,7 @@
state: present
- name: Ensure ans_test_epg_2 exist without useg_epg
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -79,7 +79,7 @@
# Test Part
# Note: Ignore the below task, which is used to reference the attributes to other tasks
- name: Invalid test - check for missing required attributes error message
- mso_schema_template_anp_epg_useg_attribute: &useg_attribute_present
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute: &useg_attribute_present
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -90,8 +90,26 @@
ignore_errors: true
register: ans_test_uSeg_1_nt
+- name: Invalid test - ans_test_uSeg_1 present - attribute_type - ip, useg_subnet - true, with value
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
+ <<: *useg_attribute_present
+ name: ans_test_uSeg_2
+ attribute_type: ip
+ useg_subnet: true
+ value: "1.2.3.4"
+ ignore_errors: true
+ register: ans_test_uSeg_1_nt1
+
+- name: Assertions check for invalid tests - ans_test_uSeg_1
+ ansible.builtin.assert:
+ that:
+ - ans_test_uSeg_1_nt is not changed
+ - ans_test_uSeg_1_nt.msg == "state is present but all of the following are missing{{':'}} name, type"
+ - ans_test_uSeg_1_nt1 is not changed
+ - ans_test_uSeg_1_nt1.msg == "The value of uSeg subnet IP should be an empty string or 0.0.0.0, when the useg_subnet is set to true."
+
- name: ans_test_uSeg_1 present - attribute_type - ip, useg_subnet - true, without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *mso_info
schema: ansible_test
template: ans_test_template
@@ -103,7 +121,7 @@
register: ans_test_uSeg_1
- name: Invalid test - ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_2
attribute_type: ip
@@ -112,34 +130,36 @@
register: ans_test_uSeg_2_nt
- name: ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, with value - check mode
- mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_2_cm_present
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_2_cm_present
<<: *useg_attribute_present
name: ans_test_uSeg_2
attribute_type: ip
useg_subnet: false
- value: 11.22.33.44/24
+ value: 11.22.33.44
check_mode: true
register: ans_test_uSeg_2_cm_present
- name: ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, with value - normal mode
- mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_2_nm_present
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_2_nm_present
<<: *ans_test_uSeg_2_cm_present
+ output_level: debug
register: ans_test_uSeg_2_nm_present
- name: ans_test_uSeg_2 present - attribute_type - ip, useg_subnet - false, with value - normal mode again
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *ans_test_uSeg_2_nm_present
+ output_level: debug
register: ans_test_uSeg_2_nm_present_again
- name: Assertions check for add ans_test_uSeg_1 and ans_test_uSeg_2 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_1 is changed
- ans_test_uSeg_1.current != {}
- ans_test_uSeg_1.current.name == "ans_test_uSeg_1"
- ans_test_uSeg_1.current.type == "ip"
- ans_test_uSeg_1.current.value == "0.0.0.0"
- - ans_test_uSeg_1.current.fvSubnet == false
+ - ans_test_uSeg_1.current.fvSubnet == true
- ans_test_uSeg_1.current.description == "ans_test_uSeg_1"
- ans_test_uSeg_2_nt is not changed
- ans_test_uSeg_2_nt.msg == "useg_subnet is False but all of the following are missing{{':'}} value"
@@ -148,33 +168,31 @@
- ans_test_uSeg_2_cm_present.previous == {}
- ans_test_uSeg_2_cm_present.current.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_cm_present.current.type == "ip"
- - ans_test_uSeg_2_cm_present.current.value == "11.22.33.44/24"
- - ans_test_uSeg_2_cm_present.current.fvSubnet == true
+ - ans_test_uSeg_2_cm_present.current.value == "11.22.33.44"
- ans_test_uSeg_2_cm_present.current.description == "uSeg Attr object created using Ansible"
- ans_test_uSeg_2_nm_present is changed
- ans_test_uSeg_2_nm_present.current != {}
- ans_test_uSeg_2_nm_present.previous == {}
- ans_test_uSeg_2_nm_present.current.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_nm_present.current.type == "ip"
- - ans_test_uSeg_2_nm_present.current.value == "11.22.33.44/24"
- - ans_test_uSeg_2_nm_present.current.fvSubnet == true
+ - ans_test_uSeg_2_nm_present.current.value == "11.22.33.44"
+ - ans_test_uSeg_2_nm_present.sent.fvSubnet == false
- ans_test_uSeg_2_nm_present.current.description == "uSeg Attr object created using Ansible"
- ans_test_uSeg_2_nm_present_again is not changed
- ans_test_uSeg_2_nm_present_again.current != {}
- ans_test_uSeg_2_nm_present_again.previous != {}
- ans_test_uSeg_2_nm_present_again.current.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_nm_present_again.current.type == "ip"
- - ans_test_uSeg_2_nm_present_again.current.value == "11.22.33.44/24"
- - ans_test_uSeg_2_nm_present_again.current.fvSubnet == true
+ - ans_test_uSeg_2_nm_present_again.current.value == "11.22.33.44"
+ - ans_test_uSeg_2_nm_present_again.sent.fvSubnet == false
- ans_test_uSeg_2_nm_present_again.current.description == "uSeg Attr object created using Ansible"
- ans_test_uSeg_2_nm_present_again.previous.name == "ans_test_uSeg_2"
- ans_test_uSeg_2_nm_present_again.previous.type == "ip"
- - ans_test_uSeg_2_nm_present_again.previous.value == "11.22.33.44/24"
- - ans_test_uSeg_2_nm_present_again.previous.fvSubnet == true
+ - ans_test_uSeg_2_nm_present_again.previous.value == "11.22.33.44"
- ans_test_uSeg_2_nm_present_again.previous.description == "uSeg Attr object created using Ansible"
- name: Invalid test - ans_test_uSeg_3 present - attribute_type - mac and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_3
attribute_type: mac
@@ -182,7 +200,7 @@
register: ans_test_uSeg_3_nt
- name: ans_test_uSeg_3 present - attribute_type - mac and with value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_3
attribute_type: mac
@@ -190,7 +208,7 @@
register: ans_test_uSeg_3
- name: Assertions check for add ans_test_uSeg_3 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_3_nt is not changed
- ans_test_uSeg_3_nt.msg == "Failed due to invalid 'value' and the attribute_type is{{':'}} mac."
@@ -203,7 +221,7 @@
- ans_test_uSeg_3.current.value == "aa:bb:cc:dd:ee:ff"
- name: Invalid test - ans_test_uSeg_4 present - attribute_type - dns and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_4
attribute_type: dns
@@ -211,7 +229,7 @@
register: ans_test_uSeg_4_nt
- name: ans_test_uSeg_4 present - attribute_type - dns and with value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_4
attribute_type: dns
@@ -219,7 +237,7 @@
register: ans_test_uSeg_4
- name: Assertions check for add ans_test_uSeg_4 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_4_nt is not changed
- ans_test_uSeg_4_nt.msg == "Failed due to invalid 'value' and the attribute_type is{{':'}} dns."
@@ -232,7 +250,7 @@
- ans_test_uSeg_4.current.value == "test_dns_value"
- name: Invalid test - ans_test_uSeg_6 present - attribute_type - vm_datacenter and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
attribute_type: vm_datacenter
@@ -241,7 +259,7 @@
register: ans_test_uSeg_6_nt
- name: Invalid test - ans_test_uSeg_6 present - attribute_type - vm_datacenter, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
attribute_type: vm_datacenter
@@ -250,7 +268,7 @@
register: ans_test_uSeg_6_nt1
- name: ans_test_uSeg_6 present - attribute_type - vm_datacenter, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
attribute_type: vm_datacenter
@@ -259,7 +277,7 @@
register: ans_test_uSeg_6
- name: Assertions check for add ans_test_uSeg_6 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_6_nt is not changed
- ans_test_uSeg_6_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_datacenter."
@@ -274,7 +292,7 @@
- ans_test_uSeg_6.current.value == "test_vm_datacenter_value"
- name: Invalid test - ans_test_uSeg_7 present - attribute_type - vm_hypervisor_identifier and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_7
attribute_type: vm_hypervisor_identifier
@@ -283,7 +301,7 @@
register: ans_test_uSeg_7_nt
- name: Invalid test - ans_test_uSeg_7 present - attribute_type - vm_hypervisor_identifier, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_7
attribute_type: vm_hypervisor_identifier
@@ -292,7 +310,7 @@
register: ans_test_uSeg_7_nt1
- name: ans_test_uSeg_7 present - attribute_type - vm_hypervisor_identifier, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_7
attribute_type: vm_hypervisor_identifier
@@ -301,7 +319,7 @@
register: ans_test_uSeg_7
- name: Assertions check for add ans_test_uSeg_7 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_7_nt is not changed
- ans_test_uSeg_7_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_hypervisor_identifier."
@@ -316,7 +334,7 @@
- ans_test_uSeg_7.current.value == "test_vm_hypervisor_identifier_value"
- name: Invalid test - ans_test_uSeg_8 present - attribute_type - vm_operating_system and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_8
attribute_type: vm_operating_system
@@ -325,7 +343,7 @@
register: ans_test_uSeg_8_nt
- name: Invalid test - ans_test_uSeg_8 present - attribute_type - vm_operating_system, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_8
attribute_type: vm_operating_system
@@ -334,7 +352,7 @@
register: ans_test_uSeg_8_nt1
- name: ans_test_uSeg_8 present - attribute_type - vm_operating_system, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_8
attribute_type: vm_operating_system
@@ -343,7 +361,7 @@
register: ans_test_uSeg_8
- name: Assertions check for add ans_test_uSeg_8 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_8_nt is not changed
- ans_test_uSeg_8_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_operating_system."
@@ -358,7 +376,7 @@
- ans_test_uSeg_8.current.value == "test_vm_operating_system_value"
- name: Invalid test - ans_test_uSeg_9 present - attribute_type - vm_tag and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_9
attribute_type: vm_tag
@@ -367,7 +385,7 @@
register: ans_test_uSeg_9_nt
- name: Invalid test - ans_test_uSeg_9 present - attribute_type - vm_tag, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_9
attribute_type: vm_tag
@@ -376,7 +394,7 @@
register: ans_test_uSeg_9_nt1
- name: ans_test_uSeg_9 present - attribute_type - vm_tag, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_9
attribute_type: vm_tag
@@ -385,7 +403,7 @@
register: ans_test_uSeg_9
- name: Assertions check for add ans_test_uSeg_9 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_9_nt is not changed
- ans_test_uSeg_9_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_tag."
@@ -400,7 +418,7 @@
- ans_test_uSeg_9.current.value == "test_vm_tag_value"
- name: Invalid test - ans_test_uSeg_10 present - attribute_type - vm_identifier and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_10
attribute_type: vm_identifier
@@ -409,7 +427,7 @@
register: ans_test_uSeg_10_nt
- name: Invalid test - ans_test_uSeg_10 present - attribute_type - vm_identifier, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_10
attribute_type: vm_identifier
@@ -418,7 +436,7 @@
register: ans_test_uSeg_10_nt1
- name: ans_test_uSeg_10 present - attribute_type - vm_identifier, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_10
attribute_type: vm_identifier
@@ -427,7 +445,7 @@
register: ans_test_uSeg_10
- name: Assertions check for add ans_test_uSeg_10 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_10_nt is not changed
- ans_test_uSeg_10_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_identifier."
@@ -442,7 +460,7 @@
- ans_test_uSeg_10.current.value == "test_vm_identifier_value"
- name: Invalid test - ans_test_uSeg_11 present - attribute_type - vmm_domain and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_11
attribute_type: vmm_domain
@@ -451,7 +469,7 @@
register: ans_test_uSeg_11_nt
- name: Invalid test - ans_test_uSeg_11 present - attribute_type - vmm_domain, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_11
attribute_type: vmm_domain
@@ -460,7 +478,7 @@
register: ans_test_uSeg_11_nt1
- name: ans_test_uSeg_11 present - attribute_type - vmm_domain, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_11
attribute_type: vmm_domain
@@ -469,7 +487,7 @@
register: ans_test_uSeg_11
- name: Assertions check for add ans_test_uSeg_11 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_11_nt is not changed
- ans_test_uSeg_11_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vmm_domain."
@@ -484,7 +502,7 @@
- ans_test_uSeg_11.current.value == "test_vmm_domain_value"
- name: Invalid test - ans_test_uSeg_12 present - attribute_type - vm_name and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_12
attribute_type: vm_name
@@ -493,7 +511,7 @@
register: ans_test_uSeg_12_nt
- name: Invalid test - ans_test_uSeg_12 present - attribute_type - vm_name, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_12
attribute_type: vm_name
@@ -502,7 +520,7 @@
register: ans_test_uSeg_12_nt1
- name: ans_test_uSeg_12 present - attribute_type - vm_name, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_12
attribute_type: vm_name
@@ -511,7 +529,7 @@
register: ans_test_uSeg_12
- name: Assertions check for add ans_test_uSeg_12 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_12_nt is not changed
- ans_test_uSeg_12_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vm_name."
@@ -526,7 +544,7 @@
- ans_test_uSeg_12.current.value == "test_vm_value"
- name: Invalid test - ans_test_uSeg_13 present - attribute_type - vnic_dn and without operator
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_13
attribute_type: vnic_dn
@@ -535,7 +553,7 @@
register: ans_test_uSeg_13_nt
- name: Invalid test - ans_test_uSeg_13 present - attribute_type - vnic_dn, operator - equals and without value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_13
attribute_type: vnic_dn
@@ -544,7 +562,7 @@
register: ans_test_uSeg_13_nt1
- name: ans_test_uSeg_13 present - attribute_type - vnic_dn, operator - equals and value
- mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_13_present
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_13_present
<<: *useg_attribute_present
name: ans_test_uSeg_13
attribute_type: vnic_dn
@@ -553,7 +571,7 @@
register: ans_test_uSeg_13
- name: Assertions check for add ans_test_uSeg_12 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_13_nt is not changed
- ans_test_uSeg_13_nt.msg == "Failed due to invalid 'value' or 'operator' and the attribute_type is{{':'}} vnic_dn."
@@ -569,7 +587,7 @@
# Query Part
- name: Invalid test - Query an uSeg Attr with name - invalid_useg_attr
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: invalid_useg_attr
state: query
@@ -577,20 +595,20 @@
ignore_errors: true
- name: Query an uSeg Attr with name - ans_test_uSeg_1
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_6
state: query
register: query_a_useg_6
- name: Query all uSeg Attrs
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
state: query
register: query_all_useg_objects
- name: Assertions check for query uSeg Attr objects
- assert:
+ ansible.builtin.assert:
that:
- invalid_useg_attr is not changed
- invalid_useg_attr.msg == "The uSeg Attribute{{':'}} invalid_useg_attr not found."
@@ -604,21 +622,21 @@
# Update Part
- name: Update ans_test_uSeg_13 object description and value
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *ans_test_uSeg_13_present
description: "ans_test_uSeg_13 updated!"
value: test_vnic_dn_value_updated
register: ans_test_uSeg_13_update
- name: Query an uSeg Attr with name - ans_test_uSeg_13 to check the updated changes
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
name: ans_test_uSeg_13
state: query
register: query_a_useg_object_with_name
- name: Assertions check for update ans_test_uSeg_13 object
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_13_update is changed
- ans_test_uSeg_13_update.current != {}
@@ -640,7 +658,7 @@
# Cleanup Part
- name: ans_test_uSeg_1 absent with check mode
- mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_1_cm_absent
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_1_cm_absent
<<: *useg_attribute_present
name: ans_test_uSeg_1
state: absent
@@ -648,17 +666,17 @@
register: ans_test_uSeg_1_cm_absent
- name: ans_test_uSeg_1 absent with normal mode
- mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_1_nm_absent
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute: &ans_test_uSeg_1_nm_absent
<<: *ans_test_uSeg_1_cm_absent
register: ans_test_uSeg_1_nm_absent
- name: ans_test_uSeg_1 absent with normal mode again
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *ans_test_uSeg_1_nm_absent
register: ans_test_uSeg_1_nm_absent_again
- name: Assertions check for ans_test_uSeg_1 absent
- assert:
+ ansible.builtin.assert:
that:
- ans_test_uSeg_1_cm_absent is changed
- ans_test_uSeg_1_cm_absent.current == {}
@@ -671,7 +689,7 @@
- ans_test_uSeg_1_nm_absent_again.previous == {}
- name: Query all uSeg Attrs - invalid template name
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
template: ans_test_template_123
state: query
@@ -679,7 +697,7 @@
register: query_invalid_template
- name: Query all uSeg Attrs - invalid Application Profile name
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
anp: ans_test_anp_123
state: query
@@ -687,7 +705,7 @@
register: query_invalid_ap
- name: Query all uSeg Attrs - invalid EPG name
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
epg: ans_test_epg_123
state: query
@@ -695,7 +713,7 @@
register: query_invalid_epg
- name: Invalid test - ans_test_anp_123 present under ans_test_epg_2
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
epg: ans_test_epg_2
name: ans_test_anp_123
@@ -705,7 +723,7 @@
register: ans_test_epg_2_nt
- name: Assertions check for invalid inputs
- assert:
+ ansible.builtin.assert:
that:
- query_invalid_template is not changed
- query_invalid_template.msg is match("Provided template 'ans_test_template_123' not matching existing template.+")
@@ -717,27 +735,26 @@
- ans_test_epg_2_nt.msg is match("ans_test_epg_2{{':'}} is not a valid uSeg EPG.")
- name: Remove ansible_test schema to delete all uSeg Attr objects
- mso_schema:
+ cisco.mso.mso_schema:
<<: *ansible_schema_absent
schema: ansible_test
state: absent
# To check all uSeg Attrs removed from the machine
- name: Query all uSeg Attrs - Cleanup Part
- mso_schema_template_anp_epg_useg_attribute:
+ cisco.mso.mso_schema_template_anp_epg_useg_attribute:
<<: *useg_attribute_present
state: query
ignore_errors: true
register: query_useg_absent_check
- name: Assertions check for query all uSeg Attrs - Cleanup Part
- assert:
+ ansible.builtin.assert:
that:
- query_useg_absent_check is not changed
- query_useg_absent_check.current == {}
- name: Remove ansible_test tenant
- mso_tenant:
- <<: *ansible_tenant_present
+ cisco.mso.mso_tenant:
+ <<: *ansible_tenant_absent
state: absent
- <<: *mso_info \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd/tasks/main.yml
index a10ed8e14..6f87222cb 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd/tasks/main.yml
@@ -6,14 +6,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -24,18 +24,18 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Set version vars
- set_fact:
- mso_l3mcast: false
+ ansible.builtin.set_fact:
+ cisco.mso.mso_l3mcast: false
when: version.current.version is version('2.2.4', '=')
- name: Ensure site exist
- mso_site: &site_present
+ cisco.mso.mso_site: &site_present
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -46,7 +46,7 @@
state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -55,7 +55,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove DHCP policies
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
tenant: ansible_test
@@ -69,7 +69,7 @@
- version.current.version is version('4.0', '<')
- name: Remove DHCP option policies
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
tenant: ansible_test
@@ -83,7 +83,7 @@
- version.current.version is version('4.0', '<')
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
users:
@@ -93,7 +93,7 @@
state: present
- name: Ensure schema 1 with Template1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -101,28 +101,28 @@
state: present
- name: Ensure schema 1 with Template2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
template: Template2
- name: Ensure schema 2 with Template3 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
template: Template3
- name: Ensure schema 2 with Template5 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
template: Template5
- name: Ensure VRF exist
- mso_schema_template_vrf: &vrf_present
+ cisco.mso.mso_schema_template_vrf: &vrf_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -131,32 +131,32 @@
state: present
- name: Ensure VRF2 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
vrf: VRF2
- name: Ensure VRF3 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
template: Template2
vrf: VRF3
- name: Ensure VRF4 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template3
vrf: VRF4
- name: Ensure VRF5 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
vrf: VRF5
- name: Ensure ansible_test_1 BD does not exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -166,7 +166,7 @@
state: absent
- name: Ensure ansible_test_2 BD does not exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -176,7 +176,7 @@
state: absent
- name: Ensure ansible_test_3 BD does not exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template3
@@ -188,7 +188,7 @@
state: absent
- name: Ensure ansible_test_4 BD does not exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -200,7 +200,7 @@
state: absent
- name: Ensure multiple DHCP policies exist
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
description: "My Test DHCP Policies"
@@ -215,7 +215,7 @@
- version.current.version is version('4.0', '<')
- name: Ensure multiple DHCP option policies exist
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
description: "My Test DHCP Policy Options"
@@ -231,7 +231,7 @@
# ADD BD
- name: Add bd (check_mode)
- mso_schema_template_bd: &bd_present
+ cisco.mso.mso_schema_template_bd: &bd_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -243,7 +243,7 @@
register: cm_add_bd
- name: Verify cm_add_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_add_bd is changed
- cm_add_bd.previous == {}
@@ -252,12 +252,12 @@
- cm_add_bd.current.vrfRef.vrfName == "VRF"
- name: Add bd (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
register: nm_add_bd
- name: Verify nm_add_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd is changed
- nm_add_bd.previous == {}
@@ -267,13 +267,13 @@
- cm_add_bd.current.vrfRef.schemaId == nm_add_bd.current.vrfRef.schemaId
- name: Add bd again (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
check_mode: true
register: cm_add_bd_again
- name: Verify cm_add_bd_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_bd_again is not changed
- cm_add_bd_again.previous.name == "ansible_test_1"
@@ -285,12 +285,12 @@
- cm_add_bd_again.previous.vrfRef.schemaId == cm_add_bd_again.current.vrfRef.schemaId
- name: Add bd again (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
register: nm_add_bd_again
- name: Verify nm_add_bd_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_again is not changed
- nm_add_bd_again.previous.name == "ansible_test_1"
@@ -302,7 +302,7 @@
- nm_add_bd_again.previous.vrfRef.schemaId == nm_add_bd_again.current.vrfRef.schemaId
- name: Add bd 2 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -340,7 +340,7 @@
register: nm_add_bd_2
- name: Add bd 3 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template3
@@ -352,7 +352,7 @@
register: nm_add_bd_3
- name: Add bd 4 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -364,7 +364,7 @@
register: nm_add_bd_4
- name: Verify nm_add_bd_2 and nm_add_bd_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_2 is changed
- nm_add_bd_3 is changed
@@ -406,7 +406,7 @@
- nm_add_bd_2.current.subnets[3].querier == false
- name: Add bd 5 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -434,7 +434,7 @@
register: nm_add_bd_5
- name: Verify nm_add_bd_5 for a version that's before 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_5 is changed
- nm_add_bd_5.current.name == "ansible_test_5"
@@ -448,7 +448,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_add_bd_5 for a version that's 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_bd_5 is changed
- nm_add_bd_5.current.name == "ansible_test_5"
@@ -467,7 +467,7 @@
when: version.current.version is version('3.1.1g', '>=')
- name: Add bd 5 again (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -495,20 +495,20 @@
register: nm_add_again_bd_5
- name: Verify nm_add_again_bd_5 for a version that's before 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_again_bd_5 is not changed
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_add_again_bd_5 for a version that's between 3.1 and 4.0
- assert:
+ ansible.builtin.assert:
that:
- nm_add_again_bd_5 is not changed
when:
- version.current.version is version('3.1.1g', '>=')
- name: Add bd 5 with different values for new options (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -536,13 +536,13 @@
register: nm_bd_5_options
- name: Verify nm_bd_5_options for a version that's before 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_5_options is not changed
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_bd_5_options for a version that's 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_5_options is changed
- nm_bd_5_options.current.unkMcastAct == "opt-flood"
@@ -552,7 +552,7 @@
when: version.current.version is version('3.1.1g', '>=')
- name: Change bd 5_1 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -580,20 +580,20 @@
register: nm_change_bd_5_1
- name: Verify nm_change_bd_5_1 for a version that's before 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_5_1 is changed
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_change_bd_5_1 for a version that's 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_5_1 is changed
- nm_change_bd_5_1.current.arpFlood == true
when: version.current.version is version('3.1.1g', '>=')
- name: Change bd 5_2 (normal mode)
- mso_schema_template_bd: &change_bd5_2
+ cisco.mso.mso_schema_template_bd: &change_bd5_2
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -622,21 +622,21 @@
register: nm_change_bd_5_2
- name: Verify nm_change_bd_5_2 for a version that's before 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_5_2 is changed
- nm_change_bd_5_2.current.l2UnknownUnicast == "flood"
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_change_bd_5_2 for a version that's after 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_5_2 is changed
- nm_change_bd_5_2.current.arpFlood == true
when: version.current.version is version('3.1.1g', '>=')
- name: Change bd 5_3 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -665,14 +665,14 @@
register: nm_change_bd_5_3
- name: Verify nm_change_bd_5_3 for a version that's before 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_5_3 is changed
- nm_change_bd_5_3.msg is match ("MSO Error 143{{':'}} Invalid Field{{':'}} BD 'ansible_test_5' l2UnknownUnicast cannot be flood when intersiteBumTrafficAllow is off")
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_change_bd_5_3 for a version that's after 3.1 and before 3.3
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_5_3 is changed
# Inconsistency shown in returned error messages for v3.1.1
@@ -686,7 +686,7 @@
- version.current.version is version('3.1.1g', '>=')
- name: Verify nm_change_bd_5_3 for a version that's after 4.0
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_5_3 is changed
- nm_change_bd_5_3.msg is match ("MSO Error 400{{':'}} BD{{':'}} ansible_test_5 in Schema{{':'}} ansible_test_2 , Template{{':'}} Template5 BD ansible_test_5 l2UnknownUnicast cannot be flood when intersiteBumTrafficAllow is off")
@@ -694,7 +694,7 @@
- version.current.version is version('4.0', '>=')
- name: Get Validation status
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
state: query
@@ -705,7 +705,7 @@
- version.current.version is version('4.0', '<') # mso_schema_validate not needed after 4.0 because validation is done upon request
- name: Verify query_validate for a version that's after 3.3
- assert:
+ ansible.builtin.assert:
that:
- query_validate is not changed
- query_validate.msg is match ("MSO Error 400{{':'}} Bad Request{{':'}} Patch Failed, Received{{':'}} Template 'Template5', BD 'ansible_test_5' {{':'}} ARP Flooding has to be disabled if L2 Stretch enabled and BUM traffic disabled exception while trying to update schema")
@@ -715,13 +715,13 @@
# Reverting back to bd 5_2
- name: Change bd 5_3 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *change_bd5_2
register: nm_change_bd_5_3_again
when: query_validate is failed
- name: Get Validation status
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
state: query
@@ -731,7 +731,7 @@
- version.current.version is version('4.0', '<') # mso_schema_validate not needed after 4.0 because validation is done upon request
- name: Change bd 5 for query (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -759,7 +759,7 @@
# CHANGE BD
- name: Change bd (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
vrf:
name: VRF2
@@ -767,7 +767,7 @@
register: cm_change_bd
- name: Verify cm_change_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_change_bd is changed
- cm_change_bd.current.name == 'ansible_test_1'
@@ -776,7 +776,7 @@
- cm_change_bd.current.vrfRef.schemaId == cm_change_bd.previous.vrfRef.schemaId
- name: Change bd (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
vrf:
name: VRF2
@@ -784,7 +784,7 @@
register: nm_change_bd
- name: Verify nm_change_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd is changed
- nm_change_bd.current.name == 'ansible_test_1'
@@ -793,7 +793,7 @@
- nm_change_bd.current.vrfRef.schemaId == nm_change_bd.previous.vrfRef.schemaId
- name: Change bd again (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
vrf:
name: VRF2
@@ -801,7 +801,7 @@
register: cm_change_bd_again
- name: Verify cm_change_bd_again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_bd_again is not changed
- cm_change_bd_again.current.name == 'ansible_test_1'
@@ -810,14 +810,14 @@
- cm_change_bd_again.current.vrfRef.schemaId == cm_change_bd_again.previous.vrfRef.schemaId
- name: Change bd again (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
vrf:
name: VRF2
register: nm_change_bd_again
- name: Verify nm_change_bd_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_again is not changed
- nm_change_bd_again.current.name == 'ansible_test_1'
@@ -826,7 +826,7 @@
- nm_change_bd_again.current.vrfRef.schemaId == nm_change_bd_again.previous.vrfRef.schemaId
- name: Change bd to VRF3 in other template (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
vrf:
name: VRF3
@@ -834,7 +834,7 @@
register: nm_change_bd_vrf3
- name: Change bd to VRF4 in other schema (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
vrf:
name: VRF4
@@ -843,7 +843,7 @@
register: nm_change_bd_vrf4
- name: Verify nm_change_bd_vrf3 and nm_change_bd_vrf4
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_vrf3 is changed
- nm_change_bd_vrf3.current.name == nm_change_bd_vrf4.current.name == 'ansible_test_1'
@@ -853,7 +853,7 @@
- nm_change_bd_vrf4.current.vrfRef.templateName == "Template3"
- name: Change bd 1 settings(normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -885,7 +885,7 @@
register: nm_change_bd_1_settings
- name: Change bd 1 subnets (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -916,7 +916,7 @@
register: nm_change_bd_1_subnets
- name: Verify nm_change_bd_1_subnets
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_1_settings is changed
- nm_change_bd_1_settings.current.name == "ansible_test_1"
@@ -979,21 +979,21 @@
- nm_change_bd_1_subnets.current.subnets[2].querier == true
- name: Verify l3MCast nm_change_bd_1_subnets (version == 2.2.4)
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_1_settings.current.l3MCast == false
- nm_change_bd_1_subnets.current.l3MCast == false
when: version.current.version is version('2.2.4', '=')
- name: Verify l3MCast nm_change_bd_1_subnets (version != 2.2.4)
- assert:
+ ansible.builtin.assert:
that:
- nm_change_bd_1_settings.current.l3MCast == true
- nm_change_bd_1_subnets.current.l3MCast == true
when: version.current.version is version('2.2.4', '!=')
- name: Add bd with multiple dhcp policies for mso version > 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1045,7 +1045,7 @@
- version.current.version is version('4.0', '<')
- name: Verify addition of DHCP policies for mso version > 3.1.1g
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_dhcp_policies is changed
- nm_bd_dhcp_policies.current.dhcpLabels | length == 3
@@ -1067,7 +1067,7 @@
- version.current.version is version('4.0', '<')
- name: Change bd with multiple dhcp policies for mso version > 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1114,7 +1114,7 @@
- version.current.version is version('4.0', '<')
- name: Verify change in DHCP policies for mso version > 3.1.1g
- assert:
+ ansible.builtin.assert:
that:
- change_nm_bd_dhcp_policies is changed
- change_nm_bd_dhcp_policies.current.dhcpLabels | length == 2
@@ -1133,7 +1133,7 @@
# Add BD with new options for mso version > 3.1.1g
- name: Add bd with new options available in mso versions > 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1169,7 +1169,7 @@
when: version.current.version is version('3.1.1g', '>')
- name: Verify subnets in nm_bd_new_subnet_options
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_new_subnet_options is changed
- nm_bd_new_subnet_options.current.name == 'ansible_test_new_options'
@@ -1194,7 +1194,7 @@
# Change BD with new options for mso version > 3.1.1g
- name: Try Changing bd with another subnet to primary IP
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1232,7 +1232,7 @@
when: version.current.version is version('3.1.1g', '>')
- name: Verify subnets in nm_bd_subnet_second_primary
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_subnet_second_primary.msg is match ("MSO Error 400{{':'}} Bad Request{{':'}} Patch Failed, Received{{':'}} Only one preferred subnet per address family is allowed under BD ansible_test_new_options of Template Template1 exception while trying to update schema")
when:
@@ -1240,7 +1240,7 @@
- version.current.version is version('3.3', '<')
- name: Add bd with new option flood in encap available in mso versions > 3.1.1g with l2 set to true
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1264,7 +1264,7 @@
when: version.current.version is version('3.1.1g', '>')
- name: Verify nm_bd_new_encap_flood_non
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_new_encap_flood_non.msg is match ("MSO Error 400{{':'}} Bad Request{{':'}} Patch Failed, Received{{':'}} Template 'Template1', BD 'ansible_test_flood_encap' {{':'}} Multi destination flood in encapsulation is only supported when l2Stretch is disabled exception while trying to update schema")
when:
@@ -1272,7 +1272,7 @@
- version.current.version is version('3.3', '<')
- name: Add bd with new option flood in encap available in mso versions > 3.1.1g l2 set to false
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1293,13 +1293,13 @@
when: version.current.version is version('3.1.1g', '>')
- name: Verify nm_bd_new_encap_flood
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_new_encap_flood.current.multiDstPktAct == "encap-flood"
when: version.current.version is version('3.1.1g', '>')
- name: Add bd with new option description in mso versions >= 3.3
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1319,13 +1319,13 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_bd_desc
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_desc.current.description == "ansible_test_bd"
when: version.current.version is version('3.3', '>=')
- name: Add bd with change in description in mso versions >= 3.3
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1345,13 +1345,13 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_bd_desc_2
- assert:
+ ansible.builtin.assert:
that:
- nm_bd_desc_2.current.description == "ansible_test_bd_again"
when: version.current.version is version('3.3', '>=')
- name: Ensure bd ansible_test_unicast_false is removed >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1360,7 +1360,7 @@
when: version.current.version is version('3.1.1g', '>')
- name: Ensure bd ansible_test_unicast_true is removed >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1369,7 +1369,7 @@
when: version.current.version is version('3.1.1g', '>')
- name: Add bd with change in unicast routing false in mso versions >= 3.1.1g (check mode)
- mso_schema_template_bd: &unicast_routing_false_present
+ cisco.mso.mso_schema_template_bd: &unicast_routing_false_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1385,26 +1385,26 @@
when: version.current.version is version('3.1.1g', '>')
- name: Add bd with change in unicast routing false in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_false_present
register: nm_ansible_test_unicast_false
when: version.current.version is version('3.1.1g', '>')
- name: Add bd again with unicast routing false in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_false_present
register: nm_ansible_test_unicast_false_again
when: version.current.version is version('3.1.1g', '>')
- name: Change bd with unicast routing to true in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_false_present
unicast_routing: true
register: nm_ansible_test_unicast_false_to_true
when: version.current.version is version('3.1.1g', '>')
- name: Add bd with change in unicast routing true in mso versions >= 3.1.1g (check mode)
- mso_schema_template_bd: &unicast_routing_true_present
+ cisco.mso.mso_schema_template_bd: &unicast_routing_true_present
<<: *unicast_routing_false_present
bd: ansible_test_unicast_true
unicast_routing: true
@@ -1413,26 +1413,26 @@
when: version.current.version is version('3.1.1g', '>')
- name: Add bd with change in unicast routing true in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_true_present
register: nm_ansible_test_unicast_true
when: version.current.version is version('3.1.1g', '>')
- name: Add bd again with unicast routing true in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_true_present
register: nm_ansible_test_unicast_true_again
when: version.current.version is version('3.1.1g', '>')
- name: Change bd with unicast routing to false in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_true_present
unicast_routing: false
register: nm_ansible_test_unicast_true_to_false
when: version.current.version is version('3.1.1g', '>')
- name: Verify unicast routing
- assert:
+ ansible.builtin.assert:
that:
- cm_ansible_test_unicast_false is changed
- cm_ansible_test_unicast_false.current.unicastRouting == false
@@ -1455,14 +1455,14 @@
when: version.current.version is version('3.1.1g', '>')
- name: Remove bd with change in unicast routing false in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_false_present
state: absent
register: ansible_test_unicast_false
when: version.current.version is version('3.1.1g', '>')
- name: Remove bd with change in unicast routing true in mso versions >= 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *unicast_routing_true_present
state: absent
register: ansible_test_unicast_true
@@ -1472,7 +1472,7 @@
# QUERY ALL BD
- name: Query all bd (check_mode)
- mso_schema_template_bd: &bd_query
+ cisco.mso.mso_schema_template_bd: &bd_query
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1481,12 +1481,12 @@
register: cm_query_all_bds
- name: Query all bd (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
register: nm_query_all_bds
- name: Verify query_all_bds for version < 3.1.1g
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_bds is not changed
- nm_query_all_bds is not changed
@@ -1494,7 +1494,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify query_all_bds for version > 3.1.1g and version < 3.3
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_bds is not changed
- nm_query_all_bds is not changed
@@ -1504,7 +1504,7 @@
- version.current.version is version('3.3', '<')
- name: Verify query_all_bds for version >= 3.3 and < 4.0
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_bds is not changed
- nm_query_all_bds is not changed
@@ -1514,7 +1514,7 @@
- version.current.version is version('3.7', '<')
- name: Verify query_all_bds for version >= 4.0
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_bds is not changed
- nm_query_all_bds is not changed
@@ -1523,27 +1523,27 @@
# QUERY A BD
- name: Query bd 1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
bd: ansible_test_1
check_mode: true
register: cm_query_bd
- name: Query bd 1
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
bd: ansible_test_1
register: nm_query_bd
- name: Query bd 2
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
template: Template2
bd: ansible_test_2
register: nm_query_bd_2
- name: Query bd 3
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template3
@@ -1551,7 +1551,7 @@
register: nm_query_bd_3
- name: Query bd 5
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -1559,7 +1559,7 @@
register: nm_query_bd_5
- name: Verify query_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_query_bd is not changed
- nm_query_bd is not changed
@@ -1594,7 +1594,7 @@
- nm_query_bd_2.current.subnets[3].shared == false
- name: Verify nm_query_bd_5 for a version that's before 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_bd_5 is not changed
- nm_query_bd_5.current.name == "ansible_test_5"
@@ -1606,7 +1606,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_query_bd_5 for a version that's 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_bd_5 is not changed
- nm_query_bd_5.current.name == "ansible_test_5"
@@ -1623,7 +1623,7 @@
when: version.current.version is version('3.1.1g', '>=')
- name: Query bd with multiple dhcp policies for mso version > 3.1.1g
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
bd: ansible_test_multiple_dhcp
state: query
@@ -1634,7 +1634,7 @@
- version.current.version is version('4.0', '<')
- name: Verify query of DHCP policies for mso version > 3.1.1g
- assert:
+ ansible.builtin.assert:
that:
- query_nm_bd_dhcp_policies is not changed
- query_nm_bd_dhcp_policies.current.name == 'ansible_test_multiple_dhcp'
@@ -1654,7 +1654,7 @@
# Query BD with new options for mso version > 3.1.1g
- name: Query bd with new option flood in encap available in mso versions > 3.1.1g with l2 set to false
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
bd: ansible_test_flood_encap
state: query
@@ -1662,7 +1662,7 @@
when: version.current.version is version('3.1.1g', '>')
- name: Verify query_bd_new_encap_flood
- assert:
+ ansible.builtin.assert:
that:
- query_bd_new_encap_flood is not changed
- query_bd_new_encap_flood.current.name == 'ansible_test_flood_encap'
@@ -1678,14 +1678,14 @@
when: version.current.version is version('3.1.1g', '>')
- name: Verify query_bd_new_encap_flood
- assert:
+ ansible.builtin.assert:
that:
- query_bd_new_encap_flood.current.l3MCast == false
when: version.current.version is version('3.2', '>=')
# REMOVE BD
- name: Remove bd (check_mode)
- mso_schema_template_bd: &bd_absent
+ cisco.mso.mso_schema_template_bd: &bd_absent
<<: *bd_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1695,47 +1695,47 @@
register: cm_remove_bd
- name: Verify cm_remove_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_bd is changed
- cm_remove_bd.current == {}
- name: Remove bd (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_absent
register: nm_remove_bd
- name: Verify nm_remove_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_bd is changed
- nm_remove_bd.current == {}
- name: Remove bd again (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_absent
check_mode: true
register: cm_remove_bd_again
- name: Verify cm_remove_bd_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_bd_again is not changed
- cm_remove_bd_again.current == {}
- name: Remove bd again (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_absent
register: nm_remove_bd_again
- name: Verify nm_remove_bd_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_bd_again is not changed
- nm_remove_bd_again.current == {}
- name: Remove bd 5 (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_absent
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template5
@@ -1743,13 +1743,13 @@
register: nm_remove_bd_5
- name: Verify nm_remove_bd_5
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_bd_5 is changed
- nm_remove_bd_5.current == {}
- name: Remove bd ansible_test_multiple_dhcp (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_absent
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -1761,7 +1761,7 @@
- version.current.version is version('4.0', '<')
- name: Verify nm_remove_ansible_test_multiple_dhcp
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_ansible_test_multiple_dhcp is changed
- nm_remove_ansible_test_multiple_dhcp.current == {}
@@ -1772,7 +1772,7 @@
# QUERY NON-EXISTING BD
- name: Query non-existing bd (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
bd: ansible_test_1
check_mode: true
@@ -1780,14 +1780,14 @@
register: cm_query_non_bd
- name: Query non-existing bd (normal mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
bd: ansible_test_1
ignore_errors: true
register: nm_query_non_bd
- name: Verify query_non_bd
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_bd is not changed
- nm_query_non_bd is not changed
@@ -1797,7 +1797,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state for bd (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
state: non-existing-state
check_mode: true
@@ -1805,14 +1805,14 @@
register: cm_non_existing_state
- name: Non-existing state for bd (normal_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -1821,7 +1821,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for bd (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
schema: non-existing-schema
check_mode: true
@@ -1829,14 +1829,14 @@
register: cm_non_existing_schema
- name: Non-existing schema for bd (normal_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
schema: non-existing-schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -1845,7 +1845,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for bd (check_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
template: non-existing-template
check_mode: true
@@ -1853,14 +1853,14 @@
register: cm_non_existing_template
- name: Non-existing template for bd (normal_mode)
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_query
template: non-existing-template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -1869,7 +1869,7 @@
# CLEAN UP DHCP Policies
- name: Ensure DHCP policies are removed
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
tenant: ansible_test
@@ -1883,7 +1883,7 @@
- version.current.version is version('4.0', '<')
- name: Ensure DHCP option policies are removed
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
tenant: ansible_test
@@ -1898,7 +1898,7 @@
# REMOVE Schemas for next CI Run
- name: Remove schemas for next ci test
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_dhcp_policy/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_dhcp_policy/tasks/main.yml
index b6b2d7a80..b7f0d632f 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_dhcp_policy/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_dhcp_policy/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,7 +22,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -34,7 +34,7 @@
- version.current.version is version('4.0', '<')
block:
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -43,7 +43,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove DHCP policies
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
tenant: ansible_test
@@ -54,7 +54,7 @@
- 'ansible_test_dhcp_policy3'
- name: Remove DHCP option policies
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
tenant: ansible_test
@@ -64,7 +64,7 @@
- 'ansible_test_dhcp_policy_option2'
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
users:
@@ -74,7 +74,7 @@
state: present
- name: Ensure schema 1 with Template1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -82,7 +82,7 @@
state: present
- name: Ensure VRF exists
- mso_schema_template_vrf: &vrf_present
+ cisco.mso.mso_schema_template_vrf: &vrf_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -91,7 +91,7 @@
state: present
- name: Ensure multiple DHCP policies exist
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
description: "My Test DHCP Policies"
@@ -103,7 +103,7 @@
- 'ansible_test_dhcp_policy3'
- name: Ensure multiple DHCP option policies exist
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
description: "My Test DHCP Policy Options"
@@ -115,7 +115,7 @@
# ADD BD
- name: Add bd
- mso_schema_template_bd: &bd_present
+ cisco.mso.mso_schema_template_bd: &bd_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -131,14 +131,14 @@
state: present
- name: Add bd2
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
bd: ansible_test_2
state: present
# Add dhcp policies
- name: Add DHCP policy in check mode
- mso_schema_template_bd_dhcp_policy: &dhcp_present
+ cisco.mso.mso_schema_template_bd_dhcp_policy: &dhcp_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -152,17 +152,17 @@
check_mode: true
- name: Add DHCP policy in normal mode
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_present
register: nm_add_dhcp
- name: Add DHCP policy again in normal mode
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_present
register: nm_add_dhcp_again
- name: Add another DHCP policy in normal mode
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_present
name: ansible_test_dhcp_policy2
version: 1
@@ -173,14 +173,14 @@
- name: Add dhcp for query all (normal mode)
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_present
name: ansible_test_dhcp_policy3
version: 1
register: nm_add_dhcp3
- name: Verify cm_add_dhcp, nm_add_dhcp, nm_add_dhcp2 and nm_add_dhcp3
- assert:
+ ansible.builtin.assert:
that:
- cm_add_dhcp is changed
- nm_add_dhcp is changed
@@ -198,7 +198,7 @@
# CHANGE dhcp policies
- name: Change dhcp policy (normal mode)
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -211,7 +211,7 @@
register: nm_change_dhcp
- name: Verify nm_change_dhcp
- assert:
+ ansible.builtin.assert:
that:
- nm_change_dhcp is changed
- nm_change_dhcp.current.name == 'ansible_test_dhcp_policy1'
@@ -219,7 +219,7 @@
- nm_change_dhcp.current.dhcpOptionLabel.name == 'ansible_test_dhcp_policy_option2'
- name: Change dhcp policy again (normal mode)
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -233,7 +233,7 @@
- name: Verify nm_change_dhcp
- assert:
+ ansible.builtin.assert:
that:
- nm_change_dhcp_again is changed
- nm_change_dhcp_again.current.name == 'ansible_test_dhcp_policy1'
@@ -242,7 +242,7 @@
# QUERY ALL dhcp policies
- name: Query all dhcp (check_mode)
- mso_schema_template_bd_dhcp_policy: &dhcp_query
+ cisco.mso.mso_schema_template_bd_dhcp_policy: &dhcp_query
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -253,13 +253,13 @@
- name: Query all dhcp (normal mode)
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
register: nm_query_all_dhcp
- name: Verify query_all_dhcp
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_dhcp is not changed
- nm_query_all_dhcp is not changed
@@ -267,13 +267,13 @@
# QUERY a DHCP policy
- name: Query single dhcp
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
name: ansible_test_dhcp_policy1
register: nm_query_dhcp
- name: Verify nm_query_dhcp
- assert:
+ ansible.builtin.assert:
that:
- nm_query_dhcp is not changed
- nm_query_dhcp.current.name == 'ansible_test_dhcp_policy1'
@@ -282,7 +282,7 @@
# QUERY a non associated DHCP policy
- name: Query non associated dhcp
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
bd: ansible_test_2
name: ansible_test_dhcp_policy1
@@ -290,13 +290,13 @@
register: non_dhcp
- name: Verify non_dhcp
- assert:
+ ansible.builtin.assert:
that:
- non_dhcp.msg is match ("DHCP policy not associated with the bd")
# REMOVE DHCP policy
- name: Remove dhcp policy
- mso_schema_template_bd_dhcp_policy: &dhcp_absent
+ cisco.mso.mso_schema_template_bd_dhcp_policy: &dhcp_absent
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -306,26 +306,26 @@
register: nm_remove_dhcp
- name: Verify nm_remove_dhcp
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_dhcp is changed
- nm_remove_dhcp.current == {}
- name: Remove dhcp again (check_mode)
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_absent
register: nm_remove_dhcp_again
- name: Verify nm_remove_dhcp_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_dhcp_again is not changed
- nm_remove_dhcp_again.current == {}
# QUERY NON-EXISTING DHCP policy
- name: Query non-existing dhcp policy
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -339,14 +339,14 @@
register: nm_query_non_dhcp
- name: Verify nm_query_non_dhcp
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_dhcp is not changed
- nm_query_non_dhcp.msg is match ("DHCP policy 'non_policy' does not exist")
# QUERY NON-EXISTING DHCP policy option
- name: Query non-existing dhcp policy option
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -360,70 +360,70 @@
register: nm_query_non_dhcp_option
- name: Verify nm_query_non_dhcp
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_dhcp_option is not changed
- nm_query_non_dhcp_option.msg is match ("DHCP option policy 'non_option' does not exist")
# USE A NON-EXISTING STATE
- name: Non-existing state for dhcp
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_state is not changed
- nm_non_existing_state.msg is match ("value of state must be one of{{':'}} absent, present, query, got{{':'}} non-existing-state")
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for dhcp
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
schema: non-existing-schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_schema is not changed
- nm_non_existing_schema.msg is match ("Provided schema 'non-existing-schema' does not exist.")
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for dhcp
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
template: non-existing-template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_template is not changed
- nm_non_existing_template.msg is match ("Provided template 'non-existing-template' does not exist. Existing templates{{':'}} Template1")
# USE A NON-EXISTING BD
- name: Non-existing bd for dhcp
- mso_schema_template_bd_dhcp_policy:
+ cisco.mso.mso_schema_template_bd_dhcp_policy:
<<: *dhcp_query
bd: non-existing-bd
ignore_errors: true
register: nm_non_existing_bd
- name: Verify non_existing_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_bd is not changed
- nm_non_existing_bd.msg is match ("Provided BD 'non-existing-bd' does not exist. Existing BDs{{':'}} ansible_test_1")
# REMOVE Schemas for next CI Run
- name: Remove schemas for next ci test
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -433,7 +433,7 @@
# CLEAN UP DHCP Policies
- name: Ensure DHCP policies are removed
- mso_dhcp_relay_policy:
+ cisco.mso.mso_dhcp_relay_policy:
<<: *mso_info
dhcp_relay_policy: '{{ item }}'
tenant: ansible_test
@@ -444,7 +444,7 @@
- 'ansible_test_dhcp_policy3'
- name: Ensure DHCP option policies are removed
- mso_dhcp_option_policy:
+ cisco.mso.mso_dhcp_option_policy:
<<: *mso_info
dhcp_option_policy: '{{ item }}'
tenant: ansible_test
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_subnet/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_subnet/tasks/main.yml
index 75a3b4747..45d5612d6 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_bd_subnet/tasks/main.yml
@@ -6,14 +6,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -24,18 +24,18 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Set version vars
- set_fact:
- mso_l3mcast: false
+ ansible.builtin.set_fact:
+ cisco.mso.mso_l3mcast: false
when: version.current.version is version('2.2.4', '=')
- name: Ensure site exist
- mso_site: &site_present
+ cisco.mso.mso_site: &site_present
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -46,7 +46,7 @@
state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -55,7 +55,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
users:
@@ -65,7 +65,7 @@
state: present
- name: Ensure schema 1 with Template1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -73,7 +73,7 @@
state: present
- name: Ensure schema 2 with Template2 exists
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -81,7 +81,7 @@
state: present
- name: Ensure VRF exists
- mso_schema_template_vrf: &vrf_present
+ cisco.mso.mso_schema_template_vrf: &vrf_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -90,7 +90,7 @@
state: present
- name: Ensure VRF2 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template2
@@ -98,7 +98,7 @@
# ADD BD
- name: Add bd
- mso_schema_template_bd: &bd_present
+ cisco.mso.mso_schema_template_bd: &bd_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -120,7 +120,7 @@
state: present
- name: Add bd 2
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template2
@@ -141,7 +141,7 @@
version: 1
- name: Add bd
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -164,7 +164,7 @@
# Add subnet
- name: Add subnet in check mode
- mso_schema_template_bd_subnet: &subnet_present
+ cisco.mso.mso_schema_template_bd_subnet: &subnet_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -180,22 +180,22 @@
check_mode: true
- name: Add subnet (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_present
register: nm_add_subnet
- name: Add subnet again (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_present
register: nm_add_subnet_again
- name: Add subnet for query all (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_present
subnet: 2.16.0.1/24
- name: Verify cm_add_subnet and nm_add_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_add_subnet is changed
- nm_add_subnet is changed
@@ -214,7 +214,7 @@
- nm_add_subnet.current.querier == true
- name: Add subnet 2 (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template2
@@ -229,7 +229,7 @@
register: nm_add_subnet_2
- name: Verify nm_bd_2 for a version that's < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_2.current.ip == "10.1.1.1/24"
- nm_add_subnet_2.current.noDefaultGateway == false
@@ -239,7 +239,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_bd_2 for a version that's >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_2.current.ip == "10.1.1.1/24"
- nm_add_subnet_2.current.noDefaultGateway == false
@@ -251,7 +251,7 @@
# CHANGE Subnet
- name: Change subnet 2 (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template2
@@ -266,7 +266,7 @@
register: nm_change_subnet2
- name: Verify nm_change_subnet2 for a version < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet2 is not changed
- nm_change_subnet2.current.ip == "10.1.1.1/24"
@@ -277,7 +277,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_change_subnet2 for a version >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet2 is changed
- nm_change_subnet2.current.ip == "10.1.1.1/24"
@@ -289,7 +289,7 @@
when: version.current.version is version('3.1.1g', '>=')
- name: Change subnet2 again (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template2
@@ -304,7 +304,7 @@
register: nm_change_subnet2_again
- name: Verify nm_change_subnet2_again for a version that's < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet2_again is not changed
- nm_change_subnet2_again.current.ip == "10.1.1.1/24"
@@ -315,7 +315,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify cm_change_subnet2 for a version that's >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet2_again is not changed
- nm_change_subnet2_again.current.ip == "10.1.1.1/24"
@@ -328,7 +328,7 @@
# Primary parameter
- name: Add subnet 3 with primary and querier parameters (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -345,7 +345,7 @@
register: nm_add_subnet_3
- name: Verify nm_add_subnet_3 for a version that's < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_3.current.ip == "10.1.1.5/24"
- nm_add_subnet_3.current.noDefaultGateway == false
@@ -355,7 +355,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_add_subnet_3 for a version that's >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_3.current.ip == "10.1.1.5/24"
- nm_add_subnet_3.current.noDefaultGateway == false
@@ -368,7 +368,7 @@
# CHANGE Subnet
- name: Change subnet 3 (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -385,7 +385,7 @@
register: nm_change_subnet3
- name: Verify nm_change_subnet3 for a version < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet3 is not changed
- nm_change_subnet3.current.ip == "10.1.1.5/24"
@@ -396,7 +396,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_change_subnet2 for a version >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet3 is changed
- nm_change_subnet3.current.ip == "10.1.1.5/24"
@@ -409,7 +409,7 @@
when: version.current.version is version('3.1.1g', '>=')
- name: Change subnet3 again (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -426,7 +426,7 @@
register: nm_change_subnet3_again
- name: Verify nm_change_subnet2_again for a version that's < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet3_again is not changed
- nm_change_subnet3_again.current.ip == "10.1.1.5/24"
@@ -437,7 +437,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify cm_change_subnet2 for a version that's >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_change_subnet3_again is not changed
- nm_change_subnet3_again.current.ip == "10.1.1.5/24"
@@ -451,7 +451,7 @@
# QUERY ALL Subnets
- name: Query all subnet (check_mode)
- mso_schema_template_bd_subnet: &subnet_query
+ cisco.mso.mso_schema_template_bd_subnet: &subnet_query
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -461,12 +461,12 @@
register: cm_query_all_subnet
- name: Query all subnet (normal mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_query
register: nm_query_all_subnet
- name: Verify query_all_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_subnet is not changed
- nm_query_all_subnet is not changed
@@ -474,7 +474,7 @@
# QUERY A subnet
- name: Query subnet2
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template2
@@ -483,7 +483,7 @@
register: nm_query_subnet2
- name: Verify nm_query_subnet2 for a version that's < 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_subnet2 is not changed
- nm_query_subnet2.current.ip == "10.1.1.1/24"
@@ -494,7 +494,7 @@
when: version.current.version is version('3.1.1g', '<')
- name: Verify nm_query_subnet2 for a version that's >= 3.1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_subnet2 is not changed
- nm_query_subnet2.current.ip == "10.1.1.1/24"
@@ -507,7 +507,7 @@
# REMOVE Subnet
- name: Remove subnet
- mso_schema_template_bd_subnet: &subnet_absent
+ cisco.mso.mso_schema_template_bd_subnet: &subnet_absent
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -517,25 +517,25 @@
register: nm_remove_subnet
- name: Verify nm_remove_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_subnet is changed
- nm_remove_subnet.current == {}
- name: Remove subnet again (check_mode)
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_absent
register: nm_remove_subnet_again
- name: Verify nm_remove_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_subnet_again is not changed
- nm_remove_subnet_again.current == {}
# QUERY NON-EXISTING Subnet
- name: Query non-existing subnet
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_query
bd: ansible_test_1
subnet: 172.16.0.3/24
@@ -543,56 +543,56 @@
register: nm_query_non_subnet
- name: Verify nm_query_non_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_subnet is not changed
- nm_query_non_subnet.msg is match ("Subnet IP '172.16.0.3/24' not found")
# USE A NON-EXISTING STATE
- name: Non-existing state for subnet
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_state is not changed
- nm_non_existing_state.msg is match ("value of state must be one of{{':'}} absent, present, query, got{{':'}} non-existing-state")
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for subnet
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_query
schema: non-existing-schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_schema is not changed
- nm_non_existing_schema.msg is match ("Provided schema 'non-existing-schema' does not exist.")
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for subnet
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_query
template: non-existing-template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_template is not changed
- nm_non_existing_template.msg is match ("Provided template 'non-existing-template' does not exist. Existing templates{{':'}} Template1")
# USE NON-EXISTING OPTIONS
- name: Add subnet with no description
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -602,26 +602,26 @@
register: nm_add_subnet_no_desc
- name: Verify nm_add_subnet_no_desc
- assert:
+ ansible.builtin.assert:
that:
- nm_add_subnet_no_desc.current.description == "172.16.0.5/24"
# USE A NON-EXISTING BD
- name: Non-existing bd for subnet
- mso_schema_template_bd_subnet:
+ cisco.mso.mso_schema_template_bd_subnet:
<<: *subnet_query
bd: non-existing-bd
ignore_errors: true
register: nm_non_existing_bd
- name: Verify non_existing_bd
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_bd is not changed
- nm_non_existing_bd.msg is match ("Provided BD 'non-existing-bd' does not exist. Existing BDs{{':'}} ansible_test_1")
- name: Remove schemas for next ci test
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_clone/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_clone/tasks/main.yml
index 0039a9b02..1128a3ee8 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_clone/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_clone/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,7 +21,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -37,7 +37,7 @@
- Schema2
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -47,7 +47,7 @@
state: present
- name: Ensure user is defined under common tenant
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: common
users:
@@ -100,7 +100,7 @@
- { schema: 'Schema2', template: 'Template3', epg: 'ansible_test_3' }
- name: Add Selector to EPG (normal_mode)
- mso_schema_template_anp_epg_selector:
+ cisco.mso.mso_schema_template_anp_epg_selector:
<<: *mso_info
schema: 'Schema1'
template: Template1
@@ -176,7 +176,7 @@
register: add_template_tenant
- name: Verify add_templates
- assert:
+ ansible.builtin.assert:
that:
- cm_add_template is not changed
- add_template is changed
@@ -205,7 +205,7 @@
register: non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- non_existing_template is not changed
- non_existing_template.msg == "Source template with the name 'non_existing_template' does not exist."
@@ -222,7 +222,7 @@
register: non_existing_source_schema
- name: Verify non_existing_source_schema
- assert:
+ ansible.builtin.assert:
that:
- non_existing_source_schema is not changed
- non_existing_source_schema.msg == "Schema with the name 'non_existing_schema' does not exist."
@@ -241,7 +241,7 @@
register: non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- non_existing_schema is not changed
- non_existing_schema.msg == "Schema with the name 'non_existing_schema' does not exist."
@@ -256,7 +256,7 @@
register: wrong_template_name
- name: Verify wrong_template_name
- assert:
+ ansible.builtin.assert:
that:
- wrong_template_name is not changed
- wrong_template_name.msg == "Source and destination templates in the same schema cannot have same names."
@@ -272,7 +272,7 @@
register: template_already_exist
- name: Verify template_already_exist
- assert:
+ ansible.builtin.assert:
that:
- template_already_exist is not changed
- template_already_exist.msg == "Template with the name 'Template2' already exists. Please use another name."
@@ -288,6 +288,6 @@
- Schema1
- name: Verify rm_schema
- assert:
+ ansible.builtin.assert:
that:
- rm_schema is changed \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_filter/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_filter/tasks/main.yml
index 08f6d5cf5..9236b1b58 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_filter/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_filter/tasks/main.yml
@@ -9,14 +9,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -27,25 +27,25 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schema 2
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
state: absent
- name: Remove schema 1
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: absent
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
users:
@@ -53,7 +53,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -61,13 +61,13 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
template: Template 2
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -86,7 +86,7 @@
register: add_filter
- name: Ensure Filter2 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *filter_present
template: Template 2
filter: Filter2
@@ -94,7 +94,7 @@
state: present
- name: Ensure Filter3 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *filter_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -103,28 +103,28 @@
state: present
- name: Ensure Filter4 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *filter_present
filter: Filter4
entry: Filter4Entry
state: present
- name: Ensure Filter5 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *filter_present
filter: Filter5
entry: Filter5Entry
state: present
- name: Ensure Filter-6 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *filter_present
filter: Filter-6
entry: Filter-6Entry
state: present
- name: Ensure Contract_1 contract does not exist
- mso_schema_template_contract_filter: &contract_present
+ cisco.mso.mso_schema_template_contract_filter: &contract_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -135,14 +135,14 @@
state: absent
- name: Ensure Contract_2 contract does not exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
template: Template 2
contract: Contract2
state: absent
- name: Ensure Contract_3 contract does not exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -150,26 +150,26 @@
state: absent
- name: Ensure Contract_4 contract does not exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
state: absent
- name: Ensure Contract_5 contract does not exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract5
state: absent
- name: Ensure Contract_6 contract does not exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract-6
state: absent
# ADD CONTRACT
- name: Add contract (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
filter: Filter1
@@ -178,7 +178,7 @@
register: cm_add_contract
- name: Verify cm_add_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract is changed
- cm_add_contract.previous == {}
@@ -186,7 +186,7 @@
- cm_add_contract.current.filterRef.templateName == "Template1"
- name: Add contract (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
filter: Filter1
@@ -194,7 +194,7 @@
register: nm_add_contract
- name: Verify nm_add_contract
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract is changed
- nm_add_contract.previous == {}
@@ -203,7 +203,7 @@
- cm_add_contract.current.filterRef.schemaId == nm_add_contract.current.filterRef.schemaId
- name: Add contract again (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
filter: Filter1
@@ -212,7 +212,7 @@
register: cm_add_contract_again
- name: Verify cm_add_contract_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract_again is not changed
- cm_add_contract_again.current.filterRef.filterName == "Filter1"
@@ -222,7 +222,7 @@
- cm_add_contract_again.previous.filterRef.schemaId == cm_add_contract_again.current.filterRef.schemaId
- name: Add contract again (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
filter: Filter1
@@ -230,7 +230,7 @@
register: nm_add_contract_again
- name: Verify nm_add_contract_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_again is not changed
- nm_add_contract_again.current.filterRef.filterName == "Filter1"
@@ -241,7 +241,7 @@
- nm_add_contract_again.previous.filterRef.schemaId == nm_add_contract_again.current.filterRef.schemaId
- name: Add Contract2 (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
template: Template 2
contract: Contract2
@@ -252,14 +252,14 @@
register: cm_add_contract_2
- name: Verify cm_add_contract_2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract_2 is changed
- cm_add_contract_2.current.filterRef.filterName == "Filter1"
- cm_add_contract_2.current.filterRef.templateName == "Template1"
- name: Add Contract2 (nomal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
template: Template 2
contract: Contract2
@@ -269,7 +269,7 @@
register: nm_add_contract_2
- name: Verify nm_add_contract_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_2 is changed
- nm_add_contract_2.current.filterRef.filterName == "Filter1"
@@ -277,7 +277,7 @@
- cm_add_contract_2.current.filterRef.schemaId == nm_add_contract_2.current.filterRef.schemaId
- name: Add Contract3 (nomal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -289,14 +289,14 @@
register: nm_add_contract_3
- name: Verify nm_add_contract_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_3 is changed
- nm_add_contract_3.current.filterRef.filterName == "Filter1"
- nm_add_contract_3.current.filterRef.templateName == "Template1"
- name: Add Contract4 (nomal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -305,7 +305,7 @@
register: nm_add_contract_4
- name: Verify nm_add_contract_4
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_4 is changed
- nm_add_contract_4.current.filterRef.filterName == "Filter1"
@@ -314,7 +314,7 @@
# create CONTRACT FILTER with diff options
- name: Add Contract filter to both-way(check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
contract_filter_type: both-way
@@ -325,7 +325,7 @@
register: cm_add_contract_filter_both_way
- name: Add Contract filter to both-way(normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
contract_filter_type: both-way
@@ -335,7 +335,7 @@
register: nm_add_contract_filter_both_way
- name: Verify cm_change_contract_filter_both_way
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract_filter_both_way is changed
- nm_add_contract_filter_both_way is changed
@@ -352,7 +352,7 @@
- cm_add_contract_filter_both_way.current.filterType == "both-way"
- name: Change Contract type one_way Filter type consumer-to-provider(normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract5
contract_filter_type: one-way
@@ -362,7 +362,7 @@
register: nm_one_way_and_consumer_to_provider
- name: Verify nm_one_way_and_consumer_to_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_one_way_and_consumer_to_provider is changed
- nm_one_way_and_consumer_to_provider.previous == {}
@@ -372,7 +372,7 @@
- nm_one_way_and_consumer_to_provider.current.filterType == "consumer-to-provider"
- name: Change Contract type one_way Filter type provider-to-consumer(normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract-6
contract_filter_type: one-way
@@ -382,7 +382,7 @@
register: nm_one_way_and_provider_to_consumer
- name: Verify nm create contract filter with different type
- assert:
+ ansible.builtin.assert:
that:
- nm_one_way_and_provider_to_consumer is changed
- nm_one_way_and_provider_to_consumer.current.contractFilterType == "oneWay"
@@ -392,7 +392,7 @@
# change contract display name
- name: change contract display name
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -401,7 +401,7 @@
register: nm_change_display_name
- name: Verify nm_change_display_name
- assert:
+ ansible.builtin.assert:
that:
- nm_change_display_name is changed
- nm_change_display_name.current.displayName == "newDisplayContract4"
@@ -409,7 +409,7 @@
# change contract filter_directives to log
- name: change contract filter_directives to log(check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -419,7 +419,7 @@
register: cm_change_filter_directives_log
- name: change contract filter_directives to log(normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -428,7 +428,7 @@
register: nm_change_filter_directives_log
- name: Verify change_contract_filter_directives to log
- assert:
+ ansible.builtin.assert:
that:
- cm_change_filter_directives_log is changed
- nm_change_filter_directives_log is changed
@@ -438,7 +438,7 @@
- nm_change_filter_directives_log.current.directives[0] == "log"
- name: change contract filter_directives to log and none(normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -447,7 +447,7 @@
register: nm_change_filter_directives_log_and_none
- name: Verify nm_change_filter_directives_log_and_none
- assert:
+ ansible.builtin.assert:
that:
- nm_change_filter_directives_log_and_none is changed
- nm_change_filter_directives_log_and_none.previous.directives[0] == "log"
@@ -455,7 +455,7 @@
# change contract filter_directives to policy_compression
- name: change contract filter_directives to policy_compression (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -465,7 +465,7 @@
register: cm_change_filter_directives_pc
- name: change contract filter_directives to policy_compression (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -474,7 +474,7 @@
register: nm_change_filter_directives_pc
- name: Verify change_contract_filter_directives to pc
- assert:
+ ansible.builtin.assert:
that:
- cm_change_filter_directives_pc is changed
- nm_change_filter_directives_pc is changed
@@ -484,7 +484,7 @@
- nm_change_filter_directives_pc.current.directives[0] == "no_stats"
- name: change contract filter_directives to log, none, policy compression (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract4
filter: Filter1
@@ -493,14 +493,14 @@
register: nm_change_filter_directives_log_and_none_pc
- name: Verify nm_change_filter_directives_log_and_none_pc
- assert:
+ ansible.builtin.assert:
that:
- nm_change_filter_directives_log_and_none_pc is changed
- nm_change_filter_directives_log_and_none_pc.previous.directives[0] == "no_stats"
- nm_change_filter_directives_log_and_none_pc.current.directives == ["log", "none", "no_stats"]
- name: Change Contract1 scope to global (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
contract_scope: global
@@ -508,14 +508,14 @@
register: nm_change_contract_scope_global
- name: Verify nm_change_contract_scope_global
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_scope_global is changed
- nm_change_contract_scope_global.current.contractScope == "global"
- nm_change_contract_scope_global.previous.contractScope == "context"
- name: Change Contract1 scope to tenant(normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
contract_scope: tenant
@@ -523,14 +523,14 @@
register: nm_change_contract_scope_tenant
- name: Verify nm_change_contract_scope_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_scope_tenant is changed
- nm_change_contract_scope_tenant.previous.contractScope == "global"
- nm_change_contract_scope_tenant.current.contractScope == "tenant"
- name: Change Contract1 scope application_profile(normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
contract_scope: application-profile
@@ -538,14 +538,14 @@
register: nm_change_contract_scope_application_profile
- name: Verify nm_change_contract_scope_application_profile
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_scope_application_profile is changed
- nm_change_contract_scope_application_profile.previous.contractScope == "tenant"
- nm_change_contract_scope_application_profile.current.contractScope == "application-profile"
- name: Change Contract1 scope to vrf(normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
contract_scope: vrf
@@ -553,28 +553,28 @@
register: nm_change_contract_scope_vrf
- name: Verify nm_change_contract_scope_vrf
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_scope_vrf is changed
- nm_change_contract_scope_vrf.current.contractScope == "context"
- nm_change_contract_scope_vrf.previous.contractScope == "application-profile"
- name: Change Contract1 scope to default(normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
state: present
register: nm_change_contract_scope_default
- name: Verify nm_change_contract_scope_default
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_scope_default is not changed
- nm_change_contract_scope_default.current.contractScope == "context"
- nm_change_contract_scope_default.previous.contractScope == "context"
- name: Change Contract1 description (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
description: changed description
@@ -583,7 +583,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_change_contract_description
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_description is changed
- nm_change_contract_description.current.description == "changed description"
@@ -591,7 +591,7 @@
when: version.current.version is version('3.3', '>=')
- name: Change Contract1 description empty (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
description: ""
@@ -600,7 +600,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_change_contract_description_empty
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_description_empty is changed
- nm_change_contract_description_empty.current.description == ""
@@ -608,7 +608,7 @@
when: version.current.version is version('3.3', '>=')
- name: Change Contract1 qos_level (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
qos_level: level1
@@ -617,14 +617,14 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_change_contract_qos_level
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_qos is changed
- nm_change_contract_qos.current.prio == "level1"
when: version.current.version is version('3.3', '>=')
- name: Change Contract1 qos_level unspecified (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
qos_level: unspecified
@@ -633,7 +633,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_change_contract_qos_level_unspecified
- assert:
+ ansible.builtin.assert:
that:
- nm_change_contract_qos_unspecified is changed
- nm_change_contract_qos_unspecified.current.prio == "unspecified"
@@ -641,7 +641,7 @@
when: version.current.version is version('3.3', '>=')
- name: Ensure contract filter_type set to both-way (normal mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
filter: Filter1
@@ -651,7 +651,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_contract_filter_both_way
- assert:
+ ansible.builtin.assert:
that:
- nm_contract_filter_both_way.current.contractFilterType == "bothWay"
- nm_contract_filter_both_way.current.filterType == "both-way"
@@ -660,7 +660,7 @@
- name: Change contract filter_type set to one-way with consumer-to-provider (normal mode)
# Test to check that filter type cannot be changed from two-way to one-way type
# changed behaviour due to error handling is now handled in code
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
contract: Contract1
filter: Filter1
@@ -671,14 +671,14 @@
when: version.current.version is version('3.3', '>=')
- name: Verify nm_contract_filter_consumer_to_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_contract_filter_consumer_to_provider.msg == "Current filter type 'bothWay' for contract 'Contract1' is not allowed to change to 'oneWay'."
when: version.current.version is version('3.3', '>=')
# QUERY ALL CONTRACT
- name: Query Contract1 filters (check_mode)
- mso_schema_template_contract_filter: &Contract_query
+ cisco.mso.mso_schema_template_contract_filter: &Contract_query
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -694,19 +694,19 @@
register: cm_contract1_query_result
- name: Query Contract1 filters (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
register: nm_contract1_query_result
- name: Verify query_contract_1
- assert:
+ ansible.builtin.assert:
that:
- cm_contract1_query_result is not changed
- nm_contract1_query_result is not changed
- cm_contract1_query_result.current | length == nm_contract1_query_result.current | length == 2
- name: Query Contract2 filters (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -715,7 +715,7 @@
register: nm_contract2_query_result
- name: Query Contract3 filters (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -723,7 +723,7 @@
register: nm_contract3_query_result
- name: Query Contract4 filters (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -731,7 +731,7 @@
register: nm_contract4_query_result
- name: Query Contract5 filters (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -741,7 +741,7 @@
register: nm_contract5_query_result
- name: Query Contract-6 filters (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -751,7 +751,7 @@
register: nm_contract6_query_result
- name: Verify query_contract
- assert:
+ ansible.builtin.assert:
that:
- nm_contract2_query_result is not changed
- nm_contract3_query_result is not changed
@@ -764,7 +764,7 @@
# QUERY A SPECIFIC CONTRACT FILTER
- name: Query Contract1 Filter1 (check_mode)
- mso_schema_template_contract_filter: &Contract_filter_query
+ cisco.mso.mso_schema_template_contract_filter: &Contract_filter_query
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -781,7 +781,7 @@
register: cm_contract1_filter1_query_result
- name: Query Contract1 Filter4 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_filter_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -791,7 +791,7 @@
register: nm_contract1_filter4_query_result
- name: Query Contract2 Filter1 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_filter_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -802,7 +802,7 @@
register: nm_contract2_filter1_query_result
- name: Query Contract3 Filter1 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_filter_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -814,7 +814,7 @@
register: nm_contract3_filter1_query_result
- name: Query Contract4 Filter1 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_filter_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -824,7 +824,7 @@
register: nm_contract4_filter1_query_result
- name: Query Contract5 Filter5 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_filter_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -836,7 +836,7 @@
register: nm_contract5_filter5_query_result
- name: Query Contract-6 Filter-6 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_filter_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -848,7 +848,7 @@
register: nm_contract6_filter6_query_result
- name: Verify contract1_filter1_query_result
- assert:
+ ansible.builtin.assert:
that:
- cm_contract1_filter1_query_result is not changed
- nm_contract1_filter4_query_result is not changed
@@ -860,7 +860,7 @@
# REMOVE CONTRACT Filter
- name: Remove contract1 filter1 (check_mode)
- mso_schema_template_contract_filter: &contract1_filter1_absent
+ cisco.mso.mso_schema_template_contract_filter: &contract1_filter1_absent
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -877,7 +877,7 @@
register: cm_remove_contract1_filter1
- name: Verify cm_remove_contract1_filter1
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_contract1_filter1 is changed
- cm_remove_contract1_filter1.current == {}
@@ -885,12 +885,12 @@
- cm_remove_contract1_filter1.previous.filterRef.templateName == "Template1"
- name: Remove contract1 filter1 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract1_filter1_absent
register: nm_remove_contract1_filter1
- name: Verify nm_remove_contract1_filter1
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract1_filter1 is changed
- nm_remove_contract1_filter1.current == {}
@@ -898,38 +898,38 @@
- nm_remove_contract1_filter1.previous.filterRef.templateName == "Template1"
- name: Remove contract1 filter1 again (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract1_filter1_absent
check_mode: true
register: cm_remove_contract1_filter1_again
- name: Verify cm_remove_contract1_filter1_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_contract1_filter1_again is not changed
- cm_remove_contract1_filter1_again.current == {}
- cm_remove_contract1_filter1_again.previous == {}
- name: Remove contract1 filter1 again (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract1_filter1_absent
register: nm_remove_contract1_filter1_again
- name: Verify nm_remove_contract1_filter1_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract1_filter1_again is not changed
- nm_remove_contract1_filter1_again.current == {}
- nm_remove_contract1_filter1_again.previous == {}
- name: Remove contract1 filter4 (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract1_filter1_absent
filter: Filter4
register: nm_remove_contract1_filter4
- name: Verify nm_remove_contract1_filter4
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract1_filter4 is changed
- nm_remove_contract1_filter4.current == {}
@@ -937,20 +937,20 @@
- nm_remove_contract1_filter4.previous.filterRef.templateName == "Template1"
- name: Remove contract1 filter4 again (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract1_filter1_absent
filter: Filter4
register: nm_remove_contract1_filter4_again
- name: Verify nm_remove_contract1_filter4_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract1_filter4_again is not changed
- nm_remove_contract1_filter4_again.previous == nm_remove_contract1_filter4_again.current == {}
# QUERY NON-EXISTING FILTER
- name: Query non-existing filter (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -961,7 +961,7 @@
register: cm_query_non_filter
- name: Query non-existing filter (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -971,13 +971,13 @@
register: nm_query_non_filter
- name: Verify query_non_filter
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_filter is not changed
- nm_query_non_filter is not changed
- name: Add contract (for version greater than 3.3)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -992,7 +992,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify Add contract for version greater than 3.3
- assert:
+ ansible.builtin.assert:
that:
- add_contract is changed
- add_contract.current.action == "deny"
@@ -1001,7 +1001,7 @@
# # QUERY NON-EXISTING CONTRACT
- name: Query non-existing contract (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1011,7 +1011,7 @@
register: cm_query_non_contract
- name: Query non-existing contract (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1020,7 +1020,7 @@
register: nm_query_non_contract
- name: Verify query_non_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_contract is not changed
- nm_query_non_contract is not changed
@@ -1029,14 +1029,14 @@
when: version.current.version is version('3.3', '<')
- name: Verify query_non_contract when version greater than 3.3
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_contract.msg == nm_query_non_contract.msg == "Provided contract 'non-existing-contract' does not exist. Existing contracts{{':'}} Contract4, Contract5, Contract-6, Contract1"
when: version.current.version is version('3.3', '>=')
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for contrct (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
template: Template 1
schema: non-existing-schema
@@ -1045,7 +1045,7 @@
register: cm_query_non_schema
- name: Non-existing schema for contrct (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
template: Template 1
schema: non-existing-schema
@@ -1054,7 +1054,7 @@
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_schema is not changed
- nm_query_non_schema is not changed
@@ -1063,7 +1063,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for contract (check_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -1072,7 +1072,7 @@
register: cm_query_non_template
- name: Non-existing template for contract (normal_mode)
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *Contract_query
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -1080,7 +1080,7 @@
register: nm_query_non_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_template is not changed
- nm_query_non_template is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_service_graph/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_service_graph/tasks/main.yml
index 8bc3ce625..6c39668b6 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_service_graph/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_contract_service_graph/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,19 +22,19 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Remove schema 2
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
state: absent
- name: Remove schema 1
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: absent
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -42,7 +42,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -50,13 +50,13 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
template: Template 2
state: present
- name: Ensure schema 2 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -89,7 +89,7 @@
state: present
- name: Ensure Contract_1 contract exist
- mso_schema_template_contract_filter: &contract_present
+ cisco.mso.mso_schema_template_contract_filter: &contract_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -98,7 +98,7 @@
state: present
- name: Ensure Contract_2 contract exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -131,7 +131,7 @@
state: present
- name: Ensure VRF_1 vrf exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -140,7 +140,7 @@
state: present
- name: Ensure BD_1 bd exist
- mso_schema_template_bd: &bd_present
+ cisco.mso.mso_schema_template_bd: &bd_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -150,13 +150,13 @@
state: present
- name: Ensure BD_2 bd exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *bd_present
bd: BD2
state: present
- name: Ensure BD_3 bd exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -167,7 +167,7 @@
state: present
- name: Ensure AP1 in Template 1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -175,7 +175,7 @@
state: present
- name: Ensure AP1 in Template 1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -183,7 +183,7 @@
state: present
- name: Ensure EPG1 in AP1 in Template 1 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -194,7 +194,7 @@
state: present
- name: Ensure EPG2 in AP1 in Template 1 exists
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -205,7 +205,7 @@
state: present
- name: Add Contract1 to EPG1 provider
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -217,7 +217,7 @@
state: present
- name: Add Contract1 to EPG1 consumer
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -229,7 +229,7 @@
state: present
- name: Add Contract2 to EPG2 provider
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -241,7 +241,7 @@
state: present
- name: Add Contract2 to EPG2 consumer
- mso_schema_template_anp_epg_contract:
+ cisco.mso.mso_schema_template_anp_epg_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -255,7 +255,7 @@
# TESTS
- name: Add service graph 1 to Contract1 (check_mode)
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -271,7 +271,7 @@
register: cm_add_sg1_to_c1
- name: Add service graph 1 to Contract1
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -286,7 +286,7 @@
register: nm_add_sg1_to_c1
- name: Verify service graph 1 is added to Contract1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_sg1_to_c1 is changed
- cm_add_sg1_to_c1.previous == {}
@@ -312,7 +312,7 @@
- nm_add_sg1_to_c1.current.serviceNodesRelationship.1.serviceNodeRef.serviceNodeName == "load-balancer"
- name: Add service graph 1 to Contract1 again (check_mode)
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -328,7 +328,7 @@
register: cm_add_sg1_to_c1_again
- name: Add service graph 1 to Contract1 again
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -343,7 +343,7 @@
register: nm_add_sg1_to_c1_again
- name: Verify service graph 1 is added to Contract1 again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_sg1_to_c1_again is not changed
- cm_add_sg1_to_c1_again.previous.serviceGraphRef.serviceGraphName == "SG1"
@@ -367,7 +367,7 @@
- nm_add_sg1_to_c1_again.previous.serviceNodesRelationship.1.serviceNodeRef.serviceNodeName == "load-balancer"
- name: Change service graph 1 node to Contract1 (check_mode)
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -383,7 +383,7 @@
register: cm_change_sg1_to_c1
- name: Change service graph 1 node to Contract1
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -398,7 +398,7 @@
register: nm_change_sg1_to_c1
- name: Verify service graph 1 is added to Contract1 again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_sg1_to_c1 is changed
- cm_change_sg1_to_c1.current.serviceNodesRelationship.0.consumerConnector.bdRef.bdName == "BD2"
@@ -420,7 +420,7 @@
- nm_change_sg1_to_c1.previous.serviceNodesRelationship.0.providerConnector.connectorType == "general"
- name: Query service graph 1 to Contract1 (check_mode)
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -430,7 +430,7 @@
register: cm_query_sg1_to_c1
- name: Query service graph 1 to Contract1
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -440,7 +440,7 @@
register: nm_query_sg1_to_c1
- name: Verify queried service graph 1
- assert:
+ ansible.builtin.assert:
that:
- cm_query_sg1_to_c1 is not changed
- cm_query_sg1_to_c1.current.serviceNodesRelationship.0.consumerConnector.bdRef.bdName == "BD2"
@@ -458,7 +458,7 @@
- nm_query_sg1_to_c1.current.serviceNodesRelationship.0.providerConnector.connectorType == "general"
- name: Remove service graph 1 from Contract1 (check_mode)
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -469,7 +469,7 @@
register: cm_remove_sg1_from_c1
- name: Remove service graph 1 from Contract1
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -479,7 +479,7 @@
register: nm_remove_sg1_from_c1
- name: Verify service graph 1 is removed from Contract1
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_sg1_from_c1 is changed
- cm_remove_sg1_from_c1.current == {}
@@ -505,7 +505,7 @@
- nm_remove_sg1_from_c1.previous.serviceNodesRelationship.1.serviceNodeRef.serviceNodeName == "load-balancer"
- name: Add service graph 2 to Contract2 with BD in other schema (check_mode)
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -525,7 +525,7 @@
register: cm_add_sg2_to_c2
- name: Add service graph 2 to Contract2 with BD in other schema
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -544,7 +544,7 @@
register: nm_add_sg2_to_c2
- name: Verify service graph 2 is added to Contract2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_sg2_to_c2 is changed
- cm_add_sg2_to_c2.previous == {}
@@ -570,7 +570,7 @@
- nm_add_sg2_to_c2.current.serviceNodesRelationship.1.serviceNodeRef.serviceNodeName == "load-balancer"
- name: Query service graph 2 to Contract2 (check_mode)
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -580,7 +580,7 @@
register: cm_query_sg2_to_c2
- name: Query service graph 2 to Contract2
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -590,7 +590,7 @@
register: nm_query_sg2_to_c2
- name: Verify queried service graph 1
- assert:
+ ansible.builtin.assert:
that:
- cm_query_sg2_to_c2 is not changed
- cm_query_sg2_to_c2.current.serviceNodesRelationship.0.consumerConnector.bdRef.bdName == "BD1"
@@ -612,7 +612,7 @@
# NOT EXISTING INPUT
- name: Not existing template provided for absent
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template False
@@ -623,7 +623,7 @@
register: not_existing_template_input_absent
- name: Not existing contract provided for absent
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -634,7 +634,7 @@
register: not_existing_contract_input_absent
- name: Not existing service graph provided for absent
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -644,7 +644,7 @@
register: not_existing_service_graph_input_absent
- name: Not existing service graph provided for query
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -654,7 +654,7 @@
register: not_existing_service_graph_input_query
- name: Not existing template provided for present
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -671,7 +671,7 @@
register: not_existing_template_input_present
- name: Not existing service graph provided for present
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -688,7 +688,7 @@
register: not_existing_service_graph_input_present
- name: Verify non_existing_input
- assert:
+ ansible.builtin.assert:
that:
- not_existing_template_input_absent is not changed
- not_existing_template_input_absent.msg.startswith("Provided template")
@@ -704,7 +704,7 @@
# False input
- name: False service graph node amount provided ( less than 2 as provided in SG1 config )
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -718,7 +718,7 @@
register: nm_false_sg1_to_c1_less_than_2
- name: False service graph node amount provided ( more than 2 as provided in SG1 config )
- mso_schema_template_contract_service_graph:
+ cisco.mso.mso_schema_template_contract_service_graph:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -736,7 +736,7 @@
register: nm_false_sg1_to_c1_more_than_2
- name: Verify false_sg1_to_c1
- assert:
+ ansible.builtin.assert:
that:
- nm_false_sg1_to_c1_less_than_2 is not changed
- nm_false_sg1_to_c1_less_than_2.msg.startswith("Not enough service nodes defined")
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy/tasks/main.yml
index 58f043256..5e9a46801 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy/tasks/main.yml
@@ -4,7 +4,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy_status/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy_status/tasks/main.yml
index fce5cf8e8..34607bec5 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy_status/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_deploy_status/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3[0].txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,13 +22,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure site exist
- mso_site: &site_present
+ cisco.mso.mso_site: &site_present
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -39,7 +39,7 @@
state: present
- name: Ensure aws site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -50,7 +50,7 @@
state: present
- name: Undeploy templates if deployed to clean the environment before ndo 4.0
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: "{{ item }}"
@@ -76,7 +76,7 @@
# when: version.current.version is version('4.0', '>=')
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -85,7 +85,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -95,7 +95,7 @@
state: present
- name: Ensure schema 1 with Template 1, Template 2
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -106,7 +106,7 @@
- Template 2
- name: Add a new site to a schema with Template 1, Template 2
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -117,7 +117,7 @@
- Template 2
- name: Ensure VRF1 exists on Template1
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -125,7 +125,7 @@
state: present
- name: Ensure VRF2 exists on Template2
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -133,7 +133,7 @@
state: present
- name: Ensure ANP exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -141,7 +141,7 @@
state: present
- name: Ensure ANP2 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -149,7 +149,7 @@
state: present
- name: Check deployment status of Template 1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -157,7 +157,7 @@
register: status1_temp1
- name: Check deployment status of Template 2
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -165,7 +165,7 @@
register: status1_temp2
- name: Verify status after adding VRFs and ANPs
- assert:
+ ansible.builtin.assert:
that:
- status1_temp1.current[0].anps[0].state == 'created'
- status1_temp1.current[0].vrfs[0].state == 'created'
@@ -173,7 +173,7 @@
- status1_temp2.current[0].vrfs[0].state == 'created'
- name: Check deployment status by querying site
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -181,7 +181,7 @@
register: status_site
- name: Check deployment status by querying site and Template1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -190,7 +190,7 @@
register: status_site_temp1
- name: Check deployment status by querying site and Template2
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -199,7 +199,7 @@
register: status_site_temp2
- name: Verify status after querying site before deployment
- assert:
+ ansible.builtin.assert:
that:
- status_site.current | length == 2
- status_site_temp1.current.anps[0].state == 'created'
@@ -209,7 +209,7 @@
- name: Ensure ansible_test_1 BD exists
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -220,7 +220,7 @@
state: present
- name: Ensure ansible_test_2 BD exists
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -231,7 +231,7 @@
state: present
- name: Add EPG to Template 1
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -244,7 +244,7 @@
state: present
- name: Add EPG to Template 2
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -257,7 +257,7 @@
state: present
- name: Check deployment status of Template 1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -265,7 +265,7 @@
register: status2_temp1
- name: Check deployment status of Template 2
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -273,7 +273,7 @@
register: status2_temp2
- name: Verify status after adding BDs and EPGs
- assert:
+ ansible.builtin.assert:
that:
- status2_temp1.current[0].bds[0].state == 'created'
- status2_temp1.current[0].anps[0].epgs[0].state == 'created'
@@ -281,7 +281,7 @@
- status2_temp2.current[0].anps[0].epgs[0].state == 'created'
- name: Add VRF3 exists to Template1
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -289,7 +289,7 @@
state: present
- name: Add ansible_test_3 BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -300,7 +300,7 @@
state: present
- name: Check deployment status of Template 1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -308,18 +308,18 @@
register: status3_temp1
- name: Verify status after adding new BD and VRF and changing EPG1
- assert:
+ ansible.builtin.assert:
that:
- status3_temp1.current[0].bds[0].state == 'created'
- status3_temp1.current[0].vrfs[0].state == 'created'
# mso_schema_template_deploy is deprecated in MSO/NDO v4.0+, different api endpoint thus different module
-# when new module created, remove block and do execution for each mso_schema_template_deploy tasks
+# when new module created, remove block and do execution for each cisco.mso.mso_schema_template_deploy tasks
- name: Execute tasks only for MSO version < 4.0
when: version.current.version is version('4.0', '<')
block:
- name: Deploy templates
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: "{{ item }}"
@@ -331,7 +331,7 @@
- Template 2
- name: Change EPG
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -344,7 +344,7 @@
state: present
- name: Check deployment status of Template 1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -352,12 +352,12 @@
register: status_change_temp1
- name: Verify status after changing EPG
- assert:
+ ansible.builtin.assert:
that:
- status_change_temp1.current[0].anps[0].epgs[0].state == 'modified'
- name: Delete ansible_test_1 BD
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -368,7 +368,7 @@
state: absent
- name: Delete VRF1
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -376,7 +376,7 @@
state: absent
- name: Check deployment status of Template 1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -384,7 +384,7 @@
register: status4_temp1
- name: Verify status after deleting VRF1
- assert:
+ ansible.builtin.assert:
that:
- status4_temp1.current[0].bds[0].state == 'deleted'
- status4_temp1.current[0].vrfs[0].state == 'deleted'
@@ -392,7 +392,7 @@
- name: Try deploy and check results
block:
- name: Deploy templates Template 1
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -400,7 +400,7 @@
state: deploy
- name: Check deployment status of Template 1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -408,31 +408,31 @@
register: status5_temp1
- name: Increment the retry count
- set_fact:
+ ansible.builtin.set_fact:
retry_count: "{{ 0 if retry_count is undefined else retry_count | int + 1 }}"
rescue:
- - fail:
+ - ansible.builtin.fail:
msg: Status5_temp1 correct value retrieved continuing
when:
- status5_temp1.current[0] is defined
- status5_temp1.current[0].anps == []
- - fail:
+ - ansible.builtin.fail:
msg: Maximum retries of deploy and check group for status5_temp1 reached
when: retry_count | int == 10
- - debug:
+ - ansible.builtin.debug:
msg: "Deploy and check group for status5_temp1 failed, let's give it another shot"
- name: Reset the retry count
- set_fact:
+ ansible.builtin.set_fact:
retry_count:
- name: Try deploy and check results
block:
- name: Deploy templates Template 2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -440,7 +440,7 @@
state: deploy
- name: Check deployment status of Template 2
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -448,25 +448,25 @@
register: status5_temp2
- name: Increment the retry count
- set_fact:
+ ansible.builtin.set_fact:
retry_count: "{{ 0 if retry_count is undefined else retry_count | int + 1 }}"
rescue:
- - fail:
+ - ansible.builtin.fail:
msg: status5_temp2 correct value retrieved continuing
when:
- status5_temp2.current[0] is defined
- status5_temp2.current[0].anps == []
- - fail:
+ - ansible.builtin.fail:
msg: Maximum retries of deploy and check group for status5_temp2 reached
when: retry_count | int == 10
- - debug:
+ - ansible.builtin.debug:
msg: "Deploy and check group for status5_temp2 failed, let's give it another shot"
- name: Verify status after deploying Templates to site
- assert:
+ ansible.builtin.assert:
that:
- status5_temp1.current[0].anps == []
- status5_temp1.current[0].bds == []
@@ -476,19 +476,19 @@
- status5_temp2.current[0].vrfs == []
- name: Check status of all templates
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
register: all_templates
- name: Verify all
- assert:
+ ansible.builtin.assert:
that:
- all_templates.current.policyStates | length == 2
- name: Check deployment status by querying site
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -496,13 +496,13 @@
register: status2_site
- name: Reset the retry count
- set_fact:
+ ansible.builtin.set_fact:
retry_count:
- name: Try deploy and check results for a site and Template1
block:
- name: Deploy templates Template1
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -510,7 +510,7 @@
state: deploy
- name: Check deployment status by querying site and Template1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -519,27 +519,27 @@
register: status2_site_temp1
- name: Increment the retry count
- set_fact:
+ ansible.builtin.set_fact:
retry_count: "{{ 0 if retry_count is undefined else retry_count | int + 1 }}"
rescue:
- - fail:
+ - ansible.builtin.fail:
msg: status2_site_temp1 correct value retrieved continuing
when:
- status2_site_temp1.current is defined
- status2_site_temp1.current.anps == []
- - fail:
+ - ansible.builtin.fail:
msg: Maximum retries of deploy and check group for status2_site_temp1 reached
when: retry_count | int == 10
- - debug:
+ - ansible.builtin.debug:
msg: "Deploy and check group for status2_site_temp1 failed, let's give it another shot"
- name: Try deploy and check results for a site and Template2
block:
- name: Deploy templates Template2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -547,7 +547,7 @@
state: deploy
- name: Check deployment status by querying site and Template2
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template2
@@ -556,25 +556,25 @@
register: status2_site_temp2
- name: Increment the retry count
- set_fact:
+ ansible.builtin.set_fact:
retry_count: "{{ 0 if retry_count is undefined else retry_count | int + 1 }}"
rescue:
- - fail:
+ - ansible.builtin.fail:
msg: status2_site_temp2 correct value retrieved continuing
when:
- status2_site_temp2.current is defined
- status2_site_temp2.current.anps == []
- - fail:
+ - ansible.builtin.fail:
msg: Maximum retries of deploy and check group for status2_site_temp2 reached
when: retry_count | int == 10
- - debug:
+ - ansible.builtin.debug:
msg: "Deploy and check group for status2_site_temp2 failed, let's give it another shot"
- name: Verify status after querying site post deployment
- assert:
+ ansible.builtin.assert:
that:
- status2_site.current | length == 2
- status2_site_temp1.current.anps == []
@@ -585,7 +585,7 @@
- status2_site_temp2.current.vrfs == []
- name: Check deployment status by querying site and non associated Template 1
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -595,12 +595,12 @@
register: status_site_temp3
- name: Verify status after querying site with non associated Template 1
- assert:
+ ansible.builtin.assert:
that:
- status_site_temp3.msg == "Provided Template 'Template1' not associated with Site 'aws_ansible_test'."
- name: Check Non-existing schema
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: non-existing-schema
state: query
@@ -608,12 +608,12 @@
register: non_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- non_schema.msg == "Schema 'non-existing-schema' not found."
- name: Check deployment status of non-existing-template
- mso_schema_template_deploy_status:
+ cisco.mso.mso_schema_template_deploy_status:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -622,6 +622,6 @@
register: non_temp
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- non_temp.msg == "Template 'non-existing-template' not found." \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg/tasks/main.yml
index e76869456..e2f094754 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg/tasks/main.yml
@@ -7,14 +7,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -25,7 +25,7 @@
output_level: '{{ mso_output_level | default("info") }}'
# - name: Ensure site exist
-# mso_site: &site_present
+# cisco.mso.mso_site: &site_present
# host: '{{ mso_hostname }}'
# username: '{{ mso_username }}'
# password: '{{ mso_password }}'
@@ -42,13 +42,13 @@
# state: present
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Undeploy templates if deployed from previous test case
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: "{{ item }}"
@@ -60,7 +60,7 @@
- Template 2
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -69,7 +69,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -79,7 +79,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -87,7 +87,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -95,7 +95,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -103,7 +103,7 @@
state: present
- name: Ensure Filter 1 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -112,7 +112,7 @@
state: present
- name: Ensure Contract1 exist
- mso_schema_template_contract_filter: &contract_present
+ cisco.mso.mso_schema_template_contract_filter: &contract_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -123,7 +123,7 @@
state: present
- name: Ensure Filter 2 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -132,7 +132,7 @@
state: present
- name: Ensure Contract2 exist
- mso_schema_template_contract_filter: &contract2_present
+ cisco.mso.mso_schema_template_contract_filter: &contract2_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -143,7 +143,7 @@
state: present
- name: Ensure VRF exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -152,7 +152,7 @@
state: present
- name: Ensure VRF2 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -160,7 +160,7 @@
state: present
- name: Ensure VRF3 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -168,7 +168,7 @@
state: present
- name: Ensure VRF4 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -176,7 +176,7 @@
state: present
- name: Ensure L3out exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -186,7 +186,7 @@
state: present
- name: Ensure L3out2 exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -196,7 +196,7 @@
state: present
- name: Ensure L3out3 exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -208,7 +208,7 @@
state: present
- name: Ensure L3out4 exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -220,7 +220,7 @@
state: present
- name: Ensure ANP exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -228,7 +228,7 @@
state: present
- name: Ensure ANP2 exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -236,7 +236,7 @@
state: present
- name: Ensure ANP3 exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -244,7 +244,7 @@
state: present
- name: Ensure ANP4 exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -252,7 +252,7 @@
state: present
- name: Ensure ansible_test_1 external EPG does not exist
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -260,7 +260,7 @@
state: absent
- name: Ensure ansible_test_2 external EPG does not exist
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -268,7 +268,7 @@
state: absent
- name: Ensure ansible_test_3 external EPG does not exist
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -276,7 +276,7 @@
state: absent
- name: Ensure ansible_test_4 external EPG does not exist
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -284,7 +284,7 @@
state: absent
- name: Ensure ansible_test_6 external EPG does not exist
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -292,7 +292,7 @@
state: absent
- name: Ensure ansible_test_7 external EPG does not exist
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -301,7 +301,7 @@
# ADD external EPG
- name: Add external EPG (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -313,7 +313,7 @@
register: cm_add_epg
- name: Verify cm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg is changed
- cm_add_epg.previous == {}
@@ -322,7 +322,7 @@
- cm_add_epg.current.vrfRef.vrfName == "VRF"
- name: Add external EPG (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -333,7 +333,7 @@
register: nm_add_epg
- name: Verify nm_add_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg is changed
- nm_add_epg.previous == {}
@@ -343,7 +343,7 @@
- cm_add_epg.current.vrfRef.schemaId == nm_add_epg.current.vrfRef.schemaId
- name: Add external EPG again (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -357,7 +357,7 @@
register: cm_add_epg_again
- name: Verify cm_add_epg_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg_again is not changed
- cm_add_epg_again.previous.name == "ansible_test_1"
@@ -370,7 +370,7 @@
- name: Add epg again (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -383,7 +383,7 @@
register: nm_add_epg_again
- name: Verify nm_add_epg_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_again is not changed
- nm_add_epg_again.previous.name == "ansible_test_1"
@@ -395,7 +395,7 @@
- nm_add_epg_again.previous.vrfRef.schemaId == nm_add_epg_again.current.vrfRef.schemaId
- name: Add external EPG 2(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -412,7 +412,7 @@
register: nm_add_epg_2
- name: Add external EPG 3 (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -429,7 +429,7 @@
register: nm_add_epg_3
- name: Add external EPG 4 (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -440,7 +440,7 @@
register: nm_add_epg_4
- name: Verify nm_add_epg_2 and nm_add_epg_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_2 is changed
- nm_add_epg_3 is changed
@@ -454,7 +454,7 @@
- nm_add_epg_3.current.vrfRef.schemaId != nm_add_epg.current.vrfRef.schemaId
- name: Add external EPG 5 (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -471,13 +471,13 @@
register: nm_add_epg_5
- name: Verify nm_add_epg_5
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_5 is changed
- nm_add_epg_5.current.name == "ansible_test_5"
- name: Add external EPG 5 again with L3Out (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -498,13 +498,13 @@
register: nm_add_epg_5_again
- name: Verify nm_add_epg_5_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_5_again is changed
- nm_add_epg_5_again.current.name == "ansible_test_5"
- name: Add external EPG 6 with external epg type cloud (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -522,7 +522,7 @@
register: nm_add_epg_6
- name: Verify nm_add_epg_6
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_6 is changed
- nm_add_epg_6.current.name == "ansible_test_6"
@@ -531,7 +531,7 @@
- nm_add_epg_6.current.anpRef.anpName == "ANP1"
- name: Add external EPG 6 with external epg type cloud again(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -549,13 +549,13 @@
register: nm_add_epg_6_again
- name: Verify nm_add_epg_6_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_6_again is not changed
- nm_add_epg_6_again.current.name == "ansible_test_6"
- name: Add external EPG 6 with external epg type cloud with modification(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -573,7 +573,7 @@
register: nm_add_epg_6_again_2
- name: Verify nm_add_epg_6_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_6_again_2 is changed
- nm_add_epg_6_again_2.current.name == "ansible_test_6"
@@ -581,7 +581,7 @@
- nm_add_epg_6_again_2.current.anpRef.anpName == "ANP1"
- name: Add external EPG 7 with external epg type on-premise explicitly mentioned again(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -599,7 +599,7 @@
register: nm_add_epg_7
- name: Verify nm_add_epg_7
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_7 is changed
- nm_add_epg_7.current.name == "ansible_test_7"
@@ -607,7 +607,7 @@
- nm_add_epg_7.current.vrfRef.vrfName == "VRF"
- name: Add external EPG 7 with external epg type not mentioned again(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -624,14 +624,14 @@
register: nm_add_epg_7_again
- name: Verify nm_add_epg_7_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_7_again is not changed
- nm_add_epg_7_again.current.name == "ansible_test_7"
# CHANGE external EPG
- name: Change epg from different template (check_mode)
- mso_schema_template_external_epg: &change_epg_template
+ cisco.mso.mso_schema_template_external_epg: &change_epg_template
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -645,7 +645,7 @@
register: cm_change_epg
- name: Verify cm_change_epg from different template to own template
- assert:
+ ansible.builtin.assert:
that:
- cm_change_epg is changed
- cm_change_epg.current.name == 'ansible_test_2'
@@ -654,13 +654,13 @@
- cm_change_epg.current.vrfRef.schemaId == cm_change_epg.previous.vrfRef.schemaId
- name: Change epg from different template to own template (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *change_epg_template
state: present
register: nm_change_epg
- name: Verify nm_change_epg from different template to own template
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg is changed
- nm_change_epg.current.name == 'ansible_test_2'
@@ -669,13 +669,13 @@
- nm_change_epg.current.vrfRef.schemaId == nm_change_epg.previous.vrfRef.schemaId
- name: Change epg again from different template (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *change_epg_template
check_mode: true
register: cm_change_epg_again
- name: Verify cm_change_epg_again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_epg_again is not changed
- cm_change_epg_again.current.name == 'ansible_test_2'
@@ -684,13 +684,13 @@
- cm_change_epg_again.current.vrfRef.schemaId == cm_change_epg_again.previous.vrfRef.schemaId
- name: Change epg again from different template (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *change_epg_template
state: present
register: nm_change_epg_again
- name: Verify nm_change_epg_again from different template to own template
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_again is not changed
- nm_change_epg_again.current.name == 'ansible_test_2'
@@ -699,7 +699,7 @@
- nm_change_epg_again.current.vrfRef.schemaId == nm_change_epg_again.previous.vrfRef.schemaId
- name: Change VRF from different schema (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -712,7 +712,7 @@
register: nm_change_epg_vrf4
- name: Verify nm_change_epg_vrf4 and nm_change_epg_vrf2
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_vrf4 is changed
- nm_change_epg_vrf4.current.name == 'ansible_test_3'
@@ -721,7 +721,7 @@
- nm_change_epg_vrf4.current.vrfRef.schemaId != nm_change_epg_vrf4.previous.vrfRef.schemaId
- name: Change epg 1 l3out(normal mode)
- mso_schema_template_external_epg: &change_l3out
+ cisco.mso.mso_schema_template_external_epg: &change_l3out
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -738,7 +738,7 @@
register: nm_change_epg_1_l3out
- name: Change epg 1 settings(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *change_l3out
vrf:
name: VRF
@@ -748,7 +748,7 @@
register: nm_change_epg_1_settings
- name: Verify nm_change_epg_1_settings and nm_change_epg_1_l3out
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_1_settings is changed
- nm_change_epg_1_settings.previous.vrfRef.vrfName == 'VRF2'
@@ -767,7 +767,7 @@
- nm_change_epg_1_l3out.current.l3outRef.templateName == 'Template1'
- name: Change epg 4 preferredGroup(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -779,7 +779,7 @@
register: nm_change_epg_4_preferred_group
- name: Change epg 4 preferredGroup again(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -791,7 +791,7 @@
register: nm_change_epg_4_preferred_group_again
- name: Verify nm_change_epg_4_preferred_group and nm_change_epg_4_preferred_group_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_epg_4_preferred_group is changed
- nm_change_epg_4_preferred_group_again is changed
@@ -800,7 +800,7 @@
# QUERY ALL EPG
- name: Query all EPG (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -809,7 +809,7 @@
register: cm_query_all_epgs
- name: Query all EPG (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -817,7 +817,7 @@
register: nm_query_all_epgs
- name: Verify query_all_epgs
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_epgs is not changed
- nm_query_all_epgs is not changed
@@ -825,7 +825,7 @@
# QUERY AN EPG
- name: Query epg 1(check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -835,7 +835,7 @@
register: cm_query_epg_1
- name: Query epg 1(normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -844,7 +844,7 @@
register: nm_query_epg_1
- name: Verify cm_query_epg_1 and nm_query_epg_1
- assert:
+ ansible.builtin.assert:
that:
- cm_query_epg_1 is not changed
- nm_query_epg_1 is not changed
@@ -857,7 +857,7 @@
- nm_query_epg_1.current.l3outRef.schemaId == nm_query_epg_1.current.vrfRef.schemaId
- name: Query epg 5(normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -866,12 +866,12 @@
register: nm_query_epg_5
- name: Verify nm_query_epg_5
- assert:
+ ansible.builtin.assert:
that:
- nm_query_epg_5.current.l3outRef.l3outName == 'L3out'
- name: Query epg 6(normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -880,13 +880,13 @@
register: nm_query_epg_6
- name: Verify nm_query_epg_5
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_6.current.anpRef.anpName == "ANP1"
# REMOVE EPG
- name: Remove EPG 4 (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -896,13 +896,13 @@
register: cm_remove_epg_4
- name: Verify cm_remove_epg_4
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_epg_4 is changed
- cm_remove_epg_4.current == {}
- name: Remove EPG 4 (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -911,13 +911,13 @@
register: nm_remove_epg_4
- name: Verify nm_remove_epg_4
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_epg_4 is changed
- nm_remove_epg_4.current == {}
- name: Remove EPG 4 again (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -926,13 +926,13 @@
register: nm_remove_epg_4_again
- name: Verify nm_remove_epg_4_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_epg_4_again is not changed
- nm_remove_epg_4_again.previous == nm_remove_epg_4_again.current == {}
- name: Add external EPG 4 description for version greater than 3.3
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -945,7 +945,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify add_epg_4 for version greater than 3.3
- assert:
+ ansible.builtin.assert:
that:
- add_epg_4 is changed
- add_epg_4.current.name == "ansible_test_4"
@@ -958,7 +958,7 @@
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -969,7 +969,7 @@
register: cm_query_non_existing_epg
- name: Query non-existing EPG (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -979,7 +979,7 @@
register: nm_query_non_existing_epg
- name: Verify cm_query_non_existing_epg and nm_query_non_existing_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_epg is not changed
- nm_query_non_existing_epg is not changed
@@ -988,7 +988,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for epg (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -998,7 +998,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for epg (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -1007,7 +1007,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -1016,7 +1016,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for epg (check_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -1026,7 +1026,7 @@
register: cm_non_existing_template
- name: Non-existing template for epg (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -1035,7 +1035,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -1044,7 +1044,7 @@
# Checking if contract are removed after re-applying an EPG. (#13 | #62137)
- name: Remove EPG 2/5/6/7 to avoid circle errors (normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -1057,7 +1057,7 @@
- ansible_test_7
- name: Add Contracts to EPG 1
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1074,7 +1074,7 @@
- { name: Contract2, template: Template 2, type: provider }
- name: Query contract EPG 1(normal mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1083,12 +1083,12 @@
register: nm_query_epg1_contract
- name: Verify nm_query_epg1_contract
- assert:
+ ansible.builtin.assert:
that:
- nm_query_epg1_contract.current.contractRelationships | length == 4
- name: Add EPG 1 again (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1103,12 +1103,12 @@
register: nm_add_epg_1_again
- name: Verify that EPG 1 didn't change
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_1_again is not changed
- name: Query contract EPG 1 again
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1117,13 +1117,13 @@
register: nm_query_epg1_contract_again
- name: Verify that 4 contracts are in EPG 1 using nm_query_epg1_contract_again
- assert:
+ ansible.builtin.assert:
that:
- nm_query_epg1_contract_again.current.contractRelationships | length == 4
# Checking if modifying an external EPG with existing contracts throw an MSO error. (#82)
- name: Change external EPG 1 VRF (normal_mode)
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1136,7 +1136,7 @@
register: nm_change_ext_epg_1_vrf
- name: Verify that external EPG 1 did change
- assert:
+ ansible.builtin.assert:
that:
- nm_change_ext_epg_1_vrf is changed
- nm_change_ext_epg_1_vrf.current.vrfRef.templateName == "Template1"
@@ -1144,7 +1144,7 @@
- nm_change_ext_epg_1_vrf.current.l3outRef.l3outName == "L3out2"
- name: Query EPG 1
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -1153,6 +1153,6 @@
register: nm_query_contract_ext_epg_1
- name: Verify that 4 contracts are in external EPG 1 using nm_query_contract_ext_epg_1
- assert:
+ ansible.builtin.assert:
that:
- nm_query_contract_ext_epg_1.current.contractRelationships | length == 4 \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_contract/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_contract/tasks/main.yml
index 44eb30623..2a410dcb1 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_contract/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_contract/tasks/main.yml
@@ -6,14 +6,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
# - name: Ensure site exist
-# mso_site: &site_present
+# cisco.mso.mso_site: &site_present
# host: '{{ mso_hostname }}'
# username: '{{ mso_username }}'
# password: '{{ mso_password }}'
@@ -30,7 +30,7 @@
# state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -45,7 +45,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -61,7 +61,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -75,7 +75,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -83,7 +83,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -91,7 +91,7 @@
state: present
- name: Ensure VRF exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -105,7 +105,7 @@
state: present
- name: Ensure Filter 1 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -120,7 +120,7 @@
state: present
- name: Ensure Filter 2 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -135,7 +135,7 @@
state: present
- name: Ensure Contract1 exist
- mso_schema_template_contract_filter: &contract_present
+ cisco.mso.mso_schema_template_contract_filter: &contract_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -152,7 +152,7 @@
state: present
- name: Ensure Contract2 exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *contract_present
template: Template 2
contract: Contract2
@@ -162,7 +162,7 @@
state: present
- name: Ensure external EPGs exist
- mso_schema_template_externalepg:
+ cisco.mso.mso_schema_template_externalepg:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -184,7 +184,7 @@
# ADD Contract to External EPG
- name: Add Contract1 to External EPG (check_mode)
- mso_schema_template_external_epg_contract: &contract_ext_epg_present
+ cisco.mso.mso_schema_template_external_epg_contract: &contract_ext_epg_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -203,7 +203,7 @@
register: cm_add_contract_rel
- name: Verify cm_add_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract_rel is changed
- cm_add_contract_rel.previous == {}
@@ -212,12 +212,12 @@
- cm_add_contract_rel.current.relationshipType == "consumer"
- name: Add Contract to External EPG (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
register: nm_add_contract_rel
- name: Verify nm_add_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_rel is changed
- nm_add_contract_rel.previous == {}
@@ -227,13 +227,13 @@
- cm_add_contract_rel.current.contractRef.schemaId == nm_add_contract_rel.current.contractRef.schemaId
- name: Add Contract to External EPG again (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
check_mode: true
register: cm_add_contract_rel_again
- name: Verify cm_add_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract_rel_again is not changed
- cm_add_contract_rel_again.previous.contractRef.templateName == "Template1"
@@ -246,12 +246,12 @@
- name: Add Contract to External EPG again (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
register: nm_add_contract_rel_again
- name: Verify nm_add_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract_rel_again is not changed
- nm_add_contract_rel_again.previous.contractRef.templateName == "Template1"
@@ -263,7 +263,7 @@
- nm_add_contract_rel_again.previous.contractRef.schemaId == nm_add_contract_rel_again.current.contractRef.schemaId
- name: Add Contract1 to External EPG - provider (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
contract:
name: Contract1
@@ -271,7 +271,7 @@
register: nm_add_contract1_rel_provider
- name: Add Contract2 to External EPG - consumer (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
contract:
name: Contract2
@@ -280,7 +280,7 @@
register: nm_add_contract2_rel_consumer
- name: Add Contract1 to External EPG 3 - provider (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: 'Template 3'
@@ -293,7 +293,7 @@
register: nm_add_contract3_rel_provider
- name: Verify nm_add_contract1_rel_provider, nm_add_contract2_rel_consumer and nm_add_contract3_rel_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_rel_provider is changed
- nm_add_contract2_rel_consumer is changed
@@ -310,7 +310,7 @@
# # QUERY ALL Contract to External EPG
- name: Query all contract relationship for External EPG (check_mode)
- mso_schema_template_external_epg_contract: &contract_ext_epg_query
+ cisco.mso.mso_schema_template_external_epg_contract: &contract_ext_epg_query
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -326,12 +326,12 @@
register: cm_query_all_contract_rels
- name: Query all contract relationship for External EPG (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
register: nm_query_all_contract_rels
- name: Verify query_all_contract_rels
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_contract_rels is not changed
- nm_query_all_contract_rels is not changed
@@ -340,7 +340,7 @@
# QUERY A Contract to External EPG
- name: Query Contract1 relationship for External EPG - consumer (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract1
@@ -349,7 +349,7 @@
register: cm_query_contract1_consumer_rel
- name: Query Contract1 relationship for External EPG - consumer (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract1
@@ -357,7 +357,7 @@
register: nm_query_contract1_consumer_rel
- name: Query Contract1 relationship for External EPG - provider (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract1
@@ -365,7 +365,7 @@
register: nm_query_contract1_provider_rel
- name: Query Contract1 relationship for External EPG - consumer (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract2
@@ -374,7 +374,7 @@
register: nm_query_contract2_consumer_rel
- name: Query Contract1 relationship for External EPG - provider (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -387,7 +387,7 @@
register: nm_query_contract3_provider_rel
- name: Verify query_contractX_YYYYY_rel
- assert:
+ ansible.builtin.assert:
that:
- cm_query_contract1_consumer_rel is not changed
- nm_query_contract1_consumer_rel is not changed
@@ -408,51 +408,51 @@
# REMOVE Contract to External EPG
- name: Remove Contract to External EPG (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
state: absent
check_mode: true
register: cm_remove_contract_rel
- name: Verify cm_remove_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_contract_rel is changed
- cm_remove_contract_rel.current == {}
- name: Remove Contract to External EPG (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
state: absent
register: nm_remove_contract_rel
- name: Verify nm_remove_contract_rel
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract_rel is changed
- nm_remove_contract_rel.current == {}
- name: Remove Contract to External EPG again (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
state: absent
check_mode: true
register: cm_remove_contract_rel_again
- name: Verify cm_remove_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_contract_rel_again is not changed
- cm_remove_contract_rel_again.current == {}
- name: Remove Contract to External EPG again (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_present
state: absent
register: nm_remove_contract_rel_again
- name: Verify nm_remove_contract_rel_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract_rel_again is not changed
- nm_remove_contract_rel_again.current == {}
@@ -460,7 +460,7 @@
# QUERY NON-EXISTING Contract to External EPG
- name: Query non-existing contract (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: non_existing_contract
@@ -470,7 +470,7 @@
register: cm_query_non_contract
- name: Query non-existing contract (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: non_existing_contract
@@ -479,7 +479,7 @@
register: nm_query_non_contract
- name: Verify query_non_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_contract is not changed
- nm_query_non_contract is not changed
@@ -489,7 +489,7 @@
# QUERY NON-EXISTING ExtEPG
- name: Query non-existing ExtEPG (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
external_epg: non_existing_ext_epg
check_mode: true
@@ -497,14 +497,14 @@
register: cm_query_non_ext_epg
- name: Query non-existing ExtEPG (normal mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
external_epg: non_existing_ext_epg
ignore_errors: true
register: nm_query_non_ext_epg
- name: Verify query_non_ext_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_ext_epg is not changed
- nm_query_non_ext_epg is not changed
@@ -513,7 +513,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state for contract relationship (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
state: non-existing-state
check_mode: true
@@ -521,14 +521,14 @@
register: cm_non_existing_state
- name: Non-existing state for contract relationship (normal_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -537,7 +537,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for contract relationship (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
schema: non-existing-schema
check_mode: true
@@ -545,14 +545,14 @@
register: cm_non_existing_schema
- name: Non-existing schema for contract relationship (normal_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
schema: non-existing-schema
ignore_errors: true
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -560,7 +560,7 @@
- cm_non_existing_schema.msg == nm_non_existing_schema.msg == "Provided schema 'non-existing-schema' does not exist."
- name: Non-existing contract schema for contract relationship (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract1
@@ -572,7 +572,7 @@
register: cm_non_existing_contract_schema
- name: Non-existing contract schema for contract relationship (normal_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract1
@@ -583,7 +583,7 @@
register: nm_non_existing_contract_schema
- name: Verify non_existing_contract_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_contract_schema is not changed
- nm_non_existing_contract_schema is not changed
@@ -592,7 +592,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for contract relationship (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
template: non-existing-template
check_mode: true
@@ -600,14 +600,14 @@
register: cm_non_existing_template
- name: Non-existing template for contract relationship (normal_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
template: non-existing-template
ignore_errors: true
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -615,7 +615,7 @@
- cm_non_existing_template.msg == nm_non_existing_template.msg == "Provided template 'non-existing-template' does not exist. Existing templates{{':'}} Template1, Template2"
- name: Non-existing contract template for contract relationship (check_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract1
@@ -626,7 +626,7 @@
register: cm_non_existing_contract_template
- name: Non-existing contract template for contract relationship (normal_mode)
- mso_schema_template_external_epg_contract:
+ cisco.mso.mso_schema_template_external_epg_contract:
<<: *contract_ext_epg_query
contract:
name: Contract1
@@ -636,7 +636,7 @@
register: nm_non_existing_contract_template
- name: Verify non_existing_contract_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_contract_template is not changed
- nm_non_existing_contract_template is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_selector/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_selector/tasks/main.yml
index 5911f7667..b663cd703 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_selector/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_selector/tasks/main.yml
@@ -6,14 +6,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -24,7 +24,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -33,7 +33,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -43,7 +43,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -51,7 +51,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -59,7 +59,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -67,7 +67,7 @@
state: present
- name: Ensure VRF exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -75,7 +75,7 @@
state: present
- name: Ensure VRF2 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -83,7 +83,7 @@
state: present
- name: Ensure ANP1 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -91,7 +91,7 @@
state: present
- name: Ensure ANP2 exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -99,7 +99,7 @@
state: present
- name: Ensure L3out exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -109,7 +109,7 @@
state: present
- name: Ensure L3out2 exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -120,7 +120,7 @@
# ADD External EPGs
- name: Ensure External EPG1 exists
- mso_schema_template_externalepg:
+ cisco.mso.mso_schema_template_externalepg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -140,7 +140,7 @@
state: present
- name: Ensure External EPG2 exists
- mso_schema_template_externalepg:
+ cisco.mso.mso_schema_template_externalepg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -161,7 +161,7 @@
# ADD Selector to EPG
- name: Add Selector to extEPG1 (check_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -172,7 +172,7 @@
register: cm_add_selector_1
- name: Verify cm_add_selector_1
- assert:
+ ansible.builtin.assert:
that:
- cm_add_selector_1 is changed
- cm_add_selector_1.previous == {}
@@ -180,7 +180,7 @@
- cm_add_selector_1.current.expressions == []
- name: Add Selector 1 to extEPG1 (normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -191,7 +191,7 @@
register: nm_add_selector_1
- name: Verify nm_add_selector_1
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_1 is changed
- nm_add_selector_1.previous == {}
@@ -199,7 +199,7 @@
- nm_add_selector_1.current.expressions == []
- name: Add Selector 1 to extEPG1 again(normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -210,12 +210,12 @@
register: nm_add_selector_1_again
- name: Verify nm_add_selector_1_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_1_again is not changed
- name: Add Selector to extEPG1 again (normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -225,12 +225,12 @@
register: nm_add_selector_1_again
- name: Verify nm_add_selector_1_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_1_again is not changed
- name: Add Selector 2 to extEPG1 (normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -244,7 +244,7 @@
register: nm_add_selector_2
- name: Verify nm_add_selector_2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_2 is changed
- nm_add_selector_2.previous == {}
@@ -254,7 +254,7 @@
- nm_add_selector_2.current.expressions[0].value == "10.0.0.0"
- name: Add Selector 3 to extEPG1 (normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -268,7 +268,7 @@
register: nm_add_selector_3
- name: Verify nm_add_selector_3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_selector_3 is changed
- nm_add_selector_3.previous == {}
@@ -276,7 +276,7 @@
- nm_add_selector_3.current.expressions[0].value == "10.1.1.1"
- name: Remove slector_1
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -286,13 +286,13 @@
register: nm_remove_selector_1
- name: Verify nm_remove_selector_1
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_selector_1 is changed
# QUERY selectors
- name: Query all selectors of extEPG1
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -301,12 +301,12 @@
register: nm_query_all
- name: Verify nm_query_all
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all is not changed
- name: Query a selector of extEPG1
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -316,13 +316,13 @@
register: nm_query_selector_2
- name: Verify nm_query_selector_2
- assert:
+ ansible.builtin.assert:
that:
- nm_query_selector_2 is not changed
- nm_query_selector_2.current.expressions[0].value == "10.0.0.0"
- name: Query a removed selector_1 of extEPG1
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -333,13 +333,13 @@
register: nm_query_removed
- name: Verify nm_query_removed
- assert:
+ ansible.builtin.assert:
that:
- nm_query_removed.msg == "Selector 'selector_1' not found"
# QUERY NON-EXISTING External EPG
- name: Query non-existing EPG (normal mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -350,14 +350,14 @@
register: nm_query_non_epg
- name: Verify query_non_epg
- assert:
+ ansible.builtin.assert:
that:
- nm_query_non_epg is not changed
- nm_query_non_epg.msg == "Provided external epg 'non_extEPG1' does not exist. Existing epgs{{':'}} extEPG1, extEPG2"
# USE A NON-EXISTING STATE
- name: Non-existing state (check_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -369,7 +369,7 @@
register: cm_non_existing_state
- name: Non-existing state (normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -380,7 +380,7 @@
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -389,7 +389,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template (check_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -401,7 +401,7 @@
register: cm_non_existing_template
- name: Non-existing template (normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -412,7 +412,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -421,7 +421,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema (check_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -433,7 +433,7 @@
register: cm_non_existing_schema
- name: Non-existing schema (normal_mode)
- mso_schema_template_external_epg_selector:
+ cisco.mso.mso_schema_template_external_epg_selector:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -444,7 +444,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_subnet/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_subnet/tasks/main.yml
index 06b5e65b7..56cd80be1 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_subnet/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_external_epg_subnet/tasks/main.yml
@@ -5,14 +5,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -23,13 +23,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Undeploy templates if deployed from previous test case
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: "{{ item }}"
@@ -41,7 +41,7 @@
- Template 2
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -50,7 +50,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure ansible_test_1 external EPG does not exist
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -59,7 +59,7 @@
ignore_errors: true
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -67,7 +67,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -75,7 +75,7 @@
state: present
- name: Ensure VRF exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -83,7 +83,7 @@
state: present
- name: Ensure L3out exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -93,7 +93,7 @@
state: present
- name: Ensure ANP exists
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -101,7 +101,7 @@
state: present
- name: Add external EPG
- mso_schema_template_external_epg:
+ cisco.mso.mso_schema_template_external_epg:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -112,7 +112,7 @@
# ADD external EPG subnet
- name: Add external EPG subnet (check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -123,14 +123,14 @@
register: cm_add_epg_subnet
- name: Verify cm_add_epg_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg_subnet is changed
- cm_add_epg_subnet.previous == {}
- cm_add_epg_subnet.current.ip == "10.0.0.0/24"
- name: Add external EPG subnet (normal mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -140,14 +140,14 @@
register: nm_add_epg_subnet
- name: Verify nm_add_epg_subnet
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_subnet is changed
- nm_add_epg_subnet.previous == {}
- nm_add_epg_subnet.current.ip == "10.0.0.0/24"
- name: Add external EPG subnet again (check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -158,14 +158,14 @@
register: cm_add_epg_subnet_again
- name: Verify cm_add_epg_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_epg_subnet_again is not changed
- cm_add_epg_subnet_again.previous.ip == "10.0.0.0/24"
- cm_add_epg_subnet_again.current.ip == "10.0.0.0/24"
- name: Add epg again subnet (normal mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -175,14 +175,14 @@
register: nm_add_epg_subnet_again
- name: Verify nm_add_epg_subnet_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_epg_subnet_again is not changed
- nm_add_epg_subnet_again.previous.ip == "10.0.0.0/24"
- nm_add_epg_subnet_again.current.ip == "10.0.0.0/24"
- name: Add external EPG subnet 2
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -192,14 +192,14 @@
register: add_epg_subnet_2
- name: Verify add_epg_subnet_2
- assert:
+ ansible.builtin.assert:
that:
- add_epg_subnet_2 is changed
- add_epg_subnet_2.current.ip == "10.0.0.2/24"
# QUERY ALL EPG Subnets
- name: Query all EPG (check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -209,7 +209,7 @@
register: cm_query_all_epg_subnets
- name: Query all EPG (normal mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -218,7 +218,7 @@
register: nm_query_all_epg_subnets
- name: Verify query_all_epg_subnets
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_epg_subnets is not changed
- nm_query_all_epg_subnets is not changed
@@ -226,7 +226,7 @@
# QUERY AN EPG subnet
- name: Query epg subnet 1(check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -237,7 +237,7 @@
register: cm_query_epg_subnet_1
- name: Query epg subnet 1(normal_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -247,7 +247,7 @@
register: nm_query_epg_subnet_1
- name: Verify cm_query_epg_subnet_1 and nm_query_epg_subnet_1
- assert:
+ ansible.builtin.assert:
that:
- cm_query_epg_subnet_1 is not changed
- nm_query_epg_subnet_1 is not changed
@@ -255,7 +255,7 @@
# REMOVE EPG
- name: Remove EPG subnet 1 (check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -266,13 +266,13 @@
register: cm_remove_epg_subnet_1
- name: Verify cm_remove_epg_subnet_1
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_epg_subnet_1 is changed
- cm_remove_epg_subnet_1.current == {}
- name: Remove EPG subnet 1 (normal_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -282,13 +282,13 @@
register: nm_remove_epg_subnet_1
- name: Verify nm_remove_epg_subnet_1
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_epg_subnet_1 is changed
- nm_remove_epg_subnet_1.current == {}
- name: Remove EPG subnet 1 again (normal mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -298,14 +298,14 @@
register: nm_remove_epg_subnet_1_again
- name: Verify nm_remove_epg_subnet_1_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_epg_subnet_1_again is not changed
- nm_remove_epg_subnet_1_again.previous == nm_remove_epg_subnet_1_again.current == {}
# Chcek aggregate when scope parameter Shared control is absent and present
- name: Add aggregate without Shared control scope parameter
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -318,12 +318,12 @@
register: add_epg_subnet_no_ag
- name: Verify add_epg_subnet_no_ag
- assert:
+ ansible.builtin.assert:
that:
- add_epg_subnet_no_ag is changed
- name: Verify add_epg_subnet_no_ag (3.1.1g to 3.1.1n)
- assert:
+ ansible.builtin.assert:
that:
- add_epg_subnet_no_ag.msg == "MSO Error 400{{':'}} Bad Request{{':'}} Patch Failed, Received{{':'}} Aggregate should be enabled only if shared-rtctrl is enabled in Scope exception while trying to update schema"
when:
@@ -331,14 +331,14 @@
- version.current.version is version('3.2', '<')
- name: Verify add_epg_subnet_no_ag (version < 3.1.1g)
- assert:
+ ansible.builtin.assert:
that:
- add_epg_subnet_no_ag.msg == "MSO Error 400{{':'}} Bad Request{{':'}} Aggregate should be enabled only if shared-rtctrl is enabled in Scope"
when:
- version.current.version is version('3.1.1g', '<')
- name: Verify add_epg_subnet_no_ag (version >= 4.0)
- assert:
+ ansible.builtin.assert:
that:
- add_epg_subnet_no_ag.msg == "MSO Error 400{{':'}} ExternalEPG{{':'}} ansible_test_1 in Schema{{':'}} ansible_test , Template{{':'}} Template1 External EPG validation error{{':'}} aggregate should be enabled only if shared-rtctrl is enabled in Scope for subnet 10.0.0.2/24"
when:
@@ -349,7 +349,7 @@
when: version.current.version is version('4.0', '<')
block:
- name: Get Validation status
- mso_schema_validate:
+ cisco.mso.mso_schema_validate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
state: query
@@ -358,7 +358,7 @@
when: version.current.version is version('3.6', '>=')
- name: Verify query_validate for a version that's after 3.6
- assert:
+ ansible.builtin.assert:
that:
- query_validate is not changed
- query_validate.msg is match ("MSO Error 400{{':'}} Bad Request{{':'}} Patch Failed, Received{{':'}} Aggregate should be enabled only if shared-rtctrl is enabled in Scope exception while trying to update schema")
@@ -366,7 +366,7 @@
- version.current.version is version('3.6', '>=')
- name: Add aggregate with Shared control scope parameter
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -379,13 +379,13 @@
register: add_epg_subnet_ag
- name: Verify add_epg_subnet_ag
- assert:
+ ansible.builtin.assert:
that:
- add_epg_subnet_ag is changed
- add_epg_subnet_ag.current.aggregate[0] == "shared-rtctrl"
- name: Change EPG subnet 2 by changing Route Controls
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -401,7 +401,7 @@
register: change_epg_subnet
- name: Verify change_epg_subnet
- assert:
+ ansible.builtin.assert:
that:
- change_epg_subnet is changed
- change_epg_subnet.current.ip == "10.0.0.2/24"
@@ -409,7 +409,7 @@
# QUERY NON-EXISTING EPG subnet
- name: Query non-existing EPG subnet(check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -421,7 +421,7 @@
register: cm_query_non_existing_epg_subnet
- name: Query non-existing EPG subnet(normal_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -432,7 +432,7 @@
register: nm_query_non_existing_epg_subnet
- name: Verify cm_query_non_existing_epg_subnet and nm_query_non_existing_epg_subnet
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_epg_subnet is not changed
- nm_query_non_existing_epg_subnet is not changed
@@ -441,7 +441,7 @@
# QUERY NON-EXISTING EPG
- name: Query non-existing EPG subnet(check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -453,7 +453,7 @@
register: cm_query_non_existing_epg
- name: Query non-existing EPG subnet(normal_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -464,7 +464,7 @@
register: nm_query_non_existing_epg
- name: Verify cm_query_non_existing_epg and nm_query_non_existing_epg
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_epg is not changed
- nm_query_non_existing_epg is not changed
@@ -473,7 +473,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for epg subnet(check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -485,7 +485,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for epg subnet(normal_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: non-existing-schema
template: Template 1
@@ -496,7 +496,7 @@
register: nm_non_existing_schema
- name: Verify non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -505,7 +505,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for epg subnet(check_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -517,7 +517,7 @@
register: cm_non_existing_template
- name: Non-existing template for epg subnet(normal_mode)
- mso_schema_template_external_epg_subnet:
+ cisco.mso.mso_schema_template_external_epg_subnet:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non-existing-template
@@ -528,7 +528,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_filter_entry/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_filter_entry/tasks/main.yml
index 262a1903d..e2648acd6 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_filter_entry/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_filter_entry/tasks/main.yml
@@ -3,14 +3,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,13 +21,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Ensure site exist
- mso_site: &site_present
+ cisco.mso.mso_site: &site_present
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -38,7 +38,7 @@
state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -47,7 +47,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
users:
@@ -57,7 +57,7 @@
state: present
- name: Ensure schema 1 with Template1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -97,7 +97,7 @@
register: add_filter_again
- name: Verify add_filter
- assert:
+ ansible.builtin.assert:
that:
- cm_add_filter is changed
- cm_add_filter.previous == {}
@@ -123,13 +123,12 @@
when: version.current.version is version('3.3', '>=')
- name: Verify add_filter_only
- assert:
+ ansible.builtin.assert:
that:
- add_filter_descr is changed
- add_filter_descr.current.description == "filter entry description"
when: version.current.version is version('3.3', '>=')
-
- name: Create filter without filter entry
cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
@@ -141,7 +140,7 @@
register: add_filter_only
- name: Verify add_filter_only
- assert:
+ ansible.builtin.assert:
that:
- add_filter_only is not changed
- add_filter_only.msg == "state is present but all of the following are missing{{':'}} entry"
@@ -194,7 +193,7 @@
register: query_all
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- query_filter is not changed
- query_all is not changed
@@ -223,7 +222,7 @@
register: query_non_existing_entry
- name: Verify query cases
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing_filter is not changed
- query_non_existing_entry is not changed
@@ -241,7 +240,7 @@
register: remove_filter
- name: Verify delete filter_entry3
- assert:
+ ansible.builtin.assert:
that:
- remove_filter is changed
- remove_filter.current == {}
@@ -259,7 +258,7 @@
register: nm_non_existing_template
- name: Verify nm_non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- nm_non_existing_template is not changed
- nm_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1"
@@ -297,7 +296,7 @@
register: remove_non_existing_entry
- name: Verify non_existing
- assert:
+ ansible.builtin.assert:
that:
- query_non_existing_filter is not changed
- query_non_existing_filter.msg == "Filter 'non_existing_filter' not found"
@@ -305,7 +304,6 @@
- remove_non_existing_entry is not changed
- nm_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1"
-
# Delete filter entries
- name: Delete filter entry 3
cisco.mso.mso_schema_template_filter_entry:
@@ -321,6 +319,6 @@
- 'filter_entry2'
- name: Verify remove_multiple_entries
- assert:
+ ansible.builtin.assert:
that:
- remove_multiple_entries is changed \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_l3out/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_l3out/tasks/main.yml
index a61752fa6..e6cf75650 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_l3out/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_l3out/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,13 +21,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -36,7 +36,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -46,7 +46,7 @@
state: present
- name: Ensure schema 1 with Template1, and Template2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -57,7 +57,7 @@
- { template: Template2}
- name: Ensure VRF1 exists
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -65,7 +65,7 @@
state: present
- name: Verify L3Out doesn't exist
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -73,7 +73,7 @@
state: absent
- name: Add new L3Out (check_mode)
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -85,7 +85,7 @@
register: cm_add_l3out
- name: Add new L3Out (normal mode)
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -96,7 +96,7 @@
register: nm_add_l3out
- name: Add L3Out again
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -107,7 +107,7 @@
register: add_l3out_again
- name: Verify add
- assert:
+ ansible.builtin.assert:
that:
- cm_add_l3out is changed
- cm_add_l3out.previous == {}
@@ -124,7 +124,7 @@
- nm_add_l3out.current.vrfRef.schemaId == add_l3out_again.current.vrfRef.schemaId
- name: Add new L3Outs
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -138,12 +138,12 @@
- { l3out: L3out3}
- name: Verify add
- assert:
+ ansible.builtin.assert:
that:
- new_l3outs is changed
- name: Query a specific L3Out
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -152,7 +152,7 @@
register: query_l3out
- name: Query all L3outs
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -160,13 +160,13 @@
register: query_all
- name: Verify query
- assert:
+ ansible.builtin.assert:
that:
- query_l3out is not changed
- query_all is not changed
- name: Remove an L3Out
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -175,7 +175,7 @@
register: delete_l3out
- name: Verify delete
- assert:
+ ansible.builtin.assert:
that:
- delete_l3out is changed
- delete_l3out.previous.name == "L3out1"
@@ -183,7 +183,7 @@
# USE A NON_EXISTING_TEMPLATE
- name: non_existing_template (check_mode)
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non_existing_template
@@ -196,7 +196,7 @@
register: cm_non_existing_template
- name: non_existing_template (normal_mode)
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non_existing_template
@@ -208,7 +208,7 @@
register: nm_non_existing_template
- name: Verify cm_non_existing_template and nm_non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -216,7 +216,7 @@
# QUERY NON-EXISTING L3Out
- name: Query non-existing L3Out (check_mode)
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -227,7 +227,7 @@
register: cm_query_non_l3out
- name: Query non-existing L3Out (normal_mode)
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -237,7 +237,7 @@
register: nm_query_non_l3out
- name: Verify cm_query_non_l3out and nm_query_non_l3out
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_l3out is not changed
- nm_query_non_l3out is not changed
@@ -246,7 +246,7 @@
# Add description for version >= 3.3
- name: Add new L3Out
- mso_schema_template_l3out:
+ cisco.mso.mso_schema_template_l3out:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
@@ -259,7 +259,7 @@
when: version.current.version is version('3.3', '>=')
- name: Verify add description
- assert:
+ ansible.builtin.assert:
that:
- add_desc is changed
when: version.current.version is version('3.3', '>=') \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_migrate/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_migrate/tasks/main.yml
index 44940f0d6..219eb7641 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_migrate/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_migrate/tasks/main.yml
@@ -5,12 +5,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -21,14 +21,14 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
# CLEAN ENVIRONMENT
- name: Ensure site exist
- mso_site: &site_present
+ cisco.mso.mso_site: &site_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -45,7 +45,7 @@
state: present
- name: Undeploy a schema 2 template 2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 2
schema: '{{ mso_schema | default("ansible_test") }}_2'
@@ -55,7 +55,7 @@
register: undeploy_template2
- name: Undeploy a schema 1 template 1
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 1
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -65,7 +65,7 @@
register: undeploy_template1
- name: Remove a site from a schema 1 with Template 1
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -75,7 +75,7 @@
register: rm_site_temp1
- name: Remove a site from a schema 2 with Template 2
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -85,7 +85,7 @@
register: rm_site_temp2
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -101,7 +101,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -117,7 +117,7 @@
state: present
- name: Ensure schemas with Template 1 exist
- mso_schema_template: &schema_present
+ cisco.mso.mso_schema_template: &schema_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -134,7 +134,7 @@
- '{{ mso_schema | default("ansible_test") }}_2'
- name: Ensure schema 2 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *schema_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -143,7 +143,7 @@
register: schema2_template2
- name: Add a new site to a schema 1 with Template 1 in normal mode
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
@@ -152,7 +152,7 @@
register: add_site_nm1
- name: Add a new site to a schema 2 with Template 2 in normal mode
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -161,7 +161,7 @@
register: add_site_nm2
- name: Ensure VRF exist
- mso_schema_template_vrf: &vrf_present
+ cisco.mso.mso_schema_template_vrf: &vrf_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -176,7 +176,7 @@
state: present
- name: Ensure ANP exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -190,7 +190,7 @@
state: present
- name: Ensure ANP2 exist
- mso_schema_template_anp:
+ cisco.mso.mso_schema_template_anp:
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -204,7 +204,7 @@
state: present
- name: Ensure ansible_test_1 BD exist
- mso_schema_template_bd:
+ cisco.mso.mso_schema_template_bd:
<<: *vrf_present
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -220,7 +220,7 @@
- '{{ BD_2 | default("ansible_test") }}_2'
- name: Ensure EPG exist
- mso_schema_template_anp_epg: &epg_present
+ cisco.mso.mso_schema_template_anp_epg: &epg_present
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
password: '{{ mso_password }}'
@@ -242,7 +242,7 @@
register: cm_add_epg
- name: Add EPG 2 (normal mode)
- mso_schema_template_anp_epg:
+ cisco.mso.mso_schema_template_anp_epg:
<<: *epg_present
anp: ANP2
epg: '{{ item }}'
@@ -252,7 +252,7 @@
- '{{ EPG_4 | default("ansible_test") }}_4'
- name: Migration of objects between templates
- mso_schema_template_migrate:
+ cisco.mso.mso_schema_template_migrate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -270,7 +270,7 @@
register: object_migrate
- name: Deploy a schema 1 template 1 after version 4.0
- ndo_schema_template_deploy:
+ cisco.mso.ndo_schema_template_deploy:
<<: *mso_info
template: Template 1
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -280,7 +280,7 @@
when: version.current.version is version('4.0', '>=')
- name: Migration of BD objects between templates
- mso_schema_template_migrate:
+ cisco.mso.mso_schema_template_migrate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -293,7 +293,7 @@
register: bd_migrate
- name: Deploy a schema 2 template 2 after version 4.0
- ndo_schema_template_deploy:
+ cisco.mso.ndo_schema_template_deploy:
<<: *mso_info
template: Template 2
schema: '{{ mso_schema | default("ansible_test") }}_2'
@@ -303,7 +303,7 @@
when: version.current.version is version('4.0', '>=')
- name: Migration of EPG objects between templates
- mso_schema_template_migrate:
+ cisco.mso.mso_schema_template_migrate:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 1
@@ -323,7 +323,7 @@
- version.current.version is version('4.0', '<')
block:
- name: Undeploy a schema 2 template 2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 2
schema: '{{ mso_schema | default("ansible_test") }}_2'
@@ -333,7 +333,7 @@
register: undeploy_template2
- name: Undeploy a schema 1 template 1
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *mso_info
template: Template 1
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -347,7 +347,7 @@
- version.current.version is version('4.0', '>=')
block:
- name: Undeploy a schema 2 template 2
- ndo_schema_template_deploy:
+ cisco.mso.ndo_schema_template_deploy:
<<: *mso_info
template: Template 2
schema: '{{ mso_schema | default("ansible_test") }}_2'
@@ -356,7 +356,7 @@
state: undeploy
- name: Undeploy a schema 1 template 1
- ndo_schema_template_deploy:
+ cisco.mso.ndo_schema_template_deploy:
<<: *mso_info
template: Template 1
schema: '{{ mso_schema | default("ansible_test") }}'
@@ -365,7 +365,7 @@
state: undeploy
- name: Remove a site from a schema 2 with Template 2
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
site: '{{ mso_site | default("ansible_test") }}'
@@ -374,7 +374,7 @@
register: rm_site_temp2
- name: Remove a site from a schema 1 with Template 1
- mso_schema_site:
+ cisco.mso.mso_schema_site:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
site: '{{ mso_site | default("ansible_test") }}'
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_service_graph/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_service_graph/tasks/main.yml
index d11a3f4a2..6cb66c2ca 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_service_graph/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_service_graph/tasks/main.yml
@@ -4,42 +4,41 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
- msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
+ ansible.builtin.fail:
+ msg: "Please define the following variables: mso_hostname, mso_username and mso_password."
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
-
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
- host: '{{ mso_hostname }}'
- username: '{{ mso_username }}'
- password: '{{ mso_password }}'
- validate_certs: '{{ mso_validate_certs | default(false) }}'
- use_ssl: '{{ mso_use_ssl | default(true) }}'
- use_proxy: '{{ mso_use_proxy | default(false) }}'
+ host: "{{ mso_hostname }}"
+ username: "{{ mso_username }}"
+ password: "{{ mso_password }}"
+ validate_certs: "{{ mso_validate_certs | default(false) }}"
+ use_ssl: "{{ mso_use_ssl | default(true) }}"
+ use_proxy: "{{ mso_use_proxy | default(false) }}"
output_level: '{{ mso_output_level | default("info") }}'
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
- schema: '{{ item }}'
+ schema: "{{ item }}"
state: absent
loop:
- - '{{ mso_schema | default("ansible_test") }}_2'
- - '{{ mso_schema | default("ansible_test") }}'
+ - '{{ mso_schema | default("ansible_test") }}_2'
+ - '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
- - '{{ mso_username }}'
+ - "{{ mso_username }}"
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -63,17 +62,17 @@
check_mode: true
- name: Verify sg1_cm
- assert:
+ ansible.builtin.assert:
that:
- - sg1_cm is changed
- - sg1_cm.current.name == "SG1"
- - sg1_cm.current.displayName == "sg"
- - sg1_cm.current.nodeFilter == "allow-all"
- - sg1_cm.current.serviceGraphRef.templateName == "Template1"
- - sg1_cm.current.serviceNodes | length == 3
- - sg1_cm.current.serviceNodes.0.name == "firewall"
- - sg1_cm.current.serviceNodes.1.name == "load-balancer"
- - sg1_cm.current.serviceNodes.2.name == "other"
+ - sg1_cm is changed
+ - sg1_cm.current.name == "SG1"
+ - sg1_cm.current.displayName == "sg"
+ - sg1_cm.current.nodeFilter == "allow-all"
+ - sg1_cm.current.serviceGraphRef.templateName == "Template1"
+ - sg1_cm.current.serviceNodes | length == 3
+ - sg1_cm.current.serviceNodes.0.name == "node1"
+ - sg1_cm.current.serviceNodes.1.name == "node2"
+ - sg1_cm.current.serviceNodes.2.name == "node3"
- name: Create a service graph (normal mode)
cisco.mso.mso_schema_template_service_graph:
@@ -97,7 +96,7 @@
template: Template1
service_graph: SG1
display_name: sg
- service_nodes:
+ service_nodes:
- type: firewall
- type: load-balancer
- type: other
@@ -106,26 +105,26 @@
register: sg1_again
- name: Verify sg1 and sg1_again
- assert:
+ ansible.builtin.assert:
that:
- - sg1 is changed
- - sg1_again is not changed
- - sg1.current.name == "SG1"
- - sg1.current.displayName == "sg"
- - sg1.current.nodeFilter == "allow-all"
- - sg1.current.serviceGraphRef.templateName == "Template1"
- - sg1.current.serviceNodes | length == 3
- - sg1.current.serviceNodes.0.name == "firewall"
- - sg1.current.serviceNodes.1.name == "load-balancer"
- - sg1.current.serviceNodes.2.name == "other"
- - sg1_again.current.name == "SG1"
- - sg1_again.current.displayName == "sg"
- - sg1_again.current.nodeFilter == "allow-all"
- - sg1_again.current.serviceGraphRef.templateName == "Template1"
- - sg1_again.current.serviceNodes | length == 3
- - sg1_again.current.serviceNodes.0.name == "firewall"
- - sg1_again.current.serviceNodes.1.name == "load-balancer"
- - sg1_again.current.serviceNodes.2.name == "other"
+ - sg1 is changed
+ - sg1_again is not changed
+ - sg1.current.name == "SG1"
+ - sg1.current.displayName == "sg"
+ - sg1.current.nodeFilter == "allow-all"
+ - sg1.current.serviceGraphRef.templateName == "Template1"
+ - sg1.current.serviceNodes | length == 3
+ - sg1.current.serviceNodes.0.name == "node1"
+ - sg1.current.serviceNodes.1.name == "node2"
+ - sg1.current.serviceNodes.2.name == "node3"
+ - sg1_again.current.name == "SG1"
+ - sg1_again.current.displayName == "sg"
+ - sg1_again.current.nodeFilter == "allow-all"
+ - sg1_again.current.serviceGraphRef.templateName == "Template1"
+ - sg1_again.current.serviceNodes | length == 3
+ - sg1_again.current.serviceNodes.0.name == "node1"
+ - sg1_again.current.serviceNodes.1.name == "node2"
+ - sg1_again.current.serviceNodes.2.name == "node3"
- name: Create another service graph SG2
cisco.mso.mso_schema_template_service_graph:
@@ -134,7 +133,7 @@
template: Template1
service_graph: SG2
display_name: Service_Graph2
- service_nodes:
+ service_nodes:
- type: firewall
- type: load-balancer
filter_after_first_node: filters_from_contract
@@ -142,16 +141,16 @@
register: sg2
- name: Verify sg2
- assert:
+ ansible.builtin.assert:
that:
- - sg2 is changed
- - sg2.current.name == "SG2"
- - sg2.current.displayName == "Service_Graph2"
- - sg2.current.nodeFilter == "filters-from-contract"
- - sg2.current.serviceGraphRef.templateName == "Template1"
- - sg2.current.serviceNodes | length == 2
- - sg2.current.serviceNodes.0.name == "firewall"
- - sg2.current.serviceNodes.1.name == "load-balancer"
+ - sg2 is changed
+ - sg2.current.name == "SG2"
+ - sg2.current.displayName == "Service_Graph2"
+ - sg2.current.nodeFilter == "filters-from-contract"
+ - sg2.current.serviceGraphRef.templateName == "Template1"
+ - sg2.current.serviceNodes | length == 2
+ - sg2.current.serviceNodes.0.name == "node1"
+ - sg2.current.serviceNodes.1.name == "node2"
- name: Change Service Graph SG2
cisco.mso.mso_schema_template_service_graph:
@@ -160,7 +159,7 @@
template: Template1
service_graph: SG2
display_name: Service_Graph_changed
- service_nodes:
+ service_nodes:
- type: firewall
- type: load-balancer
filter_after_first_node: filters_from_contract
@@ -168,16 +167,16 @@
register: sg2_change
- name: Verify sg2_change
- assert:
+ ansible.builtin.assert:
that:
- - sg2_change is changed
- - sg2_change.current.name == "SG2"
- - sg2_change.current.displayName == "Service_Graph_changed"
- - sg2_change.current.nodeFilter == "filters-from-contract"
- - sg2_change.current.serviceGraphRef.templateName == "Template1"
- - sg2_change.current.serviceNodes | length == 2
- - sg2_change.current.serviceNodes.0.name == "firewall"
- - sg2_change.current.serviceNodes.1.name == "load-balancer"
+ - sg2_change is changed
+ - sg2_change.current.name == "SG2"
+ - sg2_change.current.displayName == "Service_Graph_changed"
+ - sg2_change.current.nodeFilter == "filters-from-contract"
+ - sg2_change.current.serviceGraphRef.templateName == "Template1"
+ - sg2_change.current.serviceNodes | length == 2
+ - sg2_change.current.serviceNodes.0.name == "node1"
+ - sg2_change.current.serviceNodes.1.name == "node2"
- name: Create another service graph with no display name
cisco.mso.mso_schema_template_service_graph:
@@ -185,22 +184,22 @@
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
service_graph: SG3
- service_nodes:
+ service_nodes:
- type: firewall
filter_after_first_node: filters_from_contract
state: present
register: sg3
- name: Verify sg3
- assert:
+ ansible.builtin.assert:
that:
- - sg3 is changed
- - sg3.current.name == "SG3"
- - sg3.current.displayName == "SG3"
- - sg3.current.nodeFilter == "filters-from-contract"
- - sg3.current.serviceGraphRef.templateName == "Template1"
- - sg3.current.serviceNodes.0.name == "firewall"
- - sg3.current.serviceNodes | length == 1
+ - sg3 is changed
+ - sg3.current.name == "SG3"
+ - sg3.current.displayName == "SG3"
+ - sg3.current.nodeFilter == "filters-from-contract"
+ - sg3.current.serviceGraphRef.templateName == "Template1"
+ - sg3.current.serviceNodes.0.name == "node1"
+ - sg3.current.serviceNodes | length == 1
- name: Create service graph SG3 with addition of new service node type
cisco.mso.mso_schema_template_service_graph:
@@ -208,7 +207,7 @@
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
service_graph: SG3
- service_nodes:
+ service_nodes:
- type: firewall
- type: other
filter_after_first_node: filters_from_contract
@@ -216,16 +215,16 @@
register: sg3_other
- name: Verify sg3_other
- assert:
+ ansible.builtin.assert:
that:
- - sg3_other is changed
- - sg3_other.current.name == "SG3"
- - sg3_other.current.displayName == "SG3"
- - sg3_other.current.nodeFilter == "filters-from-contract"
- - sg3_other.current.serviceGraphRef.templateName == "Template1"
- - sg3_other.current.serviceNodes.0.name == "firewall"
- - sg3_other.current.serviceNodes.1.name == "other"
- - sg3_other.current.serviceNodes | length == 2
+ - sg3_other is changed
+ - sg3_other.current.name == "SG3"
+ - sg3_other.current.displayName == "SG3"
+ - sg3_other.current.nodeFilter == "filters-from-contract"
+ - sg3_other.current.serviceGraphRef.templateName == "Template1"
+ - sg3_other.current.serviceNodes.0.name == "node1"
+ - sg3_other.current.serviceNodes.1.name == "node2"
+ - sg3_other.current.serviceNodes | length == 2
- name: Create service graph SG3 interchanging the index of service node types
cisco.mso.mso_schema_template_service_graph:
@@ -233,7 +232,7 @@
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
service_graph: SG3
- service_nodes:
+ service_nodes:
- type: other
- type: firewall
filter_after_first_node: filters_from_contract
@@ -241,16 +240,16 @@
register: sg3_interchange
- name: Verify sg3_interchange
- assert:
+ ansible.builtin.assert:
that:
- - sg3_interchange is changed
- - sg3_interchange.current.name == "SG3"
- - sg3_interchange.current.displayName == "SG3"
- - sg3_interchange.current.nodeFilter == "filters-from-contract"
- - sg3_interchange.current.serviceGraphRef.templateName == "Template1"
- - sg3_interchange.current.serviceNodes.1.name == "firewall"
- - sg3_interchange.current.serviceNodes.0.name == "other"
- - sg3_interchange.current.serviceNodes | length == 2
+ - sg3_interchange is changed
+ - sg3_interchange.current.name == "SG3"
+ - sg3_interchange.current.displayName == "SG3"
+ - sg3_interchange.current.nodeFilter == "filters-from-contract"
+ - sg3_interchange.current.serviceGraphRef.templateName == "Template1"
+ - sg3_interchange.current.serviceNodes.1.name == "node2"
+ - sg3_interchange.current.serviceNodes.0.name == "node1"
+ - sg3_interchange.current.serviceNodes | length == 2
- name: Create another service graph with non existing node type
cisco.mso.mso_schema_template_service_graph:
@@ -258,7 +257,7 @@
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template1
service_graph: SG4
- service_nodes:
+ service_nodes:
- type: non_existing_type
filter_after_first_node: filters_from_contract
state: present
@@ -266,9 +265,9 @@
ignore_errors: true
- name: Verify sg4
- assert:
+ ansible.builtin.assert:
that:
- - sg4.msg == "Provided service node type 'non_existing_type' does not exist. Existing node types include{{':'}} firewall, load-balancer, other",
+ - sg4.msg == "Provided service node type 'non_existing_type' does not exist. Existing node types include{{':'}} firewall, load-balancer, other",
- name: Query service graph SG
cisco.mso.mso_schema_template_service_graph:
@@ -280,16 +279,16 @@
register: query_sg
- name: Verify query_sg
- assert:
+ ansible.builtin.assert:
that:
- - query_sg is not changed
- - query_sg.current.name == "SG1"
- - query_sg.current.displayName == "sg"
- - query_sg.current.nodeFilter == "allow-all"
- - query_sg.current.serviceNodes | length == 3
- - query_sg.current.serviceNodes.0.name == "firewall"
- - query_sg.current.serviceNodes.1.name == "load-balancer"
- - query_sg.current.serviceNodes.2.name == "other"
+ - query_sg is not changed
+ - query_sg.current.name == "SG1"
+ - query_sg.current.displayName == "sg"
+ - query_sg.current.nodeFilter == "allow-all"
+ - query_sg.current.serviceNodes | length == 3
+ - query_sg.current.serviceNodes.0.name == "node1"
+ - query_sg.current.serviceNodes.1.name == "node2"
+ - query_sg.current.serviceNodes.2.name == "node3"
- name: Query all service graphs
cisco.mso.mso_schema_template_service_graph:
@@ -300,10 +299,10 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- - query_all is not changed
- - query_all.current | length == 3
+ - query_all is not changed
+ - query_all.current | length == 3
- name: Query non_existing service graph
cisco.mso.mso_schema_template_service_graph:
@@ -316,9 +315,9 @@
register: query_non_existing_sg
- name: Verify query_non_existing_sg
- assert:
+ ansible.builtin.assert:
that:
- - query_non_existing_sg.msg == "Service Graph 'non_existent' not found"
+ - query_non_existing_sg.msg == "Service Graph 'non_existent' not found"
- name: Use non_existing schema
cisco.mso.mso_schema_template_service_graph:
@@ -341,10 +340,10 @@
register: query_non_existing_template
- name: Verify query_non_existing_schema and query_non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- - query_non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
- - query_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1"
+ - query_non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
+ - query_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1"
- name: Remove service graph (check mode)
cisco.mso.mso_schema_template_service_graph:
@@ -357,11 +356,11 @@
check_mode: true
- name: Verify rm_sg_cm
- assert:
+ ansible.builtin.assert:
that:
- - rm_sg_cm is changed
- - rm_sg_cm.current == {}
- - rm_sg_cm.previous.name == "SG1"
+ - rm_sg_cm is changed
+ - rm_sg_cm.current == {}
+ - rm_sg_cm.previous.name == "SG1"
- name: Remove service graph (normal mode)
cisco.mso.mso_schema_template_service_graph:
@@ -373,11 +372,11 @@
register: rm_sg
- name: Verify rm_sg
- assert:
+ ansible.builtin.assert:
that:
- - rm_sg is changed
- - rm_sg.current == {}
- - rm_sg.previous.name == "SG1"
+ - rm_sg is changed
+ - rm_sg.current == {}
+ - rm_sg.previous.name == "SG1"
- name: Remove service graph again
cisco.mso.mso_schema_template_service_graph:
@@ -389,8 +388,8 @@
register: rm_sg_again
- name: Verify rm_sg_again
- assert:
+ ansible.builtin.assert:
that:
- - rm_sg_again is not changed
- - rm_sg_again.current == {}
- - rm_sg_again.previous == {}
+ - rm_sg_again is not changed
+ - rm_sg_again.current == {}
+ - rm_sg_again.previous == {}
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf/tasks/main.yml
index 0f25a76b0..ed6a2cdd5 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf/tasks/main.yml
@@ -8,14 +8,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -26,7 +26,7 @@
output_level: '{{ mso_output_level | default("info") }}'
# - name: Ensure site exist
-# mso_site: &site_present
+# cisco.mso.mso_site: &site_present
# host: '{{ mso_hostname }}'
# username: '{{ mso_username }}'
# password: '{{ mso_password }}'
@@ -43,7 +43,7 @@
# state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -52,7 +52,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -62,7 +62,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -70,7 +70,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -78,7 +78,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -86,7 +86,7 @@
state: present
- name: Ensure Filter 1 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -95,7 +95,7 @@
state: present
- name: Ensure Contract1 exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -107,7 +107,7 @@
# ADD VRF1
- name: Add a new VRF1 (check mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -117,14 +117,14 @@
register: vrf1_cm
- name: Verify vrf1_cm
- assert:
+ ansible.builtin.assert:
that:
- vrf1_cm is changed
- vrf1_cm.current.name == 'VRF1'
- vrf1_cm.current.displayName == 'VRF1'
- name: Add VRF1 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -133,14 +133,14 @@
register: vrf1_nm
- name: Verify vrf1_nm
- assert:
+ ansible.builtin.assert:
that:
- vrf1_nm is changed
- vrf1_nm.current.name == 'VRF1'
- vrf1_nm.current.displayName == 'VRF1'
- name: Add VRF2 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -151,7 +151,7 @@
register: vrf2_nm
- name: Verify vrf2_nm
- assert:
+ ansible.builtin.assert:
that:
- vrf2_nm is changed
- vrf2_nm.current.name == 'VRF2'
@@ -160,7 +160,7 @@
- vrf2_nm.current.l3MCast == True
- name: Add VRF3 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -169,14 +169,14 @@
register: vrf3_nm
- name: Verify vrf3_nm
- assert:
+ ansible.builtin.assert:
that:
- vrf3_nm is changed
- vrf3_nm.current.name == 'VRF3'
- vrf3_nm.current.displayName == 'VRF3'
- name: Add preferred_group to VRF3 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -186,7 +186,7 @@
register: vrf3_nm_change
- name: Verify vrf3_nm_change
- assert:
+ ansible.builtin.assert:
that:
- vrf3_nm_change is changed
- vrf3_nm_change.current.name == 'VRF3'
@@ -194,7 +194,7 @@
# ADD EXISTING VRF
- name: Add VRF2 again (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -205,13 +205,13 @@
register: vrf2_nm_again
- name: Verify vrf2_nm_again
- assert:
+ ansible.builtin.assert:
that:
- vrf2_nm_again is not changed
# CHANGE VRF SETTINGS
- name: Change VRF1 settings (check mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -223,7 +223,7 @@
register: vrf1_change_cm
- name: Change VRF1 settings (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -234,7 +234,7 @@
register: vrf1_change_nm
- name: Change VRF2 settings (check mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -248,7 +248,7 @@
register: vrf2_change_cm
- name: Change VRF2 settings (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -261,7 +261,7 @@
register: vrf2_change_nm
- name: Verify vrf2_nm
- assert:
+ ansible.builtin.assert:
that:
- vrf1_change_cm is changed
- vrf1_change_nm is changed
@@ -278,7 +278,7 @@
# ADD VRF4 WITH NO STATE
- name: Add VRF4 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -287,13 +287,13 @@
register: vrf4_nm_stateless
- name: Verify vrf4_nm_stateless
- assert:
+ ansible.builtin.assert:
that:
- vrf4_nm_stateless is changed
# QUERY A VRF
- name: Query VRF2 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -302,13 +302,13 @@
register: vrf2_query
- name: Verify vrf2_query
- assert:
+ ansible.builtin.assert:
that:
- vrf2_query is not changed
# QUERY ALL VRFs
- name: Query all (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -316,13 +316,13 @@
register: vrfs_query
- name: Verify vrfs_query
- assert:
+ ansible.builtin.assert:
that:
- vrfs_query is not changed
# REMOVE A VRF
- name: Remove VRF3 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -331,7 +331,7 @@
register: vrf3_remove
- name: Verify vrf3_remove
- assert:
+ ansible.builtin.assert:
that:
- vrf3_remove is changed
- vrf3_remove.previous.name == 'VRF3'
@@ -339,7 +339,7 @@
# REMOVE A VRF
- name: Remove VRF3 again (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -348,13 +348,13 @@
register: vrf3_remove_again
- name: Verify vrf3_remove_again
- assert:
+ ansible.builtin.assert:
that:
- vrf3_remove_again is not changed
# QUERY REMOVED VRF
- name: Query VRF3 (normal mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -364,13 +364,13 @@
register: vrf3_query_removed
- name: Verify vrf3_query_removed
- assert:
+ ansible.builtin.assert:
that:
- vrf3_query_removed.msg == "VRF 'VRF3' not found"
# Enable vzAny on VRF
- name: Ensure VRF exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -379,7 +379,7 @@
state: present
- name: Add Contract1 to VRF with type consumer (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -391,7 +391,7 @@
register: nm_add_contract1_consumer
- name: Verify nm_add_contract1_consumer
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_consumer is changed
- nm_add_contract1_consumer.previous == {}
@@ -400,7 +400,7 @@
- nm_add_contract1_consumer.current.relationshipType == "consumer"
- name: Add Contract1 to VRF with type provider (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -412,7 +412,7 @@
register: nm_add_contract1_provider
- name: Verify nm_add_contract1_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_provider is changed
- nm_add_contract1_provider.previous == {}
@@ -422,7 +422,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for VRF (check_mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: non_existing_schema
template: Template 1
@@ -432,7 +432,7 @@
register: cm_non_existing_schema
- name: Non-existing schema for VRF (normal_mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: non_existing_schema
template: Template 1
@@ -441,7 +441,7 @@
register: nm_non_existing_schema
- name: Verify nm_non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_schema is not changed
- nm_non_existing_schema is not changed
@@ -450,7 +450,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing template for vrf (check_mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non_existing_template
@@ -460,7 +460,7 @@
register: cm_non_existing_template
- name: Non-existing template for vrf (normal_mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non_existing_template
@@ -469,7 +469,7 @@
register: nm_non_existing_template
- name: Verify non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_template is not changed
- nm_non_existing_template is not changed
@@ -478,7 +478,7 @@
# Checking if contract are removed after re-applying an VRF.
- name: Add VRF again (normal_mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -488,12 +488,12 @@
register: nm_add_VRF_again
- name: Verify that VRF didn't changed
- assert:
+ ansible.builtin.assert:
that:
- nm_add_VRF_again is not changed
- name: Verify contract VRF again
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -502,14 +502,14 @@
register: nm_query_vrf_contract_again
- name: Verify 2 contracts are in VRF
- assert:
+ ansible.builtin.assert:
that:
- nm_query_vrf_contract_again is not changed
- nm_query_vrf_contract_again.current | length == 2
# Checking if modifying VRF with existing contracts throw an MSO error. (#82)
- name: Change VRF (normal_mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -520,14 +520,14 @@
register: nm_change_vrf
- name: Verify that VRF did change
- assert:
+ ansible.builtin.assert:
that:
- nm_change_vrf is changed
- nm_change_vrf.current.name == "VRF"
- nm_change_vrf.current.l3MCast == True
- name: Verify contract VRF again
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -536,7 +536,7 @@
register: nm_query_change_vrf_contract_again
- name: Verify 2 contracts are in VRF
- assert:
+ ansible.builtin.assert:
that:
- nm_query_change_vrf_contract_again is not changed
- nm_query_change_vrf_contract_again.current | length == 2
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf_contract/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf_contract/tasks/main.yml
index 3a5f816a1..931af593a 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf_contract/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_template_vrf_contract/tasks/main.yml
@@ -7,14 +7,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -25,7 +25,7 @@
output_level: '{{ mso_output_level | default("info") }}'
# - name: Ensure site exist
-# mso_site: &site_present
+# cisco.mso.mso_site: &site_present
# host: '{{ mso_hostname }}'
# username: '{{ mso_username }}'
# password: '{{ mso_password }}'
@@ -42,7 +42,7 @@
# state: present
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -51,7 +51,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exist
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -61,7 +61,7 @@
state: present
- name: Ensure schema 1 with Template 1 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -69,7 +69,7 @@
state: present
- name: Ensure schema 1 with Template 2 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
tenant: ansible_test
@@ -77,7 +77,7 @@
state: present
- name: Ensure schema 2 with Template 3 exist
- mso_schema_template:
+ cisco.mso.mso_schema_template:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
tenant: ansible_test
@@ -85,7 +85,7 @@
state: present
- name: Ensure VRF exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -93,7 +93,7 @@
state: present
- name: Ensure VRF2 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -102,7 +102,7 @@
state: present
- name: Ensure VRF3 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -111,7 +111,7 @@
state: present
- name: Ensure VRF4 exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -120,7 +120,7 @@
state: present
- name: Ensure Filter 1 exist
- mso_schema_template_filter_entry:
+ cisco.mso.mso_schema_template_filter_entry:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -129,7 +129,7 @@
state: present
- name: Ensure Contract1 exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -140,7 +140,7 @@
state: present
- name: Ensure Contract4 exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -151,7 +151,7 @@
state: present
- name: Ensure Contract2 exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -162,7 +162,7 @@
state: present
- name: Ensure Contract3 exist
- mso_schema_template_contract_filter:
+ cisco.mso.mso_schema_template_contract_filter:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -174,7 +174,7 @@
# ADD Contract to VRF
- name: Add Contract1 to VRF with vzany disabled
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -187,13 +187,13 @@
register: add_contract1_vrf_vzany_disabled
- name: Verify add_contract1_vrf_vzany_disabled
- assert:
+ ansible.builtin.assert:
that:
- add_contract1_vrf_vzany_disabled.msg == "vzAny attribute on vrf 'VRF' is disabled."
# Enable vzAny on VRF
- name: Ensure VRF exist
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -202,7 +202,7 @@
state: present
- name: Add Contract1 to VRF with type consumer (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -215,7 +215,7 @@
register: cm_add_contract1_consumer
- name: Verify cm_add_contract1_consumer
- assert:
+ ansible.builtin.assert:
that:
- cm_add_contract1_consumer is changed
- cm_add_contract1_consumer.previous == {}
@@ -224,7 +224,7 @@
- cm_add_contract1_consumer.current.relationshipType == "consumer"
- name: Add Contract1 to VRF with type consumer (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -236,7 +236,7 @@
register: nm_add_contract1_consumer
- name: Verify nm_add_contract1_consumer
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_consumer is changed
- nm_add_contract1_consumer.previous == {}
@@ -246,7 +246,7 @@
- cm_add_contract1_consumer.current.contractRef.schemaId == nm_add_contract1_consumer.current.contractRef.schemaId
- name: Add Contract1 to VRF with type provider (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -258,7 +258,7 @@
register: nm_add_contract1_provider
- name: Verify nm_add_contract1_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_provider is changed
- nm_add_contract1_provider.previous == {}
@@ -267,7 +267,7 @@
- nm_add_contract1_provider.current.relationshipType == "provider"
- name: Add Contract1 to VRF with type consumer again(normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -279,7 +279,7 @@
register: nm_add_contract1_consumer_again
- name: Verify nm_add_contract1_consumer_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_consumer_again is not changed
- nm_add_contract1_consumer_again.current.contractRef.templateName == "Template1" == nm_add_contract1_consumer_again.previous.contractRef.templateName
@@ -287,7 +287,7 @@
- nm_add_contract1_consumer_again.current.relationshipType == "consumer" == nm_add_contract1_consumer_again.previous.relationshipType
- name: Add Contract1 to VRF with type provider again(normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -299,7 +299,7 @@
register: nm_add_contract1_provider_again
- name: Verify nm_add_contract1_provider_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_contract1_provider_again is not changed
- nm_add_contract1_provider_again.current.contractRef.templateName == "Template1" == nm_add_contract1_provider_again.previous.contractRef.templateName
@@ -307,7 +307,7 @@
- nm_add_contract1_provider_again.current.relationshipType == "provider" == nm_add_contract1_provider_again.previous.relationshipType
- name: Add Contract4 to VRF2 with type consumer (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -321,7 +321,7 @@
register: nm_add_vrf2_consumer
- name: Add Contract4 to VRF2 with type provider (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -335,7 +335,7 @@
register: nm_add_vrf2_provider
- name: nm_add_vrf2_consumer and nm_add_vrf2_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_add_vrf2_consumer is changed
- nm_add_vrf2_provider is changed
@@ -346,7 +346,7 @@
- nm_add_vrf2_provider.current.relationshipType == "provider"
- name: Add Contract3 to VRF3 with type consumer (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -360,7 +360,7 @@
register: nm_add_vrf3_consumer
- name: Add Contract3 to VRF3 with type provider (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 2
@@ -374,7 +374,7 @@
register: nm_add_vrf3_provider
- name: nm_add_vrf3_consumer and nm_add_vrf3_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_add_vrf3_consumer is changed
- nm_add_vrf3_provider is changed
@@ -385,7 +385,7 @@
- nm_add_vrf3_provider.current.relationshipType == "provider"
- name: Add Contract2 to VRF4 with type consumer (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -399,7 +399,7 @@
register: nm_add_vrf4_consumer
- name: Add Contract2 to VRF4 with type provider (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}_2'
template: Template 3
@@ -413,7 +413,7 @@
register: nm_add_vrf4_provider
- name: nm_add_vrf4_consumer and nm_add_vrf4_provider
- assert:
+ ansible.builtin.assert:
that:
- nm_add_vrf4_consumer is changed
- nm_add_vrf4_provider is changed
@@ -425,7 +425,7 @@
# REMOVE A Contract to VRF
- name: Remove contract4 to VRF2 - provider (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -438,7 +438,7 @@
register: cm_remove_contract4_vrf2_provider
- name: Remove contract4 to VRF2 - provider (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -450,7 +450,7 @@
register: nm_remove_contract4_vrf2_provider
- name: Remove contract4 to VRF2 - consumer (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -462,7 +462,7 @@
register: nm_remove_contract4_vrf2_consumer
- name: Verify cm_remove_contract4_vrf2_provider and cm_remove_contract4_vrf2_provider and nm_remove_contract4_vrf2_consumer
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_contract4_vrf2_provider is changed
- nm_remove_contract4_vrf2_provider is changed
@@ -478,7 +478,7 @@
- nm_remove_contract4_vrf2_consumer.previous.relationshipType == "consumer"
- name: Remove contract4 to VRF2 - provider again (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -490,7 +490,7 @@
register: nm_remove_contract4_vrf2_provider_again
- name: Verify nm_remove_contract4_vrf2_provider_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_contract4_vrf2_provider_again is not changed
- nm_remove_contract4_vrf2_provider_again.previous == {}
@@ -498,7 +498,7 @@
# QUERY A Contract to VRF
- name: Query Contract1 relationship for VRF - consumer (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -511,7 +511,7 @@
register: cm_query_VRF_contract1_consumer
- name: Query Contract1 relationship for VRF - consumer (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -524,7 +524,7 @@
register: nm_query_VRF_contract1_consumer
- name: Verify cm_query_VRF_contract1_consumer and nm_query_VRF_contract1_consumer
- assert:
+ ansible.builtin.assert:
that:
- cm_query_VRF_contract1_consumer is not changed
- nm_query_VRF_contract1_consumer is not changed
@@ -534,7 +534,7 @@
- cm_query_VRF_contract1_consumer.current.contractRef.templateName == nm_query_VRF_contract1_consumer.current.contractRef.templateName == "Template1"
- name: Query Contract1 relationship for VRF - provider (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -547,7 +547,7 @@
register: cm_query_VRF_contract1_provider
- name: Query Contract1 relationship for VRF - provider (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -560,7 +560,7 @@
register: nm_query_VRF_contract1_provider
- name: Verify cm_query_VRF_contract1_provider and nm_query_VRF_contract1_provider
- assert:
+ ansible.builtin.assert:
that:
- cm_query_VRF_contract1_provider is not changed
- nm_query_VRF_contract1_provider is not changed
@@ -571,7 +571,7 @@
# QUERY ALL Contract to VRF
- name: Query all contracts relationship for VRF (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -581,7 +581,7 @@
register: cm_query_all_contract_vrf
- name: Query all contracts relationship for VRF (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -590,7 +590,7 @@
register: nm_query_all_contract_vrf
- name: Verify cm_query_all_contract_vrf and nm_query_all_contract_vrf
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_contract_vrf is not changed
- cm_query_all_contract_vrf is not changed
@@ -598,7 +598,7 @@
# QUERY ALL Contracts to VRF2
- name: Query all contracts relationship for VRF2 (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -608,7 +608,7 @@
register: cm_query_all_contract_vrf2
- name: Query all contracts relationship for VRF2 (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -617,7 +617,7 @@
register: nm_query_all_contract_vrf2
- name: Verify cm_query_all_contract_vrf2 and nm_query_all_contract_vrf2
- assert:
+ ansible.builtin.assert:
that:
- nm_query_all_contract_vrf2 is not changed
- cm_query_all_contract_vrf2 is not changed
@@ -625,7 +625,7 @@
# QUERY NON-EXISTING Contract to VRF
- name: Query non-existing contract (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -639,7 +639,7 @@
register: cm_query_non_existing_contract
- name: Query non-existing contract (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -652,7 +652,7 @@
register: nm_query_non_existing_contract
- name: Verify cm_query_non_existing_contract and nm_query_non_existing_contract
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_contract is not changed
- nm_query_non_existing_contract is not changed
@@ -662,7 +662,7 @@
# QUERY NON-EXISTING VRF
- name: Query non-existing VRF (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -673,7 +673,7 @@
register: cm_query_non_existing_vrf
- name: Query non-existing VRF (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -683,7 +683,7 @@
register: nm_query_non_existing_vrf
- name: Verify cm_query_non_existing_vrf and nm_query_non_existing_vrf
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_vrf is not changed
- nm_query_non_existing_vrf is not changed
@@ -693,7 +693,7 @@
# USE A NON-EXISTING SCHEMA
- name: Non-existing schema for contract relationship (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: non_existing_schema
template: Template 1
@@ -704,7 +704,7 @@
register: cm_query_non_existing_schema
- name: Non-existing schema for contract relationship (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: non_existing_schema
template: Template 1
@@ -714,7 +714,7 @@
register: nm_query_non_existing_schema
- name: Verify cm_query_non_existing_schema and nm_query_non_existing_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_schema is not changed
- nm_query_non_existing_schema is not changed
@@ -722,7 +722,7 @@
- nm_query_non_existing_schema.msg == "Provided schema 'non_existing_schema' does not exist."
- name: Non-existing contract schema for contract relationship (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -737,7 +737,7 @@
register: cm_query_non_existing_contract_schema
- name: Non-existing schema for contract relationship (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -751,7 +751,7 @@
register: nm_query_non_existing_contract_schema
- name: Verify cm_query_non_existing_contract_schema and nm_query_non_existing_contract_schema
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_contract_schema is not changed
- nm_query_non_existing_contract_schema is not changed
@@ -760,7 +760,7 @@
# USE A NON-EXISTING TEMPLATE
- name: Non-existing templateName for contract relationship (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non_existing_template
@@ -771,7 +771,7 @@
register: cm_query_non_existing_template
- name: Non-existing templateName for contract relationship (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: non_existing_template
@@ -781,7 +781,7 @@
register: nm_query_non_existing_template
- name: Verify cm_query_non_existing_template and nm_query_non_existing_template
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_template is not changed
- nm_query_non_existing_template is not changed
@@ -789,7 +789,7 @@
- nm_query_non_existing_template.msg == "Provided template 'non_existing_template' does not exist. Existing templates{{':'}} Template1, Template2"
- name: Non-existing contract templateName for contract relationship (check_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -805,7 +805,7 @@
register: cm_query_non_existing_contract_template
- name: Non-existing contract templateName for contract relationship (normal_mode)
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -820,7 +820,7 @@
register: nm_query_non_existing_contract_template
- name: Verify cm_query_non_existing_contract_template and nm_query_non_existing_contract_template
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_existing_contract_template is not changed
- nm_query_non_existing_contract_template is not changed
@@ -829,7 +829,7 @@
# Checking if contract are removed after re-applying an VRF.
- name: Add VRF again (normal_mode)
- mso_schema_template_vrf:
+ cisco.mso.mso_schema_template_vrf:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -839,12 +839,12 @@
register: nm_add_VRF_again
- name: Verify that VRF didn't changed
- assert:
+ ansible.builtin.assert:
that:
- nm_add_VRF_again is not changed
- name: Verify contract VRF again
- mso_schema_template_vrf_contract:
+ cisco.mso.mso_schema_template_vrf_contract:
<<: *mso_info
schema: '{{ mso_schema | default("ansible_test") }}'
template: Template 1
@@ -853,7 +853,7 @@
register: nm_query_vrf_contract_again
- name: Verify 2 contracts are in VRF
- assert:
+ ansible.builtin.assert:
that:
- nm_query_vrf_contract_again is not changed
- nm_query_vrf_contract_again.current | length == 2 \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_validate/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_validate/tasks/main.yml
index 9de7d1fb1..54217c8e6 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_validate/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_schema_validate/tasks/main.yml
@@ -5,7 +5,7 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_service_node_type/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_service_node_type/tasks/main.yml
index d6b25df94..22c497200 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_service_node_type/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_service_node_type/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -40,7 +40,7 @@
check_mode: true
- name: Verify node_cm
- assert:
+ ansible.builtin.assert:
that:
- node_cm is changed
- node_cm.current.displayName == "test"
@@ -55,7 +55,7 @@
register: node1
- name: Verify node1
- assert:
+ ansible.builtin.assert:
that:
- node1 is changed
- node1.current.displayName == "test"
@@ -69,7 +69,7 @@
register: node2
- name: Verify node2
- assert:
+ ansible.builtin.assert:
that:
- node2 is changed
- node2.current.displayName == "TEST2"
@@ -83,7 +83,7 @@
register: node2_again
- name: Verify node2_again
- assert:
+ ansible.builtin.assert:
that:
- node2_again is not changed
- node2_again.current.displayName == "TEST2"
@@ -99,7 +99,7 @@
ignore_errors: true
- name: Verify node2_different_display_name
- assert:
+ ansible.builtin.assert:
that:
- node2_different_display_name.msg == "Service Node Type 'TEST1' already exists with display name 'test' which is different from provided display name 'change_test'."
@@ -111,7 +111,7 @@
register: query_node1
- name: Verify query_node1
- assert:
+ ansible.builtin.assert:
that:
- query_node1 is not changed
- query_node1.current.displayName == "test"
@@ -124,7 +124,7 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all is not changed
- query_all.current | length >= 4
@@ -138,7 +138,7 @@
register: cm_rm
- name: Verify cm_rm
- assert:
+ ansible.builtin.assert:
that:
- cm_rm is changed
- cm_rm.previous.name == "TEST1"
@@ -151,7 +151,7 @@
register: rm_node1
- name: Verify rm_node1
- assert:
+ ansible.builtin.assert:
that:
- rm_node1 is changed
- rm_node1.current == {}
@@ -166,7 +166,7 @@
ignore_errors: true
- name: Verify query_absent
- assert:
+ ansible.builtin.assert:
that:
- query_absent.msg == "Service Node Type 'TEST1' not found"
@@ -178,7 +178,7 @@
register: rm_node2
- name: Verify rm_node2
- assert:
+ ansible.builtin.assert:
that:
- rm_node2 is changed
- rm_node2.current == {}
@@ -192,7 +192,7 @@
register: rm_node2_again
- name: Verify rm_node2_again
- assert:
+ ansible.builtin.assert:
that:
- rm_node2_again is not changed
- rm_node2_again.current == {}
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_site/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_site/tasks/main.yml
index 9285613cb..0da63e0d0 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_site/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_site/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
site_dict: {}
mso_info: &mso_info
host: '{{ mso_hostname }}'
@@ -23,13 +23,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Undeploy a schema 1 template 1
- mso_schema_template_deploy: &schema_undeploy
+ cisco.mso.mso_schema_template_deploy: &schema_undeploy
<<: *mso_info
schema: ansible_test
template: Template 1
@@ -41,7 +41,7 @@
- '{{ mso_site | default("ansible_test") }}_2'
- name: Undeploy a schema 1 template 2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *schema_undeploy
template: Template 2
site: '{{ item }}'
@@ -52,7 +52,7 @@
- '{{ mso_site | default("ansible_test") }}_2'
- name: Undeploy a schema 2 template 3
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *schema_undeploy
schema: ansible_test_2
template: Template 3
@@ -64,7 +64,7 @@
- '{{ mso_site | default("ansible_test") }}_2'
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -75,33 +75,32 @@
- 'Schema2'
- name: Remove tenant ansible_test
- mso_tenant: &tenant_absent
+ cisco.mso.mso_tenant: &tenant_absent
<<: *mso_info
tenant: ansible_test
state: absent
- name: Remove tenant ansible_test2
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_absent
tenant: ansible_test2
register: cm_remove_tenant
- name: Remove site
- mso_site: &site_absent
+ cisco.mso.mso_site: &site_absent
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
state: absent
- name: Remove site 2
- mso_site:
+ cisco.mso.mso_site:
<<: *site_absent
site: '{{ mso_site | default("ansible_test") }}_2'
register: cm_remove_site
-
# ADD SITE
- name: Add site (check_mode)
- mso_site: &site_present
+ cisco.mso.mso_site: &site_present
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -121,101 +120,100 @@
register: cm_add_site
- name: Verify cm_add_site
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site is changed
- cm_add_site.previous == {}
- name: Verify cm_add_site (MSO)
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site.current.id is not defined
- cm_add_site.current.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '<')
- name: Verify cm_add_site (ND)
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site.current.id == ""
- cm_add_site.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
- name: Add site (normal mode)
- mso_site: *site_present
+ cisco.mso.mso_site: *site_present
register: nm_add_site
- name: Verify nm_add_site
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site is changed
- nm_add_site.previous == {}
- name: Verify nm_add_site (MSO)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site.current.id is defined
- nm_add_site.current.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '<')
- name: Verify nm_add_site (ND)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
- name: Add site again (check_mode)
- mso_site: *site_present
+ cisco.mso.mso_site: *site_present
check_mode: true
register: cm_add_site_again
- name: Verify cm_add_site_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_again is not changed
- cm_add_site_again.current.id == nm_add_site.current.id
- name: Verify cm_add_site_again (MSO)
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_again.previous.name == mso_site|default("ansible_test")
- cm_add_site_again.current.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '<')
- name: Verify cm_add_site_again (ND)
- assert:
+ ansible.builtin.assert:
that:
- cm_add_site_again.previous.common.name == mso_site|default("ansible_test")
- cm_add_site_again.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
- name: Add site again (normal mode)
- mso_site: *site_present
+ cisco.mso.mso_site: *site_present
register: nm_add_site_again
- name: Verify nm_add_site_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_again is not changed
- nm_add_site_again.current.id == nm_add_site.current.id
- name: Verify nm_add_site_again (MSO)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_again.previous.name == mso_site|default("ansible_test")
- nm_add_site_again.current.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '<')
- name: Verify nm_add_site_again (ND)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_again.previous.common.name == mso_site|default("ansible_test")
- nm_add_site_again.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
-
# CHANGE SITE
- name: Change site (check_mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_present
site: '{{ mso_site | default("ansible_test") }}'
apic_login_domain: '{{ apic_login_domain | default("test") }}'
@@ -229,12 +227,12 @@
register: cm_change_site
- name: Verify cm_change_site
- assert:
+ ansible.builtin.assert:
that:
- cm_change_site.current.id == nm_add_site.current.id
- name: Verify cm_change_site (MSO)
- assert:
+ ansible.builtin.assert:
that:
- cm_change_site is changed
- cm_change_site.current.location.lat == 51.887318
@@ -245,13 +243,13 @@
when: version.current.version is version('3.2', '<')
- name: Verify cm_change_site (ND)
- assert:
+ ansible.builtin.assert:
that:
- cm_change_site.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
- name: Change site (normal mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_present
site: '{{ mso_site | default("ansible_test") }}'
apic_login_domain: '{{ apic_login_domain | default("test") }}'
@@ -265,12 +263,12 @@
register: nm_change_site
- name: Verify nm_change_site
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site.current.id == nm_add_site.current.id
- name: Verify nm_change_site (MSO)
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site is changed
- nm_change_site.current.location.lat == 51.887318
@@ -281,13 +279,13 @@
when: version.current.version is version('3.2', '<')
- name: Verify nm_change_site (ND)
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
- name: Change site again (check_mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_present
site: '{{ mso_site | default("ansible_test") }}'
apic_login_domain: '{{ apic_login_domain | default("test") }}'
@@ -301,13 +299,13 @@
register: cm_change_site_again
- name: Verify cm_change_site_again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_site_again is not changed
- cm_change_site_again.current.id == nm_add_site.current.id
- name: Verify cm_change_site_again (MSO)
- assert:
+ ansible.builtin.assert:
that:
- cm_change_site_again.current.location.lat == 51.887318
- cm_change_site_again.current.location.long == 5.447084
@@ -317,13 +315,13 @@
when: version.current.version is version('3.2', '<')
- name: Verify cm_change_site_again (ND)
- assert:
+ ansible.builtin.assert:
that:
- cm_change_site_again.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
- name: Change site again (normal mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_present
site: '{{ mso_site | default("ansible_test") }}'
apic_login_domain: '{{ apic_login_domain | default("test") }}'
@@ -337,13 +335,13 @@
register: nm_change_site_again
- name: Verify nm_change_site_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site_again is not changed
- nm_change_site_again.current.id == nm_add_site.current.id
- name: Verify nm_change_site_again (MSO)
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site_again.current.location.lat == 51.887318
- nm_change_site_again.current.location.long == 5.447084
@@ -353,48 +351,47 @@
when: version.current.version is version('3.2', '<')
- name: Verify nm_change_site_again (ND)
- assert:
+ ansible.builtin.assert:
that:
- nm_change_site_again.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
# QUERY ALL SITES
- name: Query all sites (check_mode)
- mso_site: &site_query
+ cisco.mso.mso_site: &site_query
<<: *mso_info
state: query
check_mode: true
register: cm_query_all_sites
- name: Query all sites (normal mode)
- mso_site: *site_query
+ cisco.mso.mso_site: *site_query
register: nm_query_all_sites
- name: Verify query_all_sites
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_sites is not changed
- nm_query_all_sites is not changed
# NOTE: Order of sites is not stable between calls
#- cm_query_all_sites == nm_query_all_sites
-
# QUERY A SITE
- name: Query our site
- mso_site:
+ cisco.mso.mso_site:
<<: *site_query
site: '{{ mso_site | default("ansible_test") }}'
check_mode: true
register: cm_query_site
- name: Query our site
- mso_site:
+ cisco.mso.mso_site:
<<: *site_query
site: '{{ mso_site | default("ansible_test") }}'
register: nm_query_site
- name: Verify query_site
- assert:
+ ansible.builtin.assert:
that:
- cm_query_site is not changed
- cm_query_site.current.id == nm_add_site.current.id
@@ -403,14 +400,14 @@
- cm_query_site == nm_query_site
- name: Verify query_site (MSO)
- assert:
+ ansible.builtin.assert:
that:
- cm_query_site.current.name == mso_site|default("ansible_test")
- nm_query_site.current.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '<')
- name: Verify query_site (ND)
- assert:
+ ansible.builtin.assert:
that:
- cm_query_site.current.common.name == mso_site|default("ansible_test")
- nm_query_site.current.common.name == mso_site|default("ansible_test")
@@ -418,65 +415,64 @@
# REMOVE SITE
- name: Remove site (check_mode)
- mso_site: *site_absent
+ cisco.mso.mso_site: *site_absent
check_mode: true
register: cm_remove_site
- name: Verify cm_remove_site
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_site is changed
- cm_remove_site.current == {}
- name: Remove site (normal mode)
- mso_site: *site_absent
+ cisco.mso.mso_site: *site_absent
register: nm_remove_site
- name: Verify nm_remove_site
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_site is changed
- nm_remove_site.current == {}
- name: Remove site again (check_mode)
- mso_site: *site_absent
+ cisco.mso.mso_site: *site_absent
check_mode: true
register: cm_remove_site_again
- name: Verify cm_remove_site_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_site_again is not changed
- cm_remove_site_again.current == {}
- name: Remove site again (normal mode)
- mso_site: *site_absent
+ cisco.mso.mso_site: *site_absent
register: nm_remove_site_again
- name: Verify nm_remove_site_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_site_again is not changed
- nm_remove_site_again.current == {}
-
# QUERY NON-EXISTING SITE
- name: Query non-existing site (check_mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_query
site: '{{ mso_site | default("ansible_test") }}'
check_mode: true
register: cm_query_non_site
- name: Query non-existing site (normal mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_query
site: '{{ mso_site | default("ansible_test") }}'
register: nm_query_non_site
# TODO: Implement more tests
- name: Verify query_non_site
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_site is not changed
- nm_query_non_site is not changed
@@ -484,7 +480,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state for site (check_mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_query
state: non-existing-state
check_mode: true
@@ -492,14 +488,14 @@
register: cm_non_existing_state
- name: Non-existing state for bd (normal_mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *site_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -508,7 +504,7 @@
# ADD SITE
- name: Add site (normal_mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -521,20 +517,20 @@
register: nm_add_site_no_location
- name: Verify nm_add_site_no_location
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_no_location is changed
- nm_add_site_no_location.previous == {}
- nm_add_site_no_location.current.id is defined
- name: Verify nm_add_site_no_location (MSO)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_no_location.current.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '<')
- name: Verify nm_add_site_no_location (ND)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_site_no_location.current.common.name == mso_site|default("ansible_test")
when: version.current.version is version('3.2', '>=')
@@ -543,18 +539,18 @@
when: version.current.version is version('4.0', '>=')
block:
- name: Query all sites (check_mode)
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
state: query
register: sites
- name: Add sites to dict
- set_fact:
+ ansible.builtin.set_fact:
site_dict: "{{ site_dict | combine( { item.common.name : { 'id' : item.id, 'site_group_id' : item.common.siteGroup } } ) }}"
loop: "{{ sites.current }}"
- name: Render a connectivity jinja2 template
- set_fact:
+ ansible.builtin.set_fact:
site_payload: "{{ lookup('template', 'connectivity.j2') }}"
- name: Configure site connectivity
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant/tasks/main.yml
index e5cc5a0e6..88a12ee95 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant/tasks/main.yml
@@ -4,14 +4,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,7 +22,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Ensure sites exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ item.site }}'
apic_username: '{{ item.username }}'
@@ -36,7 +36,7 @@
- { site: 'aws_{{ mso_site | default("ansible_test") }}', username: '{{ aws_apic_username }}', password: '{{ aws_apic_password }}', id: '{{ aws_site_id | default(102) }}', urls: '{{ aws_apic_hostname }}' }
- name: Undeploy a schema 1 template 1
- mso_schema_template_deploy: &schema_undeploy
+ cisco.mso.mso_schema_template_deploy: &schema_undeploy
<<: *mso_info
schema: ansible_test
template: Template 1
@@ -48,7 +48,7 @@
- 'aws_{{ mso_site | default("ansible_test") }}'
- name: Undeploy a schema 1 template 2
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *schema_undeploy
template: Template 2
site: '{{ item }}'
@@ -59,7 +59,7 @@
- 'aws_{{ mso_site | default("ansible_test") }}'
- name: Undeploy a schema 2 template 3
- mso_schema_template_deploy:
+ cisco.mso.mso_schema_template_deploy:
<<: *schema_undeploy
schema: ansible_test_2
template: Template 3
@@ -71,7 +71,7 @@
- 'aws_{{ mso_site | default("ansible_test") }}'
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -80,7 +80,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Remove tenants
- mso_tenant: &tenant_absent
+ cisco.mso.mso_tenant: &tenant_absent
<<: *mso_info
tenant: '{{ item }}'
state: absent
@@ -92,7 +92,7 @@
# ADD TENANT
- name: Add tenant (check_mode)
- mso_tenant: &tenant_present
+ cisco.mso.mso_tenant: &tenant_present
<<: *mso_info
tenant: ansible_test
display_name: Ansible test title
@@ -102,7 +102,7 @@
register: cm_add_tenant
- name: Verify cm_add_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant is changed
- cm_add_tenant.previous == {}
@@ -112,11 +112,11 @@
- cm_add_tenant.current.userAssociations | length == 1
- name: Add tenant (normal mode)
- mso_tenant: *tenant_present
+ cisco.mso.mso_tenant: *tenant_present
register: nm_add_tenant
- name: Verify nm_add_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant is changed
- nm_add_tenant.previous == {}
@@ -126,12 +126,12 @@
- nm_add_tenant.current.userAssociations | length == 1
- name: Add tenant again (check_mode)
- mso_tenant: *tenant_present
+ cisco.mso.mso_tenant: *tenant_present
check_mode: true
register: cm_add_tenant_again
- name: Verify cm_add_tenant_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_tenant_again is not changed
- cm_add_tenant_again.previous.name == 'ansible_test'
@@ -142,11 +142,11 @@
- cm_add_tenant_again.current.userAssociations == cm_add_tenant_again.previous.userAssociations
- name: Add tenant again (normal mode)
- mso_tenant: *tenant_present
+ cisco.mso.mso_tenant: *tenant_present
register: nm_add_tenant_again
- name: Verify nm_add_tenant_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_again is not changed
- nm_add_tenant_again.previous.name == 'ansible_test'
@@ -158,7 +158,7 @@
# ADD TENANT WITH USERS
- name: Add tenant 2 (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test2
users:
@@ -168,24 +168,24 @@
register: nm_add_tenant2
- name: Verify nm_add_tenant2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant2 is changed
- name: Verify nm_add_tenant2 (when mso_username != admin)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant2.current.userAssociations | length == 2
when: mso_username != 'admin'
- name: Verify nm_add_tenant2 (when mso_username == admin)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant2.current.userAssociations | length == 1
when: mso_username == 'admin'
- name: Add tenant 2 again (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test2
users:
@@ -195,24 +195,59 @@
register: nm_add_tenant2_again
- name: Verify nm_add_tenant2_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant2_again is not changed
- name: Verify nm_add_tenant2_again (when mso_username != admin)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant2_again.current.userAssociations | length == 2
when: mso_username != 'admin'
- name: Verify nm_add_tenant2_again (when mso_username == admin)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant2_again.current.userAssociations | length == 1
when: mso_username == 'admin'
+# ADD TENANT WITH REMOTE USERS
+- name: Add tenant 3 (check_mode)
+ cisco.mso.mso_tenant:
+ <<: *tenant_present
+ tenant: ansible_test3
+ display_name: null
+ remote_users:
+ - name: ansible_github_ci
+ login_domain: test
+ state: present
+ check_mode: true
+ register: cm_add_rmt_usr_tenant3
+
+- name: Verify cm_add_rmt_usr_tenant3
+ ansible.builtin.assert:
+ that:
+ - cm_add_rmt_usr_tenant3 is changed
+
+- name: Add tenant 3 (normal_mode)
+ cisco.mso.mso_tenant:
+ <<: *tenant_present
+ tenant: ansible_test3
+ display_name: null
+ remote_users:
+ - name: ansible_github_ci
+ login_domain: test
+ state: present
+ register: nm_add_rmt_usr_tenant3
+
+- name: Verify cm_add_rmt_usr_tenant3
+ ansible.builtin.assert:
+ that:
+ - nm_add_rmt_usr_tenant3 is changed
+ - nm_add_rmt_usr_tenant3.current.name == 'ansible_test3'
+
- name: Add tenant 3 with duplicate admin user (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test3
users:
@@ -224,13 +259,13 @@
register: nm_add_tenant3_with_duplicate_admin
- name: Verify nm_add_tenant3_with_duplicate_admin
- assert:
+ ansible.builtin.assert:
that:
- - nm_add_tenant3_with_duplicate_admin is not changed
+ - nm_add_tenant3_with_duplicate_admin is changed
- nm_add_tenant3_with_duplicate_admin.msg == "User 'admin' is duplicate."
- name: Add tenant 3 with invalid user (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test3
users:
@@ -241,41 +276,44 @@
register: nm_add_tenant3_with_invalid_user
- name: nm_add_tenant3_with_invalid_user
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant3_with_invalid_user is not changed
- nm_add_tenant3_with_invalid_user.msg == "User 'invalid user' is not a valid user name."
- name: Add tenant 3 (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test3
users:
- '{{ mso_username }}'
+ remote_users:
+ - name: ansible_github_ci
+ login_domain: test
display_name: null
state: present
register: nm_add_tenant3
- name: Verify nm_add_tenant3
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant3 is changed
- name: Verify nm_add_tenant3 (when mso_username != admin)
- assert:
+ ansible.builtin.assert:
that:
- - nm_add_tenant3.current.userAssociations | length == 2
+ - nm_add_tenant3.current.userAssociations | length == 3
when: mso_username != 'admin'
- name: Verify nm_add_tenant3 (when mso_username == admin)
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant3.current.userAssociations | length == 1
when: mso_username == 'admin'
# CHANGE TENANT
- name: Change tenant (check_mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test
description: Ansible test tenant 2
@@ -283,7 +321,7 @@
register: cm_change_tenant
- name: Verify cm_change_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_change_tenant is changed
- cm_change_tenant.current.id == nm_add_tenant.current.id
@@ -291,7 +329,7 @@
- cm_change_tenant.current.description == 'Ansible test tenant 2'
- name: Change tenant (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test
description: Ansible test tenant 2
@@ -299,7 +337,7 @@
register: nm_change_tenant
- name: Verify nm_change_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_change_tenant is changed
- nm_change_tenant.current.id == nm_add_tenant.current.id
@@ -307,7 +345,7 @@
- nm_change_tenant.current.description == 'Ansible test tenant 2'
- name: Change tenant again (check_mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test
description: Ansible test tenant 2
@@ -315,7 +353,7 @@
register: cm_change_tenant_again
- name: Verify cm_change_tenant_again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_tenant_again is not changed
- cm_change_tenant_again.current.id == nm_add_tenant.current.id
@@ -323,58 +361,56 @@
- cm_change_tenant_again.current.description == 'Ansible test tenant 2'
- name: Change tenant again (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: ansible_test
description: Ansible test tenant 2
register: nm_change_tenant_again
- name: Verify nm_change_tenant_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_tenant_again is not changed
- nm_change_tenant_again.current.id == nm_add_tenant.current.id
- nm_change_tenant_again.current.name == 'ansible_test'
- nm_change_tenant_again.current.description == 'Ansible test tenant 2'
-
# QUERY ALL TENANTS
- name: Query all tenants (check_mode)
- mso_tenant: &tenant_query
+ cisco.mso.mso_tenant: &tenant_query
<<: *mso_info
state: query
check_mode: true
register: cm_query_all_tenants
- name: Query all tenants (normal mode)
- mso_tenant: *tenant_query
+ cisco.mso.mso_tenant: *tenant_query
register: nm_query_all_tenants
- name: Verify query_all_tenants
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_tenants is not changed
- nm_query_all_tenants is not changed
# NOTE: Order of tenants is not stable between calls
#- cm_query_all_tenants == nm_query_all_tenants
-
# QUERY A TENANT
- name: Query our tenant
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_query
tenant: ansible_test
check_mode: true
register: cm_query_tenant
- name: Query our tenant
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_query
tenant: ansible_test
register: nm_query_tenant
- name: Verify query_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_query_tenant is not changed
- cm_query_tenant.current.id == nm_add_tenant.current.id
@@ -386,83 +422,81 @@
- nm_query_tenant.current.description == 'Ansible test tenant 2'
- cm_query_tenant.current == nm_query_tenant.current
-
# REMOVE TENANT
- name: Remove tenant (check_mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_absent
tenant: ansible_test
check_mode: true
register: cm_remove_tenant
- name: Verify cm_remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_tenant is changed
- cm_remove_tenant.current == {}
- name: Remove tenant (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_absent
tenant: ansible_test
register: nm_remove_tenant
- name: Verify nm_remove_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_tenant is changed
- nm_remove_tenant.current == {}
- name: Remove tenant again (check_mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_absent
tenant: ansible_test
check_mode: true
register: cm_remove_tenant_again
- name: Verify cm_remove_tenant_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_tenant_again is not changed
- cm_remove_tenant_again.current == {}
- name: Remove tenant again (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_absent
tenant: ansible_test
register: nm_remove_tenant_again
- name: Verify nm_remove_tenant_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_tenant_again is not changed
- nm_remove_tenant_again.current == {}
-
# QUERY NON-EXISTING TENANT
- name: Query non-existing tenant (check_mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_query
tenant: ansible_test
check_mode: true
register: cm_query_non_tenant
- name: Query non-existing tenant (normal mode)
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_query
tenant: ansible_test
register: nm_query_non_tenant
# TODO: Implement more tests
- name: Verify query_non_tenant
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_tenant is not changed
- nm_query_non_tenant is not changed
- cm_query_non_tenant.current == nm_query_non_tenant.current
- name: Add common tenant
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: common
display_name: common
@@ -470,13 +504,13 @@
register: nm_add_common_tenant
- name: Verify nm_add_common_tenant
- assert:
+ ansible.builtin.assert:
that:
- nm_add_common_tenant is changed
- nm_add_common_tenant.current.name == "common"
- name: Add tenant with site
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_present
tenant: tenant_with_site
display_name: tenant_with_site
@@ -484,37 +518,37 @@
register: nm_add_tenant_with_site
- name: Verify nm_add_tenant_with_site
- assert:
+ ansible.builtin.assert:
that:
- nm_add_tenant_with_site is changed
- nm_add_tenant_with_site.current.name == "tenant_with_site"
- name: Remove common tenant
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_absent
tenant: common
ignore_errors: true
register: rm_common
- name: Verify rm_common
- assert:
+ ansible.builtin.assert:
that:
- rm_common.msg is search("Common [Tt]enant cannot be deleted")
- name: Remove tenant_with_site
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *tenant_absent
tenant: tenant_with_site
register: rm_tenant_with_site
- name: Verify rm_tenant_with_site
- assert:
+ ansible.builtin.assert:
that:
- rm_tenant_with_site is changed
- rm_tenant_with_site.current == {}
- name: Remove "anstest_imp_tenant" to the MSO if exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: anstest_imp_tenant
display_name: anstest_imp_tenant_display_name
@@ -524,7 +558,7 @@
register: pre_test_anstest_imp_tenant_absent
- name: Import "anstest_imp_tenant" to the MSO with check mode
- mso_tenant: &cm_import_anstest_imp_tenant_present
+ cisco.mso.mso_tenant: &cm_import_anstest_imp_tenant_present
<<: *mso_info
tenant: anstest_imp_tenant
display_name: anstest_imp_tenant_display_name
@@ -535,7 +569,7 @@
register: cm_import_anstest_imp_tenant_present
- name: Assertions check for import "anstest_imp_tenant" to the MSO with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_import_anstest_imp_tenant_present is changed
- cm_import_anstest_imp_tenant_present.current != {}
@@ -545,12 +579,12 @@
- cm_import_anstest_imp_tenant_present.current.description == "anstest_imp_tenant_description"
- name: Import "anstest_imp_tenant" to the MSO with normal mode
- mso_tenant: &nm_import_anstest_imp_tenant_present
+ cisco.mso.mso_tenant: &nm_import_anstest_imp_tenant_present
<<: *cm_import_anstest_imp_tenant_present
register: nm_import_anstest_imp_tenant_present
- name: Assertions check for import "anstest_imp_tenant" to the MSO with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_import_anstest_imp_tenant_present is changed
- nm_import_anstest_imp_tenant_present.current != {}
@@ -560,12 +594,12 @@
- nm_import_anstest_imp_tenant_present.current.description == "anstest_imp_tenant_description"
- name: Import "anstest_imp_tenant" to the MSO with normal mode - idempotency works
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *nm_import_anstest_imp_tenant_present
register: idempotency_nm_import_anstest_imp_tenant_present
- name: Idempotency assertions check for import "anstest_imp_tenant" to the MSO with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_import_anstest_imp_tenant_present is not changed
- idempotency_nm_import_anstest_imp_tenant_present.current != {}
@@ -578,14 +612,14 @@
- idempotency_nm_import_anstest_imp_tenant_present.previous.description == "anstest_imp_tenant_description"
- name: Query a tenant with name "anstest_imp_tenant" when it is imported to the MSO
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: anstest_imp_tenant
state: query
register: query_anstest_imp_tenant
- name: Assertions check for query a tenant with name "anstest_imp_tenant" when it is imported to the MSO
- assert:
+ ansible.builtin.assert:
that:
- query_anstest_imp_tenant is not changed
- query_anstest_imp_tenant.current != {}
@@ -594,7 +628,7 @@
- query_anstest_imp_tenant.current.description == "anstest_imp_tenant_description"
- name: Remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value yes with check mode
- mso_tenant: &cm_anstest_imp_tenant_absent_orchestrator_only_yes
+ cisco.mso.mso_tenant: &cm_anstest_imp_tenant_absent_orchestrator_only_yes
<<: *mso_info
tenant: anstest_imp_tenant
orchestrator_only: yes
@@ -603,7 +637,7 @@
register: cm_anstest_imp_tenant_absent_orchestrator_only_yes
- name: Assertions check for remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value yes with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_anstest_imp_tenant_absent_orchestrator_only_yes is changed
- cm_anstest_imp_tenant_absent_orchestrator_only_yes.current == {}
@@ -613,12 +647,12 @@
- cm_anstest_imp_tenant_absent_orchestrator_only_yes.previous.description == "anstest_imp_tenant_description"
- name: Remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value yes with normal mode
- mso_tenant: &nm_anstest_imp_tenant_absent_orchestrator_only_yes
+ cisco.mso.mso_tenant: &nm_anstest_imp_tenant_absent_orchestrator_only_yes
<<: *cm_anstest_imp_tenant_absent_orchestrator_only_yes
register: nm_anstest_imp_tenant_absent_orchestrator_only_yes
- name: Assertions check for remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value yes with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_anstest_imp_tenant_absent_orchestrator_only_yes is changed
- nm_anstest_imp_tenant_absent_orchestrator_only_yes.current == {}
@@ -628,24 +662,24 @@
- nm_anstest_imp_tenant_absent_orchestrator_only_yes.previous.description == "anstest_imp_tenant_description"
- name: Remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value yes with normal mode - idempotency works
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *nm_anstest_imp_tenant_absent_orchestrator_only_yes
register: idempotency_nm_anstest_imp_tenant_absent_orchestrator_only_yes
- name: Idempotency assertions check for remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value yes with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_anstest_imp_tenant_absent_orchestrator_only_yes is not changed
- idempotency_nm_anstest_imp_tenant_absent_orchestrator_only_yes.current == {}
- idempotency_nm_anstest_imp_tenant_absent_orchestrator_only_yes.previous == {}
- name: Import "anstest_imp_tenant" to the MSO with normal mode once again
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *nm_import_anstest_imp_tenant_present
register: nm_import_tenant_once_again
- name: Assertions check for import "anstest_imp_tenant" to the MSO with normal mode once again
- assert:
+ ansible.builtin.assert:
that:
- nm_import_tenant_once_again is changed
- nm_import_tenant_once_again.current != {}
@@ -655,14 +689,14 @@
- nm_import_tenant_once_again.current.description == "anstest_imp_tenant_description"
- name: Update "anstest_imp_tenant" tenant description with check mode
- mso_tenant: &cm_update_anstest_imp_tenant
+ cisco.mso.mso_tenant: &cm_update_anstest_imp_tenant
<<: *nm_import_anstest_imp_tenant_present
description: "updated_anstest_imp_tenant_description"
check_mode: true
register: cm_update_anstest_imp_tenant
- name: Assertions check for update "anstest_imp_tenant" tenant description with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_update_anstest_imp_tenant is changed
- cm_update_anstest_imp_tenant.current != {}
@@ -675,12 +709,12 @@
- cm_update_anstest_imp_tenant.previous.description == "anstest_imp_tenant_description"
- name: Update "anstest_imp_tenant" tenant description with normal mode
- mso_tenant: &nm_update_anstest_imp_tenant
+ cisco.mso.mso_tenant: &nm_update_anstest_imp_tenant
<<: *cm_update_anstest_imp_tenant
register: nm_update_anstest_imp_tenant
- name: Assertions check for update "anstest_imp_tenant" tenant description with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_update_anstest_imp_tenant is changed
- nm_update_anstest_imp_tenant.current != {}
@@ -693,12 +727,12 @@
- nm_update_anstest_imp_tenant.previous.description == "anstest_imp_tenant_description"
- name: Update "anstest_imp_tenant" tenant description with normal mode - idempotency works
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *nm_update_anstest_imp_tenant
register: nm_idempotency_update_anstest_imp_tenant
- name: Idempotency assertions check for update "anstest_imp_tenant" tenant description with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_idempotency_update_anstest_imp_tenant is not changed
- nm_idempotency_update_anstest_imp_tenant.current != {}
@@ -712,7 +746,7 @@
# Orchestrator Only no will remove the tenant from MSO and APIC
- name: Remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value no with check mode
- mso_tenant: &cm_anstest_imp_tenant_absent_orchestrator_only_no
+ cisco.mso.mso_tenant: &cm_anstest_imp_tenant_absent_orchestrator_only_no
<<: *mso_info
tenant: anstest_imp_tenant
orchestrator_only: no
@@ -721,7 +755,7 @@
register: cm_anstest_imp_tenant_absent_orchestrator_only_no
- name: Assertions check for remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value no with check mode
- assert:
+ ansible.builtin.assert:
that:
- cm_anstest_imp_tenant_absent_orchestrator_only_no is changed
- cm_anstest_imp_tenant_absent_orchestrator_only_no.current == {}
@@ -731,12 +765,12 @@
- cm_anstest_imp_tenant_absent_orchestrator_only_no.previous.description == "updated_anstest_imp_tenant_description"
- name: Remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value no with normal mode
- mso_tenant: &nm_anstest_imp_tenant_absent_orchestrator_only_no
+ cisco.mso.mso_tenant: &nm_anstest_imp_tenant_absent_orchestrator_only_no
<<: *cm_anstest_imp_tenant_absent_orchestrator_only_no
register: nm_anstest_imp_tenant_absent_orchestrator_only_no
- name: Assertions check for remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value no with normal mode
- assert:
+ ansible.builtin.assert:
that:
- nm_anstest_imp_tenant_absent_orchestrator_only_no is changed
- nm_anstest_imp_tenant_absent_orchestrator_only_no.current == {}
@@ -746,12 +780,12 @@
- nm_anstest_imp_tenant_absent_orchestrator_only_no.previous.description == "updated_anstest_imp_tenant_description"
- name: Remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value no with normal mode - idempotency works
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *nm_anstest_imp_tenant_absent_orchestrator_only_no
register: idempotency_nm_anstest_imp_tenant_absent_orchestrator_only_no
- name: Idempotency assertions check for remove "anstest_imp_tenant" tenant from MSO and APIC using orchestrator_only flag value no with normal mode
- assert:
+ ansible.builtin.assert:
that:
- idempotency_nm_anstest_imp_tenant_absent_orchestrator_only_no is not changed
- idempotency_nm_anstest_imp_tenant_absent_orchestrator_only_no.current == {}
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant_site/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant_site/tasks/main.yml
index 7e3ce378c..0bb711447 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant_site/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_tenant_site/tasks/main.yml
@@ -6,14 +6,14 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -24,13 +24,13 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
- name: Remove schemas
- mso_schema:
+ cisco.mso.mso_schema:
<<: *mso_info
schema: '{{ item }}'
state: absent
@@ -39,7 +39,7 @@
- '{{ mso_schema | default("ansible_test") }}'
- name: Ensure tenant ansible_test exists to validate the invalid_site_mso_site
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -48,7 +48,7 @@
register: ansible_test_tenant_present
- name: Dissociate clouds that are associated with ansible_tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ item }}'
@@ -62,7 +62,7 @@
when: ansible_test_tenant_present.current != {}
- name: Assertion check for the tenant site dissociation
- assert:
+ ansible.builtin.assert:
that:
- tenant_site_absent_check.results.0.current == {}
- tenant_site_absent_check.warnings.0 == "Site 'invalid_site_ansible_test' is not a valid site name."
@@ -72,7 +72,7 @@
when: ansible_test_tenant_present.current != {}
- name: Remove tenant ansible_test
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -80,7 +80,7 @@
state: absent
- name: Ensure non-cloud site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: '{{ mso_site | default("ansible_test") }}'
apic_username: '{{ apic_username }}'
@@ -91,7 +91,7 @@
state: present
- name: Ensure azure site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'azure_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ azure_apic_username }}'
@@ -102,7 +102,7 @@
state: present
- name: Ensure aws site exists
- mso_site:
+ cisco.mso.mso_site:
<<: *mso_info
site: 'aws_{{ mso_site | default("ansible_test") }}'
apic_username: '{{ aws_apic_username }}'
@@ -113,7 +113,7 @@
state: present
- name: Ensure tenant ansible_test exists
- mso_tenant:
+ cisco.mso.mso_tenant:
<<: *mso_info
tenant: ansible_test
users:
@@ -121,7 +121,7 @@
state: present
- name: Associate non-cloud site with ansible_test in check mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
@@ -130,12 +130,12 @@
register: ncs_cm
- name: Verify ncs_cm
- assert:
+ ansible.builtin.assert:
that:
- ncs_cm is changed
- name: Associate non-cloud site with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
@@ -143,12 +143,12 @@
register: ncs_nm
- name: Verify ncs_nm
- assert:
+ ansible.builtin.assert:
that:
- ncs_nm is changed
- name: Associate non-cloud site with ansible_test again in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
@@ -156,12 +156,12 @@
register: ncs_nm_again
- name: Verify ncs_nm_again
- assert:
+ ansible.builtin.assert:
that:
- ncs_nm_again is not changed
- name: Associate aws site with ansible_test in check mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -174,7 +174,7 @@
register: aaws_cm
- name: Verify aaws_cm
- assert:
+ ansible.builtin.assert:
that:
- aaws_cm is changed
- aaws_cm.current.awsAccount != 'null'
@@ -182,7 +182,7 @@
- aaws_cm.current.awsAccount[0].isTrusted == false
- name: Associate aws site with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -194,7 +194,7 @@
register: aaws_nm
- name: Verify aaws_nm
- assert:
+ ansible.builtin.assert:
that:
- aaws_nm is changed
- aaws_nm.current.awsAccount != 'null'
@@ -202,7 +202,7 @@
- aaws_nm.current.awsAccount[0].isTrusted == false
- name: Associate aws site with ansible_test again in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -214,12 +214,12 @@
register: aaws_nm_again
- name: Verify aaws_nm_again
- assert:
+ ansible.builtin.assert:
that:
- aaws_nm_again is not changed
- name: Associate aws site with ansible_test in normal mode when aws_trusted is false and aws_access_key is missing
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -231,12 +231,12 @@
register: aaws_nm_ak
- name: Verify aaws_nm_ak
- assert:
+ ansible.builtin.assert:
that:
- aaws_nm_ak.msg is match ("aws_access_key is a required field in untrusted mode.")
- name: Associate aws site with ansible_test in normal mode when aws_trusted is true
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -246,12 +246,12 @@
register: aws_nm_trusted
- name: Verify aws_nm_trusted
- assert:
+ ansible.builtin.assert:
that:
- aws_nm_trusted is changed
- name: Associate aws site with ansible_test in normal mode when aws_trusted is false and secret_key is missing
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -263,12 +263,12 @@
register: aaws_nm_sk
- name: Verify aaws_nm_sk
- assert:
+ ansible.builtin.assert:
that:
- aaws_nm_sk.msg is match ("secret_key is a required field in untrusted mode.")
- name: Associate aws site with ansible_test, with organization mode true
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -281,12 +281,12 @@
register: aaws_nm_om
- name: Verify aaws_nm_om
- assert:
+ ansible.builtin.assert:
that:
- aaws_nm_om.current.awsAccount[0].isAccountInOrg == true
- name: Associate azure site with access_type not present, with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -295,12 +295,12 @@
register: aazure_shared_nm
- name: Verify aazure_shared_nm
- assert:
+ ansible.builtin.assert:
that:
- aazure_shared_nm is changed
- name: Associate azure site in shared mode with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -310,12 +310,12 @@
register: aazure_shared_nm
- name: Verify aazure_shared_nm
- assert:
+ ansible.builtin.assert:
that:
- aazure_shared_nm is not changed
- name: Associate azure site with managed mode, with ansible_test in normal mode having no application_id
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -327,12 +327,12 @@
register: aazure_managed_nm_app
- name: Verify aazure_managed_nm_app
- assert:
+ ansible.builtin.assert:
that:
- aazure_managed_nm_app.msg is match ("azure_application_id is required when in managed mode.")
- name: Associate azure site with managed mode, with ansible_test in normal mode having no subscription_id
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -344,12 +344,12 @@
register: aazure_managed_nm_si
- name: Verify aazure_managed_nm_si
- assert:
+ ansible.builtin.assert:
that:
- aazure_managed_nm_si.msg is match ("azure_susbscription_id is required when in managed mode.")
- name: Associate azure site with managed mode, with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -362,7 +362,7 @@
register: aazure_managed_nm
- name: Verify aazure_managed_nm
- assert:
+ ansible.builtin.assert:
that:
- aazure_managed_nm is changed
- aazure_managed_nm.current.azureAccount != 'null'
@@ -372,7 +372,7 @@
- aazure_managed_nm.current.azureAccount[0].cloudActiveDirectory == []
- name: Associate azure site with credentials mode, with ansible_test in normal mode having no azure_subscription_id
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -388,12 +388,12 @@
register: aazure_credentials_nm_si
- name: Verify aazure_credentials_nm_si
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm_si.msg is match ("azure_subscription_id is required when in unmanaged mode.")
- name: Associate azure site with credentials mode, with ansible_test in normal mode having no azure_application_id
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -409,12 +409,12 @@
register: aazure_credentials_nm_app
- name: Verify aazure_credentials_nm_app
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm_app.msg is match ("azure_application_id is required when in unmanaged mode.")
- name: Associate azure site with credentials mode, with ansible_test in normal mode having no secret_key
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -430,12 +430,12 @@
register: aazure_credentials_nm_secret
- name: Verify aazure_credentials_nm_secret
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm_secret.msg is match ("secret_key is required when in unmanaged mode.")
- name: Associate azure site with credentials mode, with ansible_test in normal mode having no azure_active_directory_id
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -451,12 +451,12 @@
register: aazure_credentials_nm_ad
- name: Verify aazure_credentials_nm_ad
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm_ad.msg is match ("azure_active_directory_id is required when in unmanaged mode.")
- name: Associate azure site with credentials mode, with ansible_test in normal mode having no azure_active_directory_name
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -472,12 +472,12 @@
register: aazure_credentials_nm_adn
- name: Verify aazure_credentials_nm_adn
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm_adn.msg is match ("azure_active_directory_name is required when in unmanaged mode.")
- name: Associate azure site with credentials mode, with ansible_test in normal mode having no azure_credential_name
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -493,12 +493,12 @@
register: aazure_credentials_nm_cdn
- name: Verify aazure_credentials_nm_cdn
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm_cdn.msg is match ("azure_credential_name is required when in unmanaged mode.")
- name: Associate azure site with credentials mode, with ansible_test in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -514,7 +514,7 @@
register: aazure_credentials_nm
- name: Verify aazure_credentials_nm
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm is changed
- aazure_credentials_nm.current.azureAccount[0].cloudSubscription.cloudApplicationId == '100'
@@ -526,7 +526,7 @@
- aazure_credentials_nm.current.azureAccount[0].cloudApplication[0].cloudCredentialName == 'cApicApp'
- name: Associate azure site with credentials mode, with ansible_test again in normal mode
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -542,12 +542,12 @@
register: aazure_credentials_nm_again
- name: Verify aazure_credentials_nm_again
- assert:
+ ansible.builtin.assert:
that:
- aazure_credentials_nm_again is not changed
- name: Query associated non-cloud site of a tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
@@ -555,12 +555,12 @@
register: anc_query
- name: Verify anc_query
- assert:
+ ansible.builtin.assert:
that:
- anc_query is not changed
- name: Query associated azure site of a tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -576,12 +576,12 @@
register: aazure_query
- name: Verify aazure_query
- assert:
+ ansible.builtin.assert:
that:
- aazure_query is not changed
- name: Query associated aws site of a tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -589,24 +589,24 @@
register: aaws_query
- name: Verify aaws_query
- assert:
+ ansible.builtin.assert:
that:
- aaws_query is not changed
- name: Query all associated sites of a tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
state: query
register: all_sites_query
- name: Verify all_sites_query
- assert:
+ ansible.builtin.assert:
that:
- all_sites_query is not changed
- name: Dissociate non-cloud site with ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
@@ -614,12 +614,12 @@
register: dnc
- name: Verify dnc
- assert:
+ ansible.builtin.assert:
that:
- dnc is changed
- name: Query dissociated non-cloud site of a tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: '{{ mso_site | default("ansible_test") }}'
@@ -628,12 +628,12 @@
register: dnc_query
- name: Verify dnc_query
- assert:
+ ansible.builtin.assert:
that:
- dnc_query.msg is match ("Site Id [0-9a-zA-Z]* not associated with tenant Id [0-9a-zA-Z]*")
- name: Dissociate azure site with ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -641,12 +641,12 @@
register: dazure
- name: Verify dazure
- assert:
+ ansible.builtin.assert:
that:
- dazure is changed
- name: Query dissociated azure site of a tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'azure_{{ mso_site | default("ansible_test") }}'
@@ -655,12 +655,12 @@
register: dazure_query
- name: Verify dnc_query
- assert:
+ ansible.builtin.assert:
that:
- dazure_query.msg is match ("Site Id [0-9a-zA-Z]* not associated with tenant Id [0-9a-zA-Z]*")
- name: Dissociate aws site with ansible_test
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -668,12 +668,12 @@
register: daaws
- name: Verify daaws
- assert:
+ ansible.builtin.assert:
that:
- daaws is changed
- name: Query dissociated aws site of a tenant
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
site: 'aws_{{ mso_site | default("ansible_test") }}'
@@ -682,12 +682,12 @@
register: daaws_query
- name: Verify daaws_query
- assert:
+ ansible.builtin.assert:
that:
- daaws_query.msg is match ("No site associated with tenant Id [0-9a-zA-Z]*")
- name: Query all
- mso_tenant_site:
+ cisco.mso.mso_tenant_site:
<<: *mso_info
tenant: ansible_test
state: query
@@ -695,6 +695,6 @@
register: query_all
- name: Verify query_all
- assert:
+ ansible.builtin.assert:
that:
- query_all.msg is match ("No site associated with tenant Id [0-9a-zA-Z]*") \ No newline at end of file
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_user/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_user/tasks/main.yml
index 2aa2d2bf6..1a51e8a0e 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_user/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_user/tasks/main.yml
@@ -4,12 +4,12 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -20,7 +20,7 @@
output_level: '{{ mso_output_level | default("info") }}'
- name: Query MSO version
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_info
state: query
register: version
@@ -30,7 +30,7 @@
block:
# CLEAN ENVIRONMENT
- name: Remove user ansible_test
- mso_user: &user_absent
+ cisco.mso.mso_user: &user_absent
<<: *mso_info
user: '{{ item }}'
state: absent
@@ -42,7 +42,7 @@
# ADD USER
- name: Add user (check_mode)
- mso_user: &user_present
+ cisco.mso.mso_user: &user_present
<<: *mso_info
user: ansible_test
user_password: 'S0m3!1n1t14l!p455w0rd'
@@ -61,7 +61,7 @@
register: cm_add_user
- name: Verify cm_add_user
- assert:
+ ansible.builtin.assert:
that:
- cm_add_user is changed
- cm_add_user.previous == {}
@@ -75,11 +75,11 @@
- cm_add_user.current.roles[0].accessType == 'readWrite'
- name: Add user (normal mode)
- mso_user: *user_present
+ cisco.mso.mso_user: *user_present
register: nm_add_user
- name: Verify nm_add_user
- assert:
+ ansible.builtin.assert:
that:
- nm_add_user is changed
- nm_add_user.previous == {}
@@ -93,7 +93,7 @@
- nm_add_user.current.roles[0].accessType == 'readWrite'
- name: Add user again (check_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present
# NOTE: We need to modify the password for a new user
user_password: 'S0m3!n3w!p455w0rd'
@@ -101,7 +101,7 @@
register: cm_add_user_again
- name: Verify cm_add_user_again
- assert:
+ ansible.builtin.assert:
that:
- cm_add_user_again is changed
- cm_add_user_again.previous.username == 'ansible_test'
@@ -109,14 +109,14 @@
- cm_add_user_again.current.username == 'ansible_test'
- name: Add user again (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present
# NOTE: We need to modify the password for a new user
user_password: 'S0m3!n3w!p455w0rd'
register: nm_add_user_again
- name: Verify nm_add_user_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_user_again is changed
- nm_add_user_again.previous.username == 'ansible_test'
@@ -124,7 +124,7 @@
- nm_add_user_again.current.username == 'ansible_test'
- name: Add user with read only role (check_mode)
- mso_user: &user_present2
+ cisco.mso.mso_user: &user_present2
<<: *mso_info
user: ansible_test_read
user_password: '#123455#123455Aa'
@@ -143,7 +143,7 @@
register: cm_add_user2
- name: Verify cm_add_user2
- assert:
+ ansible.builtin.assert:
that:
- cm_add_user2 is changed
- cm_add_user2.previous == {}
@@ -157,11 +157,11 @@
- cm_add_user2.current.roles[0].accessType == 'readOnly'
- name: Add user with read only role (normal mode)
- mso_user: *user_present2
+ cisco.mso.mso_user: *user_present2
register: nm_add_user2
- name: Verify nm_add_user2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_user2 is changed
- nm_add_user2.current.id is defined
@@ -174,18 +174,18 @@
- nm_add_user2.current.roles[0].accessType == 'readOnly'
- name: Add user with read only role again (check mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present2
user_password: '#123455#123455Aa'
check_mode: true
register: cm_add_user2_again
- name: Add user with read only role again (normal mode)
- mso_user: *user_present2
+ cisco.mso.mso_user: *user_present2
register: nm_add_user2
- name: Add user3 with read only role and no password (check_mode)
- mso_user: &user_present3
+ cisco.mso.mso_user: &user_present3
<<: *mso_info
user: ansible_test_read_2
# NOTE: First name, last name, phone and email are mandatory on creation
@@ -204,18 +204,18 @@
register: nm_add_user3
- name: Verify nm_add_user2
- assert:
+ ansible.builtin.assert:
that:
- nm_add_user3.msg == "The user ansible_test_read_2 does not exist. The 'user_password' attribute is required to create a new user."
- name: Add user3 with read only role and with password (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present3
user_password: '#123455#123455Aa'
register: nm_add_user3_again
- name: Verify nm_add_user3_again
- assert:
+ ansible.builtin.assert:
that:
- nm_add_user3_again is changed
- nm_add_user3_again.current.id is defined
@@ -229,7 +229,7 @@
# CHANGE USER
- name: Change user (check_mode)
- mso_user: &user_change
+ cisco.mso.mso_user: &user_change
<<: *mso_info
user: ansible_test
roles:
@@ -244,7 +244,7 @@
register: cm_change_user
- name: Verify cm_change_user
- assert:
+ ansible.builtin.assert:
that:
- cm_change_user is changed
- cm_change_user.current.id == nm_add_user.current.id
@@ -253,13 +253,13 @@
- cm_change_user.current.phoneNumber == '+32 478 436 300'
- name: Change user (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_change
output_level: debug
register: nm_change_user
- name: Verify nm_change_user
- assert:
+ ansible.builtin.assert:
that:
- nm_change_user is changed
- nm_change_user.current.id == nm_add_user.current.id
@@ -268,13 +268,13 @@
- nm_change_user.current.phoneNumber == '+32 478 436 300'
- name: Change user again (check_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_change
check_mode: true
register: cm_change_user_again
- name: Verify cm_change_user_again
- assert:
+ ansible.builtin.assert:
that:
- cm_change_user_again is not changed
- cm_change_user_again.current.id == nm_add_user.current.id
@@ -283,12 +283,12 @@
- cm_change_user_again.current.phoneNumber == '+32 478 436 300'
- name: Change user again (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_change
register: nm_change_user_again
- name: Verify nm_change_user_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_user_again is not changed
- nm_change_user_again.current.id == nm_add_user.current.id
@@ -297,7 +297,7 @@
- nm_change_user_again.current.phoneNumber == '+32 478 436 300'
- name: Add second user
- mso_user:
+ cisco.mso.mso_user:
<<: *user_change
user: ansible_test2
user_password: 'S0m3!1n1t14l!p455w0rd'
@@ -309,7 +309,7 @@
register: nm_add_user_2
- name: Change user 2 again (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_change
user: ansible_test2
user_password: null
@@ -318,7 +318,7 @@
register: nm_change_user_2_again
- name: Verify nm_change_user_2_again
- assert:
+ ansible.builtin.assert:
that:
- nm_change_user_2_again is not changed
- nm_change_user_2_again.current.id == nm_add_user_2.current.id
@@ -328,18 +328,18 @@
# QUERY ALL USERS
- name: Query all users (check_mode)
- mso_user: &user_query
+ cisco.mso.mso_user: &user_query
<<: *mso_info
state: query
check_mode: true
register: cm_query_all_users
- name: Query all users (normal mode)
- mso_user: *user_query
+ cisco.mso.mso_user: *user_query
register: nm_query_all_users
- name: Verify query_all_users
- assert:
+ ansible.builtin.assert:
that:
- cm_query_all_users is not changed
- nm_query_all_users is not changed
@@ -349,20 +349,20 @@
# QUERY A USER
- name: Query our user
- mso_user:
+ cisco.mso.mso_user:
<<: *user_query
user: '{{ mso_username }}'
check_mode: true
register: cm_query_user
- name: Query our user
- mso_user:
+ cisco.mso.mso_user:
<<: *user_query
user: '{{ mso_username }}'
register: nm_query_user
- name: Verify query_user
- assert:
+ ansible.builtin.assert:
that:
- cm_query_user is not changed
- cm_query_user.current.id is defined
@@ -376,20 +376,20 @@
when: version.current.version is version('3.2', '<')
block:
- name: Query our read-only user
- mso_user:
+ cisco.mso.mso_user:
<<: *user_query
user: ansible_test_read
register: nm_query_user2
- name: Verify query_user2
- assert:
+ ansible.builtin.assert:
that:
- nm_query_user2 is not changed
- nm_query_user2.current.roles[0].accessType == 'readOnly'
# REMOVE USER
- name: Remove user (check_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_absent
user: ansible_test
state: absent
@@ -397,26 +397,26 @@
register: cm_remove_user
- name: Verify cm_remove_user
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_user is changed
- cm_remove_user.current == {}
- name: Remove user (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_absent
user: ansible_test
state: absent
register: nm_remove_user
- name: Verify nm_remove_user
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_user is changed
- nm_remove_user.current == {}
- name: Remove user again (check_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_absent
user: ansible_test
state: absent
@@ -424,41 +424,41 @@
register: cm_remove_user_again
- name: Verify cm_remove_user_again
- assert:
+ ansible.builtin.assert:
that:
- cm_remove_user_again is not changed
- cm_remove_user_again.current == {}
- name: Remove user again (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_absent
user: ansible_test
state: absent
register: nm_remove_user_again
- name: Verify nm_remove_user_again
- assert:
+ ansible.builtin.assert:
that:
- nm_remove_user_again is not changed
- nm_remove_user_again.current == {}
# QUERY NON-EXISTING USER
- name: Query non-existing user (check_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_query
user: ansible_test
check_mode: true
register: cm_query_non_user
- name: Query non-existing user (normal mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_query
user: ansible_test
register: nm_query_non_user
# TODO: Implement more tests
- name: Verify query_non_user
- assert:
+ ansible.builtin.assert:
that:
- cm_query_non_user is not changed
- nm_query_non_user is not changed
@@ -468,42 +468,41 @@
when: version.current.version is version('3.2', '<')
block:
- name: inactive user (check_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present
account_status: inactive
check_mode: true
register: cm_inactive_user
- name: inactive user (normal_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present
account_status: inactive
register: nm_inactive_user
- name: Verify cm_inactive_user and nm_inactive_user
- assert:
+ ansible.builtin.assert:
that:
- cm_inactive_user is changed
- nm_inactive_user is changed
- cm_inactive_user.current.accountStatus == "inactive"
- nm_inactive_user.current.accountStatus == "inactive"
-
- name: active user (check_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present
account_status: active
check_mode: true
register: cm_active_user
- name: active user (normal_mode)
- mso_user:
+ cisco.mso.mso_user:
<<: *user_present
account_status: active
register: nm_active_user
- name: Verify cm_active_user and nm_active_user
- assert:
+ ansible.builtin.assert:
that:
- cm_active_user is changed
- nm_active_user is changed
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/mso_version/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/mso_version/tasks/main.yml
index fc3eb585e..3c7cb0d08 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/mso_version/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/mso_version/tasks/main.yml
@@ -4,13 +4,13 @@
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
- name: Test that we have an ACI MultiSite host, username and password
- fail:
+ ansible.builtin.fail:
msg: 'Please define the following variables: mso_hostname, mso_username and mso_password.'
when: mso_hostname is not defined or mso_username is not defined or mso_password is not defined
# CLEAN ENVIRONMENT
- name: Set vars
- set_fact:
+ ansible.builtin.set_fact:
mso_info: &mso_info
host: '{{ mso_hostname }}'
username: '{{ mso_username }}'
@@ -22,14 +22,14 @@
# QUERY VERSION
- name: Query MSO version
- mso_version: &mso_query
+ cisco.mso.mso_version: &mso_query
<<: *mso_info
state: query
check_mode: true
register: cm_query_version
- name: Verify cm_query_version
- assert:
+ ansible.builtin.assert:
that:
- cm_query_version is not changed
- cm_query_version.current.id is defined
@@ -37,12 +37,12 @@
- cm_query_version.current.timestamp is defined
- name: Query MSO version (normal mode)
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_query
register: nm_query_version
- name: Verify nm_query_version
- assert:
+ ansible.builtin.assert:
that:
- nm_query_version is not changed
- nm_query_version.current.id is defined
@@ -54,7 +54,7 @@
# USE A NON-EXISTING STATE
- name: Non-existing state for version (check_mode)
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_query
state: non-existing-state
check_mode: true
@@ -62,14 +62,14 @@
register: cm_non_existing_state
- name: Non-existing state for version (normal_mode)
- mso_version:
+ cisco.mso.mso_version:
<<: *mso_query
state: non-existing-state
ignore_errors: true
register: nm_non_existing_state
- name: Verify non_existing_state
- assert:
+ ansible.builtin.assert:
that:
- cm_non_existing_state is not changed
- nm_non_existing_state is not changed
@@ -84,7 +84,7 @@
when: ansible_connection != 'local'
- name: Verify query_version_global_params
- assert:
+ ansible.builtin.assert:
that:
- query_version_global_params is not changed
- query_version_global_params.current.id is defined
diff --git a/ansible_collections/cisco/mso/tests/integration/targets/ndo_schema_template_deploy/tasks/main.yml b/ansible_collections/cisco/mso/tests/integration/targets/ndo_schema_template_deploy/tasks/main.yml
index 3af935cfc..ed295450e 100644
--- a/ansible_collections/cisco/mso/tests/integration/targets/ndo_schema_template_deploy/tasks/main.yml
+++ b/ansible_collections/cisco/mso/tests/integration/targets/ndo_schema_template_deploy/tasks/main.yml
@@ -220,7 +220,7 @@
- Template 2
- name: Verify undeploy_template
- assert:
+ ansible.builtin.assert:
that:
- item is not changed
- '"undeploy" in item.current.reqDetails'
diff --git a/ansible_collections/community/aws/CHANGELOG.rst b/ansible_collections/community/aws/CHANGELOG.rst
index 651b7c763..b47d79fe4 100644
--- a/ansible_collections/community/aws/CHANGELOG.rst
+++ b/ansible_collections/community/aws/CHANGELOG.rst
@@ -4,6 +4,29 @@ community.aws Release Notes
.. contents:: Topics
+v7.2.0
+======
+
+Release Summary
+---------------
+
+This release includes a new module ``dynamodb_table_info``, new features for the ``glue_job`` and ``msk_cluster`` modules, and a bugfix for the ``aws_ssm`` connection plugin.
+
+Minor Changes
+-------------
+
+- glue_job - add support for 2 new instance types which are G.4X and G.8X (https://github.com/ansible-collections/community.aws/pull/2048).
+- msk_cluster - Support for additional ``m5`` and ``m7g`` types of MSK clusters (https://github.com/ansible-collections/community.aws/pull/1947).
+
+Bugfixes
+--------
+
+- ssm(connection) - fix bucket region logic when region is ``us-east-1`` (https://github.com/ansible-collections/community.aws/pull/1908).
+
+New Modules
+-----------
+
+- dynamodb_table_info - Returns information about a Dynamo DB table
v7.1.0
======
@@ -23,7 +46,7 @@ Minor Changes
Bugfixes
--------
-- aws_ssm - disable `enable-bracketed-paste` to fix issue with amazon linux 2023 and other OSes (https://github.com/ansible-collections/community.aws/issues/1756)
+- aws_ssm - disable ``enable-bracketed-paste`` to fix issue with amazon linux 2023 and other OSes (https://github.com/ansible-collections/community.aws/issues/1756)
v7.0.0
======
@@ -134,7 +157,6 @@ This release brings some new plugins and features. Several bugfixes, breaking ch
The community.aws collection has dropped support for ``botocore<1.25.0`` and ``boto3<1.22.0``.
Support for Python 3.6 has also been dropped.
-
Minor Changes
-------------
@@ -207,7 +229,6 @@ Release Summary
This release contains a number of bugfixes for various modules, as well as new features for the ``ec2_launch_template`` and ``msk_cluster`` modules. This is the last planned minor release prior to the release of version 6.0.0.
-
Minor Changes
-------------
@@ -303,7 +324,6 @@ modules.
As well as improvements to the ``ecs_cluster``, ``ec2_ecr``,
``ecs_service``, ``iam_role`` and ``ssm_parameter`` plugins.
-
Minor Changes
-------------
@@ -369,7 +389,6 @@ Support for ``ansible-core<2.11`` has also been dropped.
This release also brings some new features, bugfixes, breaking changes and deprecated features.
-
Minor Changes
-------------
@@ -531,7 +550,6 @@ Release Summary
This release contains a minor bugfix for the ``sns_topic`` module as well as corrections to the documentation for various modules. This is the last planned release of the 4.x series.
-
Bugfixes
--------
@@ -889,7 +907,6 @@ Release Summary
Following the release of community.aws 5.0.0, 3.6.0 is a bugfix release and the final planned release for the 3.x series.
-
Minor Changes
-------------
diff --git a/ansible_collections/community/aws/FILES.json b/ansible_collections/community/aws/FILES.json
index 6bc607963..58ea3a1a7 100644
--- a/ansible_collections/community/aws/FILES.json
+++ b/ansible_collections/community/aws/FILES.json
@@ -179,7 +179,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71507aa348f024b04b28a249ccb60a22d09d95eaf0e2f503add687640fc648e9",
+ "chksum_sha256": "a4a404a462b4858f815f4cdd2b1651a4301a2cc2f868ac9f1ca14bfcec74d313",
"format": 1
},
{
@@ -214,7 +214,7 @@
"name": "docs/docsite/rst/CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c20e11dfc1704180b5d197a68107a5a6092c324a99739646c42bb0e1a0dc8a4",
+ "chksum_sha256": "56d5b1f84c1fe53d65c7450a967427dd1e64a5ae6f5029e786b617686a98eb69",
"format": 1
},
{
@@ -242,7 +242,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6195942600514b3a6fd22586eaba89cccdc9bc09265aff576f7a2de8346c4a6c",
+ "chksum_sha256": "73da55c9ac6fc4170daa33c7085e944bb0c61bfa045bd8f0794f66c27bacfb36",
"format": 1
},
{
@@ -270,7 +270,7 @@
"name": "plugins/connection/aws_ssm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "72738ace4fc3fabddcee868e0ad6f01ae82976b1aed13319bdbe5ddef1c8e6c6",
+ "chksum_sha256": "dc7e2bc595289e435c5ed3b4dd3de07d8bed518d67cdfe52ab465aee341bfc6c",
"format": 1
},
{
@@ -305,7 +305,7 @@
"name": "plugins/module_utils/common.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9ae9caf904353f2952d5257bea7cb0b4a4e96668dcc9871c82809cd0b4f38f4f",
+ "chksum_sha256": "0f464ad15f459dc646c9596544ec189cf67ff07225c4a22fdba46b0daae73cdc",
"format": 1
},
{
@@ -687,6 +687,13 @@
"format": 1
},
{
+ "name": "plugins/modules/dynamodb_table_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d77ba73e2bf62068b6ffeb53e04b797b4c79cc1fa8f4cf613df7ab5be0536b6d",
+ "format": 1
+ },
+ {
"name": "plugins/modules/dynamodb_ttl.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -1068,7 +1075,7 @@
"name": "plugins/modules/glue_job.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b9d5d95b21a49c62e1f86bd8f5e30ab45a9ec0bc81dc680a5f3233e712833108",
+ "chksum_sha256": "5bc96be59165bee14b0e1186072eace1039229420bae41ea50d4cfa9caed560d",
"format": 1
},
{
@@ -1166,7 +1173,7 @@
"name": "plugins/modules/msk_cluster.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c4211d04238671d5f57b0214e55d12e541c9619b6275c120868019fd3eaf56b4",
+ "chksum_sha256": "b78414661d661838a4e31182c127c40867669efca69d283a4202ec70da7676b7",
"format": 1
},
{
@@ -3609,14 +3616,14 @@
"name": "tests/integration/targets/dynamodb_table/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "564f5d43b5e448142ce041267325d9149d1743af5027a7875064248ba656ce22",
+ "chksum_sha256": "94cd8b7ef587ffd1abc1b33950c1dbfa69f559040c3c02b55932cfb1b9601598",
"format": 1
},
{
"name": "tests/integration/targets/dynamodb_table/tasks/test_pay_per_request.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "45cf53627344eb31b7bb79bddca9d6e53d9a04a84136c5c2118e4ffd5b3e3694",
+ "chksum_sha256": "fb8ba194bb9558e1ac5b4f204546b6c3e39c722a74cb8f0627657a7dea463b45",
"format": 1
},
{
@@ -5408,7 +5415,7 @@
"name": "tests/integration/targets/elb_target/tasks/lambda_target.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3e8f8a7ad8f8d4395ec5529c296ec4297050541026ee8fcbbaa46cb0c0a78640",
+ "chksum_sha256": "a17e3f3cbd23a65e7aec0ffb1da5e15ea7241d33d5a0ea2323ec9eccd15c349c",
"format": 1
},
{
@@ -7256,7 +7263,7 @@
"name": "tests/integration/targets/s3_bucket_notification/tasks/test_lambda_notifications.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d401f6906f366e920d10516f37ad5b53b4748e7063b0272ee84e84e09c0477fd",
+ "chksum_sha256": "f6a147ffee70552754175c3f75247106b13911eee09f39fe7649f642af25100d",
"format": 1
},
{
@@ -7620,7 +7627,7 @@
"name": "tests/integration/targets/secretsmanager_secret/tasks/rotation.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "01d2a81ec50be52c30ed22608cc917025834e709a3e43ded577e7676c34e5e57",
+ "chksum_sha256": "e4b8e9c86cd550dc3c11a0e6d8838bbf37c7da0bee0f8b46c57666dd9fa94b9c",
"format": 1
},
{
@@ -8425,7 +8432,7 @@
"name": "tests/integration/targets/sns_topic/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "00bff28386d44b4c5681c9ab8852075291b3999c2bd8490798605ad84d8d4154",
+ "chksum_sha256": "c9f6e39100c348ee75fb0de739f853d58c86b7b1050dc3e94ca3a391dbf83d1a",
"format": 1
},
{
@@ -9139,7 +9146,7 @@
"name": "tests/sanity/ignore-2.17.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c9271c547f92773ba4ed8df6eb56394c85deefb66078ae7336b285aee9d252d9",
+ "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"format": 1
},
{
@@ -13311,7 +13318,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c20e11dfc1704180b5d197a68107a5a6092c324a99739646c42bb0e1a0dc8a4",
+ "chksum_sha256": "56d5b1f84c1fe53d65c7450a967427dd1e64a5ae6f5029e786b617686a98eb69",
"format": 1
},
{
diff --git a/ansible_collections/community/aws/MANIFEST.json b/ansible_collections/community/aws/MANIFEST.json
index 224e6ba06..514454326 100644
--- a/ansible_collections/community/aws/MANIFEST.json
+++ b/ansible_collections/community/aws/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "aws",
- "version": "7.1.0",
+ "version": "7.2.0",
"authors": [
"Ansible (https://github.com/ansible)"
],
@@ -28,7 +28,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "efadd5485c903284fc4f80439e50ff696569304185ef6c966c442c2b5603c5c8",
+ "chksum_sha256": "160883c33483553569816c9173e6073c59ded3c77bc8fdab656e7c72b1794d3a",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/aws/changelogs/changelog.yaml b/ansible_collections/community/aws/changelogs/changelog.yaml
index ea65a58be..e299d000e 100644
--- a/ansible_collections/community/aws/changelogs/changelog.yaml
+++ b/ansible_collections/community/aws/changelogs/changelog.yaml
@@ -3713,7 +3713,7 @@ releases:
7.1.0:
changes:
bugfixes:
- - aws_ssm - disable `enable-bracketed-paste` to fix issue with amazon linux
+ - aws_ssm - disable ``enable-bracketed-paste`` to fix issue with amazon linux
2023 and other OSes (https://github.com/ansible-collections/community.aws/issues/1756)
minor_changes:
- aws_ssm - Updated the documentation to explicitly state that an S3 bucket
@@ -3734,3 +3734,24 @@ releases:
- release.yml
- ssm-fedora34.yml
release_date: '2024-01-10'
+ 7.2.0:
+ changes:
+ bugfixes:
+ - ssm(connection) - fix bucket region logic when region is ``us-east-1`` (https://github.com/ansible-collections/community.aws/pull/1908).
+ minor_changes:
+ - glue_job - add support for 2 new instance types which are G.4X and G.8X (https://github.com/ansible-collections/community.aws/pull/2048).
+ - msk_cluster - Support for additional ``m5`` and ``m7g`` types of MSK clusters
+ (https://github.com/ansible-collections/community.aws/pull/1947).
+ release_summary: This release includes a new module ``dynamodb_table_info``,
+ new features for the ``glue_job`` and ``msk_cluster`` modules, and a bugfix
+ for the ``aws_ssm`` connection plugin.
+ fragments:
+ - 1908-fix_find_out_bucket_region_logic.yml
+ - 1947-add_support_msk_addtinal_type.yml
+ - 20240402-lambda-test-runtime.yml
+ - 2048-add-new-instance-types-in-gluejob.yaml
+ modules:
+ - description: Returns information about a Dynamo DB table
+ name: dynamodb_table_info
+ namespace: ''
+ release_date: '2024-04-05'
diff --git a/ansible_collections/community/aws/docs/docsite/rst/CHANGELOG.rst b/ansible_collections/community/aws/docs/docsite/rst/CHANGELOG.rst
index 651b7c763..b47d79fe4 100644
--- a/ansible_collections/community/aws/docs/docsite/rst/CHANGELOG.rst
+++ b/ansible_collections/community/aws/docs/docsite/rst/CHANGELOG.rst
@@ -4,6 +4,29 @@ community.aws Release Notes
.. contents:: Topics
+v7.2.0
+======
+
+Release Summary
+---------------
+
+This release includes a new module ``dynamodb_table_info``, new features for the ``glue_job`` and ``msk_cluster`` modules, and a bugfix for the ``aws_ssm`` connection plugin.
+
+Minor Changes
+-------------
+
+- glue_job - add support for 2 new instance types which are G.4X and G.8X (https://github.com/ansible-collections/community.aws/pull/2048).
+- msk_cluster - Support for additional ``m5`` and ``m7g`` types of MSK clusters (https://github.com/ansible-collections/community.aws/pull/1947).
+
+Bugfixes
+--------
+
+- ssm(connection) - fix bucket region logic when region is ``us-east-1`` (https://github.com/ansible-collections/community.aws/pull/1908).
+
+New Modules
+-----------
+
+- dynamodb_table_info - Returns information about a Dynamo DB table
v7.1.0
======
@@ -23,7 +46,7 @@ Minor Changes
Bugfixes
--------
-- aws_ssm - disable `enable-bracketed-paste` to fix issue with amazon linux 2023 and other OSes (https://github.com/ansible-collections/community.aws/issues/1756)
+- aws_ssm - disable ``enable-bracketed-paste`` to fix issue with amazon linux 2023 and other OSes (https://github.com/ansible-collections/community.aws/issues/1756)
v7.0.0
======
@@ -134,7 +157,6 @@ This release brings some new plugins and features. Several bugfixes, breaking ch
The community.aws collection has dropped support for ``botocore<1.25.0`` and ``boto3<1.22.0``.
Support for Python 3.6 has also been dropped.
-
Minor Changes
-------------
@@ -207,7 +229,6 @@ Release Summary
This release contains a number of bugfixes for various modules, as well as new features for the ``ec2_launch_template`` and ``msk_cluster`` modules. This is the last planned minor release prior to the release of version 6.0.0.
-
Minor Changes
-------------
@@ -303,7 +324,6 @@ modules.
As well as improvements to the ``ecs_cluster``, ``ec2_ecr``,
``ecs_service``, ``iam_role`` and ``ssm_parameter`` plugins.
-
Minor Changes
-------------
@@ -369,7 +389,6 @@ Support for ``ansible-core<2.11`` has also been dropped.
This release also brings some new features, bugfixes, breaking changes and deprecated features.
-
Minor Changes
-------------
@@ -531,7 +550,6 @@ Release Summary
This release contains a minor bugfix for the ``sns_topic`` module as well as corrections to the documentation for various modules. This is the last planned release of the 4.x series.
-
Bugfixes
--------
@@ -889,7 +907,6 @@ Release Summary
Following the release of community.aws 5.0.0, 3.6.0 is a bugfix release and the final planned release for the 3.x series.
-
Minor Changes
-------------
diff --git a/ansible_collections/community/aws/meta/runtime.yml b/ansible_collections/community/aws/meta/runtime.yml
index 5d05436df..4c6bc7291 100644
--- a/ansible_collections/community/aws/meta/runtime.yml
+++ b/ansible_collections/community/aws/meta/runtime.yml
@@ -89,6 +89,7 @@ action_groups:
- dms_endpoint
- dms_replication_subnet_group
- dynamodb_table
+ - dynamodb_table_info
- dynamodb_ttl
- ec2_ami_copy
- ec2_asg
diff --git a/ansible_collections/community/aws/plugins/connection/aws_ssm.py b/ansible_collections/community/aws/plugins/connection/aws_ssm.py
index 5186179f4..5c2d6d577 100644
--- a/ansible_collections/community/aws/plugins/connection/aws_ssm.py
+++ b/ansible_collections/community/aws/plugins/connection/aws_ssm.py
@@ -430,7 +430,10 @@ class Connection(ConnectionBase):
bucket_location = tmp_s3_client.get_bucket_location(
Bucket=(self.get_option("bucket_name")),
)
- bucket_region = bucket_location["LocationConstraint"]
+ if bucket_location["LocationConstraint"]:
+ bucket_region = bucket_location["LocationConstraint"]
+ else:
+ bucket_region = "us-east-1"
if self.get_option("bucket_endpoint_url"):
return self.get_option("bucket_endpoint_url"), bucket_region
diff --git a/ansible_collections/community/aws/plugins/module_utils/common.py b/ansible_collections/community/aws/plugins/module_utils/common.py
index 0c4374729..321349a1d 100644
--- a/ansible_collections/community/aws/plugins/module_utils/common.py
+++ b/ansible_collections/community/aws/plugins/module_utils/common.py
@@ -5,4 +5,4 @@
COMMUNITY_AWS_COLLECTION_NAME = "community.aws"
-COMMUNITY_AWS_COLLECTION_VERSION = "7.1.0"
+COMMUNITY_AWS_COLLECTION_VERSION = "7.2.0"
diff --git a/ansible_collections/community/aws/plugins/modules/dynamodb_table_info.py b/ansible_collections/community/aws/plugins/modules/dynamodb_table_info.py
new file mode 100644
index 000000000..66349e2d7
--- /dev/null
+++ b/ansible_collections/community/aws/plugins/modules/dynamodb_table_info.py
@@ -0,0 +1,292 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+DOCUMENTATION = r"""
+---
+module: dynamodb_table_info
+version_added: 7.2.0
+short_description: Returns information about a Dynamo DB table
+description:
+ - Returns information about the Dynamo DB table, including the current status of the table,
+ when it was created, the primary key schema, and any indexes on the table.
+author:
+ - Aubin Bikouo (@abikouo)
+options:
+ name:
+ description:
+ - The name of the table to describe.
+ required: true
+ type: str
+extends_documentation_fragment:
+ - amazon.aws.common.modules
+ - amazon.aws.region.modules
+ - amazon.aws.boto3
+"""
+
+EXAMPLES = r"""
+- name: Return information about the DynamoDB table named 'my-table'
+ community.aws.dynamodb_table_info:
+ name: my-table
+"""
+
+RETURN = r"""
+table:
+ description: The returned table params from the describe API call.
+ returned: success
+ type: complex
+ contains:
+ table_name:
+ description: The name of the table.
+ returned: always
+ type: str
+ table_status:
+ description: The current state of the table.
+ returned: always
+ type: str
+ sample: 'ACTIVE'
+ creation_date_time:
+ description: The date and time when the table was created, in UNIX epoch time format.
+ returned: always
+ type: str
+ table_size_bytes:
+ description: The total size of the specified table, in bytes.
+ returned: always
+ type: int
+ item_count:
+ description: The number of items in the specified table.
+ returned: always
+ type: int
+ table_arn:
+ description: The Amazon Resource Name (ARN) that uniquely identifies the table.
+ returned: always
+ type: str
+ table_id:
+ description: Unique identifier for the table for which the backup was created.
+ returned: always
+ type: str
+ attribute_definitions:
+ description: A list of attributes for describing the key schema for the table and indexes.
+ returned: always
+ type: complex
+ contains:
+ attribute_name:
+ description: A name for the attribute.
+ type: str
+ returned: always
+ attribute_type:
+ description: The data type for the attribute, S (String), N (Number) and B (Binary).
+ type: str
+ returned: always
+ key_schema:
+ description: A list of key schemas that specify the attributes that make up the primary key of a table, or the key attributes of an index.
+ returned: always
+ type: complex
+ contains:
+ attribute_name:
+ description: The name of a key attribute.
+ type: str
+ returned: always
+ key_type:
+ description: The role that this key attribute will assume, 'HASH' for partition key, 'RANGE' for sort key
+ type: str
+ returned: always
+ billing_mode:
+ description: Controls how you are charged for read and write throughput and how you manage capacity.
+ returned: always
+ type: str
+ local_secondary_indexes:
+ description: Represents one or more local secondary indexes on the table.
+ returned: if any, on the table
+ type: list
+ elements: dict
+ global_secondary_indexes:
+ description: The global secondary indexes of table.
+ returned: if any, on the table
+ type: list
+ elements: dict
+ stream_specification:
+ description: The current DynamoDB Streams configuration for the table.
+ returned: if any, on the table
+ type: complex
+ contains:
+ stream_enabled:
+ description: Indicates whether DynamoDB Streams is enabled (true) or disabled (false) on the table.
+ type: bool
+ returned: always
+ sample: true
+ stream_view_type:
+ description: When an item in the table is modified, stream_view_type determines what information is written to the stream for this table.
+ type: str
+ returned: always
+ sample: KEYS_ONLY
+ latest_stream_label:
+ description: A timestamp, in ISO 8601 format, for this stream.
+ type: str
+ returned: if any on the table
+ latest_stream_arn:
+ description: The Amazon Resource Name (ARN) that uniquely identifies the latest stream for this table.
+ returned: if any on the table
+ type: str
+ global_table_version:
+ description: Represents the version of global tables in use, if the table is replicated across AWS Regions.
+ type: str
+ returned: if the table is replicated
+ replicas:
+ description: Represents replicas of the table.
+ type: list
+ elements: dict
+ returned: if any on the table
+ source_backup_arn:
+ description: The Amazon Resource Name (ARN) of the backup from which the table was restored.
+ type: str
+ returned: if any, on the table
+ source_table_arn:
+ description: The ARN of the source table of the backup that is being restored.
+ type: str
+ returned: if any, on the table
+ restore_date_time:
+ description: Point in time or source backup time.
+ type: str
+ returned: if any, on table
+ restore_in_progress:
+ description: Indicates if a restore is in progress or not.
+ type: bool
+ returned: if any, on table
+ sse_description:
+ description: The description of the server-side encryption status on the specified table.
+ type: dict
+ returned: if any, on table
+ sample: {}
+ archival_summary:
+ description: Contains information about the table archive.
+ type: complex
+ returned: if any, on table
+ contains:
+ archival_date_time:
+ description: The date and time when table archival was initiated by DynamoDB, in UNIX epoch time format.
+ type: str
+ returned: always
+ archival_reason:
+ description: The reason DynamoDB archived the table.
+ type: str
+ returned: always
+ sample: INACCESSIBLE_ENCRYPTION_CREDENTIALS
+ archival_backup_arn:
+ description: The Amazon Resource Name (ARN) of the backup the table was archived to, when applicable in the archival reason.
+ type: str
+ returned: always
+ table_class:
+ description: The table class of the specified table.
+ type: str
+ returned: if any on the table
+ sample: STANDARD_INFREQUENT_ACCESS
+ deletion_protection_enabled:
+ description: Indicates whether deletion protection is enabled (true) or disabled (false) on the table.
+ type: bool
+ returned: always
+ sample: true
+ provisioned_throughput:
+ description: The provisioned throughput settings for the table.
+ type: dict
+ returned: always
+ sample: '{"number_of_decreases_today": 0, "read_capacity_units": 1, "write_capacity_units": 1}'
+ tags:
+ description: A dict of tags associated with the DynamoDB table.
+ returned: always
+ type: dict
+"""
+
+try:
+ import botocore
+except ImportError:
+ pass # Handled by AnsibleAWSModule
+
+from ansible.module_utils.common.dict_transformations import camel_dict_to_snake_dict
+
+from ansible_collections.amazon.aws.plugins.module_utils.botocore import is_boto3_error_code
+from ansible_collections.amazon.aws.plugins.module_utils.retries import AWSRetry
+from ansible_collections.amazon.aws.plugins.module_utils.tagging import boto3_tag_list_to_ansible_dict
+
+from ansible_collections.community.aws.plugins.module_utils.modules import AnsibleCommunityAWSModule as AnsibleAWSModule
+
+
+# ResourceNotFoundException is expected here if the table doesn't exist
+@AWSRetry.jittered_backoff(catch_extra_error_codes=["LimitExceededException", "ResourceInUseException"])
+def _describe_table(client, **params):
+ return client.describe_table(**params)
+
+
+def describe_dynamodb_table(module):
+ table_name = module.params.get("name")
+ retry_decorator = AWSRetry.jittered_backoff(
+ catch_extra_error_codes=["LimitExceededException", "ResourceInUseException", "ResourceNotFoundException"],
+ )
+ client = module.client("dynamodb", retry_decorator=retry_decorator)
+ try:
+ table = _describe_table(client, TableName=table_name)
+ except is_boto3_error_code("ResourceNotFoundException"):
+ module.exit_json(table={})
+ except (
+ botocore.exceptions.ClientError,
+ botocore.exceptions.BotoCoreError,
+ ) as e: # pylint: disable=duplicate-except
+ module.fail_json_aws(e, msg="Failed to describe table")
+
+ table = table["Table"]
+ try:
+ tags = client.list_tags_of_resource(aws_retry=True, ResourceArn=table["TableArn"])["Tags"]
+ except is_boto3_error_code("AccessDeniedException"):
+ module.warn("Permission denied when listing tags")
+ tags = []
+ except (
+ botocore.exceptions.ClientError,
+ botocore.exceptions.BotoCoreError,
+ ) as e: # pylint: disable=duplicate-except
+ module.fail_json_aws(e, msg="Failed to list table tags")
+
+ table = camel_dict_to_snake_dict(table)
+ table["tags"] = boto3_tag_list_to_ansible_dict(tags)
+
+ if "table_class_summary" in table:
+ table["table_class"] = table["table_class_summary"]["table_class"]
+ del table["table_class_summary"]
+
+ # billing_mode_summary doesn't always seem to be set but is always set for PAY_PER_REQUEST
+ # and when updating the billing_mode
+ if "billing_mode_summary" in table:
+ table["billing_mode"] = table["billing_mode_summary"]["billing_mode"]
+ del table["billing_mode_summary"]
+ else:
+ table["billing_mode"] = "PROVISIONED"
+
+ # Restore summary
+ if "restore_summary" in table:
+ table["source_backup_arn"] = table["restore_summary"].get("source_backup_arn", "")
+ table["source_table_arn"] = table["restore_summary"].get("source_table_arn", "")
+ table["restore_date_time"] = table["restore_summary"].get("restore_date_time", "")
+ table["restore_in_progress"] = table["restore_summary"].get("restore_in_progress")
+ del table["restore_summary"]
+
+ module.exit_json(table=table)
+
+
+def main():
+ argument_spec = dict(
+ name=dict(
+ required=True,
+ ),
+ )
+
+ module = AnsibleAWSModule(
+ argument_spec=argument_spec,
+ supports_check_mode=True,
+ )
+
+ describe_dynamodb_table(module)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/community/aws/plugins/modules/glue_job.py b/ansible_collections/community/aws/plugins/modules/glue_job.py
index 256779975..10ad102e3 100644
--- a/ansible_collections/community/aws/plugins/modules/glue_job.py
+++ b/ansible_collections/community/aws/plugins/modules/glue_job.py
@@ -95,7 +95,8 @@ options:
worker_type:
description:
- The type of predefined worker that is allocated when a job runs.
- choices: [ 'Standard', 'G.1X', 'G.2X' ]
+ - Support for instance types C(G.4X( and C(G.8X) was added in community.aws release 7.2.0.
+ choices: [ 'Standard', 'G.1X', 'G.2X', 'G.4X', 'G.8X' ]
type: str
version_added: 1.5.0
notes:
@@ -465,7 +466,7 @@ def main():
state=dict(required=True, choices=["present", "absent"], type="str"),
tags=dict(type="dict", aliases=["resource_tags"]),
timeout=dict(type="int"),
- worker_type=dict(choices=["Standard", "G.1X", "G.2X"], type="str"),
+ worker_type=dict(choices=["Standard", "G.1X", "G.2X", "G.4X", "G.8X"], type="str"),
)
module = AnsibleAWSModule(
diff --git a/ansible_collections/community/aws/plugins/modules/msk_cluster.py b/ansible_collections/community/aws/plugins/modules/msk_cluster.py
index aa0383294..9ecf053f8 100644
--- a/ansible_collections/community/aws/plugins/modules/msk_cluster.py
+++ b/ansible_collections/community/aws/plugins/modules/msk_cluster.py
@@ -54,6 +54,17 @@ options:
- kafka.m5.xlarge
- kafka.m5.2xlarge
- kafka.m5.4xlarge
+ - kafka.m5.8xlarge
+ - kafka.m5.12xlarge
+ - kafka.m5.16xlarge
+ - kafka.m5.24xlarge
+ - kafka.m7g.large
+ - kafka.m7g.xlarge
+ - kafka.m7g.2xlarge
+ - kafka.m7g.4xlarge
+ - kafka.m7g.8xlarge
+ - kafka.m7g.12xlarge
+ - kafka.m7g.16xlarge
default: kafka.t3.small
type: str
ebs_volume_size:
@@ -662,6 +673,17 @@ def main():
"kafka.m5.xlarge",
"kafka.m5.2xlarge",
"kafka.m5.4xlarge",
+ "kafka.m5.8xlarge",
+ "kafka.m5.12xlarge",
+ "kafka.m5.16xlarge",
+ "kafka.m5.24xlarge",
+ "kafka.m7g.large",
+ "kafka.m7g.xlarge",
+ "kafka.m7g.2xlarge",
+ "kafka.m7g.4xlarge",
+ "kafka.m7g.8xlarge",
+ "kafka.m7g.12xlarge",
+ "kafka.m7g.16xlarge",
],
default="kafka.t3.small",
),
diff --git a/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/main.yml b/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/main.yml
index 268e61bae..5b3592f30 100644
--- a/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/main.yml
+++ b/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/main.yml
@@ -30,6 +30,16 @@
that:
- create_table is successful
- create_table is changed
+
+ - name: Ensure the table was not created
+ dynamodb_table_info:
+ name: "{{ table_name }}"
+ register: table_info
+
+ - name: Assert the table was not created
+ assert:
+ that:
+ - not table_info.table
- name: Create table
dynamodb_table:
@@ -65,6 +75,17 @@
- create_table.table_name == table_name
- create_table.write_capacity == 1
+ - name: Ensure the table was created
+ dynamodb_table_info:
+ name: "{{ table_name }}"
+ register: table_info
+
+ - name: Assert the table was created
+ assert:
+ that:
+ - table_info.table
+ - 'table_info.table.attribute_definitions == [{"attribute_name": table_index, "attribute_type": table_index_type[0]}]'
+
- name: Create table - idempotent - check_mode
dynamodb_table:
state: present
diff --git a/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/test_pay_per_request.yml b/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/test_pay_per_request.yml
index b469a1b51..301d22c06 100644
--- a/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/test_pay_per_request.yml
+++ b/ansible_collections/community/aws/tests/integration/targets/dynamodb_table/tasks/test_pay_per_request.yml
@@ -15,6 +15,16 @@
- create_table is successful
- create_table is changed
+- name: Ensure the table was not created
+ dynamodb_table_info:
+ name: "{{ table_name_on_demand }}"
+ register: _table
+
+- name: Assert the table does not exist
+ assert:
+ that:
+ - not _table.table
+
- name: Create table - pay-per-request
dynamodb_table:
state: present
@@ -32,6 +42,17 @@
- create_table is changed
- create_table.billing_mode == "PAY_PER_REQUEST"
+- name: Ensure the table was created
+ dynamodb_table_info:
+ name: "{{ table_name_on_demand }}"
+ register: _table
+
+- name: Assert the table has been created with the expected billing mode
+ assert:
+ that:
+ - _table.table
+ - _table.table.billing_mode == 'PAY_PER_REQUEST'
+
- name: Create table - pay-per-request - check failure
dynamodb_table:
state: present
@@ -71,6 +92,16 @@
- create_complex_table is successful
- create_complex_table is changed
+- name: Ensure the table was not created
+ dynamodb_table_info:
+ name: "{{ table_name_on_demand_complex }}"
+ register: _complex_table
+
+- name: Assert the table does not exist
+ assert:
+ that:
+ - not _complex_table.table
+
- name: Create complex table - check failure on index
dynamodb_table:
state: present
@@ -120,6 +151,17 @@
- create_complex_table.table_name == table_name_on_demand_complex
- create_complex_table.tags == tags_default
+- name: Ensure the table was created
+ dynamodb_table_info:
+ name: "{{ table_name_on_demand_complex }}"
+ register: _complex_table
+
+- name: Assert the table has been created
+ assert:
+ that:
+ - _complex_table.table
+ - _complex_table.table.billing_mode == 'PAY_PER_REQUEST'
+
- name: Update complex table billing_mode
dynamodb_table:
state: present
@@ -140,3 +182,13 @@
- convert_complex_table is changed
- '"billing_mode" in convert_complex_table'
- convert_complex_table.billing_mode == "PROVISIONED"
+
+- name: Read table info
+ dynamodb_table_info:
+ name: "{{ table_name_on_demand_complex }}"
+ register: _complex_table
+
+- name: Assert the table has been updated
+ assert:
+ that:
+ - _complex_table.table.billing_mode == 'PROVISIONED'
diff --git a/ansible_collections/community/aws/tests/integration/targets/elb_target/tasks/lambda_target.yml b/ansible_collections/community/aws/tests/integration/targets/elb_target/tasks/lambda_target.yml
index abc4cc5d0..c4271cdd6 100644
--- a/ansible_collections/community/aws/tests/integration/targets/elb_target/tasks/lambda_target.yml
+++ b/ansible_collections/community/aws/tests/integration/targets/elb_target/tasks/lambda_target.yml
@@ -23,7 +23,7 @@
name: "{{ lambda_name }}"
state: present
zip_file: /tmp/lambda.zip
- runtime: python3.7
+ runtime: python3.12
role: "{{ ROLE_ARN.arn }}"
handler: ansible_lambda_target.lambda_handler
timeout: 30
diff --git a/ansible_collections/community/aws/tests/integration/targets/s3_bucket_notification/tasks/test_lambda_notifications.yml b/ansible_collections/community/aws/tests/integration/targets/s3_bucket_notification/tasks/test_lambda_notifications.yml
index 23ed32e32..b4cc8a6e0 100644
--- a/ansible_collections/community/aws/tests/integration/targets/s3_bucket_notification/tasks/test_lambda_notifications.yml
+++ b/ansible_collections/community/aws/tests/integration/targets/s3_bucket_notification/tasks/test_lambda_notifications.yml
@@ -41,7 +41,7 @@
name: '{{ lambda_name }}'
state: present
role: "{{ lambda_role_name }}"
- runtime: python3.7
+ runtime: python3.12
zip_file: '{{function_res.dest}}'
handler: lambda_function.lambda_handler
memory_size: '128'
diff --git a/ansible_collections/community/aws/tests/integration/targets/secretsmanager_secret/tasks/rotation.yml b/ansible_collections/community/aws/tests/integration/targets/secretsmanager_secret/tasks/rotation.yml
index 697c5ecc2..77151227d 100644
--- a/ansible_collections/community/aws/tests/integration/targets/secretsmanager_secret/tasks/rotation.yml
+++ b/ansible_collections/community/aws/tests/integration/targets/secretsmanager_secret/tasks/rotation.yml
@@ -55,7 +55,7 @@
name: "{{ lambda_name }}"
state: present
zip_file: "{{ tmp.path }}/hello_world.zip"
- runtime: 'python3.9'
+ runtime: 'python3.12'
role: "{{ iam_role_output.arn }}"
handler: 'hello_world.lambda_handler'
register: lambda_output
@@ -169,7 +169,7 @@
name: "{{ lambda_name }}"
state: absent
zip_file: "{{ tmp.path }}/hello_world.zip"
- runtime: 'python3.9'
+ runtime: 'python3.12'
role: "{{ secret_manager_role }}"
handler: 'hello_world.lambda_handler'
ignore_errors: yes
diff --git a/ansible_collections/community/aws/tests/integration/targets/sns_topic/tasks/main.yml b/ansible_collections/community/aws/tests/integration/targets/sns_topic/tasks/main.yml
index 00f3f71d9..25f636832 100644
--- a/ansible_collections/community/aws/tests/integration/targets/sns_topic/tasks/main.yml
+++ b/ansible_collections/community/aws/tests/integration/targets/sns_topic/tasks/main.yml
@@ -309,7 +309,7 @@
name: '{{ sns_topic_lambda_name }}'
state: present
zip_file: '{{ tempdir.path }}/{{ sns_topic_lambda_function }}.zip'
- runtime: python3.9
+ runtime: python3.12
role: '{{ sns_topic_lambda_role }}'
handler: '{{ sns_topic_lambda_function }}.handler'
register: lambda_result
diff --git a/ansible_collections/community/aws/tests/sanity/ignore-2.17.txt b/ansible_collections/community/aws/tests/sanity/ignore-2.17.txt
index 67d3693df..e69de29bb 100644
--- a/ansible_collections/community/aws/tests/sanity/ignore-2.17.txt
+++ b/ansible_collections/community/aws/tests/sanity/ignore-2.17.txt
@@ -1,2 +0,0 @@
-plugins/connection/aws_ssm.py yamllint:unparsable-with-libyaml # bug in ansible-test - https://github.com/ansible/ansible/issues/82353
-plugins/inventory/aws_mq.py yamllint:unparsable-with-libyaml # bug in ansible-test - https://github.com/ansible/ansible/issues/82353
diff --git a/ansible_collections/community/crypto/.azure-pipelines/azure-pipelines.yml b/ansible_collections/community/crypto/.azure-pipelines/azure-pipelines.yml
index 8697acd43..19a36fb46 100644
--- a/ansible_collections/community/crypto/.azure-pipelines/azure-pipelines.yml
+++ b/ansible_collections/community/crypto/.azure-pipelines/azure-pipelines.yml
@@ -65,6 +65,17 @@ stages:
test: 'devel/sanity/extra'
- name: Units
test: 'devel/units/1'
+ - stage: Ansible_2_17
+ displayName: Sanity & Units 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ targets:
+ - name: Sanity
+ test: '2.17/sanity/1'
+ - name: Units
+ test: '2.17/units/1'
- stage: Ansible_2_16
displayName: Sanity & Units 2.16
dependsOn: []
@@ -87,17 +98,6 @@ stages:
test: '2.15/sanity/1'
- name: Units
test: '2.15/units/1'
- - stage: Ansible_2_14
- displayName: Sanity & Units 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- targets:
- - name: Sanity
- test: '2.14/sanity/1'
- - name: Units
- test: '2.14/units/1'
### Docker
- stage: Docker_devel
displayName: Docker devel
@@ -111,8 +111,21 @@ stages:
test: fedora39
- name: Ubuntu 22.04
test: ubuntu2204
- - name: Alpine 3
- test: alpine3
+ - name: Alpine 3.19
+ test: alpine319
+ groups:
+ - 1
+ - 2
+ - stage: Docker_2_17
+ displayName: Docker 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ testFormat: 2.17/linux/{0}
+ targets:
+ - name: Alpine 3.19
+ test: alpine319
groups:
- 1
- 2
@@ -128,6 +141,8 @@ stages:
test: fedora38
- name: openSUSE 15
test: opensuse15
+ - name: Alpine 3
+ test: alpine3
groups:
- 1
- 2
@@ -146,19 +161,6 @@ stages:
groups:
- 1
- 2
- - stage: Docker_2_14
- displayName: Docker 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.14/linux/{0}
- targets:
- - name: Ubuntu 20.04
- test: ubuntu2004
- groups:
- - 1
- - 2
### Community Docker
- stage: Docker_community_devel
@@ -188,8 +190,8 @@ stages:
parameters:
testFormat: devel/{0}
targets:
- - name: Alpine 3.18
- test: alpine/3.18
+ - name: Alpine 3.19
+ test: alpine/3.19
- name: Fedora 39
test: fedora/39
- name: Ubuntu 22.04
@@ -204,12 +206,25 @@ stages:
parameters:
testFormat: devel/{0}
targets:
- - name: macOS 13.2
- test: macos/13.2
+ - name: macOS 14.3
+ test: macos/14.3
- name: RHEL 9.3
test: rhel/9.3
- - name: FreeBSD 13.2
- test: freebsd/13.2
+ - name: FreeBSD 14.0
+ test: freebsd/14.0
+ groups:
+ - 1
+ - 2
+ - stage: Remote_2_17
+ displayName: Remote 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ testFormat: 2.17/{0}
+ targets:
+ - name: FreeBSD 13.3
+ test: freebsd/13.3
groups:
- 1
- 2
@@ -221,10 +236,14 @@ stages:
parameters:
testFormat: 2.16/{0}
targets:
+ - name: macOS 13.2
+ test: macos/13.2
- name: RHEL 9.2
test: rhel/9.2
- name: RHEL 8.8
test: rhel/8.8
+ - name: FreeBSD 13.2
+ test: freebsd/13.2
groups:
- 1
- 2
@@ -249,38 +268,34 @@ stages:
groups:
- 1
- 2
- - stage: Remote_2_14
- displayName: Remote 2.14
+### Generic
+ - stage: Generic_devel
+ displayName: Generic devel
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
- testFormat: 2.14/{0}
+ nameFormat: Python {0}
+ testFormat: devel/generic/{0}
targets:
- #- name: macOS 12.0
- # test: macos/12.0
- - name: RHEL 9.0
- test: rhel/9.0
- #- name: FreeBSD 12.4
- # test: freebsd/12.4
+ - test: 3.8
+ # - test: 3.9
+ # - test: "3.10"
+ - test: "3.11"
+ - test: "3.12"
groups:
- 1
- 2
-### Generic
- - stage: Generic_devel
- displayName: Generic devel
+ - stage: Generic_2_17
+ displayName: Generic 2.17
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
nameFormat: Python {0}
- testFormat: devel/generic/{0}
+ testFormat: 2.17/generic/{0}
targets:
- - test: 3.7
- # - test: 3.8
- # - test: 3.9
- # - test: "3.10"
- - test: "3.11"
+ - test: "3.7"
- test: "3.12"
groups:
- 1
@@ -314,19 +329,6 @@ stages:
groups:
- 1
- 2
- - stage: Generic_2_14
- displayName: Generic 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- nameFormat: Python {0}
- testFormat: 2.14/generic/{0}
- targets:
- - test: 3.9
- groups:
- - 1
- - 2
## Finally
@@ -334,22 +336,22 @@ stages:
condition: succeededOrFailed()
dependsOn:
- Ansible_devel
+ - Ansible_2_17
- Ansible_2_16
- Ansible_2_15
- - Ansible_2_14
- Remote_devel_extra_vms
- Remote_devel
+ - Remote_2_17
- Remote_2_16
- Remote_2_15
- - Remote_2_14
- Docker_devel
+ - Docker_2_17
- Docker_2_16
- Docker_2_15
- - Docker_2_14
- Docker_community_devel
- Generic_devel
+ - Generic_2_17
- Generic_2_16
- Generic_2_15
- - Generic_2_14
jobs:
- template: templates/coverage.yml
diff --git a/ansible_collections/community/crypto/.github/workflows/ansible-test.yml b/ansible_collections/community/crypto/.github/workflows/ansible-test.yml
index be831028b..d31e861c4 100644
--- a/ansible_collections/community/crypto/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/crypto/.github/workflows/ansible-test.yml
@@ -34,6 +34,7 @@ jobs:
- '2.11'
- '2.12'
- '2.13'
+ - '2.14'
# Ansible-test on various stable branches does not yet work well with cgroups v2.
# Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04
# image for these stable branches. The list of branches where this is necessary will
@@ -74,6 +75,7 @@ jobs:
- '2.11'
- '2.12'
- '2.13'
+ - '2.14'
steps:
- name: >-
@@ -253,6 +255,23 @@ jobs:
docker: default
python: '3.8'
target: azp/generic/2/
+ # 2.14
+ - ansible: '2.14'
+ docker: ubuntu2004
+ python: ''
+ target: azp/posix/1/
+ - ansible: '2.14'
+ docker: ubuntu2004
+ python: ''
+ target: azp/posix/2/
+ - ansible: '2.14'
+ docker: default
+ python: '3.9'
+ target: azp/generic/1/
+ - ansible: '2.14'
+ docker: default
+ python: '3.9'
+ target: azp/generic/2/
steps:
- name: >-
diff --git a/ansible_collections/community/crypto/.github/workflows/reuse.yml b/ansible_collections/community/crypto/.github/workflows/reuse.yml
index 29b1f951a..7646c5cfb 100644
--- a/ansible_collections/community/crypto/.github/workflows/reuse.yml
+++ b/ansible_collections/community/crypto/.github/workflows/reuse.yml
@@ -29,4 +29,4 @@ jobs:
rm -f tests/integration/targets/*/files/roots/*.pem
- name: REUSE Compliance Check
- uses: fsfe/reuse-action@v2
+ uses: fsfe/reuse-action@v3
diff --git a/ansible_collections/community/crypto/CHANGELOG.md b/ansible_collections/community/crypto/CHANGELOG.md
index f54352a87..1652a3ad2 100644
--- a/ansible_collections/community/crypto/CHANGELOG.md
+++ b/ansible_collections/community/crypto/CHANGELOG.md
@@ -1,217 +1,224 @@
# Community Crypto Release Notes
**Topics**
+
+- <a href="#v2-19-0">v2\.19\.0</a>
+ - <a href="#release-summary">Release Summary</a>
+ - <a href="#minor-changes">Minor Changes</a>
+ - <a href="#deprecated-features">Deprecated Features</a>
+ - <a href="#bugfixes">Bugfixes</a>
+ - <a href="#new-modules">New Modules</a>
- <a href="#v2-18-0">v2\.18\.0</a>
- - <a href="#release-summary">Release Summary</a>
- - <a href="#minor-changes">Minor Changes</a>
- - <a href="#deprecated-features">Deprecated Features</a>
- - <a href="#bugfixes">Bugfixes</a>
- - <a href="#new-plugins">New Plugins</a>
- - <a href="#filter">Filter</a>
+ - <a href="#release-summary-1">Release Summary</a>
+ - <a href="#minor-changes-1">Minor Changes</a>
+ - <a href="#deprecated-features-1">Deprecated Features</a>
+ - <a href="#bugfixes-1">Bugfixes</a>
+ - <a href="#new-plugins">New Plugins</a>
+ - <a href="#filter">Filter</a>
- <a href="#v2-17-1">v2\.17\.1</a>
- - <a href="#release-summary-1">Release Summary</a>
- - <a href="#bugfixes-1">Bugfixes</a>
+ - <a href="#release-summary-2">Release Summary</a>
+ - <a href="#bugfixes-2">Bugfixes</a>
- <a href="#v2-17-0">v2\.17\.0</a>
- - <a href="#release-summary-2">Release Summary</a>
- - <a href="#minor-changes-1">Minor Changes</a>
+ - <a href="#release-summary-3">Release Summary</a>
+ - <a href="#minor-changes-2">Minor Changes</a>
- <a href="#v2-16-2">v2\.16\.2</a>
- - <a href="#release-summary-3">Release Summary</a>
- - <a href="#bugfixes-2">Bugfixes</a>
+ - <a href="#release-summary-4">Release Summary</a>
+ - <a href="#bugfixes-3">Bugfixes</a>
- <a href="#v2-16-1">v2\.16\.1</a>
- - <a href="#release-summary-4">Release Summary</a>
- - <a href="#bugfixes-3">Bugfixes</a>
+ - <a href="#release-summary-5">Release Summary</a>
+ - <a href="#bugfixes-4">Bugfixes</a>
- <a href="#v2-16-0">v2\.16\.0</a>
- - <a href="#release-summary-5">Release Summary</a>
- - <a href="#minor-changes-2">Minor Changes</a>
- - <a href="#bugfixes-4">Bugfixes</a>
+ - <a href="#release-summary-6">Release Summary</a>
+ - <a href="#minor-changes-3">Minor Changes</a>
+ - <a href="#bugfixes-5">Bugfixes</a>
- <a href="#v2-15-1">v2\.15\.1</a>
- - <a href="#release-summary-6">Release Summary</a>
- - <a href="#bugfixes-5">Bugfixes</a>
+ - <a href="#release-summary-7">Release Summary</a>
+ - <a href="#bugfixes-6">Bugfixes</a>
- <a href="#v2-15-0">v2\.15\.0</a>
- - <a href="#release-summary-7">Release Summary</a>
- - <a href="#minor-changes-3">Minor Changes</a>
- - <a href="#deprecated-features-1">Deprecated Features</a>
- - <a href="#bugfixes-6">Bugfixes</a>
- - <a href="#new-plugins-1">New Plugins</a>
- - <a href="#filter-1">Filter</a>
- - <a href="#lookup">Lookup</a>
+ - <a href="#release-summary-8">Release Summary</a>
+ - <a href="#minor-changes-4">Minor Changes</a>
+ - <a href="#deprecated-features-2">Deprecated Features</a>
+ - <a href="#bugfixes-7">Bugfixes</a>
+ - <a href="#new-plugins-1">New Plugins</a>
+ - <a href="#filter-1">Filter</a>
+ - <a href="#lookup">Lookup</a>
- <a href="#v2-14-1">v2\.14\.1</a>
- - <a href="#release-summary-8">Release Summary</a>
- - <a href="#bugfixes-7">Bugfixes</a>
- - <a href="#known-issues">Known Issues</a>
+ - <a href="#release-summary-9">Release Summary</a>
+ - <a href="#bugfixes-8">Bugfixes</a>
+ - <a href="#known-issues">Known Issues</a>
- <a href="#v2-14-0">v2\.14\.0</a>
- - <a href="#release-summary-9">Release Summary</a>
- - <a href="#minor-changes-4">Minor Changes</a>
+ - <a href="#release-summary-10">Release Summary</a>
+ - <a href="#minor-changes-5">Minor Changes</a>
- <a href="#v2-13-1">v2\.13\.1</a>
- - <a href="#release-summary-10">Release Summary</a>
- - <a href="#bugfixes-8">Bugfixes</a>
+ - <a href="#release-summary-11">Release Summary</a>
+ - <a href="#bugfixes-9">Bugfixes</a>
- <a href="#v2-13-0">v2\.13\.0</a>
- - <a href="#release-summary-11">Release Summary</a>
- - <a href="#minor-changes-5">Minor Changes</a>
- - <a href="#deprecated-features-2">Deprecated Features</a>
- - <a href="#bugfixes-9">Bugfixes</a>
+ - <a href="#release-summary-12">Release Summary</a>
+ - <a href="#minor-changes-6">Minor Changes</a>
+ - <a href="#deprecated-features-3">Deprecated Features</a>
+ - <a href="#bugfixes-10">Bugfixes</a>
- <a href="#v2-12-0">v2\.12\.0</a>
- - <a href="#release-summary-12">Release Summary</a>
- - <a href="#minor-changes-6">Minor Changes</a>
+ - <a href="#release-summary-13">Release Summary</a>
+ - <a href="#minor-changes-7">Minor Changes</a>
- <a href="#v2-11-1">v2\.11\.1</a>
- - <a href="#release-summary-13">Release Summary</a>
+ - <a href="#release-summary-14">Release Summary</a>
- <a href="#v2-11-0">v2\.11\.0</a>
- - <a href="#release-summary-14">Release Summary</a>
- - <a href="#minor-changes-7">Minor Changes</a>
- - <a href="#bugfixes-10">Bugfixes</a>
+ - <a href="#release-summary-15">Release Summary</a>
+ - <a href="#minor-changes-8">Minor Changes</a>
+ - <a href="#bugfixes-11">Bugfixes</a>
- <a href="#v2-10-0">v2\.10\.0</a>
- - <a href="#release-summary-15">Release Summary</a>
- - <a href="#bugfixes-11">Bugfixes</a>
- - <a href="#new-plugins-2">New Plugins</a>
- - <a href="#filter-2">Filter</a>
+ - <a href="#release-summary-16">Release Summary</a>
+ - <a href="#bugfixes-12">Bugfixes</a>
+ - <a href="#new-plugins-2">New Plugins</a>
+ - <a href="#filter-2">Filter</a>
- <a href="#v2-9-0">v2\.9\.0</a>
- - <a href="#release-summary-16">Release Summary</a>
- - <a href="#minor-changes-8">Minor Changes</a>
+ - <a href="#release-summary-17">Release Summary</a>
+ - <a href="#minor-changes-9">Minor Changes</a>
- <a href="#v2-8-1">v2\.8\.1</a>
- - <a href="#release-summary-17">Release Summary</a>
+ - <a href="#release-summary-18">Release Summary</a>
- <a href="#v2-8-0">v2\.8\.0</a>
- - <a href="#release-summary-18">Release Summary</a>
- - <a href="#minor-changes-9">Minor Changes</a>
+ - <a href="#release-summary-19">Release Summary</a>
+ - <a href="#minor-changes-10">Minor Changes</a>
- <a href="#v2-7-1">v2\.7\.1</a>
- - <a href="#release-summary-19">Release Summary</a>
- - <a href="#bugfixes-12">Bugfixes</a>
+ - <a href="#release-summary-20">Release Summary</a>
+ - <a href="#bugfixes-13">Bugfixes</a>
- <a href="#v2-7-0">v2\.7\.0</a>
- - <a href="#release-summary-20">Release Summary</a>
- - <a href="#minor-changes-10">Minor Changes</a>
- - <a href="#bugfixes-13">Bugfixes</a>
+ - <a href="#release-summary-21">Release Summary</a>
+ - <a href="#minor-changes-11">Minor Changes</a>
+ - <a href="#bugfixes-14">Bugfixes</a>
- <a href="#v2-6-0">v2\.6\.0</a>
- - <a href="#release-summary-21">Release Summary</a>
- - <a href="#minor-changes-11">Minor Changes</a>
+ - <a href="#release-summary-22">Release Summary</a>
+ - <a href="#minor-changes-12">Minor Changes</a>
- <a href="#v2-5-0">v2\.5\.0</a>
- - <a href="#release-summary-22">Release Summary</a>
- - <a href="#minor-changes-12">Minor Changes</a>
+ - <a href="#release-summary-23">Release Summary</a>
+ - <a href="#minor-changes-13">Minor Changes</a>
- <a href="#v2-4-0">v2\.4\.0</a>
- - <a href="#release-summary-23">Release Summary</a>
- - <a href="#deprecated-features-3">Deprecated Features</a>
- - <a href="#bugfixes-14">Bugfixes</a>
+ - <a href="#release-summary-24">Release Summary</a>
+ - <a href="#deprecated-features-4">Deprecated Features</a>
+ - <a href="#bugfixes-15">Bugfixes</a>
- <a href="#v2-3-4">v2\.3\.4</a>
- - <a href="#release-summary-24">Release Summary</a>
+ - <a href="#release-summary-25">Release Summary</a>
- <a href="#v2-3-3">v2\.3\.3</a>
- - <a href="#release-summary-25">Release Summary</a>
- - <a href="#bugfixes-15">Bugfixes</a>
+ - <a href="#release-summary-26">Release Summary</a>
+ - <a href="#bugfixes-16">Bugfixes</a>
- <a href="#v2-3-2">v2\.3\.2</a>
- - <a href="#release-summary-26">Release Summary</a>
- - <a href="#bugfixes-16">Bugfixes</a>
+ - <a href="#release-summary-27">Release Summary</a>
+ - <a href="#bugfixes-17">Bugfixes</a>
- <a href="#v2-3-1">v2\.3\.1</a>
- - <a href="#release-summary-27">Release Summary</a>
- - <a href="#bugfixes-17">Bugfixes</a>
+ - <a href="#release-summary-28">Release Summary</a>
+ - <a href="#bugfixes-18">Bugfixes</a>
- <a href="#v2-3-0">v2\.3\.0</a>
- - <a href="#release-summary-28">Release Summary</a>
- - <a href="#minor-changes-13">Minor Changes</a>
- - <a href="#bugfixes-18">Bugfixes</a>
+ - <a href="#release-summary-29">Release Summary</a>
+ - <a href="#minor-changes-14">Minor Changes</a>
+ - <a href="#bugfixes-19">Bugfixes</a>
- <a href="#v2-2-4">v2\.2\.4</a>
- - <a href="#release-summary-29">Release Summary</a>
- - <a href="#bugfixes-19">Bugfixes</a>
+ - <a href="#release-summary-30">Release Summary</a>
+ - <a href="#bugfixes-20">Bugfixes</a>
- <a href="#v2-2-3">v2\.2\.3</a>
- - <a href="#release-summary-30">Release Summary</a>
- - <a href="#bugfixes-20">Bugfixes</a>
+ - <a href="#release-summary-31">Release Summary</a>
+ - <a href="#bugfixes-21">Bugfixes</a>
- <a href="#v2-2-2">v2\.2\.2</a>
- - <a href="#release-summary-31">Release Summary</a>
- - <a href="#bugfixes-21">Bugfixes</a>
+ - <a href="#release-summary-32">Release Summary</a>
+ - <a href="#bugfixes-22">Bugfixes</a>
- <a href="#v2-2-1">v2\.2\.1</a>
- - <a href="#release-summary-32">Release Summary</a>
- - <a href="#bugfixes-22">Bugfixes</a>
+ - <a href="#release-summary-33">Release Summary</a>
+ - <a href="#bugfixes-23">Bugfixes</a>
- <a href="#v2-2-0">v2\.2\.0</a>
- - <a href="#release-summary-33">Release Summary</a>
- - <a href="#minor-changes-14">Minor Changes</a>
- - <a href="#bugfixes-23">Bugfixes</a>
+ - <a href="#release-summary-34">Release Summary</a>
+ - <a href="#minor-changes-15">Minor Changes</a>
+ - <a href="#bugfixes-24">Bugfixes</a>
- <a href="#v2-1-0">v2\.1\.0</a>
- - <a href="#release-summary-34">Release Summary</a>
- - <a href="#minor-changes-15">Minor Changes</a>
- - <a href="#bugfixes-24">Bugfixes</a>
- - <a href="#new-modules">New Modules</a>
+ - <a href="#release-summary-35">Release Summary</a>
+ - <a href="#minor-changes-16">Minor Changes</a>
+ - <a href="#bugfixes-25">Bugfixes</a>
+ - <a href="#new-modules-1">New Modules</a>
- <a href="#v2-0-2">v2\.0\.2</a>
- - <a href="#release-summary-35">Release Summary</a>
+ - <a href="#release-summary-36">Release Summary</a>
- <a href="#v2-0-1">v2\.0\.1</a>
- - <a href="#release-summary-36">Release Summary</a>
- - <a href="#minor-changes-16">Minor Changes</a>
- - <a href="#bugfixes-25">Bugfixes</a>
+ - <a href="#release-summary-37">Release Summary</a>
+ - <a href="#minor-changes-17">Minor Changes</a>
+ - <a href="#bugfixes-26">Bugfixes</a>
- <a href="#v2-0-0">v2\.0\.0</a>
- - <a href="#release-summary-37">Release Summary</a>
- - <a href="#minor-changes-17">Minor Changes</a>
- - <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- - <a href="#deprecated-features-4">Deprecated Features</a>
- - <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
- - <a href="#bugfixes-26">Bugfixes</a>
+ - <a href="#release-summary-38">Release Summary</a>
+ - <a href="#minor-changes-18">Minor Changes</a>
+ - <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
+ - <a href="#deprecated-features-5">Deprecated Features</a>
+ - <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
+ - <a href="#bugfixes-27">Bugfixes</a>
- <a href="#v1-9-4">v1\.9\.4</a>
- - <a href="#release-summary-38">Release Summary</a>
- - <a href="#bugfixes-27">Bugfixes</a>
+ - <a href="#release-summary-39">Release Summary</a>
+ - <a href="#bugfixes-28">Bugfixes</a>
- <a href="#v1-9-3">v1\.9\.3</a>
- - <a href="#release-summary-39">Release Summary</a>
- - <a href="#bugfixes-28">Bugfixes</a>
+ - <a href="#release-summary-40">Release Summary</a>
+ - <a href="#bugfixes-29">Bugfixes</a>
- <a href="#v1-9-2">v1\.9\.2</a>
- - <a href="#release-summary-40">Release Summary</a>
+ - <a href="#release-summary-41">Release Summary</a>
- <a href="#v1-9-1">v1\.9\.1</a>
- - <a href="#release-summary-41">Release Summary</a>
+ - <a href="#release-summary-42">Release Summary</a>
- <a href="#v1-9-0">v1\.9\.0</a>
- - <a href="#release-summary-42">Release Summary</a>
- - <a href="#minor-changes-18">Minor Changes</a>
- - <a href="#bugfixes-29">Bugfixes</a>
+ - <a href="#release-summary-43">Release Summary</a>
+ - <a href="#minor-changes-19">Minor Changes</a>
+ - <a href="#bugfixes-30">Bugfixes</a>
- <a href="#v1-8-0">v1\.8\.0</a>
- - <a href="#release-summary-43">Release Summary</a>
- - <a href="#minor-changes-19">Minor Changes</a>
- - <a href="#bugfixes-30">Bugfixes</a>
+ - <a href="#release-summary-44">Release Summary</a>
+ - <a href="#minor-changes-20">Minor Changes</a>
+ - <a href="#bugfixes-31">Bugfixes</a>
- <a href="#v1-7-1">v1\.7\.1</a>
- - <a href="#release-summary-44">Release Summary</a>
- - <a href="#bugfixes-31">Bugfixes</a>
+ - <a href="#release-summary-45">Release Summary</a>
+ - <a href="#bugfixes-32">Bugfixes</a>
- <a href="#v1-7-0">v1\.7\.0</a>
- - <a href="#release-summary-45">Release Summary</a>
- - <a href="#minor-changes-20">Minor Changes</a>
- - <a href="#bugfixes-32">Bugfixes</a>
- - <a href="#new-modules-1">New Modules</a>
+ - <a href="#release-summary-46">Release Summary</a>
+ - <a href="#minor-changes-21">Minor Changes</a>
+ - <a href="#bugfixes-33">Bugfixes</a>
+ - <a href="#new-modules-2">New Modules</a>
- <a href="#v1-6-2">v1\.6\.2</a>
- - <a href="#release-summary-46">Release Summary</a>
- - <a href="#bugfixes-33">Bugfixes</a>
+ - <a href="#release-summary-47">Release Summary</a>
+ - <a href="#bugfixes-34">Bugfixes</a>
- <a href="#v1-6-1">v1\.6\.1</a>
- - <a href="#release-summary-47">Release Summary</a>
- - <a href="#bugfixes-34">Bugfixes</a>
+ - <a href="#release-summary-48">Release Summary</a>
+ - <a href="#bugfixes-35">Bugfixes</a>
- <a href="#v1-6-0">v1\.6\.0</a>
- - <a href="#release-summary-48">Release Summary</a>
- - <a href="#minor-changes-21">Minor Changes</a>
- - <a href="#deprecated-features-5">Deprecated Features</a>
- - <a href="#bugfixes-35">Bugfixes</a>
+ - <a href="#release-summary-49">Release Summary</a>
+ - <a href="#minor-changes-22">Minor Changes</a>
+ - <a href="#deprecated-features-6">Deprecated Features</a>
+ - <a href="#bugfixes-36">Bugfixes</a>
- <a href="#v1-5-0">v1\.5\.0</a>
- - <a href="#release-summary-49">Release Summary</a>
- - <a href="#minor-changes-22">Minor Changes</a>
- - <a href="#deprecated-features-6">Deprecated Features</a>
- - <a href="#bugfixes-36">Bugfixes</a>
+ - <a href="#release-summary-50">Release Summary</a>
+ - <a href="#minor-changes-23">Minor Changes</a>
+ - <a href="#deprecated-features-7">Deprecated Features</a>
+ - <a href="#bugfixes-37">Bugfixes</a>
- <a href="#v1-4-0">v1\.4\.0</a>
- - <a href="#release-summary-50">Release Summary</a>
- - <a href="#minor-changes-23">Minor Changes</a>
- - <a href="#bugfixes-37">Bugfixes</a>
+ - <a href="#release-summary-51">Release Summary</a>
+ - <a href="#minor-changes-24">Minor Changes</a>
+ - <a href="#bugfixes-38">Bugfixes</a>
- <a href="#v1-3-0">v1\.3\.0</a>
- - <a href="#release-summary-51">Release Summary</a>
- - <a href="#minor-changes-24">Minor Changes</a>
- - <a href="#bugfixes-38">Bugfixes</a>
- - <a href="#new-modules-2">New Modules</a>
+ - <a href="#release-summary-52">Release Summary</a>
+ - <a href="#minor-changes-25">Minor Changes</a>
+ - <a href="#bugfixes-39">Bugfixes</a>
+ - <a href="#new-modules-3">New Modules</a>
- <a href="#v1-2-0">v1\.2\.0</a>
- - <a href="#release-summary-52">Release Summary</a>
- - <a href="#minor-changes-25">Minor Changes</a>
- - <a href="#security-fixes">Security Fixes</a>
- - <a href="#bugfixes-39">Bugfixes</a>
+ - <a href="#release-summary-53">Release Summary</a>
+ - <a href="#minor-changes-26">Minor Changes</a>
+ - <a href="#security-fixes">Security Fixes</a>
+ - <a href="#bugfixes-40">Bugfixes</a>
- <a href="#v1-1-1">v1\.1\.1</a>
- - <a href="#release-summary-53">Release Summary</a>
- - <a href="#bugfixes-40">Bugfixes</a>
+ - <a href="#release-summary-54">Release Summary</a>
+ - <a href="#bugfixes-41">Bugfixes</a>
- <a href="#v1-1-0">v1\.1\.0</a>
- - <a href="#release-summary-54">Release Summary</a>
- - <a href="#minor-changes-26">Minor Changes</a>
- - <a href="#bugfixes-41">Bugfixes</a>
- - <a href="#new-modules-3">New Modules</a>
+ - <a href="#release-summary-55">Release Summary</a>
+ - <a href="#minor-changes-27">Minor Changes</a>
+ - <a href="#bugfixes-42">Bugfixes</a>
+ - <a href="#new-modules-4">New Modules</a>
- <a href="#v1-0-0">v1\.0\.0</a>
- - <a href="#release-summary-55">Release Summary</a>
- - <a href="#minor-changes-27">Minor Changes</a>
- - <a href="#deprecated-features-7">Deprecated Features</a>
- - <a href="#removed-features-previously-deprecated-1">Removed Features \(previously deprecated\)</a>
- - <a href="#bugfixes-42">Bugfixes</a>
- - <a href="#new-modules-4">New Modules</a>
+ - <a href="#release-summary-56">Release Summary</a>
+ - <a href="#minor-changes-28">Minor Changes</a>
+ - <a href="#deprecated-features-8">Deprecated Features</a>
+ - <a href="#removed-features-previously-deprecated-1">Removed Features \(previously deprecated\)</a>
+ - <a href="#bugfixes-43">Bugfixes</a>
+ - <a href="#new-modules-5">New Modules</a>
-<a id="v2-18-0"></a>
-## v2\.18\.0
+<a id="v2-19-0"></a>
+## v2\.19\.0
<a id="release-summary"></a>
### Release Summary
@@ -221,16 +228,45 @@ Bugfix and feature release\.
<a id="minor-changes"></a>
### Minor Changes
-* x509\_crl \- the new option <code>serial\_numbers</code> allow to configure in which format serial numbers can be provided to <code>revoked\_certificates\[\]\.serial\_number</code>\. The default is as integers \(<code>serial\_numbers\=integer</code>\) for backwards compatibility\; setting <code>serial\_numbers\=hex\-octets</code> allows to specify colon\-separated hex octet strings like <code>00\:11\:22\:FF</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/687](https\://github\.com/ansible\-collections/community\.crypto/issues/687)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/715](https\://github\.com/ansible\-collections/community\.crypto/pull/715)\)\.
+* When using cryptography \>\= 42\.0\.0\, use offset\-aware <code>datetime\.datetime</code> objects \(with timezone UTC\) instead of offset\-naive UTC timestamps \([https\://github\.com/ansible\-collections/community\.crypto/issues/726](https\://github\.com/ansible\-collections/community\.crypto/issues/726)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/727](https\://github\.com/ansible\-collections/community\.crypto/pull/727)\)\.
+* openssh\_cert \- avoid UTC functions deprecated in Python 3\.12 when using Python 3 \([https\://github\.com/ansible\-collections/community\.crypto/pull/727](https\://github\.com/ansible\-collections/community\.crypto/pull/727)\)\.
<a id="deprecated-features"></a>
### Deprecated Features
-* openssl\_csr\_pipe\, openssl\_privatekey\_pipe\, x509\_certificate\_pipe \- the current behavior of check mode is deprecated and will change in community\.crypto 3\.0\.0\. The current behavior is similar to the modules without <code>\_pipe</code>\: if the object needs to be \(re\-\)generated\, only the <code>changed</code> status is set\, but the object is not updated\. From community\.crypto 3\.0\.0 on\, the modules will ignore check mode and always act as if check mode is not active\. This behavior can already achieved now by adding <code>check\_mode\: false</code> to the task\. If you think this breaks your use\-case of this module\, please [create an issue in the community\.crypto repository](https\://github\.com/ansible\-collections/community\.crypto/issues/new/choose) \([https\://github\.com/ansible\-collections/community\.crypto/issues/712](https\://github\.com/ansible\-collections/community\.crypto/issues/712)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/714](https\://github\.com/ansible\-collections/community\.crypto/pull/714)\)\.
+* acme\.backends module utils \- from community\.crypto on\, all implementations of <code>CryptoBackend</code> must override <code>get\_ordered\_csr\_identifiers\(\)</code>\. The current default implementation\, which simply sorts the result of <code>get\_csr\_identifiers\(\)</code>\, will then be removed \([https\://github\.com/ansible\-collections/community\.crypto/pull/725](https\://github\.com/ansible\-collections/community\.crypto/pull/725)\)\.
<a id="bugfixes"></a>
### Bugfixes
+* acme\_certificate \- respect the order of the CNAME and SAN identifiers that are passed on when creating an ACME order \([https\://github\.com/ansible\-collections/community\.crypto/issues/723](https\://github\.com/ansible\-collections/community\.crypto/issues/723)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/725](https\://github\.com/ansible\-collections/community\.crypto/pull/725)\)\.
+
+<a id="new-modules"></a>
+### New Modules
+
+* x509\_certificate\_convert \- Convert X\.509 certificates
+
+<a id="v2-18-0"></a>
+## v2\.18\.0
+
+<a id="release-summary-1"></a>
+### Release Summary
+
+Bugfix and feature release\.
+
+<a id="minor-changes-1"></a>
+### Minor Changes
+
+* x509\_crl \- the new option <code>serial\_numbers</code> allow to configure in which format serial numbers can be provided to <code>revoked\_certificates\[\]\.serial\_number</code>\. The default is as integers \(<code>serial\_numbers\=integer</code>\) for backwards compatibility\; setting <code>serial\_numbers\=hex\-octets</code> allows to specify colon\-separated hex octet strings like <code>00\:11\:22\:FF</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/687](https\://github\.com/ansible\-collections/community\.crypto/issues/687)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/715](https\://github\.com/ansible\-collections/community\.crypto/pull/715)\)\.
+
+<a id="deprecated-features-1"></a>
+### Deprecated Features
+
+* openssl\_csr\_pipe\, openssl\_privatekey\_pipe\, x509\_certificate\_pipe \- the current behavior of check mode is deprecated and will change in community\.crypto 3\.0\.0\. The current behavior is similar to the modules without <code>\_pipe</code>\: if the object needs to be \(re\-\)generated\, only the <code>changed</code> status is set\, but the object is not updated\. From community\.crypto 3\.0\.0 on\, the modules will ignore check mode and always act as if check mode is not active\. This behavior can already achieved now by adding <code>check\_mode\: false</code> to the task\. If you think this breaks your use\-case of this module\, please [create an issue in the community\.crypto repository](https\://github\.com/ansible\-collections/community\.crypto/issues/new/choose) \([https\://github\.com/ansible\-collections/community\.crypto/issues/712](https\://github\.com/ansible\-collections/community\.crypto/issues/712)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/714](https\://github\.com/ansible\-collections/community\.crypto/pull/714)\)\.
+
+<a id="bugfixes-1"></a>
+### Bugfixes
+
* luks\_device \- fixed module a bug that prevented using <code>remove\_keyslot</code> with the value <code>0</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/710](https\://github\.com/ansible\-collections/community\.crypto/pull/710)\)\.
* luks\_device \- fixed module falsely outputting <code>changed\=false</code> when trying to add a new slot with a key that is already present in another slot\. The module now rejects adding keys that are already present in another slot \([https\://github\.com/ansible\-collections/community\.crypto/pull/710](https\://github\.com/ansible\-collections/community\.crypto/pull/710)\)\.
* luks\_device \- fixed testing of LUKS passphrases in when specifying a keyslot for cryptsetup version 2\.0\.3\. The output of this cryptsetup version slightly differs from later versions \([https\://github\.com/ansible\-collections/community\.crypto/pull/710](https\://github\.com/ansible\-collections/community\.crypto/pull/710)\)\.
@@ -247,12 +283,12 @@ Bugfix and feature release\.
<a id="v2-17-1"></a>
## v2\.17\.1
-<a id="release-summary-1"></a>
+<a id="release-summary-2"></a>
### Release Summary
Bugfix release for compatibility with cryptography 42\.0\.0\.
-<a id="bugfixes-1"></a>
+<a id="bugfixes-2"></a>
### Bugfixes
* openssl\_dhparam \- was using an internal function instead of the public API to load DH param files when using the <code>cryptography</code> backend\. The internal function was removed in cryptography 42\.0\.0\. The module now uses the public API\, which has been available since support for DH params was added to cryptography \([https\://github\.com/ansible\-collections/community\.crypto/pull/698](https\://github\.com/ansible\-collections/community\.crypto/pull/698)\)\.
@@ -262,12 +298,12 @@ Bugfix release for compatibility with cryptography 42\.0\.0\.
<a id="v2-17-0"></a>
## v2\.17\.0
-<a id="release-summary-2"></a>
+<a id="release-summary-3"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-1"></a>
+<a id="minor-changes-2"></a>
### Minor Changes
* luks\_device \- add allow discards option \([https\://github\.com/ansible\-collections/community\.crypto/pull/693](https\://github\.com/ansible\-collections/community\.crypto/pull/693)\)\.
@@ -275,12 +311,12 @@ Feature release\.
<a id="v2-16-2"></a>
## v2\.16\.2
-<a id="release-summary-3"></a>
+<a id="release-summary-4"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-2"></a>
+<a id="bugfixes-3"></a>
### Bugfixes
* acme\_\* modules \- directly react on bad return data for account creation/retrieval/updating requests \([https\://github\.com/ansible\-collections/community\.crypto/pull/682](https\://github\.com/ansible\-collections/community\.crypto/pull/682)\)\.
@@ -291,12 +327,12 @@ Bugfix release\.
<a id="v2-16-1"></a>
## v2\.16\.1
-<a id="release-summary-4"></a>
+<a id="release-summary-5"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-3"></a>
+<a id="bugfixes-4"></a>
### Bugfixes
* acme\_\* modules \- also retry requests in case of socket errors\, bad status lines\, and unknown connection errors\; improve error messages in these cases \([https\://github\.com/ansible\-collections/community\.crypto/issues/680](https\://github\.com/ansible\-collections/community\.crypto/issues/680)\)\.
@@ -304,17 +340,17 @@ Bugfix release\.
<a id="v2-16-0"></a>
## v2\.16\.0
-<a id="release-summary-5"></a>
+<a id="release-summary-6"></a>
### Release Summary
Bugfix release\.
-<a id="minor-changes-2"></a>
+<a id="minor-changes-3"></a>
### Minor Changes
* luks\_devices \- add new options <code>keyslot</code>\, <code>new\_keyslot</code>\, and <code>remove\_keyslot</code> to allow adding/removing keys to/from specific keyslots \([https\://github\.com/ansible\-collections/community\.crypto/pull/664](https\://github\.com/ansible\-collections/community\.crypto/pull/664)\)\.
-<a id="bugfixes-4"></a>
+<a id="bugfixes-5"></a>
### Bugfixes
* openssl\_pkcs12 \- modify autodetect to not detect pyOpenSSL \>\= 23\.3\.0\, which removed PKCS\#12 support \([https\://github\.com/ansible\-collections/community\.crypto/pull/666](https\://github\.com/ansible\-collections/community\.crypto/pull/666)\)\.
@@ -322,12 +358,12 @@ Bugfix release\.
<a id="v2-15-1"></a>
## v2\.15\.1
-<a id="release-summary-6"></a>
+<a id="release-summary-7"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-5"></a>
+<a id="bugfixes-6"></a>
### Bugfixes
* acme\_\* modules \- correctly handle error documents without <code>type</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/651](https\://github\.com/ansible\-collections/community\.crypto/issues/651)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/652](https\://github\.com/ansible\-collections/community\.crypto/pull/652)\)\.
@@ -335,22 +371,22 @@ Bugfix release\.
<a id="v2-15-0"></a>
## v2\.15\.0
-<a id="release-summary-7"></a>
+<a id="release-summary-8"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-3"></a>
+<a id="minor-changes-4"></a>
### Minor Changes
* openssh\_keypair \- fail when comment cannot be updated \([https\://github\.com/ansible\-collections/community\.crypto/pull/646](https\://github\.com/ansible\-collections/community\.crypto/pull/646)\)\.
-<a id="deprecated-features-1"></a>
+<a id="deprecated-features-2"></a>
### Deprecated Features
* get\_certificate \- the default <code>false</code> of the <code>asn1\_base64</code> option is deprecated and will change to <code>true</code> in community\.crypto 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.crypto/pull/600](https\://github\.com/ansible\-collections/community\.crypto/pull/600)\)\.
-<a id="bugfixes-6"></a>
+<a id="bugfixes-7"></a>
### Bugfixes
* openssh\_cert\, openssh\_keypair \- the modules ignored return codes of <code>ssh</code> and <code>ssh\-keygen</code> in some cases \([https\://github\.com/ansible\-collections/community\.crypto/issues/645](https\://github\.com/ansible\-collections/community\.crypto/issues/645)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/646](https\://github\.com/ansible\-collections/community\.crypto/pull/646)\)\.
@@ -372,7 +408,7 @@ Bugfix and feature release\.
<a id="v2-14-1"></a>
## v2\.14\.1
-<a id="release-summary-8"></a>
+<a id="release-summary-9"></a>
### Release Summary
Bugfix and maintenance release with updated documentation\.
@@ -385,7 +421,7 @@ ansible\-core 2\.15 or later to see it as it is intended\. Alternatively you can
look at [the devel docsite](https\://docs\.ansible\.com/ansible/devel/collections/community/crypto/)
for the rendered HTML version of the documentation of the latest release\.
-<a id="bugfixes-7"></a>
+<a id="bugfixes-8"></a>
### Bugfixes
* Fix PEM detection/identification to also accept random other lines before the line starting with <code>\-\-\-\-\-BEGIN</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/627](https\://github\.com/ansible\-collections/community\.crypto/issues/627)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/628](https\://github\.com/ansible\-collections/community\.crypto/pull/628)\)\.
@@ -398,12 +434,12 @@ for the rendered HTML version of the documentation of the latest release\.
<a id="v2-14-0"></a>
## v2\.14\.0
-<a id="release-summary-9"></a>
+<a id="release-summary-10"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-4"></a>
+<a id="minor-changes-5"></a>
### Minor Changes
* acme\_certificate \- allow to use no challenge by providing <code>no challenge</code> for the <code>challenge</code> option\. This is needed for ACME servers where validation is done without challenges \([https\://github\.com/ansible\-collections/community\.crypto/issues/613](https\://github\.com/ansible\-collections/community\.crypto/issues/613)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/615](https\://github\.com/ansible\-collections/community\.crypto/pull/615)\)\.
@@ -413,12 +449,12 @@ Feature release\.
<a id="v2-13-1"></a>
## v2\.13\.1
-<a id="release-summary-10"></a>
+<a id="release-summary-11"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-8"></a>
+<a id="bugfixes-9"></a>
### Bugfixes
* execution environment definition \- fix installation of <code>python3\-pyOpenSSL</code> package on CentOS and RHEL \([https\://github\.com/ansible\-collections/community\.crypto/pull/606](https\://github\.com/ansible\-collections/community\.crypto/pull/606)\)\.
@@ -427,22 +463,22 @@ Bugfix release\.
<a id="v2-13-0"></a>
## v2\.13\.0
-<a id="release-summary-11"></a>
+<a id="release-summary-12"></a>
### Release Summary
Bugfix and maintenance release\.
-<a id="minor-changes-5"></a>
+<a id="minor-changes-6"></a>
### Minor Changes
* x509\_crl \- the <code>crl\_mode</code> option has been added to replace the existing <code>mode</code> option \([https\://github\.com/ansible\-collections/community\.crypto/issues/596](https\://github\.com/ansible\-collections/community\.crypto/issues/596)\)\.
-<a id="deprecated-features-2"></a>
+<a id="deprecated-features-3"></a>
### Deprecated Features
* x509\_crl \- the <code>mode</code> option is deprecated\; use <code>crl\_mode</code> instead\. The <code>mode</code> option will change its meaning in community\.crypto 3\.0\.0\, and will refer to the CRL file\'s mode instead \([https\://github\.com/ansible\-collections/community\.crypto/issues/596](https\://github\.com/ansible\-collections/community\.crypto/issues/596)\)\.
-<a id="bugfixes-9"></a>
+<a id="bugfixes-10"></a>
### Bugfixes
* openssh\_keypair \- always generate a new key pair if the private key does not exist\. Previously\, the module would fail when <code>regenerate\=fail</code> without an existing key\, contradicting the documentation \([https\://github\.com/ansible\-collections/community\.crypto/pull/598](https\://github\.com/ansible\-collections/community\.crypto/pull/598)\)\.
@@ -451,12 +487,12 @@ Bugfix and maintenance release\.
<a id="v2-12-0"></a>
## v2\.12\.0
-<a id="release-summary-12"></a>
+<a id="release-summary-13"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-6"></a>
+<a id="minor-changes-7"></a>
### Minor Changes
* get\_certificate \- add <code>asn1\_base64</code> option to control whether the ASN\.1 included in the <code>extensions</code> return value is binary data or Base64 encoded \([https\://github\.com/ansible\-collections/community\.crypto/pull/592](https\://github\.com/ansible\-collections/community\.crypto/pull/592)\)\.
@@ -464,7 +500,7 @@ Feature release\.
<a id="v2-11-1"></a>
## v2\.11\.1
-<a id="release-summary-13"></a>
+<a id="release-summary-14"></a>
### Release Summary
Maintenance release with improved documentation\.
@@ -472,17 +508,17 @@ Maintenance release with improved documentation\.
<a id="v2-11-0"></a>
## v2\.11\.0
-<a id="release-summary-14"></a>
+<a id="release-summary-15"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-7"></a>
+<a id="minor-changes-8"></a>
### Minor Changes
* get\_certificate \- adds <code>ciphers</code> option for custom cipher selection \([https\://github\.com/ansible\-collections/community\.crypto/pull/571](https\://github\.com/ansible\-collections/community\.crypto/pull/571)\)\.
-<a id="bugfixes-10"></a>
+<a id="bugfixes-11"></a>
### Bugfixes
* action plugin helper \- fix handling of deprecations for ansible\-core 2\.14\.2 \([https\://github\.com/ansible\-collections/community\.crypto/pull/572](https\://github\.com/ansible\-collections/community\.crypto/pull/572)\)\.
@@ -492,12 +528,12 @@ Feature and bugfix release\.
<a id="v2-10-0"></a>
## v2\.10\.0
-<a id="release-summary-15"></a>
+<a id="release-summary-16"></a>
### Release Summary
Bugfix and feature release\.
-<a id="bugfixes-11"></a>
+<a id="bugfixes-12"></a>
### Bugfixes
* openssl\_csr\, openssl\_csr\_pipe \- prevent invalid values for <code>crl\_distribution\_points</code> that do not have one of <code>full\_name</code>\, <code>relative\_name</code>\, and <code>crl\_issuer</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/560](https\://github\.com/ansible\-collections/community\.crypto/pull/560)\)\.
@@ -519,12 +555,12 @@ Bugfix and feature release\.
<a id="v2-9-0"></a>
## v2\.9\.0
-<a id="release-summary-16"></a>
+<a id="release-summary-17"></a>
### Release Summary
Regular feature release\.
-<a id="minor-changes-8"></a>
+<a id="minor-changes-9"></a>
### Minor Changes
* x509\_certificate\_info \- adds <code>issuer\_uri</code> field in return value based on Authority Information Access data \([https\://github\.com/ansible\-collections/community\.crypto/pull/530](https\://github\.com/ansible\-collections/community\.crypto/pull/530)\)\.
@@ -532,7 +568,7 @@ Regular feature release\.
<a id="v2-8-1"></a>
## v2\.8\.1
-<a id="release-summary-17"></a>
+<a id="release-summary-18"></a>
### Release Summary
Maintenance release with improved documentation\.
@@ -540,12 +576,12 @@ Maintenance release with improved documentation\.
<a id="v2-8-0"></a>
## v2\.8\.0
-<a id="release-summary-18"></a>
+<a id="release-summary-19"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-9"></a>
+<a id="minor-changes-10"></a>
### Minor Changes
* acme\_\* modules \- handle more gracefully if CA\'s new nonce call does not return a nonce \([https\://github\.com/ansible\-collections/community\.crypto/pull/525](https\://github\.com/ansible\-collections/community\.crypto/pull/525)\)\.
@@ -555,12 +591,12 @@ Feature release\.
<a id="v2-7-1"></a>
## v2\.7\.1
-<a id="release-summary-19"></a>
+<a id="release-summary-20"></a>
### Release Summary
Maintenance release\.
-<a id="bugfixes-12"></a>
+<a id="bugfixes-13"></a>
### Bugfixes
* acme\_\* modules \- improve feedback when importing <code>cryptography</code> does not work \([https\://github\.com/ansible\-collections/community\.crypto/issues/518](https\://github\.com/ansible\-collections/community\.crypto/issues/518)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/519](https\://github\.com/ansible\-collections/community\.crypto/pull/519)\)\.
@@ -568,17 +604,17 @@ Maintenance release\.
<a id="v2-7-0"></a>
## v2\.7\.0
-<a id="release-summary-20"></a>
+<a id="release-summary-21"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-10"></a>
+<a id="minor-changes-11"></a>
### Minor Changes
* acme\* modules \- also support the HTTP 503 Service Unavailable and 408 Request Timeout response status for automatic retries \([https\://github\.com/ansible\-collections/community\.crypto/pull/513](https\://github\.com/ansible\-collections/community\.crypto/pull/513)\)\.
-<a id="bugfixes-13"></a>
+<a id="bugfixes-14"></a>
### Bugfixes
* openssl\_privatekey\_pipe \- ensure compatibility with newer versions of ansible\-core \([https\://github\.com/ansible\-collections/community\.crypto/pull/515](https\://github\.com/ansible\-collections/community\.crypto/pull/515)\)\.
@@ -586,12 +622,12 @@ Feature release\.
<a id="v2-6-0"></a>
## v2\.6\.0
-<a id="release-summary-21"></a>
+<a id="release-summary-22"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-11"></a>
+<a id="minor-changes-12"></a>
### Minor Changes
* acme\* modules \- support the HTTP 429 Too Many Requests response status \([https\://github\.com/ansible\-collections/community\.crypto/pull/508](https\://github\.com/ansible\-collections/community\.crypto/pull/508)\)\.
@@ -600,12 +636,12 @@ Feature release\.
<a id="v2-5-0"></a>
## v2\.5\.0
-<a id="release-summary-22"></a>
+<a id="release-summary-23"></a>
### Release Summary
Maintenance release with improved licensing declaration and documentation fixes\.
-<a id="minor-changes-12"></a>
+<a id="minor-changes-13"></a>
### Minor Changes
* All software licenses are now in the <code>LICENSES/</code> directory of the collection root\. Moreover\, <code>SPDX\-License\-Identifier\:</code> is used to declare the applicable license for every file that is not automatically generated \([https\://github\.com/ansible\-collections/community\.crypto/pull/491](https\://github\.com/ansible\-collections/community\.crypto/pull/491)\)\.
@@ -613,17 +649,17 @@ Maintenance release with improved licensing declaration and documentation fixes\
<a id="v2-4-0"></a>
## v2\.4\.0
-<a id="release-summary-23"></a>
+<a id="release-summary-24"></a>
### Release Summary
Deprecation and bugfix release\. No new features this time\.
-<a id="deprecated-features-3"></a>
+<a id="deprecated-features-4"></a>
### Deprecated Features
* Support for Ansible 2\.9 and ansible\-base 2\.10 is deprecated\, and will be removed in the next major release \(community\.crypto 3\.0\.0\)\. Some modules might still work with these versions afterwards\, but we will no longer keep compatibility code that was needed to support them \([https\://github\.com/ansible\-collections/community\.crypto/pull/460](https\://github\.com/ansible\-collections/community\.crypto/pull/460)\)\.
-<a id="bugfixes-14"></a>
+<a id="bugfixes-15"></a>
### Bugfixes
* openssl\_pkcs12 \- when using the pyOpenSSL backend\, do not crash when trying to read non\-existing other certificates \([https\://github\.com/ansible\-collections/community\.crypto/issues/486](https\://github\.com/ansible\-collections/community\.crypto/issues/486)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/487](https\://github\.com/ansible\-collections/community\.crypto/pull/487)\)\.
@@ -631,7 +667,7 @@ Deprecation and bugfix release\. No new features this time\.
<a id="v2-3-4"></a>
## v2\.3\.4
-<a id="release-summary-24"></a>
+<a id="release-summary-25"></a>
### Release Summary
Re\-release of what was intended to be 2\.3\.3\.
@@ -647,12 +683,12 @@ has been added\.
<a id="v2-3-3"></a>
## v2\.3\.3
-<a id="release-summary-25"></a>
+<a id="release-summary-26"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-15"></a>
+<a id="bugfixes-16"></a>
### Bugfixes
* Include <code>Apache\-2\.0\.txt</code> file for <code>plugins/module\_utils/crypto/\_obj2txt\.py</code> and <code>plugins/module\_utils/crypto/\_objects\_data\.py</code>\.
@@ -662,12 +698,12 @@ Bugfix release\.
<a id="v2-3-2"></a>
## v2\.3\.2
-<a id="release-summary-26"></a>
+<a id="release-summary-27"></a>
### Release Summary
Maintenance and bugfix release\.
-<a id="bugfixes-16"></a>
+<a id="bugfixes-17"></a>
### Bugfixes
* Include <code>simplified\_bsd\.txt</code> license file for the ECS module utils\.
@@ -676,12 +712,12 @@ Maintenance and bugfix release\.
<a id="v2-3-1"></a>
## v2\.3\.1
-<a id="release-summary-27"></a>
+<a id="release-summary-28"></a>
### Release Summary
Maintenance release\.
-<a id="bugfixes-17"></a>
+<a id="bugfixes-18"></a>
### Bugfixes
* Include <code>PSF\-license\.txt</code> file for <code>plugins/module\_utils/\_version\.py</code>\.
@@ -689,12 +725,12 @@ Maintenance release\.
<a id="v2-3-0"></a>
## v2\.3\.0
-<a id="release-summary-28"></a>
+<a id="release-summary-29"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-13"></a>
+<a id="minor-changes-14"></a>
### Minor Changes
* Prepare collection for inclusion in an Execution Environment by declaring its dependencies\. Please note that system packages are used for cryptography and PyOpenSSL\, which can be rather limited\. If you need features from newer cryptography versions\, you will have to manually force a newer version to be installed by pip by specifying something like <code>cryptography \>\= 37\.0\.0</code> in your Execution Environment\'s Python dependencies file \([https\://github\.com/ansible\-collections/community\.crypto/pull/440](https\://github\.com/ansible\-collections/community\.crypto/pull/440)\)\.
@@ -708,7 +744,7 @@ Feature and bugfix release\.
* x509\_crl \- add <code>name\_encoding</code> option to control the encoding \(IDNA\, Unicode\) used to return domain names in general names \([https\://github\.com/ansible\-collections/community\.crypto/pull/436](https\://github\.com/ansible\-collections/community\.crypto/pull/436)\)\.
* x509\_crl\_info \- add <code>name\_encoding</code> option to control the encoding \(IDNA\, Unicode\) used to return domain names in general names \([https\://github\.com/ansible\-collections/community\.crypto/pull/436](https\://github\.com/ansible\-collections/community\.crypto/pull/436)\)\.
-<a id="bugfixes-18"></a>
+<a id="bugfixes-19"></a>
### Bugfixes
* Make collection more robust when PyOpenSSL is used with an incompatible cryptography version \([https\://github\.com/ansible\-collections/community\.crypto/pull/445](https\://github\.com/ansible\-collections/community\.crypto/pull/445)\)\.
@@ -717,12 +753,12 @@ Feature and bugfix release\.
<a id="v2-2-4"></a>
## v2\.2\.4
-<a id="release-summary-29"></a>
+<a id="release-summary-30"></a>
### Release Summary
Regular maintenance release\.
-<a id="bugfixes-19"></a>
+<a id="bugfixes-20"></a>
### Bugfixes
* openssh\_\* modules \- fix exception handling to report traceback to users for enhanced traceability \([https\://github\.com/ansible\-collections/community\.crypto/pull/417](https\://github\.com/ansible\-collections/community\.crypto/pull/417)\)\.
@@ -730,12 +766,12 @@ Regular maintenance release\.
<a id="v2-2-3"></a>
## v2\.2\.3
-<a id="release-summary-30"></a>
+<a id="release-summary-31"></a>
### Release Summary
Regular bugfix release\.
-<a id="bugfixes-20"></a>
+<a id="bugfixes-21"></a>
### Bugfixes
* luks\_device \- fix parsing of <code>lsblk</code> output when device name ends with <code>crypt</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/409](https\://github\.com/ansible\-collections/community\.crypto/issues/409)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/410](https\://github\.com/ansible\-collections/community\.crypto/pull/410)\)\.
@@ -743,14 +779,14 @@ Regular bugfix release\.
<a id="v2-2-2"></a>
## v2\.2\.2
-<a id="release-summary-31"></a>
+<a id="release-summary-32"></a>
### Release Summary
Regular bugfix release\.
In this release\, we extended the test matrix to include Alpine 3\, ArchLinux\, Debian Bullseye\, and CentOS Stream 8\. CentOS 8 was removed from the test matrix\.
-<a id="bugfixes-21"></a>
+<a id="bugfixes-22"></a>
### Bugfixes
* certificate\_complete\_chain \- allow multiple potential intermediate certificates to have the same subject \([https\://github\.com/ansible\-collections/community\.crypto/issues/399](https\://github\.com/ansible\-collections/community\.crypto/issues/399)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/403](https\://github\.com/ansible\-collections/community\.crypto/pull/403)\)\.
@@ -762,12 +798,12 @@ In this release\, we extended the test matrix to include Alpine 3\, ArchLinux\,
<a id="v2-2-1"></a>
## v2\.2\.1
-<a id="release-summary-32"></a>
+<a id="release-summary-33"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-22"></a>
+<a id="bugfixes-23"></a>
### Bugfixes
* openssh\_cert \- fixed false <code>changed</code> status for <code>host</code> certificates when using <code>full\_idempotence</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/395](https\://github\.com/ansible\-collections/community\.crypto/issues/395)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/396](https\://github\.com/ansible\-collections/community\.crypto/pull/396)\)\.
@@ -775,17 +811,17 @@ Bugfix release\.
<a id="v2-2-0"></a>
## v2\.2\.0
-<a id="release-summary-33"></a>
+<a id="release-summary-34"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-14"></a>
+<a id="minor-changes-15"></a>
### Minor Changes
* openssh\_cert \- added <code>ignore\_timestamps</code> parameter so it can be used semi\-idempotent with relative timestamps in <code>valid\_to</code>/<code>valid\_from</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/379](https\://github\.com/ansible\-collections/community\.crypto/issues/379)\)\.
-<a id="bugfixes-23"></a>
+<a id="bugfixes-24"></a>
### Bugfixes
* luks\_devices \- set <code>LANG</code> and similar environment variables to avoid translated output\, which can break some of the module\'s functionality like key management \([https\://github\.com/ansible\-collections/community\.crypto/pull/388](https\://github\.com/ansible\-collections/community\.crypto/pull/388)\, [https\://github\.com/ansible\-collections/community\.crypto/issues/385](https\://github\.com/ansible\-collections/community\.crypto/issues/385)\)\.
@@ -793,24 +829,24 @@ Regular bugfix and feature release\.
<a id="v2-1-0"></a>
## v2\.1\.0
-<a id="release-summary-34"></a>
+<a id="release-summary-35"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-15"></a>
+<a id="minor-changes-16"></a>
### Minor Changes
* Adjust error messages that indicate <code>cryptography</code> is not installed from <code>Can\'t</code> to <code>Cannot</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/374](https\://github\.com/ansible\-collections/community\.crypto/pull/374)\)\.
-<a id="bugfixes-24"></a>
+<a id="bugfixes-25"></a>
### Bugfixes
* Various modules and plugins \- use vendored version of <code>distutils\.version</code> instead of the deprecated Python standard library <code>distutils</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/353](https\://github\.com/ansible\-collections/community\.crypto/pull/353)\)\.
* certificate\_complete\_chain \- do not append root twice if the chain already ends with a root certificate \([https\://github\.com/ansible\-collections/community\.crypto/pull/360](https\://github\.com/ansible\-collections/community\.crypto/pull/360)\)\.
* certificate\_complete\_chain \- do not hang when infinite loop is found \([https\://github\.com/ansible\-collections/community\.crypto/issues/355](https\://github\.com/ansible\-collections/community\.crypto/issues/355)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/360](https\://github\.com/ansible\-collections/community\.crypto/pull/360)\)\.
-<a id="new-modules"></a>
+<a id="new-modules-1"></a>
### New Modules
* crypto\_info \- Retrieve cryptographic capabilities
@@ -819,7 +855,7 @@ Feature and bugfix release\.
<a id="v2-0-2"></a>
## v2\.0\.2
-<a id="release-summary-35"></a>
+<a id="release-summary-36"></a>
### Release Summary
Documentation fix release\. No actual code changes\.
@@ -827,17 +863,17 @@ Documentation fix release\. No actual code changes\.
<a id="v2-0-1"></a>
## v2\.0\.1
-<a id="release-summary-36"></a>
+<a id="release-summary-37"></a>
### Release Summary
Bugfix release with extra forward compatibility for newer versions of cryptography\.
-<a id="minor-changes-16"></a>
+<a id="minor-changes-17"></a>
### Minor Changes
* acme\_\* modules \- fix usage of <code>fetch\_url</code> with changes in latest ansible\-core <code>devel</code> branch \([https\://github\.com/ansible\-collections/community\.crypto/pull/339](https\://github\.com/ansible\-collections/community\.crypto/pull/339)\)\.
-<a id="bugfixes-25"></a>
+<a id="bugfixes-26"></a>
### Bugfixes
* acme\_certificate \- avoid passing multiple certificates to <code>cryptography</code>\'s X\.509 certificate loader when <code>fullchain\_dest</code> is used \([https\://github\.com/ansible\-collections/community\.crypto/pull/324](https\://github\.com/ansible\-collections/community\.crypto/pull/324)\)\.
@@ -848,12 +884,12 @@ Bugfix release with extra forward compatibility for newer versions of cryptograp
<a id="v2-0-0"></a>
## v2\.0\.0
-<a id="release-summary-37"></a>
+<a id="release-summary-38"></a>
### Release Summary
A new major release of the <code>community\.crypto</code> collection\. The main changes are removal of the PyOpenSSL backends for almost all modules \(<code>openssl\_pkcs12</code> being the only exception\)\, and removal of the <code>assertonly</code> provider in the <code>x509\_certificate</code> provider\. There are also some other breaking changes which should improve the user interface/experience of this collection long\-term\.
-<a id="minor-changes-17"></a>
+<a id="minor-changes-18"></a>
### Minor Changes
* acme\_certificate \- the <code>subject</code> and <code>issuer</code> fields in in the <code>select\_chain</code> entries are now more strictly validated \([https\://github\.com/ansible\-collections/community\.crypto/pull/316](https\://github\.com/ansible\-collections/community\.crypto/pull/316)\)\.
@@ -878,7 +914,7 @@ A new major release of the <code>community\.crypto</code> collection\. The main
* openssl\_privatekey\_info \- by default consistency checks are not run\; they need to be explicitly requested by passing <code>check\_consistency\=true</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/309](https\://github\.com/ansible\-collections/community\.crypto/pull/309)\)\.
* x509\_crl \- for idempotency checks\, the <code>issuer</code> order is ignored\. If order is important\, use the new <code>issuer\_ordered</code> option \([https\://github\.com/ansible\-collections/community\.crypto/pull/316](https\://github\.com/ansible\-collections/community\.crypto/pull/316)\)\.
-<a id="deprecated-features-4"></a>
+<a id="deprecated-features-5"></a>
### Deprecated Features
* acme\_\* modules \- ACME version 1 is now deprecated and support for it will be removed in community\.crypto 2\.0\.0 \([https\://github\.com/ansible\-collections/community\.crypto/pull/288](https\://github\.com/ansible\-collections/community\.crypto/pull/288)\)\.
@@ -910,7 +946,7 @@ A new major release of the <code>community\.crypto</code> collection\. The main
* x509\_certificate\_info \- removed the <code>pyopenssl</code> backend \([https\://github\.com/ansible\-collections/community\.crypto/pull/273](https\://github\.com/ansible\-collections/community\.crypto/pull/273)\)\.
* x509\_certificate\_pipe \- removed the <code>pyopenssl</code> backend \([https\://github\.com/ansible\-collections/community\.crypto/pull/273](https\://github\.com/ansible\-collections/community\.crypto/pull/273)\)\.
-<a id="bugfixes-26"></a>
+<a id="bugfixes-27"></a>
### Bugfixes
* cryptography backend \- improve Unicode handling for Python 2 \([https\://github\.com/ansible\-collections/community\.crypto/pull/313](https\://github\.com/ansible\-collections/community\.crypto/pull/313)\)\.
@@ -922,12 +958,12 @@ A new major release of the <code>community\.crypto</code> collection\. The main
<a id="v1-9-4"></a>
## v1\.9\.4
-<a id="release-summary-38"></a>
+<a id="release-summary-39"></a>
### Release Summary
Regular bugfix release\.
-<a id="bugfixes-27"></a>
+<a id="bugfixes-28"></a>
### Bugfixes
* acme\_\* modules \- fix commands composed for OpenSSL backend to retrieve information on CSRs and certificates from stdin to use <code>/dev/stdin</code> instead of <code>\-</code>\. This is needed for OpenSSL 1\.0\.1 and 1\.0\.2\, apparently \([https\://github\.com/ansible\-collections/community\.crypto/pull/279](https\://github\.com/ansible\-collections/community\.crypto/pull/279)\)\.
@@ -936,12 +972,12 @@ Regular bugfix release\.
<a id="v1-9-3"></a>
## v1\.9\.3
-<a id="release-summary-39"></a>
+<a id="release-summary-40"></a>
### Release Summary
Regular bugfix release\.
-<a id="bugfixes-28"></a>
+<a id="bugfixes-29"></a>
### Bugfixes
* openssl\_csr and openssl\_csr\_pipe \- make sure that Unicode strings are used to compare strings with the cryptography backend\. This fixes idempotency problems with non\-ASCII letters on Python 2 \([https\://github\.com/ansible\-collections/community\.crypto/issues/270](https\://github\.com/ansible\-collections/community\.crypto/issues/270)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/271](https\://github\.com/ansible\-collections/community\.crypto/pull/271)\)\.
@@ -949,7 +985,7 @@ Regular bugfix release\.
<a id="v1-9-2"></a>
## v1\.9\.2
-<a id="release-summary-40"></a>
+<a id="release-summary-41"></a>
### Release Summary
Bugfix release to fix the changelog\. No other change compared to 1\.9\.0\.
@@ -957,7 +993,7 @@ Bugfix release to fix the changelog\. No other change compared to 1\.9\.0\.
<a id="v1-9-1"></a>
## v1\.9\.1
-<a id="release-summary-41"></a>
+<a id="release-summary-42"></a>
### Release Summary
Accidental 1\.9\.1 release\. Identical to 1\.9\.0\.
@@ -965,18 +1001,18 @@ Accidental 1\.9\.1 release\. Identical to 1\.9\.0\.
<a id="v1-9-0"></a>
## v1\.9\.0
-<a id="release-summary-42"></a>
+<a id="release-summary-43"></a>
### Release Summary
Regular feature release\.
-<a id="minor-changes-18"></a>
+<a id="minor-changes-19"></a>
### Minor Changes
* get\_certificate \- added <code>starttls</code> option to retrieve certificates from servers which require clients to request an encrypted connection \([https\://github\.com/ansible\-collections/community\.crypto/pull/264](https\://github\.com/ansible\-collections/community\.crypto/pull/264)\)\.
* openssh\_keypair \- added <code>diff</code> support \([https\://github\.com/ansible\-collections/community\.crypto/pull/260](https\://github\.com/ansible\-collections/community\.crypto/pull/260)\)\.
-<a id="bugfixes-29"></a>
+<a id="bugfixes-30"></a>
### Bugfixes
* keypair\_backend module utils \- simplify code to pass sanity tests \([https\://github\.com/ansible\-collections/community\.crypto/pull/263](https\://github\.com/ansible\-collections/community\.crypto/pull/263)\)\.
@@ -987,12 +1023,12 @@ Regular feature release\.
<a id="v1-8-0"></a>
## v1\.8\.0
-<a id="release-summary-43"></a>
+<a id="release-summary-44"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-19"></a>
+<a id="minor-changes-20"></a>
### Minor Changes
* Avoid internal ansible\-core module\_utils in favor of equivalent public API available since at least Ansible 2\.9 \([https\://github\.com/ansible\-collections/community\.crypto/pull/253](https\://github\.com/ansible\-collections/community\.crypto/pull/253)\)\.
@@ -1000,7 +1036,7 @@ Regular bugfix and feature release\.
* openssh\_cert \- added <code>regenerate</code> option to validate additional certificate parameters which trigger regeneration of an existing certificate \([https\://github\.com/ansible\-collections/community\.crypto/pull/256](https\://github\.com/ansible\-collections/community\.crypto/pull/256)\)\.
* openssh\_cert \- adding <code>diff</code> support \([https\://github\.com/ansible\-collections/community\.crypto/pull/255](https\://github\.com/ansible\-collections/community\.crypto/pull/255)\)\.
-<a id="bugfixes-30"></a>
+<a id="bugfixes-31"></a>
### Bugfixes
* openssh\_cert \- fixed certificate generation to restore original certificate if an error is encountered \([https\://github\.com/ansible\-collections/community\.crypto/pull/255](https\://github\.com/ansible\-collections/community\.crypto/pull/255)\)\.
@@ -1009,12 +1045,12 @@ Regular bugfix and feature release\.
<a id="v1-7-1"></a>
## v1\.7\.1
-<a id="release-summary-44"></a>
+<a id="release-summary-45"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-31"></a>
+<a id="bugfixes-32"></a>
### Bugfixes
* openssl\_pkcs12 \- fix crash when loading passphrase\-protected PKCS\#12 files with <code>cryptography</code> backend \([https\://github\.com/ansible\-collections/community\.crypto/issues/247](https\://github\.com/ansible\-collections/community\.crypto/issues/247)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/248](https\://github\.com/ansible\-collections/community\.crypto/pull/248)\)\.
@@ -1022,12 +1058,12 @@ Bugfix release\.
<a id="v1-7-0"></a>
## v1\.7\.0
-<a id="release-summary-45"></a>
+<a id="release-summary-46"></a>
### Release Summary
Regular feature and bugfix release\.
-<a id="minor-changes-20"></a>
+<a id="minor-changes-21"></a>
### Minor Changes
* cryptography\_openssh module utils \- new module\_utils for managing asymmetric keypairs and OpenSSH formatted/encoded asymmetric keypairs \([https\://github\.com/ansible\-collections/community\.crypto/pull/213](https\://github\.com/ansible\-collections/community\.crypto/pull/213)\)\.
@@ -1050,14 +1086,14 @@ Regular feature and bugfix release\.
* x509\_crl\_info \- add <code>list\_revoked\_certificates</code> option to avoid enumerating all revoked certificates \([https\://github\.com/ansible\-collections/community\.crypto/pull/232](https\://github\.com/ansible\-collections/community\.crypto/pull/232)\)\.
* x509\_crl\_info \- refactor module to allow code reuse for diff mode \([https\://github\.com/ansible\-collections/community\.crypto/pull/203](https\://github\.com/ansible\-collections/community\.crypto/pull/203)\)\.
-<a id="bugfixes-32"></a>
+<a id="bugfixes-33"></a>
### Bugfixes
* openssh\_keypair \- fix <code>check\_mode</code> to populate return values for existing keypairs \([https\://github\.com/ansible\-collections/community\.crypto/issues/113](https\://github\.com/ansible\-collections/community\.crypto/issues/113)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/230](https\://github\.com/ansible\-collections/community\.crypto/pull/230)\)\.
* various modules \- prevent crashes when modules try to set attributes on not yet existing files in check mode\. This will be fixed in ansible\-core 2\.12\, but it is not backported to every Ansible version we support \([https\://github\.com/ansible\-collections/community\.crypto/issue/242](https\://github\.com/ansible\-collections/community\.crypto/issue/242)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/243](https\://github\.com/ansible\-collections/community\.crypto/pull/243)\)\.
* x509\_certificate \- fix crash when <code>assertonly</code> provider is used and some error conditions should be reported \([https\://github\.com/ansible\-collections/community\.crypto/issues/240](https\://github\.com/ansible\-collections/community\.crypto/issues/240)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/241](https\://github\.com/ansible\-collections/community\.crypto/pull/241)\)\.
-<a id="new-modules-1"></a>
+<a id="new-modules-2"></a>
### New Modules
* openssl\_publickey\_info \- Provide information for OpenSSL public keys
@@ -1065,12 +1101,12 @@ Regular feature and bugfix release\.
<a id="v1-6-2"></a>
## v1\.6\.2
-<a id="release-summary-46"></a>
+<a id="release-summary-47"></a>
### Release Summary
Bugfix release\. Fixes compatibility issue of ACME modules with step\-ca\.
-<a id="bugfixes-33"></a>
+<a id="bugfixes-34"></a>
### Bugfixes
* acme\_\* modules \- avoid crashing for ACME servers where the <code>meta</code> directory key is not present \([https\://github\.com/ansible\-collections/community\.crypto/issues/220](https\://github\.com/ansible\-collections/community\.crypto/issues/220)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/221](https\://github\.com/ansible\-collections/community\.crypto/pull/221)\)\.
@@ -1078,12 +1114,12 @@ Bugfix release\. Fixes compatibility issue of ACME modules with step\-ca\.
<a id="v1-6-1"></a>
## v1\.6\.1
-<a id="release-summary-47"></a>
+<a id="release-summary-48"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-34"></a>
+<a id="bugfixes-35"></a>
### Bugfixes
* acme\_\* modules \- fix wrong usages of <code>ACMEProtocolException</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/216](https\://github\.com/ansible\-collections/community\.crypto/pull/216)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/217](https\://github\.com/ansible\-collections/community\.crypto/pull/217)\)\.
@@ -1091,12 +1127,12 @@ Bugfix release\.
<a id="v1-6-0"></a>
## v1\.6\.0
-<a id="release-summary-48"></a>
+<a id="release-summary-49"></a>
### Release Summary
Fixes compatibility issues with the latest ansible\-core 2\.11 beta\, and contains a lot of internal refactoring for the ACME modules and support for private key passphrases for them\.
-<a id="minor-changes-21"></a>
+<a id="minor-changes-22"></a>
### Minor Changes
* acme module\_utils \- the <code>acme</code> module\_utils has been split up into several Python modules \([https\://github\.com/ansible\-collections/community\.crypto/pull/184](https\://github\.com/ansible\-collections/community\.crypto/pull/184)\)\.
@@ -1105,12 +1141,12 @@ Fixes compatibility issues with the latest ansible\-core 2\.11 beta\, and contai
* acme\_certificate\_revoke \- support revoking by private keys that are passphrase protected for <code>cryptography</code> backend \([https\://github\.com/ansible\-collections/community\.crypto/pull/207](https\://github\.com/ansible\-collections/community\.crypto/pull/207)\)\.
* acme\_challenge\_cert\_helper \- add <code>private\_key\_passphrase</code> parameter \([https\://github\.com/ansible\-collections/community\.crypto/pull/207](https\://github\.com/ansible\-collections/community\.crypto/pull/207)\)\.
-<a id="deprecated-features-5"></a>
+<a id="deprecated-features-6"></a>
### Deprecated Features
* acme module\_utils \- the <code>acme</code> module\_utils \(<code>ansible\_collections\.community\.crypto\.plugins\.module\_utils\.acme</code>\) is deprecated and will be removed in community\.crypto 2\.0\.0\. Use the new Python modules in the <code>acme</code> package instead \(<code>ansible\_collections\.community\.crypto\.plugins\.module\_utils\.acme\.xxx</code>\) \([https\://github\.com/ansible\-collections/community\.crypto/pull/184](https\://github\.com/ansible\-collections/community\.crypto/pull/184)\)\.
-<a id="bugfixes-35"></a>
+<a id="bugfixes-36"></a>
### Bugfixes
* action\_module plugin helper \- make compatible with latest changes in ansible\-core 2\.11\.0b3 \([https\://github\.com/ansible\-collections/community\.crypto/pull/202](https\://github\.com/ansible\-collections/community\.crypto/pull/202)\)\.
@@ -1119,23 +1155,23 @@ Fixes compatibility issues with the latest ansible\-core 2\.11 beta\, and contai
<a id="v1-5-0"></a>
## v1\.5\.0
-<a id="release-summary-49"></a>
+<a id="release-summary-50"></a>
### Release Summary
Regular feature and bugfix release\. Deprecates a return value\.
-<a id="minor-changes-22"></a>
+<a id="minor-changes-23"></a>
### Minor Changes
* acme\_account\_info \- when <code>retrieve\_orders</code> is not <code>ignore</code> and the ACME server allows to query orders\, the new return value <code>order\_uris</code> is always populated with a list of URIs \([https\://github\.com/ansible\-collections/community\.crypto/pull/178](https\://github\.com/ansible\-collections/community\.crypto/pull/178)\)\.
* luks\_device \- allow to specify sector size for LUKS2 containers with new <code>sector\_size</code> parameter \([https\://github\.com/ansible\-collections/community\.crypto/pull/193](https\://github\.com/ansible\-collections/community\.crypto/pull/193)\)\.
-<a id="deprecated-features-6"></a>
+<a id="deprecated-features-7"></a>
### Deprecated Features
* acme\_account\_info \- when <code>retrieve\_orders\=url\_list</code>\, <code>orders</code> will no longer be returned in community\.crypto 2\.0\.0\. Use <code>order\_uris</code> instead \([https\://github\.com/ansible\-collections/community\.crypto/pull/178](https\://github\.com/ansible\-collections/community\.crypto/pull/178)\)\.
-<a id="bugfixes-36"></a>
+<a id="bugfixes-37"></a>
### Bugfixes
* openssl\_csr \- no longer fails when comparing CSR without basic constraint when <code>basic\_constraints</code> is specified \([https\://github\.com/ansible\-collections/community\.crypto/issues/179](https\://github\.com/ansible\-collections/community\.crypto/issues/179)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/180](https\://github\.com/ansible\-collections/community\.crypto/pull/180)\)\.
@@ -1143,12 +1179,12 @@ Regular feature and bugfix release\. Deprecates a return value\.
<a id="v1-4-0"></a>
## v1\.4\.0
-<a id="release-summary-50"></a>
+<a id="release-summary-51"></a>
### Release Summary
Release with several new features and bugfixes\.
-<a id="minor-changes-23"></a>
+<a id="minor-changes-24"></a>
### Minor Changes
* The ACME module\_utils has been relicensed back from the Simplified BSD License \([https\://opensource\.org/licenses/BSD\-2\-Clause](https\://opensource\.org/licenses/BSD\-2\-Clause)\) to the GPLv3\+ \(same license used by most other code in this collection\)\. This undoes a licensing change when the original GPLv3\+ licensed code was moved to module\_utils in [https\://github\.com/ansible/ansible/pull/40697](https\://github\.com/ansible/ansible/pull/40697) \([https\://github\.com/ansible\-collections/community\.crypto/pull/165](https\://github\.com/ansible\-collections/community\.crypto/pull/165)\)\.
@@ -1158,7 +1194,7 @@ Release with several new features and bugfixes\.
* openssl\_csr\, openssl\_csr\_pipe \- allow to specify CRL distribution endpoints with <code>crl\_distribution\_points</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/147](https\://github\.com/ansible\-collections/community\.crypto/issues/147)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/167](https\://github\.com/ansible\-collections/community\.crypto/pull/167)\)\.
* openssl\_pkcs12 \- allow to specify certificate bundles in <code>other\_certificates</code> by using new option <code>other\_certificates\_parse\_all</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/149](https\://github\.com/ansible\-collections/community\.crypto/issues/149)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/166](https\://github\.com/ansible\-collections/community\.crypto/pull/166)\)\.
-<a id="bugfixes-37"></a>
+<a id="bugfixes-38"></a>
### Bugfixes
* acme\_certificate \- error when requested challenge type is not found for non\-valid challenges\, instead of hanging on step 2 \([https\://github\.com/ansible\-collections/community\.crypto/issues/171](https\://github\.com/ansible\-collections/community\.crypto/issues/171)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/173](https\://github\.com/ansible\-collections/community\.crypto/pull/173)\)\.
@@ -1166,12 +1202,12 @@ Release with several new features and bugfixes\.
<a id="v1-3-0"></a>
## v1\.3\.0
-<a id="release-summary-51"></a>
+<a id="release-summary-52"></a>
### Release Summary
Contains new modules <code>openssl\_privatekey\_pipe</code>\, <code>openssl\_csr\_pipe</code> and <code>x509\_certificate\_pipe</code> which allow to create or update private keys\, CSRs and X\.509 certificates without having to write them to disk\.
-<a id="minor-changes-24"></a>
+<a id="minor-changes-25"></a>
### Minor Changes
* openssh\_cert \- add module parameter <code>use\_agent</code> to enable using signing keys stored in ssh\-agent \([https\://github\.com/ansible\-collections/community\.crypto/issues/116](https\://github\.com/ansible\-collections/community\.crypto/issues/116)\)\.
@@ -1181,14 +1217,14 @@ Contains new modules <code>openssl\_privatekey\_pipe</code>\, <code>openssl\_csr
* x509\_certificate \- for the <code>selfsigned</code> provider\, a CSR is not required anymore\. If no CSR is provided\, the module behaves as if a minimal CSR which only contains the public key has been provided \([https\://github\.com/ansible\-collections/community\.crypto/issues/32](https\://github\.com/ansible\-collections/community\.crypto/issues/32)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/129](https\://github\.com/ansible\-collections/community\.crypto/pull/129)\)\.
* x509\_certificate \- refactor module to allow code reuse by x509\_certificate\_pipe \([https\://github\.com/ansible\-collections/community\.crypto/pull/135](https\://github\.com/ansible\-collections/community\.crypto/pull/135)\)\.
-<a id="bugfixes-38"></a>
+<a id="bugfixes-39"></a>
### Bugfixes
* openssl\_pkcs12 \- report the correct state when <code>action</code> is <code>parse</code> \([https\://github\.com/ansible\-collections/community\.crypto/issues/143](https\://github\.com/ansible\-collections/community\.crypto/issues/143)\)\.
* support code \- improve handling of certificate and certificate signing request \(CSR\) loading with the <code>cryptography</code> backend when errors occur \([https\://github\.com/ansible\-collections/community\.crypto/issues/138](https\://github\.com/ansible\-collections/community\.crypto/issues/138)\, [https\://github\.com/ansible\-collections/community\.crypto/pull/139](https\://github\.com/ansible\-collections/community\.crypto/pull/139)\)\.
* x509\_certificate \- fix <code>entrust</code> provider\, which was broken since community\.crypto 0\.1\.0 due to a feature added before the collection move \([https\://github\.com/ansible\-collections/community\.crypto/pull/135](https\://github\.com/ansible\-collections/community\.crypto/pull/135)\)\.
-<a id="new-modules-2"></a>
+<a id="new-modules-3"></a>
### New Modules
* openssl\_csr\_pipe \- Generate OpenSSL Certificate Signing Request \(CSR\)
@@ -1198,12 +1234,12 @@ Contains new modules <code>openssl\_privatekey\_pipe</code>\, <code>openssl\_csr
<a id="v1-2-0"></a>
## v1\.2\.0
-<a id="release-summary-52"></a>
+<a id="release-summary-53"></a>
### Release Summary
Please note that this release fixes a security issue \(CVE\-2020\-25646\)\.
-<a id="minor-changes-25"></a>
+<a id="minor-changes-26"></a>
### Minor Changes
* acme\_certificate \- allow to pass CSR file as content with new option <code>csr\_content</code> \([https\://github\.com/ansible\-collections/community\.crypto/pull/115](https\://github\.com/ansible\-collections/community\.crypto/pull/115)\)\.
@@ -1219,7 +1255,7 @@ Please note that this release fixes a security issue \(CVE\-2020\-25646\)\.
* x509\_certificate \- the options <code>privatekey\_content</code> and <code>ownca\_privatekey\_content</code> were not marked as <code>no\_log</code>\, resulting in it being dumped into the system log by default\, and returned in the registered results in the <code>invocation</code> field \(CVE\-2020\-25646\, [https\://github\.com/ansible\-collections/community\.crypto/pull/125](https\://github\.com/ansible\-collections/community\.crypto/pull/125)\)\.
* x509\_crl \- the option <code>privatekey\_content</code> was not marked as <code>no\_log</code>\, resulting in it being dumped into the system log by default\, and returned in the registered results in the <code>invocation</code> field \(CVE\-2020\-25646\, [https\://github\.com/ansible\-collections/community\.crypto/pull/125](https\://github\.com/ansible\-collections/community\.crypto/pull/125)\)\.
-<a id="bugfixes-39"></a>
+<a id="bugfixes-40"></a>
### Bugfixes
* openssl\_pkcs12 \- do not crash when reading PKCS\#12 file which has no private key and/or no main certificate \([https\://github\.com/ansible\-collections/community\.crypto/issues/103](https\://github\.com/ansible\-collections/community\.crypto/issues/103)\)\.
@@ -1227,12 +1263,12 @@ Please note that this release fixes a security issue \(CVE\-2020\-25646\)\.
<a id="v1-1-1"></a>
## v1\.1\.1
-<a id="release-summary-53"></a>
+<a id="release-summary-54"></a>
### Release Summary
Bugfixes for Ansible 2\.10\.0\.
-<a id="bugfixes-40"></a>
+<a id="bugfixes-41"></a>
### Bugfixes
* meta/runtime\.yml \- convert Ansible version numbers for old names of modules to collection version numbers \([https\://github\.com/ansible\-collections/community\.crypto/pull/108](https\://github\.com/ansible\-collections/community\.crypto/pull/108)\)\.
@@ -1241,12 +1277,12 @@ Bugfixes for Ansible 2\.10\.0\.
<a id="v1-1-0"></a>
## v1\.1\.0
-<a id="release-summary-54"></a>
+<a id="release-summary-55"></a>
### Release Summary
Release for Ansible 2\.10\.0\.
-<a id="minor-changes-26"></a>
+<a id="minor-changes-27"></a>
### Minor Changes
* acme\_account \- add <code>external\_account\_binding</code> option to allow creation of ACME accounts with External Account Binding \([https\://github\.com/ansible\-collections/community\.crypto/issues/89](https\://github\.com/ansible\-collections/community\.crypto/issues/89)\)\.
@@ -1259,14 +1295,14 @@ Release for Ansible 2\.10\.0\.
* openssl\_csr \- add support for name constraints extension \([https\://github\.com/ansible\-collections/community\.crypto/issues/46](https\://github\.com/ansible\-collections/community\.crypto/issues/46)\)\.
* openssl\_csr\_info \- add support for name constraints extension \([https\://github\.com/ansible\-collections/community\.crypto/issues/46](https\://github\.com/ansible\-collections/community\.crypto/issues/46)\)\.
-<a id="bugfixes-41"></a>
+<a id="bugfixes-42"></a>
### Bugfixes
* acme\_inspect \- fix problem with Python 3\.5 that JSON was not decoded \([https\://github\.com/ansible\-collections/community\.crypto/issues/86](https\://github\.com/ansible\-collections/community\.crypto/issues/86)\)\.
* get\_certificate \- fix <code>ca\_cert</code> option handling when <code>proxy\_host</code> is used \([https\://github\.com/ansible\-collections/community\.crypto/pull/84](https\://github\.com/ansible\-collections/community\.crypto/pull/84)\)\.
* openssl\_\*\, x509\_\* modules \- fix handling of general names which refer to IP networks and not IP addresses \([https\://github\.com/ansible\-collections/community\.crypto/pull/92](https\://github\.com/ansible\-collections/community\.crypto/pull/92)\)\.
-<a id="new-modules-3"></a>
+<a id="new-modules-4"></a>
### New Modules
* openssl\_signature \- Sign data with openssl
@@ -1275,12 +1311,12 @@ Release for Ansible 2\.10\.0\.
<a id="v1-0-0"></a>
## v1\.0\.0
-<a id="release-summary-55"></a>
+<a id="release-summary-56"></a>
### Release Summary
This is the first proper release of the <code>community\.crypto</code> collection\. This changelog contains all changes to the modules in this collection that were added after the release of Ansible 2\.9\.0\.
-<a id="minor-changes-27"></a>
+<a id="minor-changes-28"></a>
### Minor Changes
* luks\_device \- accept <code>passphrase</code>\, <code>new\_passphrase</code> and <code>remove\_passphrase</code>\.
@@ -1309,7 +1345,7 @@ This is the first proper release of the <code>community\.crypto</code> collectio
* openssl\_publickey \- allow to provide private key content via <code>private\_key\_content</code> option\.
* openssl\_publickey \- allow to return the existing/generated public key directly as <code>publickey</code> by setting <code>return\_content</code> to <code>yes</code>\.
-<a id="deprecated-features-7"></a>
+<a id="deprecated-features-8"></a>
### Deprecated Features
* openssl\_csr \- all values for the <code>version</code> option except <code>1</code> are deprecated\. The value 1 denotes the current only standardized CSR version\.
@@ -1319,7 +1355,7 @@ This is the first proper release of the <code>community\.crypto</code> collectio
* The <code>letsencrypt</code> module has been removed\. Use <code>acme\_certificate</code> instead\.
-<a id="bugfixes-42"></a>
+<a id="bugfixes-43"></a>
### Bugfixes
* ACME modules\: fix bug in ACME v1 account update code
@@ -1342,7 +1378,7 @@ This is the first proper release of the <code>community\.crypto</code> collectio
* openssl\_csr \- the module will now enforce that <code>privatekey\_path</code> is specified when <code>state\=present</code>\.
* openssl\_publickey \- fix a module crash caused when pyOpenSSL is not installed \([https\://github\.com/ansible/ansible/issues/67035](https\://github\.com/ansible/ansible/issues/67035)\)\.
-<a id="new-modules-4"></a>
+<a id="new-modules-5"></a>
### New Modules
* ecs\_domain \- Request validation of a domain with the Entrust Certificate Services \(ECS\) API
diff --git a/ansible_collections/community/crypto/CHANGELOG.rst b/ansible_collections/community/crypto/CHANGELOG.rst
index 320169717..b2dca8e3f 100644
--- a/ansible_collections/community/crypto/CHANGELOG.rst
+++ b/ansible_collections/community/crypto/CHANGELOG.rst
@@ -4,6 +4,35 @@ Community Crypto Release Notes
.. contents:: Topics
+v2.19.0
+=======
+
+Release Summary
+---------------
+
+Bugfix and feature release.
+
+Minor Changes
+-------------
+
+- When using cryptography >= 42.0.0, use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead of offset-naive UTC timestamps (https://github.com/ansible-collections/community.crypto/issues/726, https://github.com/ansible-collections/community.crypto/pull/727).
+- openssh_cert - avoid UTC functions deprecated in Python 3.12 when using Python 3 (https://github.com/ansible-collections/community.crypto/pull/727).
+
+Deprecated Features
+-------------------
+
+- acme.backends module utils - from community.crypto on, all implementations of ``CryptoBackend`` must override ``get_ordered_csr_identifiers()``. The current default implementation, which simply sorts the result of ``get_csr_identifiers()``, will then be removed (https://github.com/ansible-collections/community.crypto/pull/725).
+
+Bugfixes
+--------
+
+- acme_certificate - respect the order of the CNAME and SAN identifiers that are passed on when creating an ACME order (https://github.com/ansible-collections/community.crypto/issues/723, https://github.com/ansible-collections/community.crypto/pull/725).
+
+New Modules
+-----------
+
+- x509_certificate_convert - Convert X.509 certificates
+
v2.18.0
=======
diff --git a/ansible_collections/community/crypto/FILES.json b/ansible_collections/community/crypto/FILES.json
index 249caaa96..e98f9499c 100644
--- a/ansible_collections/community/crypto/FILES.json
+++ b/ansible_collections/community/crypto/FILES.json
@@ -109,7 +109,7 @@
"name": ".azure-pipelines/azure-pipelines.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82056264d02238b30cfe7740554b4dcde7ec173c7a5de5e494f2fad309462455",
+ "chksum_sha256": "6e277188c1cbc0030cb55f73f6ebde233c77c66e2aa0d19476f9b7bae729d345",
"format": 1
},
{
@@ -130,7 +130,7 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aac90c499964bd9233fc13565169248e29e9eda7cf97a2d4db56f6fdba9558ed",
+ "chksum_sha256": "4250c0cd843d1a134c3d806ef9030b55f9a1b949902d1a746ccd19edb9f51a95",
"format": 1
},
{
@@ -165,7 +165,7 @@
"name": ".github/workflows/reuse.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "907950e209820f04e0122e100c86690cf5ac0f4a15cb950cce4d2af6eaaddb37",
+ "chksum_sha256": "5d7f877d94901193f7273865244e67010c8196234debbacf6be5f27ec51f417c",
"format": 1
},
{
@@ -263,7 +263,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e03726652f634d6ff4b51599ec42f48c6ff77aaec7d59c186770af2c599b2d3f",
+ "chksum_sha256": "7dcaea3df82e79d7b11bb628e95889ccfb31077902d6ddaee8655a83f577b418",
"format": 1
},
{
@@ -316,6 +316,13 @@
"format": 1
},
{
+ "name": "docs/docsite/config.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0c5ec9ff76cf4db33b5d3f771419ef50d448e5d510cb7a98fc07dd9ecee69c4e",
+ "format": 1
+ },
+ {
"name": "docs/docsite/extra-docs.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -564,21 +571,21 @@
"name": "plugins/module_utils/acme/backend_cryptography.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4b8f578400e6bd0762ba44c0784c6a8e4fc442e436243836ace40317eb936b61",
+ "chksum_sha256": "5bccf4747fa4ef5853858db1683bfa4d31951fc1da78341c36063617eb4b2719",
"format": 1
},
{
"name": "plugins/module_utils/acme/backend_openssl_cli.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5e5e5127e8eb261168dfe60dcd1e1fd63ad1196ca5947a1845c3f7481dcaf431",
+ "chksum_sha256": "7a722bedddbc63e4d6e66b10659f63531c2675e19740ccc3381b70f6ed3fdba4",
"format": 1
},
{
"name": "plugins/module_utils/acme/backends.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cf618865eb9f569e5d775d0539463ce6f7abd3cd593f4528a83f3f1bfb2885e5",
+ "chksum_sha256": "e2c50aaec5b7404e7a8437d34f8246adcb6a7390dff505ce772d04b9a9530177",
"format": 1
},
{
@@ -641,7 +648,7 @@
"name": "plugins/module_utils/crypto/module_backends/certificate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "707b1e0abbd35ffb76d00744ee35b4f5521b7184de04d587f34cc256aa1a7728",
+ "chksum_sha256": "c8858dddd2447413319f622af45c004f3b64eb6038e3e288454b76418d28d0f2",
"format": 1
},
{
@@ -655,28 +662,28 @@
"name": "plugins/module_utils/crypto/module_backends/certificate_entrust.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0046918bf9e870753fb5a24815ada1dcc42077f2ba62e950942f26c36a298b62",
+ "chksum_sha256": "79486afc80b485e4c4c930b59f44c8320e5ece7eb63408bf5f5ac2bc66c3eeed",
"format": 1
},
{
"name": "plugins/module_utils/crypto/module_backends/certificate_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "20a96ca9b95f652564f49dce0e477a314da3f6cc1e6f51e3ae75992e6f54da5b",
+ "chksum_sha256": "cd9c993f1c224036eba267820de7e21cec8a06a138d943b776541be214f1d14f",
"format": 1
},
{
"name": "plugins/module_utils/crypto/module_backends/certificate_ownca.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8491949f4ed06374834f8ba4cd67edac9bbbeae47247b0e978c92220aaf3cb50",
+ "chksum_sha256": "6c58c55efbdec1869fc10fe63785242aee81f2dc8fff03397de5b75303ed724d",
"format": 1
},
{
"name": "plugins/module_utils/crypto/module_backends/certificate_selfsigned.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c535db42e5267798cb1d12c1329ed3e526ede4afae8dcef10d619e779535ecf6",
+ "chksum_sha256": "d46e3f53d82fe161efdc94f337126f66fcfb8e49647367c08a68ee2232ca6e8c",
"format": 1
},
{
@@ -774,14 +781,14 @@
"name": "plugins/module_utils/crypto/cryptography_crl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "070fbd85edef9007d52574252b31f189dabc6256b828251075d506e6f1186082",
+ "chksum_sha256": "ad9a5bdd95492d516dc390346b968b0191a8901d7682382e978a7f67e681878a",
"format": 1
},
{
"name": "plugins/module_utils/crypto/cryptography_support.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "429ae5d529c41a60c0cf15e55b745cbd9adfd569ea315adf693527ba72499451",
+ "chksum_sha256": "3839218fd95217f9fbb44cb01ac33ec87837021d90fe92dac2ac1509a29f5564",
"format": 1
},
{
@@ -802,14 +809,14 @@
"name": "plugins/module_utils/crypto/pem.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9045d933bdb216615500049e5773323f005b2355868f2628c9775cf88e524ae3",
+ "chksum_sha256": "8a37877e3d15f35f92bb5a28698db59b6c8c605f99d89cf42554418378d7738b",
"format": 1
},
{
"name": "plugins/module_utils/crypto/support.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "af8b7e736a0383370681a6a9017a9e9f3c9bbcf324c3b6c2bc99e5031bef3183",
+ "chksum_sha256": "7d27f0bf007ccdb80a8d144381545f6406abad02396dbd39def186147a6efa91",
"format": 1
},
{
@@ -872,7 +879,7 @@
"name": "plugins/module_utils/openssh/certificate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3edc83078c5dee008ccb961123d202b4ea2340772f28137dcef60e945604464c",
+ "chksum_sha256": "2febea40e9db5c2f560a0e399603812f520b575b00cec33bfae2e536962d24c7",
"format": 1
},
{
@@ -942,7 +949,7 @@
"name": "plugins/modules/acme_certificate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c3f29dfd43f862717692b9ea8a48a186f3bf48f73cbe400ded858aa1286662ac",
+ "chksum_sha256": "5f0f0039f146654c43e4a2a44e7be9becfc9a1d0566e11bef39ad591b472725d",
"format": 1
},
{
@@ -956,7 +963,7 @@
"name": "plugins/modules/acme_challenge_cert_helper.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "073bd164227b3dfd709e76288c1d3185474556274257e793e77f7acbd2220904",
+ "chksum_sha256": "8484e4dc9508cffab80145f63ebabf0e88e6d203a3e466f2c000ca3e465596cb",
"format": 1
},
{
@@ -998,7 +1005,7 @@
"name": "plugins/modules/get_certificate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "316e351393face995abc0334f38736f3eb27bd73a9faece5206c061f37122ab0",
+ "chksum_sha256": "3ea3b665adf3bbc3c2dc8e92cf9efd6c7b273aec0c8f1ef29e6414b0a9c50dd9",
"format": 1
},
{
@@ -1121,10 +1128,17 @@
"format": 1
},
{
+ "name": "plugins/modules/x509_certificate_convert.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b41327e91bb4111c6b9e4293684a2ad6d4cfa566101303ac4b38507a71c18716",
+ "format": 1
+ },
+ {
"name": "plugins/modules/x509_certificate_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9cdcd6e9d4d11182ff9bf203c1432b0d96d74f31548f8eb34ae5b7beb48d57fc",
+ "chksum_sha256": "e39c0d16a89cc7cac74d2c81e0406c9e5c1ebe8da0dd9c9c5ef9c26a78d5eae0",
"format": 1
},
{
@@ -1138,7 +1152,7 @@
"name": "plugins/modules/x509_crl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc95c541cd09e5d61f437b7c701e3c3370821618a271f98d4746de8480e9084f",
+ "chksum_sha256": "eb2dfed3b7ec2739444923eb22812533901e9f6e7b6f19e127db7d34b3f6c6aa",
"format": 1
},
{
@@ -4579,6 +4593,55 @@
"format": 1
},
{
+ "name": "tests/integration/targets/x509_certificate_convert",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/x509_certificate_convert/meta",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/x509_certificate_convert/meta/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e550791b9b9cf709c4dbec99b2fd8603263883e7eab8c8d99805c2aa4bcaa8a2",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/x509_certificate_convert/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/x509_certificate_convert/tasks/impl.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c41118537236b6020f57408e488caac150d7f68d5e5c2a1a5b576441d467d710",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/x509_certificate_convert/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "89871cb736941b87c796ec88bd5bb119dc7adf62b9379ecebd1ae620156f939a",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/x509_certificate_convert/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "efd331a62ed0b05469a451ee76dfab1231fee154835999a0cda0473e9bfe30f8",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/x509_certificate_info",
"ftype": "dir",
"chksum_type": null,
@@ -4848,7 +4911,7 @@
"name": "tests/sanity/ignore-2.10.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9c564907d4db67b2eab6b7387740cbf6146bb2f236db4eac52fc320fa2e0eefb",
+ "chksum_sha256": "0cfffbe82096f8efdba1b354fad867dd681faac5a4029419261c228ca128c97f",
"format": 1
},
{
@@ -4862,7 +4925,7 @@
"name": "tests/sanity/ignore-2.11.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1b44914e1e87736a09ebfdabf48dae543323720b6864fb9064052e874d96847d",
+ "chksum_sha256": "409ff4ad0805b8ac9d20d7c7ae2e76f35ac8ed6c14ea124d75f768e4299af964",
"format": 1
},
{
@@ -4876,7 +4939,7 @@
"name": "tests/sanity/ignore-2.12.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a4c87a60391639fdf51e7be2088785d7d1950580d27cbc348d45c2bad0887a4a",
+ "chksum_sha256": "69653fb8464973ead8ebbdadf67ec37adc5222978de6033fa8c76fe90292fb54",
"format": 1
},
{
@@ -4890,7 +4953,7 @@
"name": "tests/sanity/ignore-2.13.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38df4b447aa4f0fa4b168df195dff78362f955ed3c4117266c320045be6d00a7",
+ "chksum_sha256": "9d1eec057555e6cfcd9757bead5d91d32069ecdb786eebca25c253e85e5e9f47",
"format": 1
},
{
@@ -4904,7 +4967,7 @@
"name": "tests/sanity/ignore-2.14.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38df4b447aa4f0fa4b168df195dff78362f955ed3c4117266c320045be6d00a7",
+ "chksum_sha256": "9d1eec057555e6cfcd9757bead5d91d32069ecdb786eebca25c253e85e5e9f47",
"format": 1
},
{
@@ -4957,10 +5020,24 @@
"format": 1
},
{
+ "name": "tests/sanity/ignore-2.18.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "88f167104e425a472b8fd111b8b2e9d7b2e1135ace2d5130cef81ca38aeba161",
+ "format": 1
+ },
+ {
+ "name": "tests/sanity/ignore-2.18.txt.license",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1",
+ "format": 1
+ },
+ {
"name": "tests/sanity/ignore-2.9.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dad1b754c46149195a1a26af8e56bb1aa449d4acec41532bfaf45a8254b11050",
+ "chksum_sha256": "0ebc63c03bea984b7363e6e7ac6b1cf2ef1a866637ab8564cbad5061a62dc1e8",
"format": 1
},
{
@@ -5429,7 +5506,7 @@
"name": "CHANGELOG.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5430eaa014f0f010ed69848fea7d36d8dbb9fe9a8d7612887dd52c73389dfef1",
+ "chksum_sha256": "ca2c6e6efdcfdb7ee6ee1b3bbb095989678081d32fa9aca67b65f57e96a37026",
"format": 1
},
{
@@ -5443,7 +5520,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "124c1a02abb35f4b3e98c6449bd07d7a606a80e34f297b60be1ed43673955bba",
+ "chksum_sha256": "6ba9093a33e39e50b4a9436cbfdb36c2591a15c0aeadc8e7072b980df760ee6d",
"format": 1
},
{
@@ -5464,7 +5541,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dd847490669a8106ad134aa8c1d21e9620891badee9173763ca0643187e7e735",
+ "chksum_sha256": "704b9171377cd1c819ac83f7603438188432dfc6296bb7c6bfa7291c85d3b8b6",
"format": 1
}
],
diff --git a/ansible_collections/community/crypto/MANIFEST.json b/ansible_collections/community/crypto/MANIFEST.json
index 2e16020a1..40dbbd275 100644
--- a/ansible_collections/community/crypto/MANIFEST.json
+++ b/ansible_collections/community/crypto/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "crypto",
- "version": "2.18.0",
+ "version": "2.19.0",
"authors": [
"Ansible (github.com/ansible)"
],
@@ -41,7 +41,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fc4c33abc854162fe45421f98db891d66b0d614f3c5ddfcb8d14f308db7e9df2",
+ "chksum_sha256": "b8a70c677576d6f7bda75b45d97af355a4f371b9269a791bdef8976361b39f75",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/crypto/README.md b/ansible_collections/community/crypto/README.md
index 64ffd4eae..99c6a4f62 100644
--- a/ansible_collections/community/crypto/README.md
+++ b/ansible_collections/community/crypto/README.md
@@ -18,7 +18,7 @@ Please note that this collection does **not** support Windows targets.
## Tested with Ansible
-Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, and ansible-core-2.16 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
+Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, and ansible-core-2.17 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
## External requirements
@@ -54,6 +54,7 @@ If you use the Ansible package and do not update collections independently, use
- openssl_signature_info module
- openssl_signature module
- split_pem filter
+ - x509_certificate_convert module
- x509_certificate_info module and filter
- x509_certificate_pipe module
- x509_certificate module
diff --git a/ansible_collections/community/crypto/changelogs/changelog.yaml b/ansible_collections/community/crypto/changelogs/changelog.yaml
index 044bd81a8..856a965ec 100644
--- a/ansible_collections/community/crypto/changelogs/changelog.yaml
+++ b/ansible_collections/community/crypto/changelogs/changelog.yaml
@@ -1052,6 +1052,33 @@ releases:
name: to_serial
namespace: null
release_date: '2024-02-25'
+ 2.19.0:
+ changes:
+ bugfixes:
+ - acme_certificate - respect the order of the CNAME and SAN identifiers that
+ are passed on when creating an ACME order (https://github.com/ansible-collections/community.crypto/issues/723,
+ https://github.com/ansible-collections/community.crypto/pull/725).
+ deprecated_features:
+ - acme.backends module utils - from community.crypto on, all implementations
+ of ``CryptoBackend`` must override ``get_ordered_csr_identifiers()``. The
+ current default implementation, which simply sorts the result of ``get_csr_identifiers()``,
+ will then be removed (https://github.com/ansible-collections/community.crypto/pull/725).
+ minor_changes:
+ - When using cryptography >= 42.0.0, use offset-aware ``datetime.datetime``
+ objects (with timezone UTC) instead of offset-naive UTC timestamps (https://github.com/ansible-collections/community.crypto/issues/726,
+ https://github.com/ansible-collections/community.crypto/pull/727).
+ - openssh_cert - avoid UTC functions deprecated in Python 3.12 when using Python
+ 3 (https://github.com/ansible-collections/community.crypto/pull/727).
+ release_summary: Bugfix and feature release.
+ fragments:
+ - 2.19.0.yml
+ - 725-acme_certificate-order.yml
+ - 727-cryptography-utc.yml
+ modules:
+ - description: Convert X.509 certificates
+ name: x509_certificate_convert
+ namespace: ''
+ release_date: '2024-04-20'
2.2.0:
changes:
bugfixes:
diff --git a/ansible_collections/community/crypto/docs/docsite/config.yml b/ansible_collections/community/crypto/docs/docsite/config.yml
new file mode 100644
index 000000000..1d6cf8554
--- /dev/null
+++ b/ansible_collections/community/crypto/docs/docsite/config.yml
@@ -0,0 +1,7 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+changelog:
+ write_changelog: true
diff --git a/ansible_collections/community/crypto/plugins/module_utils/acme/backend_cryptography.py b/ansible_collections/community/crypto/plugins/module_utils/acme/backend_cryptography.py
index 2e388980a..0722c1f99 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/acme/backend_cryptography.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/acme/backend_cryptography.py
@@ -11,7 +11,6 @@ __metaclass__ = type
import base64
import binascii
-import datetime
import os
import traceback
@@ -42,11 +41,15 @@ from ansible_collections.community.crypto.plugins.module_utils.crypto.math impor
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.support import (
+ get_now_datetime,
+ ensure_utc_timezone,
parse_name_field,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
cryptography_name_to_oid,
+ get_not_valid_after,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.pem import (
@@ -298,31 +301,51 @@ class CryptographyBackend(CryptoBackend):
},
}
- def get_csr_identifiers(self, csr_filename=None, csr_content=None):
+ def get_ordered_csr_identifiers(self, csr_filename=None, csr_content=None):
'''
- Return a set of requested identifiers (CN and SANs) for the CSR.
+ Return a list of requested identifiers (CN and SANs) for the CSR.
Each identifier is a pair (type, identifier), where type is either
'dns' or 'ip'.
+
+ The list is deduplicated, and if a CNAME is present, it will be returned
+ as the first element in the result.
'''
- identifiers = set([])
if csr_content is None:
csr_content = read_file(csr_filename)
else:
csr_content = to_bytes(csr_content)
csr = cryptography.x509.load_pem_x509_csr(csr_content, _cryptography_backend)
+
+ identifiers = set()
+ result = []
+
+ def add_identifier(identifier):
+ if identifier in identifiers:
+ return
+ identifiers.add(identifier)
+ result.append(identifier)
+
for sub in csr.subject:
if sub.oid == cryptography.x509.oid.NameOID.COMMON_NAME:
- identifiers.add(('dns', sub.value))
+ add_identifier(('dns', sub.value))
for extension in csr.extensions:
if extension.oid == cryptography.x509.oid.ExtensionOID.SUBJECT_ALTERNATIVE_NAME:
for name in extension.value:
if isinstance(name, cryptography.x509.DNSName):
- identifiers.add(('dns', name.value))
+ add_identifier(('dns', name.value))
elif isinstance(name, cryptography.x509.IPAddress):
- identifiers.add(('ip', name.value.compressed))
+ add_identifier(('ip', name.value.compressed))
else:
raise BackendException('Found unsupported SAN identifier {0}'.format(name))
- return identifiers
+ return result
+
+ def get_csr_identifiers(self, csr_filename=None, csr_content=None):
+ '''
+ Return a set of requested identifiers (CN and SANs) for the CSR.
+ Each identifier is a pair (type, identifier), where type is either
+ 'dns' or 'ip'.
+ '''
+ return set(self.get_ordered_csr_identifiers(csr_filename=csr_filename, csr_content=csr_content))
def get_cert_days(self, cert_filename=None, cert_content=None, now=None):
'''
@@ -353,8 +376,10 @@ class CryptographyBackend(CryptoBackend):
raise BackendException('Cannot parse certificate {0}: {1}'.format(cert_filename, e))
if now is None:
- now = datetime.datetime.now()
- return (cert.not_valid_after - now).days
+ now = get_now_datetime(with_timezone=CRYPTOGRAPHY_TIMEZONE)
+ elif CRYPTOGRAPHY_TIMEZONE:
+ now = ensure_utc_timezone(now)
+ return (get_not_valid_after(cert) - now).days
def create_chain_matcher(self, criterium):
'''
diff --git a/ansible_collections/community/crypto/plugins/module_utils/acme/backend_openssl_cli.py b/ansible_collections/community/crypto/plugins/module_utils/acme/backend_openssl_cli.py
index dabcbdb3b..9a1ed1f5a 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/acme/backend_openssl_cli.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/acme/backend_openssl_cli.py
@@ -225,11 +225,14 @@ class OpenSSLCLIBackend(CryptoBackend):
# We do not want to error out on something IPAddress() cannot parse
return ip
- def get_csr_identifiers(self, csr_filename=None, csr_content=None):
+ def get_ordered_csr_identifiers(self, csr_filename=None, csr_content=None):
'''
- Return a set of requested identifiers (CN and SANs) for the CSR.
+ Return a list of requested identifiers (CN and SANs) for the CSR.
Each identifier is a pair (type, identifier), where type is either
'dns' or 'ip'.
+
+ The list is deduplicated, and if a CNAME is present, it will be returned
+ as the first element in the result.
'''
filename = csr_filename
data = None
@@ -241,24 +244,40 @@ class OpenSSLCLIBackend(CryptoBackend):
dummy, out, dummy = self.module.run_command(
openssl_csr_cmd, data=data, check_rc=True, binary_data=True, environ_update=_OPENSSL_ENVIRONMENT_UPDATE)
- identifiers = set([])
+ identifiers = set()
+ result = []
+
+ def add_identifier(identifier):
+ if identifier in identifiers:
+ return
+ identifiers.add(identifier)
+ result.append(identifier)
+
common_name = re.search(r"Subject:.* CN\s?=\s?([^\s,;/]+)", to_text(out, errors='surrogate_or_strict'))
if common_name is not None:
- identifiers.add(('dns', common_name.group(1)))
+ add_identifier(('dns', common_name.group(1)))
subject_alt_names = re.search(
r"X509v3 Subject Alternative Name: (?:critical)?\n +([^\n]+)\n",
to_text(out, errors='surrogate_or_strict'), re.MULTILINE | re.DOTALL)
if subject_alt_names is not None:
for san in subject_alt_names.group(1).split(", "):
if san.lower().startswith("dns:"):
- identifiers.add(('dns', san[4:]))
+ add_identifier(('dns', san[4:]))
elif san.lower().startswith("ip:"):
- identifiers.add(('ip', self._normalize_ip(san[3:])))
+ add_identifier(('ip', self._normalize_ip(san[3:])))
elif san.lower().startswith("ip address:"):
- identifiers.add(('ip', self._normalize_ip(san[11:])))
+ add_identifier(('ip', self._normalize_ip(san[11:])))
else:
raise BackendException('Found unsupported SAN identifier "{0}"'.format(san))
- return identifiers
+ return result
+
+ def get_csr_identifiers(self, csr_filename=None, csr_content=None):
+ '''
+ Return a set of requested identifiers (CN and SANs) for the CSR.
+ Each identifier is a pair (type, identifier), where type is either
+ 'dns' or 'ip'.
+ '''
+ return set(self.get_ordered_csr_identifiers(csr_filename=csr_filename, csr_content=csr_content))
def get_cert_days(self, cert_filename=None, cert_content=None, now=None):
'''
diff --git a/ansible_collections/community/crypto/plugins/module_utils/acme/backends.py b/ansible_collections/community/crypto/plugins/module_utils/acme/backends.py
index 5c48e1a74..2d95a3ee3 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/acme/backends.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/acme/backends.py
@@ -34,6 +34,23 @@ class CryptoBackend(object):
def create_mac_key(self, alg, key):
'''Create a MAC key.'''
+ def get_ordered_csr_identifiers(self, csr_filename=None, csr_content=None):
+ '''
+ Return a list of requested identifiers (CN and SANs) for the CSR.
+ Each identifier is a pair (type, identifier), where type is either
+ 'dns' or 'ip'.
+
+ The list is deduplicated, and if a CNAME is present, it will be returned
+ as the first element in the result.
+ '''
+ self.module.deprecate(
+ "Every backend must override the get_ordered_csr_identifiers() method."
+ " The default implementation will be removed in 3.0.0 and this method will be marked as `abstractmethod` by then.",
+ version='3.0.0',
+ collection_name='community.crypto',
+ )
+ return sorted(self.get_csr_identifiers(csr_filename=csr_filename, csr_content=csr_content))
+
@abc.abstractmethod
def get_csr_identifiers(self, csr_filename=None, csr_content=None):
'''
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_crl.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_crl.py
index 62499e08b..8ef0d65da 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_crl.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_crl.py
@@ -19,6 +19,7 @@ from .basic import (
)
from .cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
cryptography_decode_name,
)
@@ -27,6 +28,11 @@ from ._obj2txt import (
)
+# TODO: once cryptography has a _utc variant of InvalidityDate.invalidity_date, set this
+# to True and adjust get_invalidity_date() accordingly.
+# (https://github.com/pyca/cryptography/issues/10818)
+CRYPTOGRAPHY_TIMEZONE_INVALIDITY_DATE = False
+
TIMESTAMP_FORMAT = "%Y%m%d%H%M%SZ"
@@ -55,7 +61,7 @@ else:
def cryptography_decode_revoked_certificate(cert):
result = {
'serial_number': cert.serial_number,
- 'revocation_date': cert.revocation_date,
+ 'revocation_date': get_revocation_date(cert),
'issuer': None,
'issuer_critical': False,
'reason': None,
@@ -77,7 +83,7 @@ def cryptography_decode_revoked_certificate(cert):
pass
try:
ext = cert.extensions.get_extension_for_class(x509.InvalidityDate)
- result['invalidity_date'] = ext.value.invalidity_date
+ result['invalidity_date'] = get_invalidity_date(ext.value)
result['invalidity_date_critical'] = ext.critical
except x509.ExtensionNotFound:
pass
@@ -112,3 +118,38 @@ def cryptography_get_signature_algorithm_oid_from_crl(crl):
crl._x509_crl.sig_alg.algorithm
)
return x509.oid.ObjectIdentifier(dotted)
+
+
+def get_next_update(obj):
+ if CRYPTOGRAPHY_TIMEZONE:
+ return obj.next_update_utc
+ return obj.next_update
+
+
+def get_last_update(obj):
+ if CRYPTOGRAPHY_TIMEZONE:
+ return obj.last_update_utc
+ return obj.last_update
+
+
+def get_revocation_date(obj):
+ if CRYPTOGRAPHY_TIMEZONE:
+ return obj.revocation_date_utc
+ return obj.revocation_date
+
+
+def get_invalidity_date(obj):
+ # TODO: special handling if CRYPTOGRAPHY_TIMEZONE_INVALIDITY_DATE is True
+ return obj.invalidity_date
+
+
+def set_next_update(builder, value):
+ return builder.next_update(value)
+
+
+def set_last_update(builder, value):
+ return builder.last_update(value)
+
+
+def set_revocation_date(builder, value):
+ return builder.revocation_date(value)
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_support.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_support.py
index b767d3417..3d07b35b1 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_support.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/cryptography_support.py
@@ -29,7 +29,9 @@ try:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
import ipaddress
+ _HAS_CRYPTOGRAPHY = True
except ImportError:
+ _HAS_CRYPTOGRAPHY = False
# Error handled in the calling module.
pass
@@ -106,6 +108,11 @@ from ._objects import (
from ._obj2txt import obj2txt
+CRYPTOGRAPHY_TIMEZONE = False
+if _HAS_CRYPTOGRAPHY:
+ CRYPTOGRAPHY_TIMEZONE = LooseVersion(cryptography.__version__) >= LooseVersion('42.0.0')
+
+
DOTTED_OID = re.compile(r'^\d+(?:\.\d+)+$')
@@ -807,3 +814,23 @@ def cryptography_verify_certificate_signature(certificate, signer_public_key):
certificate.signature_hash_algorithm,
signer_public_key
)
+
+
+def get_not_valid_after(obj):
+ if CRYPTOGRAPHY_TIMEZONE:
+ return obj.not_valid_after_utc
+ return obj.not_valid_after
+
+
+def get_not_valid_before(obj):
+ if CRYPTOGRAPHY_TIMEZONE:
+ return obj.not_valid_before_utc
+ return obj.not_valid_before
+
+
+def set_not_valid_after(builder, value):
+ return builder.not_valid_after(value)
+
+
+def set_not_valid_before(builder, value):
+ return builder.not_valid_before(value)
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate.py
index 7a56d7e9d..7bc93d934 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate.py
@@ -32,6 +32,8 @@ from ansible_collections.community.crypto.plugins.module_utils.crypto.support im
from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
cryptography_compare_public_keys,
+ get_not_valid_after,
+ get_not_valid_before,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.module_backends.certificate_info import (
@@ -251,12 +253,12 @@ class CertificateBackend(object):
# Check not before
if not_before is not None and not self.ignore_timestamps:
- if self.existing_certificate.not_valid_before != not_before:
+ if get_not_valid_before(self.existing_certificate) != not_before:
return True
# Check not after
if not_after is not None and not self.ignore_timestamps:
- if self.existing_certificate.not_valid_after != not_after:
+ if get_not_valid_after(self.existing_certificate) != not_after:
return True
return False
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_entrust.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_entrust.py
index baf53f5de..7dc4641e1 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_entrust.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_entrust.py
@@ -10,7 +10,6 @@ __metaclass__ = type
import datetime
-import time
import os
from ansible.module_utils.common.text.converters import to_native, to_bytes
@@ -19,11 +18,14 @@ from ansible_collections.community.crypto.plugins.module_utils.ecs.api import EC
from ansible_collections.community.crypto.plugins.module_utils.crypto.support import (
load_certificate,
+ get_now_datetime,
get_relative_time_option,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
cryptography_serial_number_of_cert,
+ get_not_valid_after,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.module_backends.certificate import (
@@ -99,7 +101,7 @@ class EntrustCertificateBackend(CertificateBackend):
# Handle expiration (30 days if not specified)
expiry = self.notAfter
if not expiry:
- gmt_now = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
+ gmt_now = get_now_datetime(with_timezone=CRYPTOGRAPHY_TIMEZONE)
expiry = gmt_now + datetime.timedelta(days=365)
expiry_iso3339 = expiry.strftime("%Y-%m-%dT%H:%M:%S.00Z")
@@ -154,7 +156,7 @@ class EntrustCertificateBackend(CertificateBackend):
expiry = None
if self.backend == 'cryptography':
serial_number = "{0:X}".format(cryptography_serial_number_of_cert(self.existing_certificate))
- expiry = self.existing_certificate.not_valid_after
+ expiry = get_not_valid_after(self.existing_certificate)
# get some information about the expiry of this certificate
expiry_iso3339 = expiry.strftime("%Y-%m-%dT%H:%M:%S.00Z")
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_info.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_info.py
index b10733ceb..5db6c3586 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_info.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_info.py
@@ -12,7 +12,6 @@ __metaclass__ = type
import abc
import binascii
-import datetime
import traceback
from ansible.module_utils import six
@@ -24,13 +23,17 @@ from ansible_collections.community.crypto.plugins.module_utils.version import Lo
from ansible_collections.community.crypto.plugins.module_utils.crypto.support import (
load_certificate,
get_fingerprint_of_bytes,
+ get_now_datetime,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
cryptography_decode_name,
cryptography_get_extensions_from_cert,
cryptography_oid_to_name,
cryptography_serial_number_of_cert,
+ get_not_valid_after,
+ get_not_valid_before,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.module_backends.publickey_info import (
@@ -169,7 +172,7 @@ class CertificateInfoRetrieval(object):
not_after = self.get_not_after()
result['not_before'] = not_before.strftime(TIMESTAMP_FORMAT)
result['not_after'] = not_after.strftime(TIMESTAMP_FORMAT)
- result['expired'] = not_after < datetime.datetime.utcnow()
+ result['expired'] = not_after < get_now_datetime(with_timezone=CRYPTOGRAPHY_TIMEZONE)
result['public_key'] = to_native(self._get_public_key_pem())
@@ -322,10 +325,10 @@ class CertificateInfoRetrievalCryptography(CertificateInfoRetrieval):
return None, False
def get_not_before(self):
- return self.cert.not_valid_before
+ return get_not_valid_before(self.cert)
def get_not_after(self):
- return self.cert.not_valid_after
+ return get_not_valid_after(self.cert)
def _get_public_key_pem(self):
return self.cert.public_key().public_bytes(
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_ownca.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_ownca.py
index ac1cf845a..4d312e6b7 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_ownca.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_ownca.py
@@ -31,6 +31,10 @@ from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptograp
cryptography_key_needs_digest_for_signing,
cryptography_serial_number_of_cert,
cryptography_verify_certificate_signature,
+ get_not_valid_after,
+ get_not_valid_before,
+ set_not_valid_after,
+ set_not_valid_before,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.module_backends.certificate import (
@@ -120,8 +124,8 @@ class OwnCACertificateBackendCryptography(CertificateBackend):
cert_builder = cert_builder.subject_name(self.csr.subject)
cert_builder = cert_builder.issuer_name(self.ca_cert.subject)
cert_builder = cert_builder.serial_number(self.serial_number)
- cert_builder = cert_builder.not_valid_before(self.notBefore)
- cert_builder = cert_builder.not_valid_after(self.notAfter)
+ cert_builder = set_not_valid_before(cert_builder, self.notBefore)
+ cert_builder = set_not_valid_after(cert_builder, self.notAfter)
cert_builder = cert_builder.public_key(self.csr.public_key())
has_ski = False
for extension in self.csr.extensions:
@@ -220,8 +224,8 @@ class OwnCACertificateBackendCryptography(CertificateBackend):
if self.cert is None:
self.cert = self.existing_certificate
result.update({
- 'notBefore': self.cert.not_valid_before.strftime("%Y%m%d%H%M%SZ"),
- 'notAfter': self.cert.not_valid_after.strftime("%Y%m%d%H%M%SZ"),
+ 'notBefore': get_not_valid_before(self.cert).strftime("%Y%m%d%H%M%SZ"),
+ 'notAfter': get_not_valid_after(self.cert).strftime("%Y%m%d%H%M%SZ"),
'serial_number': cryptography_serial_number_of_cert(self.cert),
})
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_selfsigned.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_selfsigned.py
index 8695d43ee..edd8d8d77 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_selfsigned.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/module_backends/certificate_selfsigned.py
@@ -22,6 +22,10 @@ from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptograp
cryptography_key_needs_digest_for_signing,
cryptography_serial_number_of_cert,
cryptography_verify_certificate_signature,
+ get_not_valid_after,
+ get_not_valid_before,
+ set_not_valid_after,
+ set_not_valid_before,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.module_backends.certificate import (
@@ -95,8 +99,8 @@ class SelfSignedCertificateBackendCryptography(CertificateBackend):
cert_builder = cert_builder.subject_name(self.csr.subject)
cert_builder = cert_builder.issuer_name(self.csr.subject)
cert_builder = cert_builder.serial_number(self.serial_number)
- cert_builder = cert_builder.not_valid_before(self.notBefore)
- cert_builder = cert_builder.not_valid_after(self.notAfter)
+ cert_builder = set_not_valid_before(cert_builder, self.notBefore)
+ cert_builder = set_not_valid_after(cert_builder, self.notAfter)
cert_builder = cert_builder.public_key(self.privatekey.public_key())
has_ski = False
for extension in self.csr.extensions:
@@ -154,8 +158,8 @@ class SelfSignedCertificateBackendCryptography(CertificateBackend):
if self.cert is None:
self.cert = self.existing_certificate
result.update({
- 'notBefore': self.cert.not_valid_before.strftime("%Y%m%d%H%M%SZ"),
- 'notAfter': self.cert.not_valid_after.strftime("%Y%m%d%H%M%SZ"),
+ 'notBefore': get_not_valid_before(self.cert).strftime("%Y%m%d%H%M%SZ"),
+ 'notAfter': get_not_valid_after(self.cert).strftime("%Y%m%d%H%M%SZ"),
'serial_number': cryptography_serial_number_of_cert(self.cert),
})
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/pem.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/pem.py
index da46548c7..5e6571fe0 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/pem.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/pem.py
@@ -9,6 +9,7 @@ __metaclass__ = type
PEM_START = '-----BEGIN '
+PEM_END_START = '-----END '
PEM_END = '-----'
PKCS8_PRIVATEKEY_NAMES = ('PRIVATE KEY', 'ENCRYPTED PRIVATE KEY')
PKCS1_PRIVATEKEY_SUFFIX = ' PRIVATE KEY'
@@ -77,3 +78,31 @@ def extract_first_pem(text):
if not all_pems:
return None
return all_pems[0]
+
+
+def _extract_type(line, start=PEM_START):
+ if not line.startswith(start):
+ return None
+ if not line.endswith(PEM_END):
+ return None
+ return line[len(start):-len(PEM_END)]
+
+
+def extract_pem(content, strict=False):
+ lines = content.splitlines()
+ if len(lines) < 3:
+ raise ValueError('PEM must have at least 3 lines, have only {count}'.format(count=len(lines)))
+ header_type = _extract_type(lines[0])
+ if header_type is None:
+ raise ValueError('First line is not of format {start}...{end}: {line!r}'.format(start=PEM_START, end=PEM_END, line=lines[0]))
+ footer_type = _extract_type(lines[-1], start=PEM_END_START)
+ if strict:
+ if header_type != footer_type:
+ raise ValueError('Header type ({header}) is different from footer type ({footer})'.format(header=header_type, footer=footer_type))
+ for idx, line in enumerate(lines[1:-2]):
+ if len(line) != 64:
+ raise ValueError('Line {idx} has length {len} instead of 64'.format(idx=idx, len=len(line)))
+ if not (0 < len(lines[-2]) <= 64):
+ raise ValueError('Last line has length {len}, should be in (0, 64]'.format(len=len(lines[-2])))
+ content = lines[1:-1]
+ return header_type, ''.join(content)
diff --git a/ansible_collections/community/crypto/plugins/module_utils/crypto/support.py b/ansible_collections/community/crypto/plugins/module_utils/crypto/support.py
index 473246b1b..8b59a3b70 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/crypto/support.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/crypto/support.py
@@ -279,7 +279,19 @@ def parse_ordered_name_field(input_list, name_field_name):
return result
-def convert_relative_to_datetime(relative_time_string):
+def get_now_datetime(with_timezone):
+ if with_timezone:
+ return datetime.datetime.now(tz=datetime.timezone.utc)
+ return datetime.datetime.utcnow()
+
+
+def ensure_utc_timezone(timestamp):
+ if timestamp.tzinfo is not None:
+ return timestamp
+ return timestamp.astimezone(datetime.timezone.utc)
+
+
+def convert_relative_to_datetime(relative_time_string, with_timezone=False):
"""Get a datetime.datetime or None from a string in the time format described in sshd_config(5)"""
parsed_result = re.match(
@@ -304,13 +316,14 @@ def convert_relative_to_datetime(relative_time_string):
offset += datetime.timedelta(
seconds=int(parsed_result.group("seconds")))
+ now = get_now_datetime(with_timezone=with_timezone)
if parsed_result.group("prefix") == "+":
- return datetime.datetime.utcnow() + offset
+ return now + offset
else:
- return datetime.datetime.utcnow() - offset
+ return now - offset
-def get_relative_time_option(input_string, input_name, backend='cryptography'):
+def get_relative_time_option(input_string, input_name, backend='cryptography', with_timezone=False):
"""Return an absolute timespec if a relative timespec or an ASN1 formatted
string is provided.
@@ -323,7 +336,7 @@ def get_relative_time_option(input_string, input_name, backend='cryptography'):
input_string, input_name)
# Relative time
if result.startswith("+") or result.startswith("-"):
- result_datetime = convert_relative_to_datetime(result)
+ result_datetime = convert_relative_to_datetime(result, with_timezone=with_timezone)
if backend == 'pyopenssl':
return result_datetime.strftime("%Y%m%d%H%M%SZ")
elif backend == 'cryptography':
@@ -332,9 +345,13 @@ def get_relative_time_option(input_string, input_name, backend='cryptography'):
if backend == 'cryptography':
for date_fmt in ['%Y%m%d%H%M%SZ', '%Y%m%d%H%MZ', '%Y%m%d%H%M%S%z', '%Y%m%d%H%M%z']:
try:
- return datetime.datetime.strptime(result, date_fmt)
+ res = datetime.datetime.strptime(result, date_fmt)
except ValueError:
pass
+ else:
+ if with_timezone:
+ res = res.astimezone(datetime.timezone.utc)
+ return res
raise OpenSSLObjectError(
'The time spec "%s" for %s is invalid' %
diff --git a/ansible_collections/community/crypto/plugins/module_utils/openssh/certificate.py b/ansible_collections/community/crypto/plugins/module_utils/openssh/certificate.py
index 54d1b1ec5..f59766651 100644
--- a/ansible_collections/community/crypto/plugins/module_utils/openssh/certificate.py
+++ b/ansible_collections/community/crypto/plugins/module_utils/openssh/certificate.py
@@ -22,7 +22,9 @@ __metaclass__ = type
import abc
import binascii
+import datetime as _datetime
import os
+import sys
from base64 import b64encode
from datetime import datetime
from hashlib import sha256
@@ -61,8 +63,17 @@ _ECDSA_CURVE_IDENTIFIERS_LOOKUP = {
b'nistp521': 'ecdsa-nistp521',
}
-_ALWAYS = datetime(1970, 1, 1)
-_FOREVER = datetime.max
+_USE_TIMEZONE = sys.version_info >= (3, 6)
+
+
+def _ensure_utc_timezone_if_use_timezone(value):
+ if not _USE_TIMEZONE or value.tzinfo is not None:
+ return value
+ return value.astimezone(_datetime.timezone.utc)
+
+
+_ALWAYS = _ensure_utc_timezone_if_use_timezone(datetime(1970, 1, 1))
+_FOREVER = datetime(9999, 12, 31, 23, 59, 59, 999999, _datetime.timezone.utc) if _USE_TIMEZONE else datetime.max
_CRITICAL_OPTIONS = (
'force-command',
@@ -136,7 +147,7 @@ class OpensshCertificateTimeParameters(object):
elif dt == _FOREVER:
result = 'forever'
else:
- result = dt.isoformat() if date_format == 'human_readable' else dt.strftime("%Y%m%d%H%M%S")
+ result = dt.isoformat().replace('+00:00', '') if date_format == 'human_readable' else dt.strftime("%Y%m%d%H%M%S")
elif date_format == 'timestamp':
td = dt - _ALWAYS
result = int((td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6) / 10 ** 6)
@@ -167,7 +178,10 @@ class OpensshCertificateTimeParameters(object):
result = _FOREVER
else:
try:
- result = datetime.utcfromtimestamp(timestamp)
+ if _USE_TIMEZONE:
+ result = datetime.fromtimestamp(timestamp, tz=_datetime.timezone.utc)
+ else:
+ result = datetime.utcfromtimestamp(timestamp)
except OverflowError as e:
raise ValueError
return result
@@ -180,11 +194,11 @@ class OpensshCertificateTimeParameters(object):
elif time_string == 'forever':
result = _FOREVER
elif is_relative_time_string(time_string):
- result = convert_relative_to_datetime(time_string)
+ result = convert_relative_to_datetime(time_string, with_timezone=_USE_TIMEZONE)
else:
for time_format in ("%Y-%m-%d", "%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S"):
try:
- result = datetime.strptime(time_string, time_format)
+ result = _ensure_utc_timezone_if_use_timezone(datetime.strptime(time_string, time_format))
except ValueError:
pass
if result is None:
diff --git a/ansible_collections/community/crypto/plugins/modules/acme_certificate.py b/ansible_collections/community/crypto/plugins/modules/acme_certificate.py
index 9c0b349c4..21a6d6ae9 100644
--- a/ansible_collections/community/crypto/plugins/modules/acme_certificate.py
+++ b/ansible_collections/community/crypto/plugins/modules/acme_certificate.py
@@ -661,7 +661,7 @@ class ACMECertificateClient(object):
raise ModuleFailException("CSR %s not found" % (self.csr))
# Extract list of identifiers from CSR
- self.identifiers = self.client.backend.get_csr_identifiers(csr_filename=self.csr, csr_content=self.csr_content)
+ self.identifiers = self.client.backend.get_ordered_csr_identifiers(csr_filename=self.csr, csr_content=self.csr_content)
def is_first_step(self):
'''
diff --git a/ansible_collections/community/crypto/plugins/modules/acme_challenge_cert_helper.py b/ansible_collections/community/crypto/plugins/modules/acme_challenge_cert_helper.py
index 9740cd16d..48b65f998 100644
--- a/ansible_collections/community/crypto/plugins/modules/acme_challenge_cert_helper.py
+++ b/ansible_collections/community/crypto/plugins/modules/acme_challenge_cert_helper.py
@@ -165,6 +165,16 @@ from ansible_collections.community.crypto.plugins.module_utils.acme.io import (
read_file,
)
+from ansible_collections.community.crypto.plugins.module_utils.crypto.support import (
+ get_now_datetime,
+)
+
+from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
+ set_not_valid_after,
+ set_not_valid_before,
+)
+
CRYPTOGRAPHY_IMP_ERR = None
try:
import cryptography
@@ -244,8 +254,9 @@ def main():
domain = to_text(challenge_data['resource'])
identifier_type, identifier = to_text(challenge_data.get('resource_original', 'dns:' + challenge_data['resource'])).split(':', 1)
subject = issuer = cryptography.x509.Name([])
- not_valid_before = datetime.datetime.utcnow()
- not_valid_after = datetime.datetime.utcnow() + datetime.timedelta(days=10)
+ now = get_now_datetime(with_timezone=CRYPTOGRAPHY_TIMEZONE)
+ not_valid_before = now
+ not_valid_after = now + datetime.timedelta(days=10)
if identifier_type == 'dns':
san = cryptography.x509.DNSName(identifier)
elif identifier_type == 'ip':
@@ -254,7 +265,7 @@ def main():
raise ModuleFailException('Unsupported identifier type "{0}"'.format(identifier_type))
# Generate regular self-signed certificate
- regular_certificate = cryptography.x509.CertificateBuilder().subject_name(
+ cert_builder = cryptography.x509.CertificateBuilder().subject_name(
subject
).issuer_name(
issuer
@@ -262,14 +273,13 @@ def main():
private_key.public_key()
).serial_number(
cryptography.x509.random_serial_number()
- ).not_valid_before(
- not_valid_before
- ).not_valid_after(
- not_valid_after
).add_extension(
cryptography.x509.SubjectAlternativeName([san]),
critical=False,
- ).sign(
+ )
+ cert_builder = set_not_valid_before(cert_builder, not_valid_before)
+ cert_builder = set_not_valid_after(cert_builder, not_valid_after)
+ regular_certificate = cert_builder.sign(
private_key,
cryptography.hazmat.primitives.hashes.SHA256(),
_cryptography_backend
@@ -278,7 +288,7 @@ def main():
# Process challenge
if challenge == 'tls-alpn-01':
value = base64.b64decode(challenge_data['resource_value'])
- challenge_certificate = cryptography.x509.CertificateBuilder().subject_name(
+ cert_builder = cryptography.x509.CertificateBuilder().subject_name(
subject
).issuer_name(
issuer
@@ -286,10 +296,6 @@ def main():
private_key.public_key()
).serial_number(
cryptography.x509.random_serial_number()
- ).not_valid_before(
- not_valid_before
- ).not_valid_after(
- not_valid_after
).add_extension(
cryptography.x509.SubjectAlternativeName([san]),
critical=False,
@@ -299,7 +305,10 @@ def main():
encode_octet_string(value),
),
critical=True,
- ).sign(
+ )
+ cert_builder = set_not_valid_before(cert_builder, not_valid_before)
+ cert_builder = set_not_valid_after(cert_builder, not_valid_after)
+ challenge_certificate = cert_builder.sign(
private_key,
cryptography.hazmat.primitives.hashes.SHA256(),
_cryptography_backend
diff --git a/ansible_collections/community/crypto/plugins/modules/get_certificate.py b/ansible_collections/community/crypto/plugins/modules/get_certificate.py
index 0f8abc90a..6ae9439d3 100644
--- a/ansible_collections/community/crypto/plugins/modules/get_certificate.py
+++ b/ansible_collections/community/crypto/plugins/modules/get_certificate.py
@@ -209,7 +209,6 @@ EXAMPLES = '''
import atexit
import base64
-import datetime
import traceback
from os.path import isfile
@@ -221,9 +220,16 @@ from ansible.module_utils.common.text.converters import to_bytes
from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion
+from ansible_collections.community.crypto.plugins.module_utils.crypto.support import (
+ get_now_datetime,
+)
+
from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
cryptography_oid_to_name,
cryptography_get_extensions_from_cert,
+ get_not_valid_after,
+ get_not_valid_before,
)
MINIMAL_CRYPTOGRAPHY_VERSION = '1.6'
@@ -392,7 +398,7 @@ def main():
for attribute in x509.subject:
result['subject'][cryptography_oid_to_name(attribute.oid, short=True)] = attribute.value
- result['expired'] = x509.not_valid_after < datetime.datetime.utcnow()
+ result['expired'] = get_not_valid_after(x509) < get_now_datetime(with_timezone=CRYPTOGRAPHY_TIMEZONE)
result['extensions'] = []
for dotted_number, entry in cryptography_get_extensions_from_cert(x509).items():
@@ -410,8 +416,8 @@ def main():
for attribute in x509.issuer:
result['issuer'][cryptography_oid_to_name(attribute.oid, short=True)] = attribute.value
- result['not_after'] = x509.not_valid_after.strftime('%Y%m%d%H%M%SZ')
- result['not_before'] = x509.not_valid_before.strftime('%Y%m%d%H%M%SZ')
+ result['not_after'] = get_not_valid_after(x509).strftime('%Y%m%d%H%M%SZ')
+ result['not_before'] = get_not_valid_before(x509).strftime('%Y%m%d%H%M%SZ')
result['serial_number'] = x509.serial_number
result['signature_algorithm'] = cryptography_oid_to_name(x509.signature_algorithm_oid)
diff --git a/ansible_collections/community/crypto/plugins/modules/x509_certificate_convert.py b/ansible_collections/community/crypto/plugins/modules/x509_certificate_convert.py
new file mode 100644
index 000000000..d3e39dc11
--- /dev/null
+++ b/ansible_collections/community/crypto/plugins/modules/x509_certificate_convert.py
@@ -0,0 +1,280 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2024, Felix Fontein <felix@fontein.de>
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+
+DOCUMENTATION = r'''
+---
+module: x509_certificate_convert
+short_description: Convert X.509 certificates
+version_added: 2.19.0
+description:
+ - This module allows to convert X.509 certificates between different formats.
+author:
+ - Felix Fontein (@felixfontein)
+extends_documentation_fragment:
+ - ansible.builtin.files
+ - community.crypto.attributes
+ - community.crypto.attributes.files
+attributes:
+ check_mode:
+ support: full
+ diff_mode:
+ support: none
+ safe_file_operations:
+ support: full
+options:
+ src_path:
+ description:
+ - Name of the file containing the X.509 certificate to convert.
+ - Exactly one of O(src_path) or O(src_content) must be specified.
+ type: path
+ src_content:
+ description:
+ - The content of the file containing the X.509 certificate to convert.
+ - This must be text. If you are not sure that the input file is PEM, you must Base64 encode
+ the value and set O(src_content_base64=true). You can use the
+ P(ansible.builtin.b64encode#filter) filter plugin for this.
+ - Exactly one of O(src_path) or O(src_content) must be specified.
+ type: str
+ src_content_base64:
+ description:
+ - If set to V(true) when O(src_content) is provided, the module assumes that the value
+ of O(src_content) is Base64 encoded.
+ type: bool
+ default: false
+ format:
+ description:
+ - Determines which format the destination X.509 certificate should be written in.
+ - Please note that not every key can be exported in any format, and that not every
+ format supports encryption.
+ type: str
+ choices:
+ - pem
+ - der
+ required: true
+ strict:
+ description:
+ - If the input is a PEM file, ensure that it contains a single PEM object, that
+ the header and footer match, and are of type C(CERTIFICATE) or C(X509 CERTIFICATE).
+ type: bool
+ default: false
+ dest_path:
+ description:
+ - Name of the file in which the generated TLS/SSL X.509 certificate will be written.
+ type: path
+ required: true
+ backup:
+ description:
+ - Create a backup file including a timestamp so you can get
+ the original X.509 certificate back if you overwrote it with a new one by accident.
+ type: bool
+ default: false
+seealso:
+ - plugin: ansible.builtin.b64encode
+ plugin_type: filter
+ - module: community.crypto.x509_certificate
+ - module: community.crypto.x509_certificate_pipe
+ - module: community.crypto.x509_certificate_info
+'''
+
+EXAMPLES = r'''
+- name: Convert PEM X.509 certificate to DER format
+ community.crypto.x509_certificate_convert:
+ src_path: /etc/ssl/cert/ansible.com.pem
+ dest_path: /etc/ssl/cert/ansible.com.der
+ format: der
+'''
+
+RETURN = r'''
+backup_file:
+ description: Name of backup file created.
+ returned: changed and if O(backup) is V(true)
+ type: str
+ sample: /path/to/cert.pem.2019-03-09@11:22~
+'''
+
+import base64
+import os
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.common.text.converters import to_native, to_bytes, to_text
+
+from ansible_collections.community.crypto.plugins.module_utils.io import (
+ load_file_if_exists,
+ write_file,
+)
+
+from ansible_collections.community.crypto.plugins.module_utils.crypto.basic import (
+ OpenSSLObjectError,
+)
+
+from ansible_collections.community.crypto.plugins.module_utils.crypto.pem import (
+ PEM_START,
+ PEM_END_START,
+ PEM_END,
+ identify_pem_format,
+ split_pem_list,
+ extract_pem,
+)
+
+from ansible_collections.community.crypto.plugins.module_utils.crypto.support import (
+ OpenSSLObject,
+)
+
+
+def parse_certificate(input, strict=False):
+ input_format = 'pem' if identify_pem_format(input) else 'der'
+ if input_format == 'pem':
+ pems = split_pem_list(to_text(input))
+ if len(pems) > 1 and strict:
+ raise ValueError('The input contains {count} PEM objects, expecting only one since strict=true'.format(count=len(pems)))
+ pem_header_type, content = extract_pem(pems[0], strict=strict)
+ if strict and pem_header_type not in ('CERTIFICATE', 'X509 CERTIFICATE'):
+ raise ValueError('type is {type!r}, expecting CERTIFICATE or X509 CERTIFICATE'.format(type=pem_header_type))
+ input = base64.b64decode(content)
+ else:
+ pem_header_type = None
+ return input, input_format, pem_header_type
+
+
+class X509CertificateConvertModule(OpenSSLObject):
+ def __init__(self, module):
+ super(X509CertificateConvertModule, self).__init__(
+ module.params['dest_path'],
+ 'present',
+ False,
+ module.check_mode,
+ )
+
+ self.src_path = module.params['src_path']
+ self.src_content = module.params['src_content']
+ self.src_content_base64 = module.params['src_content_base64']
+ if self.src_content is not None:
+ self.input = to_bytes(self.src_content)
+ if self.src_content_base64:
+ try:
+ self.input = base64.b64decode(self.input)
+ except Exception as exc:
+ module.fail_json(msg='Cannot Base64 decode src_content: {exc}'.format(exc=exc))
+ else:
+ try:
+ with open(self.src_path, 'rb') as f:
+ self.input = f.read()
+ except Exception as exc:
+ module.fail_json(msg='Failure while reading file {fn}: {exc}'.format(fn=self.src_path, exc=exc))
+
+ self.format = module.params['format']
+ self.strict = module.params['strict']
+ self.wanted_pem_type = 'CERTIFICATE'
+
+ try:
+ self.input, self.input_format, dummy = parse_certificate(self.input, strict=self.strict)
+ except Exception as exc:
+ module.fail_json(msg='Error while parsing PEM: {exc}'.format(exc=exc))
+
+ self.backup = module.params['backup']
+ self.backup_file = None
+
+ module.params['path'] = self.path
+
+ self.dest_content = load_file_if_exists(self.path, module)
+ self.dest_content_format = None
+ self.dest_content_pem_type = None
+ if self.dest_content is not None:
+ try:
+ self.dest_content, self.dest_content_format, self.dest_content_pem_type = parse_certificate(
+ self.dest_content, strict=True)
+ except Exception:
+ pass
+
+ def needs_conversion(self):
+ if self.dest_content is None or self.dest_content_format is None:
+ return True
+ if self.dest_content_format != self.format:
+ return True
+ if self.input != self.dest_content:
+ return True
+ if self.format == 'pem' and self.dest_content_pem_type != self.wanted_pem_type:
+ return True
+ return False
+
+ def get_dest_certificate(self):
+ if self.format == 'der':
+ return self.input
+ data = to_bytes(base64.b64encode(self.input))
+ lines = [to_bytes('{0}{1}{2}'.format(PEM_START, self.wanted_pem_type, PEM_END))]
+ lines += [data[i:i + 64] for i in range(0, len(data), 64)]
+ lines.append(to_bytes('{0}{1}{2}\n'.format(PEM_END_START, self.wanted_pem_type, PEM_END)))
+ return b'\n'.join(lines)
+
+ def generate(self, module):
+ """Do conversion."""
+ if self.needs_conversion():
+ # Convert
+ cert_data = self.get_dest_certificate()
+ if not self.check_mode:
+ if self.backup:
+ self.backup_file = module.backup_local(self.path)
+ write_file(module, cert_data)
+ self.changed = True
+
+ file_args = module.load_file_common_arguments(module.params)
+ if module.check_file_absent_if_check_mode(file_args['path']):
+ self.changed = True
+ else:
+ self.changed = module.set_fs_attributes_if_different(file_args, self.changed)
+
+ def dump(self):
+ """Serialize the object into a dictionary."""
+ result = dict(
+ changed=self.changed,
+ )
+ if self.backup_file:
+ result['backup_file'] = self.backup_file
+
+ return result
+
+
+def main():
+ argument_spec = dict(
+ src_path=dict(type='path'),
+ src_content=dict(type='str'),
+ src_content_base64=dict(type='bool', default=False),
+ format=dict(type='str', required=True, choices=['pem', 'der']),
+ strict=dict(type='bool', default=False),
+ dest_path=dict(type='path', required=True),
+ backup=dict(type='bool', default=False),
+ )
+ module = AnsibleModule(
+ argument_spec,
+ supports_check_mode=True,
+ add_file_common_args=True,
+ required_one_of=[('src_path', 'src_content')],
+ mutually_exclusive=[('src_path', 'src_content')],
+ )
+
+ base_dir = os.path.dirname(module.params['dest_path']) or '.'
+ if not os.path.isdir(base_dir):
+ module.fail_json(
+ name=base_dir,
+ msg='The directory %s does not exist or the file is not a directory' % base_dir
+ )
+
+ try:
+ cert = X509CertificateConvertModule(module)
+ cert.generate(module)
+ result = cert.dump()
+ module.exit_json(**result)
+ except OpenSSLObjectError as exc:
+ module.fail_json(msg=to_native(exc))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ansible_collections/community/crypto/plugins/modules/x509_certificate_info.py b/ansible_collections/community/crypto/plugins/modules/x509_certificate_info.py
index d89f610c5..8379937f7 100644
--- a/ansible_collections/community/crypto/plugins/modules/x509_certificate_info.py
+++ b/ansible_collections/community/crypto/plugins/modules/x509_certificate_info.py
@@ -410,6 +410,10 @@ from ansible_collections.community.crypto.plugins.module_utils.crypto.support im
get_relative_time_option,
)
+from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
+)
+
from ansible_collections.community.crypto.plugins.module_utils.crypto.module_backends.certificate_info import (
select_backend,
)
@@ -451,7 +455,7 @@ def main():
module.fail_json(
msg='The value for valid_at.{0} must be of type string (got {1})'.format(k, type(v))
)
- valid_at[k] = get_relative_time_option(v, 'valid_at.{0}'.format(k))
+ valid_at[k] = get_relative_time_option(v, 'valid_at.{0}'.format(k), with_timezone=CRYPTOGRAPHY_TIMEZONE)
try:
result = module_backend.get_info(der_support_enabled=module.params['content'] is None)
diff --git a/ansible_collections/community/crypto/plugins/modules/x509_crl.py b/ansible_collections/community/crypto/plugins/modules/x509_crl.py
index 1ac97005a..527975b88 100644
--- a/ansible_collections/community/crypto/plugins/modules/x509_crl.py
+++ b/ansible_collections/community/crypto/plugins/modules/x509_crl.py
@@ -475,6 +475,7 @@ from ansible_collections.community.crypto.plugins.module_utils.crypto.support im
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import (
+ CRYPTOGRAPHY_TIMEZONE,
cryptography_decode_name,
cryptography_get_name,
cryptography_key_needs_digest_for_signing,
@@ -484,11 +485,17 @@ from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptograp
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_crl import (
+ CRYPTOGRAPHY_TIMEZONE_INVALIDITY_DATE,
REVOCATION_REASON_MAP,
TIMESTAMP_FORMAT,
cryptography_decode_revoked_certificate,
cryptography_dump_revoked,
cryptography_get_signature_algorithm_oid_from_crl,
+ get_next_update,
+ get_last_update,
+ set_next_update,
+ set_last_update,
+ set_revocation_date,
)
from ansible_collections.community.crypto.plugins.module_utils.crypto.pem import (
@@ -560,8 +567,8 @@ class CRL(OpenSSLObject):
except (TypeError, ValueError) as exc:
module.fail_json(msg=to_native(exc))
- self.last_update = get_relative_time_option(module.params['last_update'], 'last_update')
- self.next_update = get_relative_time_option(module.params['next_update'], 'next_update')
+ self.last_update = get_relative_time_option(module.params['last_update'], 'last_update', with_timezone=CRYPTOGRAPHY_TIMEZONE)
+ self.next_update = get_relative_time_option(module.params['next_update'], 'next_update', with_timezone=CRYPTOGRAPHY_TIMEZONE)
self.digest = select_message_digest(module.params['digest'])
if self.digest is None:
@@ -607,7 +614,8 @@ class CRL(OpenSSLObject):
result['issuer_critical'] = rc['issuer_critical']
result['revocation_date'] = get_relative_time_option(
rc['revocation_date'],
- path_prefix + 'revocation_date'
+ path_prefix + 'revocation_date',
+ with_timezone=CRYPTOGRAPHY_TIMEZONE,
)
if rc['reason']:
result['reason'] = REVOCATION_REASON_MAP[rc['reason']]
@@ -615,7 +623,8 @@ class CRL(OpenSSLObject):
if rc['invalidity_date']:
result['invalidity_date'] = get_relative_time_option(
rc['invalidity_date'],
- path_prefix + 'invalidity_date'
+ path_prefix + 'invalidity_date',
+ with_timezone=CRYPTOGRAPHY_TIMEZONE_INVALIDITY_DATE,
)
result['invalidity_date_critical'] = rc['invalidity_date_critical']
self.revoked_certificates.append(result)
@@ -731,9 +740,9 @@ class CRL(OpenSSLObject):
if self.crl is None:
return False
- if self.last_update != self.crl.last_update and not self.ignore_timestamps:
+ if self.last_update != get_last_update(self.crl) and not self.ignore_timestamps:
return False
- if self.next_update != self.crl.next_update and not self.ignore_timestamps:
+ if self.next_update != get_next_update(self.crl) and not self.ignore_timestamps:
return False
if cryptography_key_needs_digest_for_signing(self.privatekey):
if self.crl.signature_hash_algorithm is None or self.digest.name != self.crl.signature_hash_algorithm.name:
@@ -780,8 +789,8 @@ class CRL(OpenSSLObject):
except ValueError as e:
raise CRLError(e)
- crl = crl.last_update(self.last_update)
- crl = crl.next_update(self.next_update)
+ crl = set_last_update(crl, self.last_update)
+ crl = set_next_update(crl, self.next_update)
if self.update and self.crl:
new_entries = set([self._compress_entry(entry) for entry in self.revoked_certificates])
@@ -792,7 +801,7 @@ class CRL(OpenSSLObject):
for entry in self.revoked_certificates:
revoked_cert = RevokedCertificateBuilder()
revoked_cert = revoked_cert.serial_number(entry['serial_number'])
- revoked_cert = revoked_cert.revocation_date(entry['revocation_date'])
+ revoked_cert = set_revocation_date(revoked_cert, entry['revocation_date'])
if entry['issuer'] is not None:
revoked_cert = revoked_cert.add_extension(
x509.CertificateIssuer(entry['issuer']),
@@ -876,8 +885,8 @@ class CRL(OpenSSLObject):
for entry in self.revoked_certificates:
result['revoked_certificates'].append(cryptography_dump_revoked(entry, idn_rewrite=self.name_encoding))
elif self.crl:
- result['last_update'] = self.crl.last_update.strftime(TIMESTAMP_FORMAT)
- result['next_update'] = self.crl.next_update.strftime(TIMESTAMP_FORMAT)
+ result['last_update'] = get_last_update(self.crl).strftime(TIMESTAMP_FORMAT)
+ result['next_update'] = get_next_update(self.crl).strftime(TIMESTAMP_FORMAT)
result['digest'] = cryptography_oid_to_name(cryptography_get_signature_algorithm_oid_from_crl(self.crl))
issuer = []
for attribute in self.crl.issuer:
diff --git a/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/aliases b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/aliases
new file mode 100644
index 000000000..4602f1185
--- /dev/null
+++ b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/aliases
@@ -0,0 +1,7 @@
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+azp/generic/2
+azp/posix/2
+destructive
diff --git a/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/meta/main.yml b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/meta/main.yml
new file mode 100644
index 000000000..7c2b42405
--- /dev/null
+++ b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/meta/main.yml
@@ -0,0 +1,9 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+dependencies:
+ - setup_openssl
+ - setup_remote_tmp_dir
+ - prepare_jinja2_compat
diff --git a/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/impl.yml b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/impl.yml
new file mode 100644
index 000000000..e0c438937
--- /dev/null
+++ b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/impl.yml
@@ -0,0 +1,212 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+- name: Read PEM cert
+ slurp:
+ src: '{{ remote_tmp_dir }}/cert_2.pem'
+ register: slurp_pem
+
+- name: Read DER cert
+ slurp:
+ src: '{{ remote_tmp_dir }}/cert_2.der'
+ register: slurp_der
+
+- name: Convert PEM cert (check mode)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.pem'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_1
+ check_mode: true
+
+- name: Convert PEM cert
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.pem'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_2
+
+- name: Convert PEM cert (idempotent, check mode)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.pem'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_3
+ check_mode: true
+
+- name: Convert PEM cert (idempotent)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.pem'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_4
+
+- name: Convert PEM cert (overwrite, check mode)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_2.pem'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_5
+ check_mode: true
+
+- name: Convert PEM cert (overwrite)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_2.pem'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_6
+
+- name: Convert PEM cert (idempotent, content)
+ x509_certificate_convert:
+ src_content: '{{ slurp_pem.content | b64decode }}'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_7
+
+- name: Convert PEM cert (idempotent, content, base64)
+ x509_certificate_convert:
+ src_content: '{{ slurp_pem.content }}'
+ src_content_base64: true
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_8
+
+- name: Convert PEM cert (idempotent, content, base64, from DER)
+ x509_certificate_convert:
+ src_content: '{{ slurp_der.content }}'
+ src_content_base64: true
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_9
+
+- name: Convert PEM cert (idempotent, from DER)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_2.der'
+ format: pem
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.pem'
+ register: result_10
+
+- name: Check conditions
+ assert:
+ that:
+ - result_1 is changed
+ - result_2 is changed
+ - result_3 is not changed
+ - result_4 is not changed
+ - result_5 is changed
+ - result_6 is changed
+ - result_7 is not changed
+ - result_8 is not changed
+ - result_9 is not changed
+ - result_10 is not changed
+
+- name: Convert DER cert (check mode)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.der'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_1
+ check_mode: true
+
+- name: Convert DER cert
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.der'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_2
+
+- name: Convert DER cert (idempotent, check mode)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.der'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_3
+ check_mode: true
+
+- name: Convert DER cert (idempotent)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_1.der'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_4
+
+- name: Convert DER cert (overwrite, check mode)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_2.der'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_5
+ check_mode: true
+
+- name: Convert DER cert (overwrite)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_2.der'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_6
+
+- name: Convert DER cert (idempotent, content, base64)
+ x509_certificate_convert:
+ src_content: '{{ slurp_der.content }}'
+ src_content_base64: true
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_7
+
+- name: Convert DER cert (idempotent, content, from PEM)
+ x509_certificate_convert:
+ src_content: '{{ slurp_pem.content | b64decode }}'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_8
+
+- name: Convert DER cert (idempotent, content, base64, from PEM)
+ x509_certificate_convert:
+ src_content: '{{ slurp_pem.content }}'
+ src_content_base64: true
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_9
+
+- name: Convert DER cert (idempotent, from PEM)
+ x509_certificate_convert:
+ src_path: '{{ remote_tmp_dir }}/cert_2.pem'
+ format: der
+ strict: true
+ dest_path: '{{ remote_tmp_dir }}/out_1.der'
+ register: result_10
+
+- name: Check conditions
+ assert:
+ that:
+ - result_1 is changed
+ - result_2 is changed
+ - result_3 is not changed
+ - result_4 is not changed
+ - result_5 is changed
+ - result_6 is changed
+ - result_7 is not changed
+ - result_8 is not changed
+ - result_9 is not changed
+ - result_10 is not changed
diff --git a/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/main.yml b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/main.yml
new file mode 100644
index 000000000..291572f1d
--- /dev/null
+++ b/ansible_collections/community/crypto/tests/integration/targets/x509_certificate_convert/tasks/main.yml
@@ -0,0 +1,136 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+####################################################################
+# WARNING: These are designed specifically for Ansible tests #
+# and should not be used as examples of how to write Ansible roles #
+####################################################################
+
+- name: Generate privatekey
+ openssl_privatekey:
+ path: '{{ remote_tmp_dir }}/privatekey.pem'
+ size: '{{ default_rsa_key_size_certifiates }}'
+
+- name: Generate CSR 1
+ openssl_csr:
+ path: '{{ remote_tmp_dir }}/csr_1.csr'
+ privatekey_path: '{{ remote_tmp_dir }}/privatekey.pem'
+ subject:
+ commonName: www.example.com
+ C: de
+ L: Somewhere
+ ST: Zurich
+ streetAddress: Welcome Street
+ O: Ansible
+ organizationalUnitName:
+ - Crypto Department
+ - ACME Department
+ serialNumber: "1234"
+ SN: Last Name
+ GN: First Name
+ title: Chief
+ pseudonym: test
+ UID: asdf
+ emailAddress: test@example.com
+ postalAddress: 1234 Somewhere
+ postalCode: "1234"
+ useCommonNameForSAN: false
+ key_usage:
+ - digitalSignature
+ - keyAgreement
+ - Non Repudiation
+ - Key Encipherment
+ - dataEncipherment
+ - Certificate Sign
+ - cRLSign
+ - Encipher Only
+ - decipherOnly
+ key_usage_critical: true
+ extended_key_usage:
+ - serverAuth # the same as "TLS Web Server Authentication"
+ - TLS Web Server Authentication
+ - TLS Web Client Authentication
+ - Code Signing
+ - E-mail Protection
+ - timeStamping
+ - OCSPSigning
+ - Any Extended Key Usage
+ - qcStatements
+ - DVCS
+ - IPSec User
+ - biometricInfo
+ subject_alt_name:
+ - "DNS:www.ansible.com"
+ - "DNS:öç.com"
+ # cryptography < 2.1 cannot handle certain Unicode characters
+ - "DNS:{{ 'www.öç' if cryptography_version.stdout is version('2.1', '<') else '☺' }}.com"
+ - "IP:1.2.3.4"
+ - "IP:::1"
+ - "email:test@example.org"
+ - "URI:https://example.org/test/index.html"
+ basic_constraints:
+ - "CA:TRUE"
+ - "pathlen:23"
+ basic_constraints_critical: true
+ ocsp_must_staple: true
+ subject_key_identifier: '{{ "00:11:22:33" if cryptography_version.stdout is version("1.3", ">=") else omit }}'
+ authority_key_identifier: '{{ "44:55:66:77" if cryptography_version.stdout is version("1.3", ">=") else omit }}'
+ authority_cert_issuer: '{{ value_for_authority_cert_issuer if cryptography_version.stdout is version("1.3", ">=") else omit }}'
+ authority_cert_serial_number: '{{ 12345 if cryptography_version.stdout is version("1.3", ">=") else omit }}'
+ vars:
+ value_for_authority_cert_issuer:
+ - "DNS:ca.example.org"
+ - "IP:1.2.3.4"
+
+- name: Generate CSR 2
+ openssl_csr:
+ path: '{{ remote_tmp_dir }}/csr_2.csr'
+ privatekey_path: '{{ remote_tmp_dir }}/privatekey.pem'
+ useCommonNameForSAN: false
+ basic_constraints:
+ - "CA:TRUE"
+
+- name: Generate CSR 3
+ openssl_csr:
+ path: '{{ remote_tmp_dir }}/csr_3.csr'
+ privatekey_path: '{{ remote_tmp_dir }}/privatekey.pem'
+ useCommonNameForSAN: false
+ subject_alt_name:
+ - "DNS:*.ansible.com"
+ - "DNS:*.example.org"
+ - "IP:DEAD:BEEF::1"
+ basic_constraints:
+ - "CA:FALSE"
+ authority_cert_issuer: '{{ value_for_authority_cert_issuer if cryptography_version.stdout is version("1.3", ">=") else omit }}'
+ authority_cert_serial_number: '{{ 12345 if cryptography_version.stdout is version("1.3", ">=") else omit }}'
+ vars:
+ value_for_authority_cert_issuer:
+ - "DNS:ca.example.org"
+ - "IP:1.2.3.4"
+
+- name: Generate selfsigned certificates
+ x509_certificate:
+ path: '{{ remote_tmp_dir }}/cert_{{ item }}.pem'
+ csr_path: '{{ remote_tmp_dir }}/csr_{{ item }}.csr'
+ privatekey_path: '{{ remote_tmp_dir }}/privatekey.pem'
+ provider: selfsigned
+ selfsigned_digest: sha256
+ selfsigned_not_after: "+10d"
+ selfsigned_not_before: "-3d"
+ loop:
+ - 1
+ - 2
+ - 3
+
+- name: Convert PEM files to DER
+ command:
+ cmd: openssl x509 -inform PEM -outform DER -in {{ remote_tmp_dir }}/cert_{{ item }}.pem -out {{ remote_tmp_dir }}/cert_{{ item }}.der
+ loop:
+ - 1
+ - 2
+ - 3
+
+- name: Running tests
+ include_tasks: impl.yml
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.10.txt b/ansible_collections/community/crypto/tests/sanity/ignore-2.10.txt
index 81d34f186..a2980b921 100644
--- a/ansible_collections/community/crypto/tests/sanity/ignore-2.10.txt
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.10.txt
@@ -15,6 +15,7 @@ plugins/modules/openssl_csr_info.py validate-modules:invalid-documentation
plugins/modules/openssl_csr_pipe.py validate-modules:invalid-documentation
plugins/modules/openssl_privatekey_info.py validate-modules:invalid-documentation
plugins/modules/openssl_publickey_info.py validate-modules:invalid-documentation
+plugins/modules/x509_certificate_convert.py validate-modules:invalid-documentation
plugins/modules/x509_certificate_info.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:return-syntax-error
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.11.txt b/ansible_collections/community/crypto/tests/sanity/ignore-2.11.txt
index 2677551db..07a994f88 100644
--- a/ansible_collections/community/crypto/tests/sanity/ignore-2.11.txt
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.11.txt
@@ -14,6 +14,7 @@ plugins/modules/openssl_csr_info.py validate-modules:invalid-documentation
plugins/modules/openssl_csr_pipe.py validate-modules:invalid-documentation
plugins/modules/openssl_privatekey_info.py validate-modules:invalid-documentation
plugins/modules/openssl_publickey_info.py validate-modules:invalid-documentation
+plugins/modules/x509_certificate_convert.py validate-modules:invalid-documentation
plugins/modules/x509_certificate_info.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:return-syntax-error
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.12.txt b/ansible_collections/community/crypto/tests/sanity/ignore-2.12.txt
index 26e5b6864..54b6198ba 100644
--- a/ansible_collections/community/crypto/tests/sanity/ignore-2.12.txt
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.12.txt
@@ -9,6 +9,7 @@ plugins/modules/openssl_csr_info.py validate-modules:invalid-documentation
plugins/modules/openssl_csr_pipe.py validate-modules:invalid-documentation
plugins/modules/openssl_privatekey_info.py validate-modules:invalid-documentation
plugins/modules/openssl_publickey_info.py validate-modules:invalid-documentation
+plugins/modules/x509_certificate_convert.py validate-modules:invalid-documentation
plugins/modules/x509_certificate_info.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:return-syntax-error
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.13.txt b/ansible_collections/community/crypto/tests/sanity/ignore-2.13.txt
index 74ca94712..389b3f533 100644
--- a/ansible_collections/community/crypto/tests/sanity/ignore-2.13.txt
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.13.txt
@@ -8,6 +8,7 @@ plugins/modules/openssl_csr_info.py validate-modules:invalid-documentation
plugins/modules/openssl_csr_pipe.py validate-modules:invalid-documentation
plugins/modules/openssl_privatekey_info.py validate-modules:invalid-documentation
plugins/modules/openssl_publickey_info.py validate-modules:invalid-documentation
+plugins/modules/x509_certificate_convert.py validate-modules:invalid-documentation
plugins/modules/x509_certificate_info.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:invalid-documentation
plugins/modules/x509_crl_info.py validate-modules:invalid-documentation
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.14.txt b/ansible_collections/community/crypto/tests/sanity/ignore-2.14.txt
index 74ca94712..389b3f533 100644
--- a/ansible_collections/community/crypto/tests/sanity/ignore-2.14.txt
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.14.txt
@@ -8,6 +8,7 @@ plugins/modules/openssl_csr_info.py validate-modules:invalid-documentation
plugins/modules/openssl_csr_pipe.py validate-modules:invalid-documentation
plugins/modules/openssl_privatekey_info.py validate-modules:invalid-documentation
plugins/modules/openssl_publickey_info.py validate-modules:invalid-documentation
+plugins/modules/x509_certificate_convert.py validate-modules:invalid-documentation
plugins/modules/x509_certificate_info.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:invalid-documentation
plugins/modules/x509_crl_info.py validate-modules:invalid-documentation
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt b/ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt
new file mode 100644
index 000000000..9ffe1e998
--- /dev/null
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt
@@ -0,0 +1,2 @@
+tests/ee/roles/smoke/library/smoke_ipaddress.py shebang
+tests/ee/roles/smoke/library/smoke_pyyaml.py shebang
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt.license b/ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt.license
new file mode 100644
index 000000000..edff8c768
--- /dev/null
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.18.txt.license
@@ -0,0 +1,3 @@
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+SPDX-FileCopyrightText: Ansible Project
diff --git a/ansible_collections/community/crypto/tests/sanity/ignore-2.9.txt b/ansible_collections/community/crypto/tests/sanity/ignore-2.9.txt
index e20c4e5f3..c5b2bb0bf 100644
--- a/ansible_collections/community/crypto/tests/sanity/ignore-2.9.txt
+++ b/ansible_collections/community/crypto/tests/sanity/ignore-2.9.txt
@@ -14,6 +14,7 @@ plugins/modules/openssl_csr_info.py validate-modules:invalid-documentation
plugins/modules/openssl_csr_pipe.py validate-modules:invalid-documentation
plugins/modules/openssl_privatekey_info.py validate-modules:invalid-documentation
plugins/modules/openssl_publickey_info.py validate-modules:invalid-documentation
+plugins/modules/x509_certificate_convert.py validate-modules:invalid-documentation
plugins/modules/x509_certificate_info.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:invalid-documentation
plugins/modules/x509_crl.py validate-modules:return-syntax-error
diff --git a/ansible_collections/community/dns/.github/workflows/ansible-test.yml b/ansible_collections/community/dns/.github/workflows/ansible-test.yml
index 7ed813e13..186079a41 100644
--- a/ansible_collections/community/dns/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/dns/.github/workflows/ansible-test.yml
@@ -37,6 +37,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
# Ansible-test on various stable branches does not yet work well with cgroups v2.
# Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04
@@ -78,6 +79,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
steps:
@@ -111,7 +113,6 @@ jobs:
ansible:
- devel
python:
- - 3.7
- 3.8
- 3.9
- "3.10"
@@ -150,6 +151,11 @@ jobs:
python: "3.6"
- ansible: stable-2.16
python: "3.11"
+ # 2.17
+ - ansible: stable-2.17
+ python: "3.7"
+ - ansible: stable-2.17
+ python: "3.12"
steps:
- name: >-
diff --git a/ansible_collections/community/dns/.github/workflows/docs-pr.yml b/ansible_collections/community/dns/.github/workflows/docs-pr.yml
index cc71d2492..63c021d46 100644
--- a/ansible_collections/community/dns/.github/workflows/docs-pr.yml
+++ b/ansible_collections/community/dns/.github/workflows/docs-pr.yml
@@ -32,6 +32,7 @@ jobs:
init-extra-html-theme-options: |
documentation_home_url=https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/branch/main/
render-file-line: '> * `$<status>` [$<path_tail>](https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr/${{ github.event.number }}/$<path_tail>)'
+ extra-collections: community.library_inventory_filtering_v1
publish-docs-gh-pages:
# for now we won't run this on forks
diff --git a/ansible_collections/community/dns/.github/workflows/docs-push.yml b/ansible_collections/community/dns/.github/workflows/docs-push.yml
index 85274e17d..f03ef77fb 100644
--- a/ansible_collections/community/dns/.github/workflows/docs-push.yml
+++ b/ansible_collections/community/dns/.github/workflows/docs-push.yml
@@ -37,6 +37,7 @@ jobs:
init-html-short-title: Community.Dns Collection Docs
init-extra-html-theme-options: |
documentation_home_url=https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/branch/main/
+ extra-collections: community.library_inventory_filtering_v1
publish-docs-gh-pages:
# for now we won't run this on forks
diff --git a/ansible_collections/community/dns/CHANGELOG.md b/ansible_collections/community/dns/CHANGELOG.md
index fbce77c60..9881ee7ed 100644
--- a/ansible_collections/community/dns/CHANGELOG.md
+++ b/ansible_collections/community/dns/CHANGELOG.md
@@ -2,188 +2,216 @@
**Topics**
-- <a href="#v2-8-3">v2\.8\.3</a>
+- <a href="#v2-9-0">v2\.9\.0</a>
- <a href="#release-summary">Release Summary</a>
- <a href="#bugfixes">Bugfixes</a>
-- <a href="#v2-8-2">v2\.8\.2</a>
+ - <a href="#new-plugins">New Plugins</a>
+ - <a href="#filter">Filter</a>
+- <a href="#v2-8-3">v2\.8\.3</a>
- <a href="#release-summary-1">Release Summary</a>
- - <a href="#security-fixes">Security Fixes</a>
- <a href="#bugfixes-1">Bugfixes</a>
-- <a href="#v2-8-1">v2\.8\.1</a>
+- <a href="#v2-8-2">v2\.8\.2</a>
- <a href="#release-summary-2">Release Summary</a>
+ - <a href="#security-fixes">Security Fixes</a>
- <a href="#bugfixes-2">Bugfixes</a>
-- <a href="#v2-8-0">v2\.8\.0</a>
+- <a href="#v2-8-1">v2\.8\.1</a>
- <a href="#release-summary-3">Release Summary</a>
- - <a href="#minor-changes">Minor Changes</a>
- - <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-3">Bugfixes</a>
-- <a href="#v2-7-0">v2\.7\.0</a>
+- <a href="#v2-8-0">v2\.8\.0</a>
- <a href="#release-summary-4">Release Summary</a>
- - <a href="#minor-changes-1">Minor Changes</a>
+ - <a href="#minor-changes">Minor Changes</a>
+ - <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-4">Bugfixes</a>
-- <a href="#v2-6-4">v2\.6\.4</a>
+- <a href="#v2-7-0">v2\.7\.0</a>
- <a href="#release-summary-5">Release Summary</a>
+ - <a href="#minor-changes-1">Minor Changes</a>
- <a href="#bugfixes-5">Bugfixes</a>
-- <a href="#v2-6-3">v2\.6\.3</a>
+- <a href="#v2-6-4">v2\.6\.4</a>
- <a href="#release-summary-6">Release Summary</a>
- <a href="#bugfixes-6">Bugfixes</a>
-- <a href="#v2-6-2">v2\.6\.2</a>
+- <a href="#v2-6-3">v2\.6\.3</a>
- <a href="#release-summary-7">Release Summary</a>
- <a href="#bugfixes-7">Bugfixes</a>
-- <a href="#v2-6-1">v2\.6\.1</a>
+- <a href="#v2-6-2">v2\.6\.2</a>
- <a href="#release-summary-8">Release Summary</a>
- <a href="#bugfixes-8">Bugfixes</a>
-- <a href="#v2-6-0">v2\.6\.0</a>
+- <a href="#v2-6-1">v2\.6\.1</a>
- <a href="#release-summary-9">Release Summary</a>
- - <a href="#minor-changes-2">Minor Changes</a>
- <a href="#bugfixes-9">Bugfixes</a>
- - <a href="#new-plugins">New Plugins</a>
+- <a href="#v2-6-0">v2\.6\.0</a>
+ - <a href="#release-summary-10">Release Summary</a>
+ - <a href="#minor-changes-2">Minor Changes</a>
+ - <a href="#bugfixes-10">Bugfixes</a>
+ - <a href="#new-plugins-1">New Plugins</a>
- <a href="#lookup">Lookup</a>
- <a href="#new-modules">New Modules</a>
- <a href="#v2-5-7">v2\.5\.7</a>
- - <a href="#release-summary-10">Release Summary</a>
- - <a href="#bugfixes-10">Bugfixes</a>
-- <a href="#v2-5-6">v2\.5\.6</a>
- <a href="#release-summary-11">Release Summary</a>
+ - <a href="#bugfixes-11">Bugfixes</a>
+- <a href="#v2-5-6">v2\.5\.6</a>
+ - <a href="#release-summary-12">Release Summary</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#v2-5-5">v2\.5\.5</a>
- - <a href="#release-summary-12">Release Summary</a>
- - <a href="#bugfixes-11">Bugfixes</a>
-- <a href="#v2-5-4">v2\.5\.4</a>
- <a href="#release-summary-13">Release Summary</a>
- <a href="#bugfixes-12">Bugfixes</a>
-- <a href="#v2-5-3">v2\.5\.3</a>
+- <a href="#v2-5-4">v2\.5\.4</a>
- <a href="#release-summary-14">Release Summary</a>
- <a href="#bugfixes-13">Bugfixes</a>
-- <a href="#v2-5-2">v2\.5\.2</a>
+- <a href="#v2-5-3">v2\.5\.3</a>
- <a href="#release-summary-15">Release Summary</a>
- <a href="#bugfixes-14">Bugfixes</a>
-- <a href="#v2-5-1">v2\.5\.1</a>
+- <a href="#v2-5-2">v2\.5\.2</a>
- <a href="#release-summary-16">Release Summary</a>
- <a href="#bugfixes-15">Bugfixes</a>
-- <a href="#v2-5-0">v2\.5\.0</a>
+- <a href="#v2-5-1">v2\.5\.1</a>
- <a href="#release-summary-17">Release Summary</a>
- - <a href="#minor-changes-3">Minor Changes</a>
- - <a href="#deprecated-features-1">Deprecated Features</a>
- <a href="#bugfixes-16">Bugfixes</a>
-- <a href="#v2-4-2">v2\.4\.2</a>
+- <a href="#v2-5-0">v2\.5\.0</a>
- <a href="#release-summary-18">Release Summary</a>
+ - <a href="#minor-changes-3">Minor Changes</a>
+ - <a href="#deprecated-features-1">Deprecated Features</a>
- <a href="#bugfixes-17">Bugfixes</a>
-- <a href="#v2-4-1">v2\.4\.1</a>
+- <a href="#v2-4-2">v2\.4\.2</a>
- <a href="#release-summary-19">Release Summary</a>
- <a href="#bugfixes-18">Bugfixes</a>
-- <a href="#v2-4-0">v2\.4\.0</a>
+- <a href="#v2-4-1">v2\.4\.1</a>
- <a href="#release-summary-20">Release Summary</a>
- - <a href="#minor-changes-4">Minor Changes</a>
- <a href="#bugfixes-19">Bugfixes</a>
-- <a href="#v2-3-4">v2\.3\.4</a>
+- <a href="#v2-4-0">v2\.4\.0</a>
- <a href="#release-summary-21">Release Summary</a>
+ - <a href="#minor-changes-4">Minor Changes</a>
- <a href="#bugfixes-20">Bugfixes</a>
-- <a href="#v2-3-3">v2\.3\.3</a>
+- <a href="#v2-3-4">v2\.3\.4</a>
- <a href="#release-summary-22">Release Summary</a>
- <a href="#bugfixes-21">Bugfixes</a>
-- <a href="#v2-3-2">v2\.3\.2</a>
+- <a href="#v2-3-3">v2\.3\.3</a>
- <a href="#release-summary-23">Release Summary</a>
- <a href="#bugfixes-22">Bugfixes</a>
-- <a href="#v2-3-1">v2\.3\.1</a>
+- <a href="#v2-3-2">v2\.3\.2</a>
- <a href="#release-summary-24">Release Summary</a>
- - <a href="#minor-changes-5">Minor Changes</a>
- <a href="#bugfixes-23">Bugfixes</a>
-- <a href="#v2-3-0">v2\.3\.0</a>
+- <a href="#v2-3-1">v2\.3\.1</a>
- <a href="#release-summary-25">Release Summary</a>
- - <a href="#minor-changes-6">Minor Changes</a>
+ - <a href="#minor-changes-5">Minor Changes</a>
- <a href="#bugfixes-24">Bugfixes</a>
-- <a href="#v2-2-1">v2\.2\.1</a>
+- <a href="#v2-3-0">v2\.3\.0</a>
- <a href="#release-summary-26">Release Summary</a>
+ - <a href="#minor-changes-6">Minor Changes</a>
- <a href="#bugfixes-25">Bugfixes</a>
-- <a href="#v2-2-0">v2\.2\.0</a>
+- <a href="#v2-2-1">v2\.2\.1</a>
- <a href="#release-summary-27">Release Summary</a>
- - <a href="#minor-changes-7">Minor Changes</a>
- <a href="#bugfixes-26">Bugfixes</a>
-- <a href="#v2-1-1">v2\.1\.1</a>
+- <a href="#v2-2-0">v2\.2\.0</a>
- <a href="#release-summary-28">Release Summary</a>
+ - <a href="#minor-changes-7">Minor Changes</a>
- <a href="#bugfixes-27">Bugfixes</a>
-- <a href="#v2-1-0">v2\.1\.0</a>
+- <a href="#v2-1-1">v2\.1\.1</a>
- <a href="#release-summary-29">Release Summary</a>
- - <a href="#minor-changes-8">Minor Changes</a>
- <a href="#bugfixes-28">Bugfixes</a>
-- <a href="#v2-0-9">v2\.0\.9</a>
+- <a href="#v2-1-0">v2\.1\.0</a>
- <a href="#release-summary-30">Release Summary</a>
+ - <a href="#minor-changes-8">Minor Changes</a>
- <a href="#bugfixes-29">Bugfixes</a>
-- <a href="#v2-0-8">v2\.0\.8</a>
+- <a href="#v2-0-9">v2\.0\.9</a>
- <a href="#release-summary-31">Release Summary</a>
- <a href="#bugfixes-30">Bugfixes</a>
-- <a href="#v2-0-7">v2\.0\.7</a>
+- <a href="#v2-0-8">v2\.0\.8</a>
- <a href="#release-summary-32">Release Summary</a>
- <a href="#bugfixes-31">Bugfixes</a>
-- <a href="#v2-0-6">v2\.0\.6</a>
+- <a href="#v2-0-7">v2\.0\.7</a>
- <a href="#release-summary-33">Release Summary</a>
- <a href="#bugfixes-32">Bugfixes</a>
-- <a href="#v2-0-5">v2\.0\.5</a>
+- <a href="#v2-0-6">v2\.0\.6</a>
- <a href="#release-summary-34">Release Summary</a>
- <a href="#bugfixes-33">Bugfixes</a>
-- <a href="#v2-0-4">v2\.0\.4</a>
+- <a href="#v2-0-5">v2\.0\.5</a>
- <a href="#release-summary-35">Release Summary</a>
- <a href="#bugfixes-34">Bugfixes</a>
-- <a href="#v2-0-3">v2\.0\.3</a>
+- <a href="#v2-0-4">v2\.0\.4</a>
- <a href="#release-summary-36">Release Summary</a>
+ - <a href="#bugfixes-35">Bugfixes</a>
+- <a href="#v2-0-3">v2\.0\.3</a>
+ - <a href="#release-summary-37">Release Summary</a>
- <a href="#minor-changes-9">Minor Changes</a>
- <a href="#v2-0-2">v2\.0\.2</a>
- - <a href="#release-summary-37">Release Summary</a>
- - <a href="#bugfixes-35">Bugfixes</a>
-- <a href="#v2-0-1">v2\.0\.1</a>
- <a href="#release-summary-38">Release Summary</a>
- <a href="#bugfixes-36">Bugfixes</a>
-- <a href="#v2-0-0">v2\.0\.0</a>
+- <a href="#v2-0-1">v2\.0\.1</a>
- <a href="#release-summary-39">Release Summary</a>
+ - <a href="#bugfixes-37">Bugfixes</a>
+- <a href="#v2-0-0">v2\.0\.0</a>
+ - <a href="#release-summary-40">Release Summary</a>
- <a href="#minor-changes-10">Minor Changes</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- <a href="#deprecated-features-2">Deprecated Features</a>
- - <a href="#bugfixes-37">Bugfixes</a>
- - <a href="#new-plugins-1">New Plugins</a>
+ - <a href="#bugfixes-38">Bugfixes</a>
+ - <a href="#new-plugins-2">New Plugins</a>
- <a href="#inventory">Inventory</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#v1-2-0">v1\.2\.0</a>
- - <a href="#release-summary-40">Release Summary</a>
- - <a href="#minor-changes-11">Minor Changes</a>
- - <a href="#bugfixes-38">Bugfixes</a>
-- <a href="#v1-1-0">v1\.1\.0</a>
- <a href="#release-summary-41">Release Summary</a>
- - <a href="#minor-changes-12">Minor Changes</a>
+ - <a href="#minor-changes-11">Minor Changes</a>
- <a href="#bugfixes-39">Bugfixes</a>
-- <a href="#v1-0-1">v1\.0\.1</a>
+- <a href="#v1-1-0">v1\.1\.0</a>
- <a href="#release-summary-42">Release Summary</a>
+ - <a href="#minor-changes-12">Minor Changes</a>
- <a href="#bugfixes-40">Bugfixes</a>
-- <a href="#v1-0-0">v1\.0\.0</a>
+- <a href="#v1-0-1">v1\.0\.1</a>
- <a href="#release-summary-43">Release Summary</a>
- <a href="#bugfixes-41">Bugfixes</a>
-- <a href="#v0-3-0">v0\.3\.0</a>
+- <a href="#v1-0-0">v1\.0\.0</a>
- <a href="#release-summary-44">Release Summary</a>
- - <a href="#minor-changes-13">Minor Changes</a>
- <a href="#bugfixes-42">Bugfixes</a>
+- <a href="#v0-3-0">v0\.3\.0</a>
+ - <a href="#release-summary-45">Release Summary</a>
+ - <a href="#minor-changes-13">Minor Changes</a>
+ - <a href="#bugfixes-43">Bugfixes</a>
- <a href="#new-modules-2">New Modules</a>
- <a href="#v0-2-0">v0\.2\.0</a>
- - <a href="#release-summary-45">Release Summary</a>
+ - <a href="#release-summary-46">Release Summary</a>
- <a href="#major-changes">Major Changes</a>
- <a href="#minor-changes-14">Minor Changes</a>
- <a href="#breaking-changes--porting-guide-1">Breaking Changes / Porting Guide</a>
- - <a href="#bugfixes-43">Bugfixes</a>
+ - <a href="#bugfixes-44">Bugfixes</a>
- <a href="#new-modules-3">New Modules</a>
- <a href="#v0-1-0">v0\.1\.0</a>
- - <a href="#release-summary-46">Release Summary</a>
- - <a href="#new-plugins-2">New Plugins</a>
- - <a href="#filter">Filter</a>
+ - <a href="#release-summary-47">Release Summary</a>
+ - <a href="#new-plugins-3">New Plugins</a>
+ - <a href="#filter-1">Filter</a>
- <a href="#new-modules-4">New Modules</a>
+<a id="v2-9-0"></a>
+## v2\.9\.0
+
+<a id="release-summary"></a>
+### Release Summary
+
+Feature and bugfix release\.
+
+<a id="bugfixes"></a>
+### Bugfixes
+
+* Update Public Suffix List\.
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \([https\://github\.com/ansible\-collections/community\.dns/pull/197](https\://github\.com/ansible\-collections/community\.dns/pull/197)\)\.
+
+<a id="new-plugins"></a>
+### New Plugins
+
+<a id="filter"></a>
+#### Filter
+
+* community\.dns\.quote\_txt \- Quotes a string to use as a TXT record entry
+* community\.dns\.unquote\_txt \- Unquotes a TXT record entry to a string
+
<a id="v2-8-3"></a>
## v2\.8\.3
-<a id="release-summary"></a>
+<a id="release-summary-1"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes"></a>
+<a id="bugfixes-1"></a>
### Bugfixes
* DNS record modules\, inventory plugins \- fix the TXT entry encoder to avoid splitting up escape sequences for quotes and backslashes over multiple TXT strings \([https\://github\.com/ansible\-collections/community\.dns/issues/190](https\://github\.com/ansible\-collections/community\.dns/issues/190)\, [https\://github\.com/ansible\-collections/community\.dns/pull/191](https\://github\.com/ansible\-collections/community\.dns/pull/191)\)\.
@@ -192,7 +220,7 @@ Bugfix release\.
<a id="v2-8-2"></a>
## v2\.8\.2
-<a id="release-summary-1"></a>
+<a id="release-summary-2"></a>
### Release Summary
Bugfix release\.
@@ -202,7 +230,7 @@ Bugfix release\.
* hosttech\_dns\_records and hetzner\_dns\_records inventory plugins \- make sure all data received from the remote servers is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.dns/pull/189](https\://github\.com/ansible\-collections/community\.dns/pull/189)\)\.
-<a id="bugfixes-1"></a>
+<a id="bugfixes-2"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -210,12 +238,12 @@ Bugfix release\.
<a id="v2-8-1"></a>
## v2\.8\.1
-<a id="release-summary-2"></a>
+<a id="release-summary-3"></a>
### Release Summary
Maintenance release with updated PSL\.
-<a id="bugfixes-2"></a>
+<a id="bugfixes-3"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -223,7 +251,7 @@ Maintenance release with updated PSL\.
<a id="v2-8-0"></a>
## v2\.8\.0
-<a id="release-summary-3"></a>
+<a id="release-summary-4"></a>
### Release Summary
Feature and maintenance release with updated PSL\.
@@ -238,7 +266,7 @@ Feature and maintenance release with updated PSL\.
* hetzner\_dns\_records and hosttech\_dns\_records inventory plugins \- the <code>filters</code> option has been renamed to <code>simple\_filters</code>\. The old name will stop working in community\.hrobot 2\.0\.0 \([https\://github\.com/ansible\-collections/community\.dns/pull/181](https\://github\.com/ansible\-collections/community\.dns/pull/181)\)\.
-<a id="bugfixes-3"></a>
+<a id="bugfixes-4"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -246,7 +274,7 @@ Feature and maintenance release with updated PSL\.
<a id="v2-7-0"></a>
## v2\.7\.0
-<a id="release-summary-4"></a>
+<a id="release-summary-5"></a>
### Release Summary
Bugfix and feature release with updated PSL\.
@@ -257,7 +285,7 @@ Bugfix and feature release with updated PSL\.
* nameserver\_info and nameserver\_record\_info \- add <code>server</code> parameter to specify custom DNS servers \([https\://github\.com/ansible\-collections/community\.dns/pull/168](https\://github\.com/ansible\-collections/community\.dns/pull/168)\, [https\://github\.com/ansible\-collections/community\.dns/pull/178](https\://github\.com/ansible\-collections/community\.dns/pull/178)\)\.
* wait\_for\_txt \- add <code>server</code> parameter to specify custom DNS servers \([https\://github\.com/ansible\-collections/community\.dns/pull/178](https\://github\.com/ansible\-collections/community\.dns/pull/178)\)\.
-<a id="bugfixes-4"></a>
+<a id="bugfixes-5"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -266,12 +294,12 @@ Bugfix and feature release with updated PSL\.
<a id="v2-6-4"></a>
## v2\.6\.4
-<a id="release-summary-5"></a>
+<a id="release-summary-6"></a>
### Release Summary
Bugfix and maintenance version\.
-<a id="bugfixes-5"></a>
+<a id="bugfixes-6"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -280,12 +308,12 @@ Bugfix and maintenance version\.
<a id="v2-6-3"></a>
## v2\.6\.3
-<a id="release-summary-6"></a>
+<a id="release-summary-7"></a>
### Release Summary
Maintenance release with updated PSL\.
-<a id="bugfixes-6"></a>
+<a id="bugfixes-7"></a>
### Bugfixes
* HTTP module utils \- make compatible with ansible\-core 2\.17 \([https\://github\.com/ansible\-collections/community\.dns/pull/165](https\://github\.com/ansible\-collections/community\.dns/pull/165)\)\.
@@ -294,12 +322,12 @@ Maintenance release with updated PSL\.
<a id="v2-6-2"></a>
## v2\.6\.2
-<a id="release-summary-7"></a>
+<a id="release-summary-8"></a>
### Release Summary
Maintenance release with updated PSL\.
-<a id="bugfixes-7"></a>
+<a id="bugfixes-8"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -307,12 +335,12 @@ Maintenance release with updated PSL\.
<a id="v2-6-1"></a>
## v2\.6\.1
-<a id="release-summary-8"></a>
+<a id="release-summary-9"></a>
### Release Summary
Maintenance release with updated PSL\.
-<a id="bugfixes-8"></a>
+<a id="bugfixes-9"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -320,7 +348,7 @@ Maintenance release with updated PSL\.
<a id="v2-6-0"></a>
## v2\.6\.0
-<a id="release-summary-9"></a>
+<a id="release-summary-10"></a>
### Release Summary
Feature release with an updated Public Suffix List\.
@@ -331,13 +359,13 @@ Feature release with an updated Public Suffix List\.
* wait\_for\_txt \- add <code>servfail\_retries</code> parameter that allows retrying after SERVFAIL errors \([https\://github\.com/ansible\-collections/community\.dns/pull/159](https\://github\.com/ansible\-collections/community\.dns/pull/159)\)\.
* wait\_for\_txt\, resolver module utils \- use [EDNS](https\://en\.wikipedia\.org/wiki/Extension\_Mechanisms\_for\_DNS) \([https\://github\.com/ansible\-collections/community\.dns/pull/158](https\://github\.com/ansible\-collections/community\.dns/pull/158)\)\.
-<a id="bugfixes-9"></a>
+<a id="bugfixes-10"></a>
### Bugfixes
* Update Public Suffix List\.
* wait\_for\_txt\, resolver module utils \- improve error handling \([https\://github\.com/ansible\-collections/community\.dns/pull/158](https\://github\.com/ansible\-collections/community\.dns/pull/158)\)\.
-<a id="new-plugins"></a>
+<a id="new-plugins-1"></a>
### New Plugins
<a id="lookup"></a>
@@ -355,12 +383,12 @@ Feature release with an updated Public Suffix List\.
<a id="v2-5-7"></a>
## v2\.5\.7
-<a id="release-summary-10"></a>
+<a id="release-summary-11"></a>
### Release Summary
Regular maintenance release with updated Public Suffix List\.
-<a id="bugfixes-10"></a>
+<a id="bugfixes-11"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -368,7 +396,7 @@ Regular maintenance release with updated Public Suffix List\.
<a id="v2-5-6"></a>
## v2\.5\.6
-<a id="release-summary-11"></a>
+<a id="release-summary-12"></a>
### Release Summary
Maintenance release\.
@@ -389,12 +417,12 @@ for the rendered HTML version of the documentation of the latest release\.
<a id="v2-5-5"></a>
## v2\.5\.5
-<a id="release-summary-12"></a>
+<a id="release-summary-13"></a>
### Release Summary
Maintenance release with updated PSL\.
-<a id="bugfixes-11"></a>
+<a id="bugfixes-12"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -402,12 +430,12 @@ Maintenance release with updated PSL\.
<a id="v2-5-4"></a>
## v2\.5\.4
-<a id="release-summary-13"></a>
+<a id="release-summary-14"></a>
### Release Summary
Maintenance release with updated PSL\.
-<a id="bugfixes-12"></a>
+<a id="bugfixes-13"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -415,12 +443,12 @@ Maintenance release with updated PSL\.
<a id="v2-5-3"></a>
## v2\.5\.3
-<a id="release-summary-14"></a>
+<a id="release-summary-15"></a>
### Release Summary
Maintenance release with updated PSL\.
-<a id="bugfixes-13"></a>
+<a id="bugfixes-14"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -428,12 +456,12 @@ Maintenance release with updated PSL\.
<a id="v2-5-2"></a>
## v2\.5\.2
-<a id="release-summary-15"></a>
+<a id="release-summary-16"></a>
### Release Summary
Maintenance release with improved documentation and updated PSL\.
-<a id="bugfixes-14"></a>
+<a id="bugfixes-15"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -441,12 +469,12 @@ Maintenance release with improved documentation and updated PSL\.
<a id="v2-5-1"></a>
## v2\.5\.1
-<a id="release-summary-16"></a>
+<a id="release-summary-17"></a>
### Release Summary
Maintenance release \(updated PSL\)\.
-<a id="bugfixes-15"></a>
+<a id="bugfixes-16"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -454,7 +482,7 @@ Maintenance release \(updated PSL\)\.
<a id="v2-5-0"></a>
## v2\.5\.0
-<a id="release-summary-17"></a>
+<a id="release-summary-18"></a>
### Release Summary
Feature and bugfix release with updated PSL\.
@@ -470,7 +498,7 @@ Feature and bugfix release with updated PSL\.
* The default of the newly added option <code>txt\_character\_encoding</code> will change from <code>octal</code> to <code>decimal</code> in community\.dns 3\.0\.0\. The new default will be compatible with [RFC 1035](https\://www\.ietf\.org/rfc/rfc1035\.txt) \([https\://github\.com/ansible\-collections/community\.dns/pull/134](https\://github\.com/ansible\-collections/community\.dns/pull/134)\)\.
-<a id="bugfixes-16"></a>
+<a id="bugfixes-17"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -479,12 +507,12 @@ Feature and bugfix release with updated PSL\.
<a id="v2-4-2"></a>
## v2\.4\.2
-<a id="release-summary-18"></a>
+<a id="release-summary-19"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-17"></a>
+<a id="bugfixes-18"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -492,12 +520,12 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-4-1"></a>
## v2\.4\.1
-<a id="release-summary-19"></a>
+<a id="release-summary-20"></a>
### Release Summary
Regular maintenance release\.
-<a id="bugfixes-18"></a>
+<a id="bugfixes-19"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -506,7 +534,7 @@ Regular maintenance release\.
<a id="v2-4-0"></a>
## v2\.4\.0
-<a id="release-summary-20"></a>
+<a id="release-summary-21"></a>
### Release Summary
Feature and maintenance release\.
@@ -518,7 +546,7 @@ Feature and maintenance release\.
* Added a <code>community\.dns\.hosttech</code> module defaults group / action group\. Use with <code>group/community\.dns\.hosttech</code> to provide options for all Hosttech DNS modules \([https\://github\.com/ansible\-collections/community\.dns/pull/119](https\://github\.com/ansible\-collections/community\.dns/pull/119)\)\.
* wait\_for\_txt \- the module now supports check mode\. The only practical change in behavior is that in check mode\, the module is now executed instead of skipped\. Since the module does not change anything\, it should have been marked as supporting check mode since it was originally added \([https\://github\.com/ansible\-collections/community\.dns/pull/119](https\://github\.com/ansible\-collections/community\.dns/pull/119)\)\.
-<a id="bugfixes-19"></a>
+<a id="bugfixes-20"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -526,12 +554,12 @@ Feature and maintenance release\.
<a id="v2-3-4"></a>
## v2\.3\.4
-<a id="release-summary-21"></a>
+<a id="release-summary-22"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-20"></a>
+<a id="bugfixes-21"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -539,12 +567,12 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-3-3"></a>
## v2\.3\.3
-<a id="release-summary-22"></a>
+<a id="release-summary-23"></a>
### Release Summary
Maintenance release including an updated Public Suffix List\.
-<a id="bugfixes-21"></a>
+<a id="bugfixes-22"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -552,12 +580,12 @@ Maintenance release including an updated Public Suffix List\.
<a id="v2-3-2"></a>
## v2\.3\.2
-<a id="release-summary-23"></a>
+<a id="release-summary-24"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-22"></a>
+<a id="bugfixes-23"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -565,7 +593,7 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-3-1"></a>
## v2\.3\.1
-<a id="release-summary-24"></a>
+<a id="release-summary-25"></a>
### Release Summary
Maintenance release including an updated Public Suffix List\.
@@ -575,7 +603,7 @@ Maintenance release including an updated Public Suffix List\.
* The collection repository conforms to the [REUSE specification](https\://reuse\.software/spec/) except for the changelog fragments \([https\://github\.com/ansible\-collections/community\.dns/pull/112](https\://github\.com/ansible\-collections/community\.dns/pull/112)\)\.
-<a id="bugfixes-23"></a>
+<a id="bugfixes-24"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -583,7 +611,7 @@ Maintenance release including an updated Public Suffix List\.
<a id="v2-3-0"></a>
## v2\.3\.0
-<a id="release-summary-25"></a>
+<a id="release-summary-26"></a>
### Release Summary
Maintenance release including an updated Public Suffix List\.
@@ -593,7 +621,7 @@ Maintenance release including an updated Public Suffix List\.
* All software licenses are now in the <code>LICENSES/</code> directory of the collection root\. Moreover\, <code>SPDX\-License\-Identifier\:</code> is used to declare the applicable license for every file that is not automatically generated \([https\://github\.com/ansible\-collections/community\.dns/pull/109](https\://github\.com/ansible\-collections/community\.dns/pull/109)\)\.
-<a id="bugfixes-24"></a>
+<a id="bugfixes-25"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -601,12 +629,12 @@ Maintenance release including an updated Public Suffix List\.
<a id="v2-2-1"></a>
## v2\.2\.1
-<a id="release-summary-26"></a>
+<a id="release-summary-27"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-25"></a>
+<a id="bugfixes-26"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -614,7 +642,7 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-2-0"></a>
## v2\.2\.0
-<a id="release-summary-27"></a>
+<a id="release-summary-28"></a>
### Release Summary
Feature release\.
@@ -625,7 +653,7 @@ Feature release\.
* hetzner\_dns\_records and hosttech\_dns\_records inventory plugins \- allow to template provider\-specific credentials and the <code>zone\_name</code>\, <code>zone\_id</code> options \([https\://github\.com/ansible\-collections/community\.dns/pull/106](https\://github\.com/ansible\-collections/community\.dns/pull/106)\)\.
* wait\_for\_txt \- improve error messages so that in case of SERVFAILs or other DNS errors it is clear which record was queried from which DNS server \([https\://github\.com/ansible\-collections/community\.dns/pull/105](https\://github\.com/ansible\-collections/community\.dns/pull/105)\)\.
-<a id="bugfixes-26"></a>
+<a id="bugfixes-27"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -633,12 +661,12 @@ Feature release\.
<a id="v2-1-1"></a>
## v2\.1\.1
-<a id="release-summary-28"></a>
+<a id="release-summary-29"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-27"></a>
+<a id="bugfixes-28"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -646,7 +674,7 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-1-0"></a>
## v2\.1\.0
-<a id="release-summary-29"></a>
+<a id="release-summary-30"></a>
### Release Summary
Feature and maintenance release with updated PSL\.
@@ -656,7 +684,7 @@ Feature and maintenance release with updated PSL\.
* Prepare collection for inclusion in an Execution Environment by declaring its dependencies \([https\://github\.com/ansible\-collections/community\.dns/pull/93](https\://github\.com/ansible\-collections/community\.dns/pull/93)\)\.
-<a id="bugfixes-28"></a>
+<a id="bugfixes-29"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -664,12 +692,12 @@ Feature and maintenance release with updated PSL\.
<a id="v2-0-9"></a>
## v2\.0\.9
-<a id="release-summary-30"></a>
+<a id="release-summary-31"></a>
### Release Summary
Maintenance release with updated Public Suffix List and added collection links file\.
-<a id="bugfixes-29"></a>
+<a id="bugfixes-30"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -677,12 +705,12 @@ Maintenance release with updated Public Suffix List and added collection links f
<a id="v2-0-8"></a>
## v2\.0\.8
-<a id="release-summary-31"></a>
+<a id="release-summary-32"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-30"></a>
+<a id="bugfixes-31"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -690,12 +718,12 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-0-7"></a>
## v2\.0\.7
-<a id="release-summary-32"></a>
+<a id="release-summary-33"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-31"></a>
+<a id="bugfixes-32"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -703,12 +731,12 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-0-6"></a>
## v2\.0\.6
-<a id="release-summary-33"></a>
+<a id="release-summary-34"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-32"></a>
+<a id="bugfixes-33"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -717,12 +745,12 @@ Bugfix release\.
<a id="v2-0-5"></a>
## v2\.0\.5
-<a id="release-summary-34"></a>
+<a id="release-summary-35"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-33"></a>
+<a id="bugfixes-34"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -730,12 +758,12 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-0-4"></a>
## v2\.0\.4
-<a id="release-summary-35"></a>
+<a id="release-summary-36"></a>
### Release Summary
Maintenance release with updated Public Suffix List\.
-<a id="bugfixes-34"></a>
+<a id="bugfixes-35"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -743,7 +771,7 @@ Maintenance release with updated Public Suffix List\.
<a id="v2-0-3"></a>
## v2\.0\.3
-<a id="release-summary-36"></a>
+<a id="release-summary-37"></a>
### Release Summary
Bugfix release\.
@@ -756,12 +784,12 @@ Bugfix release\.
<a id="v2-0-2"></a>
## v2\.0\.2
-<a id="release-summary-37"></a>
+<a id="release-summary-38"></a>
### Release Summary
Regular maintenance release\.
-<a id="bugfixes-35"></a>
+<a id="bugfixes-36"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -769,12 +797,12 @@ Regular maintenance release\.
<a id="v2-0-1"></a>
## v2\.0\.1
-<a id="release-summary-38"></a>
+<a id="release-summary-39"></a>
### Release Summary
Maintenance release with Public Suffix List updates\.
-<a id="bugfixes-36"></a>
+<a id="bugfixes-37"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -782,7 +810,7 @@ Maintenance release with Public Suffix List updates\.
<a id="v2-0-0"></a>
## v2\.0\.0
-<a id="release-summary-39"></a>
+<a id="release-summary-40"></a>
### Release Summary
This release contains many new features\, modules and plugins\, but also has several breaking changes to the 1\.x\.y versions\. Please read the changelog carefully to determine what to change if you used an earlier version of this collection\.
@@ -822,7 +850,7 @@ This release contains many new features\, modules and plugins\, but also has sev
* The hosttech\_dns\_records module has been renamed to hosttech\_dns\_record\_sets\. The old name will stop working in community\.dns 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.dns/pull/31](https\://github\.com/ansible\-collections/community\.dns/pull/31)\)\.
-<a id="bugfixes-37"></a>
+<a id="bugfixes-38"></a>
### Bugfixes
* Hetzner API \- interpret missing TTL as 300\, which is what the web console also does \([https\://github\.com/ansible\-collections/community\.dns/pull/42](https\://github\.com/ansible\-collections/community\.dns/pull/42)\)\.
@@ -834,7 +862,7 @@ This release contains many new features\, modules and plugins\, but also has sev
* wait\_for\_txt \- fix handling of too long TXT values \([https\://github\.com/ansible\-collections/community\.dns/pull/65](https\://github\.com/ansible\-collections/community\.dns/pull/65)\)\.
* wait\_for\_txt \- resolving nameservers sometimes resulted in an empty list\, yielding wrong results \([https\://github\.com/ansible\-collections/community\.dns/pull/64](https\://github\.com/ansible\-collections/community\.dns/pull/64)\)\.
-<a id="new-plugins-1"></a>
+<a id="new-plugins-2"></a>
### New Plugins
<a id="inventory"></a>
@@ -860,7 +888,7 @@ This release contains many new features\, modules and plugins\, but also has sev
<a id="v1-2-0"></a>
## v1\.2\.0
-<a id="release-summary-40"></a>
+<a id="release-summary-41"></a>
### Release Summary
Last minor 1\.x\.0 version\. The 2\.0\.0 version will have some backwards incompatible changes to the <code>hosttech\_dns\_record</code> and <code>hosttech\_dns\_records</code> modules which will require user intervention\. These changes should result in a better UX\.
@@ -872,7 +900,7 @@ Last minor 1\.x\.0 version\. The 2\.0\.0 version will have some backwards incomp
* hosttech\_dns\_record \- in <code>diff</code> mode\, also return <code>diff</code> data structure when <code>changed</code> is <code>false</code> \([https\://github\.com/ansible\-collections/community\.dns/pull/28](https\://github\.com/ansible\-collections/community\.dns/pull/28)\)\.
* module utils \- add default implementation for some zone/record API functions\, and move common JSON API code to helper class \([https\://github\.com/ansible\-collections/community\.dns/pull/26](https\://github\.com/ansible\-collections/community\.dns/pull/26)\)\.
-<a id="bugfixes-38"></a>
+<a id="bugfixes-39"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -881,7 +909,7 @@ Last minor 1\.x\.0 version\. The 2\.0\.0 version will have some backwards incomp
<a id="v1-1-0"></a>
## v1\.1\.0
-<a id="release-summary-41"></a>
+<a id="release-summary-42"></a>
### Release Summary
Regular maintenance release\.
@@ -891,7 +919,7 @@ Regular maintenance release\.
* Avoid internal ansible\-core module\_utils in favor of equivalent public API available since at least Ansible 2\.9 \([https\://github\.com/ansible\-collections/community\.dns/pull/24](https\://github\.com/ansible\-collections/community\.dns/pull/24)\)\.
-<a id="bugfixes-39"></a>
+<a id="bugfixes-40"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -899,12 +927,12 @@ Regular maintenance release\.
<a id="v1-0-1"></a>
## v1\.0\.1
-<a id="release-summary-42"></a>
+<a id="release-summary-43"></a>
### Release Summary
Regular maintenance release\.
-<a id="bugfixes-40"></a>
+<a id="bugfixes-41"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -912,12 +940,12 @@ Regular maintenance release\.
<a id="v1-0-0"></a>
## v1\.0\.0
-<a id="release-summary-43"></a>
+<a id="release-summary-44"></a>
### Release Summary
First stable release\.
-<a id="bugfixes-41"></a>
+<a id="bugfixes-42"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -925,7 +953,7 @@ First stable release\.
<a id="v0-3-0"></a>
## v0\.3\.0
-<a id="release-summary-44"></a>
+<a id="release-summary-45"></a>
### Release Summary
Fixes bugs\, adds rate limiting for Hosttech JSON API\, and adds a new bulk synchronization module\.
@@ -935,7 +963,7 @@ Fixes bugs\, adds rate limiting for Hosttech JSON API\, and adds a new bulk sync
* hosttech\_dns\_\* \- handle <code>419 Too Many Requests</code> with proper rate limiting for JSON API \([https\://github\.com/ansible\-collections/community\.dns/pull/14](https\://github\.com/ansible\-collections/community\.dns/pull/14)\)\.
-<a id="bugfixes-42"></a>
+<a id="bugfixes-43"></a>
### Bugfixes
* Avoid converting ASCII labels which contain underscores or other printable ASCII characters outside <code>\[a\-zA\-Z0\-9\-\]</code> to alabels during normalization \([https\://github\.com/ansible\-collections/community\.dns/pull/13](https\://github\.com/ansible\-collections/community\.dns/pull/13)\)\.
@@ -949,7 +977,7 @@ Fixes bugs\, adds rate limiting for Hosttech JSON API\, and adds a new bulk sync
<a id="v0-2-0"></a>
## v0\.2\.0
-<a id="release-summary-45"></a>
+<a id="release-summary-46"></a>
### Release Summary
Major refactoring release\, which adds a zone information module and supports HostTech\'s new REST API\.
@@ -974,7 +1002,7 @@ Major refactoring release\, which adds a zone information module and supports Ho
* hosttech\_\* module\_utils \- completely rewrite and refactor to support new JSON API and allow to reuse provider\-independent module logic \([https\://github\.com/ansible\-collections/community\.dns/pull/4](https\://github\.com/ansible\-collections/community\.dns/pull/4)\)\.
-<a id="bugfixes-43"></a>
+<a id="bugfixes-44"></a>
### Bugfixes
* Update Public Suffix List\.
@@ -989,15 +1017,15 @@ Major refactoring release\, which adds a zone information module and supports Ho
<a id="v0-1-0"></a>
## v0\.1\.0
-<a id="release-summary-46"></a>
+<a id="release-summary-47"></a>
### Release Summary
Initial public release\.
-<a id="new-plugins-2"></a>
+<a id="new-plugins-3"></a>
### New Plugins
-<a id="filter"></a>
+<a id="filter-1"></a>
#### Filter
* community\.dns\.get\_public\_suffix \- Returns the public suffix of a DNS name
diff --git a/ansible_collections/community/dns/CHANGELOG.rst b/ansible_collections/community/dns/CHANGELOG.rst
index 37b4a2500..e91d83ebf 100644
--- a/ansible_collections/community/dns/CHANGELOG.rst
+++ b/ansible_collections/community/dns/CHANGELOG.rst
@@ -4,6 +4,29 @@ Community DNS Collection Release Notes
.. contents:: Topics
+v2.9.0
+======
+
+Release Summary
+---------------
+
+Feature and bugfix release.
+
+Bugfixes
+--------
+
+- Update Public Suffix List.
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.dns/pull/197).
+
+New Plugins
+-----------
+
+Filter
+~~~~~~
+
+- community.dns.quote_txt - Quotes a string to use as a TXT record entry
+- community.dns.unquote_txt - Unquotes a TXT record entry to a string
+
v2.8.3
======
diff --git a/ansible_collections/community/dns/FILES.json b/ansible_collections/community/dns/FILES.json
index 8bda06632..52b3239cd 100644
--- a/ansible_collections/community/dns/FILES.json
+++ b/ansible_collections/community/dns/FILES.json
@@ -25,7 +25,7 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cb9ff13908693ca232d8a96c732b37b686549b5a18c58241a40c14cafe97dec0",
+ "chksum_sha256": "4ef2a19d9715b2b9a70a6fe716ec40726b3c425f3c2b96d9bfe5d12489f74574",
"format": 1
},
{
@@ -39,14 +39,14 @@
"name": ".github/workflows/docs-pr.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fa2c8b94ec1355012d9b65d624ad400b327dfbb062cdc7407eb780a892524316",
+ "chksum_sha256": "dc9bab4e75bea6ee0b6887dd79d1f60ee31f938dc2b1992bfcd263cc623f290c",
"format": 1
},
{
"name": ".github/workflows/docs-push.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "88f3e91fc95a639fc831039a0503838f9850c51aedc52de0ef7adcfc7939ba4a",
+ "chksum_sha256": "005d031f01cb3322476bff7beec23f958cea6a2a9790e913771d40c360d2dcb2",
"format": 1
},
{
@@ -151,7 +151,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "86ce7da485fe12025925410c18b8b391fccc9b84dffff900037604813663277f",
+ "chksum_sha256": "d6afad220bd94bbf6ffd765666b7589d04b014238a3e02973e066958c44acf43",
"format": 1
},
{
@@ -193,7 +193,7 @@
"name": "docs/docsite/rst/filter_guide.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b407b72d65102202fc82d449bef8dd026f4d2debb9f7140fa6ac664a4cd4f5fc",
+ "chksum_sha256": "1af966088512f426e9ed72ce98dac4324fc02ddeafc33a0f70459b2c9bfe9ed7",
"format": 1
},
{
@@ -211,6 +211,13 @@
"format": 1
},
{
+ "name": "docs/docsite/config.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0c5ec9ff76cf4db33b5d3f771419ef50d448e5d510cb7a98fc07dd9ecee69c4e",
+ "format": 1
+ },
+ {
"name": "docs/docsite/extra-docs.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -379,6 +386,13 @@
"format": 1
},
{
+ "name": "plugins/filter/quote_txt.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0539523d52bfbe0e0eb6b6d40a5e371fb4cc4705a3eab73eeb3c52198a74023b",
+ "format": 1
+ },
+ {
"name": "plugins/filter/remove_public_suffix.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -393,6 +407,20 @@
"format": 1
},
{
+ "name": "plugins/filter/txt.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1b6220db5e9ea678b67c1a5c31f60df50f6624c6cbd89e9531b95358f2675267",
+ "format": 1
+ },
+ {
+ "name": "plugins/filter/unquote_txt.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "58f2b5e0a6c736160a540b4ea3b7106465223d7c82c5480f71d3e39c7736c56e",
+ "format": 1
+ },
+ {
"name": "plugins/inventory",
"ftype": "dir",
"chksum_type": null,
@@ -802,7 +830,7 @@
"name": "plugins/plugin_utils/inventory/records.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c77b1d234e40d804759699724336db0683f6c9173f8e36c69b8b0e3d3a33a50c",
+ "chksum_sha256": "768ceedc4f0b624a22f9b777452f143e0b88639c1bd7e5f861d789ec0269e6e1",
"format": 1
},
{
@@ -834,10 +862,17 @@
"format": 1
},
{
+ "name": "plugins/plugin_utils/unsafe.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "93ccc2e18634405c7ff21a91a1df4f17261ac24b0f41bf3c46dbec2f254538c3",
+ "format": 1
+ },
+ {
"name": "plugins/public_suffix_list.dat",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9bf809262c4506519ef0c2d89681b77c8a87d2bcf5d17d7b0496840c1451cfd9",
+ "chksum_sha256": "27ae0b652366e8c5675942482de87819cf7947f5f4dc7bc661dc82b9b5da2d04",
"format": 1
},
{
@@ -960,6 +995,34 @@
"format": 1
},
{
+ "name": "tests/integration/targets/filter_txt",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/filter_txt/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/filter_txt/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ec0d81efcabab342ec8b892fdf9bcd54bf488a3b92a81a0efbe09f26e2d80c27",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/filter_txt/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "92c856873b6b98a3a818dc09e1ba4cdd2e0e01449f1a28d6716eff605f1d2b01",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/hetzner",
"ftype": "dir",
"chksum_type": null,
@@ -1464,6 +1527,20 @@
"format": 1
},
{
+ "name": "tests/sanity/ignore-2.18.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e6ba33006d3aa232443f145cbbc66c1eb5a4c06e75b6a9c63e89972c990d2786",
+ "format": 1
+ },
+ {
+ "name": "tests/sanity/ignore-2.18.txt.license",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1",
+ "format": 1
+ },
+ {
"name": "tests/sanity/ignore-2.9.txt",
"ftype": "file",
"chksum_type": "sha256",
@@ -1502,14 +1579,14 @@
"name": "tests/unit/plugins/inventory/test_hetzner_dns_records.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b0a2245e3bc7a899c5ba90f7ea85471fa5f3c26aa612ac859e3cf0ede691ea44",
+ "chksum_sha256": "fcb263ece98ce1696cd5bbe594b86911d3365d9e8dfd9858ffbf6735c5dd46d2",
"format": 1
},
{
"name": "tests/unit/plugins/inventory/test_hosttech_dns_records.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c8c44d2037060fbfbaab8d05fc3af1d78513af2a5d91d872199aa75768a82b93",
+ "chksum_sha256": "20aafd958aa2e24b07b610c7d4efbee67cab74ecaada25876889564de7fe01d6",
"format": 1
},
{
@@ -1859,7 +1936,7 @@
"name": "tests/unit/requirements-stable-2.10.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1404c050017797dba43f1a8963794f33afaf0e5667abc792c062adf8ac84c254",
+ "chksum_sha256": "08f43f18582bbe66234f21183103b9c101b9f3a77248c8a27789283b9d6b4306",
"format": 1
},
{
@@ -1894,7 +1971,7 @@
"name": "CHANGELOG.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab12a2e489b31f469f321b053a4cb432216fe20e8374cd0ffb4ecf68bc8c7348",
+ "chksum_sha256": "bc56ad1ca72650697ca9f41b004a70f54ef329c79938268b1430d0dac8fa51d6",
"format": 1
},
{
@@ -1908,7 +1985,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2deefeaf4feaee535b1f34f517495188be0c31c22c1e5a33e470f86245dc92f",
+ "chksum_sha256": "6dd1dbacede2c19ab983288d1fccde3d6369642593b1da10029cdf53e6b3176c",
"format": 1
},
{
@@ -1936,7 +2013,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9083e4932c4b72abbc6c7382b3c964df7826b1a12a49f4d2e34cc36155380fd7",
+ "chksum_sha256": "61615f641d8efd57833806770c66a86dfe2ceb595df9fe1e9ef1fc0d9e2bfab4",
"format": 1
},
{
diff --git a/ansible_collections/community/dns/MANIFEST.json b/ansible_collections/community/dns/MANIFEST.json
index fcbfda5d6..0c60fe528 100644
--- a/ansible_collections/community/dns/MANIFEST.json
+++ b/ansible_collections/community/dns/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "dns",
- "version": "2.8.3",
+ "version": "2.9.0",
"authors": [
"Felix Fontein (github.com/felixfontein)",
"Markus Bergholz (github.com/markuman)"
@@ -30,7 +30,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8234c71782176e94860f305e6a9e4365b2167e2bd47e59e9c580a1011fc96b39",
+ "chksum_sha256": "723a758354360ce388c0f83a88527e05dc67d3bcad6495e66deca44b8a169d12",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/dns/README.md b/ansible_collections/community/dns/README.md
index 8a404fa3a..32257a110 100644
--- a/ansible_collections/community/dns/README.md
+++ b/ansible_collections/community/dns/README.md
@@ -16,7 +16,7 @@ Please note that this collection does **not** support Windows targets.
## Tested with Ansible
-Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, and ansible-core 2.16 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
+Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, and ansible-core 2.17 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
## External requirements
@@ -61,6 +61,8 @@ If you use the Ansible package and do not update collections independently, use
- `get_registrable_domain`: given a domain name, returns the *registrable domain name* (also called *registered domain name*). For example, `"www.ansible.com" | community.dns.get_registrable_domain == "ansible.com"` and `"some.random.prefixes.ansible.co.uk" | community.dns.get_registrable_domain == "ansible.co.uk"`.
- `remove_public_suffix`: given a domain name, returns the part before the public suffix. For example, `"www.ansible.com" | community.dns.remove_public_suffix == "www.ansible"` and `"some.random.prefixes.ansible.co.uk" | community.dns.remove_public_suffix == "some.random.prefixes.ansible"`.
- `remove_registrable_domain`: given a domain name, returns the part before the DNS zone. For example, `"www.ansible.com" | community.dns.remove_registrable_domain == "www"` and `"some.random.prefixes.ansible.co.uk" | community.dns.remove_registrable_domain == "some.random.prefixes"`.
+ - `quote_txt`: quotes a string for use as a TXT record entry. For example, `"this is a test" | community.dns.quote_txt == '"this is a test"'`.
+ - `unquote_txt`: unquotes a TXT record entry. For example, `'"foo" "bar"' | community.dns.unquote_txt == "foobar"`.
## Using this collection
diff --git a/ansible_collections/community/dns/changelogs/changelog.yaml b/ansible_collections/community/dns/changelogs/changelog.yaml
index 626ad4abf..3eafad115 100644
--- a/ansible_collections/community/dns/changelogs/changelog.yaml
+++ b/ansible_collections/community/dns/changelogs/changelog.yaml
@@ -809,3 +809,23 @@ releases:
- 2.8.3.yml
- update-psl.yml
release_date: '2024-03-24'
+ 2.9.0:
+ changes:
+ bugfixes:
+ - Update Public Suffix List.
+ - inventory plugins - add unsafe wrapper to avoid marking strings that do not
+ contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.dns/pull/197).
+ release_summary: Feature and bugfix release.
+ fragments:
+ - 197-unsafe.yml
+ - 3.9.0.yml
+ - update-psl.yml
+ plugins:
+ filter:
+ - description: Quotes a string to use as a TXT record entry
+ name: quote_txt
+ namespace: null
+ - description: Unquotes a TXT record entry to a string
+ name: unquote_txt
+ namespace: null
+ release_date: '2024-04-21'
diff --git a/ansible_collections/community/dns/docs/docsite/config.yml b/ansible_collections/community/dns/docs/docsite/config.yml
new file mode 100644
index 000000000..1d6cf8554
--- /dev/null
+++ b/ansible_collections/community/dns/docs/docsite/config.yml
@@ -0,0 +1,7 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+changelog:
+ write_changelog: true
diff --git a/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst b/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst
index aee397f8a..5643b2b4e 100644
--- a/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst
+++ b/ansible_collections/community/dns/docs/docsite/rst/filter_guide.rst
@@ -23,6 +23,11 @@ These filters allow to work with `public suffixes <https://en.wikipedia.org/wiki
The label directly before the public suffix together with the suffix is called the *registrable domain name* or *registered domain name*, since these are usually the names that people can register. Examples for registrable domain names are ``example.com`` and ``example.co.uk``, while ``www.example.com`` is not a registrable domain name. A public suffix itself is also not a registrable domain name, as for example ``github.io``.
+The collection also contains filters for working with TXT records:
+
+- :ansplugin:`community.dns.quote_txt#filter`: quote a string for use as a TXT record;
+- :ansplugin:`community.dns.unquote_txt#filter`: extract the value from a (quoted) TXT record.
+
Working with public suffixes
----------------------------
diff --git a/ansible_collections/community/dns/plugins/filter/quote_txt.yml b/ansible_collections/community/dns/plugins/filter/quote_txt.yml
new file mode 100644
index 000000000..c42274718
--- /dev/null
+++ b/ansible_collections/community/dns/plugins/filter/quote_txt.yml
@@ -0,0 +1,46 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+DOCUMENTATION:
+ name: quote_txt
+ short_description: Quotes a string to use as a TXT record entry
+ version_added: 2.9.0
+ description:
+ - Given a string, quotes it so it can be used in a TXT record entry.
+ options:
+ _input:
+ description:
+ - The string to quote.
+ type: string
+ required: true
+ always_quote:
+ description:
+ - Whether to always quote the resulting string in double quotes.
+ type: bool
+ default: false
+ character_encoding:
+ description:
+ - Whether to treat numeric escape sequences (V(\\xyz)) as octal or decimal numbers.
+ - The default value V(decimal) is compatible to L(RFC 1035, https://www.ietf.org/rfc/rfc1035.txt).
+ type: str
+ default: decimal
+ choices:
+ - decimal
+ - octal
+ author:
+ - Felix Fontein (@felixfontein)
+
+EXAMPLES: |
+ - name: Quote a TXT entry
+ ansible.builtin.set_fact:
+ public_suffix: "{{ value | community.dns.quote_txt }}"
+ # Should result in '"this is a test"'
+ vars:
+ value: this is a test
+
+RETURN:
+ _value:
+ description: The quoted string that can be used for a TXT entry.
+ type: string
diff --git a/ansible_collections/community/dns/plugins/filter/txt.py b/ansible_collections/community/dns/plugins/filter/txt.py
new file mode 100644
index 000000000..4f2d3a16f
--- /dev/null
+++ b/ansible_collections/community/dns/plugins/filter/txt.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2020-2021, Felix Fontein <felix@fontein.de>
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+from ansible.errors import AnsibleFilterError
+from ansible.module_utils.common.text.converters import to_text
+from ansible.module_utils.six import string_types
+
+from ansible_collections.community.dns.plugins.module_utils.conversion.txt import (
+ decode_txt_value,
+ encode_txt_value,
+)
+
+
+def quote_txt(value, always_quote=False, character_encoding='decimal'):
+ if not isinstance(value, string_types):
+ raise AnsibleFilterError('Input for community.dns.quote_txt must be a string')
+ if not isinstance(always_quote, bool):
+ raise AnsibleFilterError('always_quote must be a boolean, not {value!r}'.format(value=always_quote))
+ if character_encoding not in ('decimal', 'octal'):
+ raise AnsibleFilterError('character_encoding must be "decimal" or "octal", not {value!r}'.format(value=character_encoding))
+ value = to_text(value)
+ return encode_txt_value(value, always_quote=always_quote, character_encoding=character_encoding)
+
+
+def unquote_txt(value, character_encoding='decimal'):
+ if not isinstance(value, string_types):
+ raise AnsibleFilterError('Input for community.dns.unquote_txt must be a string')
+ if character_encoding not in ('decimal', 'octal'):
+ raise AnsibleFilterError('character_encoding must be "decimal" or "octal", not {value!r}'.format(value=character_encoding))
+ value = to_text(value)
+ return decode_txt_value(value, character_encoding=character_encoding)
+
+
+class FilterModule(object):
+ '''Ansible jinja2 filters'''
+
+ def filters(self):
+ return {
+ 'quote_txt': quote_txt,
+ 'unquote_txt': unquote_txt,
+ }
diff --git a/ansible_collections/community/dns/plugins/filter/unquote_txt.yml b/ansible_collections/community/dns/plugins/filter/unquote_txt.yml
new file mode 100644
index 000000000..712cf3ad4
--- /dev/null
+++ b/ansible_collections/community/dns/plugins/filter/unquote_txt.yml
@@ -0,0 +1,42 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+DOCUMENTATION:
+ name: unquote_txt
+ short_description: Unquotes a TXT record entry to a string
+ version_added: 2.9.0
+ description:
+ - Given a (quoted) TXT entry content, extracts its value.
+ options:
+ _input:
+ description:
+ - The string to unquote.
+ type: string
+ required: true
+ character_encoding:
+ description:
+ - Whether to treat numeric escape sequences (V(\\xyz)) as octal or decimal numbers.
+ - The default value V(decimal) is compatible to L(RFC 1035, https://www.ietf.org/rfc/rfc1035.txt).
+ type: str
+ default: decimal
+ choices:
+ - decimal
+ - octal
+ author:
+ - Felix Fontein (@felixfontein)
+
+EXAMPLES: |
+ - name: Unquote a TXT entry
+ ansible.builtin.set_fact:
+ public_suffix: "{{ value | community.dns.unquote_txt }}"
+ # Should result in 'this is a test'
+ vars:
+ value: >-
+ "this is " "a test"
+
+RETURN:
+ _value:
+ description: The extracted string.
+ type: string
diff --git a/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py b/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py
index 30fa11bdc..1d6827f2f 100644
--- a/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py
+++ b/ansible_collections/community/dns/plugins/plugin_utils/inventory/records.py
@@ -15,7 +15,6 @@ from ansible.module_utils import six
from ansible.module_utils.common._collections_compat import Sequence
from ansible.plugins.inventory import BaseInventoryPlugin
from ansible.utils.display import Display
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
from ansible.template import Templar
from ansible_collections.community.dns.plugins.module_utils.provider import (
@@ -35,6 +34,8 @@ from ansible_collections.community.dns.plugins.module_utils.conversion.converter
RecordConverter,
)
+from ansible_collections.community.dns.plugins.plugin_utils.unsafe import make_unsafe
+
display = Display()
diff --git a/ansible_collections/community/dns/plugins/plugin_utils/unsafe.py b/ansible_collections/community/dns/plugins/plugin_utils/unsafe.py
new file mode 100644
index 000000000..1eb61bea0
--- /dev/null
+++ b/ansible_collections/community/dns/plugins/plugin_utils/unsafe.py
@@ -0,0 +1,41 @@
+# Copyright (c) 2023, Felix Fontein <felix@fontein.de>
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import re
+
+from ansible.module_utils.six import binary_type, text_type
+from ansible.module_utils.common._collections_compat import Mapping, Set
+from ansible.module_utils.common.collections import is_sequence
+from ansible.utils.unsafe_proxy import (
+ AnsibleUnsafe,
+ wrap_var as _make_unsafe,
+)
+
+_RE_TEMPLATE_CHARS = re.compile(u'[{}]')
+_RE_TEMPLATE_CHARS_BYTES = re.compile(b'[{}]')
+
+
+def make_unsafe(value):
+ if value is None or isinstance(value, AnsibleUnsafe):
+ return value
+
+ if isinstance(value, Mapping):
+ return dict((make_unsafe(key), make_unsafe(val)) for key, val in value.items())
+ elif isinstance(value, Set):
+ return set(make_unsafe(elt) for elt in value)
+ elif is_sequence(value):
+ return type(value)(make_unsafe(elt) for elt in value)
+ elif isinstance(value, binary_type):
+ if _RE_TEMPLATE_CHARS_BYTES.search(value):
+ value = _make_unsafe(value)
+ return value
+ elif isinstance(value, text_type):
+ if _RE_TEMPLATE_CHARS.search(value):
+ value = _make_unsafe(value)
+ return value
+
+ return value
diff --git a/ansible_collections/community/dns/plugins/public_suffix_list.dat b/ansible_collections/community/dns/plugins/public_suffix_list.dat
index dd8bd923e..125f1e3d7 100644
--- a/ansible_collections/community/dns/plugins/public_suffix_list.dat
+++ b/ansible_collections/community/dns/plugins/public_suffix_list.dat
@@ -6710,7 +6710,7 @@ org.zw
// newGTLDs
-// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2024-03-06T15:14:58Z
+// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2024-03-28T15:13:37Z
// This list is auto-generated, don't edit it manually.
// aaa : American Automobile Association, Inc.
// https://www.iana.org/domains/root/db/aaa.html
@@ -6988,10 +6988,6 @@ auto
// https://www.iana.org/domains/root/db/autos.html
autos
-// avianca : Avianca Inc.
-// https://www.iana.org/domains/root/db/avianca.html
-avianca
-
// aws : AWS Registry LLC
// https://www.iana.org/domains/root/db/aws.html
aws
@@ -12080,6 +12076,7 @@ autocode.dev
// AVM : https://avm.de
// Submitted by Andreas Weise <a.weise@avm.de>
+myfritz.link
myfritz.net
// AVStack Pte. Ltd. : https://avstack.io
@@ -12357,6 +12354,12 @@ pages.dev
r2.dev
workers.dev
+// cloudscale.ch AG : https://www.cloudscale.ch/
+// Submitted by Gaudenz Steinlin <support@cloudscale.ch>
+cust.cloudscale.ch
+objects.lpg.cloudscale.ch
+objects.rma.cloudscale.ch
+
// Clovyr : https://clovyr.io
// Submitted by Patrick Nielsen <patrick@clovyr.io>
wnext.app
@@ -12374,22 +12377,33 @@ co.cz
// CDN77.com : http://www.cdn77.com
// Submitted by Jan Krpes <jan.krpes@cdn77.com>
-c.cdn77.org
+cdn77-storage.com
+rsc.contentproxy9.cz
cdn77-ssl.net
r.cdn77.net
-rsc.cdn77.org
ssl.origin.cdn77-secure.org
+c.cdn77.org
+rsc.cdn77.org
// Cloud DNS Ltd : http://www.cloudns.net
-// Submitted by Aleksander Hristov <noc@cloudns.net>
+// Submitted by Aleksander Hristov <noc@cloudns.net> & Boyan Peychev <boyan@cloudns.net>
cloudns.asia
+cloudns.be
cloudns.biz
-cloudns.club
cloudns.cc
+cloudns.ch
+cloudns.cl
+cloudns.club
+dnsabr.com
+cloudns.cx
cloudns.eu
cloudns.in
cloudns.info
+dns-cloud.net
+dns-dynamic.net
+cloudns.nz
cloudns.org
+cloudns.ph
cloudns.pro
cloudns.pw
cloudns.us
@@ -12402,6 +12416,11 @@ cnpy.gdn
// Submitted by Moritz Marquardt <git@momar.de>
codeberg.page
+// CodeSandbox B.V. : https://codesandbox.io
+// Submitted by Ives van Hoorne <abuse@codesandbox.io>
+csb.app
+preview.csb.app
+
// CoDNS B.V.
co.nl
co.no
@@ -12520,6 +12539,7 @@ dyndns.dappnode.io
// Dark, Inc. : https://darklang.com
// Submitted by Paul Biggar <ops@darklang.com>
builtwithdark.com
+darklang.io
// DataDetect, LLC. : https://datadetect.com
// Submitted by Andrew Banchich <abanchich@sceven.com>
@@ -12918,6 +12938,10 @@ ondigitalocean.app
// Submitted by Robin H. Johnson <psl-maintainers@digitalocean.com>
*.digitaloceanspaces.com
+// DigitalPlat : https://www.digitalplat.org/
+// Submitted by Edward Hsing <contact@digitalplat.org>
+us.kg
+
// dnstrace.pro : https://dnstrace.pro/
// Submitted by Chris Partridge <chris@partridge.tech>
bci.dnstrace.pro
@@ -12959,6 +12983,14 @@ easypanel.host
// Submitted by <infracloudteam@namecheap.com>
*.ewp.live
+// Electromagnetic Field : https://www.emfcamp.org
+// Submitted by <noc@emfcamp.org>
+at.emf.camp
+
+// Elefunc, Inc. : https://elefunc.com
+// Submitted by Cetin Sert <domains@elefunc.com>
+rt.ht
+
// Elementor : Elementor Ltd.
// Submitted by Anton Barkan <antonb@elementor.com>
elementor.cloud
@@ -13250,7 +13282,8 @@ forgeblocks.com
id.forgerock.io
// Framer : https://www.framer.com
-// Submitted by Koen Rouwhorst <koenrh@framer.com>
+// Submitted by Koen Rouwhorst <security@framer.com>
+framer.ai
framer.app
framercanvas.com
framer.media
@@ -13291,6 +13324,24 @@ freemyip.com
// Submitted by Daniel A. Maierhofer <vorstand@funkfeuer.at>
wien.funkfeuer.at
+// Future Versatile Group. :https://www.fvg-on.net/
+// T.Kabu <webmaster@fvg-on.net>
+daemon.asia
+dix.asia
+mydns.bz
+0am.jp
+0g0.jp
+0j0.jp
+0t0.jp
+mydns.jp
+pgw.jp
+wjg.jp
+keyword-on.net
+live-on.net
+server-on.net
+mydns.tw
+mydns.vc
+
// Futureweb GmbH : https://www.futureweb.at
// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at>
*.futurecms.at
@@ -13334,6 +13385,12 @@ gentlentapis.com
lab.ms
cdn-edges.net
+// Getlocalcert: https://www.getlocalcert.net
+// Submitted by Robert Alexander <support@getlocalcert.net>
+localcert.net
+localhostcert.net
+corpnet.work
+
// Ghost Foundation : https://ghost.org
// Submitted by Matt Hanley <security@ghost.org>
ghost.io
@@ -13480,6 +13537,10 @@ whitesnow.jp
zombie.jp
heteml.net
+// GoDaddy Registry : https://registry.godaddy
+// Submitted by Rohan Durrant <tldns@registry.godaddy>
+graphic.design
+
// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/
// Submitted by Tom Whitwell <gov-uk-paas-support@digital.cabinet-office.gov.uk>
cloudapps.digital
@@ -13599,6 +13660,10 @@ goupile.fr
// Submitted by <domeinnaam@minaz.nl>
gov.nl
+// GrayJay Web Solutions Inc. : https://grayjaysports.ca
+// Submitted by Matt Yamkowy <info@grayjaysports.ca>
+grayjayleagues.com
+
// Group 53, LLC : https://www.group53.com
// Submitted by Tyler Todd <noc@nova53.net>
awsmppl.com
@@ -13633,6 +13698,11 @@ hasura-app.io
// Submitted by Richard Zowalla <mi-admin@hs-heilbronn.de>
pages.it.hs-heilbronn.de
+// Helio Networks : https://heliohost.org
+// Submitted by Ben Frede <admin@heliohost.org>
+helioho.st
+heliohost.us
+
// Hepforge : https://www.hepforge.org
// Submitted by David Grellscheid <admin@hepforge.org>
hepforge.org
@@ -13646,7 +13716,6 @@ herokussl.com
// Submitted by Oren Eini <oren@ravendb.net>
ravendb.cloud
ravendb.community
-ravendb.me
development.run
ravendb.run
@@ -13737,7 +13806,7 @@ biz.at
info.at
// info.cx : http://info.cx
-// Submitted by Jacob Slater <whois@igloo.to>
+// Submitted by June Slater <whois@igloo.to>
info.cx
// Interlegis : http://www.interlegis.leg.br
@@ -13786,6 +13855,14 @@ iopsys.se
// Submitted by Matthew Hardeman <mhardeman@ipifony.com>
ipifony.net
+// is-a.dev : https://www.is-a.dev
+// Submitted by William Harrison <admin@maintainers.is-a.dev>
+is-a.dev
+
+// ir.md : https://nic.ir.md
+// Submitted by Ali Soizi <info@nic.ir.md>
+ir.md
+
// IServ GmbH : https://iserv.de
// Submitted by Mario Hoberg <info@iserv.de>
iservschule.de
@@ -13894,6 +13971,11 @@ myjino.ru
// Submitted by Daniel Fariña <ingenieria@jotelulu.com>
jotelulu.cloud
+// JouwWeb B.V. : https://www.jouwweb.nl
+// Submitted by Camilo Sperberg <tech@webador.com>
+jouwweb.site
+webadorsite.com
+
// Joyent : https://www.joyent.com/
// Submitted by Brian Bennett <brian.bennett@joyent.com>
*.triton.zone
@@ -13967,6 +14049,10 @@ lpusercontent.com
// Submitted by Lelux Admin <publisuffix@lelux.site>
lelux.site
+// Libre IT Ltd : https://libre.nz
+// Submitted by Tomas Maggio <support@libre.nz>
+runcontainers.dev
+
// Lifetime Hosting : https://Lifetime.Hosting/
// Submitted by Mike Fillator <support@lifetime.hosting>
co.business
@@ -14141,7 +14227,6 @@ co.pl
// Managed by Corporate Domains
// Microsoft Azure : https://home.azure
*.azurecontainer.io
-cloudapp.azure.com
azure-api.net
azureedge.net
azurefd.net
@@ -14248,13 +14333,18 @@ ngrok.pro
torun.pl
// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/
-// Submitted by Nicholas Ford <nick@nimbushosting.co.uk>
+// Submitted by Nicholas Ford <dev@nimbushosting.co.uk>
nh-serv.co.uk
+nimsite.uk
// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/
// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net>
nfshost.com
+// NFT.Storage : https://nft.storage/
+// Submitted by Vasco Santos <vasco.santos@protocol.ai> or <support@nft.storage>
+ipfs.nftstorage.link
+
// Noop : https://noop.app
// Submitted by Nathaniel Schweinberg <noop@rearc.io>
*.developer.app
@@ -14434,7 +14524,6 @@ omniwe.site
123minsida.se
123miweb.es
123paginaweb.pt
-123sait.ru
123siteweb.fr
123webseite.at
123webseite.de
@@ -14452,6 +14541,13 @@ simplesite.pl
// Submitted by Eddie Jones <eddie@onefoldmedia.com>
nid.io
+// Open Domains : https://open-domains.net
+// Submitted by William Harrison <admin@open-domains.net>
+is-cool.dev
+is-not-a.dev
+localplayer.dev
+is-local.org
+
// Open Social : https://www.getopensocial.com/
// Submitted by Alexander Varwijk <security@getopensocial.com>
opensocial.site
@@ -14472,6 +14568,11 @@ operaunite.com
// Submitted by Alexandre Linte <alexandre.linte@orange.com>
tech.orange
+// OsSav Technology Ltd. : https://ossav.com/
+// TLD Nic: http://nic.can.re - TLD Whois Server: whois.can.re
+// Submitted by OsSav Technology Ltd. <support@ossav.com>
+can.re
+
// Oursky Limited : https://authgear.com/, https://skygear.io/
// Submitted by Authgear Team <hello@authgear.com>, Skygear Developer <hello@skygear.io>
authgear-staging.com
@@ -14522,10 +14623,10 @@ pagexl.com
// pcarrier.ca Software Inc: https://pcarrier.ca/
// Submitted by Pierre Carrier <pc@rrier.ca>
-bar0.net
-bar1.net
-bar2.net
-rdv.to
+*.xmit.co
+srv.us
+gh.srv.us
+gl.srv.us
// .pl domains (grandfathered)
art.pl
@@ -14683,9 +14784,12 @@ qcx.io
*.sys.qcx.io
// QNAP System Inc : https://www.qnap.com
-// Submitted by Nick Chang <nickchang@qnap.com>
-dev-myqnapcloud.com
+// Submitted by Nick Chang <cloudadmin@qnap.com>
+myqnapcloud.cn
alpha-myqnapcloud.com
+dev-myqnapcloud.com
+mycloudnas.com
+mynascloud.com
myqnapcloud.com
// Quip : https://quip.com
@@ -14915,6 +15019,10 @@ service.gov.scot
// Submitted by Shante Adam <shante@skyhat.io>
scrysec.com
+// Scrypted : https://scrypted.app
+// Submitted by Koushik Dutta <public-suffix-list@scrypted.app>
+client.scrypted.io
+
// Securepoint GmbH : https://www.securepoint.de
// Submitted by Erik Anders <erik.anders@securepoint.de>
firewall-gateway.com
@@ -15024,9 +15132,9 @@ small-web.org
vp4.me
// Snowflake Inc : https://www.snowflake.com/
-// Submitted by Faith Olapade <faith.olapade@snowflake.com>
-snowflake.app
-privatelink.snowflake.app
+// Submitted by Sam Haar <psl@snowflake.com>
+*.snowflake.app
+*.privatelink.snowflake.app
streamlit.app
streamlitapp.com
@@ -15038,6 +15146,12 @@ try-snowplow.com
// Submitted by Drew DeVault <sir@cmpwn.com>
srht.site
+// StackBlitz : https://stackblitz.com
+// Submitted by Dominic Elm <hello@stackblitz.com>
+w-corp-staticblitz.com
+w-credentialless-staticblitz.com
+w-staticblitz.com
+
// Stackhero : https://www.stackhero.io
// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io>
stackhero-network.com
@@ -15339,6 +15453,10 @@ inc.hk
// Submitted by ITComdomains <to@it.com>
it.com
+// Unison Computing, PBC : https://unison.cloud
+// Submitted by Simon Højberg <security@unison.cloud>
+unison-services.cloud
+
// UNIVERSAL DOMAIN REGISTRY : https://www.udr.org.yt/
// see also: whois -h whois.udr.org.yt help
// Submitted by Atanunu Igbunuroghene <publicsuffixlist@udr.org.yt>
@@ -15388,47 +15506,6 @@ v-info.info
// Submitted by Nathan van Bakel <info@voorloper.com>
voorloper.cloud
-// Voxel.sh DNS : https://voxel.sh/dns/
-// Submitted by Mia Rehlinger <dns@voxel.sh>
-neko.am
-nyaa.am
-be.ax
-cat.ax
-es.ax
-eu.ax
-gg.ax
-mc.ax
-us.ax
-xy.ax
-nl.ci
-xx.gl
-app.gp
-blog.gt
-de.gt
-to.gt
-be.gy
-cc.hn
-io.kg
-jp.kg
-tv.kg
-uk.kg
-us.kg
-de.ls
-at.md
-de.md
-jp.md
-to.md
-indie.porn
-vxl.sh
-ch.tc
-me.tc
-we.tc
-nyan.to
-at.vg
-blog.vu
-dev.vu
-me.vu
-
// V.UA Domain Administrator : https://domain.v.ua/
// Submitted by Serhii Rostilo <sergey@rostilo.kiev.ua>
v.ua
@@ -15457,6 +15534,10 @@ reserve-online.com
bookonline.app
hotelwithflight.com
+// WebWaddle Ltd: https://webwaddle.com/
+// Submitted by Merlin Glander <hostmaster@webwaddle.com>
+*.wadl.top
+
// WeDeploy by Liferay, Inc. : https://www.wedeploy.com
// Submitted by Henrique Vicente <security@wedeploy.com>
wedeploy.io
diff --git a/ansible_collections/community/dns/tests/integration/targets/filter_txt/aliases b/ansible_collections/community/dns/tests/integration/targets/filter_txt/aliases
new file mode 100644
index 000000000..b7419a24d
--- /dev/null
+++ b/ansible_collections/community/dns/tests/integration/targets/filter_txt/aliases
@@ -0,0 +1,6 @@
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+shippable/posix/group1
+skip/python2.6 # filters are controller only, and we no longer support Python 2.6 on the controller
diff --git a/ansible_collections/community/dns/tests/integration/targets/filter_txt/tasks/main.yml b/ansible_collections/community/dns/tests/integration/targets/filter_txt/tasks/main.yml
new file mode 100644
index 000000000..c0afffcea
--- /dev/null
+++ b/ansible_collections/community/dns/tests/integration/targets/filter_txt/tasks/main.yml
@@ -0,0 +1,49 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+- name: "Test quote_txt filter"
+ assert:
+ that:
+ - >-
+ '' | community.dns.quote_txt == '""'
+ - >-
+ "this is a test" | community.dns.quote_txt == '"this is a test"'
+ - >-
+ "test" | community.dns.quote_txt == 'test'
+ - >-
+ "test" | community.dns.quote_txt(always_quote=true) == '"test"'
+ - >-
+ '"' | community.dns.quote_txt == '\\"'
+ - >-
+ ' ' | community.dns.quote_txt == '" "'
+ - >-
+ "ä" | community.dns.quote_txt() == '\\195\\164'
+ - >-
+ "ä" | community.dns.quote_txt(character_encoding='octal') == '\\303\\244'
+ - >-
+ "ä" | community.dns.quote_txt(character_encoding='octal', always_quote=true) == '"\\303\\244"'
+ - >-
+ very_long_input | community.dns.quote_txt == very_long_output
+ vars:
+ very_long_input: >-
+ this is a very1, very2, very3, very4, very5, very6, very7, very8, very9, very10, very11, very12, very13, very14, very15,
+ very16, very17, very18, very19, very20, very21, very22, very23, very24, very25, very26, very27, very28, very29, very30,
+ very31, very32, very33, very34, very35, very36, very37, very38, very39 long text
+ very_long_output: >-
+ "this is a very1, very2, very3, very4, very5, very6, very7, very8, very9, very10, very11, very12, very13, very14, very15,
+ very16, very17, very18, very19, very20, very21, very22, very23, very24, very25, very26, very27, very28, very29, very30,
+ very31, very32" ", very33, very34, very35, very36, very37, very38, very39 long text"
+
+- name: "Test unquote_txt filter"
+ assert:
+ that:
+ - >-
+ '' | community.dns.unquote_txt == ''
+ - >-
+ '""' | community.dns.unquote_txt == ''
+ - >
+ '"foo" "bar"' | community.dns.unquote_txt == "foobar"
+ - >
+ 'foo "bar baz" bam' | community.dns.unquote_txt == "foobar bazbam"
diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.18.txt b/ansible_collections/community/dns/tests/sanity/ignore-2.18.txt
new file mode 100644
index 000000000..dc9da1161
--- /dev/null
+++ b/ansible_collections/community/dns/tests/sanity/ignore-2.18.txt
@@ -0,0 +1 @@
+plugins/public_suffix_list.dat no-smart-quotes
diff --git a/ansible_collections/community/dns/tests/sanity/ignore-2.18.txt.license b/ansible_collections/community/dns/tests/sanity/ignore-2.18.txt.license
new file mode 100644
index 000000000..edff8c768
--- /dev/null
+++ b/ansible_collections/community/dns/tests/sanity/ignore-2.18.txt.license
@@ -0,0 +1,3 @@
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+SPDX-FileCopyrightText: Ansible Project
diff --git a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py
index bfaa4886d..44f694708 100644
--- a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py
+++ b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hetzner_dns_records.py
@@ -108,6 +108,68 @@ HETZNER_JSON_DEFAULT_ENTRIES = [
},
]
+HETZNER_JSON_DEFAULT_ENTRIES_UNSAFE = [
+ {
+ 'id': '125',
+ 'type': 'A',
+ 'name': '@',
+ 'value': '1.2.{3.4',
+ 'ttl': 3600,
+ 'zone_id': '42',
+ 'created': '2021-07-09T11:18:37Z',
+ 'modified': '2021-07-09T11:18:37Z',
+ },
+ {
+ 'id': '126',
+ 'type': 'A',
+ 'name': '*',
+ 'value': '1.2.{3.5',
+ 'ttl': 3600,
+ 'zone_id': '42',
+ 'created': '2021-07-09T11:18:37Z',
+ 'modified': '2021-07-09T11:18:37Z',
+ },
+ {
+ 'id': '127',
+ 'type': 'AAAA',
+ 'name': '@',
+ 'value': '2001:1:2::{3',
+ 'ttl': 3600,
+ 'zone_id': '42',
+ 'created': '2021-07-09T11:18:37Z',
+ 'modified': '2021-07-09T11:18:37Z',
+ },
+ {
+ 'id': '128',
+ 'type': 'AAAA',
+ 'name': 'foo',
+ 'value': '2001:1:2::{4',
+ 'ttl': 3600,
+ 'zone_id': '42',
+ 'created': '2021-07-09T11:18:37Z',
+ 'modified': '2021-07-09T11:18:37Z',
+ },
+ {
+ 'id': '129',
+ 'type': 'MX',
+ 'name': '@',
+ 'value': '10 example.com',
+ 'ttl': 3600,
+ 'zone_id': '42',
+ 'created': '2021-07-09T11:18:37Z',
+ 'modified': '2021-07-09T11:18:37Z',
+ },
+ {
+ 'id': '130',
+ 'type': 'CNAME',
+ 'name': 'bar',
+ 'value': 'example.org.',
+ 'zone_id': '42',
+ 'created': '2021-07-09T11:18:37Z',
+ 'modified': '2021-07-09T11:18:37Z',
+ },
+]
+
HETZNER_JSON_BAD_ENTRIES = [
{
'id': '125',
@@ -135,6 +197,10 @@ HETZNER_JSON_ZONE_RECORDS_GET_RESULT = {
'records': HETZNER_JSON_DEFAULT_ENTRIES,
}
+HETZNER_JSON_ZONE_RECORDS_GET_RESULT_UNSAFE = {
+ 'records': HETZNER_JSON_DEFAULT_ENTRIES_UNSAFE,
+}
+
HETZNER_JSON_ZONE_RECORDS_GET_RESULT_2 = {
'records': HETZNER_JSON_BAD_ENTRIES,
}
@@ -190,7 +256,7 @@ def test_inventory_file_simple(mocker):
.expect_query_values('page', '1')
.expect_query_values('per_page', '100')
.return_header('Content-Type', 'application/json')
- .result_json(HETZNER_JSON_ZONE_RECORDS_GET_RESULT),
+ .result_json(HETZNER_JSON_ZONE_RECORDS_GET_RESULT_UNSAFE),
])
mocker.patch('ansible_collections.community.dns.plugins.module_utils.http.open_url', open_url)
mocker.patch('ansible.inventory.manager.unfrackpath', mock_unfrackpath_noop)
@@ -207,8 +273,8 @@ def test_inventory_file_simple(mocker):
assert 'bar.example.com' not in im._inventory.hosts
assert im._inventory.get_host('example.com') in im._inventory.groups['ungrouped'].hosts
assert im._inventory.get_host('*.example.com') in im._inventory.groups['ungrouped'].hosts
- assert im._inventory.get_host('example.com').get_vars()['ansible_host'] == '1.2.3.4'
- assert im._inventory.get_host('*.example.com').get_vars()['ansible_host'] == '1.2.3.5'
+ assert im._inventory.get_host('example.com').get_vars()['ansible_host'] == '1.2.{3.4'
+ assert im._inventory.get_host('*.example.com').get_vars()['ansible_host'] == '1.2.{3.5'
assert isinstance(im._inventory.get_host('example.com').get_vars()['ansible_host'], AnsibleUnsafe)
assert isinstance(im._inventory.get_host('*.example.com').get_vars()['ansible_host'], AnsibleUnsafe)
assert len(im._inventory.groups['ungrouped'].hosts) == 2
diff --git a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py
index cefd02a06..11995198c 100644
--- a/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py
+++ b/ansible_collections/community/dns/tests/unit/plugins/inventory/test_hosttech_dns_records.py
@@ -89,6 +89,64 @@ HOSTTECH_JSON_DEFAULT_ENTRIES = [
},
]
+HOSTTECH_JSON_DEFAULT_ENTRIES_UNSAFE = [
+ # (125, 42, 'A', '', '1.2.{3.4', 3600, None, None),
+ {
+ 'id': 125,
+ 'type': 'A',
+ 'name': '',
+ 'ipv4': '1.2.{3.4',
+ 'ttl': 3600,
+ 'comment': '',
+ },
+ # (126, 42, 'A', '*', '1.2.{3.5', 3600, None, None),
+ {
+ 'id': 126,
+ 'type': 'A',
+ 'name': '*',
+ 'ipv4': '1.2.{3.5',
+ 'ttl': 3600,
+ 'comment': '',
+ },
+ # (127, 42, 'AAAA', '', '2001:1:2::{3', 3600, None, None),
+ {
+ 'id': 127,
+ 'type': 'AAAA',
+ 'name': '',
+ 'ipv6': '2001:1:2::{3',
+ 'ttl': 3600,
+ 'comment': '',
+ },
+ # (128, 42, 'AAAA', '*', '2001:1:2::{4', 3600, None, None),
+ {
+ 'id': 128,
+ 'type': 'AAAA',
+ 'name': 'foo',
+ 'ipv6': '2001:1:2::{4',
+ 'ttl': 3600,
+ 'comment': '',
+ },
+ # (129, 42, 'MX', '', 'example.com', 3600, None, '10'),
+ {
+ 'id': 129,
+ 'type': 'MX',
+ 'ownername': '',
+ 'name': 'example.com',
+ 'pref': 10,
+ 'ttl': 3600,
+ 'comment': '',
+ },
+ # (130, 42, 'CNAME', 'bar', 'example.org.', 10800, None, None),
+ {
+ 'id': 130,
+ 'type': 'CNAME',
+ 'name': 'bar',
+ 'cname': 'example.org.',
+ 'ttl': 10800,
+ 'comment': '',
+ },
+]
+
HOSTTECH_JSON_ZONE_LIST_RESULT = {
"data": [
@@ -119,6 +177,18 @@ HOSTTECH_JSON_ZONE_RECORDS_GET_RESULT = {
"data": HOSTTECH_JSON_DEFAULT_ENTRIES,
}
+HOSTTECH_JSON_ZONE_GET_RESULT_UNSAFE = {
+ "data": {
+ "id": 42,
+ "name": "example.com",
+ "email": "test@example.com",
+ "ttl": 10800,
+ "nameserver": "ns1.hosttech.ch",
+ "dnssec": False,
+ "records": HOSTTECH_JSON_DEFAULT_ENTRIES_UNSAFE,
+ }
+}
+
original_exists = os.path.exists
original_access = os.access
@@ -167,7 +237,7 @@ def test_inventory_file_simple(mocker):
.expect_header('authorization', 'Bearer foo')
.expect_url('https://api.ns1.hosttech.eu/api/user/v1/zones/42')
.return_header('Content-Type', 'application/json')
- .result_json(HOSTTECH_JSON_ZONE_GET_RESULT),
+ .result_json(HOSTTECH_JSON_ZONE_GET_RESULT_UNSAFE),
])
mocker.patch('ansible_collections.community.dns.plugins.module_utils.http.open_url', open_url)
mocker.patch('ansible.inventory.manager.unfrackpath', mock_unfrackpath_noop)
@@ -184,8 +254,8 @@ def test_inventory_file_simple(mocker):
assert 'bar.example.com' not in im._inventory.hosts
assert im._inventory.get_host('example.com') in im._inventory.groups['ungrouped'].hosts
assert im._inventory.get_host('*.example.com') in im._inventory.groups['ungrouped'].hosts
- assert im._inventory.get_host('example.com').get_vars()['ansible_host'] == '1.2.3.4'
- assert im._inventory.get_host('*.example.com').get_vars()['ansible_host'] == '1.2.3.5'
+ assert im._inventory.get_host('example.com').get_vars()['ansible_host'] == '1.2.{3.4'
+ assert im._inventory.get_host('*.example.com').get_vars()['ansible_host'] == '1.2.{3.5'
assert isinstance(im._inventory.get_host('example.com').get_vars()['ansible_host'], AnsibleUnsafe)
assert isinstance(im._inventory.get_host('*.example.com').get_vars()['ansible_host'], AnsibleUnsafe)
assert len(im._inventory.groups['ungrouped'].hosts) == 2
diff --git a/ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt b/ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt
index 126caabdc..49df5eff9 100644
--- a/ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt
+++ b/ansible_collections/community/dns/tests/unit/requirements-stable-2.10.txt
@@ -10,4 +10,4 @@ ipaddress ; python_version < '3.3'
dnspython < 2.4.0
lxml < 4.3.0 ; python_version < '2.7' # lxml 4.3.0 and later require python 2.7 or later
-lxml ; python_version >= '2.7'
+lxml < 5.2.0 ; python_version >= '2.7' # lxml 5.2.0 does fail with Python 3.6 due to TOML loading failure
diff --git a/ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml b/ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml
index b54ccc148..e5d55cf6e 100644
--- a/ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml
+++ b/ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml
@@ -66,6 +66,17 @@ stages:
test: 'devel/sanity/extra'
- name: Units
test: 'devel/units/1'
+ - stage: Ansible_2_17
+ displayName: Sanity & Units 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ targets:
+ - name: Sanity
+ test: '2.17/sanity/1'
+ - name: Units
+ test: '2.17/units/1'
- stage: Ansible_2_16
displayName: Sanity & Units 2.16
dependsOn: []
@@ -88,17 +99,6 @@ stages:
test: '2.15/sanity/1'
- name: Units
test: '2.15/units/1'
- - stage: Ansible_2_14
- displayName: Sanity & Units 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- targets:
- - name: Sanity
- test: '2.14/sanity/1'
- - name: Units
- test: '2.14/units/1'
### Docker
- stage: Docker_devel
@@ -115,8 +115,22 @@ stages:
test: ubuntu2004
- name: Ubuntu 22.04
test: ubuntu2204
- - name: Alpine 3
- test: alpine3
+ - name: Alpine 3.19
+ test: alpine319
+ groups:
+ - 4
+ - 5
+ - 6
+ - stage: Docker_2_17
+ displayName: Docker 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ testFormat: 2.17/linux/{0}
+ targets:
+ - name: Alpine 3.19
+ test: alpine319
groups:
- 4
- 5
@@ -135,6 +149,8 @@ stages:
test: centos7
- name: openSUSE 15
test: opensuse15
+ - name: Alpine 3
+ test: alpine3
groups:
- 4
- 5
@@ -155,20 +171,6 @@ stages:
- 4
- 5
- 6
- - stage: Docker_2_14
- displayName: Docker 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.14/linux/{0}
- targets:
- - name: Alpine 3
- test: alpine3
- groups:
- - 4
- - 5
- - 6
### Community Docker
- stage: Docker_community_devel
@@ -210,7 +212,27 @@ stages:
- 3
- 4
- 5
- - 6
+ # - 6 -- Docker 26 no longer works with docker-compose v1
+ - stage: Remote_2_17
+ displayName: Remote 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ testFormat: 2.17/{0}
+ targets:
+ - name: RHEL 9.3 with latest Docker SDK from PyPi
+ test: rhel/9.3-pypi-latest
+ # Currently always hangs in group 2
+ # - name: RHEL 8.8
+ # test: rhel/8.8
+ groups:
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ # - 6 -- Docker 26 no longer works with docker-compose v1
- stage: Remote_2_16
displayName: Remote 2.16
dependsOn: []
@@ -247,22 +269,6 @@ stages:
- 3
- 4
- 5
- - stage: Remote_2_14
- displayName: Remote 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.14/{0}
- targets:
- - name: RHEL 9.0
- test: rhel/9.0
- groups:
- - 1
- - 2
- - 3
- - 4
- - 5
## Finally
@@ -270,17 +276,17 @@ stages:
condition: succeededOrFailed()
dependsOn:
- Ansible_devel
+ - Ansible_2_17
- Ansible_2_16
- Ansible_2_15
- - Ansible_2_14
- Remote_devel
+ - Remote_2_17
- Remote_2_16
- Remote_2_15
- - Remote_2_14
- Docker_devel
+ - Docker_2_17
- Docker_2_16
- Docker_2_15
- - Docker_2_14
- Docker_community_devel
jobs:
- template: templates/coverage.yml
diff --git a/ansible_collections/community/docker/.github/workflows/ansible-test.yml b/ansible_collections/community/docker/.github/workflows/ansible-test.yml
index d8910d9f6..d0f253d35 100644
--- a/ansible_collections/community/docker/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/docker/.github/workflows/ansible-test.yml
@@ -32,6 +32,7 @@ jobs:
- '2.11'
- '2.12'
- '2.13'
+ - '2.14'
# Ansible-test on various stable branches does not yet work well with cgroups v2.
# Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04
# image for these stable branches. The list of branches where this is necessary will
@@ -72,6 +73,7 @@ jobs:
- '2.11'
- '2.12'
- '2.13'
+ - '2.14'
steps:
- name: Perform unit testing against Ansible version ${{ matrix.ansible }}
@@ -214,6 +216,19 @@ jobs:
docker: alpine3
python: ''
target: azp/6/
+ # 2.14
+ - ansible: '2.14'
+ docker: alpine3
+ python: ''
+ target: azp/4/
+ - ansible: '2.14'
+ docker: alpine3
+ python: ''
+ target: azp/5/
+ - ansible: '2.14'
+ docker: alpine3
+ python: ''
+ target: azp/6/
steps:
- name: Perform integration testing against Ansible version ${{ matrix.ansible }} under Python ${{ matrix.python }}
diff --git a/ansible_collections/community/docker/CHANGELOG.md b/ansible_collections/community/docker/CHANGELOG.md
index 2e232e769..f3a4b7af6 100644
--- a/ansible_collections/community/docker/CHANGELOG.md
+++ b/ansible_collections/community/docker/CHANGELOG.md
@@ -2,232 +2,259 @@
**Topics**
-- <a href="#v3-8-1">v3\.8\.1</a>
+- <a href="#v3-9-0">v3\.9\.0</a>
- <a href="#release-summary">Release Summary</a>
- - <a href="#security-fixes">Security Fixes</a>
+ - <a href="#minor-changes">Minor Changes</a>
- <a href="#bugfixes">Bugfixes</a>
-- <a href="#v3-8-0">v3\.8\.0</a>
+- <a href="#v3-8-1">v3\.8\.1</a>
- <a href="#release-summary-1">Release Summary</a>
- - <a href="#minor-changes">Minor Changes</a>
+ - <a href="#security-fixes">Security Fixes</a>
- <a href="#bugfixes-1">Bugfixes</a>
-- <a href="#v3-7-0">v3\.7\.0</a>
+- <a href="#v3-8-0">v3\.8\.0</a>
- <a href="#release-summary-2">Release Summary</a>
- <a href="#minor-changes-1">Minor Changes</a>
- <a href="#bugfixes-2">Bugfixes</a>
- - <a href="#new-modules">New Modules</a>
-- <a href="#v3-6-0">v3\.6\.0</a>
+- <a href="#v3-7-0">v3\.7\.0</a>
- <a href="#release-summary-3">Release Summary</a>
- - <a href="#major-changes">Major Changes</a>
- <a href="#minor-changes-2">Minor Changes</a>
- <a href="#bugfixes-3">Bugfixes</a>
- - <a href="#new-modules-1">New Modules</a>
-- <a href="#v3-5-0">v3\.5\.0</a>
+ - <a href="#new-modules">New Modules</a>
+- <a href="#v3-6-0">v3\.6\.0</a>
- <a href="#release-summary-4">Release Summary</a>
+ - <a href="#major-changes">Major Changes</a>
- <a href="#minor-changes-3">Minor Changes</a>
- - <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-4">Bugfixes</a>
-- <a href="#v3-4-11">v3\.4\.11</a>
+ - <a href="#new-modules-1">New Modules</a>
+- <a href="#v3-5-0">v3\.5\.0</a>
- <a href="#release-summary-5">Release Summary</a>
+ - <a href="#minor-changes-4">Minor Changes</a>
+ - <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-5">Bugfixes</a>
-- <a href="#v3-4-10">v3\.4\.10</a>
+- <a href="#v3-4-11">v3\.4\.11</a>
- <a href="#release-summary-6">Release Summary</a>
- <a href="#bugfixes-6">Bugfixes</a>
-- <a href="#v3-4-9">v3\.4\.9</a>
+- <a href="#v3-4-10">v3\.4\.10</a>
- <a href="#release-summary-7">Release Summary</a>
- <a href="#bugfixes-7">Bugfixes</a>
-- <a href="#v3-4-8">v3\.4\.8</a>
+- <a href="#v3-4-9">v3\.4\.9</a>
- <a href="#release-summary-8">Release Summary</a>
+ - <a href="#bugfixes-8">Bugfixes</a>
+- <a href="#v3-4-8">v3\.4\.8</a>
+ - <a href="#release-summary-9">Release Summary</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#v3-4-7">v3\.4\.7</a>
- - <a href="#release-summary-9">Release Summary</a>
- - <a href="#bugfixes-8">Bugfixes</a>
-- <a href="#v3-4-6">v3\.4\.6</a>
- <a href="#release-summary-10">Release Summary</a>
- <a href="#bugfixes-9">Bugfixes</a>
- - <a href="#known-issues-1">Known Issues</a>
-- <a href="#v3-4-5">v3\.4\.5</a>
+- <a href="#v3-4-6">v3\.4\.6</a>
- <a href="#release-summary-11">Release Summary</a>
- <a href="#bugfixes-10">Bugfixes</a>
-- <a href="#v3-4-4">v3\.4\.4</a>
+ - <a href="#known-issues-1">Known Issues</a>
+- <a href="#v3-4-5">v3\.4\.5</a>
- <a href="#release-summary-12">Release Summary</a>
- - <a href="#minor-changes-4">Minor Changes</a>
+ - <a href="#bugfixes-11">Bugfixes</a>
+- <a href="#v3-4-4">v3\.4\.4</a>
+ - <a href="#release-summary-13">Release Summary</a>
+ - <a href="#minor-changes-5">Minor Changes</a>
- <a href="#known-issues-2">Known Issues</a>
- <a href="#v3-4-3">v3\.4\.3</a>
- - <a href="#release-summary-13">Release Summary</a>
-- <a href="#v3-4-2">v3\.4\.2</a>
- <a href="#release-summary-14">Release Summary</a>
- - <a href="#bugfixes-11">Bugfixes</a>
-- <a href="#v3-4-1">v3\.4\.1</a>
+- <a href="#v3-4-2">v3\.4\.2</a>
- <a href="#release-summary-15">Release Summary</a>
- <a href="#bugfixes-12">Bugfixes</a>
-- <a href="#v3-4-0">v3\.4\.0</a>
+- <a href="#v3-4-1">v3\.4\.1</a>
- <a href="#release-summary-16">Release Summary</a>
- - <a href="#minor-changes-5">Minor Changes</a>
- <a href="#bugfixes-13">Bugfixes</a>
- - <a href="#new-modules-2">New Modules</a>
-- <a href="#v3-3-2">v3\.3\.2</a>
+- <a href="#v3-4-0">v3\.4\.0</a>
- <a href="#release-summary-17">Release Summary</a>
+ - <a href="#minor-changes-6">Minor Changes</a>
- <a href="#bugfixes-14">Bugfixes</a>
-- <a href="#v3-3-1">v3\.3\.1</a>
+ - <a href="#new-modules-2">New Modules</a>
+- <a href="#v3-3-2">v3\.3\.2</a>
- <a href="#release-summary-18">Release Summary</a>
- <a href="#bugfixes-15">Bugfixes</a>
-- <a href="#v3-3-0">v3\.3\.0</a>
+- <a href="#v3-3-1">v3\.3\.1</a>
- <a href="#release-summary-19">Release Summary</a>
- - <a href="#minor-changes-6">Minor Changes</a>
- <a href="#bugfixes-16">Bugfixes</a>
-- <a href="#v3-2-2">v3\.2\.2</a>
+- <a href="#v3-3-0">v3\.3\.0</a>
- <a href="#release-summary-20">Release Summary</a>
+ - <a href="#minor-changes-7">Minor Changes</a>
- <a href="#bugfixes-17">Bugfixes</a>
-- <a href="#v3-2-1">v3\.2\.1</a>
+- <a href="#v3-2-2">v3\.2\.2</a>
- <a href="#release-summary-21">Release Summary</a>
-- <a href="#v3-2-0">v3\.2\.0</a>
+ - <a href="#bugfixes-18">Bugfixes</a>
+- <a href="#v3-2-1">v3\.2\.1</a>
- <a href="#release-summary-22">Release Summary</a>
- - <a href="#minor-changes-7">Minor Changes</a>
- - <a href="#deprecated-features-1">Deprecated Features</a>
-- <a href="#v3-1-0">v3\.1\.0</a>
+- <a href="#v3-2-0">v3\.2\.0</a>
- <a href="#release-summary-23">Release Summary</a>
- <a href="#minor-changes-8">Minor Changes</a>
-- <a href="#v3-0-2">v3\.0\.2</a>
+ - <a href="#deprecated-features-1">Deprecated Features</a>
+- <a href="#v3-1-0">v3\.1\.0</a>
- <a href="#release-summary-24">Release Summary</a>
- - <a href="#bugfixes-18">Bugfixes</a>
-- <a href="#v3-0-1">v3\.0\.1</a>
+ - <a href="#minor-changes-9">Minor Changes</a>
+- <a href="#v3-0-2">v3\.0\.2</a>
- <a href="#release-summary-25">Release Summary</a>
- <a href="#bugfixes-19">Bugfixes</a>
-- <a href="#v3-0-0">v3\.0\.0</a>
+- <a href="#v3-0-1">v3\.0\.1</a>
- <a href="#release-summary-26">Release Summary</a>
+ - <a href="#bugfixes-20">Bugfixes</a>
+- <a href="#v3-0-0">v3\.0\.0</a>
+ - <a href="#release-summary-27">Release Summary</a>
- <a href="#major-changes-1">Major Changes</a>
- - <a href="#minor-changes-9">Minor Changes</a>
+ - <a href="#minor-changes-10">Minor Changes</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
- <a href="#security-fixes-1">Security Fixes</a>
- - <a href="#bugfixes-20">Bugfixes</a>
-- <a href="#v2-7-0">v2\.7\.0</a>
- - <a href="#release-summary-27">Release Summary</a>
- - <a href="#minor-changes-10">Minor Changes</a>
- - <a href="#deprecated-features-2">Deprecated Features</a>
- <a href="#bugfixes-21">Bugfixes</a>
-- <a href="#v2-6-0">v2\.6\.0</a>
+- <a href="#v2-7-0">v2\.7\.0</a>
- <a href="#release-summary-28">Release Summary</a>
- <a href="#minor-changes-11">Minor Changes</a>
- - <a href="#deprecated-features-3">Deprecated Features</a>
+ - <a href="#deprecated-features-2">Deprecated Features</a>
- <a href="#bugfixes-22">Bugfixes</a>
-- <a href="#v2-5-1">v2\.5\.1</a>
+- <a href="#v2-6-0">v2\.6\.0</a>
- <a href="#release-summary-29">Release Summary</a>
+ - <a href="#minor-changes-12">Minor Changes</a>
+ - <a href="#deprecated-features-3">Deprecated Features</a>
- <a href="#bugfixes-23">Bugfixes</a>
-- <a href="#v2-5-0">v2\.5\.0</a>
+- <a href="#v2-5-1">v2\.5\.1</a>
- <a href="#release-summary-30">Release Summary</a>
- - <a href="#minor-changes-12">Minor Changes</a>
-- <a href="#v2-4-0">v2\.4\.0</a>
+ - <a href="#bugfixes-24">Bugfixes</a>
+- <a href="#v2-5-0">v2\.5\.0</a>
- <a href="#release-summary-31">Release Summary</a>
- <a href="#minor-changes-13">Minor Changes</a>
- - <a href="#bugfixes-24">Bugfixes</a>
-- <a href="#v2-3-0">v2\.3\.0</a>
+- <a href="#v2-4-0">v2\.4\.0</a>
- <a href="#release-summary-32">Release Summary</a>
- <a href="#minor-changes-14">Minor Changes</a>
- <a href="#bugfixes-25">Bugfixes</a>
-- <a href="#v2-2-1">v2\.2\.1</a>
+- <a href="#v2-3-0">v2\.3\.0</a>
- <a href="#release-summary-33">Release Summary</a>
+ - <a href="#minor-changes-15">Minor Changes</a>
- <a href="#bugfixes-26">Bugfixes</a>
-- <a href="#v2-2-0">v2\.2\.0</a>
+- <a href="#v2-2-1">v2\.2\.1</a>
- <a href="#release-summary-34">Release Summary</a>
- - <a href="#minor-changes-15">Minor Changes</a>
- <a href="#bugfixes-27">Bugfixes</a>
-- <a href="#v2-1-1">v2\.1\.1</a>
+- <a href="#v2-2-0">v2\.2\.0</a>
- <a href="#release-summary-35">Release Summary</a>
+ - <a href="#minor-changes-16">Minor Changes</a>
- <a href="#bugfixes-28">Bugfixes</a>
-- <a href="#v2-1-0">v2\.1\.0</a>
+- <a href="#v2-1-1">v2\.1\.1</a>
- <a href="#release-summary-36">Release Summary</a>
- - <a href="#minor-changes-16">Minor Changes</a>
- <a href="#bugfixes-29">Bugfixes</a>
-- <a href="#v2-0-2">v2\.0\.2</a>
+- <a href="#v2-1-0">v2\.1\.0</a>
- <a href="#release-summary-37">Release Summary</a>
+ - <a href="#minor-changes-17">Minor Changes</a>
- <a href="#bugfixes-30">Bugfixes</a>
-- <a href="#v2-0-1">v2\.0\.1</a>
+- <a href="#v2-0-2">v2\.0\.2</a>
- <a href="#release-summary-38">Release Summary</a>
-- <a href="#v2-0-0">v2\.0\.0</a>
+ - <a href="#bugfixes-31">Bugfixes</a>
+- <a href="#v2-0-1">v2\.0\.1</a>
- <a href="#release-summary-39">Release Summary</a>
+- <a href="#v2-0-0">v2\.0\.0</a>
+ - <a href="#release-summary-40">Release Summary</a>
- <a href="#breaking-changes--porting-guide-1">Breaking Changes / Porting Guide</a>
- <a href="#deprecated-features-4">Deprecated Features</a>
- <a href="#removed-features-previously-deprecated-1">Removed Features \(previously deprecated\)</a>
- <a href="#v1-10-0">v1\.10\.0</a>
- - <a href="#release-summary-40">Release Summary</a>
- - <a href="#minor-changes-17">Minor Changes</a>
-- <a href="#v1-9-1">v1\.9\.1</a>
- <a href="#release-summary-41">Release Summary</a>
- - <a href="#bugfixes-31">Bugfixes</a>
-- <a href="#v1-9-0">v1\.9\.0</a>
- - <a href="#release-summary-42">Release Summary</a>
- <a href="#minor-changes-18">Minor Changes</a>
- - <a href="#deprecated-features-5">Deprecated Features</a>
+- <a href="#v1-9-1">v1\.9\.1</a>
+ - <a href="#release-summary-42">Release Summary</a>
- <a href="#bugfixes-32">Bugfixes</a>
- - <a href="#new-plugins">New Plugins</a>
- - <a href="#connection">Connection</a>
-- <a href="#v1-8-0">v1\.8\.0</a>
+- <a href="#v1-9-0">v1\.9\.0</a>
- <a href="#release-summary-43">Release Summary</a>
- <a href="#minor-changes-19">Minor Changes</a>
+ - <a href="#deprecated-features-5">Deprecated Features</a>
- <a href="#bugfixes-33">Bugfixes</a>
-- <a href="#v1-7-0">v1\.7\.0</a>
+ - <a href="#new-plugins">New Plugins</a>
+ - <a href="#connection">Connection</a>
+- <a href="#v1-8-0">v1\.8\.0</a>
- <a href="#release-summary-44">Release Summary</a>
- <a href="#minor-changes-20">Minor Changes</a>
-- <a href="#v1-6-1">v1\.6\.1</a>
- - <a href="#release-summary-45">Release Summary</a>
- <a href="#bugfixes-34">Bugfixes</a>
-- <a href="#v1-6-0">v1\.6\.0</a>
- - <a href="#release-summary-46">Release Summary</a>
+- <a href="#v1-7-0">v1\.7\.0</a>
+ - <a href="#release-summary-45">Release Summary</a>
- <a href="#minor-changes-21">Minor Changes</a>
- - <a href="#deprecated-features-6">Deprecated Features</a>
+- <a href="#v1-6-1">v1\.6\.1</a>
+ - <a href="#release-summary-46">Release Summary</a>
- <a href="#bugfixes-35">Bugfixes</a>
-- <a href="#v1-5-0">v1\.5\.0</a>
+- <a href="#v1-6-0">v1\.6\.0</a>
- <a href="#release-summary-47">Release Summary</a>
- <a href="#minor-changes-22">Minor Changes</a>
+ - <a href="#deprecated-features-6">Deprecated Features</a>
- <a href="#bugfixes-36">Bugfixes</a>
- - <a href="#new-modules-3">New Modules</a>
-- <a href="#v1-4-0">v1\.4\.0</a>
+- <a href="#v1-5-0">v1\.5\.0</a>
- <a href="#release-summary-48">Release Summary</a>
- <a href="#minor-changes-23">Minor Changes</a>
- - <a href="#breaking-changes--porting-guide-2">Breaking Changes / Porting Guide</a>
- - <a href="#security-fixes-2">Security Fixes</a>
- <a href="#bugfixes-37">Bugfixes</a>
-- <a href="#v1-3-0">v1\.3\.0</a>
+ - <a href="#new-modules-3">New Modules</a>
+- <a href="#v1-4-0">v1\.4\.0</a>
- <a href="#release-summary-49">Release Summary</a>
- <a href="#minor-changes-24">Minor Changes</a>
+ - <a href="#breaking-changes--porting-guide-2">Breaking Changes / Porting Guide</a>
+ - <a href="#security-fixes-2">Security Fixes</a>
- <a href="#bugfixes-38">Bugfixes</a>
+- <a href="#v1-3-0">v1\.3\.0</a>
+ - <a href="#release-summary-50">Release Summary</a>
+ - <a href="#minor-changes-25">Minor Changes</a>
+ - <a href="#bugfixes-39">Bugfixes</a>
- <a href="#new-modules-4">New Modules</a>
- <a href="#v1-2-2">v1\.2\.2</a>
- - <a href="#release-summary-50">Release Summary</a>
+ - <a href="#release-summary-51">Release Summary</a>
- <a href="#security-fixes-3">Security Fixes</a>
- <a href="#v1-2-1">v1\.2\.1</a>
- - <a href="#release-summary-51">Release Summary</a>
- - <a href="#bugfixes-39">Bugfixes</a>
-- <a href="#v1-2-0">v1\.2\.0</a>
- <a href="#release-summary-52">Release Summary</a>
- - <a href="#minor-changes-25">Minor Changes</a>
- <a href="#bugfixes-40">Bugfixes</a>
-- <a href="#v1-1-0">v1\.1\.0</a>
+- <a href="#v1-2-0">v1\.2\.0</a>
- <a href="#release-summary-53">Release Summary</a>
- <a href="#minor-changes-26">Minor Changes</a>
- - <a href="#deprecated-features-7">Deprecated Features</a>
- <a href="#bugfixes-41">Bugfixes</a>
+- <a href="#v1-1-0">v1\.1\.0</a>
+ - <a href="#release-summary-54">Release Summary</a>
+ - <a href="#minor-changes-27">Minor Changes</a>
+ - <a href="#deprecated-features-7">Deprecated Features</a>
+ - <a href="#bugfixes-42">Bugfixes</a>
- <a href="#new-plugins-1">New Plugins</a>
- <a href="#connection-1">Connection</a>
- <a href="#inventory">Inventory</a>
- <a href="#new-modules-5">New Modules</a>
- <a href="#v1-0-1">v1\.0\.1</a>
- - <a href="#release-summary-54">Release Summary</a>
- - <a href="#bugfixes-42">Bugfixes</a>
-- <a href="#v1-0-0">v1\.0\.0</a>
- <a href="#release-summary-55">Release Summary</a>
- - <a href="#minor-changes-27">Minor Changes</a>
-- <a href="#v0-1-0">v0\.1\.0</a>
+ - <a href="#bugfixes-43">Bugfixes</a>
+- <a href="#v1-0-0">v1\.0\.0</a>
- <a href="#release-summary-56">Release Summary</a>
- <a href="#minor-changes-28">Minor Changes</a>
+- <a href="#v0-1-0">v0\.1\.0</a>
+ - <a href="#release-summary-57">Release Summary</a>
+ - <a href="#minor-changes-29">Minor Changes</a>
- <a href="#removed-features-previously-deprecated-2">Removed Features \(previously deprecated\)</a>
- - <a href="#bugfixes-43">Bugfixes</a>
+ - <a href="#bugfixes-44">Bugfixes</a>
+
+<a id="v3-9-0"></a>
+## v3\.9\.0
+
+<a id="release-summary"></a>
+### Release Summary
+
+Bugfix and feature release\.
+
+<a id="minor-changes"></a>
+### Minor Changes
+
+* The EE requirements now include PyYAML\, since the <code>docker\_compose\_v2\*</code> modules depend on it when the <code>definition</code> option is used\. This should not have a noticable effect on generated EEs since ansible\-core itself depends on PyYAML as well\, and ansible\-builder explicitly ignores this dependency \([https\://github\.com/ansible\-collections/community\.docker/pull/832](https\://github\.com/ansible\-collections/community\.docker/pull/832)\)\.
+* docker\_compose\_v2\* \- the new option <code>check\_files\_existing</code> allows to disable the check for one of the files <code>compose\.yaml</code>\, <code>compose\.yml</code>\, <code>docker\-compose\.yaml</code>\, and <code>docker\-compose\.yml</code> in <code>project\_src</code> if <code>files</code> is not specified\. This is necessary if a non\-standard compose filename is specified through other means\, like the <code>COMPOSE\_FILE</code> environment variable \([https\://github\.com/ansible\-collections/community\.docker/issues/838](https\://github\.com/ansible\-collections/community\.docker/issues/838)\, [https\://github\.com/ansible\-collections/community\.docker/pull/839](https\://github\.com/ansible\-collections/community\.docker/pull/839)\)\.
+* docker\_compose\_v2\* modules \- allow to provide an inline definition of the compose content instead of having to provide a <code>project\_src</code> directory with the compose file written into it \([https\://github\.com/ansible\-collections/community\.docker/issues/829](https\://github\.com/ansible\-collections/community\.docker/issues/829)\, [https\://github\.com/ansible\-collections/community\.docker/pull/832](https\://github\.com/ansible\-collections/community\.docker/pull/832)\)\.
+* vendored Docker SDK for Python \- remove unused code that relies on functionality deprecated in Python 3\.12 \([https\://github\.com/ansible\-collections/community\.docker/pull/834](https\://github\.com/ansible\-collections/community\.docker/pull/834)\)\.
+
+<a id="bugfixes"></a>
+### Bugfixes
+
+* docker\_compose\_v2\* \- allow <code>project\_src</code> to be a relative path\, by converting it to an absolute path before using it \([https\://github\.com/ansible\-collections/community\.docker/issues/827](https\://github\.com/ansible\-collections/community\.docker/issues/827)\, [https\://github\.com/ansible\-collections/community\.docker/pull/828](https\://github\.com/ansible\-collections/community\.docker/pull/828)\)\.
+* docker\_compose\_v2\* modules \- abort with a nice error message instead of crash when the Docker Compose CLI plugin version is <code>dev</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/825](https\://github\.com/ansible\-collections/community\.docker/issues/825)\, [https\://github\.com/ansible\-collections/community\.docker/pull/826](https\://github\.com/ansible\-collections/community\.docker/pull/826)\)\.
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \([https\://github\.com/ansible\-collections/community\.docker/pull/835](https\://github\.com/ansible\-collections/community\.docker/pull/835)\)\.
<a id="v3-8-1"></a>
## v3\.8\.1
-<a id="release-summary"></a>
+<a id="release-summary-1"></a>
### Release Summary
Bugfix release
@@ -237,7 +264,7 @@ Bugfix release
* docker\_containers\, docker\_machine\, and docker\_swarm inventory plugins \- make sure all data received from the Docker daemon / Docker machine is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.docker/pull/815](https\://github\.com/ansible\-collections/community\.docker/pull/815)\)\.
-<a id="bugfixes"></a>
+<a id="bugfixes-1"></a>
### Bugfixes
* docker\_compose\_v2 \- do not fail when non\-fatal errors occur\. This can happen when pulling an image fails\, but then the image can be built for another service\. Docker Compose emits an error in that case\, but <code>docker compose up</code> still completes successfully \([https\://github\.com/ansible\-collections/community\.docker/issues/807](https\://github\.com/ansible\-collections/community\.docker/issues/807)\, [https\://github\.com/ansible\-collections/community\.docker/pull/810](https\://github\.com/ansible\-collections/community\.docker/pull/810)\, [https\://github\.com/ansible\-collections/community\.docker/pull/811](https\://github\.com/ansible\-collections/community\.docker/pull/811)\)\.
@@ -248,19 +275,19 @@ Bugfix release
<a id="v3-8-0"></a>
## v3\.8\.0
-<a id="release-summary-1"></a>
+<a id="release-summary-2"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes"></a>
+<a id="minor-changes-1"></a>
### Minor Changes
* docker\_compose\_v2 \- allow to wait until containers are running/health when running <code>docker compose up</code> with the new <code>wait</code> option \([https\://github\.com/ansible\-collections/community\.docker/issues/794](https\://github\.com/ansible\-collections/community\.docker/issues/794)\, [https\://github\.com/ansible\-collections/community\.docker/pull/796](https\://github\.com/ansible\-collections/community\.docker/pull/796)\)\.
* docker\_container \- the <code>pull\_check\_mode\_behavior</code> option now allows to control the module\'s behavior in check mode when <code>pull\=always</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/792](https\://github\.com/ansible\-collections/community\.docker/issues/792)\, [https\://github\.com/ansible\-collections/community\.docker/pull/797](https\://github\.com/ansible\-collections/community\.docker/pull/797)\)\.
* docker\_container \- the <code>pull</code> option now accepts the three values <code>never</code>\, <code>missing\_image</code> \(default\)\, and <code>never</code>\, next to the previously valid values <code>true</code> \(equivalent to <code>always</code>\) and <code>false</code> \(equivalent to <code>missing\_image</code>\)\. This allows the equivalent to <code>\-\-pull\=never</code> from the Docker command line \([https\://github\.com/ansible\-collections/community\.docker/issues/783](https\://github\.com/ansible\-collections/community\.docker/issues/783)\, [https\://github\.com/ansible\-collections/community\.docker/pull/797](https\://github\.com/ansible\-collections/community\.docker/pull/797)\)\.
-<a id="bugfixes-1"></a>
+<a id="bugfixes-2"></a>
### Bugfixes
* docker\_compose\_v2 \- do not consider a <code>Waiting</code> event as an action/change \([https\://github\.com/ansible\-collections/community\.docker/pull/804](https\://github\.com/ansible\-collections/community\.docker/pull/804)\)\.
@@ -270,18 +297,18 @@ Bugfix and feature release\.
<a id="v3-7-0"></a>
## v3\.7\.0
-<a id="release-summary-2"></a>
+<a id="release-summary-3"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-1"></a>
+<a id="minor-changes-2"></a>
### Minor Changes
* docker\_compose\_v2 \- add <code>scale</code> option to allow to explicitly scale services \([https\://github\.com/ansible\-collections/community\.docker/pull/776](https\://github\.com/ansible\-collections/community\.docker/pull/776)\)\.
* docker\_compose\_v2\, docker\_compose\_v2\_pull \- support <code>files</code> parameter to specify multiple Compose files \([https\://github\.com/ansible\-collections/community\.docker/issues/772](https\://github\.com/ansible\-collections/community\.docker/issues/772)\, [https\://github\.com/ansible\-collections/community\.docker/pull/775](https\://github\.com/ansible\-collections/community\.docker/pull/775)\)\.
-<a id="bugfixes-2"></a>
+<a id="bugfixes-3"></a>
### Bugfixes
* docker\_compose\_v2 \- properly parse dry\-run build events from <code>stderr</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/778](https\://github\.com/ansible\-collections/community\.docker/issues/778)\, [https\://github\.com/ansible\-collections/community\.docker/pull/779](https\://github\.com/ansible\-collections/community\.docker/pull/779)\)\.
@@ -295,7 +322,7 @@ Bugfix and feature release\.
<a id="v3-6-0"></a>
## v3\.6\.0
-<a id="release-summary-3"></a>
+<a id="release-summary-4"></a>
### Release Summary
Bugfix and feature release\.
@@ -315,7 +342,7 @@ so the main difference is that instead of some Python requirements\, they depend
* The <code>community\.docker</code> collection now depends on the <code>community\.library\_inventory\_filtering\_v1</code> collection\. This utility collection provides host filtering functionality for inventory plugins\. If you use the Ansible community package\, both collections are included and you do not have to do anything special\. If you install the collection with <code>ansible\-galaxy collection install</code>\, it will be installed automatically\. If you install the collection by copying the files of the collection to a place where ansible\-core can find it\, for example by cloning the git repository\, you need to make sure that you also have to install the dependency if you are using the inventory plugins \([https\://github\.com/ansible\-collections/community\.docker/pull/698](https\://github\.com/ansible\-collections/community\.docker/pull/698)\)\.
-<a id="minor-changes-2"></a>
+<a id="minor-changes-3"></a>
### Minor Changes
* The <code>ca\_cert</code> option available to almost all modules and plugins has been renamed to <code>ca\_path</code>\. The name <code>ca\_path</code> is also used for similar options in ansible\-core and other collections\. The old name has been added as an alias and can still be used \([https\://github\.com/ansible\-collections/community\.docker/pull/744](https\://github\.com/ansible\-collections/community\.docker/pull/744)\)\.
@@ -325,7 +352,7 @@ so the main difference is that instead of some Python requirements\, they depend
* docker\_image \- allow to specify memory size and swap memory size in other units than bytes \([https\://github\.com/ansible\-collections/community\.docker/pull/727](https\://github\.com/ansible\-collections/community\.docker/pull/727)\)\.
* inventory plugins \- add <code>filter</code> option which allows to include and exclude hosts based on Jinja2 conditions \([https\://github\.com/ansible\-collections/community\.docker/pull/698](https\://github\.com/ansible\-collections/community\.docker/pull/698)\, [https\://github\.com/ansible\-collections/community\.docker/issues/610](https\://github\.com/ansible\-collections/community\.docker/issues/610)\)\.
-<a id="bugfixes-3"></a>
+<a id="bugfixes-4"></a>
### Bugfixes
* Use <code>unix\:///var/run/docker\.sock</code> instead of the legacy <code>unix\://var/run/docker\.sock</code> as default for <code>docker\_host</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/736](https\://github\.com/ansible\-collections/community\.docker/pull/736)\)\.
@@ -345,12 +372,12 @@ so the main difference is that instead of some Python requirements\, they depend
<a id="v3-5-0"></a>
## v3\.5\.0
-<a id="release-summary-4"></a>
+<a id="release-summary-5"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-3"></a>
+<a id="minor-changes-4"></a>
### Minor Changes
* docker\_container \- implement better <code>platform</code> string comparisons to improve idempotency \([https\://github\.com/ansible\-collections/community\.docker/issues/654](https\://github\.com/ansible\-collections/community\.docker/issues/654)\, [https\://github\.com/ansible\-collections/community\.docker/pull/705](https\://github\.com/ansible\-collections/community\.docker/pull/705)\)\.
@@ -361,7 +388,7 @@ Bugfix and feature release\.
* docker\_container \- the default <code>ignore</code> for the <code>image\_name\_mismatch</code> parameter has been deprecated and will switch to <code>recreate</code> in community\.docker 4\.0\.0\. A deprecation warning will be printed in situations where the default value is used and where a behavior would change once the default changes \([https\://github\.com/ansible\-collections/community\.docker/pull/703](https\://github\.com/ansible\-collections/community\.docker/pull/703)\)\.
-<a id="bugfixes-4"></a>
+<a id="bugfixes-5"></a>
### Bugfixes
* modules and plugins using the Docker SDK for Python \- remove <code>ssl\_version</code> from the parameters passed to Docker SDK for Python 7\.0\.0\+\. Explicitly fail with a nicer error message if it was explicitly set in this case \([https\://github\.com/ansible\-collections/community\.docker/pull/715](https\://github\.com/ansible\-collections/community\.docker/pull/715)\)\.
@@ -371,12 +398,12 @@ Bugfix and feature release\.
<a id="v3-4-11"></a>
## v3\.4\.11
-<a id="release-summary-5"></a>
+<a id="release-summary-6"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-5"></a>
+<a id="bugfixes-6"></a>
### Bugfixes
* docker\_volume \- fix crash caused by accessing an empty dictionary\. The <code>has\_different\_config\(\)</code> was raising an <code>AttributeError</code> because the <code>self\.existing\_volume\[\"Labels\"\]</code> dictionary was <code>None</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/702](https\://github\.com/ansible\-collections/community\.docker/pull/702)\)\.
@@ -384,12 +411,12 @@ Bugfix release\.
<a id="v3-4-10"></a>
## v3\.4\.10
-<a id="release-summary-6"></a>
+<a id="release-summary-7"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-6"></a>
+<a id="bugfixes-7"></a>
### Bugfixes
* docker\_swarm \- make init and join operations work again with Docker SDK for Python before 4\.0\.0 \([https\://github\.com/ansible\-collections/community\.docker/issues/695](https\://github\.com/ansible\-collections/community\.docker/issues/695)\, [https\://github\.com/ansible\-collections/community\.docker/pull/696](https\://github\.com/ansible\-collections/community\.docker/pull/696)\)\.
@@ -397,12 +424,12 @@ Bugfix release\.
<a id="v3-4-9"></a>
## v3\.4\.9
-<a id="release-summary-7"></a>
+<a id="release-summary-8"></a>
### Release Summary
Maintenance release with updated documentation and vendored Docker SDK for Python code\.
-<a id="bugfixes-7"></a>
+<a id="bugfixes-8"></a>
### Bugfixes
* vendored Docker SDK for Python code \- cherry\-pick changes from the Docker SDK for Python code to align code\. These changes should not affect the parts used by the collection\'s code \([https\://github\.com/ansible\-collections/community\.docker/pull/694](https\://github\.com/ansible\-collections/community\.docker/pull/694)\)\.
@@ -410,7 +437,7 @@ Maintenance release with updated documentation and vendored Docker SDK for Pytho
<a id="v3-4-8"></a>
## v3\.4\.8
-<a id="release-summary-8"></a>
+<a id="release-summary-9"></a>
### Release Summary
Maintenance release with updated documentation\.
@@ -431,12 +458,12 @@ for the rendered HTML version of the documentation of the latest release\.
<a id="v3-4-7"></a>
## v3\.4\.7
-<a id="release-summary-9"></a>
+<a id="release-summary-10"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-8"></a>
+<a id="bugfixes-9"></a>
### Bugfixes
* docker\_swarm\_info \- if <code>service\=true</code> is used\, do not crash when a service without an endpoint spec is encountered \([https\://github\.com/ansible\-collections/community\.docker/issues/636](https\://github\.com/ansible\-collections/community\.docker/issues/636)\, [https\://github\.com/ansible\-collections/community\.docker/pull/637](https\://github\.com/ansible\-collections/community\.docker/pull/637)\)\.
@@ -444,12 +471,12 @@ Bugfix release\.
<a id="v3-4-6"></a>
## v3\.4\.6
-<a id="release-summary-10"></a>
+<a id="release-summary-11"></a>
### Release Summary
Bugfix release with documentation warnings about using certain functionality when connecting to the Docker daemon with TCP TLS\.
-<a id="bugfixes-9"></a>
+<a id="bugfixes-10"></a>
### Bugfixes
* socket\_handler module utils \- make sure this fully works when Docker SDK for Python is not available \([https\://github\.com/ansible\-collections/community\.docker/pull/620](https\://github\.com/ansible\-collections/community\.docker/pull/620)\)\.
@@ -466,12 +493,12 @@ Bugfix release with documentation warnings about using certain functionality whe
<a id="v3-4-5"></a>
## v3\.4\.5
-<a id="release-summary-11"></a>
+<a id="release-summary-12"></a>
### Release Summary
Maintenance release which adds compatibility with requests 2\.29\.0 and 2\.30\.0 and urllib3 2\.0\.
-<a id="bugfixes-10"></a>
+<a id="bugfixes-11"></a>
### Bugfixes
* Make vendored Docker SDK for Python code compatible with requests 2\.29\.0 and urllib3 2\.0 \([https\://github\.com/ansible\-collections/community\.docker/pull/613](https\://github\.com/ansible\-collections/community\.docker/pull/613)\)\.
@@ -479,12 +506,12 @@ Maintenance release which adds compatibility with requests 2\.29\.0 and 2\.30\.0
<a id="v3-4-4"></a>
## v3\.4\.4
-<a id="release-summary-12"></a>
+<a id="release-summary-13"></a>
### Release Summary
Maintenance release with updated EE requirements and updated documentation\.
-<a id="minor-changes-4"></a>
+<a id="minor-changes-5"></a>
### Minor Changes
* Restrict requests to versions before 2\.29\.0\, and urllib3 to versions before 2\.0\.0\. This is necessary until the vendored code from Docker SDK for Python has been fully adjusted to work with a feature of urllib3 that is used since requests 2\.29\.0 \([https\://github\.com/ansible\-collections/community\.docker/issues/611](https\://github\.com/ansible\-collections/community\.docker/issues/611)\, [https\://github\.com/ansible\-collections/community\.docker/pull/612](https\://github\.com/ansible\-collections/community\.docker/pull/612)\)\.
@@ -497,7 +524,7 @@ Maintenance release with updated EE requirements and updated documentation\.
<a id="v3-4-3"></a>
## v3\.4\.3
-<a id="release-summary-13"></a>
+<a id="release-summary-14"></a>
### Release Summary
Maintenance release with improved documentation\.
@@ -505,12 +532,12 @@ Maintenance release with improved documentation\.
<a id="v3-4-2"></a>
## v3\.4\.2
-<a id="release-summary-14"></a>
+<a id="release-summary-15"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-11"></a>
+<a id="bugfixes-12"></a>
### Bugfixes
* docker\_prune \- return correct value for <code>changed</code>\. So far the module always claimed that nothing changed \([https\://github\.com/ansible\-collections/community\.docker/pull/593](https\://github\.com/ansible\-collections/community\.docker/pull/593)\)\.
@@ -518,12 +545,12 @@ Bugfix release\.
<a id="v3-4-1"></a>
## v3\.4\.1
-<a id="release-summary-15"></a>
+<a id="release-summary-16"></a>
### Release Summary
Regular bugfix release\.
-<a id="bugfixes-12"></a>
+<a id="bugfixes-13"></a>
### Bugfixes
* docker\_api connection plugin\, docker\_container\_exec\, docker\_container\_copy\_into \- properly close socket to Daemon after executing commands in containers \([https\://github\.com/ansible\-collections/community\.docker/pull/582](https\://github\.com/ansible\-collections/community\.docker/pull/582)\)\.
@@ -533,18 +560,18 @@ Regular bugfix release\.
<a id="v3-4-0"></a>
## v3\.4\.0
-<a id="release-summary-16"></a>
+<a id="release-summary-17"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-5"></a>
+<a id="minor-changes-6"></a>
### Minor Changes
* docker\_api connection plugin \- when copying files to/from a container\, stream the file contents instead of first reading them to memory \([https\://github\.com/ansible\-collections/community\.docker/pull/545](https\://github\.com/ansible\-collections/community\.docker/pull/545)\)\.
* docker\_host\_info \- allow to list all containers with new option <code>containers\_all</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/535](https\://github\.com/ansible\-collections/community\.docker/issues/535)\, [https\://github\.com/ansible\-collections/community\.docker/pull/538](https\://github\.com/ansible\-collections/community\.docker/pull/538)\)\.
-<a id="bugfixes-13"></a>
+<a id="bugfixes-14"></a>
### Bugfixes
* docker\_api connection plugin \- fix error handling when 409 Conflict is returned by the Docker daemon in case of a stopped container \([https\://github\.com/ansible\-collections/community\.docker/pull/546](https\://github\.com/ansible\-collections/community\.docker/pull/546)\)\.
@@ -560,12 +587,12 @@ Regular bugfix and feature release\.
<a id="v3-3-2"></a>
## v3\.3\.2
-<a id="release-summary-17"></a>
+<a id="release-summary-18"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-14"></a>
+<a id="bugfixes-15"></a>
### Bugfixes
* docker\_container \- when <code>detach\=false</code>\, wait indefinitely and not at most one minute\. This was the behavior with Docker SDK for Python\, and was accidentally changed in 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.docker/issues/526](https\://github\.com/ansible\-collections/community\.docker/issues/526)\, [https\://github\.com/ansible\-collections/community\.docker/pull/527](https\://github\.com/ansible\-collections/community\.docker/pull/527)\)\.
@@ -573,12 +600,12 @@ Bugfix release\.
<a id="v3-3-1"></a>
## v3\.3\.1
-<a id="release-summary-18"></a>
+<a id="release-summary-19"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-15"></a>
+<a id="bugfixes-16"></a>
### Bugfixes
* current\_container\_facts \- make container detection work better in more cases \([https\://github\.com/ansible\-collections/community\.docker/pull/522](https\://github\.com/ansible\-collections/community\.docker/pull/522)\)\.
@@ -586,18 +613,18 @@ Bugfix release\.
<a id="v3-3-0"></a>
## v3\.3\.0
-<a id="release-summary-19"></a>
+<a id="release-summary-20"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-6"></a>
+<a id="minor-changes-7"></a>
### Minor Changes
* current\_container\_facts \- make work with current Docker version\, also support Podman \([https\://github\.com/ansible\-collections/community\.docker/pull/510](https\://github\.com/ansible\-collections/community\.docker/pull/510)\)\.
* docker\_image \- when using <code>archive\_path</code>\, detect whether changes are necessary based on the image ID \(hash\)\. If the existing tar archive matches the source\, do nothing\. Previously\, each task execution re\-created the archive \([https\://github\.com/ansible\-collections/community\.docker/pull/500](https\://github\.com/ansible\-collections/community\.docker/pull/500)\)\.
-<a id="bugfixes-16"></a>
+<a id="bugfixes-17"></a>
### Bugfixes
* docker\_container\_exec \- fix <code>chdir</code> option which was ignored since community\.docker 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.docker/issues/517](https\://github\.com/ansible\-collections/community\.docker/issues/517)\, [https\://github\.com/ansible\-collections/community\.docker/pull/518](https\://github\.com/ansible\-collections/community\.docker/pull/518)\)\.
@@ -606,12 +633,12 @@ Feature and bugfix release\.
<a id="v3-2-2"></a>
## v3\.2\.2
-<a id="release-summary-20"></a>
+<a id="release-summary-21"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-17"></a>
+<a id="bugfixes-18"></a>
### Bugfixes
* docker\_container \- the <code>kill\_signal</code> option erroneously did not accept strings anymore since 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.docker/issues/505](https\://github\.com/ansible\-collections/community\.docker/issues/505)\, [https\://github\.com/ansible\-collections/community\.docker/pull/506](https\://github\.com/ansible\-collections/community\.docker/pull/506)\)\.
@@ -619,7 +646,7 @@ Bugfix release\.
<a id="v3-2-1"></a>
## v3\.2\.1
-<a id="release-summary-21"></a>
+<a id="release-summary-22"></a>
### Release Summary
Maintenance release with improved documentation\.
@@ -627,12 +654,12 @@ Maintenance release with improved documentation\.
<a id="v3-2-0"></a>
## v3\.2\.0
-<a id="release-summary-22"></a>
+<a id="release-summary-23"></a>
### Release Summary
Feature and deprecation release\.
-<a id="minor-changes-7"></a>
+<a id="minor-changes-8"></a>
### Minor Changes
* docker\_container \- added <code>image\_name\_mismatch</code> option which allows to control the behavior if the container uses the image specified\, but the container\'s configuration uses a different name for the image than the one provided to the module \([https\://github\.com/ansible\-collections/community\.docker/issues/485](https\://github\.com/ansible\-collections/community\.docker/issues/485)\, [https\://github\.com/ansible\-collections/community\.docker/pull/488](https\://github\.com/ansible\-collections/community\.docker/pull/488)\)\.
@@ -646,12 +673,12 @@ Feature and deprecation release\.
<a id="v3-1-0"></a>
## v3\.1\.0
-<a id="release-summary-23"></a>
+<a id="release-summary-24"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-8"></a>
+<a id="minor-changes-9"></a>
### Minor Changes
* The collection repository conforms to the [REUSE specification](https\://reuse\.software/spec/) except for the changelog fragments \([https\://github\.com/ansible\-collections/community\.docker/pull/462](https\://github\.com/ansible\-collections/community\.docker/pull/462)\)\.
@@ -660,12 +687,12 @@ Feature release\.
<a id="v3-0-2"></a>
## v3\.0\.2
-<a id="release-summary-24"></a>
+<a id="release-summary-25"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-18"></a>
+<a id="bugfixes-19"></a>
### Bugfixes
* docker\_image \- fix build argument handling \([https\://github\.com/ansible\-collections/community\.docker/issues/455](https\://github\.com/ansible\-collections/community\.docker/issues/455)\, [https\://github\.com/ansible\-collections/community\.docker/pull/456](https\://github\.com/ansible\-collections/community\.docker/pull/456)\)\.
@@ -673,12 +700,12 @@ Bugfix release\.
<a id="v3-0-1"></a>
## v3\.0\.1
-<a id="release-summary-25"></a>
+<a id="release-summary-26"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-19"></a>
+<a id="bugfixes-20"></a>
### Bugfixes
* docker\_container \- fix handling of <code>env\_file</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/451](https\://github\.com/ansible\-collections/community\.docker/issues/451)\, [https\://github\.com/ansible\-collections/community\.docker/pull/452](https\://github\.com/ansible\-collections/community\.docker/pull/452)\)\.
@@ -686,7 +713,7 @@ Bugfix release\.
<a id="v3-0-0"></a>
## v3\.0\.0
-<a id="release-summary-26"></a>
+<a id="release-summary-27"></a>
### Release Summary
The 3\.0\.0 release features a rewrite of the <code>docker\_container</code> module\, and many modules and plugins no longer depend on the Docker SDK for Python\.
@@ -713,7 +740,7 @@ The 3\.0\.0 release features a rewrite of the <code>docker\_container</code> mod
* docker\_volume \- no longer uses the Docker SDK for Python\. It requires <code>requests</code> to be installed\, and depending on the features used has some more requirements\. If the Docker SDK for Python is installed\, these requirements are likely met \([https\://github\.com/ansible\-collections/community\.docker/pull/411](https\://github\.com/ansible\-collections/community\.docker/pull/411)\)\.
* docker\_volume\_info \- no longer uses the Docker SDK for Python\. It requires <code>requests</code> to be installed\, and depending on the features used has some more requirements\. If the Docker SDK for Python is installed\, these requirements are likely met \([https\://github\.com/ansible\-collections/community\.docker/pull/412](https\://github\.com/ansible\-collections/community\.docker/pull/412)\)\.
-<a id="minor-changes-9"></a>
+<a id="minor-changes-10"></a>
### Minor Changes
* All software licenses are now in the <code>LICENSES/</code> directory of the collection root\. Moreover\, <code>SPDX\-License\-Identifier\:</code> is used to declare the applicable license for every file that is not automatically generated \([https\://github\.com/ansible\-collections/community\.docker/pull/430](https\://github\.com/ansible\-collections/community\.docker/pull/430)\)\.
@@ -753,7 +780,7 @@ The 3\.0\.0 release features a rewrite of the <code>docker\_container</code> mod
* modules and plugins communicating directly with the Docker daemon \- when connecting by SSH and not using <code>use\_ssh\_client\=true</code>\, reject unknown host keys instead of accepting them\. This is only a change relative to older community\.docker 3\.0\.0 pre\-releases or with respect to Docker SDK for Python \< 6\.0\.0\. Docker SDK for Python 6\.0\.0 will also include this change \([https\://github\.com/ansible\-collections/community\.docker/pull/434](https\://github\.com/ansible\-collections/community\.docker/pull/434)\)\.
-<a id="bugfixes-20"></a>
+<a id="bugfixes-21"></a>
### Bugfixes
* docker\_image \- when composing the build context\, trim trailing whitespace from <code>\.dockerignore</code> entries\. This is only a change relative to older community\.docker 3\.0\.0 pre\-releases or with respect to Docker SDK for Python \< 6\.0\.0\. Docker SDK for Python 6\.0\.0 will also include this change \([https\://github\.com/ansible\-collections/community\.docker/pull/434](https\://github\.com/ansible\-collections/community\.docker/pull/434)\)\.
@@ -767,12 +794,12 @@ The 3\.0\.0 release features a rewrite of the <code>docker\_container</code> mod
<a id="v2-7-0"></a>
## v2\.7\.0
-<a id="release-summary-27"></a>
+<a id="release-summary-28"></a>
### Release Summary
Bugfix and deprecation release\. The next 2\.x\.y releases will only be bugfix releases\, the next expect minor/major release will be 3\.0\.0 with some major changes\.
-<a id="minor-changes-10"></a>
+<a id="minor-changes-11"></a>
### Minor Changes
* Move common utility functions from the <code>common</code> module\_util to a new module\_util called <code>util</code>\. This should not have any user\-visible effect \([https\://github\.com/ansible\-collections/community\.docker/pull/390](https\://github\.com/ansible\-collections/community\.docker/pull/390)\)\.
@@ -783,7 +810,7 @@ Bugfix and deprecation release\. The next 2\.x\.y releases will only be bugfix r
* Support for Docker API version 1\.20 to 1\.24 has been deprecated and will be removed in community\.docker 3\.0\.0\. The first Docker version supporting API version 1\.25 was Docker 1\.13\, released in January 2017\. This affects the modules <code>docker\_container</code>\, <code>docker\_container\_exec</code>\, <code>docker\_container\_info</code>\, <code>docker\_compose</code>\, <code>docker\_login</code>\, <code>docker\_image</code>\, <code>docker\_image\_info</code>\, <code>docker\_image\_load</code>\, <code>docker\_host\_info</code>\, <code>docker\_network</code>\, <code>docker\_network\_info</code>\, <code>docker\_node\_info</code>\, <code>docker\_swarm\_info</code>\, <code>docker\_swarm\_service</code>\, <code>docker\_swarm\_service\_info</code>\, <code>docker\_volume\_info</code>\, and <code>docker\_volume</code>\, whose minimally supported API version is between 1\.20 and 1\.24 \([https\://github\.com/ansible\-collections/community\.docker/pull/396](https\://github\.com/ansible\-collections/community\.docker/pull/396)\)\.
* Support for Python 2\.6 is deprecated and will be removed in the next major release \(community\.docker 3\.0\.0\)\. Some modules might still work with Python 2\.6\, but we will no longer try to ensure compatibility \([https\://github\.com/ansible\-collections/community\.docker/pull/388](https\://github\.com/ansible\-collections/community\.docker/pull/388)\)\.
-<a id="bugfixes-21"></a>
+<a id="bugfixes-22"></a>
### Bugfixes
* Docker SDK for Python based modules and plugins \- if the API version is specified as an option\, use that one to validate API version requirements of module/plugin options instead of the latest API version supported by the Docker daemon\. This also avoids one unnecessary API call per module/plugin \([https\://github\.com/ansible\-collections/community\.docker/pull/389](https\://github\.com/ansible\-collections/community\.docker/pull/389)\)\.
@@ -791,12 +818,12 @@ Bugfix and deprecation release\. The next 2\.x\.y releases will only be bugfix r
<a id="v2-6-0"></a>
## v2\.6\.0
-<a id="release-summary-28"></a>
+<a id="release-summary-29"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-11"></a>
+<a id="minor-changes-12"></a>
### Minor Changes
* docker\_container \- added <code>image\_label\_mismatch</code> parameter \([https\://github\.com/ansible\-collections/community\.docker/issues/314](https\://github\.com/ansible\-collections/community\.docker/issues/314)\, [https\://github\.com/ansible\-collections/community\.docker/pull/370](https\://github\.com/ansible\-collections/community\.docker/pull/370)\)\.
@@ -809,7 +836,7 @@ Bugfix and feature release\.
* Various modules \- the default of <code>tls\_hostname</code> that was supposed to be removed in community\.docker 2\.0\.0 will now be removed in version 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.docker/pull/362](https\://github\.com/ansible\-collections/community\.docker/pull/362)\)\.
* docker\_stack \- the return values <code>out</code> and <code>err</code> that were supposed to be removed in community\.docker 2\.0\.0 will now be removed in version 3\.0\.0 \([https\://github\.com/ansible\-collections/community\.docker/pull/362](https\://github\.com/ansible\-collections/community\.docker/pull/362)\)\.
-<a id="bugfixes-22"></a>
+<a id="bugfixes-23"></a>
### Bugfixes
* docker\_container \- fail with a meaningful message instead of crashing if a port is specified with more than three colon\-separated parts \([https\://github\.com/ansible\-collections/community\.docker/pull/367](https\://github\.com/ansible\-collections/community\.docker/pull/367)\, [https\://github\.com/ansible\-collections/community\.docker/issues/365](https\://github\.com/ansible\-collections/community\.docker/issues/365)\)\.
@@ -818,12 +845,12 @@ Bugfix and feature release\.
<a id="v2-5-1"></a>
## v2\.5\.1
-<a id="release-summary-29"></a>
+<a id="release-summary-30"></a>
### Release Summary
Maintenance release\.
-<a id="bugfixes-23"></a>
+<a id="bugfixes-24"></a>
### Bugfixes
* Include <code>PSF\-license\.txt</code> file for <code>plugins/module\_utils/\_version\.py</code>\.
@@ -831,12 +858,12 @@ Maintenance release\.
<a id="v2-5-0"></a>
## v2\.5\.0
-<a id="release-summary-30"></a>
+<a id="release-summary-31"></a>
### Release Summary
Regular feature release\.
-<a id="minor-changes-12"></a>
+<a id="minor-changes-13"></a>
### Minor Changes
* docker\_config \- add support for <code>template\_driver</code> with one option <code>golang</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/332](https\://github\.com/ansible\-collections/community\.docker/issues/332)\, [https\://github\.com/ansible\-collections/community\.docker/pull/345](https\://github\.com/ansible\-collections/community\.docker/pull/345)\)\.
@@ -845,19 +872,19 @@ Regular feature release\.
<a id="v2-4-0"></a>
## v2\.4\.0
-<a id="release-summary-31"></a>
+<a id="release-summary-32"></a>
### Release Summary
Regular feature and bugfix release\.
-<a id="minor-changes-13"></a>
+<a id="minor-changes-14"></a>
### Minor Changes
* Prepare collection for inclusion in an Execution Environment by declaring its dependencies\. The <code>docker\_stack\*</code> modules are not supported \([https\://github\.com/ansible\-collections/community\.docker/pull/336](https\://github\.com/ansible\-collections/community\.docker/pull/336)\)\.
* current\_container\_facts \- add detection for GitHub Actions \([https\://github\.com/ansible\-collections/community\.docker/pull/336](https\://github\.com/ansible\-collections/community\.docker/pull/336)\)\.
* docker\_container \- support returning Docker container log output when using Docker\'s <code>local</code> logging driver\, an optimized local logging driver introduced in Docker 18\.09 \([https\://github\.com/ansible\-collections/community\.docker/pull/337](https\://github\.com/ansible\-collections/community\.docker/pull/337)\)\.
-<a id="bugfixes-24"></a>
+<a id="bugfixes-25"></a>
### Bugfixes
* docker connection plugin \- make sure that <code>docker\_extra\_args</code> is used for querying the Docker version\. Also ensures that the Docker version is only queried when needed\. This is currently the case if a remote user is specified \([https\://github\.com/ansible\-collections/community\.docker/issues/325](https\://github\.com/ansible\-collections/community\.docker/issues/325)\, [https\://github\.com/ansible\-collections/community\.docker/pull/327](https\://github\.com/ansible\-collections/community\.docker/pull/327)\)\.
@@ -865,12 +892,12 @@ Regular feature and bugfix release\.
<a id="v2-3-0"></a>
## v2\.3\.0
-<a id="release-summary-32"></a>
+<a id="release-summary-33"></a>
### Release Summary
Regular feature and bugfix release\.
-<a id="minor-changes-14"></a>
+<a id="minor-changes-15"></a>
### Minor Changes
* docker connection plugin \- implement connection reset by clearing internal container user cache \([https\://github\.com/ansible\-collections/community\.docker/pull/312](https\://github\.com/ansible\-collections/community\.docker/pull/312)\)\.
@@ -879,7 +906,7 @@ Regular feature and bugfix release\.
* docker\_api connection plugin \- implement connection reset by clearing internal container user/group ID cache \([https\://github\.com/ansible\-collections/community\.docker/pull/312](https\://github\.com/ansible\-collections/community\.docker/pull/312)\)\.
* docker\_api connection plugin \- the plugin supports new ways to define the timeout\. These are the <code>ANSIBLE\_DOCKER\_TIMEOUT</code> environment variable\, the <code>timeout</code> setting in the <code>docker\_connection</code> section of <code>ansible\.cfg</code>\, and the <code>ansible\_docker\_timeout</code> variable \([https\://github\.com/ansible\-collections/community\.docker/pull/308](https\://github\.com/ansible\-collections/community\.docker/pull/308)\)\.
-<a id="bugfixes-25"></a>
+<a id="bugfixes-26"></a>
### Bugfixes
* docker connection plugin \- fix option handling to be compatible with ansible\-core 2\.13 \([https\://github\.com/ansible\-collections/community\.docker/pull/297](https\://github\.com/ansible\-collections/community\.docker/pull/297)\, [https\://github\.com/ansible\-collections/community\.docker/issues/307](https\://github\.com/ansible\-collections/community\.docker/issues/307)\)\.
@@ -888,12 +915,12 @@ Regular feature and bugfix release\.
<a id="v2-2-1"></a>
## v2\.2\.1
-<a id="release-summary-33"></a>
+<a id="release-summary-34"></a>
### Release Summary
Regular bugfix release\.
-<a id="bugfixes-26"></a>
+<a id="bugfixes-27"></a>
### Bugfixes
* docker\_compose \- fix Python 3 type error when extracting warnings or errors from docker\-compose\'s output \([https\://github\.com/ansible\-collections/community\.docker/pull/305](https\://github\.com/ansible\-collections/community\.docker/pull/305)\)\.
@@ -901,19 +928,19 @@ Regular bugfix release\.
<a id="v2-2-0"></a>
## v2\.2\.0
-<a id="release-summary-34"></a>
+<a id="release-summary-35"></a>
### Release Summary
Regular feature and bugfix release\.
-<a id="minor-changes-15"></a>
+<a id="minor-changes-16"></a>
### Minor Changes
* docker\_config \- add support for rolling update\, set <code>rolling\_versions</code> to <code>true</code> to enable \([https\://github\.com/ansible\-collections/community\.docker/pull/295](https\://github\.com/ansible\-collections/community\.docker/pull/295)\, [https\://github\.com/ansible\-collections/community\.docker/issues/109](https\://github\.com/ansible\-collections/community\.docker/issues/109)\)\.
* docker\_secret \- add support for rolling update\, set <code>rolling\_versions</code> to <code>true</code> to enable \([https\://github\.com/ansible\-collections/community\.docker/pull/293](https\://github\.com/ansible\-collections/community\.docker/pull/293)\, [https\://github\.com/ansible\-collections/community\.docker/issues/21](https\://github\.com/ansible\-collections/community\.docker/issues/21)\)\.
* docker\_swarm\_service \- add support for setting capabilities with the <code>cap\_add</code> and <code>cap\_drop</code> parameters\. Usage is the same as with the <code>capabilities</code> and <code>cap\_drop</code> parameters for <code>docker\_container</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/294](https\://github\.com/ansible\-collections/community\.docker/pull/294)\)\.
-<a id="bugfixes-27"></a>
+<a id="bugfixes-28"></a>
### Bugfixes
* docker\_container\, docker\_image \- adjust image finding code to peculiarities of <code>podman\-docker</code>\'s API emulation when Docker short names like <code>redis</code> are used \([https\://github\.com/ansible\-collections/community\.docker/issues/292](https\://github\.com/ansible\-collections/community\.docker/issues/292)\)\.
@@ -921,12 +948,12 @@ Regular feature and bugfix release\.
<a id="v2-1-1"></a>
## v2\.1\.1
-<a id="release-summary-35"></a>
+<a id="release-summary-36"></a>
### Release Summary
Emergency release to amend breaking change in previous release\.
-<a id="bugfixes-28"></a>
+<a id="bugfixes-29"></a>
### Bugfixes
* Fix unintended breaking change caused by [an earlier fix](https\://github\.com/ansible\-collections/community\.docker/pull/258) by vendoring the deprecated Python standard library <code>distutils\.version</code> until this collection stops supporting Ansible 2\.9 and ansible\-base 2\.10 \([https\://github\.com/ansible\-collections/community\.docker/issues/267](https\://github\.com/ansible\-collections/community\.docker/issues/267)\, [https\://github\.com/ansible\-collections/community\.docker/pull/269](https\://github\.com/ansible\-collections/community\.docker/pull/269)\)\.
@@ -934,18 +961,18 @@ Emergency release to amend breaking change in previous release\.
<a id="v2-1-0"></a>
## v2\.1\.0
-<a id="release-summary-36"></a>
+<a id="release-summary-37"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-16"></a>
+<a id="minor-changes-17"></a>
### Minor Changes
* docker\_container\_exec \- add <code>detach</code> parameter \([https\://github\.com/ansible\-collections/community\.docker/issues/250](https\://github\.com/ansible\-collections/community\.docker/issues/250)\, [https\://github\.com/ansible\-collections/community\.docker/pull/255](https\://github\.com/ansible\-collections/community\.docker/pull/255)\)\.
* docker\_container\_exec \- add <code>env</code> option \([https\://github\.com/ansible\-collections/community\.docker/issues/248](https\://github\.com/ansible\-collections/community\.docker/issues/248)\, [https\://github\.com/ansible\-collections/community\.docker/pull/254](https\://github\.com/ansible\-collections/community\.docker/pull/254)\)\.
-<a id="bugfixes-29"></a>
+<a id="bugfixes-30"></a>
### Bugfixes
* Various modules and plugins \- use vendored version of <code>distutils\.version</code> included in ansible\-core 2\.12 if available\. This avoids breakage when <code>distutils</code> is removed from the standard library of Python 3\.12\. Note that ansible\-core 2\.11\, ansible\-base 2\.10 and Ansible 2\.9 are right now not compatible with Python 3\.12\, hence this fix does not target these ansible\-core/\-base/2\.9 versions \([https\://github\.com/ansible\-collections/community\.docker/pull/258](https\://github\.com/ansible\-collections/community\.docker/pull/258)\)\.
@@ -955,12 +982,12 @@ Feature and bugfix release\.
<a id="v2-0-2"></a>
## v2\.0\.2
-<a id="release-summary-37"></a>
+<a id="release-summary-38"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-30"></a>
+<a id="bugfixes-31"></a>
### Bugfixes
* docker\_api connection plugin \- avoid passing an unnecessary argument to a Docker SDK for Python call that is only supported by version 3\.0\.0 or later \([https\://github\.com/ansible\-collections/community\.docker/pull/243](https\://github\.com/ansible\-collections/community\.docker/pull/243)\)\.
@@ -971,7 +998,7 @@ Bugfix release\.
<a id="v2-0-1"></a>
## v2\.0\.1
-<a id="release-summary-38"></a>
+<a id="release-summary-39"></a>
### Release Summary
Maintenance release with some documentation fixes\.
@@ -979,7 +1006,7 @@ Maintenance release with some documentation fixes\.
<a id="v2-0-0"></a>
## v2\.0\.0
-<a id="release-summary-39"></a>
+<a id="release-summary-40"></a>
### Release Summary
New major release with some deprecations removed and a breaking change in the <code>docker\_compose</code> module regarding the <code>timeout</code> parameter\.
@@ -987,7 +1014,7 @@ New major release with some deprecations removed and a breaking change in the <c
<a id="breaking-changes--porting-guide-1"></a>
### Breaking Changes / Porting Guide
-* docker\_compose \- fixed <code>timeout</code> defaulting behavior so that <code>stop\_grace\_period</code>\, if defined in the compose file\, will be used if <em class="title-reference">timeout\`</em> is not specified \([https\://github\.com/ansible\-collections/community\.docker/pull/163](https\://github\.com/ansible\-collections/community\.docker/pull/163)\)\.
+* docker\_compose \- fixed <code>timeout</code> defaulting behavior so that <code>stop\_grace\_period</code>\, if defined in the compose file\, will be used if <code>timeout</code> is not specified \([https\://github\.com/ansible\-collections/community\.docker/pull/163](https\://github\.com/ansible\-collections/community\.docker/pull/163)\)\.
<a id="deprecated-features-4"></a>
### Deprecated Features
@@ -1005,12 +1032,12 @@ New major release with some deprecations removed and a breaking change in the <c
<a id="v1-10-0"></a>
## v1\.10\.0
-<a id="release-summary-40"></a>
+<a id="release-summary-41"></a>
### Release Summary
Regular feature and bugfix release\.
-<a id="minor-changes-17"></a>
+<a id="minor-changes-18"></a>
### Minor Changes
* Add the modules docker\_container\_exec\, docker\_image\_load and docker\_plugin to the <code>docker</code> module defaults group \([https\://github\.com/ansible\-collections/community\.docker/pull/209](https\://github\.com/ansible\-collections/community\.docker/pull/209)\)\.
@@ -1020,12 +1047,12 @@ Regular feature and bugfix release\.
<a id="v1-9-1"></a>
## v1\.9\.1
-<a id="release-summary-41"></a>
+<a id="release-summary-42"></a>
### Release Summary
Regular bugfix release\.
-<a id="bugfixes-31"></a>
+<a id="bugfixes-32"></a>
### Bugfixes
* docker\_compose \- fixed incorrect <code>changed</code> status for services with <code>profiles</code> defined\, but none enabled \([https\://github\.com/ansible\-collections/community\.docker/pull/192](https\://github\.com/ansible\-collections/community\.docker/pull/192)\)\.
@@ -1033,12 +1060,12 @@ Regular bugfix release\.
<a id="v1-9-0"></a>
## v1\.9\.0
-<a id="release-summary-42"></a>
+<a id="release-summary-43"></a>
### Release Summary
New bugfixes and features release\.
-<a id="minor-changes-18"></a>
+<a id="minor-changes-19"></a>
### Minor Changes
* docker\_\* modules \- include <code>ImportError</code> traceback when reporting that Docker SDK for Python could not be found \([https\://github\.com/ansible\-collections/community\.docker/pull/188](https\://github\.com/ansible\-collections/community\.docker/pull/188)\)\.
@@ -1052,7 +1079,7 @@ New bugfixes and features release\.
* docker\_container \- the new <code>command\_handling</code>\'s default value\, <code>compatibility</code>\, is deprecated and will change to <code>correct</code> in community\.docker 3\.0\.0\. A deprecation warning is emitted by the module in cases where the behavior will change\. Please note that ansible\-core will output a deprecation warning only once\, so if it is shown for an earlier task\, there could be more tasks with this warning where it is not shown \([https\://github\.com/ansible\-collections/community\.docker/pull/186](https\://github\.com/ansible\-collections/community\.docker/pull/186)\)\.
-<a id="bugfixes-32"></a>
+<a id="bugfixes-33"></a>
### Bugfixes
* docker\_compose \- fixes task failures when bringing up services while using <code>docker\-compose \<1\.17\.0</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/180](https\://github\.com/ansible\-collections/community\.docker/issues/180)\)\.
@@ -1071,12 +1098,12 @@ New bugfixes and features release\.
<a id="v1-8-0"></a>
## v1\.8\.0
-<a id="release-summary-43"></a>
+<a id="release-summary-44"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-19"></a>
+<a id="minor-changes-20"></a>
### Minor Changes
* Avoid internal ansible\-core module\_utils in favor of equivalent public API available since at least Ansible 2\.9 \([https\://github\.com/ansible\-collections/community\.docker/pull/164](https\://github\.com/ansible\-collections/community\.docker/pull/164)\)\.
@@ -1085,7 +1112,7 @@ Regular bugfix and feature release\.
* docker\_host\_info \- allow values for keys in <code>containers\_filters</code>\, <code>images\_filters</code>\, <code>networks\_filters</code>\, and <code>volumes\_filters</code> to be passed as YAML lists \([https\://github\.com/ansible\-collections/community\.docker/pull/160](https\://github\.com/ansible\-collections/community\.docker/pull/160)\)\.
* docker\_plugin \- added <code>alias</code> option to specify local names for docker plugins \([https\://github\.com/ansible\-collections/community\.docker/pull/161](https\://github\.com/ansible\-collections/community\.docker/pull/161)\)\.
-<a id="bugfixes-33"></a>
+<a id="bugfixes-34"></a>
### Bugfixes
* docker\_compose \- fix idempotence bug when using <code>stopped\: true</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/142](https\://github\.com/ansible\-collections/community\.docker/issues/142)\, [https\://github\.com/ansible\-collections/community\.docker/pull/159](https\://github\.com/ansible\-collections/community\.docker/pull/159)\)\.
@@ -1093,12 +1120,12 @@ Regular bugfix and feature release\.
<a id="v1-7-0"></a>
## v1\.7\.0
-<a id="release-summary-44"></a>
+<a id="release-summary-45"></a>
### Release Summary
Small feature and bugfix release\.
-<a id="minor-changes-20"></a>
+<a id="minor-changes-21"></a>
### Minor Changes
* docker\_image \- allow to tag images by ID \([https\://github\.com/ansible\-collections/community\.docker/pull/149](https\://github\.com/ansible\-collections/community\.docker/pull/149)\)\.
@@ -1106,12 +1133,12 @@ Small feature and bugfix release\.
<a id="v1-6-1"></a>
## v1\.6\.1
-<a id="release-summary-45"></a>
+<a id="release-summary-46"></a>
### Release Summary
Bugfix release to reduce deprecation warning spam\.
-<a id="bugfixes-34"></a>
+<a id="bugfixes-35"></a>
### Bugfixes
* docker\_\* modules and plugins\, except <code>docker\_swarm</code> connection plugin and <code>docker\_compose</code> and <code>docker\_stack\*\` modules \- only emit \`\`tls\_hostname</code> deprecation message if TLS is actually used \([https\://github\.com/ansible\-collections/community\.docker/pull/143](https\://github\.com/ansible\-collections/community\.docker/pull/143)\)\.
@@ -1119,12 +1146,12 @@ Bugfix release to reduce deprecation warning spam\.
<a id="v1-6-0"></a>
## v1\.6\.0
-<a id="release-summary-46"></a>
+<a id="release-summary-47"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-21"></a>
+<a id="minor-changes-22"></a>
### Minor Changes
* common module utils \- correct error messages for guiding to install proper Docker SDK for Python module \([https\://github\.com/ansible\-collections/community\.docker/pull/125](https\://github\.com/ansible\-collections/community\.docker/pull/125)\)\.
@@ -1135,7 +1162,7 @@ Regular bugfix and feature release\.
* docker\_\* modules and plugins\, except <code>docker\_swarm</code> connection plugin and <code>docker\_compose</code> and <code>docker\_stack\*\` modules \- the current default \`\`localhost</code> for <code>tls\_hostname</code> is deprecated\. In community\.docker 2\.0\.0 it will be computed from <code>docker\_host</code> instead \([https\://github\.com/ansible\-collections/community\.docker/pull/134](https\://github\.com/ansible\-collections/community\.docker/pull/134)\)\.
-<a id="bugfixes-35"></a>
+<a id="bugfixes-36"></a>
### Bugfixes
* docker\-compose \- fix not pulling when <code>state\: present</code> and <code>stopped\: true</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/12](https\://github\.com/ansible\-collections/community\.docker/issues/12)\, [https\://github\.com/ansible\-collections/community\.docker/pull/119](https\://github\.com/ansible\-collections/community\.docker/pull/119)\)\.
@@ -1145,17 +1172,17 @@ Regular bugfix and feature release\.
<a id="v1-5-0"></a>
## v1\.5\.0
-<a id="release-summary-47"></a>
+<a id="release-summary-48"></a>
### Release Summary
Regular feature release\.
-<a id="minor-changes-22"></a>
+<a id="minor-changes-23"></a>
### Minor Changes
* Add the <code>use\_ssh\_client</code> option to most docker modules and plugins \([https\://github\.com/ansible\-collections/community\.docker/issues/108](https\://github\.com/ansible\-collections/community\.docker/issues/108)\, [https\://github\.com/ansible\-collections/community\.docker/pull/114](https\://github\.com/ansible\-collections/community\.docker/pull/114)\)\.
-<a id="bugfixes-36"></a>
+<a id="bugfixes-37"></a>
### Bugfixes
* all modules \- use <code>to\_native</code> to convert exceptions to strings \([https\://github\.com/ansible\-collections/community\.docker/pull/121](https\://github\.com/ansible\-collections/community\.docker/pull/121)\)\.
@@ -1168,12 +1195,12 @@ Regular feature release\.
<a id="v1-4-0"></a>
## v1\.4\.0
-<a id="release-summary-48"></a>
+<a id="release-summary-49"></a>
### Release Summary
Security release to address another potential secret leak\. Also includes regular bugfixes and features\.
-<a id="minor-changes-23"></a>
+<a id="minor-changes-24"></a>
### Minor Changes
* docker\_swarm\_service \- change <code>publish\.published\_port</code> option from mandatory to optional\. Docker will assign random high port if not specified \([https\://github\.com/ansible\-collections/community\.docker/issues/99](https\://github\.com/ansible\-collections/community\.docker/issues/99)\)\.
@@ -1188,7 +1215,7 @@ Security release to address another potential secret leak\. Also includes regula
* docker\_swarm \- the <code>join\_token</code> option is now marked as <code>no\_log</code> so it is no longer written into logs \([https\://github\.com/ansible\-collections/community\.docker/pull/103](https\://github\.com/ansible\-collections/community\.docker/pull/103)\)\.
-<a id="bugfixes-37"></a>
+<a id="bugfixes-38"></a>
### Bugfixes
* <code>docker\_swarm\_service</code> \- fix KeyError on caused by reference to deprecated option <code>update\_failure\_action</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/100](https\://github\.com/ansible\-collections/community\.docker/pull/100)\)\.
@@ -1197,12 +1224,12 @@ Security release to address another potential secret leak\. Also includes regula
<a id="v1-3-0"></a>
## v1\.3\.0
-<a id="release-summary-49"></a>
+<a id="release-summary-50"></a>
### Release Summary
Regular feature and bugfix release\.
-<a id="minor-changes-24"></a>
+<a id="minor-changes-25"></a>
### Minor Changes
* docker\_container \- add <code>storage\_opts</code> option to specify storage options \([https\://github\.com/ansible\-collections/community\.docker/issues/91](https\://github\.com/ansible\-collections/community\.docker/issues/91)\, [https\://github\.com/ansible\-collections/community\.docker/pull/93](https\://github\.com/ansible\-collections/community\.docker/pull/93)\)\.
@@ -1210,7 +1237,7 @@ Regular feature and bugfix release\.
* docker\_image \- properly support image IDs \(hashes\) for loading and tagging images \([https\://github\.com/ansible\-collections/community\.docker/issues/86](https\://github\.com/ansible\-collections/community\.docker/issues/86)\, [https\://github\.com/ansible\-collections/community\.docker/pull/87](https\://github\.com/ansible\-collections/community\.docker/pull/87)\)\.
* docker\_swarm\_service \- adding support for maximum number of tasks per node \(<code>replicas\_max\_per\_node</code>\) when running swarm service in replicated mode\. Introduced in API 1\.40 \([https\://github\.com/ansible\-collections/community\.docker/issues/7](https\://github\.com/ansible\-collections/community\.docker/issues/7)\, [https\://github\.com/ansible\-collections/community\.docker/pull/92](https\://github\.com/ansible\-collections/community\.docker/pull/92)\)\.
-<a id="bugfixes-38"></a>
+<a id="bugfixes-39"></a>
### Bugfixes
* docker\_container \- fix healthcheck disabling idempotency issue with strict comparison \([https\://github\.com/ansible\-collections/community\.docker/issues/85](https\://github\.com/ansible\-collections/community\.docker/issues/85)\)\.
@@ -1228,7 +1255,7 @@ Regular feature and bugfix release\.
<a id="v1-2-2"></a>
## v1\.2\.2
-<a id="release-summary-50"></a>
+<a id="release-summary-51"></a>
### Release Summary
Security bugfix release to address CVE\-2021\-20191\.
@@ -1241,12 +1268,12 @@ Security bugfix release to address CVE\-2021\-20191\.
<a id="v1-2-1"></a>
## v1\.2\.1
-<a id="release-summary-51"></a>
+<a id="release-summary-52"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-39"></a>
+<a id="bugfixes-40"></a>
### Bugfixes
* docker connection plugin \- fix Docker version parsing\, as some docker versions have a leading <code>v</code> in the output of the command <code>docker version \-\-format \"\{\{\.Server\.Version\}\}\"</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/76](https\://github\.com/ansible\-collections/community\.docker/pull/76)\)\.
@@ -1254,17 +1281,17 @@ Bugfix release\.
<a id="v1-2-0"></a>
## v1\.2\.0
-<a id="release-summary-52"></a>
+<a id="release-summary-53"></a>
### Release Summary
Feature release with one new feature and two bugfixes\.
-<a id="minor-changes-25"></a>
+<a id="minor-changes-26"></a>
### Minor Changes
* docker\_container \- added <code>default\_host\_ip</code> option which allows to explicitly set the default IP string for published ports without explicitly specified IPs\. When using IPv6 binds with Docker 20\.10\.2 or newer\, this needs to be set to an empty string \(<code>\"\"</code>\) \([https\://github\.com/ansible\-collections/community\.docker/issues/70](https\://github\.com/ansible\-collections/community\.docker/issues/70)\, [https\://github\.com/ansible\-collections/community\.docker/pull/71](https\://github\.com/ansible\-collections/community\.docker/pull/71)\)\.
-<a id="bugfixes-40"></a>
+<a id="bugfixes-41"></a>
### Bugfixes
* docker\_container \- allow IPv6 zones \(RFC 4007\) in bind IPs \([https\://github\.com/ansible\-collections/community\.docker/pull/66](https\://github\.com/ansible\-collections/community\.docker/pull/66)\)\.
@@ -1273,12 +1300,12 @@ Feature release with one new feature and two bugfixes\.
<a id="v1-1-0"></a>
## v1\.1\.0
-<a id="release-summary-53"></a>
+<a id="release-summary-54"></a>
### Release Summary
Feature release with three new plugins and modules\.
-<a id="minor-changes-26"></a>
+<a id="minor-changes-27"></a>
### Minor Changes
* docker\_container \- support specifying <code>cgroup\_parent</code> \([https\://github\.com/ansible\-collections/community\.docker/issues/6](https\://github\.com/ansible\-collections/community\.docker/issues/6)\, [https\://github\.com/ansible\-collections/community\.docker/pull/59](https\://github\.com/ansible\-collections/community\.docker/pull/59)\)\.
@@ -1290,7 +1317,7 @@ Feature release with three new plugins and modules\.
* docker\_container \- currently <code>published\_ports</code> can contain port mappings next to the special value <code>all</code>\, in which case the port mappings are ignored\. This behavior is deprecated for community\.docker 2\.0\.0\, at which point it will either be forbidden\, or this behavior will be properly implemented similar to how the Docker CLI tool handles this \([https\://github\.com/ansible\-collections/community\.docker/issues/8](https\://github\.com/ansible\-collections/community\.docker/issues/8)\, [https\://github\.com/ansible\-collections/community\.docker/pull/60](https\://github\.com/ansible\-collections/community\.docker/pull/60)\)\.
-<a id="bugfixes-41"></a>
+<a id="bugfixes-42"></a>
### Bugfixes
* docker\_image \- if <code>push\=true</code> is used with <code>repository</code>\, and the image does not need to be tagged\, still push\. This can happen if <code>repository</code> and <code>name</code> are equal \([https\://github\.com/ansible\-collections/community\.docker/issues/52](https\://github\.com/ansible\-collections/community\.docker/issues/52)\, [https\://github\.com/ansible\-collections/community\.docker/pull/53](https\://github\.com/ansible\-collections/community\.docker/pull/53)\)\.
@@ -1318,12 +1345,12 @@ Feature release with three new plugins and modules\.
<a id="v1-0-1"></a>
## v1\.0\.1
-<a id="release-summary-54"></a>
+<a id="release-summary-55"></a>
### Release Summary
Maintenance release with a bugfix for <code>docker\_container</code>\.
-<a id="bugfixes-42"></a>
+<a id="bugfixes-43"></a>
### Bugfixes
* docker\_container \- the validation for <code>capabilities</code> in <code>device\_requests</code> was incorrect \([https\://github\.com/ansible\-collections/community\.docker/issues/42](https\://github\.com/ansible\-collections/community\.docker/issues/42)\, [https\://github\.com/ansible\-collections/community\.docker/pull/43](https\://github\.com/ansible\-collections/community\.docker/pull/43)\)\.
@@ -1331,12 +1358,12 @@ Maintenance release with a bugfix for <code>docker\_container</code>\.
<a id="v1-0-0"></a>
## v1\.0\.0
-<a id="release-summary-55"></a>
+<a id="release-summary-56"></a>
### Release Summary
This is the first production \(non\-prerelease\) release of <code>community\.docker</code>\.
-<a id="minor-changes-27"></a>
+<a id="minor-changes-28"></a>
### Minor Changes
* Add collection\-side support of the <code>docker</code> action group / module defaults group \([https\://github\.com/ansible\-collections/community\.docker/pull/17](https\://github\.com/ansible\-collections/community\.docker/pull/17)\)\.
@@ -1346,14 +1373,14 @@ This is the first production \(non\-prerelease\) release of <code>community\.doc
<a id="v0-1-0"></a>
## v0\.1\.0
-<a id="release-summary-56"></a>
+<a id="release-summary-57"></a>
### Release Summary
The <code>community\.docker</code> continues the work on the Ansible docker modules and plugins from their state in <code>community\.general</code> 1\.2\.0\. The changes listed here are thus relative to the modules and plugins <code>community\.general\.docker\*</code>\.
All deprecation removals planned for <code>community\.general</code> 2\.0\.0 have been applied\. All deprecation removals scheduled for <code>community\.general</code> 3\.0\.0 have been re\-scheduled for <code>community\.docker</code> 2\.0\.0\.
-<a id="minor-changes-28"></a>
+<a id="minor-changes-29"></a>
### Minor Changes
* docker\_container \- now supports the <code>device\_requests</code> option\, which allows to request additional resources such as GPUs \([https\://github\.com/ansible/ansible/issues/65748](https\://github\.com/ansible/ansible/issues/65748)\, [https\://github\.com/ansible\-collections/community\.general/pull/1119](https\://github\.com/ansible\-collections/community\.general/pull/1119)\)\.
@@ -1384,7 +1411,7 @@ All deprecation removals planned for <code>community\.general</code> 2\.0\.0 hav
* docker\_volume \- no longer returns <code>ansible\_facts</code> \([https\://github\.com/ansible\-collections/community\.docker/pull/1](https\://github\.com/ansible\-collections/community\.docker/pull/1)\)\.
* docker\_volume \- the <code>force</code> option has been removed\. Use <code>recreate</code> instead \([https\://github\.com/ansible\-collections/community\.docker/pull/1](https\://github\.com/ansible\-collections/community\.docker/pull/1)\)\.
-<a id="bugfixes-43"></a>
+<a id="bugfixes-44"></a>
### Bugfixes
* docker\_login \- fix internal config file storage to handle credentials for more than one registry \([https\://github\.com/ansible\-collections/community\.general/issues/1117](https\://github\.com/ansible\-collections/community\.general/issues/1117)\)\.
diff --git a/ansible_collections/community/docker/CHANGELOG.rst b/ansible_collections/community/docker/CHANGELOG.rst
index 74e43714e..1e2ef58a6 100644
--- a/ansible_collections/community/docker/CHANGELOG.rst
+++ b/ansible_collections/community/docker/CHANGELOG.rst
@@ -4,6 +4,29 @@ Docker Community Collection Release Notes
.. contents:: Topics
+v3.9.0
+======
+
+Release Summary
+---------------
+
+Bugfix and feature release.
+
+Minor Changes
+-------------
+
+- The EE requirements now include PyYAML, since the ``docker_compose_v2*`` modules depend on it when the ``definition`` option is used. This should not have a noticable effect on generated EEs since ansible-core itself depends on PyYAML as well, and ansible-builder explicitly ignores this dependency (https://github.com/ansible-collections/community.docker/pull/832).
+- docker_compose_v2* - the new option ``check_files_existing`` allows to disable the check for one of the files ``compose.yaml``, ``compose.yml``, ``docker-compose.yaml``, and ``docker-compose.yml`` in ``project_src`` if ``files`` is not specified. This is necessary if a non-standard compose filename is specified through other means, like the ``COMPOSE_FILE`` environment variable (https://github.com/ansible-collections/community.docker/issues/838, https://github.com/ansible-collections/community.docker/pull/839).
+- docker_compose_v2* modules - allow to provide an inline definition of the compose content instead of having to provide a ``project_src`` directory with the compose file written into it (https://github.com/ansible-collections/community.docker/issues/829, https://github.com/ansible-collections/community.docker/pull/832).
+- vendored Docker SDK for Python - remove unused code that relies on functionality deprecated in Python 3.12 (https://github.com/ansible-collections/community.docker/pull/834).
+
+Bugfixes
+--------
+
+- docker_compose_v2* - allow ``project_src`` to be a relative path, by converting it to an absolute path before using it (https://github.com/ansible-collections/community.docker/issues/827, https://github.com/ansible-collections/community.docker/pull/828).
+- docker_compose_v2* modules - abort with a nice error message instead of crash when the Docker Compose CLI plugin version is ``dev`` (https://github.com/ansible-collections/community.docker/issues/825, https://github.com/ansible-collections/community.docker/pull/826).
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.docker/pull/835).
+
v3.8.1
======
@@ -768,7 +791,7 @@ New major release with some deprecations removed and a breaking change in the ``
Breaking Changes / Porting Guide
--------------------------------
-- docker_compose - fixed ``timeout`` defaulting behavior so that ``stop_grace_period``, if defined in the compose file, will be used if `timeout`` is not specified (https://github.com/ansible-collections/community.docker/pull/163).
+- docker_compose - fixed ``timeout`` defaulting behavior so that ``stop_grace_period``, if defined in the compose file, will be used if ``timeout`` is not specified (https://github.com/ansible-collections/community.docker/pull/163).
Deprecated Features
-------------------
diff --git a/ansible_collections/community/docker/FILES.json b/ansible_collections/community/docker/FILES.json
index 9797df497..da52548f1 100644
--- a/ansible_collections/community/docker/FILES.json
+++ b/ansible_collections/community/docker/FILES.json
@@ -109,7 +109,7 @@
"name": ".azure-pipelines/azure-pipelines.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4083b64eda9b5fdcbf472007a0a8edc921d46d7d2132b870ccddfc04b72aede1",
+ "chksum_sha256": "84dc585b738c2bfea68ee8e9cd6d4417f36627bd96a67f92b6f8073449b2d7af",
"format": 1
},
{
@@ -130,7 +130,7 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1b9c8b20850a848ebb8c91cdb9382cc3e521658fb2bbe1bb62f6357565e044d",
+ "chksum_sha256": "4082845558609060198c2628d77b14eb18b28f48faf0fc08116fee817b4e056c",
"format": 1
},
{
@@ -242,7 +242,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "78b978f9536ee113fed773101c478a20057167e348c8d5b6cdb77f44e62d9b6f",
+ "chksum_sha256": "d3068c91410e1c891056bfdefa3812fb91ed3ccd41fe97b6aaa428debcd5b663",
"format": 1
},
{
@@ -291,7 +291,7 @@
"name": "docs/docsite/config.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2d289e9f0e5f0151d1cd40963461f6427b69df33ba7dde69b950dc58912f016",
+ "chksum_sha256": "c2e717709f55bbeb87f08b2fe9722c91150c87f94a3245935becc186c5c8def4",
"format": 1
},
{
@@ -326,7 +326,7 @@
"name": "meta/ee-requirements.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1a36d9a4e747ef31cde1094f3d0805e912b142f9529f2332374bcb0ed34bd5c5",
+ "chksum_sha256": "d078015d25bf12defe85d0ca788cd997ce9fd8f71c08c96ab27c472346df378d",
"format": 1
},
{
@@ -410,7 +410,7 @@
"name": "plugins/doc_fragments/compose_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9e42aa81006fe5a72ef9713d008b616da75c6dbb0bc359ff892ced2885545166",
+ "chksum_sha256": "b92c9446b36c3a2d8faa368a8036561d65cf5dae443d5f6a26f8d800a767a9a5",
"format": 1
},
{
@@ -431,21 +431,21 @@
"name": "plugins/inventory/docker_containers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1d01e5f455339e704233d7df6597aae12be29a5fef4e6aef5fcb787cfb8030d2",
+ "chksum_sha256": "a4feea030c92ca0b3541d679ad49ae060430c0f5a3994fb589485a330613941a",
"format": 1
},
{
"name": "plugins/inventory/docker_machine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "559ab252a16a63dc14a344be1f90ee66f976d8f3927f83dda2b3657fea0c1078",
+ "chksum_sha256": "3b3a1ef0f3d745a7b642777b7dd4126f153898a9c5f536091177442ed2d7c8ed",
"format": 1
},
{
"name": "plugins/inventory/docker_swarm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a01b5a62dffc44a43c42dfacff3ee1430d39c43c0d313a4289a12526bca33109",
+ "chksum_sha256": "04e5cf494bac339905130787fbdfe0ca23ab7caad8fec2f784d014937f86eeb1",
"format": 1
},
{
@@ -480,7 +480,7 @@
"name": "plugins/module_utils/_api/api/daemon.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c3ff41f499911eba707f23fe05062adf3d5c7464138111c37d1afc30f913a2f8",
+ "chksum_sha256": "9a0d17ad9e1fc3ca2fe1d502273ad12442cfe46d32bcb19372f6bed32b1e0815",
"format": 1
},
{
@@ -648,7 +648,7 @@
"name": "plugins/module_utils/_api/utils/utils.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "951272b159d81117e35e73c6d67fce3ea9501b1edc6aace9580063a4a61936b4",
+ "chksum_sha256": "84d22ae2825223d88d2cc66386427828a3363cf549404a3be68880db91fc0bfa",
"format": 1
},
{
@@ -760,7 +760,7 @@
"name": "plugins/module_utils/compose_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "60698c26cc1f0b0394ebd9ed2451d45681844d44c79c32b0e2921193feebc29f",
+ "chksum_sha256": "010f71093f38f18e9fcd1b5cd78a5babe601d2dd79ceb16642b999d299719b6f",
"format": 1
},
{
@@ -837,14 +837,14 @@
"name": "plugins/modules/docker_compose_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "237adfe9c0e33461e576fe78fb2c5f82b089e9df202fa9e61ca5ab4bc39d4282",
+ "chksum_sha256": "299fc207fcda246f73bbb7213f0a3f1eca8c5ebf0a6344e571c867fff0eba258",
"format": 1
},
{
"name": "plugins/modules/docker_compose_v2_pull.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "16378b1ddf2c8914b0b9ec7adc4519f6b664787971ba46672b1ec05f593c1ca3",
+ "chksum_sha256": "a3171c449b56019853aaa8da3c6d8b54f2bf6fe03ce8da1ade87afcd32a07756",
"format": 1
},
{
@@ -1100,6 +1100,13 @@
"format": 1
},
{
+ "name": "plugins/plugin_utils/unsafe.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "93ccc2e18634405c7ff21a91a1df4f17261ac24b0f41bf3c46dbec2f254538c3",
+ "format": 1
+ },
+ {
"name": "tests",
"ftype": "dir",
"chksum_type": null,
@@ -1555,6 +1562,13 @@
"format": 1
},
{
+ "name": "tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9a2483112e899562f769a66c3660d7d8fade379f6e2b7c09db7db578c59012a6",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/docker_compose_v2/tasks/tests/pull.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -5884,7 +5898,7 @@
"name": "tests/sanity/ignore-2.17.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "77e2580c039e9062bb354b79bad043392a7e343f11e1797b35b3d28b6955de79",
+ "chksum_sha256": "f52743569e64513bef9795bab6cf6ccfde9b70a8cd5b81a3fe28994379468877",
"format": 1
},
{
@@ -5895,6 +5909,20 @@
"format": 1
},
{
+ "name": "tests/sanity/ignore-2.18.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f52743569e64513bef9795bab6cf6ccfde9b70a8cd5b81a3fe28994379468877",
+ "format": 1
+ },
+ {
+ "name": "tests/sanity/ignore-2.18.txt.license",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1",
+ "format": 1
+ },
+ {
"name": "tests/unit",
"ftype": "dir",
"chksum_type": null,
@@ -5996,7 +6024,7 @@
"name": "tests/unit/plugins/module_utils/_api/api/test_client.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5114474e56b443ac90b48d2ce7d140c825da8cf52cc9d12f1285fd868089a2d2",
+ "chksum_sha256": "9c9b531983d18111c1ae36320dead46e6a98637a258c5335e29e85915447a768",
"format": 1
},
{
@@ -6360,7 +6388,7 @@
"name": "CHANGELOG.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a454d168d730e40228bc1b635787e39f4f1dd9561117c1c0472203fb3850ea45",
+ "chksum_sha256": "b7838b371ac49712b398b2cc47e2959e020fbe727275fc1052c8e49489bc3596",
"format": 1
},
{
@@ -6374,7 +6402,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0938e99f68c7ca4fce239f527e9a251a8c32562d4f89065fd2f4b53187f6408",
+ "chksum_sha256": "8593cb523e7f0bfece19e9dd82a25d06277269451d1334d15c15a868272bcb63",
"format": 1
},
{
@@ -6395,7 +6423,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f2ed87985a5ed9319821b58e4f4e124db2e06f1b6c60a28c9f50a2666d37ca6f",
+ "chksum_sha256": "18391f2b88eae674b860ad2cd1ac1426dc64299c91965aa4d30b69ff269aac5f",
"format": 1
}
],
diff --git a/ansible_collections/community/docker/MANIFEST.json b/ansible_collections/community/docker/MANIFEST.json
index ac81cb0ff..447bfc1ce 100644
--- a/ansible_collections/community/docker/MANIFEST.json
+++ b/ansible_collections/community/docker/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "docker",
- "version": "3.8.1",
+ "version": "3.9.0",
"authors": [
"Ansible Docker Working Group"
],
@@ -28,7 +28,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b8f523a2e97dadfa557a707eca6cb96b06b64396f46e33fb6c9bfcb200345094",
+ "chksum_sha256": "f1b0cee31d5d2e869134e845593489c03632024171cd300f35688fb089e7bf2d",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/docker/README.md b/ansible_collections/community/docker/README.md
index 1bee82833..0d169c54a 100644
--- a/ansible_collections/community/docker/README.md
+++ b/ansible_collections/community/docker/README.md
@@ -16,7 +16,7 @@ Please note that this collection does **not** support Windows targets. The conne
## Tested with Ansible
-Tested with the current ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, and ansible-core 2.16 releases, and the current development version of ansible-core. Ansible/ansible-base versions before 2.11.0 are not supported.
+Tested with the current ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, and ansible-core 2.17 releases, and the current development version of ansible-core. Ansible/ansible-base versions before 2.11.0 are not supported.
Please note that Ansible 2.9 and ansible-base 2.10 are no longer supported. If you need to use them, use community.docker 2.x.y. Also note that this collection does not work with ansible-core 2.11 (this includes ansible-base and Ansible 2.9) on Python 3.12+.
diff --git a/ansible_collections/community/docker/changelogs/changelog.yaml b/ansible_collections/community/docker/changelogs/changelog.yaml
index db03d2485..fc22ba446 100644
--- a/ansible_collections/community/docker/changelogs/changelog.yaml
+++ b/ansible_collections/community/docker/changelogs/changelog.yaml
@@ -436,7 +436,7 @@ releases:
changes:
breaking_changes:
- docker_compose - fixed ``timeout`` defaulting behavior so that ``stop_grace_period``,
- if defined in the compose file, will be used if `timeout`` is not specified
+ if defined in the compose file, will be used if ``timeout`` is not specified
(https://github.com/ansible-collections/community.docker/pull/163).
deprecated_features:
- docker_container - using the special value ``all`` in ``published_ports``
@@ -1623,3 +1623,41 @@ releases:
- 814-docker_compose_v2_pull-idem.yml
- inventory-rce.yml
release_date: '2024-03-16'
+ 3.9.0:
+ changes:
+ bugfixes:
+ - docker_compose_v2* - allow ``project_src`` to be a relative path, by converting
+ it to an absolute path before using it (https://github.com/ansible-collections/community.docker/issues/827,
+ https://github.com/ansible-collections/community.docker/pull/828).
+ - docker_compose_v2* modules - abort with a nice error message instead of crash
+ when the Docker Compose CLI plugin version is ``dev`` (https://github.com/ansible-collections/community.docker/issues/825,
+ https://github.com/ansible-collections/community.docker/pull/826).
+ - inventory plugins - add unsafe wrapper to avoid marking strings that do not
+ contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.docker/pull/835).
+ minor_changes:
+ - The EE requirements now include PyYAML, since the ``docker_compose_v2*`` modules
+ depend on it when the ``definition`` option is used. This should not have
+ a noticable effect on generated EEs since ansible-core itself depends on PyYAML
+ as well, and ansible-builder explicitly ignores this dependency (https://github.com/ansible-collections/community.docker/pull/832).
+ - docker_compose_v2* - the new option ``check_files_existing`` allows to disable
+ the check for one of the files ``compose.yaml``, ``compose.yml``, ``docker-compose.yaml``,
+ and ``docker-compose.yml`` in ``project_src`` if ``files`` is not specified.
+ This is necessary if a non-standard compose filename is specified through
+ other means, like the ``COMPOSE_FILE`` environment variable (https://github.com/ansible-collections/community.docker/issues/838,
+ https://github.com/ansible-collections/community.docker/pull/839).
+ - docker_compose_v2* modules - allow to provide an inline definition of the
+ compose content instead of having to provide a ``project_src`` directory with
+ the compose file written into it (https://github.com/ansible-collections/community.docker/issues/829,
+ https://github.com/ansible-collections/community.docker/pull/832).
+ - vendored Docker SDK for Python - remove unused code that relies on functionality
+ deprecated in Python 3.12 (https://github.com/ansible-collections/community.docker/pull/834).
+ release_summary: Bugfix and feature release.
+ fragments:
+ - 3.9.0.yml
+ - 826-docker-compose-v2-version.yml
+ - 828-compose-project_src.yml
+ - 832-docker_compose_v2-definition.yml
+ - 834-datetime-depr.yml
+ - 835-unsafe.yml
+ - 839-compose_v2-check-file.yml
+ release_date: '2024-04-21'
diff --git a/ansible_collections/community/docker/docs/docsite/config.yml b/ansible_collections/community/docker/docs/docsite/config.yml
index 846b95f62..48eedc269 100644
--- a/ansible_collections/community/docker/docs/docsite/config.yml
+++ b/ansible_collections/community/docker/docs/docsite/config.yml
@@ -13,3 +13,6 @@ envvar_directives:
- DOCKER_TLS
- DOCKER_TLS_HOSTNAME
- DOCKER_TLS_VERIFY
+
+changelog:
+ write_changelog: true
diff --git a/ansible_collections/community/docker/meta/ee-requirements.txt b/ansible_collections/community/docker/meta/ee-requirements.txt
index de03ff0fd..099dcf9a8 100644
--- a/ansible_collections/community/docker/meta/ee-requirements.txt
+++ b/ansible_collections/community/docker/meta/ee-requirements.txt
@@ -6,6 +6,7 @@ docker
urllib3
requests
paramiko
+pyyaml
# We assume that EEs are not based on Windows, and have Python >= 3.5.
# (ansible-builder does not support conditionals, it will simply add
diff --git a/ansible_collections/community/docker/plugins/doc_fragments/compose_v2.py b/ansible_collections/community/docker/plugins/doc_fragments/compose_v2.py
index 4e21f974c..234a94fe2 100644
--- a/ansible_collections/community/docker/plugins/doc_fragments/compose_v2.py
+++ b/ansible_collections/community/docker/plugins/doc_fragments/compose_v2.py
@@ -18,20 +18,30 @@ options:
- Path to a directory containing a Compose file
(C(compose.yml), C(compose.yaml), C(docker-compose.yml), or C(docker-compose.yaml)).
- If O(files) is provided, will look for these files in this directory instead.
+ - Mutually exclusive with O(definition).
type: path
- required: true
project_name:
description:
- Provide a project name. If not provided, the project name is taken from the basename of O(project_src).
+ - Required when O(definition) is provided.
type: str
files:
description:
- List of Compose file names relative to O(project_src) to be used instead of the main Compose file
(C(compose.yml), C(compose.yaml), C(docker-compose.yml), or C(docker-compose.yaml)).
- Files are loaded and merged in the order given.
+ - Mutually exclusive with O(definition).
type: list
elements: path
version_added: 3.7.0
+ definition:
+ description:
+ - Compose file describing one or more services, networks and volumes.
+ - Mutually exclusive with O(project_src) and O(files).
+ - If provided, PyYAML must be available to this module, and O(project_name) must be specified.
+ - Note that a temporary directory will be created and deleted afterwards when using this option.
+ type: dict
+ version_added: 3.9.0
env_files:
description:
- By default environment files are loaded from a C(.env) file located directly under the O(project_src) directory.
@@ -45,6 +55,19 @@ options:
- Equivalent to C(docker compose --profile).
type: list
elements: str
+ check_files_existing:
+ description:
+ - If set to V(false), the module will not check whether one of the files
+ C(compose.yaml), C(compose.yml), C(docker-compose.yaml), or C(docker-compose.yml)
+ exists in O(project_src) if O(files) is not provided.
+ - This can be useful if environment files with C(COMPOSE_FILE) are used to configure a different
+ filename. The module currently does not check for C(COMPOSE_FILE) in environment files or the
+ current environment.
+ type: bool
+ default: true
+ version_added: 3.9.0
+requirements:
+ - "PyYAML if O(definition) is used"
notes:
- |-
The Docker compose CLI plugin has no stable output format (see for example U(https://github.com/docker/compose/issues/10872)),
diff --git a/ansible_collections/community/docker/plugins/inventory/docker_containers.py b/ansible_collections/community/docker/plugins/inventory/docker_containers.py
index 75b49ff92..0cae05472 100644
--- a/ansible_collections/community/docker/plugins/inventory/docker_containers.py
+++ b/ansible_collections/community/docker/plugins/inventory/docker_containers.py
@@ -167,7 +167,6 @@ import re
from ansible.errors import AnsibleError
from ansible.module_utils.common.text.converters import to_native
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
from ansible_collections.community.docker.plugins.module_utils.common_api import (
RequestException,
@@ -180,6 +179,7 @@ from ansible_collections.community.docker.plugins.plugin_utils.common_api import
)
from ansible_collections.community.docker.plugins.module_utils._api.errors import APIError, DockerException
+from ansible_collections.community.docker.plugins.plugin_utils.unsafe import make_unsafe
from ansible_collections.community.library_inventory_filtering_v1.plugins.plugin_utils.inventory_filter import parse_filters, filter_host
MIN_DOCKER_API = None
diff --git a/ansible_collections/community/docker/plugins/inventory/docker_machine.py b/ansible_collections/community/docker/plugins/inventory/docker_machine.py
index e3330a339..984c9932b 100644
--- a/ansible_collections/community/docker/plugins/inventory/docker_machine.py
+++ b/ansible_collections/community/docker/plugins/inventory/docker_machine.py
@@ -96,8 +96,8 @@ from ansible.module_utils.common.text.converters import to_text
from ansible.module_utils.common.process import get_bin_path
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
from ansible.utils.display import Display
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+from ansible_collections.community.docker.plugins.plugin_utils.unsafe import make_unsafe
from ansible_collections.community.library_inventory_filtering_v1.plugins.plugin_utils.inventory_filter import parse_filters, filter_host
import json
diff --git a/ansible_collections/community/docker/plugins/inventory/docker_swarm.py b/ansible_collections/community/docker/plugins/inventory/docker_swarm.py
index 0d60033f9..acceac86c 100644
--- a/ansible_collections/community/docker/plugins/inventory/docker_swarm.py
+++ b/ansible_collections/community/docker/plugins/inventory/docker_swarm.py
@@ -159,8 +159,8 @@ from ansible_collections.community.docker.plugins.module_utils.common import get
from ansible_collections.community.docker.plugins.module_utils.util import update_tls_hostname
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
from ansible.parsing.utils.addresses import parse_address
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+from ansible_collections.community.docker.plugins.plugin_utils.unsafe import make_unsafe
from ansible_collections.community.library_inventory_filtering_v1.plugins.plugin_utils.inventory_filter import parse_filters, filter_host
try:
diff --git a/ansible_collections/community/docker/plugins/module_utils/_api/api/daemon.py b/ansible_collections/community/docker/plugins/module_utils/_api/api/daemon.py
index 9e7adbf3f..16d1d1243 100644
--- a/ansible_collections/community/docker/plugins/module_utils/_api/api/daemon.py
+++ b/ansible_collections/community/docker/plugins/module_utils/_api/api/daemon.py
@@ -11,12 +11,9 @@ from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
-from datetime import datetime
from .. import auth
-from ..utils.utils import datetime_to_timestamp, convert_filters
from ..utils.decorators import minimum_version
-from ..types.daemon import CancellableStream
class DaemonApiMixin(object):
@@ -36,65 +33,6 @@ class DaemonApiMixin(object):
url = self._url('/system/df')
return self._result(self._get(url), True)
- def events(self, since=None, until=None, filters=None, decode=None):
- """
- Get real-time events from the server. Similar to the ``docker events``
- command.
-
- Args:
- since (UTC datetime or int): Get events from this point
- until (UTC datetime or int): Get events until this point
- filters (dict): Filter the events by event time, container or image
- decode (bool): If set to true, stream will be decoded into dicts on
- the fly. False by default.
-
- Returns:
- A :py:class:`docker.types.daemon.CancellableStream` generator
-
- Raises:
- :py:class:`docker.errors.APIError`
- If the server returns an error.
-
- Example:
-
- >>> for event in client.events(decode=True)
- ... print(event)
- {u'from': u'image/with:tag',
- u'id': u'container-id',
- u'status': u'start',
- u'time': 1423339459}
- ...
-
- or
-
- >>> events = client.events()
- >>> for event in events:
- ... print(event)
- >>> # and cancel from another thread
- >>> events.close()
- """
-
- if isinstance(since, datetime):
- since = datetime_to_timestamp(since)
-
- if isinstance(until, datetime):
- until = datetime_to_timestamp(until)
-
- if filters:
- filters = convert_filters(filters)
-
- params = {
- 'since': since,
- 'until': until,
- 'filters': filters
- }
- url = self._url('/events')
-
- response = self._get(url, params=params, stream=True, timeout=None)
- stream = self._stream_helper(response, decode=decode)
-
- return CancellableStream(stream, response)
-
def info(self):
"""
Display system-wide information. Identical to the ``docker info``
diff --git a/ansible_collections/community/docker/plugins/module_utils/_api/utils/utils.py b/ansible_collections/community/docker/plugins/module_utils/_api/utils/utils.py
index db3718d4d..cdf3eedd2 100644
--- a/ansible_collections/community/docker/plugins/module_utils/_api/utils/utils.py
+++ b/ansible_collections/community/docker/plugins/module_utils/_api/utils/utils.py
@@ -17,7 +17,6 @@ import os
import os.path
import shlex
import string
-from datetime import datetime
from ansible_collections.community.docker.plugins.module_utils.version import StrictVersion
from ansible.module_utils.six import PY2, PY3, binary_type, integer_types, iteritems, string_types, text_type
@@ -421,12 +420,6 @@ def convert_filters(filters):
return json.dumps(result)
-def datetime_to_timestamp(dt):
- """Convert a UTC datetime to a Unix timestamp"""
- delta = dt - datetime.utcfromtimestamp(0)
- return delta.seconds + delta.days * 24 * 3600
-
-
def parse_bytes(s):
if isinstance(s, integer_types + (float,)):
return s
diff --git a/ansible_collections/community/docker/plugins/module_utils/compose_v2.py b/ansible_collections/community/docker/plugins/module_utils/compose_v2.py
index 92f109269..85fbd5d80 100644
--- a/ansible_collections/community/docker/plugins/module_utils/compose_v2.py
+++ b/ansible_collections/community/docker/plugins/module_utils/compose_v2.py
@@ -9,8 +9,12 @@ __metaclass__ = type
import os
import re
+import shutil
+import tempfile
+import traceback
from collections import namedtuple
+from ansible.module_utils.basic import missing_required_lib
from ansible.module_utils.common.text.converters import to_native
from ansible.module_utils.six.moves import shlex_quote
@@ -21,6 +25,19 @@ from ansible_collections.community.docker.plugins.module_utils._logfmt import (
parse_line as _parse_logfmt_line,
)
+try:
+ import yaml
+ try:
+ # use C version if possible for speedup
+ from yaml import CSafeDumper as _SafeDumper
+ except ImportError:
+ from yaml import SafeDumper as _SafeDumper
+ HAS_PYYAML = True
+ PYYAML_IMPORT_ERROR = None
+except ImportError:
+ HAS_PYYAML = False
+ PYYAML_IMPORT_ERROR = traceback.format_exc()
+
DOCKER_COMPOSE_FILES = ('compose.yaml', 'compose.yml', 'docker-compose.yaml', 'docker-compose.yml')
@@ -484,11 +501,26 @@ def update_failed(result, events, args, stdout, stderr, rc, cli):
def common_compose_argspec():
return dict(
- project_src=dict(type='path', required=True),
+ project_src=dict(type='path'),
project_name=dict(type='str'),
files=dict(type='list', elements='path'),
+ definition=dict(type='dict'),
env_files=dict(type='list', elements='path'),
profiles=dict(type='list', elements='str'),
+ check_files_existing=dict(type='bool', default=True),
+ )
+
+
+def common_compose_argspec_ex():
+ return dict(
+ argspec=common_compose_argspec(),
+ mutually_exclusive=[
+ ('definition', 'project_src'),
+ ('definition', 'files')
+ ],
+ required_by={
+ 'definition': ('project_name', ),
+ },
)
@@ -505,37 +537,67 @@ class BaseComposeManager(DockerBaseClass):
super(BaseComposeManager, self).__init__()
self.client = client
self.check_mode = self.client.check_mode
+ self.cleanup_dirs = set()
parameters = self.client.module.params
- self.project_src = parameters['project_src']
+ if parameters['definition'] is not None and not HAS_PYYAML:
+ self.fail(
+ missing_required_lib('PyYAML'),
+ exception=PYYAML_IMPORT_ERROR
+ )
+
self.project_name = parameters['project_name']
+ if parameters['definition'] is not None:
+ self.project_src = tempfile.mkdtemp(prefix='ansible')
+ self.cleanup_dirs.add(self.project_src)
+ compose_file = os.path.join(self.project_src, 'compose.yaml')
+ self.client.module.add_cleanup_file(compose_file)
+ try:
+ with open(compose_file, 'wb') as f:
+ yaml.dump(parameters['definition'], f, encoding="utf-8", Dumper=_SafeDumper)
+ except Exception as exc:
+ self.fail("Error writing to %s - %s" % (compose_file, to_native(exc)))
+ else:
+ self.project_src = os.path.abspath(parameters['project_src'])
+
self.files = parameters['files']
self.env_files = parameters['env_files']
self.profiles = parameters['profiles']
compose = self.client.get_client_plugin_info('compose')
if compose is None:
- self.client.fail('Docker CLI {0} does not have the compose plugin installed'.format(self.client.get_cli()))
+ self.fail('Docker CLI {0} does not have the compose plugin installed'.format(self.client.get_cli()))
+ if compose['Version'] == 'dev':
+ self.fail(
+ 'Docker CLI {0} has a compose plugin installed, but it reports version "dev".'
+ ' Please use a version of the plugin that returns a proper version.'
+ .format(self.client.get_cli())
+ )
compose_version = compose['Version'].lstrip('v')
self.compose_version = LooseVersion(compose_version)
if self.compose_version < LooseVersion(min_version):
- self.client.fail('Docker CLI {cli} has the compose plugin with version {version}; need version {min_version} or later'.format(
+ self.fail('Docker CLI {cli} has the compose plugin with version {version}; need version {min_version} or later'.format(
cli=self.client.get_cli(),
version=compose_version,
min_version=min_version,
))
if not os.path.isdir(self.project_src):
- self.client.fail('"{0}" is not a directory'.format(self.project_src))
+ self.fail('"{0}" is not a directory'.format(self.project_src))
+ self.check_files_existing = parameters['check_files_existing']
if self.files:
for file in self.files:
path = os.path.join(self.project_src, file)
if not os.path.exists(path):
- self.client.fail('Cannot find Compose file "{0}" relative to project directory "{1}"'.format(file, self.project_src))
- elif all(not os.path.exists(os.path.join(self.project_src, f)) for f in DOCKER_COMPOSE_FILES):
+ self.fail('Cannot find Compose file "{0}" relative to project directory "{1}"'.format(file, self.project_src))
+ elif self.check_files_existing and all(not os.path.exists(os.path.join(self.project_src, f)) for f in DOCKER_COMPOSE_FILES):
filenames = ', '.join(DOCKER_COMPOSE_FILES[:-1])
- self.client.fail('"{0}" does not contain {1}, or {2}'.format(self.project_src, filenames, DOCKER_COMPOSE_FILES[-1]))
+ self.fail('"{0}" does not contain {1}, or {2}'.format(self.project_src, filenames, DOCKER_COMPOSE_FILES[-1]))
+
+ def fail(self, msg, **kwargs):
+ self.cleanup()
+ self.client.fail(msg, **kwargs)
def get_base_args(self):
args = ['compose', '--ansi', 'never']
@@ -616,3 +678,11 @@ class BaseComposeManager(DockerBaseClass):
for res in ('stdout', 'stderr'):
if result.get(res) == '':
result.pop(res)
+
+ def cleanup(self):
+ for dir in self.cleanup_dirs:
+ try:
+ shutil.rmtree(dir, True)
+ except Exception:
+ # shouldn't happen, but simply ignore to be on the safe side
+ pass
diff --git a/ansible_collections/community/docker/plugins/modules/docker_compose_v2.py b/ansible_collections/community/docker/plugins/modules/docker_compose_v2.py
index 29bb81ad9..9972d45f6 100644
--- a/ansible_collections/community/docker/plugins/modules/docker_compose_v2.py
+++ b/ansible_collections/community/docker/plugins/modules/docker_compose_v2.py
@@ -409,7 +409,7 @@ from ansible_collections.community.docker.plugins.module_utils.common_cli import
from ansible_collections.community.docker.plugins.module_utils.compose_v2 import (
BaseComposeManager,
- common_compose_argspec,
+ common_compose_argspec_ex,
is_failed,
)
@@ -435,13 +435,13 @@ class ServicesManager(BaseComposeManager):
for key, value in self.scale.items():
if not isinstance(key, string_types):
- self.client.fail('The key %s for `scale` is not a string' % repr(key))
+ self.fail('The key %s for `scale` is not a string' % repr(key))
try:
value = check_type_int(value)
except TypeError as exc:
- self.client.fail('The value %s for `scale[%s]` is not an integer' % (repr(value), repr(key)))
+ self.fail('The value %s for `scale[%s]` is not an integer' % (repr(value), repr(key)))
if value < 0:
- self.client.fail('The value %s for `scale[%s]` is negative' % (repr(value), repr(key)))
+ self.fail('The value %s for `scale[%s]` is negative' % (repr(value), repr(key)))
self.scale[key] = value
def run(self):
@@ -620,15 +620,19 @@ def main():
wait=dict(type='bool', default=False),
wait_timeout=dict(type='int'),
)
- argument_spec.update(common_compose_argspec())
+ argspec_ex = common_compose_argspec_ex()
+ argument_spec.update(argspec_ex.pop('argspec'))
client = AnsibleModuleDockerClient(
argument_spec=argument_spec,
supports_check_mode=True,
+ **argspec_ex
)
try:
- result = ServicesManager(client).run()
+ manager = ServicesManager(client)
+ result = manager.run()
+ manager.cleanup()
client.module.exit_json(**result)
except DockerException as e:
client.fail('An unexpected docker error occurred: {0}'.format(to_native(e)), exception=traceback.format_exc())
diff --git a/ansible_collections/community/docker/plugins/modules/docker_compose_v2_pull.py b/ansible_collections/community/docker/plugins/modules/docker_compose_v2_pull.py
index 2b1980bf6..6b091f9aa 100644
--- a/ansible_collections/community/docker/plugins/modules/docker_compose_v2_pull.py
+++ b/ansible_collections/community/docker/plugins/modules/docker_compose_v2_pull.py
@@ -102,7 +102,7 @@ from ansible_collections.community.docker.plugins.module_utils.common_cli import
from ansible_collections.community.docker.plugins.module_utils.compose_v2 import (
BaseComposeManager,
- common_compose_argspec,
+ common_compose_argspec_ex,
)
from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion
@@ -117,7 +117,7 @@ class PullManager(BaseComposeManager):
if self.policy != 'always' and self.compose_version < LooseVersion('2.22.0'):
# https://github.com/docker/compose/pull/10981 - 2.22.0
- self.client.fail('A pull policy other than always is only supported since Docker Compose 2.22.0. {0} has version {1}'.format(
+ self.fail('A pull policy other than always is only supported since Docker Compose 2.22.0. {0} has version {1}'.format(
self.client.get_cli(), self.compose_version))
def get_pull_cmd(self, dry_run, no_start=False):
@@ -145,15 +145,19 @@ def main():
argument_spec = dict(
policy=dict(type='str', choices=['always', 'missing'], default='always'),
)
- argument_spec.update(common_compose_argspec())
+ argspec_ex = common_compose_argspec_ex()
+ argument_spec.update(argspec_ex.pop('argspec'))
client = AnsibleModuleDockerClient(
argument_spec=argument_spec,
supports_check_mode=True,
+ **argspec_ex
)
try:
- result = PullManager(client).run()
+ manager = PullManager(client)
+ result = manager.run()
+ manager.cleanup()
client.module.exit_json(**result)
except DockerException as e:
client.fail('An unexpected docker error occurred: {0}'.format(to_native(e)), exception=traceback.format_exc())
diff --git a/ansible_collections/community/docker/plugins/plugin_utils/unsafe.py b/ansible_collections/community/docker/plugins/plugin_utils/unsafe.py
new file mode 100644
index 000000000..1eb61bea0
--- /dev/null
+++ b/ansible_collections/community/docker/plugins/plugin_utils/unsafe.py
@@ -0,0 +1,41 @@
+# Copyright (c) 2023, Felix Fontein <felix@fontein.de>
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import re
+
+from ansible.module_utils.six import binary_type, text_type
+from ansible.module_utils.common._collections_compat import Mapping, Set
+from ansible.module_utils.common.collections import is_sequence
+from ansible.utils.unsafe_proxy import (
+ AnsibleUnsafe,
+ wrap_var as _make_unsafe,
+)
+
+_RE_TEMPLATE_CHARS = re.compile(u'[{}]')
+_RE_TEMPLATE_CHARS_BYTES = re.compile(b'[{}]')
+
+
+def make_unsafe(value):
+ if value is None or isinstance(value, AnsibleUnsafe):
+ return value
+
+ if isinstance(value, Mapping):
+ return dict((make_unsafe(key), make_unsafe(val)) for key, val in value.items())
+ elif isinstance(value, Set):
+ return set(make_unsafe(elt) for elt in value)
+ elif is_sequence(value):
+ return type(value)(make_unsafe(elt) for elt in value)
+ elif isinstance(value, binary_type):
+ if _RE_TEMPLATE_CHARS_BYTES.search(value):
+ value = _make_unsafe(value)
+ return value
+ elif isinstance(value, text_type):
+ if _RE_TEMPLATE_CHARS.search(value):
+ value = _make_unsafe(value)
+ return value
+
+ return value
diff --git a/ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml b/ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml
new file mode 100644
index 000000000..4b88edcd1
--- /dev/null
+++ b/ansible_collections/community/docker/tests/integration/targets/docker_compose_v2/tasks/tests/definition.yml
@@ -0,0 +1,264 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+- vars:
+ pname: "{{ name_prefix }}-definition"
+ cname: "{{ name_prefix }}-container"
+ test_service: |
+ services:
+ {{ cname }}:
+ image: "{{ docker_test_image_alpine }}"
+ command: '/bin/sh -c "sleep 10m"'
+ stop_grace_period: 1s
+ test_service_mod: |
+ services:
+ {{ cname }}:
+ image: "{{ docker_test_image_alpine }}"
+ command: '/bin/sh -c "sleep 15m"'
+ stop_grace_period: 1s
+
+ block:
+ - name: Registering container name
+ set_fact:
+ cnames: "{{ cnames + [pname ~ '-' ~ cname ~ '-1'] }}"
+ dnetworks: "{{ dnetworks + [pname ~ '_default'] }}"
+
+####################################################################
+## Present #########################################################
+####################################################################
+
+ - name: Present (check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ check_mode: true
+ register: present_1_check
+
+ - name: Present
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ register: present_1
+
+ - name: Present (idempotent check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ check_mode: true
+ register: present_2_check
+
+ - name: Present (idempotent)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ register: present_2
+
+ - name: Present (changed check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service_mod | from_yaml }}'
+ state: present
+ check_mode: true
+ register: present_3_check
+
+ - name: Present (changed)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service_mod | from_yaml }}'
+ state: present
+ register: present_3
+
+ - assert:
+ that:
+ - present_1_check is changed
+ - present_1 is changed
+ - present_1.containers | length == 1
+ - present_1.containers[0].Name == pname ~ '-' ~ cname ~ '-1'
+ - present_1.containers[0].Image == docker_test_image_alpine
+ - present_1.images | length == 1
+ - present_1.images[0].ContainerName == pname ~ '-' ~ cname ~ '-1'
+ - present_1.images[0].Repository == (docker_test_image_alpine | split(':') | first)
+ - present_1.images[0].Tag == (docker_test_image_alpine | split(':') | last)
+ - present_2_check is not changed
+ - present_2 is not changed
+ - present_3_check is changed
+ - present_3 is changed
+
+####################################################################
+## Absent ##########################################################
+####################################################################
+
+ - name: Absent (check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service_mod | from_yaml }}'
+ state: absent
+ check_mode: true
+ register: absent_1_check
+
+ - name: Absent
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service_mod | from_yaml }}'
+ state: absent
+ register: absent_1
+
+ - name: Absent (idempotent check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service_mod | from_yaml }}'
+ state: absent
+ check_mode: true
+ register: absent_2_check
+
+ - name: Absent (idempotent)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service_mod | from_yaml }}'
+ state: absent
+ register: absent_2
+
+ - assert:
+ that:
+ - absent_1_check is changed
+ - absent_1 is changed
+ - absent_2_check is not changed
+ - absent_2 is not changed
+
+####################################################################
+## Stopping and starting ###########################################
+####################################################################
+
+ - name: Present stopped (check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: stopped
+ check_mode: true
+ register: present_1_check
+
+ - name: Present stopped
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: stopped
+ register: present_1
+
+ - name: Present stopped (idempotent check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: stopped
+ check_mode: true
+ register: present_2_check
+
+ - name: Present stopped (idempotent)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: stopped
+ register: present_2
+
+ - name: Started (check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ check_mode: true
+ register: present_3_check
+
+ - name: Started
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ register: present_3
+
+ - name: Started (idempotent check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ check_mode: true
+ register: present_4_check
+
+ - name: Started (idempotent)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: present
+ register: present_4
+
+ - name: Restarted (check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: restarted
+ check_mode: true
+ register: present_5_check
+
+ - name: Restarted
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: restarted
+ register: present_5
+
+ - name: Stopped (check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: stopped
+ check_mode: true
+ register: present_6_check
+
+ - name: Stopped
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: stopped
+ register: present_6
+
+ - name: Restarted (check)
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: restarted
+ check_mode: true
+ register: present_7_check
+
+ - name: Restarted
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: restarted
+ register: present_7
+
+ - name: Cleanup
+ docker_compose_v2:
+ project_name: '{{ pname }}'
+ definition: '{{ test_service | from_yaml }}'
+ state: absent
+
+ - assert:
+ that:
+ - present_1_check is changed
+ - present_1 is changed
+ - present_2_check is not changed
+ - present_2 is not changed
+ - present_3_check is changed
+ - present_3 is changed
+ - present_4_check is not changed
+ - present_4 is not changed
+ - present_5_check is changed
+ - present_5 is changed
+ - present_6_check is changed
+ - present_6 is changed
+ - present_7_check is changed
+ - present_7 is changed
diff --git a/ansible_collections/community/docker/tests/sanity/ignore-2.17.txt b/ansible_collections/community/docker/tests/sanity/ignore-2.17.txt
index 12e0b26f9..f1974bd5e 100644
--- a/ansible_collections/community/docker/tests/sanity/ignore-2.17.txt
+++ b/ansible_collections/community/docker/tests/sanity/ignore-2.17.txt
@@ -1 +1,4 @@
plugins/modules/docker_container_copy_into.py validate-modules:undocumented-parameter # _max_file_size_for_diff is used by the action plugin
+plugins/module_utils/_api/api/client.py pylint:use-yield-from # suggested construct does not work with Python 2
+plugins/module_utils/_api/utils/build.py pylint:use-yield-from # suggested construct does not work with Python 2
+tests/unit/plugins/module_utils/test_copy.py pylint:use-yield-from # suggested construct does not work with Python 2
diff --git a/ansible_collections/community/docker/tests/sanity/ignore-2.18.txt b/ansible_collections/community/docker/tests/sanity/ignore-2.18.txt
new file mode 100644
index 000000000..f1974bd5e
--- /dev/null
+++ b/ansible_collections/community/docker/tests/sanity/ignore-2.18.txt
@@ -0,0 +1,4 @@
+plugins/modules/docker_container_copy_into.py validate-modules:undocumented-parameter # _max_file_size_for_diff is used by the action plugin
+plugins/module_utils/_api/api/client.py pylint:use-yield-from # suggested construct does not work with Python 2
+plugins/module_utils/_api/utils/build.py pylint:use-yield-from # suggested construct does not work with Python 2
+tests/unit/plugins/module_utils/test_copy.py pylint:use-yield-from # suggested construct does not work with Python 2
diff --git a/ansible_collections/community/docker/tests/sanity/ignore-2.18.txt.license b/ansible_collections/community/docker/tests/sanity/ignore-2.18.txt.license
new file mode 100644
index 000000000..edff8c768
--- /dev/null
+++ b/ansible_collections/community/docker/tests/sanity/ignore-2.18.txt.license
@@ -0,0 +1,3 @@
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+SPDX-FileCopyrightText: Ansible Project
diff --git a/ansible_collections/community/docker/tests/unit/plugins/module_utils/_api/api/test_client.py b/ansible_collections/community/docker/tests/unit/plugins/module_utils/_api/api/test_client.py
index 57040b631..87769a3cd 100644
--- a/ansible_collections/community/docker/tests/unit/plugins/module_utils/_api/api/test_client.py
+++ b/ansible_collections/community/docker/tests/unit/plugins/module_utils/_api/api/test_client.py
@@ -35,7 +35,6 @@ if sys.version_info < (2, 7):
from ansible_collections.community.docker.plugins.module_utils._api import constants, errors
from ansible_collections.community.docker.plugins.module_utils._api.api.client import APIClient
from ansible_collections.community.docker.plugins.module_utils._api.constants import DEFAULT_DOCKER_API_VERSION
-from ansible_collections.community.docker.plugins.module_utils._api.utils.utils import convert_filters
from requests.packages import urllib3
from .. import fake_api
@@ -246,56 +245,6 @@ class DockerApiTest(BaseAPIClientTest):
'serveraddress': None,
}
- def test_events(self):
- self.client.events()
-
- fake_request.assert_called_with(
- 'GET',
- url_prefix + 'events',
- params={'since': None, 'until': None, 'filters': None},
- stream=True,
- timeout=None
- )
-
- def test_events_with_since_until(self):
- ts = 1356048000
- now = datetime.datetime.utcfromtimestamp(ts)
- since = now - datetime.timedelta(seconds=10)
- until = now + datetime.timedelta(seconds=10)
-
- self.client.events(since=since, until=until)
-
- fake_request.assert_called_with(
- 'GET',
- url_prefix + 'events',
- params={
- 'since': ts - 10,
- 'until': ts + 10,
- 'filters': None
- },
- stream=True,
- timeout=None
- )
-
- def test_events_with_filters(self):
- filters = {'event': ['die', 'stop'],
- 'container': fake_api.FAKE_CONTAINER_ID}
-
- self.client.events(filters=filters)
-
- expected_filters = convert_filters(filters)
- fake_request.assert_called_with(
- 'GET',
- url_prefix + 'events',
- params={
- 'since': None,
- 'until': None,
- 'filters': expected_filters
- },
- stream=True,
- timeout=None
- )
-
def _socket_path_for_client_session(self, client):
socket_adapter = client.get_adapter('http+docker://')
return socket_adapter.socket_path
diff --git a/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml b/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml
index 163d71b62..be8f011bd 100644
--- a/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml
+++ b/ansible_collections/community/general/.azure-pipelines/azure-pipelines.yml
@@ -73,40 +73,40 @@ stages:
- test: 3
- test: 4
- test: extra
- - stage: Sanity_2_16
- displayName: Sanity 2.16
+ - stage: Sanity_2_17
+ displayName: Sanity 2.17
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
nameFormat: Test {0}
- testFormat: 2.16/sanity/{0}
+ testFormat: 2.17/sanity/{0}
targets:
- test: 1
- test: 2
- test: 3
- test: 4
- - stage: Sanity_2_15
- displayName: Sanity 2.15
+ - stage: Sanity_2_16
+ displayName: Sanity 2.16
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
nameFormat: Test {0}
- testFormat: 2.15/sanity/{0}
+ testFormat: 2.16/sanity/{0}
targets:
- test: 1
- test: 2
- test: 3
- test: 4
- - stage: Sanity_2_14
- displayName: Sanity 2.14
+ - stage: Sanity_2_15
+ displayName: Sanity 2.15
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
nameFormat: Test {0}
- testFormat: 2.14/sanity/{0}
+ testFormat: 2.15/sanity/{0}
targets:
- test: 1
- test: 2
@@ -122,12 +122,22 @@ stages:
nameFormat: Python {0}
testFormat: devel/units/{0}/1
targets:
- - test: 3.7
- test: 3.8
- test: 3.9
- test: '3.10'
- test: '3.11'
- test: '3.12'
+ - stage: Units_2_17
+ displayName: Units 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ nameFormat: Python {0}
+ testFormat: 2.17/units/{0}/1
+ targets:
+ - test: 3.7
+ - test: "3.12"
- stage: Units_2_16
displayName: Units 2.16
dependsOn: []
@@ -151,16 +161,6 @@ stages:
targets:
- test: 3.5
- test: "3.10"
- - stage: Units_2_14
- displayName: Units 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- nameFormat: Python {0}
- testFormat: 2.14/units/{0}/1
- targets:
- - test: 3.9
## Remote
- stage: Remote_devel_extra_vms
@@ -191,14 +191,26 @@ stages:
test: macos/14.3
- name: RHEL 9.3
test: rhel/9.3
- - name: FreeBSD 13.3
- test: freebsd/13.3
- name: FreeBSD 14.0
test: freebsd/14.0
groups:
- 1
- 2
- 3
+ - stage: Remote_2_17
+ displayName: Remote 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ testFormat: 2.17/{0}
+ targets:
+ - name: FreeBSD 13.3
+ test: freebsd/13.3
+ groups:
+ - 1
+ - 2
+ - 3
- stage: Remote_2_16
displayName: Remote 2.16
dependsOn: []
@@ -241,24 +253,6 @@ stages:
- 1
- 2
- 3
- - stage: Remote_2_14
- displayName: Remote 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.14/{0}
- targets:
- #- name: macOS 12.0
- # test: macos/12.0
- - name: RHEL 9.0
- test: rhel/9.0
- #- name: FreeBSD 12.4
- # test: freebsd/12.4
- groups:
- - 1
- - 2
- - 3
### Docker
- stage: Docker_devel
@@ -275,6 +269,18 @@ stages:
test: ubuntu2004
- name: Ubuntu 22.04
test: ubuntu2204
+ groups:
+ - 1
+ - 2
+ - 3
+ - stage: Docker_2_17
+ displayName: Docker 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ testFormat: 2.17/linux/{0}
+ targets:
- name: Alpine 3.19
test: alpine319
groups:
@@ -315,20 +321,6 @@ stages:
- 1
- 2
- 3
- - stage: Docker_2_14
- displayName: Docker 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.14/linux/{0}
- targets:
- - name: Alpine 3
- test: alpine3
- groups:
- - 1
- - 2
- - 3
### Community Docker
- stage: Docker_community_devel
@@ -360,6 +352,17 @@ stages:
nameFormat: Python {0}
testFormat: devel/generic/{0}/1
targets:
+ - test: '3.8'
+ - test: '3.11'
+ - stage: Generic_2_17
+ displayName: Generic 2.17
+ dependsOn: []
+ jobs:
+ - template: templates/matrix.yml
+ parameters:
+ nameFormat: Python {0}
+ testFormat: 2.17/generic/{0}/1
+ targets:
- test: '3.7'
- test: '3.12'
- stage: Generic_2_16
@@ -384,42 +387,32 @@ stages:
testFormat: 2.15/generic/{0}/1
targets:
- test: '3.9'
- - stage: Generic_2_14
- displayName: Generic 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- nameFormat: Python {0}
- testFormat: 2.14/generic/{0}/1
- targets:
- - test: '3.10'
- stage: Summary
condition: succeededOrFailed()
dependsOn:
- Sanity_devel
+ - Sanity_2_17
- Sanity_2_16
- Sanity_2_15
- - Sanity_2_14
- Units_devel
+ - Units_2_17
- Units_2_16
- Units_2_15
- - Units_2_14
- Remote_devel_extra_vms
- Remote_devel
+ - Remote_2_17
- Remote_2_16
- Remote_2_15
- - Remote_2_14
- Docker_devel
+ - Docker_2_17
- Docker_2_16
- Docker_2_15
- - Docker_2_14
- Docker_community_devel
# Right now all generic tests are disabled. Uncomment when at least one of them is re-enabled.
# - Generic_devel
+# - Generic_2_17
# - Generic_2_16
# - Generic_2_15
-# - Generic_2_14
jobs:
- template: templates/coverage.yml
diff --git a/ansible_collections/community/general/.github/BOTMETA.yml b/ansible_collections/community/general/.github/BOTMETA.yml
index 64cbc7021..e21d0c81c 100644
--- a/ansible_collections/community/general/.github/BOTMETA.yml
+++ b/ansible_collections/community/general/.github/BOTMETA.yml
@@ -780,6 +780,8 @@ files:
maintainers: laurpaum
$modules/keycloak_component_info.py:
maintainers: desand01
+ $modules/keycloak_client_rolescope.py:
+ maintainers: desand01
$modules/keycloak_user_rolemapping.py:
maintainers: bratwurzt
$modules/keycloak_realm_rolemapping.py:
@@ -1445,6 +1447,8 @@ files:
ignore: matze
labels: zypper
maintainers: $team_suse
+ $plugin_utils/unsafe.py:
+ maintainers: felixfontein
$tests/a_module.py:
maintainers: felixfontein
$tests/fqdn_valid.py:
@@ -1501,7 +1505,6 @@ macros:
becomes: plugins/become
caches: plugins/cache
callbacks: plugins/callback
- cliconfs: plugins/cliconf
connections: plugins/connection
doc_fragments: plugins/doc_fragments
filters: plugins/filter
@@ -1509,7 +1512,7 @@ macros:
lookups: plugins/lookup
module_utils: plugins/module_utils
modules: plugins/modules
- terminals: plugins/terminal
+ plugin_utils: plugins/plugin_utils
tests: plugins/test
team_ansible_core:
team_aix: MorrisA bcoca d-little flynn1973 gforster kairoaraujo marvin-sinister mator molekuul ramooncamacho wtcross
diff --git a/ansible_collections/community/general/.github/workflows/ansible-test.yml b/ansible_collections/community/general/.github/workflows/ansible-test.yml
index bc9daaa43..ecfc36565 100644
--- a/ansible_collections/community/general/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/general/.github/workflows/ansible-test.yml
@@ -30,6 +30,7 @@ jobs:
matrix:
ansible:
- '2.13'
+ - '2.14'
# Ansible-test on various stable branches does not yet work well with cgroups v2.
# Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04
# image for these stable branches. The list of branches where this is necessary will
@@ -72,6 +73,8 @@ jobs:
python: '2.7'
- ansible: '2.13'
python: '3.8'
+ - ansible: '2.14'
+ python: '3.9'
steps:
- name: >-
@@ -148,11 +151,29 @@ jobs:
docker: alpine3
python: ''
target: azp/posix/3/
+ # 2.14
+ - ansible: '2.14'
+ docker: alpine3
+ python: ''
+ target: azp/posix/1/
+ - ansible: '2.14'
+ docker: alpine3
+ python: ''
+ target: azp/posix/2/
+ - ansible: '2.14'
+ docker: alpine3
+ python: ''
+ target: azp/posix/3/
# Right now all generic tests are disabled. Uncomment when at least one of them is re-enabled.
# - ansible: '2.13'
# docker: default
# python: '3.9'
# target: azp/generic/1/
+ # Right now all generic tests are disabled. Uncomment when at least one of them is re-enabled.
+ # - ansible: '2.14'
+ # docker: default
+ # python: '3.10'
+ # target: azp/generic/1/
steps:
- name: >-
diff --git a/ansible_collections/community/general/CHANGELOG.md b/ansible_collections/community/general/CHANGELOG.md
index 08cac8a97..8f23931fe 100644
--- a/ansible_collections/community/general/CHANGELOG.md
+++ b/ansible_collections/community/general/CHANGELOG.md
@@ -2,71 +2,131 @@
**Topics**
-- <a href="#v8-5-0">v8\.5\.0</a>
+- <a href="#v8-6-0">v8\.6\.0</a>
- <a href="#release-summary">Release Summary</a>
- <a href="#minor-changes">Minor Changes</a>
- - <a href="#security-fixes">Security Fixes</a>
+ - <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes">Bugfixes</a>
- <a href="#new-modules">New Modules</a>
-- <a href="#v8-4-0">v8\.4\.0</a>
+- <a href="#v8-5-0">v8\.5\.0</a>
- <a href="#release-summary-1">Release Summary</a>
- <a href="#minor-changes-1">Minor Changes</a>
+ - <a href="#security-fixes">Security Fixes</a>
- <a href="#bugfixes-1">Bugfixes</a>
- - <a href="#new-plugins">New Plugins</a>
- - <a href="#callback">Callback</a>
- - <a href="#filter">Filter</a>
- <a href="#new-modules-1">New Modules</a>
-- <a href="#v8-3-0">v8\.3\.0</a>
+- <a href="#v8-4-0">v8\.4\.0</a>
- <a href="#release-summary-2">Release Summary</a>
- <a href="#minor-changes-2">Minor Changes</a>
- - <a href="#deprecated-features">Deprecated Features</a>
- <a href="#bugfixes-2">Bugfixes</a>
+ - <a href="#new-plugins">New Plugins</a>
+ - <a href="#callback">Callback</a>
+ - <a href="#filter">Filter</a>
- <a href="#new-modules-2">New Modules</a>
-- <a href="#v8-2-0">v8\.2\.0</a>
+- <a href="#v8-3-0">v8\.3\.0</a>
- <a href="#release-summary-3">Release Summary</a>
- <a href="#minor-changes-3">Minor Changes</a>
+ - <a href="#deprecated-features-1">Deprecated Features</a>
- <a href="#bugfixes-3">Bugfixes</a>
+ - <a href="#new-modules-3">New Modules</a>
+- <a href="#v8-2-0">v8\.2\.0</a>
+ - <a href="#release-summary-4">Release Summary</a>
+ - <a href="#minor-changes-4">Minor Changes</a>
+ - <a href="#bugfixes-4">Bugfixes</a>
- <a href="#new-plugins-1">New Plugins</a>
- <a href="#connection">Connection</a>
- <a href="#filter-1">Filter</a>
- <a href="#lookup">Lookup</a>
- - <a href="#new-modules-3">New Modules</a>
+ - <a href="#new-modules-4">New Modules</a>
- <a href="#v8-1-0">v8\.1\.0</a>
- - <a href="#release-summary-4">Release Summary</a>
- - <a href="#minor-changes-4">Minor Changes</a>
- - <a href="#bugfixes-4">Bugfixes</a>
+ - <a href="#release-summary-5">Release Summary</a>
+ - <a href="#minor-changes-5">Minor Changes</a>
+ - <a href="#bugfixes-5">Bugfixes</a>
- <a href="#new-plugins-2">New Plugins</a>
- <a href="#lookup-1">Lookup</a>
- <a href="#test">Test</a>
- - <a href="#new-modules-4">New Modules</a>
+ - <a href="#new-modules-5">New Modules</a>
- <a href="#v8-0-2">v8\.0\.2</a>
- - <a href="#release-summary-5">Release Summary</a>
- - <a href="#bugfixes-5">Bugfixes</a>
-- <a href="#v8-0-1">v8\.0\.1</a>
- <a href="#release-summary-6">Release Summary</a>
- <a href="#bugfixes-6">Bugfixes</a>
-- <a href="#v8-0-0">v8\.0\.0</a>
+- <a href="#v8-0-1">v8\.0\.1</a>
- <a href="#release-summary-7">Release Summary</a>
- - <a href="#minor-changes-5">Minor Changes</a>
+ - <a href="#bugfixes-7">Bugfixes</a>
+- <a href="#v8-0-0">v8\.0\.0</a>
+ - <a href="#release-summary-8">Release Summary</a>
+ - <a href="#minor-changes-6">Minor Changes</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- - <a href="#deprecated-features-1">Deprecated Features</a>
+ - <a href="#deprecated-features-2">Deprecated Features</a>
- <a href="#removed-features-previously-deprecated">Removed Features \(previously deprecated\)</a>
- - <a href="#bugfixes-7">Bugfixes</a>
+ - <a href="#bugfixes-8">Bugfixes</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#new-plugins-3">New Plugins</a>
- <a href="#lookup-2">Lookup</a>
- - <a href="#new-modules-5">New Modules</a>
+ - <a href="#new-modules-6">New Modules</a>
This changelog describes changes after version 7\.0\.0\.
+<a id="v8-6-0"></a>
+## v8\.6\.0
+
+<a id="release-summary"></a>
+### Release Summary
+
+Regular bugfix and features release\.
+
+<a id="minor-changes"></a>
+### Minor Changes
+
+* Use offset\-aware <code>datetime\.datetime</code> objects \(with timezone UTC\) instead of offset\-naive UTC timestamps\, which are deprecated in Python 3\.12 \([https\://github\.com/ansible\-collections/community\.general/pull/8222](https\://github\.com/ansible\-collections/community\.general/pull/8222)\)\.
+* apt\_rpm \- add new states <code>latest</code> and <code>present\_not\_latest</code>\. The value <code>latest</code> is equivalent to the current behavior of <code>present</code>\, which will upgrade a package if a newer version exists\. <code>present\_not\_latest</code> does what most users would expect <code>present</code> to do\: it does not upgrade if the package is already installed\. The current behavior of <code>present</code> will be deprecated in a later version\, and eventually changed to that of <code>present\_not\_latest</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8217](https\://github\.com/ansible\-collections/community\.general/issues/8217)\, [https\://github\.com/ansible\-collections/community\.general/pull/8247](https\://github\.com/ansible\-collections/community\.general/pull/8247)\)\.
+* bitwarden lookup plugin \- add support to filter by organization ID \([https\://github\.com/ansible\-collections/community\.general/pull/8188](https\://github\.com/ansible\-collections/community\.general/pull/8188)\)\.
+* filesystem \- add bcachefs support \([https\://github\.com/ansible\-collections/community\.general/pull/8126](https\://github\.com/ansible\-collections/community\.general/pull/8126)\)\.
+* ini\_file \- add an optional parameter <code>section\_has\_values</code>\. If the target ini file contains more than one <code>section</code>\, use <code>section\_has\_values</code> to specify which one should be updated \([https\://github\.com/ansible\-collections/community\.general/pull/7505](https\://github\.com/ansible\-collections/community\.general/pull/7505)\)\.
+* java\_cert \- add <code>cert\_content</code> argument \([https\://github\.com/ansible\-collections/community\.general/pull/8153](https\://github\.com/ansible\-collections/community\.general/pull/8153)\)\.
+* keycloak\_client\, keycloak\_clientscope\, keycloak\_clienttemplate \- added <code>docker\-v2</code> protocol support\, enhancing alignment with Keycloak\'s protocol options \([https\://github\.com/ansible\-collections/community\.general/issues/8215](https\://github\.com/ansible\-collections/community\.general/issues/8215)\, [https\://github\.com/ansible\-collections/community\.general/pull/8216](https\://github\.com/ansible\-collections/community\.general/pull/8216)\)\.
+* nmcli \- adds OpenvSwitch support with new <code>type</code> values <code>ovs\-port</code>\, <code>ovs\-interface</code>\, and <code>ovs\-bridge</code>\, and new <code>slave\_type</code> value <code>ovs\-port</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8154](https\://github\.com/ansible\-collections/community\.general/pull/8154)\)\.
+* osx\_defaults \- add option <code>check\_types</code> to enable changing the type of existing defaults on the fly \([https\://github\.com/ansible\-collections/community\.general/pull/8173](https\://github\.com/ansible\-collections/community\.general/pull/8173)\)\.
+* passwordstore lookup \- add <code>missing\_subkey</code> parameter defining the behavior of the lookup when a passwordstore subkey is missing \([https\://github\.com/ansible\-collections/community\.general/pull/8166](https\://github\.com/ansible\-collections/community\.general/pull/8166)\)\.
+* portage \- adds the possibility to explicitely tell portage to write packages to world file \([https\://github\.com/ansible\-collections/community\.general/issues/6226](https\://github\.com/ansible\-collections/community\.general/issues/6226)\, [https\://github\.com/ansible\-collections/community\.general/pull/8236](https\://github\.com/ansible\-collections/community\.general/pull/8236)\)\.
+* redfish\_command \- add command <code>ResetToDefaults</code> to reset manager to default state \([https\://github\.com/ansible\-collections/community\.general/issues/8163](https\://github\.com/ansible\-collections/community\.general/issues/8163)\)\.
+* redfish\_info \- add boolean return value <code>MultipartHttpPush</code> to <code>GetFirmwareUpdateCapabilities</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8194](https\://github\.com/ansible\-collections/community\.general/issues/8194)\, [https\://github\.com/ansible\-collections/community\.general/pull/8195](https\://github\.com/ansible\-collections/community\.general/pull/8195)\)\.
+* ssh\_config \- allow <code>accept\-new</code> as valid value for <code>strict\_host\_key\_checking</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8257](https\://github\.com/ansible\-collections/community\.general/pull/8257)\)\.
+
+<a id="deprecated-features"></a>
+### Deprecated Features
+
+* hipchat callback plugin \- the hipchat service has been discontinued and the self\-hosted variant has been End of Life since 2020\. The callback plugin is therefore deprecated and will be removed from community\.general 10\.0\.0 if nobody provides compelling reasons to still keep it \([https\://github\.com/ansible\-collections/community\.general/issues/8184](https\://github\.com/ansible\-collections/community\.general/issues/8184)\, [https\://github\.com/ansible\-collections/community\.general/pull/8189](https\://github\.com/ansible\-collections/community\.general/pull/8189)\)\.
+
+<a id="bugfixes"></a>
+### Bugfixes
+
+* aix\_filesystem \- fix <code>\_validate\_vg</code> not passing VG name to <code>lsvg\_cmd</code> \([https\://github\.com/ansible\-collections/community\.general/issues/8151](https\://github\.com/ansible\-collections/community\.general/issues/8151)\)\.
+* apt\_rpm \- when checking whether packages were installed after running <code>apt\-get \-y install \<packages\></code>\, only the last package name was checked \([https\://github\.com/ansible\-collections/community\.general/pull/8263](https\://github\.com/ansible\-collections/community\.general/pull/8263)\)\.
+* bitwarden\_secrets\_manager lookup plugin \- implements retry with exponential backoff to avoid lookup errors when Bitwardn\'s API rate limiting is encountered \([https\://github\.com/ansible\-collections/community\.general/issues/8230](https\://github\.com/ansible\-collections/community\.general/issues/8230)\, [https\://github\.com/ansible\-collections/community\.general/pull/8238](https\://github\.com/ansible\-collections/community\.general/pull/8238)\)\.
+* from\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\.
+* gitlab\_issue\, gitlab\_label\, gitlab\_milestone \- avoid crash during version comparison when the python\-gitlab Python module is not installed \([https\://github\.com/ansible\-collections/community\.general/pull/8158](https\://github\.com/ansible\-collections/community\.general/pull/8158)\)\.
+* haproxy \- fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable \([https\://github\.com/ansible\-collections/community\.general/issues/8092](https\://github\.com/ansible\-collections/community\.general/issues/8092)\)\.
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \(\([https\://github\.com/ansible\-collections/community\.general/issues/8212](https\://github\.com/ansible\-collections/community\.general/issues/8212)\, [https\://github\.com/ansible\-collections/community\.general/pull/8225](https\://github\.com/ansible\-collections/community\.general/pull/8225)\)\.
+* ipa \- fix get version regex in IPA module\_utils \([https\://github\.com/ansible\-collections/community\.general/pull/8175](https\://github\.com/ansible\-collections/community\.general/pull/8175)\)\.
+* keycloak\_client \- add sorted <code>defaultClientScopes</code> and <code>optionalClientScopes</code> to normalizations \([https\://github\.com/ansible\-collections/community\.general/pull/8223](https\://github\.com/ansible\-collections/community\.general/pull/8223)\)\.
+* keycloak\_realm \- add normalizations for <code>enabledEventTypes</code> and <code>supportedLocales</code> \([https\://github\.com/ansible\-collections/community\.general/pull/8224](https\://github\.com/ansible\-collections/community\.general/pull/8224)\)\.
+* puppet \- add option <code>environment\_lang</code> to set the environment language encoding\. Defaults to lang <code>C</code>\. It is recommended to set it to <code>C\.UTF\-8</code> or <code>en\_US\.UTF\-8</code> depending on what is available on your system\. \([https\://github\.com/ansible\-collections/community\.general/issues/8000](https\://github\.com/ansible\-collections/community\.general/issues/8000)\)
+* riak \- support <code>riak admin</code> sub\-command in newer Riak KV versions beside the legacy <code>riak\-admin</code> main command \([https\://github\.com/ansible\-collections/community\.general/pull/8211](https\://github\.com/ansible\-collections/community\.general/pull/8211)\)\.
+* to\_ini filter plugin \- disabling interpolation of <code>ConfigParser</code> to allow converting values with a <code>\%</code> sign \([https\://github\.com/ansible\-collections/community\.general/issues/8183](https\://github\.com/ansible\-collections/community\.general/issues/8183)\, [https\://github\.com/ansible\-collections/community\.general/pull/8185](https\://github\.com/ansible\-collections/community\.general/pull/8185)\)\.
+* xml \- make module work with lxml 5\.1\.1\, which removed some internals that the module was relying on \([https\://github\.com/ansible\-collections/community\.general/pull/8169](https\://github\.com/ansible\-collections/community\.general/pull/8169)\)\.
+
+<a id="new-modules"></a>
+### New Modules
+
+* keycloak\_client\_rolescope \- Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications\.
+
<a id="v8-5-0"></a>
## v8\.5\.0
-<a id="release-summary"></a>
+<a id="release-summary-1"></a>
### Release Summary
Regular feature and bugfix release with security fixes\.
-<a id="minor-changes"></a>
+<a id="minor-changes-1"></a>
### Minor Changes
* bitwarden lookup plugin \- allows to fetch all records of a given collection ID\, by allowing to pass an empty value for <code>search\_value</code> when <code>collection\_id</code> is provided \([https\://github\.com/ansible\-collections/community\.general/pull/8013](https\://github\.com/ansible\-collections/community\.general/pull/8013)\)\.
@@ -84,7 +144,7 @@ Regular feature and bugfix release with security fixes\.
* cobbler\, gitlab\_runners\, icinga2\, linode\, lxd\, nmap\, online\, opennebula\, proxmox\, scaleway\, stackpath\_compute\, virtualbox\, and xen\_orchestra inventory plugin \- make sure all data received from the remote servers is marked as unsafe\, so remote code execution by obtaining texts that can be evaluated as templates is not possible \([https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/](https\://www\.die\-welt\.net/2024/03/remote\-code\-execution\-in\-ansible\-dynamic\-inventory\-plugins/)\, [https\://github\.com/ansible\-collections/community\.general/pull/8098](https\://github\.com/ansible\-collections/community\.general/pull/8098)\)\.
-<a id="bugfixes"></a>
+<a id="bugfixes-1"></a>
### Bugfixes
* aix\_filesystem \- fix issue with empty list items in crfs logic and option order \([https\://github\.com/ansible\-collections/community\.general/pull/8052](https\://github\.com/ansible\-collections/community\.general/pull/8052)\)\.
@@ -98,7 +158,7 @@ Regular feature and bugfix release with security fixes\.
* pam\_limits \- when the file does not exist\, do not create it in check mode \([https\://github\.com/ansible\-collections/community\.general/issues/8050](https\://github\.com/ansible\-collections/community\.general/issues/8050)\, [https\://github\.com/ansible\-collections/community\.general/pull/8057](https\://github\.com/ansible\-collections/community\.general/pull/8057)\)\.
* proxmox\_kvm \- fixed status check getting from node\-specific API endpoint \([https\://github\.com/ansible\-collections/community\.general/issues/7817](https\://github\.com/ansible\-collections/community\.general/issues/7817)\)\.
-<a id="new-modules"></a>
+<a id="new-modules-1"></a>
### New Modules
* usb\_facts \- Allows listing information about USB devices
@@ -106,12 +166,12 @@ Regular feature and bugfix release with security fixes\.
<a id="v8-4-0"></a>
## v8\.4\.0
-<a id="release-summary-1"></a>
+<a id="release-summary-2"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-1"></a>
+<a id="minor-changes-2"></a>
### Minor Changes
* bitwarden lookup plugin \- add <code>bw\_session</code> option\, to pass session key instead of reading from env \([https\://github\.com/ansible\-collections/community\.general/pull/7994](https\://github\.com/ansible\-collections/community\.general/pull/7994)\)\.
@@ -124,7 +184,7 @@ Regular bugfix and feature release\.
* sudoers \- add support for the <code>NOEXEC</code> tag in sudoers rules \([https\://github\.com/ansible\-collections/community\.general/pull/7983](https\://github\.com/ansible\-collections/community\.general/pull/7983)\)\.
* terraform \- fix <code>diff\_mode</code> in state <code>absent</code> and when terraform <code>resource\_changes</code> does not exist \([https\://github\.com/ansible\-collections/community\.general/pull/7963](https\://github\.com/ansible\-collections/community\.general/pull/7963)\)\.
-<a id="bugfixes-1"></a>
+<a id="bugfixes-2"></a>
### Bugfixes
* cargo \- fix idempotency issues when using a custom installation path for packages \(using the <code>\-\-path</code> parameter\)\. The initial installation runs fine\, but subsequent runs use the <code>get\_installed\(\)</code> function which did not check the given installation location\, before running <code>cargo install</code>\. This resulted in a false <code>changed</code> state\. Also the removal of packeges using <code>state\: absent</code> failed\, as the installation check did not use the given parameter \([https\://github\.com/ansible\-collections/community\.general/pull/7970](https\://github\.com/ansible\-collections/community\.general/pull/7970)\)\.
@@ -153,7 +213,7 @@ Regular bugfix and feature release\.
* lists\_symmetric\_difference \- Symmetric Difference of lists with a predictive order
* lists\_union \- Union of lists with a predictive order
-<a id="new-modules-1"></a>
+<a id="new-modules-2"></a>
### New Modules
* gitlab\_group\_access\_token \- Manages GitLab group access tokens
@@ -162,12 +222,12 @@ Regular bugfix and feature release\.
<a id="v8-3-0"></a>
## v8\.3\.0
-<a id="release-summary-2"></a>
+<a id="release-summary-3"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-2"></a>
+<a id="minor-changes-3"></a>
### Minor Changes
* consul\_auth\_method\, consul\_binding\_rule\, consul\_policy\, consul\_role\, consul\_session\, consul\_token \- added action group <code>community\.general\.consul</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7897](https\://github\.com/ansible\-collections/community\.general/pull/7897)\)\.
@@ -180,12 +240,12 @@ Regular bugfix and feature release\.
* redfish\_info \- add command <code>GetServiceIdentification</code> to get service identification \([https\://github\.com/ansible\-collections/community\.general/issues/7882](https\://github\.com/ansible\-collections/community\.general/issues/7882)\)\.
* terraform \- add support for <code>diff\_mode</code> for terraform resource\_changes \([https\://github\.com/ansible\-collections/community\.general/pull/7896](https\://github\.com/ansible\-collections/community\.general/pull/7896)\)\.
-<a id="deprecated-features"></a>
+<a id="deprecated-features-1"></a>
### Deprecated Features
* consul\_acl \- the module has been deprecated and will be removed in community\.general 10\.0\.0\. <code>consul\_token</code> and <code>consul\_policy</code> can be used instead \([https\://github\.com/ansible\-collections/community\.general/pull/7901](https\://github\.com/ansible\-collections/community\.general/pull/7901)\)\.
-<a id="bugfixes-2"></a>
+<a id="bugfixes-3"></a>
### Bugfixes
* homebrew \- detect already installed formulae and casks using JSON output from <code>brew info</code> \([https\://github\.com/ansible\-collections/community\.general/issues/864](https\://github\.com/ansible\-collections/community\.general/issues/864)\)\.
@@ -196,7 +256,7 @@ Regular bugfix and feature release\.
* nmcli \- fix <code>connection\.slave\-type</code> wired to <code>bond</code> and not with parameter <code>slave\_type</code> in case of connection type <code>wifi</code> \([https\://github\.com/ansible\-collections/community\.general/issues/7389](https\://github\.com/ansible\-collections/community\.general/issues/7389)\)\.
* proxmox \- fix updating a container config if the setting does not already exist \([https\://github\.com/ansible\-collections/community\.general/pull/7872](https\://github\.com/ansible\-collections/community\.general/pull/7872)\)\.
-<a id="new-modules-2"></a>
+<a id="new-modules-3"></a>
### New Modules
* consul\_acl\_bootstrap \- Bootstrap ACLs in Consul
@@ -209,12 +269,12 @@ Regular bugfix and feature release\.
<a id="v8-2-0"></a>
## v8\.2\.0
-<a id="release-summary-3"></a>
+<a id="release-summary-4"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-3"></a>
+<a id="minor-changes-4"></a>
### Minor Changes
* ipa\_dnsrecord \- adds ability to manage NS record types \([https\://github\.com/ansible\-collections/community\.general/pull/7737](https\://github\.com/ansible\-collections/community\.general/pull/7737)\)\.
@@ -230,7 +290,7 @@ Regular bugfix and feature release\.
* ssh\_config \- new feature to set <code>IdentitiesOnly</code> option to <code>yes</code> or <code>no</code> \([https\://github\.com/ansible\-collections/community\.general/pull/7704](https\://github\.com/ansible\-collections/community\.general/pull/7704)\)\.
* xcc\_redfish\_command \- added support for raw POSTs \(<code>command\=PostResource</code> in <code>category\=Raw</code>\) without a specific action info \([https\://github\.com/ansible\-collections/community\.general/pull/7746](https\://github\.com/ansible\-collections/community\.general/pull/7746)\)\.
-<a id="bugfixes-3"></a>
+<a id="bugfixes-4"></a>
### Bugfixes
* keycloak\_identity\_provider \- <code>mappers</code> processing was not idempotent if the mappers configuration list had not been sorted by name \(in ascending order\)\. Fix resolves the issue by sorting mappers in the desired state using the same key which is used for obtaining existing state \([https\://github\.com/ansible\-collections/community\.general/pull/7418](https\://github\.com/ansible\-collections/community\.general/pull/7418)\)\.
@@ -258,7 +318,7 @@ Regular bugfix and feature release\.
* github\_app\_access\_token \- Obtain short\-lived Github App Access tokens
-<a id="new-modules-3"></a>
+<a id="new-modules-4"></a>
### New Modules
* dnf\_config\_manager \- Enable or disable dnf repositories using config\-manager
@@ -270,12 +330,12 @@ Regular bugfix and feature release\.
<a id="v8-1-0"></a>
## v8\.1\.0
-<a id="release-summary-4"></a>
+<a id="release-summary-5"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-4"></a>
+<a id="minor-changes-5"></a>
### Minor Changes
* bitwarden lookup plugin \- when looking for items using an item ID\, the item is now accessed directly with <code>bw get item</code> instead of searching through all items\. This doubles the lookup speed \([https\://github\.com/ansible\-collections/community\.general/pull/7468](https\://github\.com/ansible\-collections/community\.general/pull/7468)\)\.
@@ -312,7 +372,7 @@ Regular bugfix and feature release\.
* redfish\_info \- adding the <code>BootProgress</code> property when getting <code>Systems</code> info \([https\://github\.com/ansible\-collections/community\.general/pull/7626](https\://github\.com/ansible\-collections/community\.general/pull/7626)\)\.
* ssh\_config \- adds <code>controlmaster</code>\, <code>controlpath</code> and <code>controlpersist</code> parameters \([https\://github\.com/ansible\-collections/community\.general/pull/7456](https\://github\.com/ansible\-collections/community\.general/pull/7456)\)\.
-<a id="bugfixes-4"></a>
+<a id="bugfixes-5"></a>
### Bugfixes
* apt\-rpm \- the module did not upgrade packages if a newer version exists\. Now the package will be reinstalled if the candidate is newer than the installed version \([https\://github\.com/ansible\-collections/community\.general/issues/7414](https\://github\.com/ansible\-collections/community\.general/issues/7414)\)\.
@@ -343,7 +403,7 @@ Regular bugfix and feature release\.
* fqdn\_valid \- Validates fully\-qualified domain names against RFC 1123
-<a id="new-modules-4"></a>
+<a id="new-modules-5"></a>
### New Modules
* git\_config\_info \- Read git configuration
@@ -353,12 +413,12 @@ Regular bugfix and feature release\.
<a id="v8-0-2"></a>
## v8\.0\.2
-<a id="release-summary-5"></a>
+<a id="release-summary-6"></a>
### Release Summary
Bugfix release for inclusion in Ansible 9\.0\.0rc1\.
-<a id="bugfixes-5"></a>
+<a id="bugfixes-6"></a>
### Bugfixes
* ocapi\_utils\, oci\_utils\, redfish\_utils module utils \- replace <code>type\(\)</code> calls with <code>isinstance\(\)</code> calls \([https\://github\.com/ansible\-collections/community\.general/pull/7501](https\://github\.com/ansible\-collections/community\.general/pull/7501)\)\.
@@ -367,12 +427,12 @@ Bugfix release for inclusion in Ansible 9\.0\.0rc1\.
<a id="v8-0-1"></a>
## v8\.0\.1
-<a id="release-summary-6"></a>
+<a id="release-summary-7"></a>
### Release Summary
Bugfix release for inclusion in Ansible 9\.0\.0b1\.
-<a id="bugfixes-6"></a>
+<a id="bugfixes-7"></a>
### Bugfixes
* gitlab\_group\_members \- fix gitlab constants call in <code>gitlab\_group\_members</code> module \([https\://github\.com/ansible\-collections/community\.general/issues/7467](https\://github\.com/ansible\-collections/community\.general/issues/7467)\)\.
@@ -385,12 +445,12 @@ Bugfix release for inclusion in Ansible 9\.0\.0b1\.
<a id="v8-0-0"></a>
## v8\.0\.0
-<a id="release-summary-7"></a>
+<a id="release-summary-8"></a>
### Release Summary
This is release 8\.0\.0 of <code>community\.general</code>\, released on 2023\-11\-01\.
-<a id="minor-changes-5"></a>
+<a id="minor-changes-6"></a>
### Minor Changes
* The collection will start using semantic markup \([https\://github\.com/ansible\-collections/community\.general/pull/6539](https\://github\.com/ansible\-collections/community\.general/pull/6539)\)\.
@@ -529,7 +589,7 @@ This is release 8\.0\.0 of <code>community\.general</code>\, released on 2023\-1
* vardict module utils \- <code>VarDict</code> will no longer accept variables named <code>\_var</code>\, <code>get\_meta</code>\, and <code>as\_dict</code> \([https\://github\.com/ansible\-collections/community\.general/pull/6647](https\://github\.com/ansible\-collections/community\.general/pull/6647)\)\.
* version module util \- remove fallback for ansible\-core 2\.11\. All modules and plugins that do version collections no longer work with ansible\-core 2\.11 \([https\://github\.com/ansible\-collections/community\.general/pull/7269](https\://github\.com/ansible\-collections/community\.general/pull/7269)\)\.
-<a id="deprecated-features-1"></a>
+<a id="deprecated-features-2"></a>
### Deprecated Features
* CmdRunner module utils \- deprecate <code>cmd\_runner\_fmt\.as\_default\_type\(\)</code> formatter \([https\://github\.com/ansible\-collections/community\.general/pull/6601](https\://github\.com/ansible\-collections/community\.general/pull/6601)\)\.
@@ -589,7 +649,7 @@ This is release 8\.0\.0 of <code>community\.general</code>\, released on 2023\-1
* proxmox module utils \- removed unused imports \([https\://github\.com/ansible\-collections/community\.general/pull/6873](https\://github\.com/ansible\-collections/community\.general/pull/6873)\)\.
* xfconf \- the deprecated <code>disable\_facts</code> option was removed \([https\://github\.com/ansible\-collections/community\.general/pull/7358](https\://github\.com/ansible\-collections/community\.general/pull/7358)\)\.
-<a id="bugfixes-7"></a>
+<a id="bugfixes-8"></a>
### Bugfixes
* CmdRunner module utils \- does not attempt to resolve path if executable is a relative or absolute path \([https\://github\.com/ansible\-collections/community\.general/pull/7200](https\://github\.com/ansible\-collections/community\.general/pull/7200)\)\.
@@ -684,7 +744,7 @@ This is release 8\.0\.0 of <code>community\.general</code>\, released on 2023\-1
* bitwarden\_secrets\_manager \- Retrieve secrets from Bitwarden Secrets Manager
-<a id="new-modules-5"></a>
+<a id="new-modules-6"></a>
### New Modules
* consul\_policy \- Manipulate Consul policies
diff --git a/ansible_collections/community/general/CHANGELOG.rst b/ansible_collections/community/general/CHANGELOG.rst
index da10a021b..5a5a0cb7c 100644
--- a/ansible_collections/community/general/CHANGELOG.rst
+++ b/ansible_collections/community/general/CHANGELOG.rst
@@ -6,6 +6,60 @@ Community General Release Notes
This changelog describes changes after version 7.0.0.
+v8.6.0
+======
+
+Release Summary
+---------------
+
+Regular bugfix and features release.
+
+Minor Changes
+-------------
+
+- Use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead of offset-naive UTC timestamps, which are deprecated in Python 3.12 (https://github.com/ansible-collections/community.general/pull/8222).
+- apt_rpm - add new states ``latest`` and ``present_not_latest``. The value ``latest`` is equivalent to the current behavior of ``present``, which will upgrade a package if a newer version exists. ``present_not_latest`` does what most users would expect ``present`` to do: it does not upgrade if the package is already installed. The current behavior of ``present`` will be deprecated in a later version, and eventually changed to that of ``present_not_latest`` (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8247).
+- bitwarden lookup plugin - add support to filter by organization ID (https://github.com/ansible-collections/community.general/pull/8188).
+- filesystem - add bcachefs support (https://github.com/ansible-collections/community.general/pull/8126).
+- ini_file - add an optional parameter ``section_has_values``. If the target ini file contains more than one ``section``, use ``section_has_values`` to specify which one should be updated (https://github.com/ansible-collections/community.general/pull/7505).
+- java_cert - add ``cert_content`` argument (https://github.com/ansible-collections/community.general/pull/8153).
+- keycloak_client, keycloak_clientscope, keycloak_clienttemplate - added ``docker-v2`` protocol support, enhancing alignment with Keycloak's protocol options (https://github.com/ansible-collections/community.general/issues/8215, https://github.com/ansible-collections/community.general/pull/8216).
+- nmcli - adds OpenvSwitch support with new ``type`` values ``ovs-port``, ``ovs-interface``, and ``ovs-bridge``, and new ``slave_type`` value ``ovs-port`` (https://github.com/ansible-collections/community.general/pull/8154).
+- osx_defaults - add option ``check_types`` to enable changing the type of existing defaults on the fly (https://github.com/ansible-collections/community.general/pull/8173).
+- passwordstore lookup - add ``missing_subkey`` parameter defining the behavior of the lookup when a passwordstore subkey is missing (https://github.com/ansible-collections/community.general/pull/8166).
+- portage - adds the possibility to explicitely tell portage to write packages to world file (https://github.com/ansible-collections/community.general/issues/6226, https://github.com/ansible-collections/community.general/pull/8236).
+- redfish_command - add command ``ResetToDefaults`` to reset manager to default state (https://github.com/ansible-collections/community.general/issues/8163).
+- redfish_info - add boolean return value ``MultipartHttpPush`` to ``GetFirmwareUpdateCapabilities`` (https://github.com/ansible-collections/community.general/issues/8194, https://github.com/ansible-collections/community.general/pull/8195).
+- ssh_config - allow ``accept-new`` as valid value for ``strict_host_key_checking`` (https://github.com/ansible-collections/community.general/pull/8257).
+
+Deprecated Features
+-------------------
+
+- hipchat callback plugin - the hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020. The callback plugin is therefore deprecated and will be removed from community.general 10.0.0 if nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184, https://github.com/ansible-collections/community.general/pull/8189).
+
+Bugfixes
+--------
+
+- aix_filesystem - fix ``_validate_vg`` not passing VG name to ``lsvg_cmd`` (https://github.com/ansible-collections/community.general/issues/8151).
+- apt_rpm - when checking whether packages were installed after running ``apt-get -y install <packages>``, only the last package name was checked (https://github.com/ansible-collections/community.general/pull/8263).
+- bitwarden_secrets_manager lookup plugin - implements retry with exponential backoff to avoid lookup errors when Bitwardn's API rate limiting is encountered (https://github.com/ansible-collections/community.general/issues/8230, https://github.com/ansible-collections/community.general/pull/8238).
+- from_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185).
+- gitlab_issue, gitlab_label, gitlab_milestone - avoid crash during version comparison when the python-gitlab Python module is not installed (https://github.com/ansible-collections/community.general/pull/8158).
+- haproxy - fix an issue where HAProxy could get stuck in DRAIN mode when the backend was unreachable (https://github.com/ansible-collections/community.general/issues/8092).
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX ((https://github.com/ansible-collections/community.general/issues/8212, https://github.com/ansible-collections/community.general/pull/8225).
+- ipa - fix get version regex in IPA module_utils (https://github.com/ansible-collections/community.general/pull/8175).
+- keycloak_client - add sorted ``defaultClientScopes`` and ``optionalClientScopes`` to normalizations (https://github.com/ansible-collections/community.general/pull/8223).
+- keycloak_realm - add normalizations for ``enabledEventTypes`` and ``supportedLocales`` (https://github.com/ansible-collections/community.general/pull/8224).
+- puppet - add option ``environment_lang`` to set the environment language encoding. Defaults to lang ``C``. It is recommended to set it to ``C.UTF-8`` or ``en_US.UTF-8`` depending on what is available on your system. (https://github.com/ansible-collections/community.general/issues/8000)
+- riak - support ``riak admin`` sub-command in newer Riak KV versions beside the legacy ``riak-admin`` main command (https://github.com/ansible-collections/community.general/pull/8211).
+- to_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183, https://github.com/ansible-collections/community.general/pull/8185).
+- xml - make module work with lxml 5.1.1, which removed some internals that the module was relying on (https://github.com/ansible-collections/community.general/pull/8169).
+
+New Modules
+-----------
+
+- keycloak_client_rolescope - Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications.
+
v8.5.0
======
diff --git a/ansible_collections/community/general/FILES.json b/ansible_collections/community/general/FILES.json
index c84d62a88..cbe1d8808 100644
--- a/ansible_collections/community/general/FILES.json
+++ b/ansible_collections/community/general/FILES.json
@@ -109,7 +109,7 @@
"name": ".azure-pipelines/azure-pipelines.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a0a3c682a3f4926434b08f73ab1d362629d17db898358d8970c0a78d6195a74",
+ "chksum_sha256": "370fe873607691433d32772c07c53712f66f3745026442838d9d7ca9af953e48",
"format": 1
},
{
@@ -165,7 +165,7 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "881d33effb01a3b9c94026a3720af4fc2cc3f1c7fa93d48d4ffd2584b9e2db9d",
+ "chksum_sha256": "ef0a066aa753e5667b6b1d4e2887f13add9b692f6373bbac695bcbe43e73e73f",
"format": 1
},
{
@@ -193,7 +193,7 @@
"name": ".github/BOTMETA.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f3ee06f8b6dad417086bf9cc5e0e7ff4519aa65139373c43e3fbe7cff572f3b",
+ "chksum_sha256": "5d44cab4aa242ff60409d95adf43c4be0bc3d4eace180b0f04da04bcf2d0e119",
"format": 1
},
{
@@ -312,7 +312,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cabe396ff93a6bc5327c16686af1c75f29d1b239ce7ceb6e25930f33690da3da",
+ "chksum_sha256": "cc2e8e92892d291b60d26135122e9017acb600db7f386a6ccd71d77846436776",
"format": 1
},
{
@@ -771,6 +771,13 @@
"format": 1
},
{
+ "name": "docs/docsite/config.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0c5ec9ff76cf4db33b5d3f771419ef50d448e5d510cb7a98fc07dd9ecee69c4e",
+ "format": 1
+ },
+ {
"name": "docs/docsite/extra-docs.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -795,7 +802,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "893ee2f56034e3e8ac5b9a73e689fef80921b692ba6da0e5db2fd330aad2a617",
+ "chksum_sha256": "7aed4acf161705fece142c2d79ed08c7a5fdf3239644406203cb494b2e74c7a2",
"format": 1
},
{
@@ -991,7 +998,7 @@
"name": "plugins/callback/hipchat.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "987c2a8b697623f30f2de2d4e70b027096190c0a4a6c99703db36ce0b1b9bb63",
+ "chksum_sha256": "3b5b9a0b3bf7fa339aff42b2d8e0695fd7c596c252b9773b3373863ff8cab720",
"format": 1
},
{
@@ -1012,7 +1019,7 @@
"name": "plugins/callback/loganalytics.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "41ee07d1e548f4d03475f0001e084645124d77d850e031c17d78d81b5bfc2e31",
+ "chksum_sha256": "33b365b6aa6ede1129ab535c212d87828c933ecb1ba6aa9875e5e4e449dcd397",
"format": 1
},
{
@@ -1033,7 +1040,7 @@
"name": "plugins/callback/logstash.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "411199e9f8925c20601b623056b6288f02000815efcb0c25254e69051a826aee",
+ "chksum_sha256": "cd3dc96b5ad3fbd489739967e1ca022cacd1e54d760d78ed7e777ed35387895d",
"format": 1
},
{
@@ -1089,14 +1096,14 @@
"name": "plugins/callback/splunk.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "552c6c10b5ceed03a4728c8dee70d6211a1b208095c4ff4748ebf8c2110f4bf9",
+ "chksum_sha256": "e275389d7786a2a693ea6b313686dee7da6c1b7afc3c25e4ed7538efca6c157e",
"format": 1
},
{
"name": "plugins/callback/sumologic.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3265907f5d62128170d48eefda9901eb1f3d6bc36d9f93e5f900403850724d73",
+ "chksum_sha256": "de3553075bbf8bb7bc9c91efcea1ad418ea0a2e908d47cc90f975ba3889b054e",
"format": 1
},
{
@@ -1537,7 +1544,7 @@
"name": "plugins/filter/from_ini.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aa388a5cdd894e1c3d1e66580dbd2947abc2a60b8a30b05fee1a5fb8bb8cc642",
+ "chksum_sha256": "eeb40072eda1075f377f210310a0a74f3ab81618575b1bfec3e9bc6ca42896c5",
"format": 1
},
{
@@ -1656,7 +1663,7 @@
"name": "plugins/filter/to_ini.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1012ffb9f4d8626c948dc52bf36a4c42287e1deaf65eca1ecf954170d61fdc0",
+ "chksum_sha256": "40e4926d88132be0f03c6857df46789931a450a8107cf248bee01c9725310d7b",
"format": 1
},
{
@@ -1733,91 +1740,91 @@
"name": "plugins/inventory/cobbler.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2a6cd6114bae928361af7ec60e99a4e85f9ed3b437c943bc60e23f4c21401c64",
+ "chksum_sha256": "f061ed54c78be6b39aed094d77480d8a90148a5b5cd92fd3167f23482d93226d",
"format": 1
},
{
"name": "plugins/inventory/gitlab_runners.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1fd2de379dbf83ba5fddafeb3fecb693ef5d35157ef5a8f0e9718d984ca4b9f4",
+ "chksum_sha256": "2c4e173a50c5838eb3b1a7b0525a60eeddbc8aad3a31f53af6087a53323f68a3",
"format": 1
},
{
"name": "plugins/inventory/icinga2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f9bdc281508bc222fd6e1f19c34575cd9dc5056ca3ca1d7a8f4481de1d24cf27",
+ "chksum_sha256": "9a9bcca6fa0b8fb673ae533d8a5455317a131294ec69ac292512a07ba5047e77",
"format": 1
},
{
"name": "plugins/inventory/linode.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d2375902a364f0c8b8cc9d6f88512be7b4371d6dbfcda4e5707df404b5336ae2",
+ "chksum_sha256": "fe2339ec5b8572f3e9c9c1414c961068ebf1e968ba255110d3fc882740ba2015",
"format": 1
},
{
"name": "plugins/inventory/lxd.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f501b691589f29ad2cf5954d98e2576e2944f88f9d23d74cece0f0850c77888",
+ "chksum_sha256": "1aee550b5e6222dadc8ed4a6950a4b471f40892627d92badba12dc3208163585",
"format": 1
},
{
"name": "plugins/inventory/nmap.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76f3c42cba7bb30fa841ba9193a71c9ce857303c9d83d9d8d1ff04dfc4f1c726",
+ "chksum_sha256": "81d1bc141fc09acddf6da7500ea3834c252b097aacaa13dd38205b04cbe2250b",
"format": 1
},
{
"name": "plugins/inventory/online.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "533c5edf6b17e4b25628aad13fc5d7aba7c9ea1ae86e12d091c50aef12a8f775",
+ "chksum_sha256": "f6af33b129af56d23bc8bf66072f656e336b0cf7fb5dab958c992f2392fcdf9d",
"format": 1
},
{
"name": "plugins/inventory/opennebula.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76f28fa3696a031e014d66ea1617fb5d98319dc6809dac3218f7a4d800ceff45",
+ "chksum_sha256": "954bb22612557fbe3be3510d3ebc7e230164cb3dcb689345a287270b85234970",
"format": 1
},
{
"name": "plugins/inventory/proxmox.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "01313ffb0af966b9a4e2b6f95c1497359a98ae5847be4b9c324aae3c5e412f9c",
+ "chksum_sha256": "a4ceafbac13b19794a5ee15b778407fc0e7879ec56dccc13c9affa9008f9a81c",
"format": 1
},
{
"name": "plugins/inventory/scaleway.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5663c4b332dda4720df71285671ef999c8eaa3e4e3335bca1e8e376e65585c46",
+ "chksum_sha256": "2a8adf3084473bf8a7f7f6983ecbbac1a7f18ccfe073b018ea939d933fefa095",
"format": 1
},
{
"name": "plugins/inventory/stackpath_compute.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38003a1f85c8781d73ae5352d461c87c5a66db67810aa3113d5f15b1e07d3e06",
+ "chksum_sha256": "5ee8154d186e72b3cbbd0b4ce8232f18b06e028010779a6d2ea3d494aed2774f",
"format": 1
},
{
"name": "plugins/inventory/virtualbox.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0547e7940ec2940cb9ef4bd07b321b45a458792e6b2d572c2abceb72c4e78d26",
+ "chksum_sha256": "40f8697615b3e767265ef7e0c24735fdb4d6bc8d354d6bb2296c12f4e7a99a5b",
"format": 1
},
{
"name": "plugins/inventory/xen_orchestra.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d9b079b0215b6775490192fffae78fe46f088675348ae4129d7825aeda59bb0a",
+ "chksum_sha256": "4622368d48743bb29d2d42c70956bc953265c062a2a9e33d03d7635bbd0bcb0b",
"format": 1
},
{
@@ -1831,14 +1838,14 @@
"name": "plugins/lookup/bitwarden.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5f0e069d8c299d2bb3087726049d7df8d03a4e545ba3d8df9fd429ed6767125d",
+ "chksum_sha256": "e894798a425bfd34301056e5cdf03ce61d18c82d03db8c95dcd7778d15707923",
"format": 1
},
{
"name": "plugins/lookup/bitwarden_secrets_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5453a43746aad1262ded5a08d8ebad62f32f26ca22d1dd873320b3ba042345b3",
+ "chksum_sha256": "0e1034a5fcf7fa8646b9b606efd34b709a99b64dcb418bc5d3d4f2ab8edc451a",
"format": 1
},
{
@@ -2013,7 +2020,7 @@
"name": "plugins/lookup/passwordstore.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf39d1661bdd94a94996a594cb00c55adc3bfa44e0041cf9c859f4125442565e",
+ "chksum_sha256": "37381b1f5be5edd85f5d3fd29ab95c05b728b11adb4f236c2face2f3d9f4af53",
"format": 1
},
{
@@ -2090,7 +2097,7 @@
"name": "plugins/module_utils/identity/keycloak/keycloak.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b3f1080b3b46444e8eebd03321d1bba8a599b845b8d8bbc846ae2225ee2a33fe",
+ "chksum_sha256": "05a7911218ce6acf0cdcb2d0f0b251c07aaa6fa10ebbd45fa6bdaa7157ef0376",
"format": 1
},
{
@@ -2346,6 +2353,13 @@
"format": 1
},
{
+ "name": "plugins/module_utils/datetime.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "49ede572b9ee1cd97b75cae58ea5ed573a91978ffc1853e6c1b6be2c78b28075",
+ "format": 1
+ },
+ {
"name": "plugins/module_utils/deps.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2384,7 +2398,7 @@
"name": "plugins/module_utils/gitlab.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "11504e0b1cc93424e0ab0c496737eb412537558268624b36ab7860ca0a89e6ec",
+ "chksum_sha256": "f0edcbd8ae4a68f9c003e48360e3c4247768a801e34580ed035d04f15d6857a4",
"format": 1
},
{
@@ -2426,7 +2440,7 @@
"name": "plugins/module_utils/ipa.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2fbe8b6da9a2d3be12640df88c4ce8907f52706e0175228a8f2e03aacf0f0f60",
+ "chksum_sha256": "e2739a328e34cbfea207e502fb2b1a6e95a6062b5dd64f81cee00b5d7eec8bc3",
"format": 1
},
{
@@ -2552,7 +2566,7 @@
"name": "plugins/module_utils/puppet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3e1957ab2d41bb194a5f100737467e054580c8e48b4997757c484b99fc02ab27",
+ "chksum_sha256": "d0c7e2106d6247342b11f2de422240b828a122acd98d9c4ffe5b91899b8893ff",
"format": 1
},
{
@@ -2573,7 +2587,7 @@
"name": "plugins/module_utils/redfish_utils.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc9400ba787e5570d9344c685596e7c3e04013ce32215c3874d168f2af57d980",
+ "chksum_sha256": "ce4679e15df51fc1a102f5f6f8ef1cb8f8153cfb5a896786c5531829d76ce0e2",
"format": 1
},
{
@@ -2608,7 +2622,7 @@
"name": "plugins/module_utils/scaleway.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf3a6babbac970f45b6c9473704684b0980330f7e8cfc71e45513e9fa22aea35",
+ "chksum_sha256": "5a86772778ddfbaca5cc50138f33ac5ed259da4f365925d1f7032b3f0d65beff",
"format": 1
},
{
@@ -2713,7 +2727,7 @@
"name": "plugins/modules/aix_filesystem.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "76c6c1b52220f8808fd8c2c4a06a9a0e9be8cff0f8abc5336cdc49a5d9ae52f3",
+ "chksum_sha256": "e8e4d96b11af1dcdcf0cdd5ff1eee2efec0619ee6639563fa93b9dd3e0046647",
"format": 1
},
{
@@ -2804,7 +2818,7 @@
"name": "plugins/modules/apt_rpm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0b60fc7bf785127673dd9eac1396da1d3cb759efe84e9f30b98530b82e5980c9",
+ "chksum_sha256": "f0570e79b53c66ebfb69e175ff0edb87f3ea9c10ce4efc791ed0720644459350",
"format": 1
},
{
@@ -3056,14 +3070,14 @@
"name": "plugins/modules/cobbler_sync.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "69bc8b3cd61a7d22073eaa6944e645ffd8133c7ed858b5cd130fc343d074b5ea",
+ "chksum_sha256": "8f888f082b8266fbe3eb76212b06fdcb8d3e95cadccb1cd2a6d7e4138a5e0293",
"format": 1
},
{
"name": "plugins/modules/cobbler_system.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de819b4c8494a9aa92e04609c29027c3357fc682aa4903f4fc3569289b088b02",
+ "chksum_sha256": "0e12cad44f5adf1f3c33242bce11e90b6b94f63159f83df3352dbbaee775fb53",
"format": 1
},
{
@@ -3336,14 +3350,14 @@
"name": "plugins/modules/filesystem.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c68cc92970f2e756d3f153b6724d53413819f13bd87967fba8c723779f0fbf5",
+ "chksum_sha256": "ba0eb413952ad67723b8d06b82adfe05ee7fe63274d0b78bbb1df246a272df0f",
"format": 1
},
{
"name": "plugins/modules/flatpak.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6a1ff04ef312b0acec7ec57c654bc462201dfd026f73bab41dd585ad726d00f4",
+ "chksum_sha256": "083768938533021fb5ad0e92ea8b7a1cf859c68a365b0d21c16df6c53905f728",
"format": 1
},
{
@@ -3427,7 +3441,7 @@
"name": "plugins/modules/github_key.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "79de6029d98cea3b3b2c2591e8c59168de2cc3395ef397c58b89dac9fc0df6a2",
+ "chksum_sha256": "5981c162d708eaca4be13a165ae2cd89492a5a2f1d50df1e87963ed0781a0cc6",
"format": 1
},
{
@@ -3518,14 +3532,14 @@
"name": "plugins/modules/gitlab_issue.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c862d68cc3e2201f3bc3af96f67bf17a3780786c7f76e59544a3386a88c5c468",
+ "chksum_sha256": "0c60e0a22b6e72cc1983ac526ddb856e314e2abe24b4007e278d8e242bef39b8",
"format": 1
},
{
"name": "plugins/modules/gitlab_label.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "25fff68c8d2541d8ef914428987a9a8141d66938694fa56693fc1309215361c3",
+ "chksum_sha256": "85d923d3db2f0381470a430df78c8bb3edeb91f20e70108904b800cae04f9bce",
"format": 1
},
{
@@ -3539,7 +3553,7 @@
"name": "plugins/modules/gitlab_milestone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c6d14ab0a6c17a49e557946de3fbf80aa7dd07d9345a9aab2b1a11769978f80",
+ "chksum_sha256": "4d869613511d223e21b3173aa16b7131cb4058badd6645bc553832f5a2e9355c",
"format": 1
},
{
@@ -3616,7 +3630,7 @@
"name": "plugins/modules/haproxy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "816d15aa1df4f09211a1e2e194609db779f32a9c1ae7f12c37fc52895c0e1a1a",
+ "chksum_sha256": "3c574e4b671db22e9176bbfe1a772e7de68dacb3f67d555f521fdfe5c48473bf",
"format": 1
},
{
@@ -3889,7 +3903,7 @@
"name": "plugins/modules/imc_rest.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b212b98cbc6821f9f079ad0d28596d375f1da710bc9d8110bc6a6f754a77ede",
+ "chksum_sha256": "eb18b5c19057c4aed0548b9cbf0277fd4b666d5aab2638ca03ca1488a542a967",
"format": 1
},
{
@@ -3945,7 +3959,7 @@
"name": "plugins/modules/ini_file.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "37638878ed3b6e5c2860382a8b2940eb20906b12da727c67c4c1e04f38e68255",
+ "chksum_sha256": "c1fbd2a5aa3de2746f9b894b312e7c27542c98dd3cd8cbb7fd5ed22a4c92d56f",
"format": 1
},
{
@@ -4183,7 +4197,7 @@
"name": "plugins/modules/java_cert.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f325def87c1b6ab8e1e1acf9829b9e0f7b22c773a35e5a9eee2116f1b4f37d9b",
+ "chksum_sha256": "dc5ddeb9830187191cf78572ee079e8abf7ca8dda7a0d34a710d3c4079db6730",
"format": 1
},
{
@@ -4309,7 +4323,7 @@
"name": "plugins/modules/keycloak_client.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1c5ee5cfeaaa3ea1653e2a3a43c642e95d6e837269a8f5bb967ae9f74e26139",
+ "chksum_sha256": "9065934124dc12b01077cd9c2caea2640c2f76a5d00541af2a1b1500cbbcba57",
"format": 1
},
{
@@ -4320,10 +4334,17 @@
"format": 1
},
{
+ "name": "plugins/modules/keycloak_client_rolescope.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "24ddf67b981ad224debe4cc8eff03a9afb8924e9e3ab8da474569e4cb73889f1",
+ "format": 1
+ },
+ {
"name": "plugins/modules/keycloak_clientscope.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "944a9d01857144ae760d704e124b4dd3da31121358efd17058bf4024e3e111d5",
+ "chksum_sha256": "c712e8e6d6b9d27297f7fbed371d7338aea6c92c6fc940fea1cf9e8c4b897c71",
"format": 1
},
{
@@ -4351,7 +4372,7 @@
"name": "plugins/modules/keycloak_clienttemplate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "51ae2bb14c80773bc7dbfe159a9fda0337609ebea371904f0ac75010ce64e689",
+ "chksum_sha256": "84508ab4b96dbb81f9fa4cd94c4babb45ad01065a434a62d96d9dca7518d1609",
"format": 1
},
{
@@ -4379,7 +4400,7 @@
"name": "plugins/modules/keycloak_realm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ded26fe5a5bd4422a8f91c31a266d502c23653087128af2753347601d4178391",
+ "chksum_sha256": "9ec1ddefe1b7badaf842680f2799f343c6e4d1c7cb8aec769a002e7383b14e6f",
"format": 1
},
{
@@ -4610,7 +4631,7 @@
"name": "plugins/modules/lxd_container.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "232e7553c192bd73a35bd0689e9d47a6eb29ca60690d4da6e763cf81dc079ee9",
+ "chksum_sha256": "3421f907d434f83dd6a346507a607c5ad7cc0b727673b74badf5003841974b4d",
"format": 1
},
{
@@ -4876,7 +4897,7 @@
"name": "plugins/modules/nmcli.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04fef80fc4f380de8caa7d9b81a40b1ad6e224b9a34b7d384d82f0982ab0dad6",
+ "chksum_sha256": "963b12d10e1bd6f4ec0bdc01aa6527074381b6f6ba7ab57fe0aa8307f324b033",
"format": 1
},
{
@@ -5212,7 +5233,7 @@
"name": "plugins/modules/osx_defaults.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "25083c7e2f8c702fd3c2739fe6527c69f3976e9bcef0263c3f8bdfd4a28746a0",
+ "chksum_sha256": "bc7858ccd08df77b492c2c54c38dc67b75706abda671e7bc619d9933cf1ccd8e",
"format": 1
},
{
@@ -5303,7 +5324,7 @@
"name": "plugins/modules/pagerduty.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6da5163291f420d74945b2723ed5bf0acf0e43f9280793c17554143bbef6cb75",
+ "chksum_sha256": "515d603cd19dcd4d102ab907148930c08383906eede2029c5e8605642518c709",
"format": 1
},
{
@@ -5317,7 +5338,7 @@
"name": "plugins/modules/pagerduty_change.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13f3a20302ece4ae73d94292180ea986b8d24cf05c5c5c587481dd3fc55cdd2c",
+ "chksum_sha256": "26d9bd41d8fd2c404b93fd60812e0f0c5e9776afa1d5387e0b4fe03a581cf3fd",
"format": 1
},
{
@@ -5443,7 +5464,7 @@
"name": "plugins/modules/portage.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "70474d22e85a3d8d191e870dce4ef4c4e0804ded42e6cb258454a313ef2f4155",
+ "chksum_sha256": "5c207e389af0f727d74e2402c099eaafe29afba44e9bd1fd91da053714fa38e3",
"format": 1
},
{
@@ -5646,7 +5667,7 @@
"name": "plugins/modules/puppet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "853adf09fa19769befaa28faf6c986ecfe5d85890a4db71fa0a0e64f08f9ec42",
+ "chksum_sha256": "2e8fa36104ad52a85bcbfffadfe873b1dadf91eb5e9f5e1fe843e712ec972708",
"format": 1
},
{
@@ -5863,7 +5884,7 @@
"name": "plugins/modules/redfish_command.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e6875f2566585e7029e4d21f8f0dab3532c2032e95d907a248c71a4c15159f74",
+ "chksum_sha256": "38a449fe1a3ce5e62028e851bece4137f2f919f2ab6869f0fc23dc09dfd735f2",
"format": 1
},
{
@@ -5961,7 +5982,7 @@
"name": "plugins/modules/riak.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c657448de8067ae71413bf74587e2df9dedbd923b9f13ba97bc977b14b2632ed",
+ "chksum_sha256": "8011c6e8cd40eedbbeb157ad8cf9f069a98d59fd91cefb570dddc1f48af2ac2f",
"format": 1
},
{
@@ -6031,7 +6052,7 @@
"name": "plugins/modules/scaleway_compute.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "325e4bdbe81c4c280e847a290cd5b972d37ce11bb9cef0e25b152e17f4284f67",
+ "chksum_sha256": "cace7cc6514792ce6a84aa709fabcbc15989d722df346c60827863c6741f845d",
"format": 1
},
{
@@ -6087,7 +6108,7 @@
"name": "plugins/modules/scaleway_database_backup.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c4f6d4e9fffcf2964debd7d40703841b7c841bd4f3335155698b548ab7f42ad1",
+ "chksum_sha256": "04512a57c17deadde4b7e2eb233185d8dad896b0d75348e40f6185f2b64ef6ca",
"format": 1
},
{
@@ -6143,7 +6164,7 @@
"name": "plugins/modules/scaleway_lb.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c405f1d1f0e8763657353c861b5d99dbb7468c355f4723abbdba3ebdccbe33ac",
+ "chksum_sha256": "541e2627c7a3d18554053f9da1002b73f3d33baf61d6d381c54080f8e64752ed",
"format": 1
},
{
@@ -6409,7 +6430,7 @@
"name": "plugins/modules/ssh_config.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "233e53db7d3b7cdd61178d3c7b5fccb2ca8e8afff7bd3113ee116e72b7b3ecd2",
+ "chksum_sha256": "ec6d57292e4a58ac53f919a274a66667d570e9143016d4b6a273e2b148059ccc",
"format": 1
},
{
@@ -6437,7 +6458,7 @@
"name": "plugins/modules/statusio_maintenance.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "afd8833c6c9896e742a7492aca76799e42d2a2a819efc511caade8a2d2091746",
+ "chksum_sha256": "7b1a8122e644afafe445900e99f5a6452133fa927e3b18e5b56f19ea3d56634b",
"format": 1
},
{
@@ -6899,7 +6920,7 @@
"name": "plugins/modules/xml.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "801820433ca4c1410b22055ae52a7ab438787a232462e0d8125d43b180edd870",
+ "chksum_sha256": "a25e92ac7a5d3b78282387f8f00d08fd55b29afb4f8e6b886b86309d68f81a8e",
"format": 1
},
{
@@ -6966,6 +6987,20 @@
"format": 1
},
{
+ "name": "plugins/plugin_utils",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "plugins/plugin_utils/unsafe.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "93ccc2e18634405c7ff21a91a1df4f17261ac24b0f41bf3c46dbec2f254538c3",
+ "format": 1
+ },
+ {
"name": "plugins/test",
"ftype": "dir",
"chksum_type": null,
@@ -8950,7 +8985,7 @@
"name": "tests/integration/targets/filesystem/defaults/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "08185326e7b809ec8248cc5bf8276368f27b14a8cb0131cc2ae95676871ff8cc",
+ "chksum_sha256": "18cbba57e5defc719b0fe8a22a5de6bd5cc5d13ebb813adfd94379ba02e22f50",
"format": 1
},
{
@@ -8999,7 +9034,7 @@
"name": "tests/integration/targets/filesystem/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6a587d4489a54a86e204cbef30a808fe543fef4be6e9e9f475b22287fd2d4f58",
+ "chksum_sha256": "57a0f04cc772d3e0b3c958b070d15fce52c780c6caeeb908b0485406de97fa74",
"format": 1
},
{
@@ -9041,7 +9076,7 @@
"name": "tests/integration/targets/filesystem/tasks/setup.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "abcc4f8bf8d6df58581ff4f19e47a6afed3bcd456a7f04a66687069389c6d8a3",
+ "chksum_sha256": "4fb6cd4374447a8e54ea9b6cc924806b6e91cb2fdbacde34616e6c4c4113d93d",
"format": 1
},
{
@@ -9216,7 +9251,7 @@
"name": "tests/integration/targets/filter_from_ini/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a07f8a902771d4130fb6735fb0acff4a9f8aead0f123cb43a539406e54184a59",
+ "chksum_sha256": "1b8aaecd2d2f86721c17c2981cf6ab0170d1df72540f8dda076973e8fc8999ff",
"format": 1
},
{
@@ -9643,7 +9678,7 @@
"name": "tests/integration/targets/filter_to_ini/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7e22a177f1018cb3fb7d33f211b3d67febfdf94c4ad3a473a5b4d94ce608e696",
+ "chksum_sha256": "64a9ad21479d050a38d966ace64d5d43574d3dbd065cff2a02655c5eff398e65",
"format": 1
},
{
@@ -9776,7 +9811,7 @@
"name": "tests/integration/targets/flatpak/tasks/check_mode.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "daec12df262fbf5c01327d4ce20cb2c2c92670d222ba6164ea2b205c1e1b6166",
+ "chksum_sha256": "70231a939f8cd69e757fb8b5cc1e1ccf92b9a8b98359945d3ae8386a05c52152",
"format": 1
},
{
@@ -9797,7 +9832,7 @@
"name": "tests/integration/targets/flatpak/tasks/test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "07cb037e4f5c2d08971d4af2b80d2cd6a03de40e4b41ff02779e84d002131fcd",
+ "chksum_sha256": "2f212b96c1d3bf7577b2d8b1cde180aac1e99f541c4d01090fbd36d43678df1d",
"format": 1
},
{
@@ -11957,10 +11992,17 @@
"format": 1
},
{
+ "name": "tests/integration/targets/ini_file/tasks/tests/08-section.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1eb82965442fa3fe06af0bdad8e66cf7d86e182b1d3b42ce613d116aec5b2df1",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/ini_file/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3747adf416c4b3fa837c686860ec828985edd6a3b7e0c5993dd9da892085e7d6",
+ "chksum_sha256": "4e85805c4a6a145f06ef0b95dfd764becb92080deffd0be4ae5a8315ef99a60c",
"format": 1
},
{
@@ -13140,6 +13182,55 @@
"format": 1
},
{
+ "name": "tests/integration/targets/keycloak_client_rolescope",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/keycloak_client_rolescope/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/keycloak_client_rolescope/tasks/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "91f554dc3a0d7573b135d56866e499e09265fb5f3a2e7ccafe293c427f251634",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/keycloak_client_rolescope/vars",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/keycloak_client_rolescope/vars/main.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "69645aad3b700fb61a727383e30d7e8bbaf0a56a36e60d9013508e5b4a1d0698",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/keycloak_client_rolescope/README.md",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f643953e308b8c565cfa4514f126995c37225d1dd9b7dc6b72f1cb00de90c3aa",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/keycloak_client_rolescope/aliases",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "efa136c759c51db61ae085d265a6d6402c567e9bb00875292d45dbb00c1ed892",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/keycloak_clientscope_type",
"ftype": "dir",
"chksum_type": null,
@@ -14543,7 +14634,7 @@
"name": "tests/integration/targets/lookup_lmdb_kv/test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1cedf373477c36de601ffdc2d8335d4536fa1d4927376c149a1c7c2a3fe46109",
+ "chksum_sha256": "f5a7ee1f47774aa767f2184faad85470c6ebe98b40b1db202f5f1acbdc72e2ea",
"format": 1
},
{
@@ -22408,6 +22499,20 @@
"format": 1
},
{
+ "name": "tests/sanity/ignore-2.18.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4aa6d180dd919a19b80a38b282923231f636556e4bf343b2cf36527d999b2124",
+ "format": 1
+ },
+ {
+ "name": "tests/sanity/ignore-2.18.txt.license",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1",
+ "format": 1
+ },
+ {
"name": "tests/unit",
"ftype": "dir",
"chksum_type": null,
@@ -22600,7 +22705,7 @@
"name": "tests/unit/plugins/callback/test_loganalytics.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "45af49a11f9253655c2ae1b0ddde646ec20f4fbce8a5e8bddf468c4bb438a70c",
+ "chksum_sha256": "558bb03fa8ba17c60eb1afb30bb224f4b1b4c8db47a0f078a779304e3fdff713",
"format": 1
},
{
@@ -22614,7 +22719,7 @@
"name": "tests/unit/plugins/callback/test_splunk.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "561373bea8138ef0cc8901b4d9ce1f80ff841f3cec112a4449b89ecc49a235fd",
+ "chksum_sha256": "e0acc6f91db31e76594b6ec362752373167d4417033053ccf6fa6671616dc483",
"format": 1
},
{
@@ -22887,7 +22992,7 @@
"name": "tests/unit/plugins/lookup/test_bitwarden.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc4558d979772df76cea11362731e59a669327b817f91be20e43f5619d1a1a22",
+ "chksum_sha256": "3acd0fbfd344baa81cbc868642f74e3c276164877c83cb073064459c9f873fdc",
"format": 1
},
{
@@ -27640,7 +27745,7 @@
"name": "CHANGELOG.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8ac8a8d20d770c47d3d6d743711f948dc353bab92ee076a1a915ea8fbb939110",
+ "chksum_sha256": "aa9310c1dd52b555a85d449e50a3ba1bc9de9e5a3474c66e156488463be1cc36",
"format": 1
},
{
@@ -27654,7 +27759,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1754aca18ee20d425f062cab756afaf70000861eb78cd1c885e2387048c87d56",
+ "chksum_sha256": "7192b128389810ee514466d24b34c430fd3e044eafc1db4c3b092a3a630d9985",
"format": 1
},
{
@@ -27682,7 +27787,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "af93da2f8ac939f7b71c6ed23caeb602a0601924282f8de07616270113c99e16",
+ "chksum_sha256": "980347a93d90e0b8f8507f59be3be73f0f3026521be645861f2b30880c7ee9fe",
"format": 1
},
{
diff --git a/ansible_collections/community/general/MANIFEST.json b/ansible_collections/community/general/MANIFEST.json
index 715cd85ea..4d700a4c7 100644
--- a/ansible_collections/community/general/MANIFEST.json
+++ b/ansible_collections/community/general/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "general",
- "version": "8.5.0",
+ "version": "8.6.0",
"authors": [
"Ansible (https://github.com/ansible)"
],
@@ -23,7 +23,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a5ae0318b05662e01298f7e11a607b9d674196586dfa5665caccb08b58fc5f69",
+ "chksum_sha256": "42be361f601f0df607b62621323c3fb70f485cd57cd2d7eecca85d6590836b01",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/general/README.md b/ansible_collections/community/general/README.md
index a63ae3201..162cc06b0 100644
--- a/ansible_collections/community/general/README.md
+++ b/ansible_collections/community/general/README.md
@@ -24,7 +24,7 @@ If you encounter abusive behavior violating the [Ansible Code of Conduct](https:
## Tested with Ansible
-Tested with the current ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16 releases and the current development version of ansible-core. Ansible-core versions before 2.13.0 are not supported. This includes all ansible-base 2.10 and Ansible 2.9 releases.
+Tested with the current ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, ansible-core 2.17 releases and the current development version of ansible-core. Ansible-core versions before 2.13.0 are not supported. This includes all ansible-base 2.10 and Ansible 2.9 releases.
## External requirements
diff --git a/ansible_collections/community/general/changelogs/changelog.yaml b/ansible_collections/community/general/changelogs/changelog.yaml
index 411df6ed2..b45d41276 100644
--- a/ansible_collections/community/general/changelogs/changelog.yaml
+++ b/ansible_collections/community/general/changelogs/changelog.yaml
@@ -1320,3 +1320,115 @@ releases:
name: usb_facts
namespace: ''
release_date: '2024-03-25'
+ 8.6.0:
+ changes:
+ bugfixes:
+ - aix_filesystem - fix ``_validate_vg`` not passing VG name to ``lsvg_cmd``
+ (https://github.com/ansible-collections/community.general/issues/8151).
+ - apt_rpm - when checking whether packages were installed after running ``apt-get
+ -y install <packages>``, only the last package name was checked (https://github.com/ansible-collections/community.general/pull/8263).
+ - bitwarden_secrets_manager lookup plugin - implements retry with exponential
+ backoff to avoid lookup errors when Bitwardn's API rate limiting is encountered
+ (https://github.com/ansible-collections/community.general/issues/8230, https://github.com/ansible-collections/community.general/pull/8238).
+ - from_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow
+ converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183,
+ https://github.com/ansible-collections/community.general/pull/8185).
+ - gitlab_issue, gitlab_label, gitlab_milestone - avoid crash during version
+ comparison when the python-gitlab Python module is not installed (https://github.com/ansible-collections/community.general/pull/8158).
+ - haproxy - fix an issue where HAProxy could get stuck in DRAIN mode when the
+ backend was unreachable (https://github.com/ansible-collections/community.general/issues/8092).
+ - inventory plugins - add unsafe wrapper to avoid marking strings that do not
+ contain ``{`` or ``}`` as unsafe, to work around a bug in AWX ((https://github.com/ansible-collections/community.general/issues/8212,
+ https://github.com/ansible-collections/community.general/pull/8225).
+ - ipa - fix get version regex in IPA module_utils (https://github.com/ansible-collections/community.general/pull/8175).
+ - keycloak_client - add sorted ``defaultClientScopes`` and ``optionalClientScopes``
+ to normalizations (https://github.com/ansible-collections/community.general/pull/8223).
+ - keycloak_realm - add normalizations for ``enabledEventTypes`` and ``supportedLocales``
+ (https://github.com/ansible-collections/community.general/pull/8224).
+ - puppet - add option ``environment_lang`` to set the environment language encoding.
+ Defaults to lang ``C``. It is recommended to set it to ``C.UTF-8`` or ``en_US.UTF-8``
+ depending on what is available on your system. (https://github.com/ansible-collections/community.general/issues/8000)
+ - riak - support ``riak admin`` sub-command in newer Riak KV versions beside
+ the legacy ``riak-admin`` main command (https://github.com/ansible-collections/community.general/pull/8211).
+ - to_ini filter plugin - disabling interpolation of ``ConfigParser`` to allow
+ converting values with a ``%`` sign (https://github.com/ansible-collections/community.general/issues/8183,
+ https://github.com/ansible-collections/community.general/pull/8185).
+ - xml - make module work with lxml 5.1.1, which removed some internals that
+ the module was relying on (https://github.com/ansible-collections/community.general/pull/8169).
+ deprecated_features:
+ - hipchat callback plugin - the hipchat service has been discontinued and the
+ self-hosted variant has been End of Life since 2020. The callback plugin is
+ therefore deprecated and will be removed from community.general 10.0.0 if
+ nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184,
+ https://github.com/ansible-collections/community.general/pull/8189).
+ minor_changes:
+ - Use offset-aware ``datetime.datetime`` objects (with timezone UTC) instead
+ of offset-naive UTC timestamps, which are deprecated in Python 3.12 (https://github.com/ansible-collections/community.general/pull/8222).
+ - 'apt_rpm - add new states ``latest`` and ``present_not_latest``. The value
+ ``latest`` is equivalent to the current behavior of ``present``, which will
+ upgrade a package if a newer version exists. ``present_not_latest`` does what
+ most users would expect ``present`` to do: it does not upgrade if the package
+ is already installed. The current behavior of ``present`` will be deprecated
+ in a later version, and eventually changed to that of ``present_not_latest``
+ (https://github.com/ansible-collections/community.general/issues/8217, https://github.com/ansible-collections/community.general/pull/8247).'
+ - bitwarden lookup plugin - add support to filter by organization ID (https://github.com/ansible-collections/community.general/pull/8188).
+ - filesystem - add bcachefs support (https://github.com/ansible-collections/community.general/pull/8126).
+ - ini_file - add an optional parameter ``section_has_values``. If the target
+ ini file contains more than one ``section``, use ``section_has_values`` to
+ specify which one should be updated (https://github.com/ansible-collections/community.general/pull/7505).
+ - java_cert - add ``cert_content`` argument (https://github.com/ansible-collections/community.general/pull/8153).
+ - keycloak_client, keycloak_clientscope, keycloak_clienttemplate - added ``docker-v2``
+ protocol support, enhancing alignment with Keycloak's protocol options (https://github.com/ansible-collections/community.general/issues/8215,
+ https://github.com/ansible-collections/community.general/pull/8216).
+ - nmcli - adds OpenvSwitch support with new ``type`` values ``ovs-port``, ``ovs-interface``,
+ and ``ovs-bridge``, and new ``slave_type`` value ``ovs-port`` (https://github.com/ansible-collections/community.general/pull/8154).
+ - osx_defaults - add option ``check_types`` to enable changing the type of existing
+ defaults on the fly (https://github.com/ansible-collections/community.general/pull/8173).
+ - passwordstore lookup - add ``missing_subkey`` parameter defining the behavior
+ of the lookup when a passwordstore subkey is missing (https://github.com/ansible-collections/community.general/pull/8166).
+ - portage - adds the possibility to explicitely tell portage to write packages
+ to world file (https://github.com/ansible-collections/community.general/issues/6226,
+ https://github.com/ansible-collections/community.general/pull/8236).
+ - redfish_command - add command ``ResetToDefaults`` to reset manager to default
+ state (https://github.com/ansible-collections/community.general/issues/8163).
+ - redfish_info - add boolean return value ``MultipartHttpPush`` to ``GetFirmwareUpdateCapabilities``
+ (https://github.com/ansible-collections/community.general/issues/8194, https://github.com/ansible-collections/community.general/pull/8195).
+ - ssh_config - allow ``accept-new`` as valid value for ``strict_host_key_checking``
+ (https://github.com/ansible-collections/community.general/pull/8257).
+ release_summary: Regular bugfix and features release.
+ fragments:
+ - 7505-ini_file-section_has.yml
+ - 8.6.0.yml
+ - 8100-haproxy-drain-fails-on-down-backend.yml
+ - 8126-filesystem-bcachefs-support.yaml
+ - 8151-fix-lsvg_cmd-failed.yml
+ - 8153-java_cert-add-cert_content-arg.yml
+ - 8154-add-ovs-commands-to-nmcli-module.yml
+ - 8158-gitlab-version-check.yml
+ - 8163-redfish-implementing-reset-to-defaults.yml
+ - 8166-password-store-lookup-missing-subkey.yml
+ - 8169-lxml.yml
+ - 8173-osx_defaults-check_type.yml
+ - 8175-get_ipa_version_regex.yml
+ - 8183-from_ini_to_ini.yml
+ - 8188-bitwarden-add-organization_id.yml
+ - 8194-redfish-add-multipart-to-capabilities.yml
+ - 8211-riak-admin-sub-command-support.yml
+ - 8215-add-docker-v2-protocol.yml
+ - 8222-datetime.yml
+ - 8223-keycloak_client-additional-normalizations.yaml
+ - 8224-keycloak_realm-add-normalizations.yaml
+ - 8225-unsafe.yml
+ - 8236-portage-select-feature.yml
+ - 8238-bitwarden-secrets-manager-rate-limit-retry-with-backoff.yml
+ - 8247-apt_rpm-latest.yml
+ - 8257-ssh-config-hostkey-support-accept-new.yaml
+ - 8263-apt_rpm-install-check.yml
+ - hipchat.yml
+ - puppet_lang_force.yml
+ modules:
+ - description: Allows administration of Keycloak client roles scope to restrict
+ the usage of certain roles to a other specific client applications.
+ name: keycloak_client_rolescope
+ namespace: ''
+ release_date: '2024-04-22'
diff --git a/ansible_collections/community/general/docs/docsite/config.yml b/ansible_collections/community/general/docs/docsite/config.yml
new file mode 100644
index 000000000..1d6cf8554
--- /dev/null
+++ b/ansible_collections/community/general/docs/docsite/config.yml
@@ -0,0 +1,7 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+changelog:
+ write_changelog: true
diff --git a/ansible_collections/community/general/meta/runtime.yml b/ansible_collections/community/general/meta/runtime.yml
index 4fe80ca25..a9354aab3 100644
--- a/ansible_collections/community/general/meta/runtime.yml
+++ b/ansible_collections/community/general/meta/runtime.yml
@@ -13,6 +13,28 @@ action_groups:
- consul_session
- consul_token
plugin_routing:
+ callback:
+ actionable:
+ tombstone:
+ removal_version: 2.0.0
+ warning_text: Use the 'default' callback plugin with 'display_skipped_hosts
+ = no' and 'display_ok_hosts = no' options.
+ full_skip:
+ tombstone:
+ removal_version: 2.0.0
+ warning_text: Use the 'default' callback plugin with 'display_skipped_hosts
+ = no' option.
+ hipchat:
+ deprecation:
+ removal_version: 10.0.0
+ warning_text: The hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020.
+ osx_say:
+ redirect: community.general.say
+ stderr:
+ tombstone:
+ removal_version: 2.0.0
+ warning_text: Use the 'default' callback plugin with 'display_failed_stderr
+ = yes' option.
connection:
docker:
redirect: community.docker.docker
@@ -4707,24 +4729,6 @@ plugin_routing:
redirect: dellemc.openmanage.dellemc_idrac
remote_management.dellemc.ome:
redirect: dellemc.openmanage.ome
- callback:
- actionable:
- tombstone:
- removal_version: 2.0.0
- warning_text: Use the 'default' callback plugin with 'display_skipped_hosts
- = no' and 'display_ok_hosts = no' options.
- full_skip:
- tombstone:
- removal_version: 2.0.0
- warning_text: Use the 'default' callback plugin with 'display_skipped_hosts
- = no' option.
- osx_say:
- redirect: community.general.say
- stderr:
- tombstone:
- removal_version: 2.0.0
- warning_text: Use the 'default' callback plugin with 'display_failed_stderr
- = yes' option.
inventory:
docker_machine:
redirect: community.docker.docker_machine
diff --git a/ansible_collections/community/general/plugins/callback/hipchat.py b/ansible_collections/community/general/plugins/callback/hipchat.py
index 3e10b69e7..afd9e2055 100644
--- a/ansible_collections/community/general/plugins/callback/hipchat.py
+++ b/ansible_collections/community/general/plugins/callback/hipchat.py
@@ -18,6 +18,10 @@ DOCUMENTATION = '''
description:
- This callback plugin sends status updates to a HipChat channel during playbook execution.
- Before 2.4 only environment variables were available for configuring this plugin.
+ deprecated:
+ removed_in: 10.0.0
+ why: The hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020.
+ alternative: There is none.
options:
token:
description: HipChat API token for v1 or v2 API.
diff --git a/ansible_collections/community/general/plugins/callback/loganalytics.py b/ansible_collections/community/general/plugins/callback/loganalytics.py
index fbcdc6f89..ed7e47b2e 100644
--- a/ansible_collections/community/general/plugins/callback/loganalytics.py
+++ b/ansible_collections/community/general/plugins/callback/loganalytics.py
@@ -59,13 +59,16 @@ import uuid
import socket
import getpass
-from datetime import datetime
from os.path import basename
from ansible.module_utils.urls import open_url
from ansible.parsing.ajson import AnsibleJSONEncoder
from ansible.plugins.callback import CallbackBase
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
class AzureLogAnalyticsSource(object):
def __init__(self):
@@ -93,7 +96,7 @@ class AzureLogAnalyticsSource(object):
return "https://{0}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01".format(workspace_id)
def __rfc1123date(self):
- return datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
+ return now().strftime('%a, %d %b %Y %H:%M:%S GMT')
def send_event(self, workspace_id, shared_key, state, result, runtime):
if result._task_fields['args'].get('_ansible_check_mode') is True:
@@ -167,7 +170,7 @@ class CallbackModule(CallbackBase):
def _seconds_since_start(self, result):
return (
- datetime.utcnow() -
+ now() -
self.start_datetimes[result._task._uuid]
).total_seconds()
@@ -185,10 +188,10 @@ class CallbackModule(CallbackBase):
self.loganalytics.ansible_playbook = basename(playbook._file_name)
def v2_playbook_on_task_start(self, task, is_conditional):
- self.start_datetimes[task._uuid] = datetime.utcnow()
+ self.start_datetimes[task._uuid] = now()
def v2_playbook_on_handler_task_start(self, task):
- self.start_datetimes[task._uuid] = datetime.utcnow()
+ self.start_datetimes[task._uuid] = now()
def v2_runner_on_ok(self, result, **kwargs):
self.loganalytics.send_event(
diff --git a/ansible_collections/community/general/plugins/callback/logstash.py b/ansible_collections/community/general/plugins/callback/logstash.py
index 144e1f991..f3725e465 100644
--- a/ansible_collections/community/general/plugins/callback/logstash.py
+++ b/ansible_collections/community/general/plugins/callback/logstash.py
@@ -99,7 +99,6 @@ from ansible import context
import socket
import uuid
import logging
-from datetime import datetime
try:
import logstash
@@ -109,6 +108,10 @@ except ImportError:
from ansible.plugins.callback import CallbackBase
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
class CallbackModule(CallbackBase):
@@ -126,7 +129,7 @@ class CallbackModule(CallbackBase):
"pip install python-logstash for Python 2"
"pip install python3-logstash for Python 3")
- self.start_time = datetime.utcnow()
+ self.start_time = now()
def _init_plugin(self):
if not self.disabled:
@@ -185,7 +188,7 @@ class CallbackModule(CallbackBase):
self.logger.info("ansible start", extra=data)
def v2_playbook_on_stats(self, stats):
- end_time = datetime.utcnow()
+ end_time = now()
runtime = end_time - self.start_time
summarize_stat = {}
for host in stats.processed.keys():
diff --git a/ansible_collections/community/general/plugins/callback/splunk.py b/ansible_collections/community/general/plugins/callback/splunk.py
index d15547f44..a3e401bc2 100644
--- a/ansible_collections/community/general/plugins/callback/splunk.py
+++ b/ansible_collections/community/general/plugins/callback/splunk.py
@@ -88,13 +88,16 @@ import uuid
import socket
import getpass
-from datetime import datetime
from os.path import basename
from ansible.module_utils.urls import open_url
from ansible.parsing.ajson import AnsibleJSONEncoder
from ansible.plugins.callback import CallbackBase
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
class SplunkHTTPCollectorSource(object):
def __init__(self):
@@ -134,7 +137,7 @@ class SplunkHTTPCollectorSource(object):
else:
time_format = '%Y-%m-%d %H:%M:%S +0000'
- data['timestamp'] = datetime.utcnow().strftime(time_format)
+ data['timestamp'] = now().strftime(time_format)
data['host'] = self.host
data['ip_address'] = self.ip_address
data['user'] = self.user
@@ -181,7 +184,7 @@ class CallbackModule(CallbackBase):
def _runtime(self, result):
return (
- datetime.utcnow() -
+ now() -
self.start_datetimes[result._task._uuid]
).total_seconds()
@@ -220,10 +223,10 @@ class CallbackModule(CallbackBase):
self.splunk.ansible_playbook = basename(playbook._file_name)
def v2_playbook_on_task_start(self, task, is_conditional):
- self.start_datetimes[task._uuid] = datetime.utcnow()
+ self.start_datetimes[task._uuid] = now()
def v2_playbook_on_handler_task_start(self, task):
- self.start_datetimes[task._uuid] = datetime.utcnow()
+ self.start_datetimes[task._uuid] = now()
def v2_runner_on_ok(self, result, **kwargs):
self.splunk.send_event(
diff --git a/ansible_collections/community/general/plugins/callback/sumologic.py b/ansible_collections/community/general/plugins/callback/sumologic.py
index 46ab3f0f7..0304b9de5 100644
--- a/ansible_collections/community/general/plugins/callback/sumologic.py
+++ b/ansible_collections/community/general/plugins/callback/sumologic.py
@@ -46,13 +46,16 @@ import uuid
import socket
import getpass
-from datetime import datetime
from os.path import basename
from ansible.module_utils.urls import open_url
from ansible.parsing.ajson import AnsibleJSONEncoder
from ansible.plugins.callback import CallbackBase
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
class SumologicHTTPCollectorSource(object):
def __init__(self):
@@ -84,8 +87,7 @@ class SumologicHTTPCollectorSource(object):
data['uuid'] = result._task._uuid
data['session'] = self.session
data['status'] = state
- data['timestamp'] = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S '
- '+0000')
+ data['timestamp'] = now().strftime('%Y-%m-%d %H:%M:%S +0000')
data['host'] = self.host
data['ip_address'] = self.ip_address
data['user'] = self.user
@@ -123,7 +125,7 @@ class CallbackModule(CallbackBase):
def _runtime(self, result):
return (
- datetime.utcnow() -
+ now() -
self.start_datetimes[result._task._uuid]
).total_seconds()
@@ -144,10 +146,10 @@ class CallbackModule(CallbackBase):
self.sumologic.ansible_playbook = basename(playbook._file_name)
def v2_playbook_on_task_start(self, task, is_conditional):
- self.start_datetimes[task._uuid] = datetime.utcnow()
+ self.start_datetimes[task._uuid] = now()
def v2_playbook_on_handler_task_start(self, task):
- self.start_datetimes[task._uuid] = datetime.utcnow()
+ self.start_datetimes[task._uuid] = now()
def v2_runner_on_ok(self, result, **kwargs):
self.sumologic.send_event(
diff --git a/ansible_collections/community/general/plugins/filter/from_ini.py b/ansible_collections/community/general/plugins/filter/from_ini.py
index d68b51092..6fe83875e 100644
--- a/ansible_collections/community/general/plugins/filter/from_ini.py
+++ b/ansible_collections/community/general/plugins/filter/from_ini.py
@@ -57,7 +57,7 @@ class IniParser(ConfigParser):
''' Implements a configparser which is able to return a dict '''
def __init__(self):
- super().__init__()
+ super().__init__(interpolation=None)
self.optionxform = str
def as_dict(self):
diff --git a/ansible_collections/community/general/plugins/filter/to_ini.py b/ansible_collections/community/general/plugins/filter/to_ini.py
index 22ef16d72..bdf2dde27 100644
--- a/ansible_collections/community/general/plugins/filter/to_ini.py
+++ b/ansible_collections/community/general/plugins/filter/to_ini.py
@@ -63,7 +63,7 @@ class IniParser(ConfigParser):
''' Implements a configparser which sets the correct optionxform '''
def __init__(self):
- super().__init__()
+ super().__init__(interpolation=None)
self.optionxform = str
diff --git a/ansible_collections/community/general/plugins/inventory/cobbler.py b/ansible_collections/community/general/plugins/inventory/cobbler.py
index 8ca36f426..cdef9944a 100644
--- a/ansible_collections/community/general/plugins/inventory/cobbler.py
+++ b/ansible_collections/community/general/plugins/inventory/cobbler.py
@@ -117,7 +117,8 @@ from ansible.errors import AnsibleError
from ansible.module_utils.common.text.converters import to_text
from ansible.plugins.inventory import BaseInventoryPlugin, Cacheable, to_safe_group_name
from ansible.module_utils.six import text_type
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
# xmlrpc
try:
diff --git a/ansible_collections/community/general/plugins/inventory/gitlab_runners.py b/ansible_collections/community/general/plugins/inventory/gitlab_runners.py
index 536f4bb1b..bd29e8d31 100644
--- a/ansible_collections/community/general/plugins/inventory/gitlab_runners.py
+++ b/ansible_collections/community/general/plugins/inventory/gitlab_runners.py
@@ -83,7 +83,8 @@ keyed_groups:
from ansible.errors import AnsibleError, AnsibleParserError
from ansible.module_utils.common.text.converters import to_native
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
try:
import gitlab
diff --git a/ansible_collections/community/general/plugins/inventory/icinga2.py b/ansible_collections/community/general/plugins/inventory/icinga2.py
index 6746bb8e0..d1f2bc617 100644
--- a/ansible_collections/community/general/plugins/inventory/icinga2.py
+++ b/ansible_collections/community/general/plugins/inventory/icinga2.py
@@ -102,7 +102,8 @@ from ansible.errors import AnsibleParserError
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
from ansible.module_utils.urls import open_url
from ansible.module_utils.six.moves.urllib.error import HTTPError
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
class InventoryModule(BaseInventoryPlugin, Constructable):
diff --git a/ansible_collections/community/general/plugins/inventory/linode.py b/ansible_collections/community/general/plugins/inventory/linode.py
index fc79f12c5..e161e086e 100644
--- a/ansible_collections/community/general/plugins/inventory/linode.py
+++ b/ansible_collections/community/general/plugins/inventory/linode.py
@@ -122,7 +122,8 @@ compose:
from ansible.errors import AnsibleError
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
try:
diff --git a/ansible_collections/community/general/plugins/inventory/lxd.py b/ansible_collections/community/general/plugins/inventory/lxd.py
index c803f47dd..cf64f4ee8 100644
--- a/ansible_collections/community/general/plugins/inventory/lxd.py
+++ b/ansible_collections/community/general/plugins/inventory/lxd.py
@@ -175,7 +175,7 @@ from ansible.module_utils.six import raise_from
from ansible.errors import AnsibleError, AnsibleParserError
from ansible.module_utils.six.moves.urllib.parse import urlencode
from ansible_collections.community.general.plugins.module_utils.lxd import LXDClient, LXDClientException
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
try:
import ipaddress
diff --git a/ansible_collections/community/general/plugins/inventory/nmap.py b/ansible_collections/community/general/plugins/inventory/nmap.py
index 3a28007a3..2ca474a1f 100644
--- a/ansible_collections/community/general/plugins/inventory/nmap.py
+++ b/ansible_collections/community/general/plugins/inventory/nmap.py
@@ -126,7 +126,8 @@ from ansible.errors import AnsibleParserError
from ansible.module_utils.common.text.converters import to_native, to_text
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
from ansible.module_utils.common.process import get_bin_path
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
diff --git a/ansible_collections/community/general/plugins/inventory/online.py b/ansible_collections/community/general/plugins/inventory/online.py
index b3a9ecd37..9355d9d41 100644
--- a/ansible_collections/community/general/plugins/inventory/online.py
+++ b/ansible_collections/community/general/plugins/inventory/online.py
@@ -68,7 +68,8 @@ from ansible.plugins.inventory import BaseInventoryPlugin
from ansible.module_utils.common.text.converters import to_text
from ansible.module_utils.ansible_release import __version__ as ansible_version
from ansible.module_utils.six.moves.urllib.parse import urljoin
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
class InventoryModule(BaseInventoryPlugin):
diff --git a/ansible_collections/community/general/plugins/inventory/opennebula.py b/ansible_collections/community/general/plugins/inventory/opennebula.py
index 3babfa232..b097307c3 100644
--- a/ansible_collections/community/general/plugins/inventory/opennebula.py
+++ b/ansible_collections/community/general/plugins/inventory/opennebula.py
@@ -97,7 +97,8 @@ except ImportError:
from ansible.errors import AnsibleError
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
from ansible.module_utils.common.text.converters import to_native
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
from collections import namedtuple
import os
diff --git a/ansible_collections/community/general/plugins/inventory/proxmox.py b/ansible_collections/community/general/plugins/inventory/proxmox.py
index ed55ef1b6..774833c48 100644
--- a/ansible_collections/community/general/plugins/inventory/proxmox.py
+++ b/ansible_collections/community/general/plugins/inventory/proxmox.py
@@ -226,9 +226,9 @@ from ansible.module_utils.common.text.converters import to_native
from ansible.module_utils.six import string_types
from ansible.module_utils.six.moves.urllib.parse import urlencode
from ansible.utils.display import Display
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
# 3rd party imports
try:
diff --git a/ansible_collections/community/general/plugins/inventory/scaleway.py b/ansible_collections/community/general/plugins/inventory/scaleway.py
index 601129f56..dc24a17da 100644
--- a/ansible_collections/community/general/plugins/inventory/scaleway.py
+++ b/ansible_collections/community/general/plugins/inventory/scaleway.py
@@ -121,10 +121,10 @@ else:
from ansible.errors import AnsibleError
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
from ansible_collections.community.general.plugins.module_utils.scaleway import SCALEWAY_LOCATION, parse_pagination_link
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
from ansible.module_utils.urls import open_url
from ansible.module_utils.common.text.converters import to_native, to_text
from ansible.module_utils.six import raise_from
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
import ansible.module_utils.six.moves.urllib.parse as urllib_parse
diff --git a/ansible_collections/community/general/plugins/inventory/stackpath_compute.py b/ansible_collections/community/general/plugins/inventory/stackpath_compute.py
index 9a556d39e..6b48a49f1 100644
--- a/ansible_collections/community/general/plugins/inventory/stackpath_compute.py
+++ b/ansible_collections/community/general/plugins/inventory/stackpath_compute.py
@@ -72,7 +72,8 @@ from ansible.plugins.inventory import (
Cacheable
)
from ansible.utils.display import Display
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
display = Display()
diff --git a/ansible_collections/community/general/plugins/inventory/virtualbox.py b/ansible_collections/community/general/plugins/inventory/virtualbox.py
index 8604808e1..79b04ec72 100644
--- a/ansible_collections/community/general/plugins/inventory/virtualbox.py
+++ b/ansible_collections/community/general/plugins/inventory/virtualbox.py
@@ -62,7 +62,8 @@ from ansible.module_utils.common.text.converters import to_bytes, to_native, to_
from ansible.module_utils.common._collections_compat import MutableMapping
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
from ansible.module_utils.common.process import get_bin_path
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
+
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
diff --git a/ansible_collections/community/general/plugins/inventory/xen_orchestra.py b/ansible_collections/community/general/plugins/inventory/xen_orchestra.py
index 96dd99770..4094af246 100644
--- a/ansible_collections/community/general/plugins/inventory/xen_orchestra.py
+++ b/ansible_collections/community/general/plugins/inventory/xen_orchestra.py
@@ -82,9 +82,9 @@ from time import sleep
from ansible.errors import AnsibleError
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
+from ansible_collections.community.general.plugins.plugin_utils.unsafe import make_unsafe
# 3rd party imports
try:
diff --git a/ansible_collections/community/general/plugins/lookup/bitwarden.py b/ansible_collections/community/general/plugins/lookup/bitwarden.py
index 2cb2d19a1..7584cd98a 100644
--- a/ansible_collections/community/general/plugins/lookup/bitwarden.py
+++ b/ansible_collections/community/general/plugins/lookup/bitwarden.py
@@ -29,7 +29,7 @@ DOCUMENTATION = """
- Field to retrieve, for example V(name) or V(id).
- If set to V(id), only zero or one element can be returned.
Use the Jinja C(first) filter to get the only list element.
- - When O(collection_id) is set, this field can be undefined to retrieve the whole collection records.
+ - If set to V(None) or V(''), or if O(_terms) is empty, records are not filtered by fields.
type: str
default: name
version_added: 5.7.0
@@ -40,6 +40,10 @@ DOCUMENTATION = """
description: Collection ID to filter results by collection. Leave unset to skip filtering.
type: str
version_added: 6.3.0
+ organization_id:
+ description: Organization ID to filter results by organization. Leave unset to skip filtering.
+ type: str
+ version_added: 8.5.0
bw_session:
description: Pass session key instead of reading from env.
type: str
@@ -142,45 +146,44 @@ class Bitwarden(object):
raise BitwardenException(err)
return to_text(out, errors='surrogate_or_strict'), to_text(err, errors='surrogate_or_strict')
- def _get_matches(self, search_value, search_field, collection_id=None):
+ def _get_matches(self, search_value, search_field, collection_id=None, organization_id=None):
"""Return matching records whose search_field is equal to key.
"""
# Prepare set of params for Bitwarden CLI
- if search_value:
- if search_field == 'id':
- params = ['get', 'item', search_value]
- else:
- params = ['list', 'items', '--search', search_value]
- if collection_id:
- params.extend(['--collectionid', collection_id])
+ if search_field == 'id':
+ params = ['get', 'item', search_value]
else:
- if not collection_id:
- raise AnsibleError("search_value is required if collection_id is not set.")
+ params = ['list', 'items']
+ if search_value:
+ params.extend(['--search', search_value])
- params = ['list', 'items', '--collectionid', collection_id]
+ if collection_id:
+ params.extend(['--collectionid', collection_id])
+ if organization_id:
+ params.extend(['--organizationid', organization_id])
out, err = self._run(params)
# This includes things that matched in different fields.
initial_matches = AnsibleJSONDecoder().raw_decode(out)[0]
- if search_field == 'id' or not search_value:
+ if search_field == 'id':
if initial_matches is None:
initial_matches = []
else:
initial_matches = [initial_matches]
# Filter to only include results from the right field.
- return [item for item in initial_matches if item[search_field] == search_value]
+ return [item for item in initial_matches if not search_value or item[search_field] == search_value]
- def get_field(self, field, search_value=None, search_field="name", collection_id=None):
+ def get_field(self, field, search_value, search_field="name", collection_id=None, organization_id=None):
"""Return a list of the specified field for records whose search_field match search_value
and filtered by collection if collection has been provided.
If field is None, return the whole record for each match.
"""
- matches = self._get_matches(search_value, search_field, collection_id)
+ matches = self._get_matches(search_value, search_field, collection_id, organization_id)
if not field:
return matches
field_matches = []
@@ -215,15 +218,16 @@ class LookupModule(LookupBase):
field = self.get_option('field')
search_field = self.get_option('search')
collection_id = self.get_option('collection_id')
+ organization_id = self.get_option('organization_id')
_bitwarden.session = self.get_option('bw_session')
if not _bitwarden.unlocked:
raise AnsibleError("Bitwarden Vault locked. Run 'bw unlock'.")
if not terms:
- return [_bitwarden.get_field(field, None, search_field, collection_id)]
+ terms = [None]
- return [_bitwarden.get_field(field, term, search_field, collection_id) for term in terms]
+ return [_bitwarden.get_field(field, term, search_field, collection_id, organization_id) for term in terms]
_bitwarden = Bitwarden()
diff --git a/ansible_collections/community/general/plugins/lookup/bitwarden_secrets_manager.py b/ansible_collections/community/general/plugins/lookup/bitwarden_secrets_manager.py
index 2d6706bee..8cabc693f 100644
--- a/ansible_collections/community/general/plugins/lookup/bitwarden_secrets_manager.py
+++ b/ansible_collections/community/general/plugins/lookup/bitwarden_secrets_manager.py
@@ -70,6 +70,7 @@ RETURN = """
"""
from subprocess import Popen, PIPE
+from time import sleep
from ansible.errors import AnsibleLookupError
from ansible.module_utils.common.text.converters import to_text
@@ -84,11 +85,29 @@ class BitwardenSecretsManagerException(AnsibleLookupError):
class BitwardenSecretsManager(object):
def __init__(self, path='bws'):
self._cli_path = path
+ self._max_retries = 3
+ self._retry_delay = 1
@property
def cli_path(self):
return self._cli_path
+ def _run_with_retry(self, args, stdin=None, retries=0):
+ out, err, rc = self._run(args, stdin)
+
+ if rc != 0:
+ if retries >= self._max_retries:
+ raise BitwardenSecretsManagerException("Max retries exceeded. Unable to retrieve secret.")
+
+ if "Too many requests" in err:
+ delay = self._retry_delay * (2 ** retries)
+ sleep(delay)
+ return self._run_with_retry(args, stdin, retries + 1)
+ else:
+ raise BitwardenSecretsManagerException(f"Command failed with return code {rc}: {err}")
+
+ return out, err, rc
+
def _run(self, args, stdin=None):
p = Popen([self.cli_path] + args, stdout=PIPE, stderr=PIPE, stdin=PIPE)
out, err = p.communicate(stdin)
@@ -107,7 +126,7 @@ class BitwardenSecretsManager(object):
'get', 'secret', secret_id
]
- out, err, rc = self._run(params)
+ out, err, rc = self._run_with_retry(params)
if rc != 0:
raise BitwardenSecretsManagerException(to_text(err))
diff --git a/ansible_collections/community/general/plugins/lookup/passwordstore.py b/ansible_collections/community/general/plugins/lookup/passwordstore.py
index 7a6fca7a0..9814fe133 100644
--- a/ansible_collections/community/general/plugins/lookup/passwordstore.py
+++ b/ansible_collections/community/general/plugins/lookup/passwordstore.py
@@ -139,6 +139,21 @@ DOCUMENTATION = '''
type: bool
default: true
version_added: 8.1.0
+ missing_subkey:
+ description:
+ - Preference about what to do if the password subkey is missing.
+ - If set to V(error), the lookup will error out if the subkey does not exist.
+ - If set to V(empty) or V(warn), will return a V(none) in case the subkey does not exist.
+ version_added: 8.6.0
+ type: str
+ default: empty
+ choices:
+ - error
+ - warn
+ - empty
+ ini:
+ - section: passwordstore_lookup
+ key: missing_subkey
notes:
- The lookup supports passing all options as lookup parameters since community.general 6.0.0.
'''
@@ -147,6 +162,7 @@ ansible.cfg: |
[passwordstore_lookup]
lock=readwrite
locktimeout=45s
+ missing_subkey=warn
tasks.yml: |
---
@@ -432,6 +448,20 @@ class LookupModule(LookupBase):
if self.paramvals['subkey'] in self.passdict:
return self.passdict[self.paramvals['subkey']]
else:
+ if self.paramvals["missing_subkey"] == "error":
+ raise AnsibleError(
+ "passwordstore: subkey {0} for passname {1} not found and missing_subkey=error is set".format(
+ self.paramvals["subkey"], self.passname
+ )
+ )
+
+ if self.paramvals["missing_subkey"] == "warn":
+ display.warning(
+ "passwordstore: subkey {0} for passname {1} not found".format(
+ self.paramvals["subkey"], self.passname
+ )
+ )
+
return None
@contextmanager
@@ -481,6 +511,7 @@ class LookupModule(LookupBase):
'umask': self.get_option('umask'),
'timestamp': self.get_option('timestamp'),
'preserve': self.get_option('preserve'),
+ "missing_subkey": self.get_option("missing_subkey"),
}
def run(self, terms, variables, **kwargs):
diff --git a/ansible_collections/community/general/plugins/module_utils/datetime.py b/ansible_collections/community/general/plugins/module_utils/datetime.py
new file mode 100644
index 000000000..c7899f68d
--- /dev/null
+++ b/ansible_collections/community/general/plugins/module_utils/datetime.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2023 Felix Fontein <felix@fontein.de>
+# Simplified BSD License (see LICENSES/BSD-2-Clause.txt or https://opensource.org/licenses/BSD-2-Clause)
+# SPDX-License-Identifier: BSD-2-Clause
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import datetime as _datetime
+import sys
+
+
+_USE_TIMEZONE = sys.version_info >= (3, 6)
+
+
+def ensure_timezone_info(value):
+ if not _USE_TIMEZONE or value.tzinfo is not None:
+ return value
+ return value.astimezone(_datetime.timezone.utc)
+
+
+def fromtimestamp(value):
+ if _USE_TIMEZONE:
+ return _datetime.fromtimestamp(value, tz=_datetime.timezone.utc)
+ return _datetime.utcfromtimestamp(value)
+
+
+def now():
+ if _USE_TIMEZONE:
+ return _datetime.datetime.now(tz=_datetime.timezone.utc)
+ return _datetime.datetime.utcnow()
diff --git a/ansible_collections/community/general/plugins/module_utils/gitlab.py b/ansible_collections/community/general/plugins/module_utils/gitlab.py
index f9872b877..b1354d8a9 100644
--- a/ansible_collections/community/general/plugins/module_utils/gitlab.py
+++ b/ansible_collections/community/general/plugins/module_utils/gitlab.py
@@ -81,16 +81,23 @@ def find_group(gitlab_instance, identifier):
return group
-def ensure_gitlab_package(module):
+def ensure_gitlab_package(module, min_version=None):
if not HAS_GITLAB_PACKAGE:
module.fail_json(
msg=missing_required_lib("python-gitlab", url='https://python-gitlab.readthedocs.io/en/stable/'),
exception=GITLAB_IMP_ERR
)
+ gitlab_version = gitlab.__version__
+ if min_version is not None and LooseVersion(gitlab_version) < LooseVersion(min_version):
+ module.fail_json(
+ msg="This module requires python-gitlab Python module >= %s "
+ "(installed version: %s). Please upgrade python-gitlab to version %s or above."
+ % (min_version, gitlab_version, min_version)
+ )
-def gitlab_authentication(module):
- ensure_gitlab_package(module)
+def gitlab_authentication(module, min_version=None):
+ ensure_gitlab_package(module, min_version=min_version)
gitlab_url = module.params['api_url']
validate_certs = module.params['validate_certs']
diff --git a/ansible_collections/community/general/plugins/module_utils/identity/keycloak/keycloak.py b/ansible_collections/community/general/plugins/module_utils/identity/keycloak/keycloak.py
index 9e1c3f4d9..b2a189250 100644
--- a/ansible_collections/community/general/plugins/module_utils/identity/keycloak/keycloak.py
+++ b/ansible_collections/community/general/plugins/module_utils/identity/keycloak/keycloak.py
@@ -28,6 +28,9 @@ URL_CLIENT_ROLES = "{url}/admin/realms/{realm}/clients/{id}/roles"
URL_CLIENT_ROLE = "{url}/admin/realms/{realm}/clients/{id}/roles/{name}"
URL_CLIENT_ROLE_COMPOSITES = "{url}/admin/realms/{realm}/clients/{id}/roles/{name}/composites"
+URL_CLIENT_ROLE_SCOPE_CLIENTS = "{url}/admin/realms/{realm}/clients/{id}/scope-mappings/clients/{scopeid}"
+URL_CLIENT_ROLE_SCOPE_REALM = "{url}/admin/realms/{realm}/clients/{id}/scope-mappings/realm"
+
URL_REALM_ROLES = "{url}/admin/realms/{realm}/roles"
URL_REALM_ROLE = "{url}/admin/realms/{realm}/roles/{name}"
URL_REALM_ROLEMAPPINGS = "{url}/admin/realms/{realm}/users/{id}/role-mappings/realm"
@@ -3049,6 +3052,105 @@ class KeycloakAPI(object):
except Exception:
return False
+ def get_client_role_scope_from_client(self, clientid, clientscopeid, realm="master"):
+ """ Fetch the roles associated with the client's scope for a specific client on the Keycloak server.
+ :param clientid: ID of the client from which to obtain the associated roles.
+ :param clientscopeid: ID of the client who owns the roles.
+ :param realm: Realm from which to obtain the scope.
+ :return: The client scope of roles from specified client.
+ """
+ client_role_scope_url = URL_CLIENT_ROLE_SCOPE_CLIENTS.format(url=self.baseurl, realm=realm, id=clientid, scopeid=clientscopeid)
+ try:
+ return json.loads(to_native(open_url(client_role_scope_url, method='GET', http_agent=self.http_agent, headers=self.restheaders,
+ timeout=self.connection_timeout,
+ validate_certs=self.validate_certs).read()))
+ except Exception as e:
+ self.fail_open_url(e, msg='Could not fetch roles scope for client %s in realm %s: %s' % (clientid, realm, str(e)))
+
+ def update_client_role_scope_from_client(self, payload, clientid, clientscopeid, realm="master"):
+ """ Update and fetch the roles associated with the client's scope on the Keycloak server.
+ :param payload: List of roles to be added to the scope.
+ :param clientid: ID of the client to update scope.
+ :param clientscopeid: ID of the client who owns the roles.
+ :param realm: Realm from which to obtain the clients.
+ :return: The client scope of roles from specified client.
+ """
+ client_role_scope_url = URL_CLIENT_ROLE_SCOPE_CLIENTS.format(url=self.baseurl, realm=realm, id=clientid, scopeid=clientscopeid)
+ try:
+ open_url(client_role_scope_url, method='POST', http_agent=self.http_agent, headers=self.restheaders, timeout=self.connection_timeout,
+ data=json.dumps(payload), validate_certs=self.validate_certs)
+
+ except Exception as e:
+ self.fail_open_url(e, msg='Could not update roles scope for client %s in realm %s: %s' % (clientid, realm, str(e)))
+
+ return self.get_client_role_scope_from_client(clientid, clientscopeid, realm)
+
+ def delete_client_role_scope_from_client(self, payload, clientid, clientscopeid, realm="master"):
+ """ Delete the roles contains in the payload from the client's scope on the Keycloak server.
+ :param payload: List of roles to be deleted.
+ :param clientid: ID of the client to delete roles from scope.
+ :param clientscopeid: ID of the client who owns the roles.
+ :param realm: Realm from which to obtain the clients.
+ :return: The client scope of roles from specified client.
+ """
+ client_role_scope_url = URL_CLIENT_ROLE_SCOPE_CLIENTS.format(url=self.baseurl, realm=realm, id=clientid, scopeid=clientscopeid)
+ try:
+ open_url(client_role_scope_url, method='DELETE', http_agent=self.http_agent, headers=self.restheaders, timeout=self.connection_timeout,
+ data=json.dumps(payload), validate_certs=self.validate_certs)
+
+ except Exception as e:
+ self.fail_open_url(e, msg='Could not delete roles scope for client %s in realm %s: %s' % (clientid, realm, str(e)))
+
+ return self.get_client_role_scope_from_client(clientid, clientscopeid, realm)
+
+ def get_client_role_scope_from_realm(self, clientid, realm="master"):
+ """ Fetch the realm roles from the client's scope on the Keycloak server.
+ :param clientid: ID of the client from which to obtain the associated realm roles.
+ :param realm: Realm from which to obtain the clients.
+ :return: The client realm roles scope.
+ """
+ client_role_scope_url = URL_CLIENT_ROLE_SCOPE_REALM.format(url=self.baseurl, realm=realm, id=clientid)
+ try:
+ return json.loads(to_native(open_url(client_role_scope_url, method='GET', http_agent=self.http_agent, headers=self.restheaders,
+ timeout=self.connection_timeout,
+ validate_certs=self.validate_certs).read()))
+ except Exception as e:
+ self.fail_open_url(e, msg='Could not fetch roles scope for client %s in realm %s: %s' % (clientid, realm, str(e)))
+
+ def update_client_role_scope_from_realm(self, payload, clientid, realm="master"):
+ """ Update and fetch the realm roles from the client's scope on the Keycloak server.
+ :param payload: List of realm roles to add.
+ :param clientid: ID of the client to update scope.
+ :param realm: Realm from which to obtain the clients.
+ :return: The client realm roles scope.
+ """
+ client_role_scope_url = URL_CLIENT_ROLE_SCOPE_REALM.format(url=self.baseurl, realm=realm, id=clientid)
+ try:
+ open_url(client_role_scope_url, method='POST', http_agent=self.http_agent, headers=self.restheaders, timeout=self.connection_timeout,
+ data=json.dumps(payload), validate_certs=self.validate_certs)
+
+ except Exception as e:
+ self.fail_open_url(e, msg='Could not update roles scope for client %s in realm %s: %s' % (clientid, realm, str(e)))
+
+ return self.get_client_role_scope_from_realm(clientid, realm)
+
+ def delete_client_role_scope_from_realm(self, payload, clientid, realm="master"):
+ """ Delete the realm roles contains in the payload from the client's scope on the Keycloak server.
+ :param payload: List of realm roles to delete.
+ :param clientid: ID of the client to delete roles from scope.
+ :param realm: Realm from which to obtain the clients.
+ :return: The client realm roles scope.
+ """
+ client_role_scope_url = URL_CLIENT_ROLE_SCOPE_REALM.format(url=self.baseurl, realm=realm, id=clientid)
+ try:
+ open_url(client_role_scope_url, method='DELETE', http_agent=self.http_agent, headers=self.restheaders, timeout=self.connection_timeout,
+ data=json.dumps(payload), validate_certs=self.validate_certs)
+
+ except Exception as e:
+ self.fail_open_url(e, msg='Could not delete roles scope for client %s in realm %s: %s' % (clientid, realm, str(e)))
+
+ return self.get_client_role_scope_from_realm(clientid, realm)
+
def fail_open_url(self, e, msg, **kwargs):
try:
if isinstance(e, HTTPError):
diff --git a/ansible_collections/community/general/plugins/module_utils/ipa.py b/ansible_collections/community/general/plugins/module_utils/ipa.py
index eda9b4132..fb63d5556 100644
--- a/ansible_collections/community/general/plugins/module_utils/ipa.py
+++ b/ansible_collections/community/general/plugins/module_utils/ipa.py
@@ -104,7 +104,7 @@ class IPAClient(object):
def get_ipa_version(self):
response = self.ping()['summary']
- ipa_ver_regex = re.compile(r'IPA server version (\d\.\d\.\d).*')
+ ipa_ver_regex = re.compile(r'IPA server version (\d+\.\d+\.\d+).*')
version_match = ipa_ver_regex.match(response)
ipa_version = None
if version_match:
diff --git a/ansible_collections/community/general/plugins/module_utils/puppet.py b/ansible_collections/community/general/plugins/module_utils/puppet.py
index 8d553a2d2..f05b0673f 100644
--- a/ansible_collections/community/general/plugins/module_utils/puppet.py
+++ b/ansible_collections/community/general/plugins/module_utils/puppet.py
@@ -107,5 +107,6 @@ def puppet_runner(module):
verbose=cmd_runner_fmt.as_bool("--verbose"),
),
check_rc=False,
+ force_lang=module.params["environment_lang"],
)
return runner
diff --git a/ansible_collections/community/general/plugins/module_utils/redfish_utils.py b/ansible_collections/community/general/plugins/module_utils/redfish_utils.py
index 4c2057129..6935573d0 100644
--- a/ansible_collections/community/general/plugins/module_utils/redfish_utils.py
+++ b/ansible_collections/community/general/plugins/module_utils/redfish_utils.py
@@ -1149,6 +1149,54 @@ class RedfishUtils(object):
return response
return {'ret': True, 'changed': True}
+ def manager_reset_to_defaults(self, command):
+ return self.reset_to_defaults(command, self.manager_uri,
+ '#Manager.ResetToDefaults')
+
+ def reset_to_defaults(self, command, resource_uri, action_name):
+ key = "Actions"
+ reset_type_values = ['ResetAll',
+ 'PreserveNetworkAndUsers',
+ 'PreserveNetwork']
+
+ if command not in reset_type_values:
+ return {'ret': False, 'msg': 'Invalid Command (%s)' % command}
+
+ # read the resource and get the current power state
+ response = self.get_request(self.root_uri + resource_uri)
+ if response['ret'] is False:
+ return response
+ data = response['data']
+
+ # get the reset Action and target URI
+ if key not in data or action_name not in data[key]:
+ return {'ret': False, 'msg': 'Action %s not found' % action_name}
+ reset_action = data[key][action_name]
+ if 'target' not in reset_action:
+ return {'ret': False,
+ 'msg': 'target URI missing from Action %s' % action_name}
+ action_uri = reset_action['target']
+
+ # get AllowableValues
+ ai = self._get_all_action_info_values(reset_action)
+ allowable_values = ai.get('ResetType', {}).get('AllowableValues', [])
+
+ # map ResetType to an allowable value if needed
+ if allowable_values and command not in allowable_values:
+ return {'ret': False,
+ 'msg': 'Specified reset type (%s) not supported '
+ 'by service. Supported types: %s' %
+ (command, allowable_values)}
+
+ # define payload
+ payload = {'ResetType': command}
+
+ # POST to Action URI
+ response = self.post_request(self.root_uri + action_uri, payload)
+ if response['ret'] is False:
+ return response
+ return {'ret': True, 'changed': True}
+
def _find_account_uri(self, username=None, acct_id=None):
if not any((username, acct_id)):
return {'ret': False, 'msg':
@@ -1549,6 +1597,8 @@ class RedfishUtils(object):
data = response['data']
+ result['multipart_supported'] = 'MultipartHttpPushUri' in data
+
if "Actions" in data:
actions = data['Actions']
if len(actions) > 0:
diff --git a/ansible_collections/community/general/plugins/module_utils/scaleway.py b/ansible_collections/community/general/plugins/module_utils/scaleway.py
index 67b821103..1310ba560 100644
--- a/ansible_collections/community/general/plugins/module_utils/scaleway.py
+++ b/ansible_collections/community/general/plugins/module_utils/scaleway.py
@@ -17,6 +17,10 @@ from ansible.module_utils.basic import env_fallback, missing_required_lib
from ansible.module_utils.urls import fetch_url
from ansible.module_utils.six.moves.urllib.parse import urlencode
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
SCALEWAY_SECRET_IMP_ERR = None
try:
from passlib.hash import argon2
@@ -306,10 +310,10 @@ class Scaleway(object):
# Prevent requesting the resource status too soon
time.sleep(wait_sleep_time)
- start = datetime.datetime.utcnow()
+ start = now()
end = start + datetime.timedelta(seconds=wait_timeout)
- while datetime.datetime.utcnow() < end:
+ while now() < end:
self.module.debug("We are going to wait for the resource to finish its transition")
state = self.fetch_state(resource)
diff --git a/ansible_collections/community/general/plugins/modules/aix_filesystem.py b/ansible_collections/community/general/plugins/modules/aix_filesystem.py
index 6abf6317f..4a3775c67 100644
--- a/ansible_collections/community/general/plugins/modules/aix_filesystem.py
+++ b/ansible_collections/community/general/plugins/modules/aix_filesystem.py
@@ -242,7 +242,7 @@ def _validate_vg(module, vg):
if rc != 0:
module.fail_json(msg="Failed executing %s command." % lsvg_cmd)
- rc, current_all_vgs, err = module.run_command([lsvg_cmd, "%s"])
+ rc, current_all_vgs, err = module.run_command([lsvg_cmd])
if rc != 0:
module.fail_json(msg="Failed executing %s command." % lsvg_cmd)
diff --git a/ansible_collections/community/general/plugins/modules/apt_rpm.py b/ansible_collections/community/general/plugins/modules/apt_rpm.py
index de1b57411..03b87e78f 100644
--- a/ansible_collections/community/general/plugins/modules/apt_rpm.py
+++ b/ansible_collections/community/general/plugins/modules/apt_rpm.py
@@ -37,7 +37,17 @@ options:
state:
description:
- Indicates the desired package state.
- choices: [ absent, present, installed, removed ]
+ - Please note that V(present) and V(installed) are equivalent to V(latest) right now.
+ This will change in the future. To simply ensure that a package is installed, without upgrading
+ it, use the V(present_not_latest) state.
+ - The states V(latest) and V(present_not_latest) have been added in community.general 8.6.0.
+ choices:
+ - absent
+ - present
+ - present_not_latest
+ - installed
+ - removed
+ - latest
default: present
type: str
update_cache:
@@ -180,7 +190,7 @@ def check_package_version(module, name):
return False
-def query_package_provides(module, name):
+def query_package_provides(module, name, allow_upgrade=False):
# rpm -q returns 0 if the package is installed,
# 1 if it is not installed
if name.endswith('.rpm'):
@@ -195,10 +205,11 @@ def query_package_provides(module, name):
rc, out, err = module.run_command("%s -q --provides %s" % (RPM_PATH, name))
if rc == 0:
+ if not allow_upgrade:
+ return True
if check_package_version(module, name):
return True
- else:
- return False
+ return False
def update_package_db(module):
@@ -255,14 +266,14 @@ def remove_packages(module, packages):
return (False, "package(s) already absent")
-def install_packages(module, pkgspec):
+def install_packages(module, pkgspec, allow_upgrade=False):
if pkgspec is None:
return (False, "Empty package list")
packages = ""
for package in pkgspec:
- if not query_package_provides(module, package):
+ if not query_package_provides(module, package, allow_upgrade=allow_upgrade):
packages += "'%s' " % package
if len(packages) != 0:
@@ -270,8 +281,8 @@ def install_packages(module, pkgspec):
rc, out, err = module.run_command("%s -y install %s" % (APT_PATH, packages), environ_update={"LANG": "C"})
installed = True
- for packages in pkgspec:
- if not query_package_provides(module, package):
+ for package in pkgspec:
+ if not query_package_provides(module, package, allow_upgrade=False):
installed = False
# apt-rpm always have 0 for exit code if --force is used
@@ -286,7 +297,7 @@ def install_packages(module, pkgspec):
def main():
module = AnsibleModule(
argument_spec=dict(
- state=dict(type='str', default='present', choices=['absent', 'installed', 'present', 'removed']),
+ state=dict(type='str', default='present', choices=['absent', 'installed', 'present', 'removed', 'present_not_latest', 'latest']),
update_cache=dict(type='bool', default=False),
clean=dict(type='bool', default=False),
dist_upgrade=dict(type='bool', default=False),
@@ -320,8 +331,8 @@ def main():
output += out
packages = p['package']
- if p['state'] in ['installed', 'present']:
- (m, out) = install_packages(module, packages)
+ if p['state'] in ['installed', 'present', 'present_not_latest', 'latest']:
+ (m, out) = install_packages(module, packages, allow_upgrade=p['state'] != 'present_not_latest')
modified = modified or m
output += out
diff --git a/ansible_collections/community/general/plugins/modules/cobbler_sync.py b/ansible_collections/community/general/plugins/modules/cobbler_sync.py
index 4ec87c96c..27f57028b 100644
--- a/ansible_collections/community/general/plugins/modules/cobbler_sync.py
+++ b/ansible_collections/community/general/plugins/modules/cobbler_sync.py
@@ -75,13 +75,16 @@ RETURN = r'''
# Default return values
'''
-import datetime
import ssl
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.six.moves import xmlrpc_client
from ansible.module_utils.common.text.converters import to_text
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
def main():
module = AnsibleModule(
@@ -110,7 +113,7 @@ def main():
changed=True,
)
- start = datetime.datetime.utcnow()
+ start = now()
ssl_context = None
if not validate_certs:
@@ -142,7 +145,7 @@ def main():
except Exception as e:
module.fail_json(msg="Failed to sync Cobbler. {error}".format(error=to_text(e)))
- elapsed = datetime.datetime.utcnow() - start
+ elapsed = now() - start
module.exit_json(elapsed=elapsed.seconds, **result)
diff --git a/ansible_collections/community/general/plugins/modules/cobbler_system.py b/ansible_collections/community/general/plugins/modules/cobbler_system.py
index cecc02f71..a327ede84 100644
--- a/ansible_collections/community/general/plugins/modules/cobbler_system.py
+++ b/ansible_collections/community/general/plugins/modules/cobbler_system.py
@@ -152,7 +152,6 @@ system:
type: dict
'''
-import datetime
import ssl
from ansible.module_utils.basic import AnsibleModule
@@ -160,6 +159,10 @@ from ansible.module_utils.six import iteritems
from ansible.module_utils.six.moves import xmlrpc_client
from ansible.module_utils.common.text.converters import to_text
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
IFPROPS_MAPPING = dict(
bondingopts='bonding_opts',
bridgeopts='bridge_opts',
@@ -232,7 +235,7 @@ def main():
changed=False,
)
- start = datetime.datetime.utcnow()
+ start = now()
ssl_context = None
if not validate_certs:
@@ -340,7 +343,7 @@ def main():
if module._diff:
result['diff'] = dict(before=system, after=result['system'])
- elapsed = datetime.datetime.utcnow() - start
+ elapsed = now() - start
module.exit_json(elapsed=elapsed.seconds, **result)
diff --git a/ansible_collections/community/general/plugins/modules/filesystem.py b/ansible_collections/community/general/plugins/modules/filesystem.py
index ec361245b..73e8c79c6 100644
--- a/ansible_collections/community/general/plugins/modules/filesystem.py
+++ b/ansible_collections/community/general/plugins/modules/filesystem.py
@@ -40,11 +40,12 @@ options:
default: present
version_added: 1.3.0
fstype:
- choices: [ btrfs, ext2, ext3, ext4, ext4dev, f2fs, lvm, ocfs2, reiserfs, xfs, vfat, swap, ufs ]
+ choices: [ bcachefs, btrfs, ext2, ext3, ext4, ext4dev, f2fs, lvm, ocfs2, reiserfs, xfs, vfat, swap, ufs ]
description:
- Filesystem type to be created. This option is required with
O(state=present) (or if O(state) is omitted).
- ufs support has been added in community.general 3.4.0.
+ - bcachefs support has been added in community.general 8.6.0.
type: str
aliases: [type]
dev:
@@ -67,7 +68,7 @@ options:
resizefs:
description:
- If V(true), if the block device and filesystem size differ, grow the filesystem into the space.
- - Supported for C(btrfs), C(ext2), C(ext3), C(ext4), C(ext4dev), C(f2fs), C(lvm), C(xfs), C(ufs) and C(vfat) filesystems.
+ - Supported for C(bcachefs), C(btrfs), C(ext2), C(ext3), C(ext4), C(ext4dev), C(f2fs), C(lvm), C(xfs), C(ufs) and C(vfat) filesystems.
Attempts to resize other filesystem types will fail.
- XFS Will only grow if mounted. Currently, the module is based on commands
from C(util-linux) package to perform operations, so resizing of XFS is
@@ -86,7 +87,7 @@ options:
- The UUID options specified in O(opts) take precedence over this value.
- See xfs_admin(8) (C(xfs)), tune2fs(8) (C(ext2), C(ext3), C(ext4), C(ext4dev)) for possible values.
- For O(fstype=lvm) the value is ignored, it resets the PV UUID if set.
- - Supported for O(fstype) being one of C(ext2), C(ext3), C(ext4), C(ext4dev), C(lvm), or C(xfs).
+ - Supported for O(fstype) being one of C(bcachefs), C(ext2), C(ext3), C(ext4), C(ext4dev), C(lvm), or C(xfs).
- This is B(not idempotent). Specifying this option will always result in a change.
- Mutually exclusive with O(resizefs).
type: str
@@ -405,6 +406,48 @@ class Reiserfs(Filesystem):
MKFS_FORCE_FLAGS = ['-q']
+class Bcachefs(Filesystem):
+ MKFS = 'mkfs.bcachefs'
+ MKFS_FORCE_FLAGS = ['--force']
+ MKFS_SET_UUID_OPTIONS = ['-U', '--uuid']
+ INFO = 'bcachefs'
+ GROW = 'bcachefs'
+ GROW_MAX_SPACE_FLAGS = ['device', 'resize']
+
+ def get_fs_size(self, dev):
+ """Return size in bytes of filesystem on device (integer)."""
+ dummy, stdout, dummy = self.module.run_command([self.module.get_bin_path(self.INFO),
+ 'show-super', str(dev)], check_rc=True)
+
+ for line in stdout.splitlines():
+ if "Size: " in line:
+ parts = line.split()
+ unit = parts[2]
+
+ base = None
+ exp = None
+
+ units_2 = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"]
+ units_10 = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
+
+ try:
+ exp = units_2.index(unit)
+ base = 1024
+ except ValueError:
+ exp = units_10.index(unit)
+ base = 1000
+
+ if exp == 0:
+ value = int(parts[1])
+ else:
+ value = float(parts[1])
+
+ if base is not None and exp is not None:
+ return int(value * pow(base, exp))
+
+ raise ValueError(repr(stdout))
+
+
class Btrfs(Filesystem):
MKFS = 'mkfs.btrfs'
INFO = 'btrfs'
@@ -567,6 +610,7 @@ class UFS(Filesystem):
FILESYSTEMS = {
+ 'bcachefs': Bcachefs,
'ext2': Ext2,
'ext3': Ext3,
'ext4': Ext4,
diff --git a/ansible_collections/community/general/plugins/modules/flatpak.py b/ansible_collections/community/general/plugins/modules/flatpak.py
index 80dbabdfa..15e404d45 100644
--- a/ansible_collections/community/general/plugins/modules/flatpak.py
+++ b/ansible_collections/community/general/plugins/modules/flatpak.py
@@ -26,7 +26,9 @@ extends_documentation_fragment:
- community.general.attributes
attributes:
check_mode:
- support: full
+ support: partial
+ details:
+ - If O(state=latest), the module will always return C(changed=true).
diff_mode:
support: none
options:
@@ -53,12 +55,12 @@ options:
- Both C(https://) and C(http://) URLs are supported.
- When supplying a reverse DNS name, you can use the O(remote) option to specify on what remote
to look for the flatpak. An example for a reverse DNS name is C(org.gnome.gedit).
- - When used with O(state=absent), it is recommended to specify the name in the reverse DNS
- format.
- - When supplying a URL with O(state=absent), the module will try to match the
- installed flatpak based on the name of the flatpakref to remove it. However, there is no
- guarantee that the names of the flatpakref file and the reverse DNS name of the installed
- flatpak do match.
+ - When used with O(state=absent) or O(state=latest), it is recommended to specify the name in
+ the reverse DNS format.
+ - When supplying a URL with O(state=absent) or O(state=latest), the module will try to match the
+ installed flatpak based on the name of the flatpakref to remove or update it. However, there
+ is no guarantee that the names of the flatpakref file and the reverse DNS name of the
+ installed flatpak do match.
type: list
elements: str
required: true
@@ -82,7 +84,8 @@ options:
state:
description:
- Indicates the desired package state.
- choices: [ absent, present ]
+ - The value V(latest) is supported since community.general 8.6.0.
+ choices: [ absent, present, latest ]
type: str
default: present
'''
@@ -118,6 +121,37 @@ EXAMPLES = r'''
- org.inkscape.Inkscape
- org.mozilla.firefox
+- name: Update the spotify flatpak
+ community.general.flatpak:
+ name: https://s3.amazonaws.com/alexlarsson/spotify-repo/spotify.flatpakref
+ state: latest
+
+- name: Update the gedit flatpak package without dependencies (not recommended)
+ community.general.flatpak:
+ name: https://git.gnome.org/browse/gnome-apps-nightly/plain/gedit.flatpakref
+ state: latest
+ no_dependencies: true
+
+- name: Update the gedit package from flathub for current user
+ community.general.flatpak:
+ name: org.gnome.gedit
+ state: latest
+ method: user
+
+- name: Update the Gnome Calendar flatpak from the gnome remote system-wide
+ community.general.flatpak:
+ name: org.gnome.Calendar
+ state: latest
+ remote: gnome
+
+- name: Update multiple packages
+ community.general.flatpak:
+ name:
+ - org.gimp.GIMP
+ - org.inkscape.Inkscape
+ - org.mozilla.firefox
+ state: latest
+
- name: Remove the gedit flatpak
community.general.flatpak:
name: org.gnome.gedit
@@ -195,6 +229,28 @@ def install_flat(module, binary, remote, names, method, no_dependencies):
result['changed'] = True
+def update_flat(module, binary, names, method, no_dependencies):
+ """Update existing flatpaks."""
+ global result # pylint: disable=global-variable-not-assigned
+ installed_flat_names = [
+ _match_installed_flat_name(module, binary, name, method)
+ for name in names
+ ]
+ command = [binary, "update", "--{0}".format(method)]
+ flatpak_version = _flatpak_version(module, binary)
+ if LooseVersion(flatpak_version) < LooseVersion('1.1.3'):
+ command += ["-y"]
+ else:
+ command += ["--noninteractive"]
+ if no_dependencies:
+ command += ["--no-deps"]
+ command += installed_flat_names
+ stdout = _flatpak_command(module, module.check_mode, command)
+ result["changed"] = (
+ True if module.check_mode else stdout.find("Nothing to do.") == -1
+ )
+
+
def uninstall_flat(module, binary, names, method):
"""Remove existing flatpaks."""
global result # pylint: disable=global-variable-not-assigned
@@ -313,7 +369,7 @@ def main():
method=dict(type='str', default='system',
choices=['user', 'system']),
state=dict(type='str', default='present',
- choices=['absent', 'present']),
+ choices=['absent', 'present', 'latest']),
no_dependencies=dict(type='bool', default=False),
executable=dict(type='path', default='flatpak')
),
@@ -338,10 +394,13 @@ def main():
module.fail_json(msg="Executable '%s' was not found on the system." % executable, **result)
installed, not_installed = flatpak_exists(module, binary, name, method)
- if state == 'present' and not_installed:
- install_flat(module, binary, remote, not_installed, method, no_dependencies)
- elif state == 'absent' and installed:
+ if state == 'absent' and installed:
uninstall_flat(module, binary, installed, method)
+ else:
+ if state == 'latest' and installed:
+ update_flat(module, binary, installed, method, no_dependencies)
+ if state in ('present', 'latest') and not_installed:
+ install_flat(module, binary, remote, not_installed, method, no_dependencies)
module.exit_json(**result)
diff --git a/ansible_collections/community/general/plugins/modules/github_key.py b/ansible_collections/community/general/plugins/modules/github_key.py
index fa3a0a01f..a74ead984 100644
--- a/ansible_collections/community/general/plugins/modules/github_key.py
+++ b/ansible_collections/community/general/plugins/modules/github_key.py
@@ -91,12 +91,17 @@ EXAMPLES = '''
pubkey: "{{ lookup('ansible.builtin.file', '/home/foo/.ssh/id_rsa.pub') }}"
'''
+import datetime
import json
import re
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.urls import fetch_url
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
API_BASE = 'https://api.github.com'
@@ -151,14 +156,13 @@ def get_all_keys(session):
def create_key(session, name, pubkey, check_mode):
if check_mode:
- from datetime import datetime
- now = datetime.utcnow()
+ now_t = now()
return {
'id': 0,
'key': pubkey,
'title': name,
'url': 'http://example.com/CHECK_MODE_GITHUB_KEY',
- 'created_at': datetime.strftime(now, '%Y-%m-%dT%H:%M:%SZ'),
+ 'created_at': datetime.strftime(now_t, '%Y-%m-%dT%H:%M:%SZ'),
'read_only': False,
'verified': False
}
diff --git a/ansible_collections/community/general/plugins/modules/gitlab_issue.py b/ansible_collections/community/general/plugins/modules/gitlab_issue.py
index 6d95bf6cf..3277c4f1a 100644
--- a/ansible_collections/community/general/plugins/modules/gitlab_issue.py
+++ b/ansible_collections/community/general/plugins/modules/gitlab_issue.py
@@ -143,7 +143,6 @@ from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.api import basic_auth_argument_spec
from ansible.module_utils.common.text.converters import to_native, to_text
-from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
from ansible_collections.community.general.plugins.module_utils.gitlab import (
auth_argument_spec, gitlab_authentication, gitlab, find_project, find_group
)
@@ -330,13 +329,8 @@ def main():
state_filter = module.params['state_filter']
title = module.params['title']
- gitlab_version = gitlab.__version__
- if LooseVersion(gitlab_version) < LooseVersion('2.3.0'):
- module.fail_json(msg="community.general.gitlab_issue requires python-gitlab Python module >= 2.3.0 (installed version: [%s])."
- " Please upgrade python-gitlab to version 2.3.0 or above." % gitlab_version)
-
# check prerequisites and connect to gitlab server
- gitlab_instance = gitlab_authentication(module)
+ gitlab_instance = gitlab_authentication(module, min_version='2.3.0')
this_project = find_project(gitlab_instance, project)
if this_project is None:
diff --git a/ansible_collections/community/general/plugins/modules/gitlab_label.py b/ansible_collections/community/general/plugins/modules/gitlab_label.py
index f2c8393f2..635033ab6 100644
--- a/ansible_collections/community/general/plugins/modules/gitlab_label.py
+++ b/ansible_collections/community/general/plugins/modules/gitlab_label.py
@@ -222,9 +222,8 @@ labels_obj:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.api import basic_auth_argument_spec
-from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
from ansible_collections.community.general.plugins.module_utils.gitlab import (
- auth_argument_spec, gitlab_authentication, ensure_gitlab_package, find_group, find_project, gitlab
+ auth_argument_spec, gitlab_authentication, ensure_gitlab_package, find_group, find_project
)
@@ -450,14 +449,7 @@ def main():
label_list = module.params['labels']
state = module.params['state']
- gitlab_version = gitlab.__version__
- _min_gitlab = '3.2.0'
- if LooseVersion(gitlab_version) < LooseVersion(_min_gitlab):
- module.fail_json(msg="community.general.gitlab_label requires python-gitlab Python module >= %s "
- "(installed version: [%s]). Please upgrade "
- "python-gitlab to version %s or above." % (_min_gitlab, gitlab_version, _min_gitlab))
-
- gitlab_instance = gitlab_authentication(module)
+ gitlab_instance = gitlab_authentication(module, min_version='3.2.0')
# find_project can return None, but the other must exist
gitlab_project_id = find_project(gitlab_instance, gitlab_project)
diff --git a/ansible_collections/community/general/plugins/modules/gitlab_milestone.py b/ansible_collections/community/general/plugins/modules/gitlab_milestone.py
index 0a616ea47..4b8b933cc 100644
--- a/ansible_collections/community/general/plugins/modules/gitlab_milestone.py
+++ b/ansible_collections/community/general/plugins/modules/gitlab_milestone.py
@@ -206,9 +206,8 @@ milestones_obj:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.api import basic_auth_argument_spec
-from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
from ansible_collections.community.general.plugins.module_utils.gitlab import (
- auth_argument_spec, gitlab_authentication, ensure_gitlab_package, find_group, find_project, gitlab
+ auth_argument_spec, gitlab_authentication, ensure_gitlab_package, find_group, find_project
)
from datetime import datetime
@@ -452,14 +451,7 @@ def main():
milestone_list = module.params['milestones']
state = module.params['state']
- gitlab_version = gitlab.__version__
- _min_gitlab = '3.2.0'
- if LooseVersion(gitlab_version) < LooseVersion(_min_gitlab):
- module.fail_json(msg="community.general.gitlab_milestone requires python-gitlab Python module >= %s "
- "(installed version: [%s]). Please upgrade "
- "python-gitlab to version %s or above." % (_min_gitlab, gitlab_version, _min_gitlab))
-
- gitlab_instance = gitlab_authentication(module)
+ gitlab_instance = gitlab_authentication(module, min_version='3.2.0')
# find_project can return None, but the other must exist
gitlab_project_id = find_project(gitlab_instance, gitlab_project)
diff --git a/ansible_collections/community/general/plugins/modules/haproxy.py b/ansible_collections/community/general/plugins/modules/haproxy.py
index 05f52d55c..cbaa43833 100644
--- a/ansible_collections/community/general/plugins/modules/haproxy.py
+++ b/ansible_collections/community/general/plugins/modules/haproxy.py
@@ -343,7 +343,7 @@ class HAProxy(object):
if state is not None:
self.execute(Template(cmd).substitute(pxname=backend, svname=svname))
- if self.wait:
+ if self.wait and not (wait_for_status == "DRAIN" and state == "DOWN"):
self.wait_until_status(backend, svname, wait_for_status)
def get_state_for(self, pxname, svname):
diff --git a/ansible_collections/community/general/plugins/modules/imc_rest.py b/ansible_collections/community/general/plugins/modules/imc_rest.py
index 113d341e8..7f5a5e081 100644
--- a/ansible_collections/community/general/plugins/modules/imc_rest.py
+++ b/ansible_collections/community/general/plugins/modules/imc_rest.py
@@ -268,7 +268,6 @@ output:
errorDescr="XML PARSING ERROR: Element 'computeRackUnit', attribute 'admin_Power': The attribute 'admin_Power' is not allowed.\n"/>
'''
-import datetime
import os
import traceback
@@ -292,6 +291,10 @@ from ansible.module_utils.basic import AnsibleModule, missing_required_lib
from ansible.module_utils.six.moves import zip_longest
from ansible.module_utils.urls import fetch_url
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
def imc_response(module, rawoutput, rawinput=''):
''' Handle IMC returned data '''
@@ -375,14 +378,14 @@ def main():
else:
module.fail_json(msg='Cannot find/access path:\n%s' % path)
- start = datetime.datetime.utcnow()
+ start = now()
# Perform login first
url = '%s://%s/nuova' % (protocol, hostname)
data = '<aaaLogin inName="%s" inPassword="%s"/>' % (username, password)
resp, auth = fetch_url(module, url, data=data, method='POST', timeout=timeout)
if resp is None or auth['status'] != 200:
- result['elapsed'] = (datetime.datetime.utcnow() - start).seconds
+ result['elapsed'] = (now() - start).seconds
module.fail_json(msg='Task failed with error %(status)s: %(msg)s' % auth, **result)
result.update(imc_response(module, resp.read()))
@@ -415,7 +418,7 @@ def main():
# Perform actual request
resp, info = fetch_url(module, url, data=data, method='POST', timeout=timeout)
if resp is None or info['status'] != 200:
- result['elapsed'] = (datetime.datetime.utcnow() - start).seconds
+ result['elapsed'] = (now() - start).seconds
module.fail_json(msg='Task failed with error %(status)s: %(msg)s' % info, **result)
# Merge results with previous results
@@ -431,7 +434,7 @@ def main():
result['changed'] = ('modified' in results)
# Report success
- result['elapsed'] = (datetime.datetime.utcnow() - start).seconds
+ result['elapsed'] = (now() - start).seconds
module.exit_json(**result)
finally:
logout(module, url, cookie, timeout)
diff --git a/ansible_collections/community/general/plugins/modules/ini_file.py b/ansible_collections/community/general/plugins/modules/ini_file.py
index ec71a9473..affee2a4f 100644
--- a/ansible_collections/community/general/plugins/modules/ini_file.py
+++ b/ansible_collections/community/general/plugins/modules/ini_file.py
@@ -44,6 +44,30 @@ options:
- If being omitted, the O(option) will be placed before the first O(section).
- Omitting O(section) is also required if the config format does not support sections.
type: str
+ section_has_values:
+ type: list
+ elements: dict
+ required: false
+ suboptions:
+ option:
+ type: str
+ description: Matching O(section) must contain this option.
+ required: true
+ value:
+ type: str
+ description: Matching O(section_has_values[].option) must have this specific value.
+ values:
+ description:
+ - The string value to be associated with an O(section_has_values[].option).
+ - Mutually exclusive with O(section_has_values[].value).
+ - O(section_has_values[].value=v) is equivalent to O(section_has_values[].values=[v]).
+ type: list
+ elements: str
+ description:
+ - Among possibly multiple sections of the same name, select the first one that contains matching options and values.
+ - With O(state=present), if a suitable section is not found, a new section will be added, including the required options.
+ - With O(state=absent), at most one O(section) is removed if it contains the values.
+ version_added: 8.6.0
option:
description:
- If set (required for changing a O(value)), this is the name of the option.
@@ -182,6 +206,57 @@ EXAMPLES = r'''
option: beverage
value: lemon juice
state: present
+
+- name: Remove the peer configuration for 10.128.0.11/32
+ community.general.ini_file:
+ path: /etc/wireguard/wg0.conf
+ section: Peer
+ section_has_values:
+ - option: AllowedIps
+ value: 10.128.0.11/32
+ mode: '0600'
+ state: absent
+
+- name: Add "beverage=lemon juice" outside a section in specified file
+ community.general.ini_file:
+ path: /etc/conf
+ option: beverage
+ value: lemon juice
+ state: present
+
+- name: Update the public key for peer 10.128.0.12/32
+ community.general.ini_file:
+ path: /etc/wireguard/wg0.conf
+ section: Peer
+ section_has_values:
+ - option: AllowedIps
+ value: 10.128.0.12/32
+ option: PublicKey
+ value: xxxxxxxxxxxxxxxxxxxx
+ mode: '0600'
+ state: present
+
+- name: Remove the peer configuration for 10.128.0.11/32
+ community.general.ini_file:
+ path: /etc/wireguard/wg0.conf
+ section: Peer
+ section_has_values:
+ - option: AllowedIps
+ value: 10.4.0.11/32
+ mode: '0600'
+ state: absent
+
+- name: Update the public key for peer 10.128.0.12/32
+ community.general.ini_file:
+ path: /etc/wireguard/wg0.conf
+ section: Peer
+ section_has_values:
+ - option: AllowedIps
+ value: 10.4.0.12/32
+ option: PublicKey
+ value: xxxxxxxxxxxxxxxxxxxx
+ mode: '0600'
+ state: present
'''
import io
@@ -222,7 +297,19 @@ def update_section_line(option, changed, section_lines, index, changed_lines, ig
return (changed, msg)
-def do_ini(module, filename, section=None, option=None, values=None,
+def check_section_has_values(section_has_values, section_lines):
+ if section_has_values is not None:
+ for condition in section_has_values:
+ for line in section_lines:
+ match = match_opt(condition["option"], line)
+ if match and (len(condition["values"]) == 0 or match.group(7) in condition["values"]):
+ break
+ else:
+ return False
+ return True
+
+
+def do_ini(module, filename, section=None, section_has_values=None, option=None, values=None,
state='present', exclusive=True, backup=False, no_extra_spaces=False,
ignore_spaces=False, create=True, allow_no_value=False, modify_inactive_option=True, follow=False):
@@ -307,14 +394,22 @@ def do_ini(module, filename, section=None, option=None, values=None,
section_pattern = re.compile(to_text(r'^\[\s*%s\s*]' % re.escape(section.strip())))
for index, line in enumerate(ini_lines):
+ # end of section:
+ if within_section and line.startswith(u'['):
+ if check_section_has_values(
+ section_has_values, ini_lines[section_start:index]
+ ):
+ section_end = index
+ break
+ else:
+ # look for another section
+ within_section = False
+ section_start = section_end = 0
+
# find start and end of section
if section_pattern.match(line):
within_section = True
section_start = index
- elif line.startswith(u'['):
- if within_section:
- section_end = index
- break
before = ini_lines[0:section_start]
section_lines = ini_lines[section_start:section_end]
@@ -435,6 +530,18 @@ def do_ini(module, filename, section=None, option=None, values=None,
if not within_section and state == 'present':
ini_lines.append(u'[%s]\n' % section)
msg = 'section and option added'
+ if section_has_values:
+ for condition in section_has_values:
+ if condition['option'] != option:
+ if len(condition['values']) > 0:
+ for value in condition['values']:
+ ini_lines.append(assignment_format % (condition['option'], value))
+ elif allow_no_value:
+ ini_lines.append(u'%s\n' % condition['option'])
+ elif not exclusive:
+ for value in condition['values']:
+ if value not in values:
+ values.append(value)
if option and values:
for value in values:
ini_lines.append(assignment_format % (option, value))
@@ -476,6 +583,11 @@ def main():
argument_spec=dict(
path=dict(type='path', required=True, aliases=['dest']),
section=dict(type='str'),
+ section_has_values=dict(type='list', elements='dict', options=dict(
+ option=dict(type='str', required=True),
+ value=dict(type='str'),
+ values=dict(type='list', elements='str')
+ ), default=None, mutually_exclusive=[['value', 'values']]),
option=dict(type='str'),
value=dict(type='str'),
values=dict(type='list', elements='str'),
@@ -498,6 +610,7 @@ def main():
path = module.params['path']
section = module.params['section']
+ section_has_values = module.params['section_has_values']
option = module.params['option']
value = module.params['value']
values = module.params['values']
@@ -519,8 +632,16 @@ def main():
elif values is None:
values = []
+ if section_has_values:
+ for condition in section_has_values:
+ if condition['value'] is not None:
+ condition['values'] = [condition['value']]
+ elif condition['values'] is None:
+ condition['values'] = []
+# raise Exception("section_has_values: {}".format(section_has_values))
+
(changed, backup_file, diff, msg) = do_ini(
- module, path, section, option, values, state, exclusive, backup,
+ module, path, section, section_has_values, option, values, state, exclusive, backup,
no_extra_spaces, ignore_spaces, create, allow_no_value, modify_inactive_option, follow)
if not module.check_mode and os.path.exists(path):
diff --git a/ansible_collections/community/general/plugins/modules/java_cert.py b/ansible_collections/community/general/plugins/modules/java_cert.py
index 72302b12c..e2d04b71e 100644
--- a/ansible_collections/community/general/plugins/modules/java_cert.py
+++ b/ansible_collections/community/general/plugins/modules/java_cert.py
@@ -28,7 +28,7 @@ options:
cert_url:
description:
- Basic URL to fetch SSL certificate from.
- - Exactly one of O(cert_url), O(cert_path), or O(pkcs12_path) is required to load certificate.
+ - Exactly one of O(cert_url), O(cert_path), O(cert_content), or O(pkcs12_path) is required to load certificate.
type: str
cert_port:
description:
@@ -39,8 +39,14 @@ options:
cert_path:
description:
- Local path to load certificate from.
- - Exactly one of O(cert_url), O(cert_path), or O(pkcs12_path) is required to load certificate.
+ - Exactly one of O(cert_url), O(cert_path), O(cert_content), or O(pkcs12_path) is required to load certificate.
type: path
+ cert_content:
+ description:
+ - Content of the certificate used to create the keystore.
+ - Exactly one of O(cert_url), O(cert_path), O(cert_content), or O(pkcs12_path) is required to load certificate.
+ type: str
+ version_added: 8.6.0
cert_alias:
description:
- Imported certificate alias.
@@ -55,10 +61,10 @@ options:
pkcs12_path:
description:
- Local path to load PKCS12 keystore from.
- - Unlike O(cert_url) and O(cert_path), the PKCS12 keystore embeds the private key matching
+ - Unlike O(cert_url), O(cert_path) and O(cert_content), the PKCS12 keystore embeds the private key matching
the certificate, and is used to import both the certificate and its private key into the
java keystore.
- - Exactly one of O(cert_url), O(cert_path), or O(pkcs12_path) is required to load certificate.
+ - Exactly one of O(cert_url), O(cert_path), O(cert_content), or O(pkcs12_path) is required to load certificate.
type: path
pkcs12_password:
description:
@@ -149,6 +155,19 @@ EXAMPLES = r'''
cert_alias: LE_RootCA
trust_cacert: true
+- name: Import trusted CA from the SSL certificate stored in the cert_content variable
+ community.general.java_cert:
+ cert_content: |
+ -----BEGIN CERTIFICATE-----
+ ...
+ -----END CERTIFICATE-----
+ keystore_path: /tmp/cacerts
+ keystore_pass: changeit
+ keystore_create: true
+ state: present
+ cert_alias: LE_RootCA
+ trust_cacert: true
+
- name: Import SSL certificate from google.com to a keystore, create it if it doesn't exist
community.general.java_cert:
cert_url: google.com
@@ -487,6 +506,7 @@ def main():
argument_spec = dict(
cert_url=dict(type='str'),
cert_path=dict(type='path'),
+ cert_content=dict(type='str'),
pkcs12_path=dict(type='path'),
pkcs12_password=dict(type='str', no_log=True),
pkcs12_alias=dict(type='str'),
@@ -503,11 +523,11 @@ def main():
module = AnsibleModule(
argument_spec=argument_spec,
- required_if=[['state', 'present', ('cert_path', 'cert_url', 'pkcs12_path'), True],
+ required_if=[['state', 'present', ('cert_path', 'cert_url', 'cert_content', 'pkcs12_path'), True],
['state', 'absent', ('cert_url', 'cert_alias'), True]],
required_together=[['keystore_path', 'keystore_pass']],
mutually_exclusive=[
- ['cert_url', 'cert_path', 'pkcs12_path']
+ ['cert_url', 'cert_path', 'cert_content', 'pkcs12_path']
],
supports_check_mode=True,
add_file_common_args=True,
@@ -515,6 +535,7 @@ def main():
url = module.params.get('cert_url')
path = module.params.get('cert_path')
+ content = module.params.get('cert_content')
port = module.params.get('cert_port')
pkcs12_path = module.params.get('pkcs12_path')
@@ -582,6 +603,10 @@ def main():
# certificate to stdout so we don't need to do any transformations.
new_certificate = path
+ elif content:
+ with open(new_certificate, "w") as f:
+ f.write(content)
+
elif url:
# Getting the X509 digest from a URL is the same as from a path, we just have
# to download the cert first
diff --git a/ansible_collections/community/general/plugins/modules/keycloak_client.py b/ansible_collections/community/general/plugins/modules/keycloak_client.py
index b151e4541..cd9c60bac 100644
--- a/ansible_collections/community/general/plugins/modules/keycloak_client.py
+++ b/ansible_collections/community/general/plugins/modules/keycloak_client.py
@@ -248,8 +248,9 @@ options:
description:
- Type of client.
- At creation only, default value will be V(openid-connect) if O(protocol) is omitted.
+ - The V(docker-v2) value was added in community.general 8.6.0.
type: str
- choices: ['openid-connect', 'saml']
+ choices: ['openid-connect', 'saml', 'docker-v2']
full_scope_allowed:
description:
@@ -393,7 +394,7 @@ options:
protocol:
description:
- This specifies for which protocol this protocol mapper is active.
- choices: ['openid-connect', 'saml']
+ choices: ['openid-connect', 'saml', 'docker-v2']
type: str
protocolMapper:
@@ -724,6 +725,7 @@ import copy
PROTOCOL_OPENID_CONNECT = 'openid-connect'
PROTOCOL_SAML = 'saml'
+PROTOCOL_DOCKER_V2 = 'docker-v2'
CLIENT_META_DATA = ['authorizationServicesEnabled']
@@ -742,6 +744,12 @@ def normalise_cr(clientrep, remove_ids=False):
if 'attributes' in clientrep:
clientrep['attributes'] = list(sorted(clientrep['attributes']))
+ if 'defaultClientScopes' in clientrep:
+ clientrep['defaultClientScopes'] = list(sorted(clientrep['defaultClientScopes']))
+
+ if 'optionalClientScopes' in clientrep:
+ clientrep['optionalClientScopes'] = list(sorted(clientrep['optionalClientScopes']))
+
if 'redirectUris' in clientrep:
clientrep['redirectUris'] = list(sorted(clientrep['redirectUris']))
@@ -785,7 +793,7 @@ def main():
consentText=dict(type='str'),
id=dict(type='str'),
name=dict(type='str'),
- protocol=dict(type='str', choices=[PROTOCOL_OPENID_CONNECT, PROTOCOL_SAML]),
+ protocol=dict(type='str', choices=[PROTOCOL_OPENID_CONNECT, PROTOCOL_SAML, PROTOCOL_DOCKER_V2]),
protocolMapper=dict(type='str'),
config=dict(type='dict'),
)
@@ -819,7 +827,7 @@ def main():
authorization_services_enabled=dict(type='bool', aliases=['authorizationServicesEnabled']),
public_client=dict(type='bool', aliases=['publicClient']),
frontchannel_logout=dict(type='bool', aliases=['frontchannelLogout']),
- protocol=dict(type='str', choices=[PROTOCOL_OPENID_CONNECT, PROTOCOL_SAML]),
+ protocol=dict(type='str', choices=[PROTOCOL_OPENID_CONNECT, PROTOCOL_SAML, PROTOCOL_DOCKER_V2]),
attributes=dict(type='dict'),
full_scope_allowed=dict(type='bool', aliases=['fullScopeAllowed']),
node_re_registration_timeout=dict(type='int', aliases=['nodeReRegistrationTimeout']),
diff --git a/ansible_collections/community/general/plugins/modules/keycloak_client_rolescope.py b/ansible_collections/community/general/plugins/modules/keycloak_client_rolescope.py
new file mode 100644
index 000000000..cca72f0dd
--- /dev/null
+++ b/ansible_collections/community/general/plugins/modules/keycloak_client_rolescope.py
@@ -0,0 +1,280 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright (c) Ansible project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+DOCUMENTATION = '''
+---
+module: keycloak_client_rolescope
+
+short_description: Allows administration of Keycloak client roles scope to restrict the usage of certain roles to a other specific client applications.
+
+version_added: 8.6.0
+
+description:
+ - This module allows you to add or remove Keycloak roles from clients scope via the Keycloak REST API.
+ It requires access to the REST API via OpenID Connect; the user connecting and the client being
+ used must have the requisite access rights. In a default Keycloak installation, admin-cli
+ and an admin user would work, as would a separate client definition with the scope tailored
+ to your needs and a user having the expected roles.
+
+ - Client O(client_id) must have O(community.general.keycloak_client#module:full_scope_allowed) set to V(false).
+
+ - Attributes are multi-valued in the Keycloak API. All attributes are lists of individual values and will
+ be returned that way by this module. You may pass single values for attributes when calling the module,
+ and this will be translated into a list suitable for the API.
+
+attributes:
+ check_mode:
+ support: full
+ diff_mode:
+ support: full
+
+options:
+ state:
+ description:
+ - State of the role mapping.
+ - On V(present), all roles in O(role_names) will be mapped if not exists yet.
+ - On V(absent), all roles mapping in O(role_names) will be removed if it exists.
+ default: 'present'
+ type: str
+ choices:
+ - present
+ - absent
+
+ realm:
+ type: str
+ description:
+ - The Keycloak realm under which clients resides.
+ default: 'master'
+
+ client_id:
+ type: str
+ required: true
+ description:
+ - Roles provided in O(role_names) while be added to this client scope.
+
+ client_scope_id:
+ type: str
+ description:
+ - If the O(role_names) are client role, the client ID under which it resides.
+ - If this parameter is absent, the roles are considered a realm role.
+ role_names:
+ required: true
+ type: list
+ elements: str
+ description:
+ - Names of roles to manipulate.
+ - If O(client_scope_id) is present, all roles must be under this client.
+ - If O(client_scope_id) is absent, all roles must be under the realm.
+
+
+extends_documentation_fragment:
+ - community.general.keycloak
+ - community.general.attributes
+
+author:
+ - Andre Desrosiers (@desand01)
+'''
+
+EXAMPLES = '''
+- name: Add roles to public client scope
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: https://auth.example.com/auth
+ auth_realm: master
+ auth_username: USERNAME
+ auth_password: PASSWORD
+ realm: MyCustomRealm
+ client_id: frontend-client-public
+ client_scope_id: backend-client-private
+ role_names:
+ - backend-role-admin
+ - backend-role-user
+
+- name: Remove roles from public client scope
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: https://auth.example.com/auth
+ auth_realm: master
+ auth_username: USERNAME
+ auth_password: PASSWORD
+ realm: MyCustomRealm
+ client_id: frontend-client-public
+ client_scope_id: backend-client-private
+ role_names:
+ - backend-role-admin
+ state: absent
+
+- name: Add realm roles to public client scope
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: https://auth.example.com/auth
+ auth_realm: master
+ auth_username: USERNAME
+ auth_password: PASSWORD
+ realm: MyCustomRealm
+ client_id: frontend-client-public
+ role_names:
+ - realm-role-admin
+ - realm-role-user
+'''
+
+RETURN = '''
+msg:
+ description: Message as to what action was taken.
+ returned: always
+ type: str
+ sample: "Client role scope for frontend-client-public has been updated"
+
+end_state:
+ description: Representation of role role scope after module execution.
+ returned: on success
+ type: list
+ elements: dict
+ sample: [
+ {
+ "clientRole": false,
+ "composite": false,
+ "containerId": "MyCustomRealm",
+ "id": "47293104-59a6-46f0-b460-2e9e3c9c424c",
+ "name": "backend-role-admin"
+ },
+ {
+ "clientRole": false,
+ "composite": false,
+ "containerId": "MyCustomRealm",
+ "id": "39c62a6d-542c-4715-92d2-41021eb33967",
+ "name": "backend-role-user"
+ }
+ ]
+'''
+
+from ansible_collections.community.general.plugins.module_utils.identity.keycloak.keycloak import KeycloakAPI, \
+ keycloak_argument_spec, get_token, KeycloakError
+from ansible.module_utils.basic import AnsibleModule
+
+
+def main():
+ """
+ Module execution
+
+ :return:
+ """
+ argument_spec = keycloak_argument_spec()
+
+ meta_args = dict(
+ client_id=dict(type='str', required=True),
+ client_scope_id=dict(type='str'),
+ realm=dict(type='str', default='master'),
+ role_names=dict(type='list', elements='str', required=True),
+ state=dict(type='str', default='present', choices=['present', 'absent']),
+ )
+
+ argument_spec.update(meta_args)
+
+ module = AnsibleModule(argument_spec=argument_spec,
+ supports_check_mode=True)
+
+ result = dict(changed=False, msg='', diff={}, end_state={})
+
+ # Obtain access token, initialize API
+ try:
+ connection_header = get_token(module.params)
+ except KeycloakError as e:
+ module.fail_json(msg=str(e))
+
+ kc = KeycloakAPI(module, connection_header)
+
+ realm = module.params.get('realm')
+ clientid = module.params.get('client_id')
+ client_scope_id = module.params.get('client_scope_id')
+ role_names = module.params.get('role_names')
+ state = module.params.get('state')
+
+ objRealm = kc.get_realm_by_id(realm)
+ if not objRealm:
+ module.fail_json(msg="Failed to retrive realm '{realm}'".format(realm=realm))
+
+ objClient = kc.get_client_by_clientid(clientid, realm)
+ if not objClient:
+ module.fail_json(msg="Failed to retrive client '{realm}.{clientid}'".format(realm=realm, clientid=clientid))
+ if objClient["fullScopeAllowed"] and state == "present":
+ module.fail_json(msg="FullScopeAllowed is active for Client '{realm}.{clientid}'".format(realm=realm, clientid=clientid))
+
+ if client_scope_id:
+ objClientScope = kc.get_client_by_clientid(client_scope_id, realm)
+ if not objClientScope:
+ module.fail_json(msg="Failed to retrive client '{realm}.{client_scope_id}'".format(realm=realm, client_scope_id=client_scope_id))
+ before_role_mapping = kc.get_client_role_scope_from_client(objClient["id"], objClientScope["id"], realm)
+ else:
+ before_role_mapping = kc.get_client_role_scope_from_realm(objClient["id"], realm)
+
+ if client_scope_id:
+ # retrive all role from client_scope
+ client_scope_roles_by_name = kc.get_client_roles_by_id(objClientScope["id"], realm)
+ else:
+ # retrive all role from realm
+ client_scope_roles_by_name = kc.get_realm_roles(realm)
+
+ # convert to indexed Dict by name
+ client_scope_roles_by_name = {role["name"]: role for role in client_scope_roles_by_name}
+ role_mapping_by_name = {role["name"]: role for role in before_role_mapping}
+ role_mapping_to_manipulate = []
+
+ if state == "present":
+ # update desired
+ for role_name in role_names:
+ if role_name not in client_scope_roles_by_name:
+ if client_scope_id:
+ module.fail_json(msg="Failed to retrive role '{realm}.{client_scope_id}.{role_name}'"
+ .format(realm=realm, client_scope_id=client_scope_id, role_name=role_name))
+ else:
+ module.fail_json(msg="Failed to retrive role '{realm}.{role_name}'".format(realm=realm, role_name=role_name))
+ if role_name not in role_mapping_by_name:
+ role_mapping_to_manipulate.append(client_scope_roles_by_name[role_name])
+ role_mapping_by_name[role_name] = client_scope_roles_by_name[role_name]
+ else:
+ # remove role if present
+ for role_name in role_names:
+ if role_name in role_mapping_by_name:
+ role_mapping_to_manipulate.append(role_mapping_by_name[role_name])
+ del role_mapping_by_name[role_name]
+
+ before_role_mapping = sorted(before_role_mapping, key=lambda d: d['name'])
+ desired_role_mapping = sorted(role_mapping_by_name.values(), key=lambda d: d['name'])
+
+ result['changed'] = len(role_mapping_to_manipulate) > 0
+
+ if result['changed']:
+ result['diff'] = dict(before=before_role_mapping, after=desired_role_mapping)
+
+ if not result['changed']:
+ # no changes
+ result['end_state'] = before_role_mapping
+ result['msg'] = "No changes required for client role scope {name}.".format(name=clientid)
+ elif state == "present":
+ # doing update
+ if module.check_mode:
+ result['end_state'] = desired_role_mapping
+ elif client_scope_id:
+ result['end_state'] = kc.update_client_role_scope_from_client(role_mapping_to_manipulate, objClient["id"], objClientScope["id"], realm)
+ else:
+ result['end_state'] = kc.update_client_role_scope_from_realm(role_mapping_to_manipulate, objClient["id"], realm)
+ result['msg'] = "Client role scope for {name} has been updated".format(name=clientid)
+ else:
+ # doing delete
+ if module.check_mode:
+ result['end_state'] = desired_role_mapping
+ elif client_scope_id:
+ result['end_state'] = kc.delete_client_role_scope_from_client(role_mapping_to_manipulate, objClient["id"], objClientScope["id"], realm)
+ else:
+ result['end_state'] = kc.delete_client_role_scope_from_realm(role_mapping_to_manipulate, objClient["id"], realm)
+ result['msg'] = "Client role scope for {name} has been deleted".format(name=clientid)
+ module.exit_json(**result)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ansible_collections/community/general/plugins/modules/keycloak_clientscope.py b/ansible_collections/community/general/plugins/modules/keycloak_clientscope.py
index d37af5f0c..d24e0f1f2 100644
--- a/ansible_collections/community/general/plugins/modules/keycloak_clientscope.py
+++ b/ansible_collections/community/general/plugins/modules/keycloak_clientscope.py
@@ -79,7 +79,8 @@ options:
protocol:
description:
- Type of client.
- choices: ['openid-connect', 'saml', 'wsfed']
+ - The V(docker-v2) value was added in community.general 8.6.0.
+ choices: ['openid-connect', 'saml', 'wsfed', 'docker-v2']
type: str
protocol_mappers:
@@ -95,7 +96,7 @@ options:
description:
- This specifies for which protocol this protocol mapper.
- is active.
- choices: ['openid-connect', 'saml', 'wsfed']
+ choices: ['openid-connect', 'saml', 'wsfed', 'docker-v2']
type: str
protocolMapper:
@@ -330,7 +331,7 @@ def main():
protmapper_spec = dict(
id=dict(type='str'),
name=dict(type='str'),
- protocol=dict(type='str', choices=['openid-connect', 'saml', 'wsfed']),
+ protocol=dict(type='str', choices=['openid-connect', 'saml', 'wsfed', 'docker-v2']),
protocolMapper=dict(type='str'),
config=dict(type='dict'),
)
@@ -341,7 +342,7 @@ def main():
id=dict(type='str'),
name=dict(type='str'),
description=dict(type='str'),
- protocol=dict(type='str', choices=['openid-connect', 'saml', 'wsfed']),
+ protocol=dict(type='str', choices=['openid-connect', 'saml', 'wsfed', 'docker-v2']),
attributes=dict(type='dict'),
protocol_mappers=dict(type='list', elements='dict', options=protmapper_spec, aliases=['protocolMappers']),
)
diff --git a/ansible_collections/community/general/plugins/modules/keycloak_clienttemplate.py b/ansible_collections/community/general/plugins/modules/keycloak_clienttemplate.py
index cd7f6c09b..7bffb5cbb 100644
--- a/ansible_collections/community/general/plugins/modules/keycloak_clienttemplate.py
+++ b/ansible_collections/community/general/plugins/modules/keycloak_clienttemplate.py
@@ -68,7 +68,8 @@ options:
protocol:
description:
- Type of client template.
- choices: ['openid-connect', 'saml']
+ - The V(docker-v2) value was added in community.general 8.6.0.
+ choices: ['openid-connect', 'saml', 'docker-v2']
type: str
full_scope_allowed:
@@ -107,7 +108,7 @@ options:
protocol:
description:
- This specifies for which protocol this protocol mapper is active.
- choices: ['openid-connect', 'saml']
+ choices: ['openid-connect', 'saml', 'docker-v2']
type: str
protocolMapper:
@@ -292,7 +293,7 @@ def main():
consentText=dict(type='str'),
id=dict(type='str'),
name=dict(type='str'),
- protocol=dict(type='str', choices=['openid-connect', 'saml']),
+ protocol=dict(type='str', choices=['openid-connect', 'saml', 'docker-v2']),
protocolMapper=dict(type='str'),
config=dict(type='dict'),
)
@@ -304,7 +305,7 @@ def main():
id=dict(type='str'),
name=dict(type='str'),
description=dict(type='str'),
- protocol=dict(type='str', choices=['openid-connect', 'saml']),
+ protocol=dict(type='str', choices=['openid-connect', 'saml', 'docker-v2']),
attributes=dict(type='dict'),
full_scope_allowed=dict(type='bool'),
protocol_mappers=dict(type='list', elements='dict', options=protmapper_spec),
diff --git a/ansible_collections/community/general/plugins/modules/keycloak_realm.py b/ansible_collections/community/general/plugins/modules/keycloak_realm.py
index 9f2e72b52..6128c9e4c 100644
--- a/ansible_collections/community/general/plugins/modules/keycloak_realm.py
+++ b/ansible_collections/community/general/plugins/modules/keycloak_realm.py
@@ -582,6 +582,27 @@ from ansible_collections.community.general.plugins.module_utils.identity.keycloa
from ansible.module_utils.basic import AnsibleModule
+def normalise_cr(realmrep):
+ """ Re-sorts any properties where the order is important so that diff's is minimised and the change detection is more effective.
+
+ :param realmrep: the realmrep dict to be sanitized
+ :return: normalised realmrep dict
+ """
+ # Avoid the dict passed in to be modified
+ realmrep = realmrep.copy()
+
+ if 'enabledEventTypes' in realmrep:
+ realmrep['enabledEventTypes'] = list(sorted(realmrep['enabledEventTypes']))
+
+ if 'otpSupportedApplications' in realmrep:
+ realmrep['otpSupportedApplications'] = list(sorted(realmrep['otpSupportedApplications']))
+
+ if 'supportedLocales' in realmrep:
+ realmrep['supportedLocales'] = list(sorted(realmrep['supportedLocales']))
+
+ return realmrep
+
+
def sanitize_cr(realmrep):
""" Removes probably sensitive details from a realm representation.
@@ -595,7 +616,7 @@ def sanitize_cr(realmrep):
if 'saml.signing.private.key' in result['attributes']:
result['attributes'] = result['attributes'].copy()
result['attributes']['saml.signing.private.key'] = '********'
- return result
+ return normalise_cr(result)
def main():
@@ -777,9 +798,11 @@ def main():
result['changed'] = True
if module.check_mode:
# We can only compare the current realm with the proposed updates we have
+ before_norm = normalise_cr(before_realm)
+ desired_norm = normalise_cr(desired_realm)
if module._diff:
- result['diff'] = dict(before=before_realm_sanitized,
- after=sanitize_cr(desired_realm))
+ result['diff'] = dict(before=sanitize_cr(before_norm),
+ after=sanitize_cr(desired_norm))
result['changed'] = (before_realm != desired_realm)
module.exit_json(**result)
diff --git a/ansible_collections/community/general/plugins/modules/lxd_container.py b/ansible_collections/community/general/plugins/modules/lxd_container.py
index 9fd1b183b..b82e2be9b 100644
--- a/ansible_collections/community/general/plugins/modules/lxd_container.py
+++ b/ansible_collections/community/general/plugins/modules/lxd_container.py
@@ -86,8 +86,8 @@ options:
source:
description:
- 'The source for the instance
- (for example V({ "type": "image", "mode": "pull", "server": "https://images.linuxcontainers.org",
- "protocol": "lxd", "alias": "ubuntu/xenial/amd64" })).'
+ (for example V({ "type": "image", "mode": "pull", "server": "https://cloud-images.ubuntu.com/releases/",
+ "protocol": "simplestreams", "alias": "22.04" })).'
- 'See U(https://documentation.ubuntu.com/lxd/en/latest/api/) for complete API documentation.'
- 'Note that C(protocol) accepts two choices: V(lxd) or V(simplestreams).'
required: false
@@ -205,6 +205,9 @@ notes:
- You can copy a file in the created instance to the localhost
with C(command=lxc file pull instance_name/dir/filename filename).
See the first example below.
+ - linuxcontainers.org has phased out LXC/LXD support with March 2024
+ (U(https://discuss.linuxcontainers.org/t/important-notice-for-lxd-users-image-server/18479)).
+ Currently only Ubuntu is still providing images.
'''
EXAMPLES = '''
@@ -220,9 +223,9 @@ EXAMPLES = '''
source:
type: image
mode: pull
- server: https://images.linuxcontainers.org
- protocol: lxd # if you get a 404, try setting protocol: simplestreams
- alias: ubuntu/xenial/amd64
+ server: https://cloud-images.ubuntu.com/releases/
+ protocol: simplestreams
+ alias: "22.04"
profiles: ["default"]
wait_for_ipv4_addresses: true
timeout: 600
@@ -264,6 +267,26 @@ EXAMPLES = '''
wait_for_ipv4_addresses: true
timeout: 600
+# An example of creating a ubuntu-minial container
+- hosts: localhost
+ connection: local
+ tasks:
+ - name: Create a started container
+ community.general.lxd_container:
+ name: mycontainer
+ ignore_volatile_options: true
+ state: started
+ source:
+ type: image
+ mode: pull
+ # Provides Ubuntu minimal images
+ server: https://cloud-images.ubuntu.com/minimal/releases/
+ protocol: simplestreams
+ alias: "22.04"
+ profiles: ["default"]
+ wait_for_ipv4_addresses: true
+ timeout: 600
+
# An example for creating container in project other than default
- hosts: localhost
connection: local
@@ -278,8 +301,8 @@ EXAMPLES = '''
protocol: simplestreams
type: image
mode: pull
- server: https://images.linuxcontainers.org
- alias: ubuntu/20.04/cloud
+ server: https://cloud-images.ubuntu.com/releases/
+ alias: "22.04"
profiles: ["default"]
wait_for_ipv4_addresses: true
timeout: 600
@@ -347,7 +370,7 @@ EXAMPLES = '''
source:
type: image
mode: pull
- alias: ubuntu/xenial/amd64
+ alias: "22.04"
target: node01
- name: Create container on another node
@@ -358,7 +381,7 @@ EXAMPLES = '''
source:
type: image
mode: pull
- alias: ubuntu/xenial/amd64
+ alias: "22.04"
target: node02
# An example for creating a virtual machine
diff --git a/ansible_collections/community/general/plugins/modules/nmcli.py b/ansible_collections/community/general/plugins/modules/nmcli.py
index 9360ce37d..6f0884da9 100644
--- a/ansible_collections/community/general/plugins/modules/nmcli.py
+++ b/ansible_collections/community/general/plugins/modules/nmcli.py
@@ -64,13 +64,16 @@ options:
- Type V(infiniband) is added in community.general 2.0.0.
- Type V(loopback) is added in community.general 8.1.0.
- Type V(macvlan) is added in community.general 6.6.0.
+ - Type V(ovs-bridge) is added in community.general 8.6.0.
+ - Type V(ovs-interface) is added in community.general 8.6.0.
+ - Type V(ovs-port) is added in community.general 8.6.0.
- Type V(wireguard) is added in community.general 4.3.0.
- Type V(vpn) is added in community.general 5.1.0.
- Using V(bond-slave), V(bridge-slave), or V(team-slave) implies V(ethernet) connection type with corresponding O(slave_type) option.
- If you want to control non-ethernet connection attached to V(bond), V(bridge), or V(team) consider using O(slave_type) option.
type: str
choices: [ bond, bond-slave, bridge, bridge-slave, dummy, ethernet, generic, gre, infiniband, ipip, macvlan, sit, team, team-slave, vlan, vxlan,
- wifi, gsm, wireguard, vpn, loopback ]
+ wifi, gsm, wireguard, ovs-bridge, ovs-port, ovs-interface, vpn, loopback ]
mode:
description:
- This is the type of device or network connection that you wish to create for a bond or bridge.
@@ -86,12 +89,13 @@ options:
slave_type:
description:
- Type of the device of this slave's master connection (for example V(bond)).
+ - Type V(ovs-port) is added in community.general 8.6.0.
type: str
- choices: [ 'bond', 'bridge', 'team' ]
+ choices: [ 'bond', 'bridge', 'team', 'ovs-port' ]
version_added: 7.0.0
master:
description:
- - Master <master (ifname, or connection UUID or conn_name) of bridge, team, bond master connection profile.
+ - Master <master (ifname, or connection UUID or conn_name) of bridge, team, bond, ovs-port master connection profile.
- Mandatory if O(slave_type) is defined.
type: str
ip4:
@@ -1505,6 +1509,32 @@ EXAMPLES = r'''
table: "production"
routing_rules4:
- "priority 0 from 192.168.1.50 table 200"
+
+## Creating an OVS bridge and attaching a port
+- name: Create OVS Bridge
+ community.general.nmcli:
+ conn_name: ovs-br-conn
+ ifname: ovs-br
+ type: ovs-bridge
+ state: present
+
+- name: Create OVS Port for OVS Bridge Interface
+ community.general.nmcli:
+ conn_name: ovs-br-interface-port-conn
+ ifname: ovs-br-interface-port
+ master: ovs-br
+ type: ovs-port
+ state: present
+
+## Adding an ethernet interface to an OVS bridge port
+- name: Add Ethernet Interface to OVS Port
+ community.general.nmcli:
+ conn_name: eno1
+ ifname: eno1
+ master: ovs-br-interface-port
+ slave_type: ovs-port
+ type: ethernet
+ state: present
'''
RETURN = r"""#
@@ -1678,7 +1708,8 @@ class Nmcli(object):
}
# IP address options.
- if self.ip_conn_type and not self.master:
+ # The ovs-interface type can be both ip_conn_type and have a master
+ if (self.ip_conn_type and not self.master) or self.type == "ovs-interface":
options.update({
'ipv4.addresses': self.enforce_ipv4_cidr_notation(self.ip4),
'ipv4.dhcp-client-id': self.dhcp_client_id,
@@ -1939,6 +1970,7 @@ class Nmcli(object):
'wireguard',
'vpn',
'loopback',
+ 'ovs-interface',
)
@property
@@ -2005,6 +2037,8 @@ class Nmcli(object):
'team-slave',
'wifi',
'infiniband',
+ 'ovs-port',
+ 'ovs-interface',
)
@property
@@ -2400,7 +2434,7 @@ def main():
state=dict(type='str', required=True, choices=['absent', 'present']),
conn_name=dict(type='str', required=True),
master=dict(type='str'),
- slave_type=dict(type='str', choices=['bond', 'bridge', 'team']),
+ slave_type=dict(type='str', choices=['bond', 'bridge', 'team', 'ovs-port']),
ifname=dict(type='str'),
type=dict(type='str',
choices=[
@@ -2425,6 +2459,9 @@ def main():
'wireguard',
'vpn',
'loopback',
+ 'ovs-interface',
+ 'ovs-bridge',
+ 'ovs-port',
]),
ip4=dict(type='list', elements='str'),
gw4=dict(type='str'),
diff --git a/ansible_collections/community/general/plugins/modules/osx_defaults.py b/ansible_collections/community/general/plugins/modules/osx_defaults.py
index 336e95332..db5d889a3 100644
--- a/ansible_collections/community/general/plugins/modules/osx_defaults.py
+++ b/ansible_collections/community/general/plugins/modules/osx_defaults.py
@@ -50,6 +50,13 @@ options:
type: str
choices: [ array, bool, boolean, date, float, int, integer, string ]
default: string
+ check_type:
+ description:
+ - Checks if the type of the provided O(value) matches the type of an existing default.
+ - If the types do not match, raises an error.
+ type: bool
+ default: true
+ version_added: 8.6.0
array_add:
description:
- Add new elements to the array for a key which has an array as its value.
@@ -158,6 +165,7 @@ class OSXDefaults(object):
self.domain = module.params['domain']
self.host = module.params['host']
self.key = module.params['key']
+ self.check_type = module.params['check_type']
self.type = module.params['type']
self.array_add = module.params['array_add']
self.value = module.params['value']
@@ -349,10 +357,11 @@ class OSXDefaults(object):
self.delete()
return True
- # There is a type mismatch! Given type does not match the type in defaults
- value_type = type(self.value)
- if self.current_value is not None and not isinstance(self.current_value, value_type):
- raise OSXDefaultsException("Type mismatch. Type in defaults: %s" % type(self.current_value).__name__)
+ # Check if there is a type mismatch, e.g. given type does not match the type in defaults
+ if self.check_type:
+ value_type = type(self.value)
+ if self.current_value is not None and not isinstance(self.current_value, value_type):
+ raise OSXDefaultsException("Type mismatch. Type in defaults: %s" % type(self.current_value).__name__)
# Current value matches the given value. Nothing need to be done. Arrays need extra care
if self.type == "array" and self.current_value is not None and not self.array_add and \
@@ -383,6 +392,7 @@ def main():
domain=dict(type='str', default='NSGlobalDomain'),
host=dict(type='str'),
key=dict(type='str', no_log=False),
+ check_type=dict(type='bool', default=True),
type=dict(type='str', default='string', choices=['array', 'bool', 'boolean', 'date', 'float', 'int', 'integer', 'string']),
array_add=dict(type='bool', default=False),
value=dict(type='raw'),
diff --git a/ansible_collections/community/general/plugins/modules/pagerduty.py b/ansible_collections/community/general/plugins/modules/pagerduty.py
index 596c4f4da..853bd6d79 100644
--- a/ansible_collections/community/general/plugins/modules/pagerduty.py
+++ b/ansible_collections/community/general/plugins/modules/pagerduty.py
@@ -151,6 +151,10 @@ import json
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.urls import fetch_url
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
class PagerDutyRequest(object):
def __init__(self, module, name, user, token):
@@ -206,9 +210,9 @@ class PagerDutyRequest(object):
return [{'id': service, 'type': 'service_reference'}]
def _compute_start_end_time(self, hours, minutes):
- now = datetime.datetime.utcnow()
- later = now + datetime.timedelta(hours=int(hours), minutes=int(minutes))
- start = now.strftime("%Y-%m-%dT%H:%M:%SZ")
+ now_t = now()
+ later = now_t + datetime.timedelta(hours=int(hours), minutes=int(minutes))
+ start = now_t.strftime("%Y-%m-%dT%H:%M:%SZ")
end = later.strftime("%Y-%m-%dT%H:%M:%SZ")
return start, end
diff --git a/ansible_collections/community/general/plugins/modules/pagerduty_change.py b/ansible_collections/community/general/plugins/modules/pagerduty_change.py
index 1a1e50dcf..acd31fb44 100644
--- a/ansible_collections/community/general/plugins/modules/pagerduty_change.py
+++ b/ansible_collections/community/general/plugins/modules/pagerduty_change.py
@@ -110,7 +110,10 @@ EXAMPLES = '''
from ansible.module_utils.urls import fetch_url
from ansible.module_utils.basic import AnsibleModule
-from datetime import datetime
+
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
def main():
@@ -161,8 +164,7 @@ def main():
if module.params['environment']:
custom_details['environment'] = module.params['environment']
- now = datetime.utcnow()
- timestamp = now.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
+ timestamp = now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")
payload = {
'summary': module.params['summary'],
diff --git a/ansible_collections/community/general/plugins/modules/portage.py b/ansible_collections/community/general/plugins/modules/portage.py
index 112f6d2d7..8ae8efb08 100644
--- a/ansible_collections/community/general/plugins/modules/portage.py
+++ b/ansible_collections/community/general/plugins/modules/portage.py
@@ -121,6 +121,14 @@ options:
type: bool
default: false
+ select:
+ description:
+ - If set to V(true), explicitely add the package to the world file.
+ - Please note that this option is not used for idempotency, it is only used
+ when actually installing a package.
+ type: bool
+ version_added: 8.6.0
+
sync:
description:
- Sync package repositories first
@@ -374,6 +382,7 @@ def emerge_packages(module, packages):
'loadavg': '--load-average',
'backtrack': '--backtrack',
'withbdeps': '--with-bdeps',
+ 'select': '--select',
}
for flag, arg in emerge_flags.items():
@@ -523,6 +532,7 @@ def main():
nodeps=dict(default=False, type='bool'),
onlydeps=dict(default=False, type='bool'),
depclean=dict(default=False, type='bool'),
+ select=dict(default=None, type='bool'),
quiet=dict(default=False, type='bool'),
verbose=dict(default=False, type='bool'),
sync=dict(default=None, choices=['yes', 'web', 'no']),
@@ -543,6 +553,7 @@ def main():
['quiet', 'verbose'],
['quietbuild', 'verbose'],
['quietfail', 'verbose'],
+ ['oneshot', 'select'],
],
supports_check_mode=True,
)
diff --git a/ansible_collections/community/general/plugins/modules/puppet.py b/ansible_collections/community/general/plugins/modules/puppet.py
index 86eac062a..b28583fe0 100644
--- a/ansible_collections/community/general/plugins/modules/puppet.py
+++ b/ansible_collections/community/general/plugins/modules/puppet.py
@@ -116,6 +116,15 @@ options:
- Whether to print file changes details
type: bool
default: false
+ environment_lang:
+ description:
+ - The lang environment to use when running the puppet agent.
+ - The default value, V(C), is supported on every system, but can lead to encoding errors if UTF-8 is used in the output
+ - Use V(C.UTF-8) or V(en_US.UTF-8) or similar UTF-8 supporting locales in case of problems. You need to make sure
+ the selected locale is supported on the system the puppet agent runs on.
+ type: str
+ default: C
+ version_added: 8.6.0
requirements:
- puppet
author:
@@ -208,6 +217,7 @@ def main():
debug=dict(type='bool', default=False),
verbose=dict(type='bool', default=False),
use_srv_records=dict(type='bool'),
+ environment_lang=dict(type='str', default='C'),
),
supports_check_mode=True,
mutually_exclusive=[
diff --git a/ansible_collections/community/general/plugins/modules/redfish_command.py b/ansible_collections/community/general/plugins/modules/redfish_command.py
index e66380493..06224235a 100644
--- a/ansible_collections/community/general/plugins/modules/redfish_command.py
+++ b/ansible_collections/community/general/plugins/modules/redfish_command.py
@@ -281,6 +281,12 @@ options:
- BIOS attributes that needs to be verified in the given server.
type: dict
version_added: 6.4.0
+ reset_to_defaults_mode:
+ description:
+ - Mode to apply when reseting to default.
+ type: str
+ choices: [ ResetAll, PreserveNetworkAndUsers, PreserveNetwork ]
+ version_added: 8.6.0
author:
- "Jose Delarosa (@jose-delarosa)"
@@ -714,6 +720,13 @@ EXAMPLES = '''
command: PowerReboot
resource_id: BMC
+ - name: Factory reset manager to defaults
+ community.general.redfish_command:
+ category: Manager
+ command: ResetToDefaults
+ resource_id: BMC
+ reset_to_defaults_mode: ResetAll
+
- name: Verify BIOS attributes
community.general.redfish_command:
category: Systems
@@ -764,6 +777,7 @@ CATEGORY_COMMANDS_ALL = {
"UpdateAccountServiceProperties"],
"Sessions": ["ClearSessions", "CreateSession", "DeleteSession"],
"Manager": ["GracefulRestart", "ClearLogs", "VirtualMediaInsert",
+ "ResetToDefaults",
"VirtualMediaEject", "PowerOn", "PowerForceOff", "PowerForceRestart",
"PowerGracefulRestart", "PowerGracefulShutdown", "PowerReboot"],
"Update": ["SimpleUpdate", "MultipartHTTPPushUpdate", "PerformRequestedOperations"],
@@ -825,6 +839,7 @@ def main():
)
),
strip_etag_quotes=dict(type='bool', default=False),
+ reset_to_defaults_mode=dict(choices=['ResetAll', 'PreserveNetworkAndUsers', 'PreserveNetwork']),
bios_attributes=dict(type="dict")
),
required_together=[
@@ -1017,6 +1032,8 @@ def main():
result = rf_utils.virtual_media_insert(virtual_media, category)
elif command == 'VirtualMediaEject':
result = rf_utils.virtual_media_eject(virtual_media, category)
+ elif command == 'ResetToDefaults':
+ result = rf_utils.manager_reset_to_defaults(module.params['reset_to_defaults_mode'])
elif category == "Update":
# execute only if we find UpdateService resources
diff --git a/ansible_collections/community/general/plugins/modules/riak.py b/ansible_collections/community/general/plugins/modules/riak.py
index fe295d2d6..438263da2 100644
--- a/ansible_collections/community/general/plugins/modules/riak.py
+++ b/ansible_collections/community/general/plugins/modules/riak.py
@@ -93,7 +93,7 @@ from ansible.module_utils.urls import fetch_url
def ring_check(module, riak_admin_bin):
- cmd = '%s ringready' % riak_admin_bin
+ cmd = riak_admin_bin + ['ringready']
rc, out, err = module.run_command(cmd)
if rc == 0 and 'TRUE All nodes agree on the ring' in out:
return True
@@ -127,6 +127,7 @@ def main():
# make sure riak commands are on the path
riak_bin = module.get_bin_path('riak')
riak_admin_bin = module.get_bin_path('riak-admin')
+ riak_admin_bin = [riak_admin_bin] if riak_admin_bin is not None else [riak_bin, 'admin']
timeout = time.time() + 120
while True:
@@ -164,7 +165,7 @@ def main():
module.fail_json(msg=out)
elif command == 'kv_test':
- cmd = '%s test' % riak_admin_bin
+ cmd = riak_admin_bin + ['test']
rc, out, err = module.run_command(cmd)
if rc == 0:
result['kv_test'] = out
@@ -175,7 +176,7 @@ def main():
if nodes.count(node_name) == 1 and len(nodes) > 1:
result['join'] = 'Node is already in cluster or staged to be in cluster.'
else:
- cmd = '%s cluster join %s' % (riak_admin_bin, target_node)
+ cmd = riak_admin_bin + ['cluster', 'join', target_node]
rc, out, err = module.run_command(cmd)
if rc == 0:
result['join'] = out
@@ -184,7 +185,7 @@ def main():
module.fail_json(msg=out)
elif command == 'plan':
- cmd = '%s cluster plan' % riak_admin_bin
+ cmd = riak_admin_bin + ['cluster', 'plan']
rc, out, err = module.run_command(cmd)
if rc == 0:
result['plan'] = out
@@ -194,7 +195,7 @@ def main():
module.fail_json(msg=out)
elif command == 'commit':
- cmd = '%s cluster commit' % riak_admin_bin
+ cmd = riak_admin_bin + ['cluster', 'commit']
rc, out, err = module.run_command(cmd)
if rc == 0:
result['commit'] = out
@@ -206,7 +207,7 @@ def main():
if wait_for_handoffs:
timeout = time.time() + wait_for_handoffs
while True:
- cmd = '%s transfers' % riak_admin_bin
+ cmd = riak_admin_bin + ['transfers']
rc, out, err = module.run_command(cmd)
if 'No transfers active' in out:
result['handoffs'] = 'No transfers active.'
@@ -216,7 +217,7 @@ def main():
module.fail_json(msg='Timeout waiting for handoffs.')
if wait_for_service:
- cmd = [riak_admin_bin, 'wait_for_service', 'riak_%s' % wait_for_service, node_name]
+ cmd = riak_admin_bin + ['wait_for_service', 'riak_%s' % wait_for_service, node_name]
rc, out, err = module.run_command(cmd)
result['service'] = out
diff --git a/ansible_collections/community/general/plugins/modules/scaleway_compute.py b/ansible_collections/community/general/plugins/modules/scaleway_compute.py
index 7f85bc668..58a321505 100644
--- a/ansible_collections/community/general/plugins/modules/scaleway_compute.py
+++ b/ansible_collections/community/general/plugins/modules/scaleway_compute.py
@@ -183,6 +183,7 @@ import datetime
import time
from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.community.general.plugins.module_utils.datetime import now
from ansible_collections.community.general.plugins.module_utils.scaleway import SCALEWAY_LOCATION, scaleway_argument_spec, Scaleway
SCALEWAY_SERVER_STATES = (
@@ -235,9 +236,9 @@ def wait_to_complete_state_transition(compute_api, server, wait=None):
wait_timeout = compute_api.module.params["wait_timeout"]
wait_sleep_time = compute_api.module.params["wait_sleep_time"]
- start = datetime.datetime.utcnow()
+ start = now()
end = start + datetime.timedelta(seconds=wait_timeout)
- while datetime.datetime.utcnow() < end:
+ while now() < end:
compute_api.module.debug("We are going to wait for the server to finish its transition")
if fetch_state(compute_api, server) not in SCALEWAY_TRANSITIONS_STATES:
compute_api.module.debug("It seems that the server is not in transition anymore.")
diff --git a/ansible_collections/community/general/plugins/modules/scaleway_database_backup.py b/ansible_collections/community/general/plugins/modules/scaleway_database_backup.py
index 592ec0b7f..1d0c17fb6 100644
--- a/ansible_collections/community/general/plugins/modules/scaleway_database_backup.py
+++ b/ansible_collections/community/general/plugins/modules/scaleway_database_backup.py
@@ -170,6 +170,9 @@ import datetime
import time
from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
from ansible_collections.community.general.plugins.module_utils.scaleway import (
Scaleway,
scaleway_argument_spec,
@@ -189,9 +192,9 @@ def wait_to_complete_state_transition(module, account_api, backup=None):
if backup is None or backup['status'] in stable_states:
return backup
- start = datetime.datetime.utcnow()
+ start = now()
end = start + datetime.timedelta(seconds=wait_timeout)
- while datetime.datetime.utcnow() < end:
+ while now() < end:
module.debug('We are going to wait for the backup to finish its transition')
response = account_api.get('/rdb/v1/regions/%s/backups/%s' % (module.params.get('region'), backup['id']))
diff --git a/ansible_collections/community/general/plugins/modules/scaleway_lb.py b/ansible_collections/community/general/plugins/modules/scaleway_lb.py
index 3e43a8ae2..5bd16c3f4 100644
--- a/ansible_collections/community/general/plugins/modules/scaleway_lb.py
+++ b/ansible_collections/community/general/plugins/modules/scaleway_lb.py
@@ -161,6 +161,7 @@ RETURNS = '''
import datetime
import time
from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.community.general.plugins.module_utils.datetime import now
from ansible_collections.community.general.plugins.module_utils.scaleway import SCALEWAY_REGIONS, SCALEWAY_ENDPOINT, scaleway_argument_spec, Scaleway
STABLE_STATES = (
@@ -208,9 +209,9 @@ def wait_to_complete_state_transition(api, lb, force_wait=False):
wait_timeout = api.module.params["wait_timeout"]
wait_sleep_time = api.module.params["wait_sleep_time"]
- start = datetime.datetime.utcnow()
+ start = now()
end = start + datetime.timedelta(seconds=wait_timeout)
- while datetime.datetime.utcnow() < end:
+ while now() < end:
api.module.debug("We are going to wait for the load-balancer to finish its transition")
state = fetch_state(api, lb)
if state in STABLE_STATES:
diff --git a/ansible_collections/community/general/plugins/modules/ssh_config.py b/ansible_collections/community/general/plugins/modules/ssh_config.py
index e89e087b3..d974f4537 100644
--- a/ansible_collections/community/general/plugins/modules/ssh_config.py
+++ b/ansible_collections/community/general/plugins/modules/ssh_config.py
@@ -88,7 +88,8 @@ options:
strict_host_key_checking:
description:
- Whether to strictly check the host key when doing connections to the remote host.
- choices: [ 'yes', 'no', 'ask' ]
+ - The value V(accept-new) is supported since community.general 8.6.0.
+ choices: [ 'yes', 'no', 'ask', 'accept-new' ]
type: str
proxycommand:
description:
@@ -370,7 +371,7 @@ def main():
strict_host_key_checking=dict(
type='str',
default=None,
- choices=['yes', 'no', 'ask']
+ choices=['yes', 'no', 'ask', 'accept-new'],
),
controlmaster=dict(type='str', default=None, choices=['yes', 'no', 'ask', 'auto', 'autoask']),
controlpath=dict(type='str', default=None),
diff --git a/ansible_collections/community/general/plugins/modules/statusio_maintenance.py b/ansible_collections/community/general/plugins/modules/statusio_maintenance.py
index e6b34b709..0a96d0fb4 100644
--- a/ansible_collections/community/general/plugins/modules/statusio_maintenance.py
+++ b/ansible_collections/community/general/plugins/modules/statusio_maintenance.py
@@ -188,6 +188,10 @@ from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible.module_utils.urls import open_url
+from ansible_collections.community.general.plugins.module_utils.datetime import (
+ now,
+)
+
def get_api_auth_headers(api_id, api_key, url, statuspage):
@@ -270,11 +274,11 @@ def get_date_time(start_date, start_time, minutes):
except (NameError, ValueError):
return 1, None, "Couldn't work out a valid date"
else:
- now = datetime.datetime.utcnow()
- delta = now + datetime.timedelta(minutes=minutes)
+ now_t = now()
+ delta = now_t + datetime.timedelta(minutes=minutes)
# start_date
- returned_date.append(now.strftime("%m/%d/%Y"))
- returned_date.append(now.strftime("%H:%M"))
+ returned_date.append(now_t.strftime("%m/%d/%Y"))
+ returned_date.append(now_t.strftime("%H:%M"))
# end_date
returned_date.append(delta.strftime("%m/%d/%Y"))
returned_date.append(delta.strftime("%H:%M"))
diff --git a/ansible_collections/community/general/plugins/modules/xml.py b/ansible_collections/community/general/plugins/modules/xml.py
index a3c12b8ee..f5cdbeac3 100644
--- a/ansible_collections/community/general/plugins/modules/xml.py
+++ b/ansible_collections/community/general/plugins/modules/xml.py
@@ -436,11 +436,16 @@ def is_attribute(tree, xpath, namespaces):
""" Test if a given xpath matches and that match is an attribute
An xpath attribute search will only match one item"""
+
+ # lxml 5.1.1 removed etree._ElementStringResult, so we can no longer simply assume it's there
+ # (https://github.com/lxml/lxml/commit/eba79343d0e7ad1ce40169f60460cdd4caa29eb3)
+ ElementStringResult = getattr(etree, '_ElementStringResult', None)
+
if xpath_matches(tree, xpath, namespaces):
match = tree.xpath(xpath, namespaces=namespaces)
- if isinstance(match[0], etree._ElementStringResult):
+ if isinstance(match[0], etree._ElementUnicodeResult):
return True
- elif isinstance(match[0], etree._ElementUnicodeResult):
+ elif ElementStringResult is not None and isinstance(match[0], ElementStringResult):
return True
return False
diff --git a/ansible_collections/community/general/plugins/plugin_utils/unsafe.py b/ansible_collections/community/general/plugins/plugin_utils/unsafe.py
new file mode 100644
index 000000000..1eb61bea0
--- /dev/null
+++ b/ansible_collections/community/general/plugins/plugin_utils/unsafe.py
@@ -0,0 +1,41 @@
+# Copyright (c) 2023, Felix Fontein <felix@fontein.de>
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import re
+
+from ansible.module_utils.six import binary_type, text_type
+from ansible.module_utils.common._collections_compat import Mapping, Set
+from ansible.module_utils.common.collections import is_sequence
+from ansible.utils.unsafe_proxy import (
+ AnsibleUnsafe,
+ wrap_var as _make_unsafe,
+)
+
+_RE_TEMPLATE_CHARS = re.compile(u'[{}]')
+_RE_TEMPLATE_CHARS_BYTES = re.compile(b'[{}]')
+
+
+def make_unsafe(value):
+ if value is None or isinstance(value, AnsibleUnsafe):
+ return value
+
+ if isinstance(value, Mapping):
+ return dict((make_unsafe(key), make_unsafe(val)) for key, val in value.items())
+ elif isinstance(value, Set):
+ return set(make_unsafe(elt) for elt in value)
+ elif is_sequence(value):
+ return type(value)(make_unsafe(elt) for elt in value)
+ elif isinstance(value, binary_type):
+ if _RE_TEMPLATE_CHARS_BYTES.search(value):
+ value = _make_unsafe(value)
+ return value
+ elif isinstance(value, text_type):
+ if _RE_TEMPLATE_CHARS.search(value):
+ value = _make_unsafe(value)
+ return value
+
+ return value
diff --git a/ansible_collections/community/general/tests/integration/targets/filesystem/defaults/main.yml b/ansible_collections/community/general/tests/integration/targets/filesystem/defaults/main.yml
index ec446d241..7ff30bcd5 100644
--- a/ansible_collections/community/general/tests/integration/targets/filesystem/defaults/main.yml
+++ b/ansible_collections/community/general/tests/integration/targets/filesystem/defaults/main.yml
@@ -15,6 +15,7 @@ tested_filesystems:
# - 1.7.0 requires at least 30Mo
# - 1.10.0 requires at least 38Mo
# - resizefs asserts when initial fs is smaller than 60Mo and seems to require 1.10.0
+ bcachefs: {fssize: 20, grow: true, new_uuid: null}
ext4: {fssize: 10, grow: true, new_uuid: 'random'}
ext4dev: {fssize: 10, grow: true, new_uuid: 'random'}
ext3: {fssize: 10, grow: true, new_uuid: 'random'}
diff --git a/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/main.yml
index 0c15c2155..51361079c 100644
--- a/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/main.yml
+++ b/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/main.yml
@@ -36,7 +36,7 @@
# Not available: btrfs, lvm, f2fs, ocfs2
# All BSD systems use swap fs, but only Linux needs mkswap
# Supported: ext2/3/4 (e2fsprogs), xfs (xfsprogs), reiserfs (progsreiserfs), vfat
- - 'not (ansible_system == "FreeBSD" and item.0.key in ["btrfs", "f2fs", "swap", "lvm", "ocfs2"])'
+ - 'not (ansible_system == "FreeBSD" and item.0.key in ["bcachefs", "btrfs", "f2fs", "swap", "lvm", "ocfs2"])'
# Available on FreeBSD but not on testbed (util-linux conflicts with e2fsprogs): wipefs, mkfs.minix
- 'not (ansible_system == "FreeBSD" and item.1 in ["overwrite_another_fs", "remove_fs"])'
@@ -46,6 +46,10 @@
# Other limitations and corner cases
+ # bcachefs only on Alpine > 3.18 and Arch Linux for now
+ # other distributions have too old versions of bcachefs-tools and/or util-linux (blkid for UUID tests)
+ - 'ansible_distribution == "Alpine" and ansible_distribution_version is version("3.18", ">") and item.0.key == "bcachefs"'
+ - 'ansible_distribution == "Archlinux" and item.0.key == "bcachefs"'
# f2fs-tools and reiserfs-utils packages not available with RHEL/CentOS on CI
- 'not (ansible_distribution in ["CentOS", "RedHat"] and item.0.key in ["f2fs", "reiserfs"])'
- 'not (ansible_os_family == "RedHat" and ansible_distribution_major_version is version("8", ">=") and
diff --git a/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/setup.yml b/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/setup.yml
index 97dafaeee..77c028aca 100644
--- a/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/setup.yml
+++ b/ansible_collections/community/general/tests/integration/targets/filesystem/tasks/setup.yml
@@ -16,6 +16,16 @@
- e2fsprogs
- xfsprogs
+- name: "Install bcachefs tools"
+ ansible.builtin.package:
+ name: bcachefs-tools
+ state: present
+ when:
+ # bcachefs only on Alpine > 3.18 and Arch Linux for now
+ # other distributions have too old versions of bcachefs-tools and/or util-linux (blkid for UUID tests)
+ - ansible_distribution == "Alpine" and ansible_distribution_version is version("3.18", ">")
+ - ansible_distribution == "Archlinux"
+
- name: "Install btrfs progs"
ansible.builtin.package:
name: btrfs-progs
diff --git a/ansible_collections/community/general/tests/integration/targets/filter_from_ini/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/filter_from_ini/tasks/main.yml
index a2eca36a6..abb92dfc5 100644
--- a/ansible_collections/community/general/tests/integration/targets/filter_from_ini/tasks/main.yml
+++ b/ansible_collections/community/general/tests/integration/targets/filter_from_ini/tasks/main.yml
@@ -12,15 +12,21 @@
another_section:
connection: 'ssh'
+ interpolate_test:
+ interpolate_test_key: '%'
+
- name: 'Write INI file that reflects ini_test_dict to {{ ini_test_file }}'
ansible.builtin.copy:
dest: '{{ ini_test_file }}'
content: |
[section_name]
- key_name=key value
+ key_name = key value
[another_section]
- connection=ssh
+ connection = ssh
+
+ [interpolate_test]
+ interpolate_test_key = %
- name: 'Slurp the test file: {{ ini_test_file }}'
ansible.builtin.slurp:
diff --git a/ansible_collections/community/general/tests/integration/targets/filter_to_ini/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/filter_to_ini/tasks/main.yml
index 877d4471d..e16aa98a5 100644
--- a/ansible_collections/community/general/tests/integration/targets/filter_to_ini/tasks/main.yml
+++ b/ansible_collections/community/general/tests/integration/targets/filter_to_ini/tasks/main.yml
@@ -16,6 +16,9 @@
another_section:
connection: 'ssh'
+ interpolate_test:
+ interpolate_test_key: '%'
+
- name: 'Write INI file manually to {{ ini_test_file }}'
ansible.builtin.copy:
dest: '{{ ini_test_file }}'
@@ -26,6 +29,9 @@
[another_section]
connection = ssh
+ [interpolate_test]
+ interpolate_test_key = %
+
- name: 'Slurp the manually created test file: {{ ini_test_file }}'
ansible.builtin.slurp:
src: '{{ ini_test_file }}'
diff --git a/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/check_mode.yml b/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/check_mode.yml
index 9f52dc122..b4538200f 100644
--- a/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/check_mode.yml
+++ b/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/check_mode.yml
@@ -52,6 +52,38 @@
- removal_result is not changed
msg: "Removing an absent flatpak shall mark module execution as not changed"
+# state=latest on absent flatpak
+
+- name: Test state=latest of absent flatpak (check mode)
+ flatpak:
+ name: com.dummy.App1
+ remote: dummy-remote
+ state: latest
+ register: latest_result
+ check_mode: true
+
+- name: Verify state=latest of absent flatpak test result (check mode)
+ assert:
+ that:
+ - latest_result is changed
+ msg: "state=latest an absent flatpak shall mark module execution as changed"
+
+- name: Test non-existent idempotency of state=latest of absent flatpak (check mode)
+ flatpak:
+ name: com.dummy.App1
+ remote: dummy-remote
+ state: latest
+ register: double_latest_result
+ check_mode: true
+
+- name: Verify non-existent idempotency of state=latest of absent flatpak test result (check mode)
+ assert:
+ that:
+ - double_latest_result is changed
+ msg: |
+ state=latest an absent flatpak a second time shall still mark module execution
+ as changed in check mode
+
# state=present with url on absent flatpak
- name: Test addition of absent flatpak with url (check mode)
@@ -101,6 +133,40 @@
- url_removal_result is not changed
msg: "Removing an absent flatpak shall mark module execution as not changed"
+# state=latest with url on absent flatpak
+
+- name: Test state=latest of absent flatpak with url (check mode)
+ flatpak:
+ name: http://127.0.0.1:8000/repo/com.dummy.App1.flatpakref
+ remote: dummy-remote
+ state: latest
+ register: url_latest_result
+ check_mode: true
+
+- name: Verify state=latest of absent flatpak with url test result (check mode)
+ assert:
+ that:
+ - url_latest_result is changed
+ msg: "state=latest an absent flatpak from URL shall mark module execution as changed"
+
+- name: Test non-existent idempotency of state=latest of absent flatpak with url (check mode)
+ flatpak:
+ name: http://127.0.0.1:8000/repo/com.dummy.App1.flatpakref
+ remote: dummy-remote
+ state: latest
+ register: double_url_latest_result
+ check_mode: true
+
+- name: >
+ Verify non-existent idempotency of additionof state=latest flatpak with url test
+ result (check mode)
+ assert:
+ that:
+ - double_url_latest_result is changed
+ msg: |
+ state=latest an absent flatpak from URL a second time shall still mark module execution
+ as changed in check mode
+
# - Tests with present flatpak -------------------------------------------------
# state=present on present flatpak
@@ -149,6 +215,22 @@
Removing a present flatpak a second time shall still mark module execution
as changed in check mode
+# state=latest on present flatpak
+
+- name: Test state=latest of present flatpak (check mode)
+ flatpak:
+ name: com.dummy.App2
+ remote: dummy-remote
+ state: latest
+ register: latest_present_result
+ check_mode: true
+
+- name: Verify latest test result of present flatpak (check mode)
+ assert:
+ that:
+ - latest_present_result is changed
+ msg: "state=latest an present flatpak shall mark module execution as changed"
+
# state=present with url on present flatpak
- name: Test addition with url of present flatpak (check mode)
@@ -195,3 +277,19 @@
that:
- double_url_removal_present_result is changed
msg: Removing an absent flatpak a second time shall still mark module execution as changed
+
+# state=latest with url on present flatpak
+
+- name: Test state=latest with url of present flatpak (check mode)
+ flatpak:
+ name: http://127.0.0.1:8000/repo/com.dummy.App2.flatpakref
+ remote: dummy-remote
+ state: latest
+ register: url_latest_present_result
+ check_mode: true
+
+- name: Verify state=latest with url of present flatpak test result (check mode)
+ assert:
+ that:
+ - url_latest_present_result is changed
+ msg: "state=latest a present flatpak from URL shall mark module execution as changed"
diff --git a/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/test.yml b/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/test.yml
index 29c4efbe9..658f7b116 100644
--- a/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/test.yml
+++ b/ansible_collections/community/general/tests/integration/targets/flatpak/tasks/test.yml
@@ -65,6 +65,45 @@
- double_removal_result is not changed
msg: "state=absent shall not do anything when flatpak is not present"
+# state=latest
+
+- name: Test state=latest - {{ method }}
+ flatpak:
+ name: com.dummy.App1
+ remote: dummy-remote
+ state: present
+ method: "{{ method }}"
+ no_dependencies: true
+ register: latest_result
+
+- name: Verify state=latest test result - {{ method }}
+ assert:
+ that:
+ - latest_result is changed
+ msg: "state=latest shall add flatpak when absent"
+
+- name: Test idempotency of state=latest - {{ method }}
+ flatpak:
+ name: com.dummy.App1
+ remote: dummy-remote
+ state: present
+ method: "{{ method }}"
+ no_dependencies: true
+ register: double_latest_result
+
+- name: Verify idempotency of state=latest test result - {{ method }}
+ assert:
+ that:
+ - double_latest_result is not changed
+ msg: "state=latest shall not do anything when flatpak is already present"
+
+- name: Cleanup after state=present test - {{ method }}
+ flatpak:
+ name: com.dummy.App1
+ state: absent
+ method: "{{ method }}"
+ no_dependencies: true
+
# state=present with url as name
- name: Test addition with url - {{ method }}
@@ -152,6 +191,45 @@
method: "{{ method }}"
no_dependencies: true
+# state=latest with url as name
+
+- name: Test state=latest with url - {{ method }}
+ flatpak:
+ name: http://127.0.0.1:8000/repo/com.dummy.App1.flatpakref
+ remote: dummy-remote
+ state: latest
+ method: "{{ method }}"
+ no_dependencies: true
+ register: url_latest_result
+
+- name: Verify state=latest test result - {{ method }}
+ assert:
+ that:
+ - url_latest_result is changed
+ msg: "state=present with url as name shall add flatpak when absent"
+
+- name: Test idempotency of state=latest with url - {{ method }}
+ flatpak:
+ name: http://127.0.0.1:8000/repo/com.dummy.App1.flatpakref
+ remote: dummy-remote
+ state: latest
+ method: "{{ method }}"
+ no_dependencies: true
+ register: double_url_latest_result
+
+- name: Verify idempotency of state=latest with url test result - {{ method }}
+ assert:
+ that:
+ - double_url_latest_result is not changed
+ msg: "state=present with url as name shall not do anything when flatpak is already present"
+
+- name: Cleanup after state=present with url test - {{ method }}
+ flatpak:
+ name: com.dummy.App1
+ state: absent
+ method: "{{ method }}"
+ no_dependencies: true
+
# state=present with list of packages
- name: Test addition with list - {{ method }}
@@ -287,3 +365,84 @@
that:
- double_removal_result is not changed
msg: "state=absent shall not do anything when flatpak is not present"
+
+# state=latest with list of packages
+
+- name: Test state=latest with list - {{ method }}
+ flatpak:
+ name:
+ - com.dummy.App1
+ - http://127.0.0.1:8000/repo/com.dummy.App2.flatpakref
+ remote: dummy-remote
+ state: latest
+ method: "{{ method }}"
+ no_dependencies: true
+ register: latest_result
+
+- name: Verify state=latest with list test result - {{ method }}
+ assert:
+ that:
+ - latest_result is changed
+ msg: "state=present shall add flatpak when absent"
+
+- name: Test idempotency of state=latest with list - {{ method }}
+ flatpak:
+ name:
+ - com.dummy.App1
+ - http://127.0.0.1:8000/repo/com.dummy.App2.flatpakref
+ remote: dummy-remote
+ state: latest
+ method: "{{ method }}"
+ no_dependencies: true
+ register: double_latest_result
+
+- name: Verify idempotency of state=latest with list test result - {{ method }}
+ assert:
+ that:
+ - double_latest_result is not changed
+ msg: "state=present shall not do anything when flatpak is already present"
+
+- name: Test state=latest with list partially installed - {{ method }}
+ flatpak:
+ name:
+ - com.dummy.App1
+ - http://127.0.0.1:8000/repo/com.dummy.App2.flatpakref
+ - com.dummy.App3
+ remote: dummy-remote
+ state: latest
+ method: "{{ method }}"
+ no_dependencies: true
+ register: latest_result
+
+- name: Verify state=latest with list partially installed test result - {{ method }}
+ assert:
+ that:
+ - latest_result is changed
+ msg: "state=present shall add flatpak when absent"
+
+- name: Test idempotency of state=latest with list partially installed - {{ method }}
+ flatpak:
+ name:
+ - com.dummy.App1
+ - http://127.0.0.1:8000/repo/com.dummy.App2.flatpakref
+ - com.dummy.App3
+ remote: dummy-remote
+ state: latest
+ method: "{{ method }}"
+ no_dependencies: true
+ register: double_latest_result
+
+- name: Verify idempotency of state=latest with list partially installed test result - {{ method }}
+ assert:
+ that:
+ - double_latest_result is not changed
+ msg: "state=present shall not do anything when flatpak is already present"
+
+- name: Cleanup after state=present with list test - {{ method }}
+ flatpak:
+ name:
+ - com.dummy.App1
+ - com.dummy.App2
+ - com.dummy.App3
+ state: absent
+ method: "{{ method }}"
diff --git a/ansible_collections/community/general/tests/integration/targets/ini_file/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/ini_file/tasks/main.yml
index 0ed3c2817..8fd88074b 100644
--- a/ansible_collections/community/general/tests/integration/targets/ini_file/tasks/main.yml
+++ b/ansible_collections/community/general/tests/integration/targets/ini_file/tasks/main.yml
@@ -16,7 +16,6 @@
- name: include tasks
block:
-
- name: include tasks to perform basic tests
include_tasks: tests/00-basic.yml
@@ -50,3 +49,6 @@
- name: include tasks to test optional spaces in section headings
include_tasks: tests/07-section_name_spaces.yml
+
+ - name: include tasks to test section_has_values
+ include_tasks: tests/08-section.yml
diff --git a/ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/08-section.yml b/ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/08-section.yml
new file mode 100644
index 000000000..4f3a135e1
--- /dev/null
+++ b/ansible_collections/community/general/tests/integration/targets/ini_file/tasks/tests/08-section.yml
@@ -0,0 +1,341 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+## testing section selection
+
+- name: test-section 1 - Create starting ini file
+ copy:
+ content: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ fav = lemonade
+ beverage = pineapple juice
+
+ dest: "{{ output_file }}"
+
+- name: test-section 1 - Modify starting ini file
+ ini_file:
+ dest: "{{ output_file }}"
+ section: drinks
+ option: car
+ value: volvo
+ state: present
+ register: result1
+
+- name: test-section 1 - Read modified file
+ slurp:
+ src: "{{ output_file }}"
+ register: output_content
+
+- name: test-section 1 - Create expected result
+ set_fact:
+ expected1: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+ car = volvo
+
+ [drinks]
+ fav = lemonade
+ beverage = pineapple juice
+ output1: "{{ output_content.content | b64decode }}"
+
+- name: test-section 1 - Option was added to first section
+ assert:
+ that:
+ - result1 is changed
+ - result1.msg == 'option added'
+ - output1 == expected1
+
+# ----------------
+
+- name: test-section 2 - Create starting ini file
+ copy:
+ content: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ fav = lemonade
+ beverage = pineapple juice
+
+ dest: "{{ output_file }}"
+
+- name: test-section 2 - Modify starting ini file
+ ini_file:
+ dest: "{{ output_file }}"
+ section: drinks
+ section_has_values:
+ - option: beverage
+ value: pineapple juice
+ option: car
+ value: volvo
+ state: present
+ register: result1
+
+- name: test-section 2 - Read modified file
+ slurp:
+ src: "{{ output_file }}"
+ register: output_content
+
+- name: test-section 2 - Create expected result
+ set_fact:
+ expected1: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ fav = lemonade
+ beverage = pineapple juice
+ car = volvo
+ output1: "{{ output_content.content | b64decode }}"
+
+- name: test-section 2 - Option added to second section specified with section_has_values
+ assert:
+ that:
+ - result1 is changed
+ - result1.msg == 'option added'
+ - output1 == expected1
+
+# ----------------
+
+- name: test-section 3 - Create starting ini file
+ copy:
+ content: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ fav = lemonade
+ beverage = pineapple juice
+
+ dest: "{{ output_file }}"
+
+- name: test-section 3 - Modify starting ini file
+ ini_file:
+ dest: "{{ output_file }}"
+ section: drinks
+ section_has_values:
+ - option: beverage
+ value: pineapple juice
+ option: fav
+ value: lemonade
+ state: absent
+ register: result1
+
+- name: test-section 3 - Read modified file
+ slurp:
+ src: "{{ output_file }}"
+ register: output_content
+
+- name: test-section 3 - Create expected result
+ set_fact:
+ expected1: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ beverage = pineapple juice
+ output1: "{{ output_content.content | b64decode }}"
+
+- name: test-section 3 - Option was removed from specified section
+ assert:
+ that:
+ - result1 is changed
+ - result1.msg == 'option changed'
+ - output1 == expected1
+
+# ----------------
+
+- name: test-section 4 - Create starting ini file
+ copy:
+ content: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ fav = lemonade
+ beverage = pineapple juice
+
+ dest: "{{ output_file }}"
+
+- name: test-section 4 - Modify starting ini file
+ ini_file:
+ dest: "{{ output_file }}"
+ section: drinks
+ section_has_values:
+ - option: beverage
+ value: alligator slime
+ option: fav
+ value: tea
+ state: present
+ register: result1
+
+- name: test-section 4 - Read modified file
+ slurp:
+ src: "{{ output_file }}"
+ register: output_content
+
+- name: test-section 4 - Create expected result
+ set_fact:
+ expected1: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ fav = lemonade
+ beverage = pineapple juice
+ [drinks]
+ beverage = alligator slime
+ fav = tea
+ output1: "{{ output_content.content | b64decode }}"
+
+- name: test-section 4 - New section created, including required values
+ assert:
+ that:
+ - result1 is changed
+ - result1.msg == 'section and option added'
+ - output1 == expected1
+
+# ----------------
+
+- name: test-section 5 - Modify test-section 4 result file
+ ini_file:
+ dest: "{{ output_file }}"
+ section: drinks
+ section_has_values:
+ - option: fav
+ value: lemonade
+ - option: beverage
+ value: pineapple juice
+ state: absent
+ register: result1
+
+- name: test-section 5 - Read modified file
+ slurp:
+ src: "{{ output_file }}"
+ register: output_content
+
+- name: test-section 5 - Create expected result
+ set_fact:
+ expected1: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ beverage = alligator slime
+ fav = tea
+ output1: "{{ output_content.content | b64decode }}"
+
+- name: test-section 5 - Section removed as specified
+ assert:
+ that:
+ - result1 is changed
+ - result1.msg == 'section removed'
+ - output1 == expected1
+
+# ----------------
+
+- name: test-section 6 - Modify test-section 5 result file with multiple values
+ ini_file:
+ dest: "{{ output_file }}"
+ section: drinks
+ section_has_values:
+ - option: fav
+ values:
+ - cherry
+ - lemon
+ - vanilla
+ - option: beverage
+ value: pineapple juice
+ state: present
+ option: fav
+ values:
+ - vanilla
+ - grape
+ exclusive: false
+ register: result1
+
+- name: test-section 6 - Read modified file
+ slurp:
+ src: "{{ output_file }}"
+ register: output_content
+
+- name: test-section 6 - Create expected result
+ set_fact:
+ expected1: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ beverage = alligator slime
+ fav = tea
+ [drinks]
+ beverage = pineapple juice
+ fav = vanilla
+ fav = grape
+ fav = cherry
+ fav = lemon
+ output1: "{{ output_content.content | b64decode }}"
+
+- name: test-section 6 - New section added
+ assert:
+ that:
+ - result1 is changed
+ - result1.msg == 'section and option added'
+ - output1 == expected1
+
+# ----------------
+
+- name: test-section 7 - Modify test-section 6 result file with exclusive value
+ ini_file:
+ dest: "{{ output_file }}"
+ section: drinks
+ section_has_values:
+ - option: fav
+ value: vanilla
+ state: present
+ option: fav
+ value: cherry
+ exclusive: true
+ register: result1
+
+- name: test-section 7 - Read modified file
+ slurp:
+ src: "{{ output_file }}"
+ register: output_content
+
+- name: test-section 7 - Create expected result
+ set_fact:
+ expected1: |
+ [drinks]
+ fav = lemonade
+ beverage = orange juice
+
+ [drinks]
+ beverage = alligator slime
+ fav = tea
+ [drinks]
+ beverage = pineapple juice
+ fav = cherry
+ output1: "{{ output_content.content | b64decode }}"
+
+- name: test-section 7 - Option changed
+ assert:
+ that:
+ - result1 is changed
+ - result1.msg == 'option changed'
+ - output1 == expected1
diff --git a/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/README.md b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/README.md
new file mode 100644
index 000000000..cd1152dad
--- /dev/null
+++ b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/README.md
@@ -0,0 +1,20 @@
+<!--
+Copyright (c) Ansible Project
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+-->
+# Running keycloak_client_rolescope module integration test
+
+To run Keycloak component info module's integration test, start a keycloak server using Docker:
+
+ docker run -d --rm --name mykeycloak -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=password quay.io/keycloak/keycloak:latest start-dev --http-relative-path /auth
+
+Run integration tests:
+
+ ansible-test integration -v keycloak_client_rolescope --allow-unsupported --docker fedora35 --docker-network host
+
+Cleanup:
+
+ docker stop mykeycloak
+
+
diff --git a/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/aliases b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/aliases
new file mode 100644
index 000000000..bd1f02444
--- /dev/null
+++ b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/aliases
@@ -0,0 +1,5 @@
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+unsupported
diff --git a/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/tasks/main.yml b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/tasks/main.yml
new file mode 100644
index 000000000..8675c9548
--- /dev/null
+++ b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/tasks/main.yml
@@ -0,0 +1,317 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+- name: Wait for Keycloak
+ uri:
+ url: "{{ url }}/admin/"
+ status_code: 200
+ validate_certs: no
+ register: result
+ until: result.status == 200
+ retries: 10
+ delay: 10
+
+- name: Delete realm if exists
+ community.general.keycloak_realm:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ state: absent
+
+- name: Create realm
+ community.general.keycloak_realm:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ id: "{{ realm }}"
+ realm: "{{ realm }}"
+ state: present
+
+- name: Create a Keycloak realm role
+ community.general.keycloak_role:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ name: "{{ item }}"
+ realm: "{{ realm }}"
+ with_items:
+ - "{{ realm_role_admin }}"
+ - "{{ realm_role_user }}"
+
+- name: Client private
+ community.general.keycloak_client:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_private }}"
+ state: present
+ redirect_uris:
+ - "https://my-backend-api.c.org/"
+ fullScopeAllowed: True
+ attributes: '{{client_attributes1}}'
+ public_client: False
+
+- name: Create a Keycloak client role
+ community.general.keycloak_role:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ name: "{{ item }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_private }}"
+ with_items:
+ - "{{ client_role_admin }}"
+ - "{{ client_role_user }}"
+
+- name: Client public
+ community.general.keycloak_client:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ redirect_uris:
+ - "https://my-onepage-app-frontend.c.org/"
+ attributes: '{{client_attributes1}}'
+ full_scope_allowed: False
+ public_client: True
+
+
+- name: Map roles to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ client_scope_id: "{{ client_name_private }}"
+ role_names:
+ - "{{ client_role_admin }}"
+ - "{{ client_role_user }}"
+ register: result
+
+- name: Assert mapping created
+ assert:
+ that:
+ - result is changed
+ - result.end_state | length == 2
+
+- name: remap role user to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ client_scope_id: "{{ client_name_private }}"
+ role_names:
+ - "{{ client_role_user }}"
+ register: result
+
+- name: Assert mapping created
+ assert:
+ that:
+ - result is not changed
+ - result.end_state | length == 2
+
+- name: Remove Map role admin to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ client_scope_id: "{{ client_name_private }}"
+ role_names:
+ - "{{ client_role_admin }}"
+ state: absent
+ register: result
+
+- name: Assert mapping deleted
+ assert:
+ that:
+ - result is changed
+ - result.end_state | length == 1
+ - result.end_state[0].name == client_role_user
+
+- name: Map missing roles to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ client_scope_id: "{{ client_name_private }}"
+ role_names:
+ - "{{ client_role_admin }}"
+ - "{{ client_role_not_exists }}"
+ ignore_errors: true
+ register: result
+
+- name: Assert failed mapping missing role
+ assert:
+ that:
+ - result is failed
+
+- name: Map roles duplicate
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ client_scope_id: "{{ client_name_private }}"
+ role_names:
+ - "{{ client_role_admin }}"
+ - "{{ client_role_admin }}"
+ register: result
+
+- name: Assert result
+ assert:
+ that:
+ - result is changed
+ - result.end_state | length == 2
+
+- name: Map roles to private client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_private }}"
+ role_names:
+ - "{{ realm_role_admin }}"
+ ignore_errors: true
+ register: result
+
+- name: Assert failed mapping role to full scope client
+ assert:
+ that:
+ - result is failed
+
+- name: Map realm role to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ role_names:
+ - "{{ realm_role_admin }}"
+ register: result
+
+- name: Assert result
+ assert:
+ that:
+ - result is changed
+ - result.end_state | length == 1
+
+- name: Map two realm roles to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ role_names:
+ - "{{ realm_role_admin }}"
+ - "{{ realm_role_user }}"
+ register: result
+
+- name: Assert result
+ assert:
+ that:
+ - result is changed
+ - result.end_state | length == 2
+
+- name: Unmap all realm roles to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ role_names:
+ - "{{ realm_role_admin }}"
+ - "{{ realm_role_user }}"
+ state: absent
+ register: result
+
+- name: Assert result
+ assert:
+ that:
+ - result is changed
+ - result.end_state | length == 0
+
+- name: Map missing realm role to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ role_names:
+ - "{{ realm_role_not_exists }}"
+ ignore_errors: true
+ register: result
+
+- name: Assert failed mapping missing realm role
+ assert:
+ that:
+ - result is failed
+
+- name: Check-mode try to Map realm roles to public client
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ role_names:
+ - "{{ realm_role_admin }}"
+ - "{{ realm_role_user }}"
+ check_mode: true
+ register: result
+
+- name: Assert result
+ assert:
+ that:
+ - result is changed
+ - result.end_state | length == 2
+
+- name: Check-mode step two, check if change where applied
+ community.general.keycloak_client_rolescope:
+ auth_keycloak_url: "{{ url }}"
+ auth_realm: "{{ admin_realm }}"
+ auth_username: "{{ admin_user }}"
+ auth_password: "{{ admin_password }}"
+ realm: "{{ realm }}"
+ client_id: "{{ client_name_public }}"
+ role_names: []
+ register: result
+
+- name: Assert result
+ assert:
+ that:
+ - result is not changed
+ - result.end_state | length == 0 \ No newline at end of file
diff --git a/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/vars/main.yml b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/vars/main.yml
new file mode 100644
index 000000000..8bd59398b
--- /dev/null
+++ b/ansible_collections/community/general/tests/integration/targets/keycloak_client_rolescope/vars/main.yml
@@ -0,0 +1,26 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+url: http://localhost:8080/auth
+admin_realm: master
+admin_user: admin
+admin_password: password
+realm: myrealm
+
+
+client_name_private: backend-client-private
+client_role_admin: client-role-admin
+client_role_user: client-role-user
+client_role_not_exists: client-role-missing
+
+client_name_public: frontend-client-public
+
+
+realm_role_admin: realm-role-admin
+realm_role_user: realm-role-user
+realm_role_not_exists: client-role-missing
+
+
+client_attributes1: {"backchannel.logout.session.required": true, "backchannel.logout.revoke.offline.tokens": false, "client.secret.creation.time": 0}
diff --git a/ansible_collections/community/general/tests/integration/targets/lookup_lmdb_kv/test.yml b/ansible_collections/community/general/tests/integration/targets/lookup_lmdb_kv/test.yml
index 217c020ca..8a88bca45 100644
--- a/ansible_collections/community/general/tests/integration/targets/lookup_lmdb_kv/test.yml
+++ b/ansible_collections/community/general/tests/integration/targets/lookup_lmdb_kv/test.yml
@@ -19,13 +19,13 @@
- item.0 == 'nl'
- item.1 == 'Netherlands'
vars:
- - lmdb_kv_db: jp.mdb
+ lmdb_kv_db: jp.mdb
with_community.general.lmdb_kv:
- n*
- assert:
that:
- item == 'Belgium'
vars:
- - lmdb_kv_db: jp.mdb
+ lmdb_kv_db: jp.mdb
with_community.general.lmdb_kv:
- be
diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.18.txt b/ansible_collections/community/general/tests/sanity/ignore-2.18.txt
new file mode 100644
index 000000000..d75aaeac2
--- /dev/null
+++ b/ansible_collections/community/general/tests/sanity/ignore-2.18.txt
@@ -0,0 +1,17 @@
+plugins/modules/consul_session.py validate-modules:parameter-state-invalid-choice
+plugins/modules/homectl.py import-3.11 # Uses deprecated stdlib library 'crypt'
+plugins/modules/homectl.py import-3.12 # Uses deprecated stdlib library 'crypt'
+plugins/modules/iptables_state.py validate-modules:undocumented-parameter # params _back and _timeout used by action plugin
+plugins/modules/lxc_container.py validate-modules:use-run-command-not-popen
+plugins/modules/osx_defaults.py validate-modules:parameter-state-invalid-choice
+plugins/modules/parted.py validate-modules:parameter-state-invalid-choice
+plugins/modules/rax_files_objects.py use-argspec-type-path # module deprecated - removed in 9.0.0
+plugins/modules/rax_files.py validate-modules:parameter-state-invalid-choice # module deprecated - removed in 9.0.0
+plugins/modules/rax.py use-argspec-type-path # module deprecated - removed in 9.0.0
+plugins/modules/rhevm.py validate-modules:parameter-state-invalid-choice
+plugins/modules/udm_user.py import-3.11 # Uses deprecated stdlib library 'crypt'
+plugins/modules/udm_user.py import-3.12 # Uses deprecated stdlib library 'crypt'
+plugins/modules/xfconf.py validate-modules:return-syntax-error
+plugins/module_utils/univention_umc.py pylint:use-yield-from # suggested construct does not work with Python 2
+tests/unit/compat/mock.py pylint:use-yield-from # suggested construct does not work with Python 2
+tests/unit/plugins/modules/test_gio_mime.yaml no-smart-quotes
diff --git a/ansible_collections/community/general/tests/sanity/ignore-2.18.txt.license b/ansible_collections/community/general/tests/sanity/ignore-2.18.txt.license
new file mode 100644
index 000000000..edff8c768
--- /dev/null
+++ b/ansible_collections/community/general/tests/sanity/ignore-2.18.txt.license
@@ -0,0 +1,3 @@
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+SPDX-FileCopyrightText: Ansible Project
diff --git a/ansible_collections/community/general/tests/unit/plugins/callback/test_loganalytics.py b/ansible_collections/community/general/tests/unit/plugins/callback/test_loganalytics.py
index 17932ed5f..4d7c2c9db 100644
--- a/ansible_collections/community/general/tests/unit/plugins/callback/test_loganalytics.py
+++ b/ansible_collections/community/general/tests/unit/plugins/callback/test_loganalytics.py
@@ -9,8 +9,8 @@ from ansible.executor.task_result import TaskResult
from ansible_collections.community.general.tests.unit.compat import unittest
from ansible_collections.community.general.tests.unit.compat.mock import patch, Mock
from ansible_collections.community.general.plugins.callback.loganalytics import AzureLogAnalyticsSource
-from datetime import datetime
+from datetime import datetime
import json
import sys
@@ -32,10 +32,10 @@ class TestAzureLogAnalytics(unittest.TestCase):
if sys.version_info < (3, 2):
self.assertRegex = self.assertRegexpMatches
- @patch('ansible_collections.community.general.plugins.callback.loganalytics.datetime')
+ @patch('ansible_collections.community.general.plugins.callback.loganalytics.now')
@patch('ansible_collections.community.general.plugins.callback.loganalytics.open_url')
- def test_overall(self, open_url_mock, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2020, 12, 1)
+ def test_overall(self, open_url_mock, mock_now):
+ mock_now.return_value = datetime(2020, 12, 1)
result = TaskResult(host=self.mock_host, task=self.mock_task, return_data={}, task_fields=self.task_fields)
self.loganalytics.send_event(workspace_id='01234567-0123-0123-0123-01234567890a',
@@ -52,10 +52,10 @@ class TestAzureLogAnalytics(unittest.TestCase):
self.assertEqual(sent_data['event']['uuid'], 'myuuid')
self.assertEqual(args[0], 'https://01234567-0123-0123-0123-01234567890a.ods.opinsights.azure.com/api/logs?api-version=2016-04-01')
- @patch('ansible_collections.community.general.plugins.callback.loganalytics.datetime')
+ @patch('ansible_collections.community.general.plugins.callback.loganalytics.now')
@patch('ansible_collections.community.general.plugins.callback.loganalytics.open_url')
- def test_auth_headers(self, open_url_mock, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2020, 12, 1)
+ def test_auth_headers(self, open_url_mock, mock_now):
+ mock_now.return_value = datetime(2020, 12, 1)
result = TaskResult(host=self.mock_host, task=self.mock_task, return_data={}, task_fields=self.task_fields)
self.loganalytics.send_event(workspace_id='01234567-0123-0123-0123-01234567890a',
diff --git a/ansible_collections/community/general/tests/unit/plugins/callback/test_splunk.py b/ansible_collections/community/general/tests/unit/plugins/callback/test_splunk.py
index ddcdae24c..c09540fc0 100644
--- a/ansible_collections/community/general/tests/unit/plugins/callback/test_splunk.py
+++ b/ansible_collections/community/general/tests/unit/plugins/callback/test_splunk.py
@@ -27,10 +27,10 @@ class TestSplunkClient(unittest.TestCase):
self.mock_host = Mock('MockHost')
self.mock_host.name = 'myhost'
- @patch('ansible_collections.community.general.plugins.callback.splunk.datetime')
+ @patch('ansible_collections.community.general.plugins.callback.splunk.now')
@patch('ansible_collections.community.general.plugins.callback.splunk.open_url')
- def test_timestamp_with_milliseconds(self, open_url_mock, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2020, 12, 1)
+ def test_timestamp_with_milliseconds(self, open_url_mock, mock_now):
+ mock_now.return_value = datetime(2020, 12, 1)
result = TaskResult(host=self.mock_host, task=self.mock_task, return_data={}, task_fields=self.task_fields)
self.splunk.send_event(
@@ -45,10 +45,10 @@ class TestSplunkClient(unittest.TestCase):
self.assertEqual(sent_data['event']['host'], 'my-host')
self.assertEqual(sent_data['event']['ip_address'], '1.2.3.4')
- @patch('ansible_collections.community.general.plugins.callback.splunk.datetime')
+ @patch('ansible_collections.community.general.plugins.callback.splunk.now')
@patch('ansible_collections.community.general.plugins.callback.splunk.open_url')
- def test_timestamp_without_milliseconds(self, open_url_mock, mock_datetime):
- mock_datetime.utcnow.return_value = datetime(2020, 12, 1)
+ def test_timestamp_without_milliseconds(self, open_url_mock, mock_now):
+ mock_now.return_value = datetime(2020, 12, 1)
result = TaskResult(host=self.mock_host, task=self.mock_task, return_data={}, task_fields=self.task_fields)
self.splunk.send_event(
diff --git a/ansible_collections/community/general/tests/unit/plugins/lookup/test_bitwarden.py b/ansible_collections/community/general/tests/unit/plugins/lookup/test_bitwarden.py
index 9270dd44e..04cad8d6c 100644
--- a/ansible_collections/community/general/tests/unit/plugins/lookup/test_bitwarden.py
+++ b/ansible_collections/community/general/tests/unit/plugins/lookup/test_bitwarden.py
@@ -6,6 +6,7 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
+import re
from ansible_collections.community.general.tests.unit.compat import unittest
from ansible_collections.community.general.tests.unit.compat.mock import patch
@@ -13,8 +14,10 @@ from ansible.errors import AnsibleError
from ansible.module_utils import six
from ansible.plugins.loader import lookup_loader
from ansible_collections.community.general.plugins.lookup.bitwarden import Bitwarden
+from ansible.parsing.ajson import AnsibleJSONEncoder
MOCK_COLLECTION_ID = "3b12a9da-7c49-40b8-ad33-aede017a7ead"
+MOCK_ORGANIZATION_ID = "292ba0c6-f289-11ee-9301-ef7b639ccd2a"
MOCK_RECORDS = [
{
@@ -48,7 +51,7 @@ MOCK_RECORDS = [
"name": "a_test",
"notes": None,
"object": "item",
- "organizationId": None,
+ "organizationId": MOCK_ORGANIZATION_ID,
"passwordHistory": [
{
"lastUsedDate": "2022-07-26T23:03:23.405Z",
@@ -68,9 +71,7 @@ MOCK_RECORDS = [
"type": 1
},
{
- "collectionIds": [
- MOCK_COLLECTION_ID
- ],
+ "collectionIds": [],
"deletedDate": None,
"favorite": False,
"folderId": None,
@@ -106,10 +107,30 @@ MOCK_RECORDS = [
"name": "dupe_name",
"notes": None,
"object": "item",
- "organizationId": None,
+ "organizationId": MOCK_ORGANIZATION_ID,
"reprompt": 0,
"revisionDate": "2022-07-27T03:42:46.673Z",
"type": 1
+ },
+ {
+ "collectionIds": [],
+ "deletedDate": None,
+ "favorite": False,
+ "folderId": None,
+ "id": "2bf517be-fb13-11ee-be89-a345aa369a94",
+ "login": {
+ "password": "e",
+ "passwordRevisionDate": None,
+ "totp": None,
+ "username": "f"
+ },
+ "name": "non_collection_org_record",
+ "notes": None,
+ "object": "item",
+ "organizationId": MOCK_ORGANIZATION_ID,
+ "reprompt": 0,
+ "revisionDate": "2024-14-15T11:30:00.000Z",
+ "type": 1
}
]
@@ -118,11 +139,41 @@ class MockBitwarden(Bitwarden):
unlocked = True
- def _get_matches(self, search_value=None, search_field="name", collection_id=None):
- if not search_value and collection_id:
- return list(filter(lambda record: collection_id in record['collectionIds'], MOCK_RECORDS))
+ def _run(self, args, stdin=None, expected_rc=0):
+ if args[0] == 'get':
+ if args[1] == 'item':
+ for item in MOCK_RECORDS:
+ if item.get('id') == args[2]:
+ return AnsibleJSONEncoder().encode(item), ''
+ if args[0] == 'list':
+ if args[1] == 'items':
+ try:
+ search_value = args[args.index('--search') + 1]
+ except ValueError:
+ search_value = None
+
+ try:
+ collection_to_filter = args[args.index('--collectionid') + 1]
+ except ValueError:
+ collection_to_filter = None
+
+ try:
+ organization_to_filter = args[args.index('--organizationid') + 1]
+ except ValueError:
+ organization_to_filter = None
+
+ items = []
+ for item in MOCK_RECORDS:
+ if search_value and not re.search(search_value, item.get('name')):
+ continue
+ if collection_to_filter and collection_to_filter not in item.get('collectionIds', []):
+ continue
+ if organization_to_filter and item.get('organizationId') != organization_to_filter:
+ continue
+ items.append(item)
+ return AnsibleJSONEncoder().encode(items), ''
- return list(filter(lambda record: record[search_field] == search_value, MOCK_RECORDS))
+ return '[]', ''
class LoggedOutMockBitwarden(MockBitwarden):
@@ -194,4 +245,19 @@ class TestLookupModule(unittest.TestCase):
@patch('ansible_collections.community.general.plugins.lookup.bitwarden._bitwarden', new=MockBitwarden())
def test_bitwarden_plugin_full_collection(self):
# Try to retrieve the full records of the given collection.
- self.assertEqual(MOCK_RECORDS, self.lookup.run(None, collection_id=MOCK_COLLECTION_ID)[0])
+ self.assertEqual([MOCK_RECORDS[0], MOCK_RECORDS[2]], self.lookup.run(None, collection_id=MOCK_COLLECTION_ID)[0])
+
+ @patch('ansible_collections.community.general.plugins.lookup.bitwarden._bitwarden', new=MockBitwarden())
+ def test_bitwarden_plugin_full_organization(self):
+ self.assertEqual([MOCK_RECORDS[0], MOCK_RECORDS[2], MOCK_RECORDS[3]],
+ self.lookup.run(None, organization_id=MOCK_ORGANIZATION_ID)[0])
+
+ @patch('ansible_collections.community.general.plugins.lookup.bitwarden._bitwarden', new=MockBitwarden())
+ def test_bitwarden_plugin_filter_organization(self):
+ self.assertEqual([MOCK_RECORDS[2]],
+ self.lookup.run(['dupe_name'], organization_id=MOCK_ORGANIZATION_ID)[0])
+
+ @patch('ansible_collections.community.general.plugins.lookup.bitwarden._bitwarden', new=MockBitwarden())
+ def test_bitwarden_plugin_full_collection_organization(self):
+ self.assertEqual([MOCK_RECORDS[0], MOCK_RECORDS[2]], self.lookup.run(None,
+ collection_id=MOCK_COLLECTION_ID, organization_id=MOCK_ORGANIZATION_ID)[0])
diff --git a/ansible_collections/community/hrobot/.github/workflows/ansible-test.yml b/ansible_collections/community/hrobot/.github/workflows/ansible-test.yml
index 1e66b7d29..6aadd1b4f 100644
--- a/ansible_collections/community/hrobot/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/hrobot/.github/workflows/ansible-test.yml
@@ -34,6 +34,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
# Ansible-test on various stable branches does not yet work well with cgroups v2.
# Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04
@@ -75,6 +76,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
steps:
diff --git a/ansible_collections/community/hrobot/.github/workflows/docs-pr.yml b/ansible_collections/community/hrobot/.github/workflows/docs-pr.yml
index c5d5c24b5..3d1b87a86 100644
--- a/ansible_collections/community/hrobot/.github/workflows/docs-pr.yml
+++ b/ansible_collections/community/hrobot/.github/workflows/docs-pr.yml
@@ -32,6 +32,7 @@ jobs:
documentation_home_url=https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/branch/main/
squash-hierarchy: true
render-file-line: '> * `$<status>` [$<path_tail>](https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr/${{ github.event.number }}/$<path_tail>)'
+ extra-collections: community.library_inventory_filtering_v1
publish-docs-gh-pages:
# for now we won't run this on forks
diff --git a/ansible_collections/community/hrobot/.github/workflows/docs-push.yml b/ansible_collections/community/hrobot/.github/workflows/docs-push.yml
index e1db3c2eb..783ff30e1 100644
--- a/ansible_collections/community/hrobot/.github/workflows/docs-push.yml
+++ b/ansible_collections/community/hrobot/.github/workflows/docs-push.yml
@@ -37,6 +37,7 @@ jobs:
init-extra-html-theme-options: |
documentation_home_url=https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/branch/main/
squash-hierarchy: true
+ extra-collections: community.library_inventory_filtering_v1
publish-docs-gh-pages:
# for now we won't run this on forks
diff --git a/ansible_collections/community/hrobot/CHANGELOG.md b/ansible_collections/community/hrobot/CHANGELOG.md
index d09d85be0..fec73109e 100644
--- a/ansible_collections/community/hrobot/CHANGELOG.md
+++ b/ansible_collections/community/hrobot/CHANGELOG.md
@@ -2,74 +2,90 @@
**Topics**
-- <a href="#v1-9-1">v1\.9\.1</a>
+- <a href="#v1-9-2">v1\.9\.2</a>
- <a href="#release-summary">Release Summary</a>
+ - <a href="#bugfixes">Bugfixes</a>
+- <a href="#v1-9-1">v1\.9\.1</a>
+ - <a href="#release-summary-1">Release Summary</a>
- <a href="#security-fixes">Security Fixes</a>
- <a href="#v1-9-0">v1\.9\.0</a>
- - <a href="#release-summary-1">Release Summary</a>
+ - <a href="#release-summary-2">Release Summary</a>
- <a href="#minor-changes">Minor Changes</a>
- <a href="#deprecated-features">Deprecated Features</a>
- <a href="#v1-8-2">v1\.8\.2</a>
- - <a href="#release-summary-2">Release Summary</a>
- - <a href="#bugfixes">Bugfixes</a>
-- <a href="#v1-8-1">v1\.8\.1</a>
- <a href="#release-summary-3">Release Summary</a>
+ - <a href="#bugfixes-1">Bugfixes</a>
+- <a href="#v1-8-1">v1\.8\.1</a>
+ - <a href="#release-summary-4">Release Summary</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#v1-8-0">v1\.8\.0</a>
- - <a href="#release-summary-4">Release Summary</a>
+ - <a href="#release-summary-5">Release Summary</a>
- <a href="#major-changes">Major Changes</a>
- <a href="#minor-changes-1">Minor Changes</a>
- <a href="#v1-7-0">v1\.7\.0</a>
- - <a href="#release-summary-5">Release Summary</a>
+ - <a href="#release-summary-6">Release Summary</a>
- <a href="#new-modules">New Modules</a>
- <a href="#v1-6-0">v1\.6\.0</a>
- - <a href="#release-summary-6">Release Summary</a>
+ - <a href="#release-summary-7">Release Summary</a>
- <a href="#minor-changes-2">Minor Changes</a>
- <a href="#v1-5-2">v1\.5\.2</a>
- - <a href="#release-summary-7">Release Summary</a>
+ - <a href="#release-summary-8">Release Summary</a>
- <a href="#minor-changes-3">Minor Changes</a>
- <a href="#v1-5-1">v1\.5\.1</a>
- - <a href="#release-summary-8">Release Summary</a>
-- <a href="#v1-5-0">v1\.5\.0</a>
- <a href="#release-summary-9">Release Summary</a>
+- <a href="#v1-5-0">v1\.5\.0</a>
+ - <a href="#release-summary-10">Release Summary</a>
- <a href="#minor-changes-4">Minor Changes</a>
- <a href="#v1-4-0">v1\.4\.0</a>
- - <a href="#release-summary-10">Release Summary</a>
+ - <a href="#release-summary-11">Release Summary</a>
- <a href="#minor-changes-5">Minor Changes</a>
- <a href="#v1-3-1">v1\.3\.1</a>
- - <a href="#release-summary-11">Release Summary</a>
- - <a href="#bugfixes-1">Bugfixes</a>
-- <a href="#v1-3-0">v1\.3\.0</a>
- <a href="#release-summary-12">Release Summary</a>
- - <a href="#minor-changes-6">Minor Changes</a>
- <a href="#bugfixes-2">Bugfixes</a>
-- <a href="#v1-2-3">v1\.2\.3</a>
+- <a href="#v1-3-0">v1\.3\.0</a>
- <a href="#release-summary-13">Release Summary</a>
-- <a href="#v1-2-2">v1\.2\.2</a>
- - <a href="#release-summary-14">Release Summary</a>
+ - <a href="#minor-changes-6">Minor Changes</a>
- <a href="#bugfixes-3">Bugfixes</a>
-- <a href="#v1-2-1">v1\.2\.1</a>
+- <a href="#v1-2-3">v1\.2\.3</a>
+ - <a href="#release-summary-14">Release Summary</a>
+- <a href="#v1-2-2">v1\.2\.2</a>
- <a href="#release-summary-15">Release Summary</a>
+ - <a href="#bugfixes-4">Bugfixes</a>
+- <a href="#v1-2-1">v1\.2\.1</a>
+ - <a href="#release-summary-16">Release Summary</a>
- <a href="#minor-changes-7">Minor Changes</a>
- <a href="#v1-2-0">v1\.2\.0</a>
- - <a href="#release-summary-16">Release Summary</a>
+ - <a href="#release-summary-17">Release Summary</a>
- <a href="#minor-changes-8">Minor Changes</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#v1-1-1">v1\.1\.1</a>
- - <a href="#release-summary-17">Release Summary</a>
- - <a href="#bugfixes-4">Bugfixes</a>
-- <a href="#v1-1-0">v1\.1\.0</a>
- <a href="#release-summary-18">Release Summary</a>
+ - <a href="#bugfixes-5">Bugfixes</a>
+- <a href="#v1-1-0">v1\.1\.0</a>
+ - <a href="#release-summary-19">Release Summary</a>
- <a href="#new-plugins">New Plugins</a>
- <a href="#inventory">Inventory</a>
- <a href="#v1-0-0">v1\.0\.0</a>
- - <a href="#release-summary-19">Release Summary</a>
+ - <a href="#release-summary-20">Release Summary</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
+<a id="v1-9-2"></a>
+## v1\.9\.2
+
+<a id="release-summary"></a>
+### Release Summary
+
+Bugfix release\.
+
+<a id="bugfixes"></a>
+### Bugfixes
+
+* inventory plugins \- add unsafe wrapper to avoid marking strings that do not contain <code>\{</code> or <code>\}</code> as unsafe\, to work around a bug in AWX \([https\://github\.com/ansible\-collections/community\.hrobot/pull/102](https\://github\.com/ansible\-collections/community\.hrobot/pull/102)\)\.
+
<a id="v1-9-1"></a>
## v1\.9\.1
-<a id="release-summary"></a>
+<a id="release-summary-1"></a>
### Release Summary
Bugfix release\.
@@ -82,7 +98,7 @@ Bugfix release\.
<a id="v1-9-0"></a>
## v1\.9\.0
-<a id="release-summary-1"></a>
+<a id="release-summary-2"></a>
### Release Summary
Feature and maintenance release\.
@@ -100,12 +116,12 @@ Feature and maintenance release\.
<a id="v1-8-2"></a>
## v1\.8\.2
-<a id="release-summary-2"></a>
+<a id="release-summary-3"></a>
### Release Summary
Maintenance release with updated documentation\.
-<a id="bugfixes"></a>
+<a id="bugfixes-1"></a>
### Bugfixes
* Show more information \(if available\) from error messages \([https\://github\.com/ansible\-collections/community\.hrobot/pull/89](https\://github\.com/ansible\-collections/community\.hrobot/pull/89)\)\.
@@ -113,7 +129,7 @@ Maintenance release with updated documentation\.
<a id="v1-8-1"></a>
## v1\.8\.1
-<a id="release-summary-3"></a>
+<a id="release-summary-4"></a>
### Release Summary
Maintenance release with updated documentation\.
@@ -134,7 +150,7 @@ for the rendered HTML version of the documentation of the latest release\.
<a id="v1-8-0"></a>
## v1\.8\.0
-<a id="release-summary-4"></a>
+<a id="release-summary-5"></a>
### Release Summary
Feature release for the Hetzner firewall changes\.
@@ -153,7 +169,7 @@ Feature release for the Hetzner firewall changes\.
<a id="v1-7-0"></a>
## v1\.7\.0
-<a id="release-summary-5"></a>
+<a id="release-summary-6"></a>
### Release Summary
Feature release\.
@@ -166,7 +182,7 @@ Feature release\.
<a id="v1-6-0"></a>
## v1\.6\.0
-<a id="release-summary-6"></a>
+<a id="release-summary-7"></a>
### Release Summary
Feature release with improved documentation\.
@@ -179,7 +195,7 @@ Feature release with improved documentation\.
<a id="v1-5-2"></a>
## v1\.5\.2
-<a id="release-summary-7"></a>
+<a id="release-summary-8"></a>
### Release Summary
Maintenance release with a documentation improvement\.
@@ -192,7 +208,7 @@ Maintenance release with a documentation improvement\.
<a id="v1-5-1"></a>
## v1\.5\.1
-<a id="release-summary-8"></a>
+<a id="release-summary-9"></a>
### Release Summary
Maintenance release with small documentation fixes\.
@@ -200,7 +216,7 @@ Maintenance release with small documentation fixes\.
<a id="v1-5-0"></a>
## v1\.5\.0
-<a id="release-summary-9"></a>
+<a id="release-summary-10"></a>
### Release Summary
Maintenance release changing the way licenses are declared\. No functional changes\.
@@ -213,7 +229,7 @@ Maintenance release changing the way licenses are declared\. No functional chang
<a id="v1-4-0"></a>
## v1\.4\.0
-<a id="release-summary-10"></a>
+<a id="release-summary-11"></a>
### Release Summary
Feature release\.
@@ -226,12 +242,12 @@ Feature release\.
<a id="v1-3-1"></a>
## v1\.3\.1
-<a id="release-summary-11"></a>
+<a id="release-summary-12"></a>
### Release Summary
Maintenance release\.
-<a id="bugfixes-1"></a>
+<a id="bugfixes-2"></a>
### Bugfixes
* Include <code>simplified\_bsd\.txt</code> license file for the <code>robot</code> and <code>failover</code> module utils\.
@@ -239,7 +255,7 @@ Maintenance release\.
<a id="v1-3-0"></a>
## v1\.3\.0
-<a id="release-summary-12"></a>
+<a id="release-summary-13"></a>
### Release Summary
Feature and bugfix release\.
@@ -249,7 +265,7 @@ Feature and bugfix release\.
* Prepare collection for inclusion in an Execution Environment by declaring its dependencies \([https\://github\.com/ansible\-collections/community\.hrobot/pull/45](https\://github\.com/ansible\-collections/community\.hrobot/pull/45)\)\.
-<a id="bugfixes-2"></a>
+<a id="bugfixes-3"></a>
### Bugfixes
* robot inventory plugin \- do not crash if a server neither has name or primary IP set\. Instead\, fall back to using the server\'s number as the name\. This can happen if unnamed rack reservations show up in your server list \([https\://github\.com/ansible\-collections/community\.hrobot/issues/40](https\://github\.com/ansible\-collections/community\.hrobot/issues/40)\, [https\://github\.com/ansible\-collections/community\.hrobot/pull/47](https\://github\.com/ansible\-collections/community\.hrobot/pull/47)\)\.
@@ -257,7 +273,7 @@ Feature and bugfix release\.
<a id="v1-2-3"></a>
## v1\.2\.3
-<a id="release-summary-13"></a>
+<a id="release-summary-14"></a>
### Release Summary
Docs update release\.
@@ -265,12 +281,12 @@ Docs update release\.
<a id="v1-2-2"></a>
## v1\.2\.2
-<a id="release-summary-14"></a>
+<a id="release-summary-15"></a>
### Release Summary
Bugfix release\.
-<a id="bugfixes-3"></a>
+<a id="bugfixes-4"></a>
### Bugfixes
* boot \- fix incorrect handling of SSH authorized keys \([https\://github\.com/ansible\-collections/community\.hrobot/issues/32](https\://github\.com/ansible\-collections/community\.hrobot/issues/32)\, [https\://github\.com/ansible\-collections/community\.hrobot/pull/33](https\://github\.com/ansible\-collections/community\.hrobot/pull/33)\)\.
@@ -278,7 +294,7 @@ Bugfix release\.
<a id="v1-2-1"></a>
## v1\.2\.1
-<a id="release-summary-15"></a>
+<a id="release-summary-16"></a>
### Release Summary
Maintenance release\.
@@ -291,7 +307,7 @@ Maintenance release\.
<a id="v1-2-0"></a>
## v1\.2\.0
-<a id="release-summary-16"></a>
+<a id="release-summary-17"></a>
### Release Summary
Feature release with multiple new modules\.
@@ -318,12 +334,12 @@ Feature release with multiple new modules\.
<a id="v1-1-1"></a>
## v1\.1\.1
-<a id="release-summary-17"></a>
+<a id="release-summary-18"></a>
### Release Summary
Bugfix release which reduces the number of HTTPS queries for the modules and plugins\.
-<a id="bugfixes-4"></a>
+<a id="bugfixes-5"></a>
### Bugfixes
* robot \- force HTTP basic authentication to reduce number of HTTPS requests \([https\://github\.com/ansible\-collections/community\.hrobot/pull/9](https\://github\.com/ansible\-collections/community\.hrobot/pull/9)\)\.
@@ -331,7 +347,7 @@ Bugfix release which reduces the number of HTTPS queries for the modules and plu
<a id="v1-1-0"></a>
## v1\.1\.0
-<a id="release-summary-18"></a>
+<a id="release-summary-19"></a>
### Release Summary
Release with a new inventory plugin\.
@@ -347,7 +363,7 @@ Release with a new inventory plugin\.
<a id="v1-0-0"></a>
## v1\.0\.0
-<a id="release-summary-19"></a>
+<a id="release-summary-20"></a>
### Release Summary
The <code>community\.hrobot</code> continues the work on the Hetzner Robot modules from their state in <code>community\.general</code> 1\.2\.0\. The changes listed here are thus relative to the modules <code>community\.general\.hetzner\_\*</code>\.
diff --git a/ansible_collections/community/hrobot/CHANGELOG.rst b/ansible_collections/community/hrobot/CHANGELOG.rst
index 847d3dbda..fdb9c4a23 100644
--- a/ansible_collections/community/hrobot/CHANGELOG.rst
+++ b/ansible_collections/community/hrobot/CHANGELOG.rst
@@ -4,6 +4,19 @@ Community Hetzner Robot Collection Release Notes
.. contents:: Topics
+v1.9.2
+======
+
+Release Summary
+---------------
+
+Bugfix release.
+
+Bugfixes
+--------
+
+- inventory plugins - add unsafe wrapper to avoid marking strings that do not contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.hrobot/pull/102).
+
v1.9.1
======
diff --git a/ansible_collections/community/hrobot/FILES.json b/ansible_collections/community/hrobot/FILES.json
index 54c28f1e6..e5964a9b0 100644
--- a/ansible_collections/community/hrobot/FILES.json
+++ b/ansible_collections/community/hrobot/FILES.json
@@ -25,21 +25,21 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b221558d1b9e91f2f1b3087eca7455efea6016a313388315d94c748a736f6d0c",
+ "chksum_sha256": "6745e283a9f1578108ad5f14efed6558cdfb1a25c5e04426836b343baa7f1ccc",
"format": 1
},
{
"name": ".github/workflows/docs-pr.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "369ffbe6357397daf6ef60448f249fc74a2ccd0c023bb37e956f29f1107087a0",
+ "chksum_sha256": "7d4d4e79b974e499d22506e1dae74806636da815166fcd615d0a0d728290370a",
"format": 1
},
{
"name": ".github/workflows/docs-push.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a37437b4ac5178def5765173891f1cc0b5562f833d0fabfe8f2dca166cdae6b4",
+ "chksum_sha256": "1404c05e77bda38b2061314876ed1d9f7e426b281d69f7b588d52b83b740f46e",
"format": 1
},
{
@@ -137,7 +137,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7bb1dd839047930188a470f49ab846872b8b5fed15a0ad79f2a4f6badc7ca08f",
+ "chksum_sha256": "e941d53c423339dae173424865a5f4e2c892aa52818bebd6999d2444ff2188a3",
"format": 1
},
{
@@ -169,6 +169,13 @@
"format": 1
},
{
+ "name": "docs/docsite/config.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0c5ec9ff76cf4db33b5d3f771419ef50d448e5d510cb7a98fc07dd9ecee69c4e",
+ "format": 1
+ },
+ {
"name": "docs/docsite/links.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -235,7 +242,7 @@
"name": "plugins/inventory/robot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "08386e031100da8e3ae8d8a76fdf511b71ebce6d5b9648dc24f32784ee497fda",
+ "chksum_sha256": "9ebb90b3fa1ce6a294b1d56b7d943e86ada342b9e288bdd416bde2e39e9989db",
"format": 1
},
{
@@ -351,6 +358,20 @@
"format": 1
},
{
+ "name": "plugins/plugin_utils",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "plugins/plugin_utils/unsafe.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "93ccc2e18634405c7ff21a91a1df4f17261ac24b0f41bf3c46dbec2f254538c3",
+ "format": 1
+ },
+ {
"name": "tests",
"ftype": "dir",
"chksum_type": null,
@@ -610,6 +631,20 @@
"format": 1
},
{
+ "name": "tests/sanity/ignore-2.18.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5264853edb2c6ff138f5496111c1e758a3a54b61e82d96c0072cb9429fb31c6e",
+ "format": 1
+ },
+ {
+ "name": "tests/sanity/ignore-2.18.txt.license",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1",
+ "format": 1
+ },
+ {
"name": "tests/sanity/ignore-2.9.txt",
"ftype": "file",
"chksum_type": "sha256",
@@ -648,7 +683,7 @@
"name": "tests/unit/plugins/inventory/test_robot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "673ffae43e3a3584719643a42bbdd33321b2b8331629a9d069793c3925d21c35",
+ "chksum_sha256": "e77768bf19cc0b1743641419d4b0360b6725b8dbb4e79d2ecacfac69d0886db9",
"format": 1
},
{
@@ -788,7 +823,7 @@
"name": "CHANGELOG.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c4facb0c77d486fd61f1ea78cd2bee7c6cf833fc4dd328b57a9a440efe43db3",
+ "chksum_sha256": "ec9612359cac38411b264cb53d67607a383a08d1a2bffc3ff84cdb1d9ad1de4c",
"format": 1
},
{
@@ -802,7 +837,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ca10d6a2a30e1165b9325897d7c6335ff8b3a50859742e2e4333070df0e6c38f",
+ "chksum_sha256": "84b7a7e9f7b8280abe9151db53d4fc3235b37db19686030e8d8fd000513e41ad",
"format": 1
},
{
@@ -823,7 +858,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b26ea8090f24cde8afb282f7779abf6ce363edbf65068631c38984c5ed51ba70",
+ "chksum_sha256": "df4f5e5e0c88eb6caf14a6b2d3916a5849ac18a2ee6c748d0276d1788d145911",
"format": 1
},
{
diff --git a/ansible_collections/community/hrobot/MANIFEST.json b/ansible_collections/community/hrobot/MANIFEST.json
index 5fd6295d8..1ac2e2da3 100644
--- a/ansible_collections/community/hrobot/MANIFEST.json
+++ b/ansible_collections/community/hrobot/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "hrobot",
- "version": "1.9.1",
+ "version": "1.9.2",
"authors": [
"Felix Fontein (github.com/felixfontein)"
],
@@ -30,7 +30,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cada2fa56571e4857ace197d0dd1c09e665fdd718cea048c0327ba8ef3447245",
+ "chksum_sha256": "a5c77f86ec2889eb57623d0ccd7ffbae9635537c46dc4539324e8da92b7ddf27",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/hrobot/README.md b/ansible_collections/community/hrobot/README.md
index 44ee9ddcd..bdc481de9 100644
--- a/ansible_collections/community/hrobot/README.md
+++ b/ansible_collections/community/hrobot/README.md
@@ -15,7 +15,7 @@ Please note that this collection does **not** support Windows targets.
## Tested with Ansible
-Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, and ansible-core 2.16 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
+Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, and ansible-core 2.17 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
## External requirements
diff --git a/ansible_collections/community/hrobot/changelogs/changelog.yaml b/ansible_collections/community/hrobot/changelogs/changelog.yaml
index ff49e627a..eca36fc8f 100644
--- a/ansible_collections/community/hrobot/changelogs/changelog.yaml
+++ b/ansible_collections/community/hrobot/changelogs/changelog.yaml
@@ -280,3 +280,13 @@ releases:
- 1.9.1.yml
- inventory-rce.yml
release_date: '2024-03-16'
+ 1.9.2:
+ changes:
+ bugfixes:
+ - inventory plugins - add unsafe wrapper to avoid marking strings that do not
+ contain ``{`` or ``}`` as unsafe, to work around a bug in AWX (https://github.com/ansible-collections/community.hrobot/pull/102).
+ release_summary: Bugfix release.
+ fragments:
+ - 1.9.2.yml
+ - 102-unsafe.yml
+ release_date: '2024-04-16'
diff --git a/ansible_collections/community/hrobot/docs/docsite/config.yml b/ansible_collections/community/hrobot/docs/docsite/config.yml
new file mode 100644
index 000000000..1d6cf8554
--- /dev/null
+++ b/ansible_collections/community/hrobot/docs/docsite/config.yml
@@ -0,0 +1,7 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+changelog:
+ write_changelog: true
diff --git a/ansible_collections/community/hrobot/plugins/inventory/robot.py b/ansible_collections/community/hrobot/plugins/inventory/robot.py
index 19a2f1aa4..409c90992 100644
--- a/ansible_collections/community/hrobot/plugins/inventory/robot.py
+++ b/ansible_collections/community/hrobot/plugins/inventory/robot.py
@@ -85,13 +85,13 @@ from ansible.errors import AnsibleError
from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cacheable
from ansible.template import Templar
from ansible.utils.display import Display
-from ansible.utils.unsafe_proxy import wrap_var as make_unsafe
from ansible_collections.community.hrobot.plugins.module_utils.robot import (
BASE_URL,
PluginException,
plugin_open_url_json,
)
+from ansible_collections.community.hrobot.plugins.plugin_utils.unsafe import make_unsafe
display = Display()
diff --git a/ansible_collections/community/hrobot/plugins/plugin_utils/unsafe.py b/ansible_collections/community/hrobot/plugins/plugin_utils/unsafe.py
new file mode 100644
index 000000000..1eb61bea0
--- /dev/null
+++ b/ansible_collections/community/hrobot/plugins/plugin_utils/unsafe.py
@@ -0,0 +1,41 @@
+# Copyright (c) 2023, Felix Fontein <felix@fontein.de>
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+import re
+
+from ansible.module_utils.six import binary_type, text_type
+from ansible.module_utils.common._collections_compat import Mapping, Set
+from ansible.module_utils.common.collections import is_sequence
+from ansible.utils.unsafe_proxy import (
+ AnsibleUnsafe,
+ wrap_var as _make_unsafe,
+)
+
+_RE_TEMPLATE_CHARS = re.compile(u'[{}]')
+_RE_TEMPLATE_CHARS_BYTES = re.compile(b'[{}]')
+
+
+def make_unsafe(value):
+ if value is None or isinstance(value, AnsibleUnsafe):
+ return value
+
+ if isinstance(value, Mapping):
+ return dict((make_unsafe(key), make_unsafe(val)) for key, val in value.items())
+ elif isinstance(value, Set):
+ return set(make_unsafe(elt) for elt in value)
+ elif is_sequence(value):
+ return type(value)(make_unsafe(elt) for elt in value)
+ elif isinstance(value, binary_type):
+ if _RE_TEMPLATE_CHARS_BYTES.search(value):
+ value = _make_unsafe(value)
+ return value
+ elif isinstance(value, text_type):
+ if _RE_TEMPLATE_CHARS.search(value):
+ value = _make_unsafe(value)
+ return value
+
+ return value
diff --git a/ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt b/ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt
new file mode 100644
index 000000000..0d9329fad
--- /dev/null
+++ b/ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt
@@ -0,0 +1 @@
+tests/ee/roles/smoke/library/smoke_ipaddress.py shebang
diff --git a/ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt.license b/ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt.license
new file mode 100644
index 000000000..edff8c768
--- /dev/null
+++ b/ansible_collections/community/hrobot/tests/sanity/ignore-2.18.txt.license
@@ -0,0 +1,3 @@
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+SPDX-FileCopyrightText: Ansible Project
diff --git a/ansible_collections/community/hrobot/tests/unit/plugins/inventory/test_robot.py b/ansible_collections/community/hrobot/tests/unit/plugins/inventory/test_robot.py
index d5514aee5..c10524f7e 100644
--- a/ansible_collections/community/hrobot/tests/unit/plugins/inventory/test_robot.py
+++ b/ansible_collections/community/hrobot/tests/unit/plugins/inventory/test_robot.py
@@ -368,14 +368,14 @@ def test_unsafe(inventory, mocker):
.result_json([
{
'server': {
- 'server_ip': '1.2.3.4',
+ 'server_ip': '1.2.{3.4',
'dc': 'abc',
},
},
{
'server': {
'server_ip': '1.2.3.5',
- 'server_name': 'foo',
+ 'server_name': 'fo{o',
'dc': 'EVALU{{ "" }}ATED',
},
},
@@ -389,27 +389,27 @@ def test_unsafe(inventory, mocker):
open_url.assert_is_done()
- host_1 = inventory.inventory.get_host('1.2.3.4')
- host_2 = inventory.inventory.get_host('foo')
+ host_1 = inventory.inventory.get_host('1.2.{3.4')
+ host_2 = inventory.inventory.get_host('fo{o')
host_1_vars = host_1.get_vars()
host_2_vars = host_2.get_vars()
- assert host_1_vars['ansible_host'] == '1.2.3.4'
- assert host_1_vars['hrobot_server_ip'] == '1.2.3.4'
+ assert host_1_vars['ansible_host'] == '1.2.{3.4'
+ assert host_1_vars['hrobot_server_ip'] == '1.2.{3.4'
assert host_1_vars['hrobot_dc'] == 'abc'
assert host_2_vars['ansible_host'] == '1.2.3.5'
assert host_2_vars['hrobot_server_ip'] == '1.2.3.5'
- assert host_2_vars['hrobot_server_name'] == 'foo'
+ assert host_2_vars['hrobot_server_name'] == 'fo{o'
assert host_2_vars['hrobot_dc'] == 'EVALU{{ "" }}ATED'
# Make sure everything is unsafe
assert isinstance(host_1_vars['ansible_host'], AnsibleUnsafe)
assert isinstance(host_1_vars['hrobot_server_ip'], AnsibleUnsafe)
- assert isinstance(host_1_vars['hrobot_dc'], AnsibleUnsafe)
+ assert not isinstance(host_1_vars['hrobot_dc'], AnsibleUnsafe)
- assert isinstance(host_2_vars['ansible_host'], AnsibleUnsafe)
- assert isinstance(host_2_vars['hrobot_server_ip'], AnsibleUnsafe)
+ assert not isinstance(host_2_vars['ansible_host'], AnsibleUnsafe)
+ assert not isinstance(host_2_vars['hrobot_server_ip'], AnsibleUnsafe)
assert isinstance(host_2_vars['hrobot_server_name'], AnsibleUnsafe)
assert isinstance(host_2_vars['hrobot_dc'], AnsibleUnsafe)
diff --git a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/ansible-test.yml b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/ansible-test.yml
index ff4cd6afd..a9d3a2966 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/ansible-test.yml
@@ -33,6 +33,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
# Ansible-test on various stable branches does not yet work well with cgroups v2.
# Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04
@@ -74,6 +75,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
steps:
diff --git a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-pr.yml b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-pr.yml
new file mode 100644
index 000000000..b5a8e0d06
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-pr.yml
@@ -0,0 +1,92 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+name: Collection Docs
+concurrency:
+ group: docs-pr-${{ github.head_ref }}
+ cancel-in-progress: true
+on:
+ pull_request_target:
+ types: [opened, synchronize, reopened, closed]
+
+env:
+ GHP_BASE_URL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}
+
+jobs:
+ build-docs:
+ permissions:
+ contents: read
+ name: Build Ansible Docs
+ uses: ansible-community/github-docs-build/.github/workflows/_shared-docs-build-pr.yml@main
+ with:
+ collection-name: community.library_inventory_filtering_v1
+ init-lenient: false
+ init-fail-on-error: true
+ squash-hierarchy: true
+ init-project: Community.Library_Inventory_Filtering Collection
+ init-copyright: Community.Library_Inventory_Filtering Contributors
+ init-title: Community.Library_Inventory_Filtering Collection Documentation
+ init-html-short-title: Community.Library_Inventory_Filtering Collection Docs
+ init-extra-html-theme-options: |
+ documentation_home_url=https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/branch/stable-1/
+ render-file-line: '> * `$<status>` [$<path_tail>](https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/pr/${{ github.event.number }}/$<path_tail>)'
+
+ publish-docs-gh-pages:
+ # for now we won't run this on forks
+ if: github.repository == 'ansible-collections/community.library_inventory_filtering'
+ permissions:
+ contents: write
+ needs: [build-docs]
+ name: Publish Ansible Docs
+ uses: ansible-community/github-docs-build/.github/workflows/_shared-docs-build-publish-gh-pages.yml@main
+ with:
+ artifact-name: ${{ needs.build-docs.outputs.artifact-name }}
+ action: ${{ (github.event.action == 'closed' || needs.build-docs.outputs.changed != 'true') && 'teardown' || 'publish' }}
+ secrets:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ comment:
+ permissions:
+ pull-requests: write
+ runs-on: ubuntu-latest
+ needs: [build-docs, publish-docs-gh-pages]
+ name: PR comments
+ steps:
+ - name: PR comment
+ uses: ansible-community/github-docs-build/actions/ansible-docs-build-comment@main
+ with:
+ body-includes: '## Docs Build'
+ reactions: heart
+ action: ${{ needs.build-docs.outputs.changed != 'true' && 'remove' || '' }}
+ on-closed-body: |
+ ## Docs Build 📝
+
+ This PR is closed and any previously published docsite has been unpublished.
+ on-merged-body: |
+ ## Docs Build 📝
+
+ Thank you for contribution!✨
+
+ This PR has been merged and the docs are now incorporated into `stable-1`:
+ ${{ env.GHP_BASE_URL }}/branch/stable-1
+ body: |
+ ## Docs Build 📝
+
+ Thank you for contribution!✨
+
+ The docs for **this PR** have been published here:
+ ${{ env.GHP_BASE_URL }}/pr/${{ github.event.number }}
+
+ You can compare to the docs for the `stable-1` branch here:
+ ${{ env.GHP_BASE_URL }}/branch/stable-1
+
+ The docsite for **this PR** is also available for download as an artifact from this run:
+ ${{ needs.build-docs.outputs.artifact-url }}
+
+ File changes:
+
+ ${{ needs.build-docs.outputs.diff-files-rendered }}
+
+ ${{ needs.build-docs.outputs.diff-rendered }}
diff --git a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-push.yml b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-push.yml
new file mode 100644
index 000000000..53a4a56de
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/docs-push.yml
@@ -0,0 +1,51 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+name: Collection Docs
+concurrency:
+ group: docs-push-${{ github.sha }}
+ cancel-in-progress: true
+on:
+ push:
+ branches:
+ - stable-*
+ tags:
+ - '*'
+ # Run CI once per day (at 04:45 UTC)
+ schedule:
+ - cron: '45 4 * * *'
+ # Allow manual trigger (for newer antsibull-docs, sphinx-ansible-theme, ... versions)
+ workflow_dispatch:
+
+jobs:
+ build-docs:
+ permissions:
+ contents: read
+ name: Build Ansible Docs
+ uses: ansible-community/github-docs-build/.github/workflows/_shared-docs-build-push.yml@main
+ with:
+ collection-name: community.library_inventory_filtering_v1
+ init-lenient: false
+ init-fail-on-error: true
+ squash-hierarchy: true
+ init-project: Community.Library_Inventory_Filtering Collection
+ init-copyright: Community.Library_Inventory_Filtering Contributors
+ init-title: Community.Library_Inventory_Filtering Collection Documentation
+ init-html-short-title: Community.Library_Inventory_Filtering Collection Docs
+ init-extra-html-theme-options: |
+ documentation_home_url=https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/branch/stable-1/
+
+ publish-docs-gh-pages:
+ # for now we won't run this on forks
+ if: github.repository == 'ansible-collections/community.library_inventory_filtering'
+ permissions:
+ contents: write
+ needs: [build-docs]
+ name: Publish Ansible Docs
+ uses: ansible-community/github-docs-build/.github/workflows/_shared-docs-build-publish-gh-pages.yml@main
+ with:
+ artifact-name: ${{ needs.build-docs.outputs.artifact-name }}
+ secrets:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/extra-tests.yml b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/extra-tests.yml
index 8352f7f32..679176264 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/extra-tests.yml
+++ b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/extra-tests.yml
@@ -30,9 +30,9 @@ jobs:
path: ansible_collections/${{env.NAMESPACE}}/${{env.COLLECTION_NAME}}
- name: Set up Python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
- python-version: '3.11'
+ python-version: '3.12'
- name: Install ansible-core
run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check
diff --git a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/import-galaxy.yml b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/import-galaxy.yml
index 45dcfafe0..0c0ee402a 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/import-galaxy.yml
+++ b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/import-galaxy.yml
@@ -4,84 +4,17 @@
# SPDX-License-Identifier: GPL-3.0-or-later
name: import-galaxy
-on:
+'on':
# Run CI against all pushes (direct commits, also merged PRs) to main, and all Pull Requests
push:
branches:
+ - main
- stable-*
pull_request:
-env:
- # Adjust this to your collection
- NAMESPACE: community
- COLLECTION_NAME: library_inventory_filtering_v1
-
jobs:
- build-collection:
- name: Build collection artifact
- runs-on: ubuntu-latest
- steps:
- - name: Check out code
- uses: actions/checkout@v4
- with:
- path: ./checkout
-
- - name: Set up Python
- uses: actions/setup-python@v4
- with:
- python-version: '3.11'
-
- - name: Install ansible-core
- run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check
-
- - name: Make sure galaxy.yml has version entry
- run: >-
- python -c
- 'import yaml ;
- f = open("galaxy.yml", "rb") ;
- data = yaml.safe_load(f) ;
- f.close() ;
- data["version"] = data.get("version") or "0.0.1" ;
- f = open("galaxy.yml", "wb") ;
- f.write(yaml.dump(data).encode("utf-8")) ;
- f.close() ;
- '
- working-directory: ./checkout
-
- - name: Build collection
- run: ansible-galaxy collection build
- working-directory: ./checkout
-
- - name: Copy artifact into subdirectory
- run: mkdir ./artifact && mv ./checkout/${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-*.tar.gz ./artifact
-
- - name: Upload artifact
- uses: actions/upload-artifact@v4
- with:
- name: ${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-${{ github.sha }}
- path: ./artifact/
-
import-galaxy:
- name: Import artifact with Galaxy importer
- runs-on: ubuntu-latest
- needs:
- - build-collection
- steps:
- - name: Set up Python
- uses: actions/setup-python@v4
- with:
- python-version: '3.11'
-
- - name: Install ansible-core
- run: pip install https://github.com/ansible/ansible/archive/devel.tar.gz --disable-pip-version-check
-
- - name: Install galaxy-importer
- run: pip install galaxy-importer --disable-pip-version-check
-
- - name: Download artifact
- uses: actions/download-artifact@v4
- with:
- name: ${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-${{ github.sha }}
-
- - name: Run Galaxy importer
- run: python -m galaxy_importer.main ${{ env.NAMESPACE }}-${{ env.COLLECTION_NAME }}-*.tar.gz
+ permissions:
+ contents: read
+ name: Test to import built collection artifact with Galaxy importer
+ uses: ansible-community/github-action-test-galaxy-import/.github/workflows/test-galaxy-import.yml@main
diff --git a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/reuse.yml b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/reuse.yml
index 8785d624c..276b2ea24 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/reuse.yml
+++ b/ansible_collections/community/library_inventory_filtering_v1/.github/workflows/reuse.yml
@@ -23,10 +23,5 @@ jobs:
steps:
- uses: actions/checkout@v4
- - name: Install dependencies
- run: |
- pip install reuse
-
- - name: Check REUSE compliance
- run: |
- reuse lint
+ - name: REUSE Compliance Check
+ uses: fsfe/reuse-action@v3
diff --git a/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md b/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md
new file mode 100644
index 000000000..b3ff507da
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md
@@ -0,0 +1,34 @@
+# Community Inventory Filtering Library Collection Release Notes
+
+**Topics**
+
+- <a href="#v1-0-1">v1\.0\.1</a>
+ - <a href="#release-summary">Release Summary</a>
+- <a href="#v1-0-0">v1\.0\.0</a>
+ - <a href="#release-summary-1">Release Summary</a>
+- <a href="#v0-1-0">v0\.1\.0</a>
+ - <a href="#release-summary-2">Release Summary</a>
+
+<a id="v1-0-1"></a>
+## v1\.0\.1
+
+<a id="release-summary"></a>
+### Release Summary
+
+Maintenance release with documentation\.
+
+<a id="v1-0-0"></a>
+## v1\.0\.0
+
+<a id="release-summary-1"></a>
+### Release Summary
+
+First production ready release\.
+
+<a id="v0-1-0"></a>
+## v0\.1\.0
+
+<a id="release-summary-2"></a>
+### Release Summary
+
+Initial test release\.
diff --git a/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md.license b/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md.license
new file mode 100644
index 000000000..edff8c768
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.md.license
@@ -0,0 +1,3 @@
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+SPDX-FileCopyrightText: Ansible Project
diff --git a/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst b/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst
index 9f655c4cf..4f13fcf95 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst
+++ b/ansible_collections/community/library_inventory_filtering_v1/CHANGELOG.rst
@@ -4,6 +4,13 @@ Community Inventory Filtering Library Collection Release Notes
.. contents:: Topics
+v1.0.1
+======
+
+Release Summary
+---------------
+
+Maintenance release with documentation.
v1.0.0
======
diff --git a/ansible_collections/community/library_inventory_filtering_v1/FILES.json b/ansible_collections/community/library_inventory_filtering_v1/FILES.json
index f89f629d5..332860b52 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/FILES.json
+++ b/ansible_collections/community/library_inventory_filtering_v1/FILES.json
@@ -25,28 +25,42 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29df556b00de431af2c7824813c09ceff4dc440903465c18b382e423cfdb04b8",
+ "chksum_sha256": "e4c0dfca6b656fd2a85ffa83996421299ef5b10f9f46b39231ae2505238fc355",
+ "format": 1
+ },
+ {
+ "name": ".github/workflows/docs-pr.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "baa2a051226089dd82bf1ca7ca9c305d2d81b0c3cf18a0bb688aecf56e269828",
+ "format": 1
+ },
+ {
+ "name": ".github/workflows/docs-push.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "504c9bf048c3bfc77a6428d7854c5e747d2fe8c56c033063753174469920df52",
"format": 1
},
{
"name": ".github/workflows/extra-tests.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "34a58525f32c964e97de3b09619f3c2e540f1521db85f29679d3af6e1e689e89",
+ "chksum_sha256": "113b8c148b730d8abf8040ed7491696ddc7ab03326325945e5e721eccc3b6b16",
"format": 1
},
{
"name": ".github/workflows/import-galaxy.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf7394f8711a28c66c2a0b199e18c11d25d181cc827a2f7d0a0372a9f16ec0a9",
+ "chksum_sha256": "739c36223d6e0e6ccc98907c43cba53296e7b1ccd64a2d995c2ff21df4ab25a5",
"format": 1
},
{
"name": ".github/workflows/reuse.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5430af9a962c589c971154eb0dbd19a3f3a8b9eb870cb6c2d5e3896a5e962dac",
+ "chksum_sha256": "4c8fff4ef98f0dc1af3658b126140721ab1085979e76ed099308aa39828b297e",
"format": 1
},
{
@@ -109,7 +123,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "77a81c4d67042178df11c3235affa25a4c80e9140a6cab05eb8382750f9b5abd",
+ "chksum_sha256": "ae6dc5859ee98156f3fdbdfd1f3187782cb6586248a52358f2f565774654e78c",
"format": 1
},
{
@@ -123,7 +137,56 @@
"name": "changelogs/config.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e9f261ba6cc36a9d2639e0a51701fd8dd7e8c2ce7ae226380fb53da97a81a9cd",
+ "chksum_sha256": "b39f1dff98defdbedc9794ae82d77f5817d5c14144f0b6269c942bf5577a4feb",
+ "format": 1
+ },
+ {
+ "name": "docs",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "docs/docsite",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "docs/docsite/rst",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "docs/docsite/rst/usage_guide.rst",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9cb7a0386071576cb076b0ac3bd680df3c3a1c22d316587c445666dadba986f3",
+ "format": 1
+ },
+ {
+ "name": "docs/docsite/config.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0c5ec9ff76cf4db33b5d3f771419ef50d448e5d510cb7a98fc07dd9ecee69c4e",
+ "format": 1
+ },
+ {
+ "name": "docs/docsite/extra-docs.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "bbc2aa66c91ee37c4aea3e5aaff25983305e48b7281dc0356506ccb1e7c05103",
+ "format": 1
+ },
+ {
+ "name": "docs/docsite/links.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "2844a8906b69c6d9d7ab60546c1feb624bda986c8e49c5d6f0275e8dc2f687f1",
"format": 1
},
{
@@ -316,10 +379,24 @@
"format": 1
},
{
+ "name": "CHANGELOG.md",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e5dc2d05e3fe257bcfd97b59ff5b7a0fcbcef18a7b3204b866d930b304e89c91",
+ "format": 1
+ },
+ {
+ "name": "CHANGELOG.md.license",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1",
+ "format": 1
+ },
+ {
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "48a7116aab933a579b4972ff4646af4a5a37a5059d168f10e50df8054e7951f1",
+ "chksum_sha256": "8e3955ac95e2b3189609b191684a7a3164551c2583fa1389536635a2b3291e75",
"format": 1
},
{
@@ -340,7 +417,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b81d36f2d772b7384f5ecc75329982c5cb5812c8532acc9c3f07effff53eb430",
+ "chksum_sha256": "bef45f0f502d9a001eaf1300ae1480acc6930ddd543741d4dc26e1bd85b7001f",
"format": 1
},
{
diff --git a/ansible_collections/community/library_inventory_filtering_v1/MANIFEST.json b/ansible_collections/community/library_inventory_filtering_v1/MANIFEST.json
index eb2881bcc..19de3ad44 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/MANIFEST.json
+++ b/ansible_collections/community/library_inventory_filtering_v1/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "library_inventory_filtering_v1",
- "version": "1.0.0",
+ "version": "1.0.1",
"authors": [
"Felix Fontein (github.com/felixfontein)"
],
@@ -26,7 +26,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9e2fea3417b34954669efe0b692abee7364e520719a215937bd30b3484b546e3",
+ "chksum_sha256": "3a7e23348c6de582464cfc3937c64cc325727e3e6514fef783ecaa3328fe3ee1",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/library_inventory_filtering_v1/README.md b/ansible_collections/community/library_inventory_filtering_v1/README.md
index 88299bbbb..c29686f77 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/README.md
+++ b/ansible_collections/community/library_inventory_filtering_v1/README.md
@@ -11,7 +11,7 @@ This repository contains the `community.library_inventory_filtering_v1` Ansible
## Tested with Ansible
-Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, and ansible-core 2.16 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
+Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, and ansible-core 2.17 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
## Included content
@@ -23,6 +23,16 @@ Usually this collection is installed as a dependency of another collection. You
See [Ansible Using collections](https://docs.ansible.com/ansible/latest/user_guide/collections_using.html) for general instructions on how to use collections.
+## Collection Documentation
+
+Browsing the [**latest** collection documentation](https://docs.ansible.com/ansible/latest/collections/community/library_inventory_filtering_v1) will show docs for the _latest version released in the Ansible package_, not the latest version of the collection released on Galaxy.
+
+Browsing the [**devel** collection documentation](https://docs.ansible.com/ansible/devel/collections/community/library_inventory_filtering_v1) shows docs for the _latest version released on Galaxy_.
+
+We also separately publish [**latest commit** collection documentation](https://ansible-collections.github.io/community.library_inventory_filtering/branch/stable-1/) which shows docs for the _latest commit in the `stable-1` branch_.
+
+If you use the Ansible package and do not update collections independently, use **latest**. If you install or update this collection directly from Galaxy, use **devel**. If you are looking to contribute, use **latest commit**.
+
## Contributing to this collection
If you want to develop new content for this collection or improve what is already here, the easiest way to work on the collection is to clone it into one of the configured [`COLLECTIONS_PATH`](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#collections-paths), and work on it there.
@@ -31,7 +41,19 @@ You can find more information in the [developer guide for collections](https://d
## Release notes
-See the [changelog](https://github.com/ansible-collections/community.library_inventory_filtering/tree/stable-1/CHANGELOG.rst).
+See the [changelog](https://github.com/ansible-collections/community.library_inventory_filtering/tree/stable-1/CHANGELOG.md).
+
+## Releasing, Versioning and Deprecation
+
+This collection follows [Semantic Versioning](https://semver.org/). More details on versioning can be found [in the Ansible docs](https://docs.ansible.com/ansible/latest/dev_guide/developing_collections.html#collection-versions).
+
+We plan to regularly release new minor or bugfix versions once new features or bugfixes have been implemented.
+
+Releasing the major version X happens from the `stable-X` branch. The collection name depends on the major branch; the collections released from `stable-1` have a `_v1` suffix; the collections released from `stable-2` have a `_v2` suffix; and so on. The different suffix allows to install multiple major releases of the collection in parallel. This makes it possible to migrate some collections to major version 2 without forcing to upgrade all of them simultaneously.
+
+Features might be backported to earlier stable branches. Bugfixes are backported as long as these stable branches are still maintained. Generally stable branches should still be maintained as long as they are still used by maintained branches of collections. Backporting bugfixes or creating more specialized bugfixes for stable branches might need to be done by the maintainers of the collections still using these branches.
+
+Since multiple versions are maintained in parallel, there is no need to wait between deprecation and removal. Removal requires a new major release (and thus a new collection name due to a different version suffix).
## More information
diff --git a/ansible_collections/community/library_inventory_filtering_v1/changelogs/changelog.yaml b/ansible_collections/community/library_inventory_filtering_v1/changelogs/changelog.yaml
index dc48b112a..b4bf6bbcb 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/changelogs/changelog.yaml
+++ b/ansible_collections/community/library_inventory_filtering_v1/changelogs/changelog.yaml
@@ -12,3 +12,9 @@ releases:
fragments:
- 1.0.0.yml
release_date: '2023-12-28'
+ 1.0.1:
+ changes:
+ release_summary: Maintenance release with documentation.
+ fragments:
+ - 1.0.1.yml
+ release_date: '2024-04-21'
diff --git a/ansible_collections/community/library_inventory_filtering_v1/changelogs/config.yaml b/ansible_collections/community/library_inventory_filtering_v1/changelogs/config.yaml
index a64e83dc6..cdfc8f323 100644
--- a/ansible_collections/community/library_inventory_filtering_v1/changelogs/config.yaml
+++ b/ansible_collections/community/library_inventory_filtering_v1/changelogs/config.yaml
@@ -11,6 +11,9 @@ keep_fragments: false
mention_ancestor: true
new_plugins_after_name: removed_features
notesdir: fragments
+output_formats:
+- rst
+- md
prelude_section_name: release_summary
prelude_section_title: Release Summary
sections:
diff --git a/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/config.yml b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/config.yml
new file mode 100644
index 000000000..1d6cf8554
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/config.yml
@@ -0,0 +1,7 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+changelog:
+ write_changelog: true
diff --git a/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/extra-docs.yml b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/extra-docs.yml
new file mode 100644
index 000000000..55abd2207
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/extra-docs.yml
@@ -0,0 +1,9 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+sections:
+ - title: Usage guide
+ toctree:
+ - usage_guide
diff --git a/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/links.yml b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/links.yml
new file mode 100644
index 000000000..0346f180e
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/links.yml
@@ -0,0 +1,20 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+edit_on_github:
+ repository: ansible-collections/community.library_inventory_filtering
+ branch: stable-1
+ path_prefix: ''
+
+extra_links:
+ - description: Submit a bug report
+ url: https://github.com/ansible-collections/community.library_inventory_filtering/issues/new?assignees=&labels=&template=bug_report.md
+ - description: Request a feature
+ url: https://github.com/ansible-collections/community.library_inventory_filtering/issues/new?assignees=&labels=&template=feature_request.md
+
+communication:
+ matrix_rooms:
+ - topic: General usage and support questions
+ room: '#community:ansible.im'
diff --git a/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/rst/usage_guide.rst b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/rst/usage_guide.rst
new file mode 100644
index 000000000..d1b1e8374
--- /dev/null
+++ b/ansible_collections/community/library_inventory_filtering_v1/docs/docsite/rst/usage_guide.rst
@@ -0,0 +1,75 @@
+..
+ Copyright (c) Ansible Project
+ GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+ SPDX-License-Identifier: GPL-3.0-or-later
+
+.. _ansible_collections.community.library_inventory_filtering_v1.docsite.usage_guide:
+
+Usage Guide
+===========
+
+The `community.library_inventory_filtering_v1 collection <https://galaxy.ansible.com/ui/repo/published/community/library_inventory_filtering_v1/>`_ enables other collections to add common filter functionality to inventory plugins.
+
+.. contents::
+ :local:
+ :depth: 1
+
+
+Requirements
+------------
+
+The ``stable-1`` branch of this collection, released as , works with all ansible-base and ansible-core versions, and with Ansible >= 2.9.10.
+
+Adding filter functionality to an inventory plugin
+--------------------------------------------------
+
+The preferred way to use this collection is to use the ``inventory_filter`` docs fragment and the ``inventory_filter`` plugin utils.
+
+To use the documentation fragment, add it to the ``extends_documentation_fragment`` list in ``DOCUMENTATION``:
+
+.. code-block:: yaml
+
+ extends_documentation_fragment:
+ - community.library_inventory_filtering_v1.inventory_filter
+
+For the filtering, you need to import two functions from the plugin util, ``parse_filters()`` and ``filter_host()``:
+
+.. code-block:: python
+
+ from ansible_collections.community.library_inventory_filtering_v1.plugins.plugin_utils.inventory_filter import (
+ parse_filters,
+ filter_host,
+ )
+
+You can use ``parse_filters()`` to parse the ``filters`` option's value (``self.get_option('filters')``), and ``filter_host()`` to determine whether to include a host:
+
+.. code-block:: python
+
+ class InventoryModule(BaseInventoryPlugin, ...):
+
+ def parse(self, inventory, loader, path, cache=True):
+ super(InventoryModule, self).parse(inventory, loader, path, cache)
+ self._read_config_data(path)
+
+ ...
+
+ # Parse the filters option
+ filters = parse_filters(self.get_option('filters'))
+
+ ...
+
+ for host in hosts:
+ # Compile the host vars
+ host_vars = ...
+
+ # Now we can evaluate potential filter conditions
+ # based on the host name and host vars:
+ if not filter_host(self, host, host_vars, filters):
+ continue
+
+ # Add the host with its vars
+ self.inventory.add_host(name)
+ for key, value in host_vars.items():
+ self.inventory.set_variable(name, key, value)
+
+ ...
diff --git a/ansible_collections/community/mongodb/CHANGELOG.rst b/ansible_collections/community/mongodb/CHANGELOG.rst
index 88b4b7fe4..efe8e7a47 100644
--- a/ansible_collections/community/mongodb/CHANGELOG.rst
+++ b/ansible_collections/community/mongodb/CHANGELOG.rst
@@ -4,6 +4,19 @@ Community.MongoDB Release Notes
.. contents:: Topics
+v1.7.3:
+=========
+
+Release Summary
+----------------
+
+This release is a maintenance release.
+
+Bug Fixes
+----------
+
+- 641 - mongodb_mongod - Add test condition for storage option in mongod.conf template file.
+
v1.7.2:
=========
diff --git a/ansible_collections/community/mongodb/FILES.json b/ansible_collections/community/mongodb/FILES.json
index ff9223131..f94843a96 100644
--- a/ansible_collections/community/mongodb/FILES.json
+++ b/ansible_collections/community/mongodb/FILES.json
@@ -95,7 +95,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "62026cfdee0d726808baf3b46212cb3b1d0668bf8f156898c11b3017f45c67e4",
+ "chksum_sha256": "d7e3cf154cb0134ac530a4ec411e69e5d21ed2d500e5bc219ddc983625779f64",
"format": 1
},
{
@@ -1698,7 +1698,7 @@
"name": "roles/mongodb_mongod/templates/mongod.conf.j2",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7640c7f81cf31e93dc02bb1e1b5099ddc1f9b555e5109190f2c252fed81f4b43",
+ "chksum_sha256": "b13fcb483b070ce7bf9cd99f742bffce8ce7170e59a4eaa183f40ea6ee7cc0f7",
"format": 1
},
{
@@ -2370,7 +2370,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c81479be70033bb9abe13501e9c3eef37936cb74ea74bbfea1d83d9e685c2917",
+ "chksum_sha256": "dd8f971dbb162351148320dbed19aa7fb8e49aa683205224ea51defff77fe3f3",
"format": 1
},
{
@@ -2384,7 +2384,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "30119dbbd021221c84f7447cee3fd266408933a599e51affa2fab12db835bd87",
+ "chksum_sha256": "65a9319fb932c67923de4f992f3119feae296f85411b5cffb00aa04b93a44f29",
"format": 1
},
{
diff --git a/ansible_collections/community/mongodb/MANIFEST.json b/ansible_collections/community/mongodb/MANIFEST.json
index 8ae826436..aa6035a5e 100644
--- a/ansible_collections/community/mongodb/MANIFEST.json
+++ b/ansible_collections/community/mongodb/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "mongodb",
- "version": "1.7.2",
+ "version": "1.7.3",
"authors": [
"Ansible (https://github.com/ansible)",
"Rhys Campbell (https://github.com/rhysmeister)",
@@ -36,7 +36,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4d1c58600e395dade74dad0a4e8ad949bda341bf224312202dcff67516a0a16e",
+ "chksum_sha256": "72e4c95bc97cb1a5e68ca35b8c8dffa1bda536bae32ca66bdaa676747ba0244f",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/mongodb/README.md b/ansible_collections/community/mongodb/README.md
index caadf1e93..66e50daef 100644
--- a/ansible_collections/community/mongodb/README.md
+++ b/ansible_collections/community/mongodb/README.md
@@ -1,6 +1,6 @@
# MongoDB Version and PyMongoDB Version Compatibility
-- This collection is tested against the most recent two minor MongoDB releases, currently 6.0.X and 7.0.X.
+- This collection is tested against the most recent two MongoDB releases, currently 6.0.X and 7.0.X.
- PyMongo 3.12.X dropped on 11.04.2023. Now PyMongo latest only.
- Compatibility may be maintained for older software versions but is not guaranteed. Please upgrade your PyMongo driver version if you encounter difficulties with older versions.
diff --git a/ansible_collections/community/mongodb/changelogs/changelog.yaml b/ansible_collections/community/mongodb/changelogs/changelog.yaml
index 7f608d606..641f7c62f 100644
--- a/ansible_collections/community/mongodb/changelogs/changelog.yaml
+++ b/ansible_collections/community/mongodb/changelogs/changelog.yaml
@@ -330,3 +330,8 @@ releases:
This release is a maintenance release.
bugfixes:
- 638 - mongodb_replicaset - Allow module to update replicaset horizons.
+ 1.7.3:
+ release_summary: |
+ This release is a maintenance release.
+ bugfixes:
+ - 641 - mongodb_mongod - Add test condition for storage option in mongod.conf template file.
diff --git a/ansible_collections/community/mongodb/roles/mongodb_mongod/templates/mongod.conf.j2 b/ansible_collections/community/mongodb/roles/mongodb_mongod/templates/mongod.conf.j2
index cd2d1f0fc..33ad19650 100644
--- a/ansible_collections/community/mongodb/roles/mongodb_mongod/templates/mongod.conf.j2
+++ b/ansible_collections/community/mongodb/roles/mongodb_mongod/templates/mongod.conf.j2
@@ -15,8 +15,10 @@ systemLog:
# Where and how to store data.
storage:
dbPath: {{ db_path }}
+{% if mongodb_version < '6.1' %}
journal:
enabled: true
+{% endif %}
engine: "wiredTiger"
# how the process runs
diff --git a/ansible_collections/community/rabbitmq/.azure-pipelines/azure-pipelines.yml b/ansible_collections/community/rabbitmq/.azure-pipelines/azure-pipelines.yml
index 7002adffa..69638bf11 100644
--- a/ansible_collections/community/rabbitmq/.azure-pipelines/azure-pipelines.yml
+++ b/ansible_collections/community/rabbitmq/.azure-pipelines/azure-pipelines.yml
@@ -36,7 +36,7 @@ variables:
resources:
containers:
- container: default
- image: quay.io/ansible/azure-pipelines-test-container:3.0.0
+ image: quay.io/ansible/azure-pipelines-test-container:4.0.1
pool: Standard
@@ -54,77 +54,41 @@ stages:
- name: Units
test: 'devel/units/1'
- - stage: Ansible_2_14
- displayName: Sanity & Units 2.14
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- targets:
- - name: Sanity
- test: '2.14/sanity/1'
- - name: Units
- test: '2.14/units/1'
-
- - stage: Ansible_2_13
- displayName: Sanity & Units 2.13
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- targets:
- - name: Sanity
- test: '2.13/sanity/1'
- - name: Units
- test: '2.13/units/1'
-
- - stage: Ansible_2_12
- displayName: Sanity & Units 2.12
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- targets:
- - name: Sanity
- test: '2.12/sanity/1'
- - name: Units
- test: '2.12/units/1'
-
- - stage: Ansible_2_11
- displayName: Sanity & Units 2.11
+ - stage: Ansible_2_16
+ displayName: Sanity & Units 2.16
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
targets:
- name: Sanity
- test: '2.11/sanity/1'
+ test: '2.16/sanity/1'
- name: Units
- test: '2.11/units/1'
+ test: '2.16/units/1'
- - stage: Ansible_2_10
- displayName: Sanity & Units 2.10
+ - stage: Ansible_2_15
+ displayName: Sanity & Units 2.15
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
targets:
- name: Sanity
- test: '2.10/sanity/1'
+ test: '2.15/sanity/1'
- name: Units
- test: '2.10/units/1'
+ test: '2.15/units/1'
- - stage: Ansible_2_9
- displayName: Sanity & Units 2.9
+ - stage: Ansible_2_14
+ displayName: Sanity & Units 2.14
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
targets:
- name: Sanity
- test: '2.9/sanity/1'
+ test: '2.14/sanity/1'
- name: Units
- test: '2.9/units/1'
+ test: '2.14/units/1'
### Docker
- stage: Docker_devel
@@ -163,113 +127,50 @@ stages:
#- name: Ubuntu 20.04
# test: ubuntu2004
- - stage: Docker_2_14
- displayName: Docker 2.14
+ - stage: Docker_2_16
+ displayName: Docker 2.16
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
- testFormat: 2.14/linux/{0}/1
+ testFormat: 2.16/linux/{0}/1
targets:
- name: Ubuntu 22.04
test: ubuntu2204
- # Currently 20.04 is causing devel to fail. This maybe due to Ubuntu 20.04 running python
- # 3.8, however, ansible-test requires 3.9+. This means ansible test spins up a controller
- # and target container which is probably why rabbitmq_publish is not able to connect to
- # rabbitmq on localhost.
- #- name: Ubuntu 20.04
- # test: ubuntu2004
-
- - stage: Docker_2_13
- displayName: Docker 2.13
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.13/linux/{0}/1
- targets:
- #- name: Ubuntu 18.04
- # test: ubuntu1804
- - name: Ubuntu 20.04
- test: ubuntu2004
-
- - stage: Docker_2_12
- displayName: Docker 2.12
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.12/linux/{0}/1
- targets:
- #- name: Ubuntu 18.04
- # test: ubuntu1804
- - name: Ubuntu 20.04
- test: ubuntu2004
-
- - stage: Docker_2_11
- displayName: Docker 2.11
- dependsOn: []
- jobs:
- - template: templates/matrix.yml
- parameters:
- testFormat: 2.11/linux/{0}/1
- targets:
- # NOTE: update integration roles to support platform before enabling here.
- #- name: CentOS 6
- # test: centos6
- #- name: CentOS 7
- # test: centos7
- #- name: Fedora 32
- # test: fedora32
- #- name: Fedora 33
- # test: fedora33
- #- name: openSUSE 15 py2
- # test: opensuse15py2
- #- name: openSUSE 15 py3
- # test: opensuse15
- - name: Ubuntu 18.04
- test: ubuntu1804
- - name: Ubuntu 20.04
- test: ubuntu2004
- - stage: Docker_2_10
- displayName: Docker 2.10
+ - stage: Docker_2_15
+ displayName: Docker 2.15
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
- testFormat: 2.10/linux/{0}/1
+ testFormat: 2.15/linux/{0}/1
targets:
- # NOTE: update integration roles to support platform before enabling here.
- #- name: CentOS 6
- # test: centos6
- #- name: CentOS 7
- # test: centos7
- #- name: Fedora 31
- # test: fedora31
- #- name: Fedora 32
- # test: fedora32
- #- name: openSUSE 15 py2
- # test: opensuse15py2
- #- name: openSUSE 15 py3
- # test: opensuse15
- - name: Ubuntu 18.04
- test: ubuntu1804
- - name: Ubuntu 20.04
- test: ubuntu2004
+ - name: Ubuntu 22.04
+ test: ubuntu2204
+ # Currently 20.04 is causing devel to fail. This maybe due to Ubuntu 20.04 running python
+ # 3.8, however, ansible-test requires 3.9+. This means ansible test spins up a controller
+ # and target container which is probably why rabbitmq_publish is not able to connect to
+ # rabbitmq on localhost.
+ #- name: Ubuntu 20.04
+ # test: ubuntu2004
- - stage: Docker_2_9
- displayName: Docker 2.9
+ - stage: Docker_2_14
+ displayName: Docker 2.14
dependsOn: []
jobs:
- template: templates/matrix.yml
parameters:
- testFormat: 2.9/linux/{0}/1
+ testFormat: 2.14/linux/{0}/1
targets:
- # NOTE: update integration roles to support platform before adding here.
- - name: Ubuntu 18.04
- test: ubuntu1804 # freezes in rabbitmq_setup
- # ansible-test 2.9 does not support 20.04 (image not included in its test-containers list)
+ - name: Ubuntu 22.04
+ test: ubuntu2204
+ # Currently 20.04 is causing devel to fail. This maybe due to Ubuntu 20.04 running python
+ # 3.8, however, ansible-test requires 3.9+. This means ansible test spins up a controller
+ # and target container which is probably why rabbitmq_publish is not able to connect to
+ # rabbitmq on localhost.
+ #- name: Ubuntu 20.04
+ # test: ubuntu2004
### Remote
# - stage: Remote_devel
@@ -288,74 +189,16 @@ stages:
# test: freebsd/11.4
# - name: FreeBSD 12.2
# test: freebsd/12.2
-# - stage: Remote_2_11
-# displayName: Remote 2.11
-# dependsOn: []
-# jobs:
-# - template: templates/matrix.yml
-# parameters:
-# testFormat: 2.11/{0}/1
-# targets:
-# - name: RHEL 7.9
-# test: rhel/7.9
-# - name: RHEL 8.3
-# test: rhel/8.3
-# - name: FreeBSD 11.4
-# test: freebsd/11.4
-# - name: FreeBSD 12.2
-# test: freebsd/12.2
-# - stage: Remote_2_10
-# displayName: Remote 2.10
-# dependsOn: []
-# jobs:
-# - template: templates/matrix.yml
-# parameters:
-# testFormat: 2.10/{0}/1
-# targets:
-# - name: RHEL 7.8
-# test: rhel/7.8
-# - name: RHEL 8.2
-# test: rhel/8.2
-# - name: FreeBSD 11.1
-# test: freebsd/11.1
-# - name: FreeBSD 12.1
-# test: freebsd/12.1
-# - stage: Remote_2_9
-# displayName: Remote 2.9
-# dependsOn: []
-# jobs:
-# - template: templates/matrix.yml
-# parameters:
-# testFormat: 2.9/{0}/1
-# targets:
-# - name: RHEL 7.8
-# test: rhel/7.8
-# - name: RHEL 8.2
-# test: rhel/8.2
-# - name: FreeBSD 11.1
-# test: freebsd/11.1
-# - name: FreeBSD 12.1
-# test: freebsd/12.1
+
- stage: Summary
condition: succeededOrFailed()
dependsOn:
- Ansible_devel
+ - Ansible_2_15
- Ansible_2_14
- - Ansible_2_13
- - Ansible_2_12
- - Ansible_2_11
- - Ansible_2_10
- - Ansible_2_9
- Docker_devel
+ - Docker_2_15
- Docker_2_14
- - Docker_2_13
- - Docker_2_12
- - Docker_2_11
- - Docker_2_10
- - Docker_2_9
#- Remote_devel
- #- Remote_2_11
- #- Remote_2_10
- #- Remote_2_9
jobs:
- template: templates/coverage.yml
diff --git a/ansible_collections/community/rabbitmq/CHANGELOG.rst b/ansible_collections/community/rabbitmq/CHANGELOG.rst
index 2972a9aa7..4f376603c 100644
--- a/ansible_collections/community/rabbitmq/CHANGELOG.rst
+++ b/ansible_collections/community/rabbitmq/CHANGELOG.rst
@@ -4,6 +4,20 @@ Community.Rabbitmq Release Notes
.. contents:: Topics
+v1.3.0
+======
+
+Release Summary
+---------------
+
+This is the minor release of the ``community.rabbitmq`` collection.
+This changelog contains all changes to the modules and plugins in this collection
+that have been made after the 1.2.3 release.
+
+Minor Changes
+-------------
+
+- rabbitmq_user - add support to user manipulation through RabbitMQ API (https://github.com/ansible-collections/community.rabbitmq/issues/76)
v1.2.3
======
@@ -15,7 +29,6 @@ This is the minor release of the ``community.rabbitmq`` collection.
This changelog contains all changes to the modules and plugins in this collection
that have been made after the 1.2.2 release.
-
Minor Changes
-------------
@@ -25,8 +38,8 @@ Minor Changes
Bugfixes
--------
-- rabbitmq_queue - fixing an issue where a special character in the queue name would result in an API error (https://github.com/ansible-collections/community.rabbitmq/issues/114).
- Various CI fixes (https://github.com/ansible-collections/community.rabbitmq/pull/139 & https://github.com/ansible-collections/community.rabbitmq/pull/141).
+- rabbitmq_queue - fixing an issue where a special character in the queue name would result in an API error (https://github.com/ansible-collections/community.rabbitmq/issues/114).
v1.2.2
======
diff --git a/ansible_collections/community/rabbitmq/FILES.json b/ansible_collections/community/rabbitmq/FILES.json
index 386bcdee6..c3722e646 100644
--- a/ansible_collections/community/rabbitmq/FILES.json
+++ b/ansible_collections/community/rabbitmq/FILES.json
@@ -109,7 +109,7 @@
"name": ".azure-pipelines/azure-pipelines.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fcad40ddb0bcc93a39f7d1a5085a0cda0b6c16cfcc52d8874a23ddc090f0c57f",
+ "chksum_sha256": "16db5589035b7434f5d3a7025654cd37a6b1b283f406688fc07ca2fa0805a33d",
"format": 1
},
{
@@ -123,7 +123,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c1ac1a9869d7c8d4e39046dab344e152b41c4568e830c835c5a160c5c7f4d9f",
+ "chksum_sha256": "9bc8251d2d005b494b776c350eae47d6af7d7863cd82cbe1bb696a7b84b87815",
"format": 1
},
{
@@ -186,7 +186,7 @@
"name": "plugins/lookup/rabbitmq.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b9c692de8e40a03374e0ca861a7878a0fd62e030b6b318dfc92f4b8ae20a688e",
+ "chksum_sha256": "cfe3e5e5754f50515b05ab3d4e4079aa4bc6c64c449f75e5c8e791d83b68377c",
"format": 1
},
{
@@ -207,7 +207,7 @@
"name": "plugins/module_utils/rabbitmq.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e0f334c9bff8d4198ee16bec49f13f08da5b9c43191109cab7c17d26bbddf218",
+ "chksum_sha256": "612bbc76033437090e05aa16b797e6003d7d90e8a0ced59d28b27ad82f970368",
"format": 1
},
{
@@ -256,7 +256,7 @@
"name": "plugins/modules/rabbitmq_parameter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2cd6c3187093db8314603108d9d91c318c784af4bd07cc4f196a6bc01dcddc33",
+ "chksum_sha256": "d2d85dec30694641f91cccbddb5c827462cebd51655273462ba0280a35e4e4a9",
"format": 1
},
{
@@ -277,7 +277,7 @@
"name": "plugins/modules/rabbitmq_publish.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5585f87fd00075bad137a8b185cd5d9fabc8ae7576629e8b01c200610e8177a",
+ "chksum_sha256": "1c0c9680fe5d3d6fe7d77df6bc63fe44d3269af82e3238d44e8d28efb958fff9",
"format": 1
},
{
@@ -298,7 +298,7 @@
"name": "plugins/modules/rabbitmq_user.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5fe7cd8150b3b76e87f8f86fe164f89070d9f62a61411d6b84e004c18949451f",
+ "chksum_sha256": "df9c298b4a460cee35c274032a83cc402a843ffc63f53f40376d22cead3c70e3",
"format": 1
},
{
@@ -375,7 +375,7 @@
"name": "tests/integration/targets/lookup_rabbitmq/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4191eddb2b4316a026b0b6073752948393447541f7cd615799e765ab6bca6fb0",
+ "chksum_sha256": "1de7cad29c82819b7983e39a90358a55ff81eb7dc54d27d05ae665073379939c",
"format": 1
},
{
@@ -718,7 +718,7 @@
"name": "tests/integration/targets/rabbitmq_publish/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4191eddb2b4316a026b0b6073752948393447541f7cd615799e765ab6bca6fb0",
+ "chksum_sha256": "1de7cad29c82819b7983e39a90358a55ff81eb7dc54d27d05ae665073379939c",
"format": 1
},
{
@@ -767,7 +767,7 @@
"name": "tests/integration/targets/rabbitmq_queue/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4191eddb2b4316a026b0b6073752948393447541f7cd615799e765ab6bca6fb0",
+ "chksum_sha256": "1de7cad29c82819b7983e39a90358a55ff81eb7dc54d27d05ae665073379939c",
"format": 1
},
{
@@ -865,7 +865,7 @@
"name": "tests/integration/targets/rabbitmq_user/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "27b82af4f4e91ff9565ee5a834d7b93b0322b25dec30ab06a23d07b178f515c9",
+ "chksum_sha256": "7b47e3c3e8b4970ef2b1d8a97410a8224c72b0c949e423e385d238ded830f3b9",
"format": 1
},
{
@@ -876,6 +876,13 @@
"format": 1
},
{
+ "name": "tests/integration/targets/rabbitmq_user/tasks/tests_api.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "87e87bd203d2432fe211e49940b58e9b409d97f735e898f12c15408b041e530c",
+ "format": 1
+ },
+ {
"name": "tests/integration/targets/rabbitmq_user/aliases",
"ftype": "file",
"chksum_type": "sha256",
@@ -914,7 +921,7 @@
"name": "tests/integration/targets/rabbitmq_user_limits/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4191eddb2b4316a026b0b6073752948393447541f7cd615799e765ab6bca6fb0",
+ "chksum_sha256": "1de7cad29c82819b7983e39a90358a55ff81eb7dc54d27d05ae665073379939c",
"format": 1
},
{
@@ -1012,7 +1019,7 @@
"name": "tests/integration/targets/rabbitmq_vhost_limits/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4191eddb2b4316a026b0b6073752948393447541f7cd615799e765ab6bca6fb0",
+ "chksum_sha256": "1de7cad29c82819b7983e39a90358a55ff81eb7dc54d27d05ae665073379939c",
"format": 1
},
{
@@ -1212,20 +1219,6 @@
"format": 1
},
{
- "name": "tests/sanity/ignore-2.10.txt",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "8b8815dcc93330716312b23095ad47d984bd7a039d20a5baa1127ce6d73ca6e8",
- "format": 1
- },
- {
- "name": "tests/sanity/ignore-2.11.txt",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "8b8815dcc93330716312b23095ad47d984bd7a039d20a5baa1127ce6d73ca6e8",
- "format": 1
- },
- {
"name": "tests/sanity/ignore-2.12.txt",
"ftype": "file",
"chksum_type": "sha256",
@@ -1250,21 +1243,21 @@
"name": "tests/sanity/ignore-2.15.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8b8815dcc93330716312b23095ad47d984bd7a039d20a5baa1127ce6d73ca6e8",
+ "chksum_sha256": "f9e62f04368d06e3fee2abe014f49bc1696a1478a4d0a8e32fb5c1dae693c43e",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.9.txt",
+ "name": "tests/sanity/ignore-2.16.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8b8815dcc93330716312b23095ad47d984bd7a039d20a5baa1127ce6d73ca6e8",
+ "chksum_sha256": "7919c2c8970b1cac1d23835cdb9a3a250190bd789e4f24b3331dfca7ddbfd1ad",
"format": 1
},
{
- "name": "tests/sanity/ignore.txt",
+ "name": "tests/sanity/ignore-2.17.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8b8815dcc93330716312b23095ad47d984bd7a039d20a5baa1127ce6d73ca6e8",
+ "chksum_sha256": "7919c2c8970b1cac1d23835cdb9a3a250190bd789e4f24b3331dfca7ddbfd1ad",
"format": 1
},
{
@@ -1299,7 +1292,7 @@
"name": "tests/unit/compat/mock.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0af958450cf6de3fbafe94b1111eae8ba5a8dbe1d785ffbb9df81f26e4946d99",
+ "chksum_sha256": "77edbe32e554aef3000b7d3c0bf7ae96c307cb0f0943fe91a4dfa4d840ba7fc9",
"format": 1
},
{
@@ -1327,7 +1320,7 @@
"name": "tests/unit/mock/loader.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cfe3480f0eae6d3723ee62d01d00a0e9f58fcdc082ea1d8e4836157c56d4fa95",
+ "chksum_sha256": "7307b7f5d85fc5a4de7fe47f0b5f008e57fb24a0fe2702f09d9d7e80afbc44d8",
"format": 1
},
{
@@ -1481,7 +1474,7 @@
"name": "tests/utils/shippable/shippable.sh",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fbd386cce60ec181967826a2accc28b054021c67b124b056120dc37fca1c9a10",
+ "chksum_sha256": "60fa0850685439febcef31fe85586a7f346e9155fa563be2549365a988c3fabe",
"format": 1
},
{
@@ -1516,7 +1509,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0ebfd06c05555985fd1766d51b262d7d16bdcbb7e62a556533a583c7804cf664",
+ "chksum_sha256": "65a2321cc2f0390f03fe9d00e12d2fa8fc98b65d1e54a44325427abda483b724",
"format": 1
},
{
diff --git a/ansible_collections/community/rabbitmq/MANIFEST.json b/ansible_collections/community/rabbitmq/MANIFEST.json
index aef8fe4bf..9653a4d58 100644
--- a/ansible_collections/community/rabbitmq/MANIFEST.json
+++ b/ansible_collections/community/rabbitmq/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "rabbitmq",
- "version": "1.2.3",
+ "version": "1.3.0",
"authors": [
"Ansible (https://github.com/ansible)",
"community.rabbitmq"
@@ -24,7 +24,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5ccdbf6355d35529c8944cfa5f572e21e987b5050135b9262c754cdcbc1c25d7",
+ "chksum_sha256": "e4a87617bfd273702d37e86b00a3e37f03b8242320e8ffa8f90d2f7b9b9cc975",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/rabbitmq/changelogs/changelog.yaml b/ansible_collections/community/rabbitmq/changelogs/changelog.yaml
index ee3c424ba..db72d33e0 100644
--- a/ansible_collections/community/rabbitmq/changelogs/changelog.yaml
+++ b/ansible_collections/community/rabbitmq/changelogs/changelog.yaml
@@ -95,22 +95,21 @@ releases:
1.2.3:
changes:
bugfixes:
+ - Various CI fixes (https://github.com/ansible-collections/community.rabbitmq/pull/139
+ & https://github.com/ansible-collections/community.rabbitmq/pull/141).
- rabbitmq_queue - fixing an issue where a special character in the queue name
would result in an API error (https://github.com/ansible-collections/community.rabbitmq/issues/114).
minor_changes:
- rabbitmq_exchange - adding ability to specify exchange types that are enabled
- via plugins. I(x-random), I(x-consistent-hash) and I(x-recent-history)
- (https://github.com/ansible-collections/community.rabbitmq/pull/142).
+ via plugins. I(x-random), I(x-consistent-hash) and I(x-recent-history) (https://github.com/ansible-collections/community.rabbitmq/pull/142).
- rabbitmq_publish - fixing issue with publishing to exchanges and adding exchange
documentation examples. Publishing to an exchange or queue is now mutually
- exclusive (https://github.com/ansible-collections/community.rabbitmq/pull/140).
- - Various CI fixes (https://github.com/ansible-collections/community.rabbitmq/pull/139 &
- https://github.com/ansible-collections/community.rabbitmq/pull/141).
+ exclusive (https://github.com/ansible-collections/community.rabbitmq/pull/140).
release_summary: 'This is the minor release of the ``community.rabbitmq`` collection.
This changelog contains all changes to the modules and plugins in this collection
- that have been made after the 1.2.1 release.'
+ that have been made after the 1.2.2 release.'
fragments:
- 1.2.3.yml
- 114-queue-name-escape.yml
@@ -118,3 +117,16 @@ releases:
- 140-fixing-publishing-to-exchanges.yaml
- 142-new-plugin-exchanges.yml
release_date: '2022-11-04'
+ 1.3.0:
+ changes:
+ minor_changes:
+ - rabbitmq_user - add support to user manipulation through RabbitMQ API (https://github.com/ansible-collections/community.rabbitmq/issues/76)
+ release_summary: 'This is the minor release of the ``community.rabbitmq`` collection.
+
+ This changelog contains all changes to the modules and plugins in this collection
+
+ that have been made after the 1.2.3 release.'
+ fragments:
+ - 1.3.0.yml
+ - 120-api-managed-users.yaml
+ release_date: '2024-03-31'
diff --git a/ansible_collections/community/rabbitmq/plugins/lookup/rabbitmq.py b/ansible_collections/community/rabbitmq/plugins/lookup/rabbitmq.py
index 9ecd97e5f..16a93868c 100644
--- a/ansible_collections/community/rabbitmq/plugins/lookup/rabbitmq.py
+++ b/ansible_collections/community/rabbitmq/plugins/lookup/rabbitmq.py
@@ -98,14 +98,13 @@ RETURN = """
import json
-from ansible.errors import AnsibleError, AnsibleParserError
+from ansible.errors import AnsibleError
from ansible.plugins.lookup import LookupBase
from ansible.module_utils._text import to_native, to_text
from ansible.utils.display import Display
try:
import pika
- from pika import spec
HAS_PIKA = True
except ImportError:
HAS_PIKA = False
diff --git a/ansible_collections/community/rabbitmq/plugins/module_utils/rabbitmq.py b/ansible_collections/community/rabbitmq/plugins/module_utils/rabbitmq.py
index f981c8539..5f00acc91 100644
--- a/ansible_collections/community/rabbitmq/plugins/module_utils/rabbitmq.py
+++ b/ansible_collections/community/rabbitmq/plugins/module_utils/rabbitmq.py
@@ -21,7 +21,6 @@ PIKA_IMP_ERR = None
try:
import pika
import pika.exceptions
- from pika import spec
HAS_PIKA = True
except ImportError:
PIKA_IMP_ERR = traceback.format_exc()
diff --git a/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_parameter.py b/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_parameter.py
index 5ecbd4ec4..8728bf757 100644
--- a/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_parameter.py
+++ b/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_parameter.py
@@ -55,6 +55,21 @@ EXAMPLES = r"""
name: local-username
value: '"guest"'
state: present
+
+- name: Create or update a shovel
+ vars:
+ payload:
+ src-protocol: "amqp091"
+ src-uri: "amqp://"
+ src-queue: "src-queue"
+ dest-protocol: "amqp091"
+ dest-uri: "amqp://guest:guest@example.com"
+ dest-queue: "dest-queue"
+ community.rabbitmq.rabbitmq_parameter:
+ component: shovel
+ name: "shovel-name"
+ value: "{{ payload | to_json }}"
+ state: present
"""
import json
from ansible.module_utils.basic import AnsibleModule
diff --git a/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_publish.py b/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_publish.py
index 38b5a64bb..e4054deaa 100644
--- a/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_publish.py
+++ b/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_publish.py
@@ -187,15 +187,7 @@ result:
'result': { 'content_type': 'text/plain', 'msg': 'Successfully published to queue test', 'queue': 'test' }
'''
-try:
- import pika
- HAS_PIKA = True
-except ImportError:
- HAS_PIKA = False
-
-
from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils._text import to_native, to_text
from ansible_collections.community.rabbitmq.plugins.module_utils.rabbitmq import RabbitClient
diff --git a/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py b/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py
index 87d6864fc..b941b759f 100644
--- a/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py
+++ b/ansible_collections/community/rabbitmq/plugins/modules/rabbitmq_user.py
@@ -5,8 +5,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
+__metaclass__ = type
DOCUMENTATION = r'''
---
@@ -30,7 +30,8 @@ options:
type: str
tags:
description:
- - User tags specified as comma delimited
+ - User tags specified as comma delimited.
+ - The suggested tags to use are management, policymaker, monitoring and administrator.
type: str
permissions:
description:
@@ -103,9 +104,36 @@ options:
description:
- C(on_create) will only set the password for newly created users. C(always) will update passwords if they differ.
type: str
- required: false
default: on_create
choices: ['on_create', 'always']
+ login_protocol:
+ description:
+ - Specify which TCP/IP protocol will be used.
+ type: str
+ default: http
+ choices: ['http', 'https']
+ version_added: '1.3.0'
+ login_host:
+ description:
+ - Hostname of API.
+ type: str
+ version_added: '1.3.0'
+ login_port:
+ description:
+ - login_port of access from API.
+ type: str
+ default: '15672'
+ version_added: '1.3.0'
+ login_user:
+ description:
+ - Administrator's username the management API.
+ type: str
+ version_added: '1.3.0'
+ login_password:
+ description:
+ - Login password of the management API.
+ type: str
+ version_added: '1.3.0'
'''
EXAMPLES = r'''
@@ -146,13 +174,64 @@ EXAMPLES = r'''
read_priv: .*
write_priv: 'prod\\.logging\\..*'
state: present
+
+- name: |-
+ Add or Update a user using the API
+ community.rabbitmq.rabbitmq_user:
+ user: joe
+ password: changeme
+ tags: monitoring
+ login_protocol: https
+ login_host: localhost
+ login_port: 15672
+ login_user: admin
+ login_password: changeadmin
+ permissions:
+ - vhost: /
+ configure_priv: .*
+ read_priv: .*
+ write_priv: .*
+ topic_permissions:
+ - vhost: /
+ exchange: amq.topic
+ read_priv: .*
+ write_priv: 'prod\\.logging\\..*'
+ state: present
+
+
+- name: |-
+ Remove a user using the API
+ community.rabbitmq.rabbitmq_user:
+ user: joe
+ password: changeme
+ tags: monitoring
+ login_protocol: https
+ login_host: localhost
+ login_port: 15672
+ login_user: admin
+ login_password: changeadmin
+ state: absent
+
'''
-import ansible_collections.community.rabbitmq.plugins.module_utils.version as Version
-import json
-import re
+import ansible_collections.community.rabbitmq.plugins.module_utils.version as Version # noqa: E402
+import json # noqa: E402
+import re # noqa: E402
+
+from ansible.module_utils.six.moves.urllib import parse
+
+import traceback
+
+REQUESTS_IMP_ERR = None
+try:
+ import requests
+
+ HAS_REQUESTS = True
+except ImportError:
+ REQUESTS_IMP_ERR = traceback.format_exc()
+ HAS_REQUESTS = False
-from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.basic import AnsibleModule # noqa: E402
from ansible.module_utils.common.collections import count
@@ -193,9 +272,24 @@ def first(iterable):
return next(iter(iterable))
+def treat_permissions_for_api(permissions):
+ return {
+ "configure": permissions.get('configure') if permissions.get('configure') else '^$',
+ "write": permissions.get('write') if permissions.get('write') else '^$',
+ "read": permissions.get('read') if permissions.get('read') else '^$'
+ }
+
+
+def treat_topic_permissions_for_api(permissions):
+ return {"exchange": permissions.get('exchange'), "write": permissions.get('write'),
+ "read": permissions.get('read')}
+
+
class RabbitMqUser(object):
def __init__(self, module, username, password, tags, permissions,
- topic_permissions, node, bulk_permissions=False):
+ topic_permissions, node, bulk_permissions=False,
+ login_protocol=None, login_host=None, login_port=None,
+ login_user=None, login_password=None):
self.module = module
self.username = username
self.password = password or ''
@@ -204,12 +298,21 @@ class RabbitMqUser(object):
self.permissions = as_permission_dict(permissions)
self.topic_permissions = as_topic_permission_dict(topic_permissions)
self.bulk_permissions = bulk_permissions
+ self.login_protocol = login_protocol
+ self.login_host = login_host
+ self.login_port = login_port
+ self.login_user = login_user
+ self.login_password = login_password
self.existing_tags = None
self.existing_permissions = dict()
self.existing_topic_permissions = dict()
- self._rabbitmqctl = module.get_bin_path('rabbitmqctl', True)
- self._version = self._check_version()
+ if self.login_host is not None:
+ self._rabbitmqctl = module.get_bin_path('rabbitmqctl', False)
+ self._version = None
+ else:
+ self._rabbitmqctl = module.get_bin_path('rabbitmqctl', True)
+ self._version = self._check_version()
def _check_version(self):
"""Get the version of the RabbitMQ server."""
@@ -233,6 +336,7 @@ class RabbitMqUser(object):
version of `rabbitmqctl` we are using, so we will try to use the JSON formatter and see
what happens. In some versions of
"""
+
def int_list_to_str(ints):
return ''.join([chr(i) for i in ints])
@@ -318,22 +422,39 @@ class RabbitMqUser(object):
If the version of the node is >= 3.7.6 the JSON formatter will be used, otherwise the plaintext will be
parsed.
"""
- if self._version >= Version.StrictVersion('3.7.6'):
- users = dict([(user_entry['user'], user_entry['tags'])
- for user_entry in json.loads(self._exec(['list_users', '--formatter', 'json']))])
+ users = dict()
+ if self.login_host is not None:
+ response = self.request_users_api('GET')
+ if response.status_code == 200:
+ if isinstance(response.json(), list):
+ users = dict([(user_entry['name'], user_entry['tags']) for user_entry in response.json()])
+ else:
+ users = {response.json()['name']: response.json()['tags']}
+ elif response.status_code == 404:
+ return None
+ else:
+ self.module.fail_json(
+ msg="Error getting the user",
+ status=response.status_code,
+ details=response.text
+ )
else:
- users = self._exec(['list_users'])
+ if self._version >= Version.StrictVersion('3.7.6'):
+ users = dict([(user_entry['user'], user_entry['tags'])
+ for user_entry in json.loads(self._exec(['list_users', '--formatter', 'json']))])
+ else:
+ users = self._exec(['list_users'])
- def process_tags(tags):
- if not tags:
- return list()
- return tags.replace('[', '').replace(']', '').replace(' ', '').strip('\t').split(',')
+ def process_tags(tags):
+ if not tags:
+ return list()
+ return tags.replace('[', '').replace(']', '').replace(' ', '').strip('\t').split(',')
- users_and_tags = [user_entry.split('\t') for user_entry in users.strip().split('\n')]
+ users_and_tags = [user_entry.split('\t') for user_entry in users.strip().split('\n')]
- users = dict()
- for user_parts in users_and_tags:
- users[user_parts[0]] = process_tags(user_parts[1]) if len(user_parts) > 1 else []
+ users = dict()
+ for user_parts in users_and_tags:
+ users[user_parts[0]] = process_tags(user_parts[1]) if len(user_parts) > 1 else []
self.existing_tags = users.get(self.username, list())
self.existing_permissions = self._get_permissions() if self.username in users else dict()
@@ -342,17 +463,48 @@ class RabbitMqUser(object):
def _get_permissions(self):
"""Get permissions of the user from RabbitMQ."""
- if self._version >= Version.StrictVersion('3.7.6'):
- permissions = json.loads(self._exec(['list_user_permissions', self.username, '--formatter', 'json']))
+ if self.login_host is not None:
+ try:
+ response = requests.get(self.get_permissions_api_url_builder(self.username),
+ auth=(self.login_user,
+ self.login_password))
+ except requests.exceptions.RequestException as exception:
+ msg = ("Error trying to request topic permissions "
+ "of the user %s info in rabbitmq.") % (self.username)
+ self.module.fail_json(
+ msg=msg,
+ exception=exception,
+ )
+
+ if response.ok or (response.status_code == 204):
+ permissions = list()
+ for permission in response.json():
+ permissions.append({
+ "vhost": permission.get('vhost'),
+ "configure": permission.get('configure'),
+ "write": permission.get('write'),
+ "read": permission.get('read')
+ })
+ elif response.status_code == 404:
+ return None
+ else:
+ self.module.fail_json(
+ msg="Error getting the user",
+ status=response.status_code,
+ details=response.text
+ )
else:
- output = self._exec(['list_user_permissions', self.username]).strip().split('\n')
- perms_out = [perm.split('\t') for perm in output if perm.strip()]
- # Filter out headers from the output of the command in case they are still present
- perms_out = [perm for perm in perms_out if perm != ["vhost", "configure", "write", "read"]]
+ if self._version >= Version.StrictVersion('3.7.6'):
+ permissions = json.loads(self._exec(['list_user_permissions', self.username, '--formatter', 'json']))
+ else:
+ output = self._exec(['list_user_permissions', self.username]).strip().split('\n')
+ perms_out = [perm.split('\t') for perm in output if perm.strip()]
+ # Filter out headers from the output of the command in case they are still present
+ perms_out = [perm for perm in perms_out if perm != ["vhost", "configure", "write", "read"]]
- permissions = list()
- for vhost, configure, write, read in perms_out:
- permissions.append(dict(vhost=vhost, configure=configure, write=write, read=read))
+ permissions = list()
+ for vhost, configure, write, read in perms_out:
+ permissions.append(dict(vhost=vhost, configure=configure, write=write, read=read))
if self.bulk_permissions:
return as_permission_dict(permissions)
@@ -361,58 +513,166 @@ class RabbitMqUser(object):
def _get_topic_permissions(self):
"""Get topic permissions of the user from RabbitMQ."""
- if self._version < Version.StrictVersion('3.7.0'):
- return dict()
- if self._version >= Version.StrictVersion('3.7.6'):
- permissions = json.loads(self._exec(['list_user_topic_permissions', self.username, '--formatter', 'json']))
+ if self.login_host is not None:
+ try:
+ response = requests.get(self.get_topic_permissions_api_url_builder(self.username),
+ auth=(self.login_user,
+ self.login_password))
+ except requests.exceptions.RequestException as exception:
+ msg = ("Error trying to request permissions "
+ "of the user %s info in rabbitmq.") % (self.username)
+ self.module.fail_json(
+ msg=msg,
+ exception=exception,
+ )
+
+ if response.ok or (response.status_code == 204):
+ permissions = list()
+ for permission in response.json():
+ permissions.append({
+ "vhost": permission.get('vhost'),
+ "exchange": permission.get('exchange'),
+ "write": permission.get('write'),
+ "read": permission.get('read')
+ })
+ return as_topic_permission_dict(permissions)
+ elif response.status_code == 404:
+ return None
+ else:
+ self.module.fail_json(
+ msg="Error getting the user",
+ status=response.status_code,
+ details=response.text
+ )
else:
- output = self._exec(['list_user_topic_permissions', self.username]).strip().split('\n')
- perms_out = [perm.split('\t') for perm in output if perm.strip()]
- permissions = list()
- for vhost, exchange, write, read in perms_out:
- permissions.append(dict(vhost=vhost, exchange=exchange, write=write, read=read))
- return as_topic_permission_dict(permissions)
+ if self._version < Version.StrictVersion('3.7.0'):
+ return dict()
+ if self._version >= Version.StrictVersion('3.7.6'):
+ permissions = json.loads(
+ self._exec(['list_user_topic_permissions', self.username, '--formatter', 'json']))
+ else:
+ output = self._exec(['list_user_topic_permissions', self.username]).strip().split('\n')
+ perms_out = [perm.split('\t') for perm in output if perm.strip()]
+ permissions = list()
+ for vhost, exchange, write, read in perms_out:
+ permissions.append(dict(vhost=vhost, exchange=exchange, write=write, read=read))
+ return as_topic_permission_dict(permissions)
def check_password(self):
"""Return `True` if the user can authenticate successfully."""
- rc, out, err = self._exec(['authenticate_user', self.username, self.password], check_rc=False)
- return rc == 0
+ if self.login_host is not None:
+ url = "%s://%s:%s/api/whoami" % (
+ self.login_protocol,
+ self.login_host,
+ self.login_port)
+ try:
+ response = requests.get(url, auth=(self.login_user, self.login_password))
+ except requests.exceptions.RequestException as exception:
+ msg = ("Error trying to request permissions "
+ "of the user %s info in rabbitmq.") % (self.username)
+ self.module.fail_json(
+ msg=msg,
+ exception=exception,
+ )
+
+ if response.ok or response.json().get('reason') == "Not management user":
+ return True
+ else:
+ return False
+ else:
+ rc, out, err = self._exec(['authenticate_user', self.username, self.password], check_rc=False)
+ return rc == 0
def add(self):
- self._exec(['add_user', self.username, self.password or ''])
- if not self.password:
- self._exec(['clear_password', self.username])
+ if self.login_host is not None:
+ data = {"password": self.password, "tags": self.treat_tags_for_api() or ""}
+ response = self.request_users_api('PUT', data)
+
+ if not response.ok or (response.status_code == 204):
+ msg = ("Error trying to create user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+ else:
+ self._exec(['add_user', self.username, self.password or ''])
+ if not self.password:
+ self._exec(['clear_password', self.username])
def delete(self):
- self._exec(['delete_user', self.username])
+ if self.login_host is not None:
+ response = self.request_users_api('DELETE')
+ if response.status_code != 204:
+ msg = ("Error trying to remove user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+ else:
+ self._exec(['delete_user', self.username])
def change_password(self):
- if self.password:
- self._exec(['change_password', self.username, self.password])
+ if self.login_host is not None:
+ data = {"password": self.password or "", "tags": self.tags or ""}
+ response = self.request_users_api('PUT', data)
+
+ if not response.ok or (response.status_code == 204):
+ msg = ("Error trying to set tags for the user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+ else:
+ self.module.fail_json(
+ msg="Error setting tags for the user",
+ status=response.status_code,
+ details=response.text
+ )
else:
- self._exec(['clear_password', self.username])
+ if self.password:
+ self._exec(['change_password', self.username, self.password])
+ else:
+ self._exec(['clear_password', self.username])
def set_tags(self):
- self._exec(['set_user_tags', self.username] + self.tags)
+ if self.login_host is not None:
+ data = {"password": self.password, "tags": self.treat_tags_for_api() or ""}
+ response = self.request_users_api('PUT', data)
+
+ if not response.status_code == 204:
+ msg = ("Error trying to set tags for the user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+
+ else:
+ self._exec(['set_user_tags', self.username] + self.tags)
def set_permissions(self):
permissions_to_add = list()
for vhost, permission_dict in self.permissions.items():
if permission_dict != self.existing_permissions.get(vhost, {}):
permissions_to_add.append(permission_dict)
-
permissions_to_clear = list()
for vhost in self.existing_permissions.keys():
if vhost not in self.permissions:
permissions_to_clear.append(vhost)
for vhost in permissions_to_clear:
- cmd = 'clear_permissions -p {vhost} {username}'.format(username=self.username, vhost=vhost)
- self._exec(cmd.split(' '))
+ if self.login_host is not None:
+ response = self.request_permissions_api('DELETE', vhost)
+ if response.status_code != 204:
+ msg = ("Error trying to remove permission from user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+ else:
+ cmd = 'clear_permissions -p {vhost} {username}'.format(username=self.username, vhost=vhost)
+ self._exec(cmd.split(' '))
for permissions in permissions_to_add:
- cmd = ('set_permissions -p {vhost} {username} {configure} {write} {read}'
- .format(username=self.username, **permissions))
- self._exec(cmd.split(' '))
+ if self.login_host is not None:
+ response = self.request_permissions_api('PUT', permissions.get('vhost'),
+ data=treat_permissions_for_api(permissions))
+ if response.status_code not in (201, 204):
+ msg = ("Error trying to add permission to user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+ else:
+ cmd = ('set_permissions -p {vhost} {username} {configure} {write} {read}'
+ .format(username=self.username, **permissions))
+ self._exec(cmd.split(' '))
self.existing_permissions = self._get_permissions()
def set_topic_permissions(self):
@@ -428,13 +688,28 @@ class RabbitMqUser(object):
for vhost_exchange in permissions_to_clear:
vhost, exchange = vhost_exchange
- cmd = ('clear_topic_permissions -p {vhost} {username} {exchange}'
- .format(username=self.username, vhost=vhost, exchange=exchange))
- self._exec(cmd.split(' '))
+ if self.login_host is not None:
+ response = self.request_topic_permissions_api('DELETE', vhost)
+ if response.status_code != 204:
+ msg = ("Error trying to remove topic permission from user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+ else:
+ cmd = ('clear_topic_permissions -p {vhost} {username} {exchange}'
+ .format(username=self.username, vhost=vhost, exchange=exchange))
+ self._exec(cmd.split(' '))
for permissions in permissions_to_add:
- cmd = ('set_topic_permissions -p {vhost} {username} {exchange} {write} {read}'
- .format(username=self.username, **permissions))
- self._exec(cmd.split(' '))
+ if self.login_host is not None:
+ response = self.request_topic_permissions_api('PUT', permissions.get('vhost'),
+ data=treat_topic_permissions_for_api(permissions))
+ if response.status_code not in (201, 204):
+ msg = ("Error trying to add topic permission to user %s in rabbitmq. "
+ "Status code '%s'.") % (self.username, response.status_code)
+ self.module.fail_json(msg=msg)
+ else:
+ cmd = ('set_topic_permissions -p {vhost} {username} {exchange} {write} {read}'
+ .format(username=self.username, **permissions))
+ self._exec(cmd.split(' '))
self.existing_topic_permissions = self._get_topic_permissions()
def has_tags_modifications(self):
@@ -446,6 +721,91 @@ class RabbitMqUser(object):
def has_topic_permissions_modifications(self):
return self.existing_topic_permissions != self.topic_permissions
+ def users_api_url_builder(self, username):
+ return "%s://%s:%s/api/users/%s" % (
+ self.login_protocol,
+ self.login_host,
+ self.login_port,
+ parse.quote(username, ""),
+ )
+
+ def get_permissions_api_url_builder(self, username):
+ return "%s://%s:%s/api/users/%s/permissions" % (
+ self.login_protocol,
+ self.login_host,
+ self.login_port,
+ username,
+ )
+
+ def get_topic_permissions_api_url_builder(self, username):
+ return "%s://%s:%s/api/users/%s/topic-permissions" % (
+ self.login_protocol,
+ self.login_host,
+ self.login_port,
+ username,
+ )
+
+ def permissions_api_url_builder(self, username, vhost):
+ if vhost is None or vhost == "/":
+ vhost = "%2F"
+ return "%s://%s:%s/api/permissions/%s/%s" % (
+ self.login_protocol,
+ self.login_host,
+ self.login_port,
+ vhost,
+ username,
+ )
+
+ def topic_permissions_api_url_builder(self, username, vhost):
+ if vhost is None or vhost == "/":
+ vhost = "%2F"
+ return "%s://%s:%s/api/topic-permissions/%s/%s" % (
+ self.login_protocol,
+ self.login_host,
+ self.login_port,
+ vhost,
+ username,
+ )
+
+ def treat_tags_for_api(self):
+ return ','.join(tag for tag in self.tags)
+
+ def request_users_api(self, method, data=None):
+ try:
+ response = requests.request(method, self.users_api_url_builder(self.username),
+ auth=(self.login_user, self.login_password), json=data)
+ except requests.exceptions.RequestException as exception:
+ msg = "Error in HTTP request (method %s) for user %s in rabbitmq." % (
+ method.lower(),
+ self.username,
+ )
+ self.module.fail_json(msg=msg, exception=exception)
+ return response
+
+ def request_permissions_api(self, method, vhost=None, data=None):
+ try:
+ response = requests.request(method, self.permissions_api_url_builder(self.username, vhost),
+ auth=(self.login_user, self.login_password), json=data)
+ except requests.exceptions.RequestException as exception:
+ msg = "Error in HTTP request (method %s) for user's permission %s in rabbitmq." % (
+ method.lower(),
+ self.username,
+ )
+ self.module.fail_json(msg=msg, exception=exception)
+ return response
+
+ def request_topic_permissions_api(self, method, vhost=None, data=None):
+ try:
+ response = requests.request(method, self.topic_permissions_api_url_builder(self.username, vhost),
+ auth=(self.login_user, self.login_password), json=data)
+ except requests.exceptions.RequestException as exception:
+ msg = "Error in HTTP request (method %s) for topic permission for user %s in rabbitmq." % (
+ method.lower(),
+ self.username,
+ )
+ self.module.fail_json(msg=msg, exception=exception)
+ return response
+
def main():
arg_spec = dict(
@@ -461,7 +821,12 @@ def main():
force=dict(default='no', type='bool'),
state=dict(default='present', choices=['present', 'absent']),
node=dict(default='rabbit'),
- update_password=dict(default='on_create', choices=['on_create', 'always'], no_log=False)
+ update_password=dict(default='on_create', choices=['on_create', 'always'], no_log=False),
+ login_protocol=dict(type="str", default="http", choices=["http", "https"]),
+ login_host=dict(type="str"),
+ login_port=dict(type="str", default="15672"),
+ login_user=dict(type="str", no_log=True),
+ login_password=dict(type="str", no_log=True)
)
module = AnsibleModule(
argument_spec=arg_spec,
@@ -481,6 +846,11 @@ def main():
state = module.params['state']
node = module.params['node']
update_password = module.params['update_password']
+ login_protocol = module.params['login_protocol']
+ login_host = module.params['login_host']
+ login_port = module.params['login_port']
+ login_user = module.params['login_user']
+ login_password = module.params['login_password']
if permissions:
vhosts = [permission.get('vhost', '/') for permission in permissions]
@@ -510,7 +880,7 @@ def main():
for permission in permissions:
if not permission['vhost']:
- module.fail_json(msg="Error parsing vhost permissions: You can't"
+ module.fail_json(msg="Error parsing vhost permissions: You can't "
"have an empty vhost when setting permissions")
for permission in topic_permissions:
@@ -524,7 +894,9 @@ def main():
rabbitmq_user = RabbitMqUser(module, username, password, tags, permissions,
topic_permissions, node,
- bulk_permissions=bulk_permissions)
+ bulk_permissions=bulk_permissions, login_protocol=login_protocol,
+ login_host=login_host, login_port=login_port, login_user=login_user,
+ login_password=login_password)
result = dict(changed=False, user=username, state=state)
if rabbitmq_user.get():
diff --git a/ansible_collections/community/rabbitmq/tests/integration/targets/lookup_rabbitmq/tasks/main.yml b/ansible_collections/community/rabbitmq/tests/integration/targets/lookup_rabbitmq/tasks/main.yml
index 740f89980..9808b9ec7 100644
--- a/ansible_collections/community/rabbitmq/tests/integration/targets/lookup_rabbitmq/tasks/main.yml
+++ b/ansible_collections/community/rabbitmq/tests/integration/targets/lookup_rabbitmq/tasks/main.yml
@@ -1,5 +1,5 @@
# Rabbitmq lookup
-- include: ubuntu.yml
- when:
+- include_tasks: ubuntu.yml
+ when:
- ansible_distribution == 'Ubuntu'
- ansible_distribution_release != 'trusty'
diff --git a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_publish/tasks/main.yml b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_publish/tasks/main.yml
index 740f89980..9808b9ec7 100644
--- a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_publish/tasks/main.yml
+++ b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_publish/tasks/main.yml
@@ -1,5 +1,5 @@
# Rabbitmq lookup
-- include: ubuntu.yml
- when:
+- include_tasks: ubuntu.yml
+ when:
- ansible_distribution == 'Ubuntu'
- ansible_distribution_release != 'trusty'
diff --git a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_queue/tasks/main.yml b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_queue/tasks/main.yml
index 740f89980..9808b9ec7 100644
--- a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_queue/tasks/main.yml
+++ b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_queue/tasks/main.yml
@@ -1,5 +1,5 @@
# Rabbitmq lookup
-- include: ubuntu.yml
- when:
+- include_tasks: ubuntu.yml
+ when:
- ansible_distribution == 'Ubuntu'
- ansible_distribution_release != 'trusty'
diff --git a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/main.yml b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/main.yml
index e03d4c7aa..9db0b6ee6 100644
--- a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/main.yml
+++ b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/main.yml
@@ -5,6 +5,8 @@
- import_tasks: tests.yml
+ - import_tasks: tests_api.yml
+
- import_tasks: tests.yml
environment:
RABBITMQ_NODENAME: test
diff --git a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/tests_api.yml b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/tests_api.yml
new file mode 100644
index 000000000..51ded8778
--- /dev/null
+++ b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user/tasks/tests_api.yml
@@ -0,0 +1,131 @@
+---
+
+- name: Test add user
+ block:
+ - name: Add user
+ rabbitmq_user: user=joe password=changeme login_user=guest login_password=guest login_host=127.0.0.1
+ register: add_user
+
+ - name: Check that user adding succeeds with a change
+ assert:
+ that:
+ - add_user.changed == true
+
+- name: Test add user idempotence
+ block:
+ - name: Add user
+ rabbitmq_user: user=joe password=changeme login_user=guest login_password=guest login_host=127.0.0.1
+ register: add_user
+
+ - name: Check that user adding succeeds without a change
+ assert:
+ that:
+ - add_user.changed == false
+
+- name: Test change user permissions
+ block:
+ - name: Add user with permissions
+ rabbitmq_user: user=joe password=changeme vhost=/ configure_priv=.* read_priv=.* write_priv=.* login_user=guest login_password=guest login_host=127.0.0.1
+ register: add_user
+
+ - name: Check that changing permissions succeeds with a change
+ assert:
+ that:
+ - add_user.changed == true
+
+- name: Test change user permissions idempotence
+ block:
+ - name: Add user with permissions
+ rabbitmq_user: user=joe password=changeme vhost=/ configure_priv=.* read_priv=.* write_priv=.* login_user=guest login_password=guest login_host=127.0.0.1
+ register: add_user
+
+ - name: Check that changing permissions succeeds without a change
+ assert:
+ that:
+ - add_user.changed == false
+
+- name: Test change user topic permissions
+ block:
+ - name: Add user with topic permissions
+ rabbitmq_user:
+ user: joe
+ password: changeme
+ topic_permissions:
+ - vhost: /
+ exchange: amq.topic
+ read_priv: .*
+ write_priv: .*
+ login_user: guest
+ login_password: guest
+ login_host: 127.0.0.1
+ register: add_user
+
+ - name: Check that changing topic permissions succeeds with a change
+ assert:
+ that:
+ - add_user.changed == true
+
+- name: Test change user topic permissions idempotence
+ block:
+ - name: Add user with topic permissions
+ rabbitmq_user:
+ user: joe
+ password: changeme
+ topic_permissions:
+ - vhost: /
+ exchange: amq.topic
+ read_priv: .*
+ write_priv: .*
+ login_user: guest
+ login_password: guest
+ login_host: 127.0.0.1
+ register: add_user
+
+ - name: Check that changing topic permissions succeeds without a change
+ assert:
+ that:
+ - add_user.changed == false
+
+- name: Test add user tags
+ block:
+ - name: Add user with tags
+ rabbitmq_user: user=joe password=changeme vhost=/ configure_priv=.* read_priv=.* write_priv=.* tags=management,administrator login_user=guest login_password=guest login_host=127.0.0.1
+ register: add_user
+
+ - name: Check that adding tags succeeds with a change
+ assert:
+ that:
+ - add_user.changed == true
+
+- name: Test add user tags idempotence
+ block:
+ - name: Add user with tags
+ rabbitmq_user: user=joe password=changeme vhost=/ configure_priv=.* read_priv=.* write_priv=.* tags=administrator,management login_user=guest login_password=guest login_host=127.0.0.1
+ register: add_user
+
+ - name: Check that adding tags succeeds without a change
+ assert:
+ that:
+ - add_user.changed == false
+
+- name: Test remove user
+ block:
+ - name: Remove user
+ rabbitmq_user: user=joe state=absent login_user=guest login_password=guest login_host=127.0.0.1
+ register: remove_user
+
+ - name: Check that user removing succeeds with a change
+ assert:
+ that:
+ - remove_user.changed == true
+
+- name: Test remove user idempotence
+ block:
+ - name: Remove user
+ rabbitmq_user: user=joe state=absent login_user=guest login_password=guest login_host=127.0.0.1
+ register: remove_user
+
+ - name: Check that user removing succeeds without a change
+ assert:
+ that:
+ - remove_user.changed == false
diff --git a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/tasks/main.yml b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/tasks/main.yml
index 740f89980..9808b9ec7 100644
--- a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/tasks/main.yml
+++ b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_user_limits/tasks/main.yml
@@ -1,5 +1,5 @@
# Rabbitmq lookup
-- include: ubuntu.yml
- when:
+- include_tasks: ubuntu.yml
+ when:
- ansible_distribution == 'Ubuntu'
- ansible_distribution_release != 'trusty'
diff --git a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_vhost_limits/tasks/main.yml b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_vhost_limits/tasks/main.yml
index 740f89980..9808b9ec7 100644
--- a/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_vhost_limits/tasks/main.yml
+++ b/ansible_collections/community/rabbitmq/tests/integration/targets/rabbitmq_vhost_limits/tasks/main.yml
@@ -1,5 +1,5 @@
# Rabbitmq lookup
-- include: ubuntu.yml
- when:
+- include_tasks: ubuntu.yml
+ when:
- ansible_distribution == 'Ubuntu'
- ansible_distribution_release != 'trusty'
diff --git a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.10.txt b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.10.txt
deleted file mode 100644
index caf221794..000000000
--- a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.10.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-tests/utils/shippable/check_matrix.py replace-urlopen
-tests/utils/shippable/timing.py shebang
diff --git a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.11.txt b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.11.txt
deleted file mode 100644
index caf221794..000000000
--- a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.11.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-tests/utils/shippable/check_matrix.py replace-urlopen
-tests/utils/shippable/timing.py shebang
diff --git a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.15.txt b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.15.txt
index caf221794..8fd3dfc11 100644
--- a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.15.txt
+++ b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.15.txt
@@ -1,2 +1,4 @@
tests/utils/shippable/check_matrix.py replace-urlopen
tests/utils/shippable/timing.py shebang
+plugins/module_utils/version.py pylint:unused-import
+tests/unit/compat/builtins.py pylint:unused-import
diff --git a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.16.txt b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.16.txt
new file mode 100644
index 000000000..fe7e62dfc
--- /dev/null
+++ b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.16.txt
@@ -0,0 +1,3 @@
+tests/utils/shippable/timing.py shebang
+plugins/module_utils/version.py pylint:unused-import
+tests/unit/compat/builtins.py pylint:unused-import
diff --git a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.17.txt b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.17.txt
new file mode 100644
index 000000000..fe7e62dfc
--- /dev/null
+++ b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.17.txt
@@ -0,0 +1,3 @@
+tests/utils/shippable/timing.py shebang
+plugins/module_utils/version.py pylint:unused-import
+tests/unit/compat/builtins.py pylint:unused-import
diff --git a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.9.txt b/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.9.txt
deleted file mode 100644
index caf221794..000000000
--- a/ansible_collections/community/rabbitmq/tests/sanity/ignore-2.9.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-tests/utils/shippable/check_matrix.py replace-urlopen
-tests/utils/shippable/timing.py shebang
diff --git a/ansible_collections/community/rabbitmq/tests/sanity/ignore.txt b/ansible_collections/community/rabbitmq/tests/sanity/ignore.txt
deleted file mode 100644
index caf221794..000000000
--- a/ansible_collections/community/rabbitmq/tests/sanity/ignore.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-tests/utils/shippable/check_matrix.py replace-urlopen
-tests/utils/shippable/timing.py shebang
diff --git a/ansible_collections/community/rabbitmq/tests/unit/compat/mock.py b/ansible_collections/community/rabbitmq/tests/unit/compat/mock.py
index 0972cd2e8..c7d018307 100644
--- a/ansible_collections/community/rabbitmq/tests/unit/compat/mock.py
+++ b/ansible_collections/community/rabbitmq/tests/unit/compat/mock.py
@@ -64,8 +64,7 @@ if sys.version_info >= (3,) and sys.version_info < (3, 4, 4):
# newline that our naive format() added
data_as_list[-1] = data_as_list[-1][:-1]
- for line in data_as_list:
- yield line
+ yield from data_as_list
def mock_open(mock=None, read_data=''):
"""
@@ -93,8 +92,7 @@ if sys.version_info >= (3,) and sys.version_info < (3, 4, 4):
if handle.readline.return_value is not None:
while True:
yield handle.readline.return_value
- for line in _data:
- yield line
+ yield from _data
global file_spec
if file_spec is None:
diff --git a/ansible_collections/community/rabbitmq/tests/unit/mock/loader.py b/ansible_collections/community/rabbitmq/tests/unit/mock/loader.py
index 00a584127..e25731e03 100644
--- a/ansible_collections/community/rabbitmq/tests/unit/mock/loader.py
+++ b/ansible_collections/community/rabbitmq/tests/unit/mock/loader.py
@@ -30,7 +30,7 @@ class DictDataLoader(DataLoader):
def __init__(self, file_mapping=None):
file_mapping = {} if file_mapping is None else file_mapping
- assert type(file_mapping) == dict
+ assert isinstance(file_mapping, dict)
super(DictDataLoader, self).__init__()
diff --git a/ansible_collections/community/rabbitmq/tests/utils/shippable/shippable.sh b/ansible_collections/community/rabbitmq/tests/utils/shippable/shippable.sh
index f9b187212..1f69f87e3 100755
--- a/ansible_collections/community/rabbitmq/tests/utils/shippable/shippable.sh
+++ b/ansible_collections/community/rabbitmq/tests/utils/shippable/shippable.sh
@@ -67,6 +67,7 @@ if [ "${SHIPPABLE_BUILD_ID:-}" ]; then
SHIPPABLE_RESULT_DIR="$(pwd)/shippable"
TEST_DIR="${ANSIBLE_COLLECTIONS_PATHS}/ansible_collections/community/rabbitmq"
mkdir -p "${TEST_DIR}"
+ # shellcheck disable=SC2153
cp -aT "${SHIPPABLE_BUILD_DIR}" "${TEST_DIR}"
cd "${TEST_DIR}"
else
diff --git a/ansible_collections/community/routeros/.github/workflows/ansible-test.yml b/ansible_collections/community/routeros/.github/workflows/ansible-test.yml
index 0444f593f..f743ae51a 100644
--- a/ansible_collections/community/routeros/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/routeros/.github/workflows/ansible-test.yml
@@ -34,6 +34,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
# Ansible-test on various stable branches does not yet work well with cgroups v2.
# Since ubuntu-latest now uses Ubuntu 22.04, we need to fall back to the ubuntu-20.04
@@ -79,6 +80,7 @@ jobs:
- stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
- devel
steps:
@@ -113,6 +115,7 @@ jobs:
python:
- "3.10"
- "3.11"
+ - "3.12"
include:
# 2.9
- ansible: stable-2.9
@@ -142,6 +145,9 @@ jobs:
# 2.16
- ansible: stable-2.16
python: "3.10"
+ # 2.17
+ - ansible: stable-2.17
+ python: "3.12"
steps:
- name: >-
diff --git a/ansible_collections/community/routeros/CHANGELOG.md b/ansible_collections/community/routeros/CHANGELOG.md
index 99d0bbe6a..adb4f7420 100644
--- a/ansible_collections/community/routeros/CHANGELOG.md
+++ b/ansible_collections/community/routeros/CHANGELOG.md
@@ -2,106 +2,109 @@
**Topics**
-- <a href="#v2-14-0">v2\.14\.0</a>
+- <a href="#v2-15-0">v2\.15\.0</a>
- <a href="#release-summary">Release Summary</a>
- <a href="#minor-changes">Minor Changes</a>
-- <a href="#v2-13-0">v2\.13\.0</a>
+- <a href="#v2-14-0">v2\.14\.0</a>
- <a href="#release-summary-1">Release Summary</a>
- <a href="#minor-changes-1">Minor Changes</a>
- - <a href="#bugfixes">Bugfixes</a>
-- <a href="#v2-12-0">v2\.12\.0</a>
+- <a href="#v2-13-0">v2\.13\.0</a>
- <a href="#release-summary-2">Release Summary</a>
- <a href="#minor-changes-2">Minor Changes</a>
-- <a href="#v2-11-0">v2\.11\.0</a>
+ - <a href="#bugfixes">Bugfixes</a>
+- <a href="#v2-12-0">v2\.12\.0</a>
- <a href="#release-summary-3">Release Summary</a>
- <a href="#minor-changes-3">Minor Changes</a>
-- <a href="#v2-10-0">v2\.10\.0</a>
+- <a href="#v2-11-0">v2\.11\.0</a>
- <a href="#release-summary-4">Release Summary</a>
- <a href="#minor-changes-4">Minor Changes</a>
- - <a href="#bugfixes-1">Bugfixes</a>
-- <a href="#v2-9-0">v2\.9\.0</a>
+- <a href="#v2-10-0">v2\.10\.0</a>
- <a href="#release-summary-5">Release Summary</a>
- <a href="#minor-changes-5">Minor Changes</a>
+ - <a href="#bugfixes-1">Bugfixes</a>
+- <a href="#v2-9-0">v2\.9\.0</a>
+ - <a href="#release-summary-6">Release Summary</a>
+ - <a href="#minor-changes-6">Minor Changes</a>
- <a href="#bugfixes-2">Bugfixes</a>
- <a href="#v2-8-3">v2\.8\.3</a>
- - <a href="#release-summary-6">Release Summary</a>
+ - <a href="#release-summary-7">Release Summary</a>
- <a href="#known-issues">Known Issues</a>
- <a href="#v2-8-2">v2\.8\.2</a>
- - <a href="#release-summary-7">Release Summary</a>
+ - <a href="#release-summary-8">Release Summary</a>
- <a href="#bugfixes-3">Bugfixes</a>
- <a href="#v2-8-1">v2\.8\.1</a>
- - <a href="#release-summary-8">Release Summary</a>
+ - <a href="#release-summary-9">Release Summary</a>
- <a href="#bugfixes-4">Bugfixes</a>
- <a href="#v2-8-0">v2\.8\.0</a>
- - <a href="#release-summary-9">Release Summary</a>
- - <a href="#minor-changes-6">Minor Changes</a>
- - <a href="#bugfixes-5">Bugfixes</a>
-- <a href="#v2-7-0">v2\.7\.0</a>
- <a href="#release-summary-10">Release Summary</a>
- <a href="#minor-changes-7">Minor Changes</a>
- - <a href="#bugfixes-6">Bugfixes</a>
-- <a href="#v2-6-0">v2\.6\.0</a>
+ - <a href="#bugfixes-5">Bugfixes</a>
+- <a href="#v2-7-0">v2\.7\.0</a>
- <a href="#release-summary-11">Release Summary</a>
- <a href="#minor-changes-8">Minor Changes</a>
- - <a href="#bugfixes-7">Bugfixes</a>
-- <a href="#v2-5-0">v2\.5\.0</a>
+ - <a href="#bugfixes-6">Bugfixes</a>
+- <a href="#v2-6-0">v2\.6\.0</a>
- <a href="#release-summary-12">Release Summary</a>
- <a href="#minor-changes-9">Minor Changes</a>
- - <a href="#bugfixes-8">Bugfixes</a>
-- <a href="#v2-4-0">v2\.4\.0</a>
+ - <a href="#bugfixes-7">Bugfixes</a>
+- <a href="#v2-5-0">v2\.5\.0</a>
- <a href="#release-summary-13">Release Summary</a>
- <a href="#minor-changes-10">Minor Changes</a>
+ - <a href="#bugfixes-8">Bugfixes</a>
+- <a href="#v2-4-0">v2\.4\.0</a>
+ - <a href="#release-summary-14">Release Summary</a>
+ - <a href="#minor-changes-11">Minor Changes</a>
- <a href="#bugfixes-9">Bugfixes</a>
- <a href="#known-issues-1">Known Issues</a>
- <a href="#v2-3-1">v2\.3\.1</a>
- - <a href="#release-summary-14">Release Summary</a>
+ - <a href="#release-summary-15">Release Summary</a>
- <a href="#known-issues-2">Known Issues</a>
- <a href="#v2-3-0">v2\.3\.0</a>
- - <a href="#release-summary-15">Release Summary</a>
- - <a href="#minor-changes-11">Minor Changes</a>
+ - <a href="#release-summary-16">Release Summary</a>
+ - <a href="#minor-changes-12">Minor Changes</a>
- <a href="#bugfixes-10">Bugfixes</a>
- <a href="#v2-2-1">v2\.2\.1</a>
- - <a href="#release-summary-16">Release Summary</a>
+ - <a href="#release-summary-17">Release Summary</a>
- <a href="#bugfixes-11">Bugfixes</a>
- <a href="#v2-2-0">v2\.2\.0</a>
- - <a href="#release-summary-17">Release Summary</a>
- - <a href="#minor-changes-12">Minor Changes</a>
+ - <a href="#release-summary-18">Release Summary</a>
+ - <a href="#minor-changes-13">Minor Changes</a>
- <a href="#bugfixes-12">Bugfixes</a>
- <a href="#new-modules">New Modules</a>
- <a href="#v2-1-0">v2\.1\.0</a>
- - <a href="#release-summary-18">Release Summary</a>
- - <a href="#minor-changes-13">Minor Changes</a>
+ - <a href="#release-summary-19">Release Summary</a>
+ - <a href="#minor-changes-14">Minor Changes</a>
- <a href="#bugfixes-13">Bugfixes</a>
- <a href="#new-modules-1">New Modules</a>
- <a href="#v2-0-0">v2\.0\.0</a>
- - <a href="#release-summary-19">Release Summary</a>
- - <a href="#minor-changes-14">Minor Changes</a>
+ - <a href="#release-summary-20">Release Summary</a>
+ - <a href="#minor-changes-15">Minor Changes</a>
- <a href="#breaking-changes--porting-guide">Breaking Changes / Porting Guide</a>
- <a href="#bugfixes-14">Bugfixes</a>
- <a href="#new-plugins">New Plugins</a>
- <a href="#filter">Filter</a>
- <a href="#v1-2-0">v1\.2\.0</a>
- - <a href="#release-summary-20">Release Summary</a>
- - <a href="#minor-changes-15">Minor Changes</a>
- - <a href="#bugfixes-15">Bugfixes</a>
-- <a href="#v1-1-0">v1\.1\.0</a>
- <a href="#release-summary-21">Release Summary</a>
- <a href="#minor-changes-16">Minor Changes</a>
-- <a href="#v1-0-1">v1\.0\.1</a>
+ - <a href="#bugfixes-15">Bugfixes</a>
+- <a href="#v1-1-0">v1\.1\.0</a>
- <a href="#release-summary-22">Release Summary</a>
+ - <a href="#minor-changes-17">Minor Changes</a>
+- <a href="#v1-0-1">v1\.0\.1</a>
+ - <a href="#release-summary-23">Release Summary</a>
- <a href="#bugfixes-16">Bugfixes</a>
- <a href="#v1-0-0">v1\.0\.0</a>
- - <a href="#release-summary-23">Release Summary</a>
+ - <a href="#release-summary-24">Release Summary</a>
- <a href="#bugfixes-17">Bugfixes</a>
- <a href="#v0-1-1">v0\.1\.1</a>
- - <a href="#release-summary-24">Release Summary</a>
+ - <a href="#release-summary-25">Release Summary</a>
- <a href="#bugfixes-18">Bugfixes</a>
- <a href="#v0-1-0">v0\.1\.0</a>
- - <a href="#release-summary-25">Release Summary</a>
- - <a href="#minor-changes-17">Minor Changes</a>
+ - <a href="#release-summary-26">Release Summary</a>
+ - <a href="#minor-changes-18">Minor Changes</a>
-<a id="v2-14-0"></a>
-## v2\.14\.0
+<a id="v2-15-0"></a>
+## v2\.15\.0
<a id="release-summary"></a>
### Release Summary
@@ -111,6 +114,28 @@ Feature release\.
<a id="minor-changes"></a>
### Minor Changes
+* api\_info\, api\_modify \- Add RouterOS 7\.x support to <code>/mpls ldp</code> path \([https\://github\.com/ansible\-collections/community\.routeros/pull/271](https\://github\.com/ansible\-collections/community\.routeros/pull/271)\)\.
+* api\_info\, api\_modify \- add <code>/ip route rule</code> path for RouterOS 6\.x \([https\://github\.com/ansible\-collections/community\.routeros/pull/278](https\://github\.com/ansible\-collections/community\.routeros/pull/278)\)\.
+* api\_info\, api\_modify \- add <code>/routing filter</code> path for RouterOS 6\.x \([https\://github\.com/ansible\-collections/community\.routeros/pull/279](https\://github\.com/ansible\-collections/community\.routeros/pull/279)\)\.
+* api\_info\, api\_modify \- add default value for <code>from\-pool</code> field in <code>/ipv6 address</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/270](https\://github\.com/ansible\-collections/community\.routeros/pull/270)\)\.
+* api\_info\, api\_modify \- add missing path <code>/interface pppoe\-server server</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/273](https\://github\.com/ansible\-collections/community\.routeros/pull/273)\)\.
+* api\_info\, api\_modify \- add missing path <code>/ip dhcp\-relay</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/276](https\://github\.com/ansible\-collections/community\.routeros/pull/276)\)\.
+* api\_info\, api\_modify \- add missing path <code>/queue simple</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/269](https\://github\.com/ansible\-collections/community\.routeros/pull/269)\)\.
+* api\_info\, api\_modify \- add missing path <code>/queue type</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/274](https\://github\.com/ansible\-collections/community\.routeros/pull/274)\)\.
+* api\_info\, api\_modify \- add missing paths <code>/routing bgp aggregate</code>\, <code>/routing bgp network</code> and <code>/routing bgp peer</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/277](https\://github\.com/ansible\-collections/community\.routeros/pull/277)\)\.
+* api\_info\, api\_modify \- add support for paths <code>/mpls interface</code>\, <code>/mpls ldp accept\-filter</code>\, <code>/mpls ldp advertise\-filter</code> and <code>mpls ldp interface</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/272](https\://github\.com/ansible\-collections/community\.routeros/pull/272)\)\.
+
+<a id="v2-14-0"></a>
+## v2\.14\.0
+
+<a id="release-summary-1"></a>
+### Release Summary
+
+Feature release\.
+
+<a id="minor-changes-1"></a>
+### Minor Changes
+
* api\_info\, api\_modify \- add read\-only fields <code>installed\-version</code>\, <code>latest\-version</code> and <code>status</code> in <code>system package update</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/263](https\://github\.com/ansible\-collections/community\.routeros/pull/263)\)\.
* api\_info\, api\_modify \- added support for <code>interface wifi</code> and its sub\-paths \([https\://github\.com/ansible\-collections/community\.routeros/pull/266](https\://github\.com/ansible\-collections/community\.routeros/pull/266)\)\.
* api\_info\, api\_modify \- remove default value for read\-only <code>running</code> field in <code>interface wireless</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/264](https\://github\.com/ansible\-collections/community\.routeros/pull/264)\)\.
@@ -118,12 +143,12 @@ Feature release\.
<a id="v2-13-0"></a>
## v2\.13\.0
-<a id="release-summary-1"></a>
+<a id="release-summary-2"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-1"></a>
+<a id="minor-changes-2"></a>
### Minor Changes
* api\_info\, api\_modify \- make path <code>user group</code> modifiable and add <code>comment</code> attribute \([https\://github\.com/ansible\-collections/community\.routeros/issues/256](https\://github\.com/ansible\-collections/community\.routeros/issues/256)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/257](https\://github\.com/ansible\-collections/community\.routeros/pull/257)\)\.
@@ -137,12 +162,12 @@ Bugfix and feature release\.
<a id="v2-12-0"></a>
## v2\.12\.0
-<a id="release-summary-2"></a>
+<a id="release-summary-3"></a>
### Release Summary
Feature release\.
-<a id="minor-changes-2"></a>
+<a id="minor-changes-3"></a>
### Minor Changes
* api\_info\, api\_modify \- add <code>interface ovpn\-client</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/242](https\://github\.com/ansible\-collections/community\.routeros/issues/242)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/244](https\://github\.com/ansible\-collections/community\.routeros/pull/244)\)\.
@@ -156,12 +181,12 @@ Feature release\.
<a id="v2-11-0"></a>
## v2\.11\.0
-<a id="release-summary-3"></a>
+<a id="release-summary-4"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-3"></a>
+<a id="minor-changes-4"></a>
### Minor Changes
* api\_info\, api\_modify \- add missing DoH parameters <code>doh\-max\-concurrent\-queries</code>\, <code>doh\-max\-server\-connections</code>\, and <code>doh\-timeout</code> to the <code>ip dns</code> path \([https\://github\.com/ansible\-collections/community\.routeros/issues/230](https\://github\.com/ansible\-collections/community\.routeros/issues/230)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/235](https\://github\.com/ansible\-collections/community\.routeros/pull/235)\)
@@ -176,12 +201,12 @@ Feature and bugfix release\.
<a id="v2-10-0"></a>
## v2\.10\.0
-<a id="release-summary-4"></a>
+<a id="release-summary-5"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-4"></a>
+<a id="minor-changes-5"></a>
### Minor Changes
* api\_info \- add new <code>include\_read\_only</code> option to select behavior for read\-only values\. By default these are not returned \([https\://github\.com/ansible\-collections/community\.routeros/pull/213](https\://github\.com/ansible\-collections/community\.routeros/pull/213)\)\.
@@ -213,12 +238,12 @@ Bugfix and feature release\.
<a id="v2-9-0"></a>
## v2\.9\.0
-<a id="release-summary-5"></a>
+<a id="release-summary-6"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-5"></a>
+<a id="minor-changes-6"></a>
### Minor Changes
* api\_info\, api\_modify \- add path <code>caps\-man channel</code> and enable path <code>caps\-man manager interface</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/193](https\://github\.com/ansible\-collections/community\.routeros/issues/193)\, [https\://github\.com/ansible\-collections/community\.routeros/pull/194](https\://github\.com/ansible\-collections/community\.routeros/pull/194)\)\.
@@ -232,7 +257,7 @@ Bugfix and feature release\.
<a id="v2-8-3"></a>
## v2\.8\.3
-<a id="release-summary-6"></a>
+<a id="release-summary-7"></a>
### Release Summary
Maintenance release with updated documentation\.
@@ -253,7 +278,7 @@ for the rendered HTML version of the documentation of the latest release\.
<a id="v2-8-2"></a>
## v2\.8\.2
-<a id="release-summary-7"></a>
+<a id="release-summary-8"></a>
### Release Summary
Bugfix release\.
@@ -266,7 +291,7 @@ Bugfix release\.
<a id="v2-8-1"></a>
## v2\.8\.1
-<a id="release-summary-8"></a>
+<a id="release-summary-9"></a>
### Release Summary
Bugfix release\.
@@ -279,12 +304,12 @@ Bugfix release\.
<a id="v2-8-0"></a>
## v2\.8\.0
-<a id="release-summary-9"></a>
+<a id="release-summary-10"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-6"></a>
+<a id="minor-changes-7"></a>
### Minor Changes
* api\_modify \- adapt data for API paths <code>ip dhcp\-server network</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/156](https\://github\.com/ansible\-collections/community\.routeros/pull/156)\)\.
@@ -304,12 +329,12 @@ Bugfix and feature release\.
<a id="v2-7-0"></a>
## v2\.7\.0
-<a id="release-summary-10"></a>
+<a id="release-summary-11"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-7"></a>
+<a id="minor-changes-8"></a>
### Minor Changes
* api\_modify\, api\_info \- support API paths <code>ip arp</code>\, <code>ip firewall raw</code>\, <code>ipv6 firewall raw</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/144](https\://github\.com/ansible\-collections/community\.routeros/pull/144)\)\.
@@ -322,12 +347,12 @@ Bugfix and feature release\.
<a id="v2-6-0"></a>
## v2\.6\.0
-<a id="release-summary-11"></a>
+<a id="release-summary-12"></a>
### Release Summary
Regular bugfix and feature release\.
-<a id="minor-changes-8"></a>
+<a id="minor-changes-9"></a>
### Minor Changes
* api\_modify\, api\_info \- add field <code>regexp</code> to <code>ip dns static</code> \([https\://github\.com/ansible\-collections/community\.routeros/issues/141](https\://github\.com/ansible\-collections/community\.routeros/issues/141)\)\.
@@ -342,12 +367,12 @@ Regular bugfix and feature release\.
<a id="v2-5-0"></a>
## v2\.5\.0
-<a id="release-summary-12"></a>
+<a id="release-summary-13"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-9"></a>
+<a id="minor-changes-10"></a>
### Minor Changes
* api\_info\, api\_modify \- support API paths <code>interface ethernet poe</code>\, <code>interface gre6</code>\, <code>interface vrrp</code> and also support all previously missing fields of entries in <code>ip dhcp\-server</code> \([https\://github\.com/ansible\-collections/community\.routeros/pull/137](https\://github\.com/ansible\-collections/community\.routeros/pull/137)\)\.
@@ -360,12 +385,12 @@ Feature and bugfix release\.
<a id="v2-4-0"></a>
## v2\.4\.0
-<a id="release-summary-13"></a>
+<a id="release-summary-14"></a>
### Release Summary
Feature release improving the <code>api\*</code> modules\.
-<a id="minor-changes-10"></a>
+<a id="minor-changes-11"></a>
### Minor Changes
* api\* modules \- Add new option <code>force\_no\_cert</code> to connect with ADH ciphers \([https\://github\.com/ansible\-collections/community\.routeros/pull/124](https\://github\.com/ansible\-collections/community\.routeros/pull/124)\)\.
@@ -404,7 +429,7 @@ Feature release improving the <code>api\*</code> modules\.
<a id="v2-3-1"></a>
## v2\.3\.1
-<a id="release-summary-14"></a>
+<a id="release-summary-15"></a>
### Release Summary
Maintenance release with improved documentation\.
@@ -417,12 +442,12 @@ Maintenance release with improved documentation\.
<a id="v2-3-0"></a>
## v2\.3\.0
-<a id="release-summary-15"></a>
+<a id="release-summary-16"></a>
### Release Summary
Feature and bugfix release\.
-<a id="minor-changes-11"></a>
+<a id="minor-changes-12"></a>
### Minor Changes
* The collection repository conforms to the [REUSE specification](https\://reuse\.software/spec/) except for the changelog fragments \([https\://github\.com/ansible\-collections/community\.routeros/pull/108](https\://github\.com/ansible\-collections/community\.routeros/pull/108)\)\.
@@ -437,7 +462,7 @@ Feature and bugfix release\.
<a id="v2-2-1"></a>
## v2\.2\.1
-<a id="release-summary-16"></a>
+<a id="release-summary-17"></a>
### Release Summary
Bugfix release\.
@@ -451,12 +476,12 @@ Bugfix release\.
<a id="v2-2-0"></a>
## v2\.2\.0
-<a id="release-summary-17"></a>
+<a id="release-summary-18"></a>
### Release Summary
New feature release\.
-<a id="minor-changes-12"></a>
+<a id="minor-changes-13"></a>
### Minor Changes
* All software licenses are now in the <code>LICENSES/</code> directory of the collection root\. Moreover\, <code>SPDX\-License\-Identifier\:</code> is used to declare the applicable license for every file that is not automatically generated \([https\://github\.com/ansible\-collections/community\.routeros/pull/101](https\://github\.com/ansible\-collections/community\.routeros/pull/101)\)\.
@@ -475,12 +500,12 @@ New feature release\.
<a id="v2-1-0"></a>
## v2\.1\.0
-<a id="release-summary-18"></a>
+<a id="release-summary-19"></a>
### Release Summary
Feature and bugfix release with new modules\.
-<a id="minor-changes-13"></a>
+<a id="minor-changes-14"></a>
### Minor Changes
* Added a <code>community\.routeros\.api</code> module defaults group\. Use with <code>group/community\.routeros\.api</code> to provide options for all API\-based modules \([https\://github\.com/ansible\-collections/community\.routeros/pull/89](https\://github\.com/ansible\-collections/community\.routeros/pull/89)\)\.
@@ -504,12 +529,12 @@ Feature and bugfix release with new modules\.
<a id="v2-0-0"></a>
## v2\.0\.0
-<a id="release-summary-19"></a>
+<a id="release-summary-20"></a>
### Release Summary
A new major release with breaking changes in the behavior of <code>community\.routeros\.api</code> and <code>community\.routeros\.command</code>\.
-<a id="minor-changes-14"></a>
+<a id="minor-changes-15"></a>
### Minor Changes
* api \- make validation of <code>WHERE</code> for <code>query</code> more strict \([https\://github\.com/ansible\-collections/community\.routeros/pull/53](https\://github\.com/ansible\-collections/community\.routeros/pull/53)\)\.
@@ -545,12 +570,12 @@ A new major release with breaking changes in the behavior of <code>community\.ro
<a id="v1-2-0"></a>
## v1\.2\.0
-<a id="release-summary-20"></a>
+<a id="release-summary-21"></a>
### Release Summary
Bugfix and feature release\.
-<a id="minor-changes-15"></a>
+<a id="minor-changes-16"></a>
### Minor Changes
* Avoid internal ansible\-core module\_utils in favor of equivalent public API available since at least Ansible 2\.9 \([https\://github\.com/ansible\-collections/community\.routeros/pull/38](https\://github\.com/ansible\-collections/community\.routeros/pull/38)\)\.
@@ -566,12 +591,12 @@ Bugfix and feature release\.
<a id="v1-1-0"></a>
## v1\.1\.0
-<a id="release-summary-21"></a>
+<a id="release-summary-22"></a>
### Release Summary
This release allow dashes in usernames for SSH\-based modules\.
-<a id="minor-changes-16"></a>
+<a id="minor-changes-17"></a>
### Minor Changes
* command \- added support for a dash \(<code>\-</code>\) in username \([https\://github\.com/ansible\-collections/community\.routeros/pull/18](https\://github\.com/ansible\-collections/community\.routeros/pull/18)\)\.
@@ -580,7 +605,7 @@ This release allow dashes in usernames for SSH\-based modules\.
<a id="v1-0-1"></a>
## v1\.0\.1
-<a id="release-summary-22"></a>
+<a id="release-summary-23"></a>
### Release Summary
Maintenance release with a bugfix for <code>api</code>\.
@@ -593,7 +618,7 @@ Maintenance release with a bugfix for <code>api</code>\.
<a id="v1-0-0"></a>
## v1\.0\.0
-<a id="release-summary-23"></a>
+<a id="release-summary-24"></a>
### Release Summary
This is the first production \(non\-prerelease\) release of <code>community\.routeros</code>\.
@@ -606,7 +631,7 @@ This is the first production \(non\-prerelease\) release of <code>community\.rou
<a id="v0-1-1"></a>
## v0\.1\.1
-<a id="release-summary-24"></a>
+<a id="release-summary-25"></a>
### Release Summary
Small improvements and bugfixes over the initial release\.
@@ -619,12 +644,12 @@ Small improvements and bugfixes over the initial release\.
<a id="v0-1-0"></a>
## v0\.1\.0
-<a id="release-summary-25"></a>
+<a id="release-summary-26"></a>
### Release Summary
The <code>community\.routeros</code> continues the work on the Ansible RouterOS modules from their state in <code>community\.network</code> 1\.2\.0\. The changes listed here are thus relative to the modules <code>community\.network\.routeros\_\*</code>\.
-<a id="minor-changes-17"></a>
+<a id="minor-changes-18"></a>
### Minor Changes
* facts \- now also collecting data about BGP and OSPF \([https\://github\.com/ansible\-collections/community\.network/pull/101](https\://github\.com/ansible\-collections/community\.network/pull/101)\)\.
diff --git a/ansible_collections/community/routeros/CHANGELOG.rst b/ansible_collections/community/routeros/CHANGELOG.rst
index c7cc6ef67..1b3a76077 100644
--- a/ansible_collections/community/routeros/CHANGELOG.rst
+++ b/ansible_collections/community/routeros/CHANGELOG.rst
@@ -4,6 +4,28 @@ Community RouterOS Release Notes
.. contents:: Topics
+v2.15.0
+=======
+
+Release Summary
+---------------
+
+Feature release.
+
+Minor Changes
+-------------
+
+- api_info, api_modify - Add RouterOS 7.x support to ``/mpls ldp`` path (https://github.com/ansible-collections/community.routeros/pull/271).
+- api_info, api_modify - add ``/ip route rule`` path for RouterOS 6.x (https://github.com/ansible-collections/community.routeros/pull/278).
+- api_info, api_modify - add ``/routing filter`` path for RouterOS 6.x (https://github.com/ansible-collections/community.routeros/pull/279).
+- api_info, api_modify - add default value for ``from-pool`` field in ``/ipv6 address`` (https://github.com/ansible-collections/community.routeros/pull/270).
+- api_info, api_modify - add missing path ``/interface pppoe-server server`` (https://github.com/ansible-collections/community.routeros/pull/273).
+- api_info, api_modify - add missing path ``/ip dhcp-relay`` (https://github.com/ansible-collections/community.routeros/pull/276).
+- api_info, api_modify - add missing path ``/queue simple`` (https://github.com/ansible-collections/community.routeros/pull/269).
+- api_info, api_modify - add missing path ``/queue type`` (https://github.com/ansible-collections/community.routeros/pull/274).
+- api_info, api_modify - add missing paths ``/routing bgp aggregate``, ``/routing bgp network`` and ``/routing bgp peer`` (https://github.com/ansible-collections/community.routeros/pull/277).
+- api_info, api_modify - add support for paths ``/mpls interface``, ``/mpls ldp accept-filter``, ``/mpls ldp advertise-filter`` and ``mpls ldp interface`` (https://github.com/ansible-collections/community.routeros/pull/272).
+
v2.14.0
=======
diff --git a/ansible_collections/community/routeros/FILES.json b/ansible_collections/community/routeros/FILES.json
index 65dc9b337..483d87e4f 100644
--- a/ansible_collections/community/routeros/FILES.json
+++ b/ansible_collections/community/routeros/FILES.json
@@ -25,7 +25,7 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7733552e950b67d67c9b00ef9bb1d15c38ee2d765d47ab2d7404cc5efa6fa0b7",
+ "chksum_sha256": "bf90bb7d4687afa28b6d64eed2a4ef8761badbd5759319daff0621394fe8a1fe",
"format": 1
},
{
@@ -151,7 +151,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b9c3d4e8049fa8e3b5e55c2997f4df70ac1942517cfbddb28d7caafef030ba12",
+ "chksum_sha256": "5780b9cd9fd37dcad0b122ae762afbe426e800c7fda9496e50163c628d77a823",
"format": 1
},
{
@@ -211,6 +211,13 @@
"format": 1
},
{
+ "name": "docs/docsite/config.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0c5ec9ff76cf4db33b5d3f771419ef50d448e5d510cb7a98fc07dd9ecee69c4e",
+ "format": 1
+ },
+ {
"name": "docs/docsite/extra-docs.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -354,7 +361,7 @@
"name": "plugins/module_utils/_api_data.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b5880a7e63053e5f40b3824e0e8311dc2f61d93bcadc0d639d65dcc3ba88a723",
+ "chksum_sha256": "2b2dd685aa6a3fd4d481f12ced0ed0284a65d4773844c4c9a30ea3b4cbd38297",
"format": 1
},
{
@@ -424,14 +431,14 @@
"name": "plugins/modules/api_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ed9d94602cc1c6c87fa65e829342c83724376cc8b0d47072e74a6119e10e0505",
+ "chksum_sha256": "f86b949f2a5f6da6df2061711adf35ff727c034c7c9b7dc4e3bbb50fe80f0dd8",
"format": 1
},
{
"name": "plugins/modules/api_modify.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "81752a1a70ce47134663c2d721673481a8aea6995469092ae24b13303772820c",
+ "chksum_sha256": "2ec95cb3af816b5ee9b3e54ead9258c177f559038d57de7f253f4d9b6f179784",
"format": 1
},
{
@@ -806,6 +813,20 @@
"format": 1
},
{
+ "name": "tests/sanity/ignore-2.18.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1af4ae071777877caae7e48c7a1a1c905d990e0d4d832b285970307cc5ad03df",
+ "format": 1
+ },
+ {
+ "name": "tests/sanity/ignore-2.18.txt.license",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "6eb915239f9f35407fa68fdc41ed6522f1fdcce11badbdcd6057548023179ac1",
+ "format": 1
+ },
+ {
"name": "tests/sanity/ignore-2.9.txt",
"ftype": "file",
"chksum_type": "sha256",
@@ -1257,7 +1278,7 @@
"name": "CHANGELOG.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b99dd5a4c3af9a341ee8435a0bd595a093508da336b35963c9f4c21e40442a90",
+ "chksum_sha256": "3add5cc457f4a9b36baea353affd9965843342f141333acdce5af15d84d7ae2b",
"format": 1
},
{
@@ -1271,7 +1292,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f13293d73ce0d0f4ac5a07b1b7e69d3efbfd36dca003148072b792bb5678ffe",
+ "chksum_sha256": "ed20bebf70ccd5e1e94da8f399771dddf40744a2c2da0283fe210fc6c47d77ca",
"format": 1
},
{
@@ -1292,7 +1313,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be40d1889fd07a702d1422a4da11a614fc9cce965f548eae37f50dfa8cf0ba46",
+ "chksum_sha256": "f5ae35bdf559206e7f48123c0928ef6b5d9bc29f8a6b6eef90aa731e81aaa516",
"format": 1
},
{
diff --git a/ansible_collections/community/routeros/MANIFEST.json b/ansible_collections/community/routeros/MANIFEST.json
index 02c5b44f9..ddec534d7 100644
--- a/ansible_collections/community/routeros/MANIFEST.json
+++ b/ansible_collections/community/routeros/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "routeros",
- "version": "2.14.0",
+ "version": "2.15.0",
"authors": [
"Egor Zaitsev (github.com/heuels)",
"Nikolay Dachev (github.com/NikolayDachev)",
@@ -31,7 +31,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b61bc5f91d12dd9344c686a1ce2650fea27acfe4e6dceb5ac36d8fc236ecadc0",
+ "chksum_sha256": "a36cd24eef5f055d20b8836410e23e222aa2aa857c025faadc9e10767b95fec6",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/routeros/README.md b/ansible_collections/community/routeros/README.md
index df692d6d5..e617a8f89 100644
--- a/ansible_collections/community/routeros/README.md
+++ b/ansible_collections/community/routeros/README.md
@@ -13,7 +13,7 @@ You can find [documentation for the modules and plugins in this collection here]
## Tested with Ansible
-Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, and ansible-core 2.16 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
+Tested with the current Ansible 2.9, ansible-base 2.10, ansible-core 2.11, ansible-core 2.12, ansible-core 2.13, ansible-core 2.14, ansible-core 2.15, ansible-core 2.16, and ansible-core 2.17 releases and the current development version of ansible-core. Ansible versions before 2.9.10 are not supported.
## External requirements
diff --git a/ansible_collections/community/routeros/changelogs/changelog.yaml b/ansible_collections/community/routeros/changelogs/changelog.yaml
index e23348b3a..62320dd0e 100644
--- a/ansible_collections/community/routeros/changelogs/changelog.yaml
+++ b/ansible_collections/community/routeros/changelogs/changelog.yaml
@@ -339,6 +339,38 @@ releases:
- 264-wireless-running-default.yml
- 266-interface-wifi.yml
release_date: '2024-03-25'
+ 2.15.0:
+ changes:
+ minor_changes:
+ - api_info, api_modify - Add RouterOS 7.x support to ``/mpls ldp`` path (https://github.com/ansible-collections/community.routeros/pull/271).
+ - api_info, api_modify - add ``/ip route rule`` path for RouterOS 6.x (https://github.com/ansible-collections/community.routeros/pull/278).
+ - api_info, api_modify - add ``/routing filter`` path for RouterOS 6.x (https://github.com/ansible-collections/community.routeros/pull/279).
+ - api_info, api_modify - add default value for ``from-pool`` field in ``/ipv6
+ address`` (https://github.com/ansible-collections/community.routeros/pull/270).
+ - api_info, api_modify - add missing path ``/interface pppoe-server server``
+ (https://github.com/ansible-collections/community.routeros/pull/273).
+ - api_info, api_modify - add missing path ``/ip dhcp-relay`` (https://github.com/ansible-collections/community.routeros/pull/276).
+ - api_info, api_modify - add missing path ``/queue simple`` (https://github.com/ansible-collections/community.routeros/pull/269).
+ - api_info, api_modify - add missing path ``/queue type`` (https://github.com/ansible-collections/community.routeros/pull/274).
+ - api_info, api_modify - add missing paths ``/routing bgp aggregate``, ``/routing
+ bgp network`` and ``/routing bgp peer`` (https://github.com/ansible-collections/community.routeros/pull/277).
+ - api_info, api_modify - add support for paths ``/mpls interface``, ``/mpls
+ ldp accept-filter``, ``/mpls ldp advertise-filter`` and ``mpls ldp interface``
+ (https://github.com/ansible-collections/community.routeros/pull/272).
+ release_summary: Feature release.
+ fragments:
+ - 2.15.0.yml
+ - 269-add-queue_simple-path.yml
+ - 270_fix_ipv6_from_pool_default_value.yml
+ - 271-mpls_ldp_routeros_7_support.yml
+ - 272-additional_mpls_path_support.yml
+ - 273-add_interface_pppoe-server_support.yml
+ - 274-add_queue_type_path.yml
+ - 276-add_ip_dhcp-relay_path.yml
+ - 277-add_routing_bgp_paths.yml
+ - 278-add_ip_route_rule_path.yml
+ - 279-add_routing_filter_path.yml
+ release_date: '2024-04-20'
2.2.0:
changes:
bugfixes:
diff --git a/ansible_collections/community/routeros/docs/docsite/config.yml b/ansible_collections/community/routeros/docs/docsite/config.yml
new file mode 100644
index 000000000..1d6cf8554
--- /dev/null
+++ b/ansible_collections/community/routeros/docs/docsite/config.yml
@@ -0,0 +1,7 @@
+---
+# Copyright (c) Ansible Project
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+changelog:
+ write_changelog: true
diff --git a/ansible_collections/community/routeros/plugins/module_utils/_api_data.py b/ansible_collections/community/routeros/plugins/module_utils/_api_data.py
index a421cffee..fdf5cba58 100644
--- a/ansible_collections/community/routeros/plugins/module_utils/_api_data.py
+++ b/ansible_collections/community/routeros/plugins/module_utils/_api_data.py
@@ -729,6 +729,23 @@ PATHS = {
},
),
),
+ ('ip', 'route', 'rule'): APIData(
+ versioned=[
+ ('7', '<', VersionedAPIData(
+ fully_understood=True,
+ fields={
+ 'action': KeyInfo(default='lookup'),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'disabled': KeyInfo(default=False),
+ 'dst-address': KeyInfo(can_disable=True),
+ 'interface': KeyInfo(can_disable=True),
+ 'routing-mark': KeyInfo(can_disable=True),
+ 'src-address': KeyInfo(can_disable=True),
+ 'table': KeyInfo(default='main'),
+ },
+ )),
+ ],
+ ),
('ip', 'vrf'): APIData(
versioned=[
('7', '>=', VersionedAPIData(
@@ -787,6 +804,73 @@ PATHS = {
},
),
),
+ ('routing', 'filter'): APIData(
+ versioned=[
+ ('7', '<', VersionedAPIData(
+ fully_understood=True,
+ fields={
+ 'action': KeyInfo(default='passthrough'),
+ 'address-family': KeyInfo(can_disable=True),
+ 'append-bgp-communities': KeyInfo(can_disable=True),
+ 'append-route-targets': KeyInfo(can_disable=True),
+ 'bgp-as-path': KeyInfo(can_disable=True),
+ 'bgp-as-path-length': KeyInfo(can_disable=True),
+ 'bgp-atomic-aggregate': KeyInfo(can_disable=True),
+ 'bgp-communities': KeyInfo(can_disable=True),
+ 'bgp-local-pref': KeyInfo(can_disable=True),
+ 'bgp-med': KeyInfo(can_disable=True),
+ 'bgp-origin': KeyInfo(can_disable=True),
+ 'bgp-weight': KeyInfo(can_disable=True),
+ 'chain': KeyInfo(required=True),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'disabled': KeyInfo(default=False),
+ 'distance': KeyInfo(can_disable=True),
+ 'invert-match': KeyInfo(default=False),
+ 'jump-target': KeyInfo(),
+ 'locally-originated-bgp': KeyInfo(can_disable=True),
+ 'match-chain': KeyInfo(can_disable=True),
+ 'ospf-type': KeyInfo(can_disable=True),
+ 'pref-src': KeyInfo(can_disable=True),
+ 'prefix': KeyInfo(default='0.0.0.0/0'),
+ 'prefix-length': KeyInfo(can_disable=True),
+ 'protocol': KeyInfo(can_disable=True),
+ 'route-comment': KeyInfo(can_disable=True),
+ 'route-tag': KeyInfo(can_disable=True),
+ 'route-targets': KeyInfo(can_disable=True),
+ 'routing-mark': KeyInfo(can_disable=True),
+ 'scope': KeyInfo(can_disable=True),
+ 'set-bgp-communities': KeyInfo(can_disable=True),
+ 'set-bgp-local-pref': KeyInfo(can_disable=True),
+ 'set-bgp-med': KeyInfo(can_disable=True),
+ 'set-bgp-prepend': KeyInfo(can_disable=True),
+ 'set-bgp-prepend-path': KeyInfo(),
+ 'set-bgp-weight': KeyInfo(can_disable=True),
+ 'set-check-gateway': KeyInfo(can_disable=True),
+ 'set-disabled': KeyInfo(can_disable=True),
+ 'set-distance': KeyInfo(can_disable=True),
+ 'set-in-nexthop': KeyInfo(can_disable=True),
+ 'set-in-nexthop-direct': KeyInfo(can_disable=True),
+ 'set-in-nexthop-ipv6': KeyInfo(can_disable=True),
+ 'set-in-nexthop-linklocal': KeyInfo(can_disable=True),
+ 'set-out-nexthop': KeyInfo(can_disable=True),
+ 'set-out-nexthop-ipv6': KeyInfo(can_disable=True),
+ 'set-out-nexthop-linklocal': KeyInfo(can_disable=True),
+ 'set-pref-src': KeyInfo(can_disable=True),
+ 'set-route-comment': KeyInfo(can_disable=True),
+ 'set-route-tag': KeyInfo(can_disable=True),
+ 'set-route-targets': KeyInfo(can_disable=True),
+ 'set-routing-mark': KeyInfo(can_disable=True),
+ 'set-scope': KeyInfo(can_disable=True),
+ 'set-site-of-origin': KeyInfo(can_disable=True),
+ 'set-target-scope': KeyInfo(can_disable=True),
+ 'set-type': KeyInfo(can_disable=True),
+ 'set-use-te-nexthop': KeyInfo(can_disable=True),
+ 'site-of-origin': KeyInfo(can_disable=True),
+ 'target-scope': KeyInfo(can_disable=True),
+ },
+ )),
+ ],
+ ),
('routing', 'filter', 'rule'): APIData(
versioned=[
('7', '>=', VersionedAPIData(
@@ -1397,7 +1481,7 @@ PATHS = {
'comment': KeyInfo(can_disable=True, remove_value=''),
'disabled': KeyInfo(default=False),
'eui-64': KeyInfo(default=False),
- 'from-pool': KeyInfo(),
+ 'from-pool': KeyInfo(default=''),
'interface': KeyInfo(required=True),
'no-dad': KeyInfo(default=False),
},
@@ -1497,6 +1581,28 @@ PATHS = {
},
),
),
+ ('interface', 'pppoe-server', 'server'): APIData(
+ unversioned=VersionedAPIData(
+ fully_understood=True,
+ primary_keys=('interface', ),
+ fields={
+ 'accept-empty-service': KeyInfo(default=True),
+ 'authentication': KeyInfo(default='pap,chap,mschap1,mschap2'),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'default-profile': KeyInfo(default='default'),
+ 'disabled': KeyInfo(default=True),
+ 'interface': KeyInfo(required=True),
+ 'keepalive-timeout': KeyInfo(default=10),
+ 'max-mru': KeyInfo(default='auto'),
+ 'max-mtu': KeyInfo(default='auto'),
+ 'max-sessions': KeyInfo(default='unlimited'),
+ 'mrru': KeyInfo(default='disabled'),
+ 'one-session-per-host': KeyInfo(default=False),
+ 'pado-delay': KeyInfo(default=0),
+ 'service-name': KeyInfo(default=''),
+ },
+ ),
+ ),
('interface', 'pptp-server', 'server'): APIData(
unversioned=VersionedAPIData(
single_value=True,
@@ -2557,6 +2663,22 @@ PATHS = {
},
),
),
+ ('ip', 'dhcp-relay'): APIData(
+ unversioned=VersionedAPIData(
+ fully_understood=True,
+ primary_keys=('name',),
+ fields={
+ 'add-relay-info': KeyInfo(default=False),
+ 'delay-threshold': KeyInfo(can_disable=True, remove_value='none'),
+ 'dhcp-server': KeyInfo(required=True),
+ 'disabled': KeyInfo(default=False),
+ 'interface': KeyInfo(required=True),
+ 'local-address': KeyInfo(can_disable=True, remove_value='0.0.0.0'),
+ 'name': KeyInfo(),
+ 'relay-info-remote-id': KeyInfo(),
+ },
+ ),
+ ),
('ip', 'dhcp-server', 'config'): APIData(
unversioned=VersionedAPIData(
single_value=True,
@@ -3591,29 +3713,90 @@ PATHS = {
),
('mpls', 'interface'): APIData(
unversioned=VersionedAPIData(
- unknown_mechanism=True,
- # primary_keys=('default', ),
+ fully_understood=True,
fields={
- 'default': KeyInfo(),
- 'disabled': KeyInfo(),
- 'interface': KeyInfo(),
+ 'disabled': KeyInfo(default=False),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'interface': KeyInfo(required=True),
'mpls-mtu': KeyInfo(),
+ 'info': KeyInfo(can_disable=True),
},
),
),
('mpls', 'ldp'): APIData(
+ versioned=[
+ ('7.1', '>=', VersionedAPIData(
+ fully_understood=True,
+ primary_keys=('vrf', ),
+ fields={
+ 'afi': KeyInfo(can_disable=True),
+ 'distribute-for-default': KeyInfo(can_disable=True),
+ 'path-vector-limit': KeyInfo(can_disable=True),
+ 'vrf': KeyInfo(),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'hop-limit': KeyInfo(can_disable=True),
+ 'preferred-afi': KeyInfo(can_disable=True),
+ 'loop-detect': KeyInfo(can_disable=True),
+ 'transport-addresses': KeyInfo(can_disable=True),
+ 'disabled': KeyInfo(default=False),
+ 'lsr-id': KeyInfo(can_disable=True),
+ 'use-explicit-null': KeyInfo(can_disable=True),
+ },
+ )),
+ ('7.1', '<', VersionedAPIData(
+ single_value=True,
+ fully_understood=True,
+ fields={
+ 'distribute-for-default-route': KeyInfo(default=False),
+ 'enabled': KeyInfo(default=False),
+ 'hop-limit': KeyInfo(default=255),
+ 'loop-detect': KeyInfo(default=False),
+ 'lsr-id': KeyInfo(default='0.0.0.0'),
+ 'path-vector-limit': KeyInfo(default=255),
+ 'transport-address': KeyInfo(default='0.0.0.0'),
+ 'use-explicit-null': KeyInfo(default=False),
+ },
+ )),
+ ],
+ ),
+ ('mpls', 'ldp', 'accept-filter'): APIData(
unversioned=VersionedAPIData(
- single_value=True,
fully_understood=True,
fields={
- 'distribute-for-default-route': KeyInfo(default=False),
- 'enabled': KeyInfo(default=False),
- 'hop-limit': KeyInfo(default=255),
- 'loop-detect': KeyInfo(default=False),
- 'lsr-id': KeyInfo(default='0.0.0.0'),
- 'path-vector-limit': KeyInfo(default=255),
- 'transport-address': KeyInfo(default='0.0.0.0'),
- 'use-explicit-null': KeyInfo(default=False),
+ 'accept': KeyInfo(can_disable=True),
+ 'disabled': KeyInfo(default=False),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'neighbor': KeyInfo(can_disable=True),
+ 'prefix': KeyInfo(can_disable=True),
+ 'vrf': KeyInfo(can_disable=True),
+ },
+ ),
+ ),
+ ('mpls', 'ldp', 'advertise-filter'): APIData(
+ unversioned=VersionedAPIData(
+ fully_understood=True,
+ fields={
+ 'advertise': KeyInfo(default=''),
+ 'disabled': KeyInfo(default=False),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'neighbor': KeyInfo(),
+ 'prefix': KeyInfo(),
+ 'vrf': KeyInfo(),
+ },
+ ),
+ ),
+ ('mpls', 'ldp', 'interface'): APIData(
+ unversioned=VersionedAPIData(
+ fully_understood=True,
+ fields={
+ 'disabled': KeyInfo(default=False),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'accept-dynamic-neighbors': KeyInfo(can_disable=True),
+ 'afi': KeyInfo(can_disable=True),
+ 'hello-interval': KeyInfo(can_disable=True),
+ 'hold-time': KeyInfo(can_disable=True),
+ 'interface': KeyInfo(required=True),
+ 'transport-addresses': KeyInfo(can_disable=True),
},
),
),
@@ -4239,6 +4422,30 @@ PATHS = {
},
),
),
+ ('queue', 'simple'): APIData(
+ unversioned=VersionedAPIData(
+ primary_keys=('name', ),
+ fully_understood=True,
+ fields={
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'dst': KeyInfo(can_disable=True, remove_value=''),
+ 'time': KeyInfo(can_disable=True, remove_value=''),
+ 'bucket-size': KeyInfo(default='0.1/0.1'),
+ 'burst-limit': KeyInfo(default='0/0'),
+ 'burst-threshold': KeyInfo(default='0/0'),
+ 'burst-time': KeyInfo(default='0s/0s'),
+ 'disabled': KeyInfo(default=False),
+ 'limit-at': KeyInfo(default='0/0'),
+ 'max-limit': KeyInfo(default='0/0'),
+ 'name': KeyInfo(),
+ 'packet-marks': KeyInfo(default=''),
+ 'parent': KeyInfo(default='none'),
+ 'priority': KeyInfo(default='8/8'),
+ 'queue': KeyInfo(default='default-small/default-small'),
+ 'target': KeyInfo(required=True),
+ },
+ ),
+ ),
('queue', 'tree'): APIData(
unversioned=VersionedAPIData(
primary_keys=('name', ),
@@ -4260,6 +4467,64 @@ PATHS = {
},
),
),
+ ('queue', 'type'): APIData(
+ unversioned=VersionedAPIData(
+ primary_keys=('name', ),
+ fully_understood=True,
+ fields={
+ 'name': KeyInfo(),
+ 'kind': KeyInfo(required=True),
+ 'bfifo-limit': KeyInfo(default=15000),
+ 'cake-ack-filter': KeyInfo(default='none'),
+ 'cake-atm': KeyInfo(default='none'),
+ 'cake-autorate-ingress': KeyInfo(can_disable=True),
+ 'cake-bandwidth': KeyInfo(can_disable=True, remove_value=0),
+ 'cake-diffserv': KeyInfo(default='diffserv3'),
+ 'cake-flowmode': KeyInfo(default='triple-isolate'),
+ 'cake-memlimit': KeyInfo(default=0),
+ 'cake-mpu': KeyInfo(can_disable=True, remove_value=''),
+ 'cake-nat': KeyInfo(can_disable=True, remove_value=False),
+ 'cake-overhead': KeyInfo(default=0),
+ 'cake-overhead-scheme': KeyInfo(can_disable=True, remove_value=''),
+ 'cake-rtt': KeyInfo(default='100ms'),
+ 'cake-rtt-scheme': KeyInfo(default='none'),
+ 'cake-wash': KeyInfo(can_disable=True, remove_value=False),
+ 'codel-ce-threshold': KeyInfo(can_disable=True, remove_value=''),
+ 'codel-ecn': KeyInfo(can_disable=True, remove_value=False),
+ 'codel-interval': KeyInfo(default='100ms'),
+ 'codel-limit': KeyInfo(default=1000),
+ 'codel-target': KeyInfo(default='5ms'),
+ 'fq-codel-ce-threshold': KeyInfo(can_disable=True, remove_value=''),
+ 'fq-codel-ecn': KeyInfo(default=True),
+ 'fq-codel-flows': KeyInfo(default=1024),
+ 'fq-codel-interval': KeyInfo(default='100ms'),
+ 'fq-codel-limit': KeyInfo(default=10240),
+ 'fq-codel-memlimit': KeyInfo(default=33554432),
+ 'fq-codel-quantum': KeyInfo(default=1514),
+ 'fq-codel-target': KeyInfo(default='5ms'),
+ 'mq-pfifo-limit': KeyInfo(default=50),
+ 'pcq-burst-rate': KeyInfo(default=0),
+ 'pcq-burst-threshold': KeyInfo(default=0),
+ 'pcq-burst-time': KeyInfo(default='10s'),
+ 'pcq-classifier': KeyInfo(can_disable=True, remove_value=''),
+ 'pcq-dst-address-mask': KeyInfo(default=32),
+ 'pcq-dst-address6-mask': KeyInfo(default=128),
+ 'pcq-limit': KeyInfo(default=50),
+ 'pcq-rate': KeyInfo(default=0),
+ 'pcq-src-address-mask': KeyInfo(default=32),
+ 'pcq-src-address6-mask': KeyInfo(default=128),
+ 'pcq-total-limit': KeyInfo(default=2000),
+ 'pfifo-limit': KeyInfo(default=50),
+ 'red-avg-packet': KeyInfo(default=1000),
+ 'red-burst': KeyInfo(default=20),
+ 'red-limit': KeyInfo(default=60),
+ 'red-max-threshold': KeyInfo(default=50),
+ 'red-min-threshold': KeyInfo(default=10),
+ 'sfq-allot': KeyInfo(default=1514),
+ 'sfq-perturb': KeyInfo(default=5),
+ },
+ ),
+ ),
('interface', 'ethernet', 'switch'): APIData(
unversioned=VersionedAPIData(
fixed_entries=True,
@@ -4335,32 +4600,20 @@ PATHS = {
},
),
),
- ('queue', 'type'): APIData(
+ ('routing', 'bgp', 'aggregate'): APIData(
unversioned=VersionedAPIData(
- has_identifier=True,
+ primary_keys=('prefix',),
+ fully_understood=True,
fields={
- 'kind': KeyInfo(),
- 'mq-pfifo-limit': KeyInfo(),
- 'name': KeyInfo(),
- 'pcq-burst-rate': KeyInfo(),
- 'pcq-burst-threshold': KeyInfo(),
- 'pcq-burst-time': KeyInfo(),
- 'pcq-classifier': KeyInfo(),
- 'pcq-dst-address-mask': KeyInfo(),
- 'pcq-dst-address6-mask': KeyInfo(),
- 'pcq-limit': KeyInfo(),
- 'pcq-rate': KeyInfo(),
- 'pcq-src-address-mask': KeyInfo(),
- 'pcq-src-address6-mask': KeyInfo(),
- 'pcq-total-limit': KeyInfo(),
- 'pfifo-limit': KeyInfo(),
- 'red-avg-packet': KeyInfo(),
- 'red-burst': KeyInfo(),
- 'red-limit': KeyInfo(),
- 'red-max-threshold': KeyInfo(),
- 'red-min-threshold': KeyInfo(),
- 'sfq-allot': KeyInfo(),
- 'sfq-perturb': KeyInfo(),
+ 'advertise-filter': KeyInfo(),
+ 'attribute-filter': KeyInfo(),
+ 'disabled': KeyInfo(default=False),
+ 'include-igp': KeyInfo(default=False),
+ 'inherit-attributes': KeyInfo(default=True),
+ 'instance': KeyInfo(required=True),
+ 'prefix': KeyInfo(required=True),
+ 'summary-only': KeyInfo(default=True),
+ 'suppress-filter': KeyInfo(),
},
),
),
@@ -4448,6 +4701,53 @@ PATHS = {
},
),
),
+ ('routing', 'bgp', 'network'): APIData(
+ unversioned=VersionedAPIData(
+ primary_keys=('network',),
+ fully_understood=True,
+ fields={
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'disabled': KeyInfo(default=False),
+ 'network': KeyInfo(required=True),
+ 'synchronize': KeyInfo(default=True),
+ },
+ ),
+ ),
+ ('routing', 'bgp', 'peer'): APIData(
+ unversioned=VersionedAPIData(
+ primary_keys=('name', ),
+ fully_understood=True,
+ fields={
+ 'address-families': KeyInfo(default='ip'),
+ 'allow-as-in': KeyInfo(can_disable=True, remove_value=''),
+ 'as-override': KeyInfo(default=False),
+ 'cisco-vpls-nlri-len-fmt': KeyInfo(),
+ 'comment': KeyInfo(can_disable=True, remove_value=''),
+ 'default-originate': KeyInfo(default='never'),
+ 'disabled': KeyInfo(default=False),
+ 'hold-time': KeyInfo(default='3m'),
+ 'in-filter': KeyInfo(),
+ 'instance': KeyInfo(),
+ 'keepalive-time': KeyInfo(can_disable=True, remove_value=''),
+ 'max-prefix-limit': KeyInfo(can_disable=True, remove_value=''),
+ 'max-prefix-restart-time': KeyInfo(can_disable=True, remove_value=''),
+ 'multihop': KeyInfo(default=False),
+ 'name': KeyInfo(),
+ 'nexthop-choice': KeyInfo(default='default'),
+ 'passive': KeyInfo(default=False),
+ 'out-filter': KeyInfo(),
+ 'remote-address': KeyInfo(required=True),
+ 'remote-as': KeyInfo(required=True),
+ 'remote-port': KeyInfo(can_disable=True, remove_value=''),
+ 'remove-private-as': KeyInfo(default=False),
+ 'route-reflect': KeyInfo(default=False),
+ 'tcp-md5-key': KeyInfo(),
+ 'ttl': KeyInfo(default='default'),
+ 'update-source': KeyInfo(can_disable=True, remove_value='none'),
+ 'use-bfd': KeyInfo(default=False),
+ },
+ ),
+ ),
('routing', 'bgp', 'template'): APIData(
unversioned=VersionedAPIData(
primary_keys=('name', ),
diff --git a/ansible_collections/community/routeros/plugins/modules/api_info.py b/ansible_collections/community/routeros/plugins/modules/api_info.py
index f9a39464f..a3e800ee3 100644
--- a/ansible_collections/community/routeros/plugins/modules/api_info.py
+++ b/ansible_collections/community/routeros/plugins/modules/api_info.py
@@ -75,6 +75,7 @@ options:
- interface ovpn-server server
- interface ppp-client
- interface pppoe-client
+ - interface pppoe-server server
- interface pptp-server server
- interface sstp-server server
- interface vlan
@@ -120,6 +121,7 @@ options:
- ip cloud advanced
- ip dhcp-client
- ip dhcp-client option
+ - ip dhcp-relay
- ip dhcp-server
- ip dhcp-server config
- ip dhcp-server lease
@@ -147,6 +149,7 @@ options:
- ip pool
- ip proxy
- ip route
+ - ip route rule
- ip route vrf
- ip service
- ip settings
@@ -174,18 +177,28 @@ options:
- ipv6 route
- ipv6 settings
- mpls
+ - mpls interface
- mpls ldp
+ - mpls ldp accept-filter
+ - mpls ldp advertise-filter
+ - mpls ldp interface
- port firmware
- port remote-access
- ppp aaa
- ppp profile
- queue interface
+ - queue simple
- queue tree
+ - queue type
- radius
- radius incoming
+ - routing bgp aggregate
- routing bgp connection
- routing bgp instance
+ - routing bgp network
+ - routing bgp peer
- routing bgp template
+ - routing filter
- routing filter rule
- routing filter select-rule
- routing id
diff --git a/ansible_collections/community/routeros/plugins/modules/api_modify.py b/ansible_collections/community/routeros/plugins/modules/api_modify.py
index d71750073..cd5b3a93d 100644
--- a/ansible_collections/community/routeros/plugins/modules/api_modify.py
+++ b/ansible_collections/community/routeros/plugins/modules/api_modify.py
@@ -84,6 +84,7 @@ options:
- interface ovpn-server server
- interface ppp-client
- interface pppoe-client
+ - interface pppoe-server server
- interface pptp-server server
- interface sstp-server server
- interface vlan
@@ -129,6 +130,7 @@ options:
- ip cloud advanced
- ip dhcp-client
- ip dhcp-client option
+ - ip dhcp-relay
- ip dhcp-server
- ip dhcp-server config
- ip dhcp-server lease
@@ -156,6 +158,7 @@ options:
- ip pool
- ip proxy
- ip route
+ - ip route rule
- ip route vrf
- ip service
- ip settings
@@ -183,18 +186,28 @@ options:
- ipv6 route
- ipv6 settings
- mpls
+ - mpls interface
- mpls ldp
+ - mpls ldp accept-filter
+ - mpls ldp advertise-filter
+ - mpls ldp interface
- port firmware
- port remote-access
- ppp aaa
- ppp profile
- queue interface
+ - queue simple
- queue tree
+ - queue type
- radius
- radius incoming
+ - routing bgp aggregate
- routing bgp connection
- routing bgp instance
+ - routing bgp network
+ - routing bgp peer
- routing bgp template
+ - routing filter
- routing filter rule
- routing filter select-rule
- routing id
diff --git a/ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt b/ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt
new file mode 100644
index 000000000..0a5234bdb
--- /dev/null
+++ b/ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt
@@ -0,0 +1,2 @@
+update-docs.py shebang
+tests/unit/compat/mock.py pylint:use-yield-from # suggested construct does not work with Python 2
diff --git a/ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt.license b/ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt.license
new file mode 100644
index 000000000..edff8c768
--- /dev/null
+++ b/ansible_collections/community/routeros/tests/sanity/ignore-2.18.txt.license
@@ -0,0 +1,3 @@
+GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+SPDX-License-Identifier: GPL-3.0-or-later
+SPDX-FileCopyrightText: Ansible Project
diff --git a/ansible_collections/community/vmware/.github/workflows/ansible-test.yml b/ansible_collections/community/vmware/.github/workflows/ansible-test.yml
index 1cbb1a26f..6a5866e13 100644
--- a/ansible_collections/community/vmware/.github/workflows/ansible-test.yml
+++ b/ansible_collections/community/vmware/.github/workflows/ansible-test.yml
@@ -19,8 +19,8 @@ on:
push:
branches:
- main
- - stable-2.x
- stable-3.x
+ - stable-4.x
pull_request:
# Run CI once per day (at 07:12 UTC)
# This ensures that even if there haven't been commits that we are still
@@ -66,6 +66,7 @@ jobs:
# - stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
# - devel
- milestone
# Ansible-test on various stable branches does not yet work well with cgroups v2.
@@ -131,6 +132,7 @@ jobs:
# - stable-2.14
- stable-2.15
- stable-2.16
+ - stable-2.17
# - devel
- milestone
diff --git a/ansible_collections/community/vmware/.github/workflows/extra-docs-linting.yml b/ansible_collections/community/vmware/.github/workflows/extra-docs-linting.yml
index b36247113..91e3524fa 100644
--- a/ansible_collections/community/vmware/.github/workflows/extra-docs-linting.yml
+++ b/ansible_collections/community/vmware/.github/workflows/extra-docs-linting.yml
@@ -4,8 +4,8 @@ on:
push:
branches:
- main
- - stable-2.x
- stable-3.x
+ - stable-4.x
pull_request:
# Run CI once per day (at 07:12 UTC)
# This ensures that even if there haven't been commits that we are still testing against latest version of ansible-test for each ansible-base version
@@ -21,10 +21,10 @@ jobs:
steps:
- name: Check out code
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up Python
- uses: actions/setup-python@v3
+ uses: actions/setup-python@v5
with:
python-version: '3.10'
diff --git a/ansible_collections/community/vmware/CHANGELOG.rst b/ansible_collections/community/vmware/CHANGELOG.rst
index 2c9e8318a..4162c1885 100644
--- a/ansible_collections/community/vmware/CHANGELOG.rst
+++ b/ansible_collections/community/vmware/CHANGELOG.rst
@@ -6,6 +6,29 @@ community.vmware Release Notes
This changelog describes changes after version 3.9.0.
+v4.3.0
+======
+
+Minor Changes
+-------------
+
+- Document that all parameters and VMware object names are case sensitive (https://github.com/ansible-collections/community.vmware/issues/2019).
+- Drop the outdated (and actually unmaintained) scenario guides (https://github.com/ansible-collections/community.vmware/pull/2022).
+- vmware_dvswitch - Add switchIpAddress/switch_ip parameter for netflow config
+- vmware_guest_tools_info - Use `toolsVersionStatus2` instead of `toolsVersionStatus` (https://github.com/ansible-collections/community.vmware/issues/2033).
+
+Deprecated Features
+-------------------
+
+- vmware_guest_tools_info - `vm_tools_install_status` will be removed from next major version (5.0.0) of the collection since the API call that provides this information has been deprecated by VMware. Use `vm_tools_running_status` / `vm_tools_version_status` instead (https://github.com/ansible-collections/community.vmware/issues/2033).
+
+Bugfixes
+--------
+
+- Use `isinstance()` instead of `type()` for a typecheck (https://github.com/ansible-collections/community.vmware/pull/2011).
+- vmware_guest - Fix a error while updating the VM by adding a new disk. While adding a disk to an existing VM, it leaves it in invalid state. (https://github.com/ansible-collections/community.vmware/pull/2044).
+- vmware_guest - Fix a missing error message while setting a template parameter with inconsistency guest_os ID (https://github.com/ansible-collections/community.vmware/pull/2036).
+
v4.2.0
======
diff --git a/ansible_collections/community/vmware/FILES.json b/ansible_collections/community/vmware/FILES.json
index 82d6f277e..68fe7037b 100644
--- a/ansible_collections/community/vmware/FILES.json
+++ b/ansible_collections/community/vmware/FILES.json
@@ -25,14 +25,14 @@
"name": ".github/workflows/ansible-test.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c7dfcceab897d76f899e9745a5ef5134a7deffe84c7c9aca9bcce00e903a7ca8",
+ "chksum_sha256": "75ced302218d85f3484c215700b3626db0288f380c6d549f666f13ddd05585e8",
"format": 1
},
{
"name": ".github/workflows/extra-docs-linting.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19bb097e3a34621e1b74ce740716ee78818a3d6b752b1563f10e69d20450556c",
+ "chksum_sha256": "8d8d67559ba7e1fa9a637f9abee5cffe406f341fbb70ab75c60b71d46a2a92e0",
"format": 1
},
{
@@ -88,7 +88,7 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c77e5b2e21540ce43a2d83a648e341766d6373b8a909280c8a6f8cc160a40bc7",
+ "chksum_sha256": "fa92ffc48b8d5e744ed8748724d0623b9bdc81a4e57798fe99098640234cc5bc",
"format": 1
},
{
@@ -120,146 +120,6 @@
"format": 1
},
{
- "name": "docs/docsite/rst/vmware_scenarios",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/faq.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "930dbbb64474e63f5371f1bf3d989e7ac744c9201056a9ca0dc5bbb8be45386b",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/scenario_clone_template.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "71d07a85971e0b3da2ee1e7fc57349685d1a29c55e2ac8444b71ef76a623568c",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/scenario_find_vm_folder.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "84cccda3524f9c42bc470d6b2ef556c78a341cef15e78e628098dfa41350b1a9",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/scenario_remove_vm.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "5b80011ada8788e518ce9758f8c176581d6dd934cb1038eee3054c238467c20a",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/scenario_rename_vm.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "c3e8eb03b3317a7cbaa600c96b7db5771e85e48eb604c87a1a5383b32de23ee7",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/scenario_vmware_http.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "3442465954b3b08d445789816a235ac8f1f5e7799a0f78c705a402b03658465c",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/scenario_vmware_tools_connection.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "421865322fddfc9980e9af80cb78186cf752108aa438cf54a763a2a39c07770c",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_concepts.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "82bbd9bbc2f7e55103115b9200026f95766dad11a16f802808c3685e9de6ed6e",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_external_doc_links.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "64cc4675a425117eaaecd9e79fcf3e4296d8c8a271cc628db8a79cb7a81fa588",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_getting_started.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "f8f3bae534ece698eda5bcc1334e1f211b5593620886979de0375d9f4d3dcd08",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_intro.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "95e3b92ba05d1f3a0f22eb11471b4ac6d3c906aeb3b5d54e9eb2c0b82c86185e",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_inventory.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "01faddedba147f6ad6a03abbbbb22a8890e6d79ea9339356f4e3a394ea32d3a5",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_inventory_filters.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "61db0373933ffe8e85ea740d938ecd3b541aff3b97a9367c981cc766f7e054cf",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_inventory_hostnames.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "15c534d481f064527280739774b56da9dae37d0ab05e48707f18855840b5a610",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_inventory_vm_attributes.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "af1c7f150d450f47f4db46c96f30699dec2cd67bbd2c1cd3ea1a5acadd288b92",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_module_reference.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "973d25cc3a951fc05aa4d0a1b0e16b34444fce3389bb838a354a1f48b7f77602",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_requirements.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "5c1986dde7d60dd77db7bfacc48f6931ad366bb8429024300d7d348595be1bed",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_scenarios.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "335f2dd7e2a77e322c8e45e22f20c761e9289c46c5deb4f379d86369dc345f22",
- "format": 1
- },
- {
- "name": "docs/docsite/rst/vmware_scenarios/vmware_troubleshooting.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "a7b26ba15577611b5a9925b8f18ce04d03dd9308d3c36a77a1c4af628077d6b7",
- "format": 1
- },
- {
"name": "docs/docsite/rst/dev_guide.rst",
"ftype": "file",
"chksum_type": "sha256",
@@ -267,17 +127,10 @@
"format": 1
},
{
- "name": "docs/docsite/rst/scenario_guide.rst",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "e33043c593d5173ca6fc80bc9d4ea744ecdb31e17288c60fd41bbbf8cecf2b8e",
- "format": 1
- },
- {
"name": "docs/docsite/extra-docs.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a04e14a68de6ce6570daa59ec2696684760f597b1ae085c410060f7bba9ae164",
+ "chksum_sha256": "1e07a4f54473638944cb668af1946e6720c9fd68d0e42b50e810f80bb787f6e7",
"format": 1
},
{
@@ -291,7 +144,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6b8f4f91c50cad886a4518aefee3ec6b06d0ba0f8b4ca1012b9f2f5086549b2e",
+ "chksum_sha256": "640043f6dea01c5c53fac165595ead8d77e2c0ff2be5c17f1e5372d3be8e499f",
"format": 1
},
{
@@ -340,14 +193,14 @@
"name": "plugins/doc_fragments/vmware.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "06348a39b25b21a24f79031dc99652b42cc09df93f54c29445df2dce0bbddd7d",
+ "chksum_sha256": "66fce69c869a2fab3666a3d36142c09212827f55a3fd681afcb93df34d23404c",
"format": 1
},
{
"name": "plugins/doc_fragments/vmware_rest_client.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cc694d07e9412e11238a8fab29a003337a21a1acb73c836ba9ed91923a74b8e3",
+ "chksum_sha256": "e392382f541729a10a27b064c036cf2232da62c02e06bca7cbee0d3b5fd04d61",
"format": 1
},
{
@@ -424,7 +277,7 @@
"name": "plugins/module_utils/vmware.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7dc70d2619b3e76336b732af47103d65ede45c8bd780aea3a67cb324ddcf3ff8",
+ "chksum_sha256": "902d67e645b235e10d27e179666442625e6ea9df4a4e4589ee6ba1427376b652",
"format": 1
},
{
@@ -487,7 +340,7 @@
"name": "plugins/modules/vcenter_folder.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "11e5b4064182b25aaeb7ab2ab1d9e5749f1e0a89244848f90c9f40b34bc82196",
+ "chksum_sha256": "0c27fd723ffd81277ccff70f5babafc38b33e0b302fcf9dbd0a17529d70074ad",
"format": 1
},
{
@@ -519,17 +372,24 @@
"format": 1
},
{
+ "name": "plugins/modules/vmware_all_snapshots_info.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "90c3ebaa53599914d5d4abf60e018666e5e7ac47a176973d924daab9694ddbb6",
+ "format": 1
+ },
+ {
"name": "plugins/modules/vmware_category.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "803becfbcd55ee9cbfd72cd45c462bc712506b9cb88dd1a74cdfde0dbc8e127e",
+ "chksum_sha256": "30c64d2900fba1ffac504b8fb9708768388bf8cfc136cab67060034cc98fc6ec",
"format": 1
},
{
"name": "plugins/modules/vmware_category_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a96e1cf4a156c93b0d9d2a0460078574cd5ebb8696ec5bd358b788ff9ae3218",
+ "chksum_sha256": "1cbf1ddbab506852d4919512b66b36dc7c2428f69521019a1730a09018047367",
"format": 1
},
{
@@ -543,21 +403,21 @@
"name": "plugins/modules/vmware_cluster.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a98362ca64844cddaaf8878893a9def9bace3193a2bc8da8a877bee1edf854a",
+ "chksum_sha256": "311163c84c4d0a43349afa7bbc7afedd3ab1fc43ec4fdae9cd705d004e380a21",
"format": 1
},
{
"name": "plugins/modules/vmware_cluster_dpm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3f463cf81333d20291c899891abda5f48b1ff74108e949cf3b11c4b754df8683",
+ "chksum_sha256": "823d0eba4ad0a749924bc16b0ac8540211a54add654b4ca445c8ad246bddf250",
"format": 1
},
{
"name": "plugins/modules/vmware_cluster_drs.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2b9b944de75a0973e2540aefca3bd3d5853d803cf5965d967a7a79c2a4b96dc3",
+ "chksum_sha256": "e34a56ecad9d3a2746ead00a58e4cbb65b19e39f06331a28864cb18660c8327f",
"format": 1
},
{
@@ -571,56 +431,56 @@
"name": "plugins/modules/vmware_cluster_ha.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f5d91c541f5e62fa4dfa246dc8d887128ddf0f23876b15dbcb6f069973c69cce",
+ "chksum_sha256": "b28c2e004816ce245f6cd32bb4c36c78eaf08dc1f4f8fb3aacc26c6c9417f2fa",
"format": 1
},
{
"name": "plugins/modules/vmware_cluster_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82f3e55c5865b15aa735c536c1a6798cb202c7f79a043b54852da7f3e29c3599",
+ "chksum_sha256": "2f1c85c2da228ca18fd165303c4bf6e3820785433f8e4c4b29da5532f097ae55",
"format": 1
},
{
"name": "plugins/modules/vmware_cluster_vcls.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c40ed2776b1c51fb8bd540bd4f505a89950c86a796af60bba69a25efe4b5431",
+ "chksum_sha256": "775056566fd97d763e8b96ad5c98403e705003310b77a2d18bc6a34b132cb9cf",
"format": 1
},
{
"name": "plugins/modules/vmware_cluster_vsan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fc41f927567108b1d8fe017195d140378a73480f89d503011b270818e6b8728c",
+ "chksum_sha256": "93ecdc100e8fa5f100f2338ba2bdfbae93478e34bbf59059cda3fd5f717bdda6",
"format": 1
},
{
"name": "plugins/modules/vmware_content_deploy_ovf_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "056f5aab74cad12ff5c0bba871a38d0082afb9e3ed4f6c9f12f5b5cf4d552ce0",
+ "chksum_sha256": "a504f0013c4cb6c309975d8b7d4dd1d158abfd5fa0c0a08afbbf02b8c947e29b",
"format": 1
},
{
"name": "plugins/modules/vmware_content_deploy_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f72369be7754bc4e22ffef0cb6a56db07532f0d391b19011f20f2b5ecc426d84",
+ "chksum_sha256": "38d7265a3b17b904ffa4e70da0d0d09ee42088a07df9f2d14337dd9a563a9bcf",
"format": 1
},
{
"name": "plugins/modules/vmware_content_library_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e1293f0cb822b7435cb3d3e1e5170c990bc03d06ab49ae5cfcf7f32653b83285",
+ "chksum_sha256": "b1668dc4da6e9e41a143c7e80bc8f59bdb13d2ca30d22b10bd4e0a1a1324ec6e",
"format": 1
},
{
"name": "plugins/modules/vmware_content_library_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4efe68143e7233415a30e91fb71b68b24fd8635305a29899462943fe6e834286",
+ "chksum_sha256": "0d736b6cba5b9d62cc6e63ce39bbb8e371783d5bb58f888ccacaac5646a2bf6c",
"format": 1
},
{
@@ -662,21 +522,21 @@
"name": "plugins/modules/vmware_datastore_cluster.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "32e575cf227fec3ae5004d97b413c3d9a2ed4bf0f0b3b6a0479b344d6c7c7147",
+ "chksum_sha256": "b56a80bf30230a6128d64360ea3ee2eac60df4003700db5a53adaddf28667880",
"format": 1
},
{
"name": "plugins/modules/vmware_datastore_cluster_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d777f38acda366326fbf061e4037ef5a0ffb98384998224076a45192ee73f69c",
+ "chksum_sha256": "ea6224af0dfe43391aaa73e6e1601437e971bda1ad080bfe626a715ed5fcf029",
"format": 1
},
{
"name": "plugins/modules/vmware_datastore_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f18ba418804c7f5bc856500ab4a6d9e24fa558a15340c5dcb28495961b5e562a",
+ "chksum_sha256": "324deb8bd961b7c4834f581d1979ab0aba69e7a7e82879f060a4b37ec2a4edda",
"format": 1
},
{
@@ -690,7 +550,7 @@
"name": "plugins/modules/vmware_deploy_ovf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7fc7ced342d72f868d3d6d8919f071732ee35bdee34af491c9dbcae1272a29c9",
+ "chksum_sha256": "735cafd1d64ae101d323f220cdd05384738b97f99434ee5838b820cbbb2e5930",
"format": 1
},
{
@@ -753,7 +613,7 @@
"name": "plugins/modules/vmware_dvswitch.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e0b58b5ff685fd093fa0b97931473dd6be059b435a6c0e332915019d342ef893",
+ "chksum_sha256": "be8458b48fdfadbcea5849beed4ef03651f0465a5f37cec72d7f5ac610968202",
"format": 1
},
{
@@ -802,7 +662,7 @@
"name": "plugins/modules/vmware_export_ovf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55d635752a4c3cc1af02ae255a1acf073781e4ce441195e76bcf5764551e098c",
+ "chksum_sha256": "d174a4d017092d89a92a0555e1e078aa39e4356370bb6215fa90979f46b2086f",
"format": 1
},
{
@@ -830,7 +690,7 @@
"name": "plugins/modules/vmware_guest.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55738b294073afb1f44d52bbcd1590ebd9f4a3fd93cdf563aa663a35f9e41560",
+ "chksum_sha256": "e4bab2821b327625942772574bd70a12d56eb81cc9b883c2351d1636defbd235",
"format": 1
},
{
@@ -844,21 +704,21 @@
"name": "plugins/modules/vmware_guest_boot_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67e88707f99a21714c12a0263bccae93e7f2e7179eae4f5ce0083de4d268dbde",
+ "chksum_sha256": "acea9e5a58f9f23e872f0a8629d5e0c92bd729e75eef2f70c3d39379d057ba91",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_controller.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "80c4af1521de6264c891a2e60f60fbd62d342011d072cf198cf702b52e26ce71",
+ "chksum_sha256": "961937472c22b53f5b6034525a9f75e33f1fa628b22f24649f3df98cbd7fc55b",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_cross_vc_clone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "283ac6f176ab1cd023ac5b65784fa3fbfdf5979113b86ca3ca0473f1f36ac4e8",
+ "chksum_sha256": "3a25bcc0ebc47ec9aee6299bf1edd5e61b6edeb982164b47654a6fe99d505e54",
"format": 1
},
{
@@ -879,21 +739,21 @@
"name": "plugins/modules/vmware_guest_customization_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9c78119d928cbbdb182d88571ab881b8b28c11de7c9d9b93d1f7abafcd289959",
+ "chksum_sha256": "00a52eaee1678b4982f4cb7811bde96449d6c49164d4caee8b6966ea9e24def5",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_disk.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aaadad51ac60409131ac1870bf3718e084b7a1ab931424acd68ccf430ff0c96c",
+ "chksum_sha256": "998605e6ca41ceae52998a664c26c9ec6cd42495c14dc98255621d4ebd8abe54",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_disk_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5e3f6251a881e672180694dbfe1c548625acabb8a0ac525d1c675d98aafeae7e",
+ "chksum_sha256": "1853016016ef07e306e9a34309d4feda76e0b5f67781851cec52f29f1b11d7be",
"format": 1
},
{
@@ -921,14 +781,14 @@
"name": "plugins/modules/vmware_guest_instant_clone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13d57b323a3f9662c6ef419b0d549f03b76fb98909c5361ce90ed387213359e0",
+ "chksum_sha256": "c5c9cde1be64a9968211f02d5e45eb91806bf4f0a9cff4b7789e2649b1a8890b",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_move.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a7a8c7fa21886fd90d091511ebe933e0f3848fea87b886358dcf41d5aab48112",
+ "chksum_sha256": "c3160b9fd746e6ec1ea229b6e6566d464389f9797e972c06fb567a265724c897",
"format": 1
},
{
@@ -942,28 +802,28 @@
"name": "plugins/modules/vmware_guest_powerstate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7296037dcfa5296e29eb3a2f1fa6968267e80acfbd97f8279141331197f432b1",
+ "chksum_sha256": "3b8c4d4347fb6db05daabcfc23ebb5d61a3eaaeba8b3fba8b323dca0869bb575",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_register_operation.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "367d95915f41ade54a88f5277a56d76012920e990fe6e2b2f6e99914cdc0ac67",
+ "chksum_sha256": "4d03dc3328c6b15d025bd9a067db6e3b07d3a6d83e285ccc2ac6083362def7ec",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_screenshot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "581e791515b4de8f1d010a63aafb6fd032621d716f84df4ed0c8c17643d1481d",
+ "chksum_sha256": "098ba39e82d0f8deffe53548e620b744e1ead80f97e79c6c418b04111002a129",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_sendkey.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7c7233857e429495fe4590bb04bb1d5969a69e51f13e4710f1f63858c6c8029",
+ "chksum_sha256": "be64447bd8f19cb536bc2989e922b94a602c7bdb9252869be37aff894daeb0f6",
"format": 1
},
{
@@ -977,7 +837,7 @@
"name": "plugins/modules/vmware_guest_snapshot.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf3c5339f076c95b0b0525281829f407b862ebc9e5d3c41a85127d52c85ebd64",
+ "chksum_sha256": "6eccf9a0a8f9330b13a0805391bcfb618379a402cb8d88a4aae7efe15312a952",
"format": 1
},
{
@@ -991,14 +851,14 @@
"name": "plugins/modules/vmware_guest_storage_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "83de69a093891f34dd8ad71be700ad455616f00344f9aa05de00b25290b1749d",
+ "chksum_sha256": "9dabff116a379bfbecf992aea4326a15e82105bcc08fa83e69b84ca93808c44f",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_tools_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b0eee01ad1315b25b15cccb47332890b7d60fb7f486e18951cda7b91678a7b3c",
+ "chksum_sha256": "06c9b2377a22371f9924f6bad1f18c7a99340e6628271de1204ee51ec9f8f7ae",
"format": 1
},
{
@@ -1019,28 +879,28 @@
"name": "plugins/modules/vmware_guest_tpm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e73e993987116bb0a8f94f15be9a298ad523a1edc75577e70b18124f0a11fc50",
+ "chksum_sha256": "41d8d618e17d8bab62425550e58d62f68d627ff84838a76c69db7280c6637ca8",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_vgpu.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bc7cef555f0688d289cfaa7fac62e32fc2f0801e406602adeb0e85150ce6ac24",
+ "chksum_sha256": "29a51f9bbddc129be2e3a3b937a443f586329dafcaeed1d9df63345cb52fa946",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_vgpu_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d42e32c21a8c8b2447b869d73ee3235f893ab4ab9f0419be4bfb351b09c8711c",
+ "chksum_sha256": "e40a6d62d5566c22d47a2b85ad55e8a26e2fc08c95761a96f096fd9564a4f4a9",
"format": 1
},
{
"name": "plugins/modules/vmware_guest_video.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e9bbb46a7f1d814bc172f12339ed7c74eabcd7b1b5f2734f5cca08b44f27587b",
+ "chksum_sha256": "4b45e1f2708295625256a04756a2173ec443656b2195040fc2c37fac7445a7e1",
"format": 1
},
{
@@ -1110,7 +970,7 @@
"name": "plugins/modules/vmware_host_datastore.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d16e63c55e7f60e67c444d2e6221979bd9686fb6b505da6f4c1c1a5bac327043",
+ "chksum_sha256": "d8a69b96e9092b60f593fff47f29c81dad602a12ac954ee369ea6f1c414b35d8",
"format": 1
},
{
@@ -1131,7 +991,7 @@
"name": "plugins/modules/vmware_host_dns_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6ff0ef349e63ba77ffe530527281f057e605556e44680196a1fc7ae6af6bf52b",
+ "chksum_sha256": "e1e75a2146d8030295c3340f77cc6ddafbc1e1e32e4e0ceaecb5c0c3723bb1cd",
"format": 1
},
{
@@ -1208,14 +1068,14 @@
"name": "plugins/modules/vmware_host_lockdown.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0928b4198afb453f5112bbdfbf6c1bb79acfa727f1880c2041a68d547cf29df4",
+ "chksum_sha256": "2b89107bcc0f64dea4d3951287dd6eba9363fe90dd3593566fbe40930bfa6550",
"format": 1
},
{
"name": "plugins/modules/vmware_host_lockdown_exceptions.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f160e9dd9508feaf378f91d81756bec62fdd341c69af59cd7ca42d6a93abddae",
+ "chksum_sha256": "bc668da0bebbb572a0d3e6547a555c24ecc66d2d1a27f450a39f95a95284e374",
"format": 1
},
{
@@ -1278,7 +1138,7 @@
"name": "plugins/modules/vmware_host_scanhba.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b3a3aafa0fd9786cfd95cd61a2d48c275f2239695ac5a7e4724c2ad79b675ab",
+ "chksum_sha256": "2da03b6b66863611805de12deb733040c461d01c96b29cba8faa56390df849f6",
"format": 1
},
{
@@ -1369,7 +1229,7 @@
"name": "plugins/modules/vmware_local_user_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e17900d6d0c71ff7f8261b0b7206529342d63ddc5b85736fdb837e278f091ddb",
+ "chksum_sha256": "d7aa4625a79ee1126375294702f94d4beb2d410570d72663a926c672a03447c4",
"format": 1
},
{
@@ -1404,7 +1264,7 @@
"name": "plugins/modules/vmware_object_rename.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "37f489b055f824b6359902d4bc137fbd8d15766089d5f48f7633eac0e424d314",
+ "chksum_sha256": "04145884fc9eac139b5bd2c583628987cabf994b230070e1371ad7c50e7bdfef",
"format": 1
},
{
@@ -1460,21 +1320,21 @@
"name": "plugins/modules/vmware_tag.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4518b9e396ba1f7bc6e1bfc940354894de6de17fcad23a25a4fd291c9af78908",
+ "chksum_sha256": "80958e12ec311af76c5b86fdd163efd4459a5c0a56f369d76f86daa45b3d0d28",
"format": 1
},
{
"name": "plugins/modules/vmware_tag_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "44d9da854f578cb92dcd26b26470bf3cbbc9acb8de7f50f656f18852fdfc6d95",
+ "chksum_sha256": "614bbf9d87c86725cfb57548046e57441fa38562f4c64ebcff50632a68c5f443",
"format": 1
},
{
"name": "plugins/modules/vmware_tag_manager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71e0a9229c66e5e788e65bb80450508024efda304620562a6ab0b250474e2225",
+ "chksum_sha256": "92f36995dc2dbaaabb9caa790a135fcfdbb42a87ee3d55ec4b8787dc2a0c97bd",
"format": 1
},
{
@@ -1502,7 +1362,7 @@
"name": "plugins/modules/vmware_vc_infraprofile_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c3a9e5a035ff87eb4843be8c2a3785d16efad669d93f07d5e47c924ead2c0ef7",
+ "chksum_sha256": "b491bce442122162d5eb1d7b8738576ac98a9982564a6950a806875cee11d56e",
"format": 1
},
{
@@ -1530,7 +1390,7 @@
"name": "plugins/modules/vmware_vm_config_option.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "591504d7977d1ced5a5f538783b01a81b56a5bd8de82e5990949663058a1359d",
+ "chksum_sha256": "1729e863834cf6326ec25cac2532666a18b17360e3377e02962dc0e991d0ffec",
"format": 1
},
{
@@ -1551,7 +1411,7 @@
"name": "plugins/modules/vmware_vm_shell.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9416f7b6cd6fb70e09b9b1a5ee5aac81250544037017bca639a916da47a5690d",
+ "chksum_sha256": "8de5d76c004005febc9fd6bb57a94dcc6cfcc996aa27e2f0bfd0c52d159d47c4",
"format": 1
},
{
@@ -1733,7 +1593,7 @@
"name": "scripts/inventory/vmware_inventory.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "45f7b341f4ce6f9b4e6392ee6e78a94f5187f370a314e358b5cf30f29492295f",
+ "chksum_sha256": "71d1124982666d9b26fffdf287f7aa0057662df4a400e2888149ce646a6dc6f8",
"format": 1
},
{
@@ -6917,6 +6777,13 @@
"format": 1
},
{
+ "name": "tests/sanity/ignore-2.18.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5c62bddf4ca5eac160fda8aa8cc0ce0998ab1a3dccb91c37270a837c2d1e20cd",
+ "format": 1
+ },
+ {
"name": "tests/unit",
"ftype": "dir",
"chksum_type": null,
@@ -6941,7 +6808,7 @@
"name": "tests/unit/mock/loader.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b51ec0d45347a3568300e50f688998007e346f052bd2e961c2ac6d13f7cee4d",
+ "chksum_sha256": "7c14b7d02a6ccfe27d0012190a7e457eec60a92ba68a6377e488f31e71da062c",
"format": 1
},
{
@@ -7158,7 +7025,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a26eb552f9062d66fdecc635a886f159a66790045e05dcfc7da4574f974140b3",
+ "chksum_sha256": "6b2e0c075305c8d5f1b662a7533014e70ec9d1733eb79d5f70f1e024ecc06d99",
"format": 1
},
{
diff --git a/ansible_collections/community/vmware/MANIFEST.json b/ansible_collections/community/vmware/MANIFEST.json
index acc7f148d..d1bc8edfe 100644
--- a/ansible_collections/community/vmware/MANIFEST.json
+++ b/ansible_collections/community/vmware/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "community",
"name": "vmware",
- "version": "4.2.0",
+ "version": "4.3.0",
"authors": [
"Ansible (https://github.com/ansible)"
],
@@ -28,7 +28,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1ef7fbdfa909824b3ed7734c6a79135d82971bdff522b1ddd9c3cb4844c21d9a",
+ "chksum_sha256": "af79d3641999ba756f51b0b3c0562e0ebba66c8c764a0aff81496d5906a7398a",
"format": 1
},
"format": 1
diff --git a/ansible_collections/community/vmware/changelogs/changelog.yaml b/ansible_collections/community/vmware/changelogs/changelog.yaml
index f2d8cea11..2b250b5fd 100644
--- a/ansible_collections/community/vmware/changelogs/changelog.yaml
+++ b/ansible_collections/community/vmware/changelogs/changelog.yaml
@@ -102,3 +102,31 @@ releases:
- 1995-vsphere_copy.yml
- 1996 - vmware_first_class_disk_info.yml
release_date: '2024-02-24'
+ 4.3.0:
+ changes:
+ bugfixes:
+ - Use `isinstance()` instead of `type()` for a typecheck (https://github.com/ansible-collections/community.vmware/pull/2011).
+ - vmware_guest - Fix a error while updating the VM by adding a new disk. While
+ adding a disk to an existing VM, it leaves it in invalid state. (https://github.com/ansible-collections/community.vmware/pull/2044).
+ - vmware_guest - Fix a missing error message while setting a template parameter
+ with inconsistency guest_os ID (https://github.com/ansible-collections/community.vmware/pull/2036).
+ deprecated_features:
+ - vmware_guest_tools_info - `vm_tools_install_status` will be removed from next
+ major version (5.0.0) of the collection since the API call that provides this
+ information has been deprecated by VMware. Use `vm_tools_running_status` /
+ `vm_tools_version_status` instead (https://github.com/ansible-collections/community.vmware/issues/2033).
+ minor_changes:
+ - Document that all parameters and VMware object names are case sensitive (https://github.com/ansible-collections/community.vmware/issues/2019).
+ - Drop the outdated (and actually unmaintained) scenario guides (https://github.com/ansible-collections/community.vmware/pull/2022).
+ - vmware_dvswitch - Add switchIpAddress/switch_ip parameter for netflow config
+ - vmware_guest_tools_info - Use `toolsVersionStatus2` instead of `toolsVersionStatus`
+ (https://github.com/ansible-collections/community.vmware/issues/2033).
+ fragments:
+ - 1949-dvswitch_netflow_switch_ip.yml
+ - 2019-doc_fragments-case-sensitive.yml
+ - 2022-drop_sceanrio_guides.yml
+ - 2024027-fix_ci.yml
+ - 2033-vmware_guest_tools_info.yml
+ - 2036-missing_error_msg_in_vmware_guest.yml
+ - 2044-error_in_adding_disk_to_vm_in_vmware_guest.yml
+ release_date: '2024-04-20'
diff --git a/ansible_collections/community/vmware/docs/docsite/extra-docs.yml b/ansible_collections/community/vmware/docs/docsite/extra-docs.yml
index 9acde7f20..cc63130a2 100644
--- a/ansible_collections/community/vmware/docs/docsite/extra-docs.yml
+++ b/ansible_collections/community/vmware/docs/docsite/extra-docs.yml
@@ -1,8 +1,5 @@
---
sections:
- - title: Scenario Guide
- toctree:
- - scenario_guide
- title: Developer Guide
toctree:
- dev_guide
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/scenario_guide.rst b/ansible_collections/community/vmware/docs/docsite/rst/scenario_guide.rst
deleted file mode 100644
index 270af08cd..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/scenario_guide.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_ansible:
-
-************
-VMware Guide
-************
-
-Welcome to the Ansible for VMware Guide!
-
-The purpose of this guide is to teach you everything you need to know about using Ansible with VMware.
-
-To get started, please select one of the following topics.
-
-.. toctree::
- :maxdepth: 1
-
- vmware_scenarios/vmware_intro
- vmware_scenarios/vmware_concepts
- vmware_scenarios/vmware_requirements
- vmware_scenarios/vmware_inventory
- vmware_scenarios/vmware_inventory_vm_attributes
- vmware_scenarios/vmware_inventory_hostnames
- vmware_scenarios/vmware_inventory_filters
- vmware_scenarios/vmware_scenarios
- vmware_scenarios/vmware_troubleshooting
- vmware_scenarios/vmware_external_doc_links
- vmware_scenarios/faq
-.. comments look like this - start with two dots
-.. getting_started content not ready
-.. vmware_scenarios/vmware_getting_started
-.. module index page not ready
-.. vmware_scenarios/vmware_module_reference
-.. always exclude the template file
-.. vmware_scenarios/vmware_scenario_1
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/faq.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/faq.rst
deleted file mode 100644
index 52f4f729e..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/faq.rst
+++ /dev/null
@@ -1,26 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_faq:
-
-******************
-Ansible VMware FAQ
-******************
-
-vmware_guest
-============
-
-Can I deploy a virtual machine on a standalone ESXi server ?
-------------------------------------------------------------
-
-Yes. ``vmware_guest`` can deploy a virtual machine with required settings on a standalone ESXi server.
-However, you must have a paid license to deploy virtual machines this way. If you are using the free version, the API is read-only.
-
-Is ``/vm`` required for ``vmware_guest`` module ?
--------------------------------------------------
-
-Prior to Ansible version 2.5, ``folder`` was an optional parameter with a default value of ``/vm``.
-
-The folder parameter was used to discover information about virtual machines in the given infrastructure.
-
-Starting with Ansible version 2.5, ``folder`` is still an optional parameter with no default value.
-This parameter will be now used to identify a user's virtual machine, if multiple virtual machines or virtual
-machine templates are found with same name. VMware does not restrict the system administrator from creating virtual
-machines with same name.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_clone_template.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_clone_template.rst
deleted file mode 100644
index 1139a2523..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_clone_template.rst
+++ /dev/null
@@ -1,223 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_guest_from_template:
-
-****************************************
-Deploy a virtual machine from a template
-****************************************
-
-.. contents::
- :local:
-
-Introduction
-============
-
-This guide will show you how to utilize Ansible to clone a virtual machine from already existing VMware template or existing VMware guest.
-
-Scenario requirements
-=====================
-
-* Software
-
- * Ansible 2.5 or later must be installed
-
- * The Python module ``Pyvmomi`` must be installed on the Ansible (or Target host if not executing against localhost)
-
- * Installing the latest ``Pyvmomi`` via ``pip`` is recommended [as the OS provided packages are usually out of date and incompatible]
-
-* Hardware
-
- * vCenter Server with at least one ESXi server
-
-* Access / Credentials
-
- * Ansible (or the target server) must have network access to the either vCenter server or the ESXi server you will be deploying to
-
- * Username and Password
-
- * Administrator user with following privileges
-
- - ``Datastore.AllocateSpace`` on the destination datastore or datastore folder
- - ``Network.Assign`` on the network to which the virtual machine will be assigned
- - ``Resource.AssignVMToPool`` on the destination host, cluster, or resource pool
- - ``VirtualMachine.Config.AddNewDisk`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.AddRemoveDevice`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Interact.PowerOn`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Inventory.CreateFromExisting`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Provisioning.Clone`` on the virtual machine you are cloning
- - ``VirtualMachine.Provisioning.Customize`` on the virtual machine or virtual machine folder if you are customizing the guest operating system
- - ``VirtualMachine.Provisioning.DeployTemplate`` on the template you are using
- - ``VirtualMachine.Provisioning.ReadCustSpecs`` on the root vCenter Server if you are customizing the guest operating system
-
- Depending on your requirements, you could also need one or more of the following privileges:
-
- - ``VirtualMachine.Config.CPUCount`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.Memory`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.DiskExtend`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.Annotation`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.AdvancedConfig`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.EditDevice`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.Resource`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.Settings`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Config.UpgradeVirtualHardware`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Interact.SetCDMedia`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Interact.SetFloppyMedia`` on the datacenter or virtual machine folder
- - ``VirtualMachine.Interact.DeviceConnection`` on the datacenter or virtual machine folder
-
-Assumptions
-===========
-
-- All variable names and VMware object names are case sensitive.
-- VMware allows creation of virtual machine and templates with same name across datacenters and within datacenters.
-- You need to use Python 2.7.9 version in order to use ``validate_certs`` option, as this version is capable of changing the SSL verification behaviours.
-
-Caveats
-=======
-
-- Hosts in the ESXi cluster must have access to the datastore that the template resides on.
-- Multiple templates with the same name will cause module failures.
-- In order to utilize Guest Customization, VMware Tools must be installed on the template. For Linux, the ``open-vm-tools`` package is recommended, and it requires that ``Perl`` be installed.
-
-
-Example description
-===================
-
-In this use case / example, we will be selecting a virtual machine template and cloning it into a specific folder in our Datacenter / Cluster. The following Ansible playbook showcases the basic parameters that are needed for this.
-
-.. code-block:: yaml
-
- ---
- - name: Create a VM from a template
- hosts: localhost
- gather_facts: no
- tasks:
- - name: Clone the template
- vmware_guest:
- hostname: "{{ vcenter_ip }}"
- username: "{{ vcenter_username }}"
- password: "{{ vcenter_password }}"
- validate_certs: False
- name: testvm_2
- template: template_el7
- datacenter: "{{ datacenter_name }}"
- folder: /DC1/vm
- state: poweredon
- cluster: "{{ cluster_name }}"
- wait_for_ip_address: yes
-
-
-Since Ansible utilizes the VMware API to perform actions, in this use case we will be connecting directly to the API from our localhost. This means that our playbooks will not be running from the vCenter or ESXi Server. We do not necessarily need to collect facts about our localhost, so the ``gather_facts`` parameter will be disabled. You can run these modules against another server that would then connect to the API if your localhost does not have access to vCenter. If so, the required Python modules will need to be installed on that target server.
-
-To begin, there are a few bits of information we will need. First and foremost is the hostname of the ESXi server or vCenter server. After this, you will need the username and password for this server. For now, you will be entering these directly, but in a more advanced playbook this can be abstracted out and stored in a more secure fashion using :ref:`ansible-vault` or using `Ansible Tower credentials <https://docs.ansible.com/ansible-tower/latest/html/userguide/credentials.html>`_. If your vCenter or ESXi server is not setup with proper CA certificates that can be verified from the Ansible server, then it is necessary to disable validation of these certificates by using the ``validate_certs`` parameter. To do this you need to set ``validate_certs=False`` in your playbook.
-
-Now you need to supply the information about the virtual machine which will be created. Give your virtual machine a name, one that conforms to all VMware requirements for naming conventions. Next, select the display name of the template from which you want to clone new virtual machine. This must match what's displayed in VMware Web UI exactly. Then you can specify a folder to place this new virtual machine in. This path can either be a relative path or a full path to the folder including the Datacenter. You may need to specify a state for the virtual machine. This simply tells the module which action you want to take, in this case you will be ensure that the virtual machine exists and is powered on. An optional parameter is ``wait_for_ip_address``, this will tell Ansible to wait for the virtual machine to fully boot up and VMware Tools is running before completing this task.
-
-
-What to expect
---------------
-
-- You will see a bit of JSON output after this playbook completes. This output shows various parameters that are returned from the module and from vCenter about the newly created VM.
-
-.. code-block:: yaml
-
- {
- "changed": true,
- "instance": {
- "annotation": "",
- "current_snapshot": null,
- "customvalues": {},
- "guest_consolidation_needed": false,
- "guest_question": null,
- "guest_tools_status": "guestToolsNotRunning",
- "guest_tools_version": "0",
- "hw_cores_per_socket": 1,
- "hw_datastores": [
- "ds_215"
- ],
- "hw_esxi_host": "192.0.2.44",
- "hw_eth0": {
- "addresstype": "assigned",
- "ipaddresses": null,
- "label": "Network adapter 1",
- "macaddress": "00:50:56:8c:19:f4",
- "macaddress_dash": "00-50-56-8c-19-f4",
- "portgroup_key": "dvportgroup-17",
- "portgroup_portkey": "0",
- "summary": "DVSwitch: 50 0c 5b 22 b6 68 ab 89-fc 0b 59 a4 08 6e 80 fa"
- },
- "hw_files": [
- "[ds_215] testvm_2/testvm_2.vmx",
- "[ds_215] testvm_2/testvm_2.vmsd",
- "[ds_215] testvm_2/testvm_2.vmdk"
- ],
- "hw_folder": "/DC1/vm",
- "hw_guest_full_name": null,
- "hw_guest_ha_state": null,
- "hw_guest_id": null,
- "hw_interfaces": [
- "eth0"
- ],
- "hw_is_template": false,
- "hw_memtotal_mb": 512,
- "hw_name": "testvm_2",
- "hw_power_status": "poweredOff",
- "hw_processor_count": 2,
- "hw_product_uuid": "420cb25b-81e8-8d3b-dd2d-a439ee54fcc5",
- "hw_version": "vmx-13",
- "instance_uuid": "500cd53b-ed57-d74e-2da8-0dc0eddf54d5",
- "ipv4": null,
- "ipv6": null,
- "module_hw": true,
- "snapshots": []
- },
- "invocation": {
- "module_args": {
- "annotation": null,
- "cdrom": {},
- "cluster": "DC1_C1",
- "customization": {},
- "customization_spec": null,
- "customvalues": [],
- "datacenter": "DC1",
- "disk": [],
- "esxi_hostname": null,
- "folder": "/DC1/vm",
- "force": false,
- "guest_id": null,
- "hardware": {},
- "hostname": "192.0.2.44",
- "is_template": false,
- "linked_clone": false,
- "name": "testvm_2",
- "name_match": "first",
- "networks": [],
- "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
- "port": 443,
- "resource_pool": null,
- "snapshot_src": null,
- "state": "present",
- "state_change_timeout": 0,
- "template": "template_el7",
- "username": "administrator@vsphere.local",
- "uuid": null,
- "validate_certs": false,
- "vapp_properties": [],
- "wait_for_ip_address": true
- }
- }
- }
-
-- State is changed to ``True`` which notifies that the virtual machine is built using given template. The module will not complete until the clone task in VMware is finished. This can take some time depending on your environment.
-
-- If you utilize the ``wait_for_ip_address`` parameter, then it will also increase the clone time as it will wait until virtual machine boots into the OS and an IP Address has been assigned to the given NIC.
-
-
-
-Troubleshooting
----------------
-
-Things to inspect:
-
-- Check if the values provided for username and password are correct.
-- Check if the datacenter you provided is available.
-- Check if the template specified exists and you have permissions to access the datastore.
-- Ensure the full folder path you specified already exists. It will not create folders automatically for you.
-
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_find_vm_folder.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_find_vm_folder.rst
deleted file mode 100644
index fccd47e26..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_find_vm_folder.rst
+++ /dev/null
@@ -1,121 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_guest_find_folder:
-
-******************************************************
-Find folder path of an existing VMware virtual machine
-******************************************************
-
-.. contents::
- :local:
-
-Introduction
-============
-
-This guide will show you how to utilize Ansible to find folder path of an existing VMware virtual machine.
-
-Scenario requirements
-=====================
-
-* Software
-
- * Ansible 2.5 or later must be installed.
-
- * The Python module ``Pyvmomi`` must be installed on the Ansible control node (or Target host if not executing against localhost).
-
- * We recommend installing the latest version with pip: ``pip install Pyvmomi`` (as the OS packages are usually out of date and incompatible).
-
-* Hardware
-
- * At least one standalone ESXi server or
-
- * vCenter Server with at least one ESXi server
-
-* Access / Credentials
-
- * Ansible (or the target server) must have network access to the either vCenter server or the ESXi server
-
- * Username and Password for vCenter or ESXi server
-
-Caveats
-=======
-
-- All variable names and VMware object names are case sensitive.
-- You need to use Python 2.7.9 version in order to use ``validate_certs`` option, as this version is capable of changing the SSL verification behaviours.
-
-
-Example description
-===================
-
-With the following Ansible playbook you can find the folder path of an existing virtual machine using name.
-
-.. code-block:: yaml
-
- ---
- - name: Find folder path of an existing virtual machine
- hosts: localhost
- gather_facts: False
- vars_files:
- - vcenter_vars.yml
- vars:
- ansible_python_interpreter: "/usr/bin/env python3"
- tasks:
- - set_fact:
- vm_name: "DC0_H0_VM0"
-
- - name: "Find folder for VM - {{ vm_name }}"
- vmware_guest_find:
- hostname: "{{ vcenter_server }}"
- username: "{{ vcenter_user }}"
- password: "{{ vcenter_pass }}"
- validate_certs: False
- name: "{{ vm_name }}"
- delegate_to: localhost
- register: vm_facts
-
-
-Since Ansible utilizes the VMware API to perform actions, in this use case it will be connecting directly to the API from localhost.
-
-This means that playbooks will not be running from the vCenter or ESXi Server.
-
-Note that this play disables the ``gather_facts`` parameter, since you don't want to collect facts about localhost.
-
-You can run these modules against another server that would then connect to the API if localhost does not have access to vCenter. If so, the required Python modules will need to be installed on that target server. We recommend installing the latest version with pip: ``pip install Pyvmomi`` (as the OS packages are usually out of date and incompatible).
-
-Before you begin, make sure you have:
-
-- Hostname of the ESXi server or vCenter server
-- Username and password for the ESXi or vCenter server
-- Name of the existing Virtual Machine for which you want to collect folder path
-
-For now, you will be entering these directly, but in a more advanced playbook this can be abstracted out and stored in a more secure fashion using :ref:`ansible-vault` or using `Ansible Tower credentials <https://docs.ansible.com/ansible-tower/latest/html/userguide/credentials.html>`_.
-
-If your vCenter or ESXi server is not setup with proper CA certificates that can be verified from the Ansible server, then it is necessary to disable validation of these certificates by using the ``validate_certs`` parameter. To do this you need to set ``validate_certs=False`` in your playbook.
-
-The name of existing virtual machine will be used as input for ``vmware_guest_find`` module via ``name`` parameter.
-
-
-What to expect
---------------
-
-Running this playbook can take some time, depending on your environment and network connectivity. When the run is complete you will see
-
-.. code-block:: yaml
-
- "vm_facts": {
- "changed": false,
- "failed": false,
- ...
- "folders": [
- "/F0/DC0/vm/F0"
- ]
- }
-
-
-Troubleshooting
----------------
-
-If your playbook fails:
-
-- Check if the values provided for username and password are correct.
-- Check if the datacenter you provided is available.
-- Check if the virtual machine specified exists and you have respective permissions to access VMware object.
-- Ensure the full folder path you specified already exists.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_remove_vm.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_remove_vm.rst
deleted file mode 100644
index 59b2bf974..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_remove_vm.rst
+++ /dev/null
@@ -1,127 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_guest_remove_virtual_machine:
-
-*****************************************
-Remove an existing VMware virtual machine
-*****************************************
-
-.. contents::
- :local:
-
-Introduction
-============
-
-This guide will show you how to utilize Ansible to remove an existing VMware virtual machine.
-
-Scenario requirements
-=====================
-
-* Software
-
- * Ansible 2.5 or later must be installed.
-
- * The Python module ``Pyvmomi`` must be installed on the Ansible control node (or Target host if not executing against localhost).
-
- * We recommend installing the latest version with pip: ``pip install Pyvmomi`` (as the OS packages are usually out of date and incompatible).
-
-* Hardware
-
- * At least one standalone ESXi server or
-
- * vCenter Server with at least one ESXi server
-
-* Access / Credentials
-
- * Ansible (or the target server) must have network access to the either vCenter server or the ESXi server
-
- * Username and Password for vCenter or ESXi server
-
- * Hosts in the ESXi cluster must have access to the datastore that the template resides on.
-
-Caveats
-=======
-
-- All variable names and VMware object names are case sensitive.
-- You need to use Python 2.7.9 version in order to use ``validate_certs`` option, as this version is capable of changing the SSL verification behaviours.
-- ``vmware_guest`` module tries to mimic VMware Web UI and workflow, so the virtual machine must be in powered off state in order to remove it from the VMware inventory.
-
-.. warning::
-
- The removal VMware virtual machine using ``vmware_guest`` module is destructive operation and can not be reverted, so it is strongly recommended to take the backup of virtual machine and related files (vmx and vmdk files) before proceeding.
-
-Example description
-===================
-
-In this use case / example, user will be removing a virtual machine using name. The following Ansible playbook showcases the basic parameters that are needed for this.
-
-.. code-block:: yaml
-
- ---
- - name: Remove virtual machine
- gather_facts: no
- vars_files:
- - vcenter_vars.yml
- vars:
- ansible_python_interpreter: "/usr/bin/env python3"
- hosts: localhost
- tasks:
- - set_fact:
- vm_name: "VM_0003"
- datacenter: "DC1"
-
- - name: Remove "{{ vm_name }}"
- vmware_guest:
- hostname: "{{ vcenter_server }}"
- username: "{{ vcenter_user }}"
- password: "{{ vcenter_pass }}"
- validate_certs: no
- cluster: "DC1_C1"
- name: "{{ vm_name }}"
- state: absent
- delegate_to: localhost
- register: facts
-
-
-Since Ansible utilizes the VMware API to perform actions, in this use case it will be connecting directly to the API from localhost.
-
-This means that playbooks will not be running from the vCenter or ESXi Server.
-
-Note that this play disables the ``gather_facts`` parameter, since you don't want to collect facts about localhost.
-
-You can run these modules against another server that would then connect to the API if localhost does not have access to vCenter. If so, the required Python modules will need to be installed on that target server. We recommend installing the latest version with pip: ``pip install Pyvmomi`` (as the OS packages are usually out of date and incompatible).
-
-Before you begin, make sure you have:
-
-- Hostname of the ESXi server or vCenter server
-- Username and password for the ESXi or vCenter server
-- Name of the existing Virtual Machine you want to remove
-
-For now, you will be entering these directly, but in a more advanced playbook this can be abstracted out and stored in a more secure fashion using :ref:`ansible-vault` or using `Ansible Tower credentials <https://docs.ansible.com/ansible-tower/latest/html/userguide/credentials.html>`_.
-
-If your vCenter or ESXi server is not setup with proper CA certificates that can be verified from the Ansible server, then it is necessary to disable validation of these certificates by using the ``validate_certs`` parameter. To do this you need to set ``validate_certs=False`` in your playbook.
-
-The name of existing virtual machine will be used as input for ``vmware_guest`` module via ``name`` parameter.
-
-
-What to expect
---------------
-
-- You will not see any JSON output after this playbook completes as compared to other operations performed using ``vmware_guest`` module.
-
-.. code-block:: yaml
-
- {
- "changed": true
- }
-
-- State is changed to ``True`` which notifies that the virtual machine is removed from the VMware inventory. This can take some time depending upon your environment and network connectivity.
-
-
-Troubleshooting
----------------
-
-If your playbook fails:
-
-- Check if the values provided for username and password are correct.
-- Check if the datacenter you provided is available.
-- Check if the virtual machine specified exists and you have permissions to access the datastore.
-- Ensure the full folder path you specified already exists. It will not create folders automatically for you.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_rename_vm.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_rename_vm.rst
deleted file mode 100644
index 5d72d6aea..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_rename_vm.rst
+++ /dev/null
@@ -1,174 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_guest_rename_virtual_machine:
-
-**********************************
-Rename an existing virtual machine
-**********************************
-
-.. contents::
- :local:
-
-Introduction
-============
-
-This guide will show you how to utilize Ansible to rename an existing virtual machine.
-
-Scenario requirements
-=====================
-
-* Software
-
- * Ansible 2.5 or later must be installed.
-
- * The Python module ``Pyvmomi`` must be installed on the Ansible control node (or Target host if not executing against localhost).
-
- * We recommend installing the latest version with pip: ``pip install Pyvmomi`` (as the OS packages are usually out of date and incompatible).
-
-* Hardware
-
- * At least one standalone ESXi server or
-
- * vCenter Server with at least one ESXi server
-
-* Access / Credentials
-
- * Ansible (or the target server) must have network access to the either vCenter server or the ESXi server
-
- * Username and Password for vCenter or ESXi server
-
- * Hosts in the ESXi cluster must have access to the datastore that the template resides on.
-
-Caveats
-=======
-
-- All variable names and VMware object names are case sensitive.
-- You need to use Python 2.7.9 version in order to use ``validate_certs`` option, as this version is capable of changing the SSL verification behaviours.
-
-
-Example description
-===================
-
-With the following Ansible playbook you can rename an existing virtual machine by changing the UUID.
-
-.. code-block:: yaml
-
- ---
- - name: Rename virtual machine from old name to new name using UUID
- gather_facts: no
- vars_files:
- - vcenter_vars.yml
- vars:
- ansible_python_interpreter: "/usr/bin/env python3"
- hosts: localhost
- tasks:
- - set_fact:
- vm_name: "old_vm_name"
- new_vm_name: "new_vm_name"
- datacenter: "DC1"
- cluster_name: "DC1_C1"
-
- - name: Get VM "{{ vm_name }}" uuid
- vmware_guest_facts:
- hostname: "{{ vcenter_server }}"
- username: "{{ vcenter_user }}"
- password: "{{ vcenter_pass }}"
- validate_certs: False
- datacenter: "{{ datacenter }}"
- folder: "/{{datacenter}}/vm"
- name: "{{ vm_name }}"
- register: vm_facts
-
- - name: Rename "{{ vm_name }}" to "{{ new_vm_name }}"
- vmware_guest:
- hostname: "{{ vcenter_server }}"
- username: "{{ vcenter_user }}"
- password: "{{ vcenter_pass }}"
- validate_certs: False
- cluster: "{{ cluster_name }}"
- uuid: "{{ vm_facts.instance.hw_product_uuid }}"
- name: "{{ new_vm_name }}"
-
-Since Ansible utilizes the VMware API to perform actions, in this use case it will be connecting directly to the API from localhost.
-
-This means that playbooks will not be running from the vCenter or ESXi Server.
-
-Note that this play disables the ``gather_facts`` parameter, since you don't want to collect facts about localhost.
-
-You can run these modules against another server that would then connect to the API if localhost does not have access to vCenter. If so, the required Python modules will need to be installed on that target server. We recommend installing the latest version with pip: ``pip install Pyvmomi`` (as the OS packages are usually out of date and incompatible).
-
-Before you begin, make sure you have:
-
-- Hostname of the ESXi server or vCenter server
-- Username and password for the ESXi or vCenter server
-- The UUID of the existing Virtual Machine you want to rename
-
-For now, you will be entering these directly, but in a more advanced playbook this can be abstracted out and stored in a more secure fashion using :ref:`ansible-vault` or using `Ansible Tower credentials <https://docs.ansible.com/ansible-tower/latest/html/userguide/credentials.html>`_.
-
-If your vCenter or ESXi server is not setup with proper CA certificates that can be verified from the Ansible server, then it is necessary to disable validation of these certificates by using the ``validate_certs`` parameter. To do this you need to set ``validate_certs=False`` in your playbook.
-
-Now you need to supply the information about the existing virtual machine which will be renamed. For renaming virtual machine, ``vmware_guest`` module uses VMware UUID, which is unique across vCenter environment. This value is autogenerated and can not be changed. You will use ``vmware_guest_facts`` module to find virtual machine and get information about VMware UUID of the virtual machine.
-
-This value will be used input for ``vmware_guest`` module. Specify new name to virtual machine which conforms to all VMware requirements for naming conventions as ``name`` parameter. Also, provide ``uuid`` as the value of VMware UUID.
-
-What to expect
---------------
-
-Running this playbook can take some time, depending on your environment and network connectivity. When the run is complete you will see
-
-.. code-block:: yaml
-
- {
- "changed": true,
- "instance": {
- "annotation": "",
- "current_snapshot": null,
- "customvalues": {},
- "guest_consolidation_needed": false,
- "guest_question": null,
- "guest_tools_status": "guestToolsNotRunning",
- "guest_tools_version": "10247",
- "hw_cores_per_socket": 1,
- "hw_datastores": ["ds_204_2"],
- "hw_esxi_host": "10.x.x.x",
- "hw_eth0": {
- "addresstype": "assigned",
- "ipaddresses": [],
- "label": "Network adapter 1",
- "macaddress": "00:50:56:8c:b8:42",
- "macaddress_dash": "00-50-56-8c-b8-42",
- "portgroup_key": "dvportgroup-31",
- "portgroup_portkey": "15",
- "summary": "DVSwitch: 50 0c 3a 69 df 78 2c 7b-6e 08 0a 89 e3 a6 31 17"
- },
- "hw_files": ["[ds_204_2] old_vm_name/old_vm_name.vmx", "[ds_204_2] old_vm_name/old_vm_name.nvram", "[ds_204_2] old_vm_name/old_vm_name.vmsd", "[ds_204_2] old_vm_name/vmware.log", "[ds_204_2] old_vm_name/old_vm_name.vmdk"],
- "hw_folder": "/DC1/vm",
- "hw_guest_full_name": null,
- "hw_guest_ha_state": null,
- "hw_guest_id": null,
- "hw_interfaces": ["eth0"],
- "hw_is_template": false,
- "hw_memtotal_mb": 1024,
- "hw_name": "new_vm_name",
- "hw_power_status": "poweredOff",
- "hw_processor_count": 1,
- "hw_product_uuid": "420cbebb-835b-980b-7050-8aea9b7b0a6d",
- "hw_version": "vmx-13",
- "instance_uuid": "500c60a6-b7b4-8ae5-970f-054905246a6f",
- "ipv4": null,
- "ipv6": null,
- "module_hw": true,
- "snapshots": []
- }
- }
-
-confirming that you've renamed the virtual machine.
-
-
-Troubleshooting
----------------
-
-If your playbook fails:
-
-- Check if the values provided for username and password are correct.
-- Check if the datacenter you provided is available.
-- Check if the virtual machine specified exists and you have permissions to access the datastore.
-- Ensure the full folder path you specified already exists.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_http.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_http.rst
deleted file mode 100644
index a831114d3..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_http.rst
+++ /dev/null
@@ -1,162 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_http_api_usage:
-
-***********************************
-Using VMware HTTP API using Ansible
-***********************************
-
-.. contents::
- :local:
-
-Introduction
-============
-
-This guide will show you how to utilize Ansible to use VMware HTTP APIs to automate various tasks.
-
-Scenario requirements
-=====================
-
-* Software
-
- * Ansible 2.5 or later must be installed.
-
- * We recommend installing the latest version with pip: ``pip install Pyvmomi`` on the Ansible control node
- (as the OS packages are usually out of date and incompatible) if you are planning to use any existing VMware modules.
-
-* Hardware
-
- * vCenter Server 6.5 and above with at least one ESXi server
-
-* Access / Credentials
-
- * Ansible (or the target server) must have network access to either the vCenter server or the ESXi server
-
- * Username and Password for vCenter
-
-Caveats
-=======
-
-- All variable names and VMware object names are case sensitive.
-- You need to use Python 2.7.9 version in order to use ``validate_certs`` option, as this version is capable of changing the SSL verification behaviours.
-- VMware HTTP APIs are introduced in vSphere 6.5 and above so minimum level required in 6.5.
-- There are very limited number of APIs exposed, so you may need to rely on XMLRPC based VMware modules.
-
-
-Example description
-===================
-
-With the following Ansible playbook you can find the VMware ESXi host system(s) and can perform various tasks depending on the list of host systems.
-This is a generic example to show how Ansible can be utilized to consume VMware HTTP APIs.
-
-.. code-block:: yaml
-
- ---
- - name: Example showing VMware HTTP API utilization
- hosts: localhost
- gather_facts: no
- vars_files:
- - vcenter_vars.yml
- vars:
- ansible_python_interpreter: "/usr/bin/env python3"
- tasks:
- - name: Login into vCenter and get cookies
- uri:
- url: https://{{ vcenter_server }}/rest/com/vmware/cis/session
- force_basic_auth: yes
- validate_certs: no
- method: POST
- user: "{{ vcenter_user }}"
- password: "{{ vcenter_pass }}"
- register: login
-
- - name: Get all hosts from vCenter using cookies from last task
- uri:
- url: https://{{ vcenter_server }}/rest/vcenter/host
- force_basic_auth: yes
- validate_certs: no
- headers:
- Cookie: "{{ login.set_cookie }}"
- register: vchosts
-
- - name: Change Log level configuration of the given hostsystem
- vmware_host_config_manager:
- hostname: "{{ vcenter_server }}"
- username: "{{ vcenter_user }}"
- password: "{{ vcenter_pass }}"
- esxi_hostname: "{{ item.name }}"
- options:
- 'Config.HostAgent.log.level': 'error'
- validate_certs: no
- loop: "{{ vchosts.json.value }}"
- register: host_config_results
-
-
-Since Ansible utilizes the VMware HTTP API using the ``uri`` module to perform actions, in this use case it will be connecting directly to the VMware HTTP API from localhost.
-
-This means that playbooks will not be running from the vCenter or ESXi Server.
-
-Note that this play disables the ``gather_facts`` parameter, since you don't want to collect facts about localhost.
-
-Before you begin, make sure you have:
-
-- Hostname of the vCenter server
-- Username and password for the vCenter server
-- Version of vCenter is at least 6.5
-
-For now, you will be entering these directly, but in a more advanced playbook this can be abstracted out and stored in a more secure fashion using :ref:`ansible-vault` or using `Ansible Tower credentials <https://docs.ansible.com/ansible-tower/latest/html/userguide/credentials.html>`_.
-
-If your vCenter server is not setup with proper CA certificates that can be verified from the Ansible server, then it is necessary to disable validation of these certificates by using the ``validate_certs`` parameter. To do this you need to set ``validate_certs=False`` in your playbook.
-
-As you can see, we are using the ``uri`` module in first task to login into the vCenter server and storing result in the ``login`` variable using register. In the second task, using cookies from the first task we are gathering information about the ESXi host system.
-
-Using this information, we are changing the ESXi host system's advance configuration.
-
-What to expect
---------------
-
-Running this playbook can take some time, depending on your environment and network connectivity. When the run is complete you will see
-
-.. code-block:: yaml
-
- "results": [
- {
- ...
- "invocation": {
- "module_args": {
- "cluster_name": null,
- "esxi_hostname": "10.76.33.226",
- "hostname": "10.65.223.114",
- "options": {
- "Config.HostAgent.log.level": "error"
- },
- "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
- "port": 443,
- "username": "administrator@vsphere.local",
- "validate_certs": false
- }
- },
- "item": {
- "connection_state": "CONNECTED",
- "host": "host-21",
- "name": "10.76.33.226",
- "power_state": "POWERED_ON"
- },
- "msg": "Config.HostAgent.log.level changed."
- ...
- }
- ]
-
-
-Troubleshooting
----------------
-
-If your playbook fails:
-
-- Check if the values provided for username and password are correct.
-- Check if you are using vCenter 6.5 and onwards to use this HTTP APIs.
-
-.. seealso::
-
- `VMware vSphere and Ansible From Zero to Useful by @arielsanchezmor <https://www.youtube.com/watch?v=0_qwOKlBlo8>`_
- vBrownBag session video related to VMware HTTP APIs
- `Sample Playbooks for using VMware HTTP APIs <https://github.com/Akasurde/ansible-vmware-http>`_
- GitHub repo for examples of Ansible playbook to manage VMware using HTTP APIs
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_tools_connection.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_tools_connection.rst
deleted file mode 100644
index 08a4df114..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/scenario_vmware_tools_connection.rst
+++ /dev/null
@@ -1,120 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_tools_connection:
-
-************************************
-Using vmware_tools connection plugin
-************************************
-
-.. contents::
- :local:
-
-Introduction
-============
-
-This guide will show you how to utilize VMware Connection plugin to communicate and automate various tasks on VMware guest machines.
-
-Scenario requirements
-=====================
-
-* Software
-
- * Ansible 2.9 or later must be installed.
-
- * We recommend installing the latest version with pip: ``pip install Pyvmomi`` on the Ansible control node
- (as the OS packages are usually out of date and incompatible) if you are planning to use any existing VMware modules.
-
-* Hardware
-
- * vCenter Server 6.5 and above
-
-* Access / Credentials
-
- * Ansible (or the target server) must have network access to either the vCenter server
-
- * Username and Password for vCenter with required permissions
-
- * VMware tools or openvm-tools with required dependencies like Perl installed on the given virtual machine
-
-Caveats
-=======
-
-- All variable names and VMware object names are case sensitive.
-- You need to use Python 2.7.9 version in order to use ``validate_certs`` option, as this version is capable of changing the SSL verification behaviors.
-
-
-Example description
-===================
-
-User can run playbooks against VMware virtual machines using ``vmware_tools`` connection plugin.
-
-In order work with ``vmware_tools`` connection plugin, you will need to specify hostvars for the given virtual machine.
-
-For example, if you want to run a playbook on a virtual machine called ``centos_7`` located at ``/Asia-Datacenter1/prod/centos_7`` in the given vCenter, you will need to specify hostvars as follows:
-
-.. code-block:: ini
-
- [centos7]
- host1
-
- [centos7:vars]
- # vmware_tools related variables
- ansible_connection=vmware_tools
- ansible_vmware_host=10.65.201.128
- ansible_vmware_user=administrator@vsphere.local
- ansible_vmware_password=Esxi@123$%
- ansible_vmware_validate_certs=no
-
- # Location of the virtual machine
- ansible_vmware_guest_path=Asia-Datacenter1/vm/prod/centos_7
-
- # Credentials
- ansible_vmware_tools_user=root
- ansible_vmware_tools_password=Secret123
-
-Here, we are providing vCenter details and credentials for the given virtual machine to run the playbook on.
-If your virtual machine path is ``Asia-Datacenter1/prod/centos_7``, you specify ``ansible_vmware_guest_path`` as ``Asia-Datacenter1/vm/prod/centos_7``. Please take a note that ``/vm`` is added in the virtual machine path, since this is a logical folder structure in the VMware inventory.
-
-Let us now run following playbook,
-
-.. code-block:: yaml
-
- ---
- - name: Example showing VMware Connection plugin
- hosts: centos7
- tasks:
- - name: Gather information about temporary directory inside VM
- shell: ls /tmp
-
-
-Since Ansible utilizes the ``vmware-tools`` or ``openvm-tools`` service capabilities running in the virtual machine to perform actions, in this use case it will be connecting directly to the guest machine.
-
-
-For now, you will be entering credentials in plain text, but in a more advanced playbook this can be abstracted out and stored in a more secure fashion using :ref:`ansible-vault` or using `Ansible Tower credentials <https://docs.ansible.com/ansible-tower/latest/html/userguide/credentials.html>`_.
-
-
-What to expect
---------------
-
-Running this playbook can take some time, depending on your environment and network connectivity. When the run is complete you will see:
-
-.. code-block:: yaml
-
- {
- "changed": true,
- "cmd": "ls /tmp",
- "delta": "0:00:00.005440",
- "end": "2020-10-01 07:30:56.940813",
- "rc": 0,
- "start": "2020-10-01 07:30:56.935373",
- "stderr": "",
- "stderr_lines": [],
- "stdout": "ansible_command_payload_JzWiL9\niso",
- "stdout_lines": ["ansible_command_payload_JzWiL9", "iso", "vmware-root"]
- }
-
-Troubleshooting
----------------
-
-If your playbook fails:
-
-- Check if the values provided for username and password are correct.
-- Check if the path of virtual machine is correct. Please mind that ``/vm/`` needs to be provided while specifying virtual machine location.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_concepts.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_concepts.rst
deleted file mode 100644
index 2829624ac..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_concepts.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_concepts:
-
-***************************
-Ansible for VMware Concepts
-***************************
-
-Some of these concepts are common to all uses of Ansible, including VMware automation; some are specific to VMware. You need to understand them to use Ansible for VMware automation. This introduction provides the background you need to follow the :ref:`scenarios<vmware_scenarios>` in this guide.
-
-.. contents::
- :local:
-
-Control Node
-============
-
-Any machine with Ansible installed. You can run commands and playbooks, invoking ``/usr/bin/ansible`` or ``/usr/bin/ansible-playbook``, from any control node. You can use any computer that has Python installed on it as a control node - laptops, shared desktops, and servers can all run Ansible. However, you cannot use a Windows machine as a control node. You can have multiple control nodes.
-
-Delegation
-==========
-
-Delegation allows you to select the system that executes a given task. If you do not have ``pyVmomi`` installed on your control node, use the ``delegate_to`` keyword on VMware-specific tasks to execute them on any host where you have ``pyVmomi`` installed.
-
-Modules
-=======
-
-The units of code Ansible executes. Each module has a particular use, from creating virtual machines on vCenter to managing distributed virtual switches in the vCenter environment. You can invoke a single module with a task, or invoke several different modules in a playbook.
-
-Playbooks
-=========
-
-Ordered lists of tasks, saved so you can run those tasks in that order repeatedly. Playbooks can include variables as well as tasks. Playbooks are written in YAML and are easy to read, write, share and understand.
-
-pyVmomi
-=======
-
-Ansible VMware modules are written on top of `pyVmomi <https://github.com/vmware/pyvmomi>`_. ``pyVmomi`` is the official Python SDK for the VMware vSphere API that allows user to manage ESX, ESXi, and vCenter infrastructure.
-
-You need to install this Python SDK on host from where you want to invoke VMware automation. For example, if you are using control node then ``pyVmomi`` must be installed on control node.
-
-If you are using any ``delegate_to`` host which is different from your control node then you need to install ``pyVmomi`` on that ``delegate_to`` node.
-
-You can install pyVmomi using pip:
-
-.. code-block:: bash
-
- $ pip install pyvmomi
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_external_doc_links.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_external_doc_links.rst
deleted file mode 100644
index afd2275e9..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_external_doc_links.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_external_doc_links:
-
-*****************************
-Other useful VMware resources
-*****************************
-
-* `VMware API and SDK Documentation <https://www.vmware.com/support/pubs/sdk_pubs.html>`_
-* `Ansible VMware community wiki page <https://github.com/ansible/community/wiki/VMware>`_
-* `VMware's official Guest Operating system customization matrix <https://partnerweb.vmware.com/programs/guestOS/guest-os-customization-matrix.pdf>`_
-* `VMware Compatibility Guide <https://www.vmware.com/resources/compatibility/search.php>`_
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_getting_started.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_getting_started.rst
deleted file mode 100644
index 1b2d34a8f..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_getting_started.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-:orphan:
-
-.. _ansible_collections.community.vmware.docsite.vmware_ansible_getting_started:
-
-***************************************
-Getting Started with Ansible for VMware
-***************************************
-
-This will have a basic "hello world" scenario/walkthrough that gets the user introduced to the basics.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_intro.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_intro.rst
deleted file mode 100644
index ddc1433c6..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_intro.rst
+++ /dev/null
@@ -1,54 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_ansible_intro:
-
-**********************************
-Introduction to Ansible for VMware
-**********************************
-
-.. contents::
- :local:
-
-Introduction
-============
-
-Ansible provides various modules to manage VMware infrastructure, which includes datacenter, cluster,
-host system and virtual machine.
-
-Requirements
-============
-
-Ansible VMware modules are written on top of `pyVmomi <https://github.com/vmware/pyvmomi>`_.
-pyVmomi is the Python SDK for the VMware vSphere API that allows user to manage ESX, ESXi,
-and vCenter infrastructure. You can install pyVmomi using pip (you may need to use pip3, depending on your OS/distro):
-
-.. code-block:: bash
-
- $ pip install pyvmomi
-
-Ansible VMware modules leveraging latest vSphere(6.0+) features are using `vSphere Automation Python SDK <https://github.com/vmware/vsphere-automation-sdk-python>`_. The vSphere Automation Python SDK also has client libraries, documentation, and sample code for VMware Cloud on AWS Console APIs, NSX VMware Cloud on AWS integration APIs, VMware Cloud on AWS site recovery APIs, NSX-T APIs.
-
-You can install vSphere Automation Python SDK using pip:
-
-.. code-block:: bash
-
- $ pip install --upgrade git+https://github.com/vmware/vsphere-automation-sdk-python.git
-
-Note:
- Installing vSphere Automation Python SDK also installs ``pyvmomi``. A separate installation of ``pyvmomi`` is not required.
-
-vmware_guest module
-===================
-
-The :ref:`vmware_guest<ansible_collections.community.vmware.vmware_guest_module>` module manages various operations related to virtual machines in the given ESXi or vCenter server.
-
-
-.. seealso::
-
- `pyVmomi <https://github.com/vmware/pyvmomi>`_
- The GitHub Page of pyVmomi
- `pyVmomi Issue Tracker <https://github.com/vmware/pyvmomi/issues>`_
- The issue tracker for the pyVmomi project
- `govc <https://github.com/vmware/govmomi/tree/master/govc>`_
- govc is a vSphere CLI built on top of govmomi
- :ref:`working_with_playbooks`
- An introduction to playbooks
-
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory.rst
deleted file mode 100644
index becd718aa..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory.rst
+++ /dev/null
@@ -1,91 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_ansible_inventory:
-
-*************************************
-Using VMware dynamic inventory plugin
-*************************************
-
-.. contents::
- :local:
-
-VMware Dynamic Inventory Plugin
-===============================
-
-
-The best way to interact with your hosts is to use the VMware dynamic inventory plugin, which dynamically queries VMware APIs and
-tells Ansible what nodes can be managed.
-
-Requirements
-------------
-
-To use the VMware dynamic inventory plugins, you must install `pyVmomi <https://github.com/vmware/pyvmomi>`_
-on your control node (the host running Ansible).
-
-To include tag-related information for the virtual machines in your dynamic inventory, you also need the `vSphere Automation SDK <https://code.vmware.com/web/sdk/65/vsphere-automation-python>`_, which supports REST API features like tagging and content libraries, on your control node.
-You can install the ``vSphere Automation SDK`` following `these instructions <https://github.com/vmware/vsphere-automation-sdk-python#installing-required-python-packages>`_.
-
-.. code-block:: bash
-
- $ pip install pyvmomi
-
-To use this VMware dynamic inventory plugin, you need to enable it first by specifying the following in the ``ansible.cfg`` file:
-
-.. code-block:: ini
-
- [inventory]
- enable_plugins = vmware_vm_inventory
-
-Then, create a file that ends in ``.vmware.yml`` or ``.vmware.yaml`` in your working directory.
-
-The ``vmware_vm_inventory`` script takes in the same authentication information as any VMware module.
-
-Here's an example of a valid inventory file:
-
-.. code-block:: yaml
-
- plugin: vmware_vm_inventory
- strict: False
- hostname: 10.65.223.31
- username: administrator@vsphere.local
- password: Esxi@123$%
- validate_certs: False
- with_tags: True
-
-
-Executing ``ansible-inventory --list -i <filename>.vmware.yml`` will create a list of VMware instances that are ready to be configured using Ansible.
-
-Using vaulted configuration files
-=================================
-
-Since the inventory configuration file contains vCenter password in plain text, a security risk, you may want to
-encrypt your entire inventory configuration file.
-
-You can encrypt a valid inventory configuration file as follows:
-
-.. code-block:: bash
-
- $ ansible-vault encrypt <filename>.vmware.yml
- New Vault password:
- Confirm New Vault password:
- Encryption successful
-
-And you can use this vaulted inventory configuration file using:
-
-.. code-block:: bash
-
- $ ansible-inventory -i filename.vmware.yml --list --vault-password-file=/path/to/vault_password_file
-
-
-.. seealso::
-
- `pyVmomi <https://github.com/vmware/pyvmomi>`_
- The GitHub Page of pyVmomi
- `pyVmomi Issue Tracker <https://github.com/vmware/pyvmomi/issues>`_
- The issue tracker for the pyVmomi project
- `vSphere Automation SDK GitHub Page <https://github.com/vmware/vsphere-automation-sdk-python>`_
- The GitHub Page of vSphere Automation SDK for Python
- `vSphere Automation SDK Issue Tracker <https://github.com/vmware/vsphere-automation-sdk-python/issues>`_
- The issue tracker for vSphere Automation SDK for Python
- :ref:`working_with_playbooks`
- An introduction to playbooks
- :ref:`playbooks_vault`
- Using Vault in playbooks
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_filters.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_filters.rst
deleted file mode 100644
index eb309cf0e..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_filters.rst
+++ /dev/null
@@ -1,216 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_ansible_inventory_using_filters:
-
-***********************************************
-Using VMware dynamic inventory plugin - Filters
-***********************************************
-
-.. contents::
- :local:
-
-VMware dynamic inventory plugin - filtering VMware guests
-=========================================================
-
-
-VMware inventory plugin allows you to filter VMware guests using the ``filters`` configuration parameter.
-
-This section shows how you configure ``filters`` for the given VMware guest in the inventory.
-
-Requirements
-------------
-
-To use the VMware dynamic inventory plugins, you must install `pyVmomi <https://github.com/vmware/pyvmomi>`_
-on your control node (the host running Ansible).
-
-To include tag-related information for the virtual machines in your dynamic inventory, you also need the `vSphere Automation SDK <https://code.vmware.com/web/sdk/65/vsphere-automation-python>`_, which supports REST API features such as tagging and content libraries, on your control node.
-You can install the ``vSphere Automation SDK`` following `these instructions <https://github.com/vmware/vsphere-automation-sdk-python#installing-required-python-packages>`_.
-
-.. code-block:: bash
-
- $ pip install pyvmomi
-
-Starting in Ansible 2.10, the VMware dynamic inventory plugin is available in the ``community.vmware`` collection included Ansible.
-Alternately, to install the latest ``community.vmware`` collection:
-
-.. code-block:: bash
-
- $ ansible-galaxy collection install community.vmware
-
-To use this VMware dynamic inventory plugin:
-
-1. Enable it first by specifying the following in the ``ansible.cfg`` file:
-
-.. code-block:: ini
-
- [inventory]
- enable_plugins = community.vmware.vmware_vm_inventory
-
-2. Create a file that ends in ``vmware.yml`` or ``vmware.yaml`` in your working directory.
-
-The ``vmware_vm_inventory`` inventory plugin takes in the same authentication information as any other VMware modules does.
-
-Let us assume we want to list all RHEL7 VMs with the power state as "poweredOn". A valid inventory file with filters for the given VMware guest looks as follows:
-
-.. code-block:: yaml
-
- plugin: community.vmware.vmware_vm_inventory
- strict: False
- hostname: 10.65.223.31
- username: administrator@vsphere.local
- password: Esxi@123$%
- validate_certs: False
- with_tags: False
- hostnames:
- - config.name
- filters:
- - config.guestId == "rhel7_64Guest"
- - summary.runtime.powerState == "poweredOn"
-
-
-Here, we have configured two filters -
-
-* ``config.guestId`` is equal to ``rhel7_64Guest``
-* ``summary.runtime.powerState`` is equal to ``poweredOn``
-
-This retrieves all the VMs which satisfy these two conditions and populates them in the inventory.
-Notice that the conditions are combined using an ``and`` operation.
-
-Using ``or`` conditions in filters
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Let us assume you want filter RHEL7 and Ubuntu VMs. You can use multiple filters using ``or`` condition in your inventory file.
-
-A valid filter in the VMware inventory file for this example is:
-
-.. code-block:: yaml
-
- plugin: community.vmware.vmware_vm_inventory
- strict: False
- hostname: 10.65.223.31
- username: administrator@vsphere.local
- password: Esxi@123$%
- validate_certs: False
- with_tags: False
- hostnames:
- - config.name
- filters:
- - config.guestId == "rhel7_64Guest" or config.guestId == "ubuntu64Guest"
-
-
-You can check all allowed properties for filters for the given virtual machine at :ref:`ansible_collections.community.vmware.docsite.vmware_inventory_vm_attributes`.
-
-If you are using the ``properties`` parameter with custom VM properties, make sure that you include all the properties used by filters as well in your VM property list.
-
-For example, if we want all RHEL7 and Ubuntu VMs that are poweredOn, you can use inventory file:
-
-.. code-block:: yaml
-
- plugin: community.vmware.vmware_vm_inventory
- strict: False
- hostname: 10.65.223.31
- username: administrator@vsphere.local
- password: Esxi@123$%
- validate_certs: False
- with_tags: False
- hostnames:
- - 'config.name'
- properties:
- - 'config.name'
- - 'config.guestId'
- - 'guest.ipAddress'
- - 'summary.runtime.powerState'
- filters:
- - config.guestId == "rhel7_64Guest" or config.guestId == "ubuntu64Guest"
- - summary.runtime.powerState == "poweredOn"
-
-Here, we are using minimum VM properties, that is ``config.name``, ``config.guestId``, ``summary.runtime.powerState``, and ``guest.ipAddress``.
-
-* ``config.name`` is used by the ``hostnames`` parameter.
-* ``config.guestId`` and ``summary.runtime.powerState`` are used by the ``filters`` parameter.
-* ``guest.guestId`` is used by ``ansible_host`` internally by the inventory plugin.
-
-Using regular expression in filters
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Let us assume you want filter VMs with specific IP range. You can use regular expression in ``filters`` in your inventory file.
-
-For example, if we want all RHEL7 and Ubuntu VMs that are poweredOn, you can use inventory file:
-
-.. code-block:: yaml
-
- plugin: community.vmware.vmware_vm_inventory
- strict: False
- hostname: 10.65.223.31
- username: administrator@vsphere.local
- password: Esxi@123$%
- validate_certs: False
- with_tags: False
- hostnames:
- - 'config.name'
- properties:
- - 'config.name'
- - 'config.guestId'
- - 'guest.ipAddress'
- - 'summary.runtime.powerState'
- filters:
- - guest.ipAddress is defined and guest.ipAddress is match('192.168.*')
-
-Here, we are using ``guest.ipAddress`` VM property. This property is optional and depended upon VMware tools installed on VMs.
-We are using ``match`` to validate the regular expression for the given IP range.
-
-Executing ``ansible-inventory --list -i <filename>.vmware.yml`` creates a list of the virtual machines that are ready to be configured using Ansible.
-
-What to expect
---------------
-
-You will notice that the inventory hosts are filtered depending on your ``filters`` section.
-
-
-.. code-block:: yaml
-
- {
- "_meta": {
- "hostvars": {
- "template_001": {
- "config.name": "template_001",
- "config.guestId": "ubuntu64Guest",
- ...
- "guest.toolsStatus": "toolsNotInstalled",
- "summary.runtime.powerState": "poweredOn",
- },
- "vm_8046": {
- "config.name": "vm_8046",
- "config.guestId": "rhel7_64Guest",
- ...
- "guest.toolsStatus": "toolsNotInstalled",
- "summary.runtime.powerState": "poweredOn",
- },
- ...
- }
-
-Troubleshooting filters
------------------------
-
-If the custom property specified in ``filters`` fails:
-
-- Check if the values provided for username and password are correct.
-- Make sure it is a valid property, see :ref:`ansible_collections.community.vmware.docsite.vmware_inventory_vm_attributes`.
-- Use ``strict: True`` to get more information about the error.
-- Please make sure that you are using latest version of the VMware collection.
-
-
-.. seealso::
-
- `pyVmomi <https://github.com/vmware/pyvmomi>`_
- The GitHub Page of pyVmomi
- `pyVmomi Issue Tracker <https://github.com/vmware/pyvmomi/issues>`_
- The issue tracker for the pyVmomi project
- `vSphere Automation SDK GitHub Page <https://github.com/vmware/vsphere-automation-sdk-python>`_
- The GitHub Page of vSphere Automation SDK for Python
- `vSphere Automation SDK Issue Tracker <https://github.com/vmware/vsphere-automation-sdk-python/issues>`_
- The issue tracker for vSphere Automation SDK for Python
- :ref:`ansible_collections.community.vmware.docsite.vmware_inventory_vm_attributes`
- Using Virtual machine attributes in VMware dynamic inventory plugin
- :ref:`working_with_playbooks`
- An introduction to playbooks
- :ref:`playbooks_vault`
- Using Vault in playbooks
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_hostnames.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_hostnames.rst
deleted file mode 100644
index d89639506..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_hostnames.rst
+++ /dev/null
@@ -1,128 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_ansible_inventory_using_hostnames:
-
-*************************************************
-Using VMware dynamic inventory plugin - Hostnames
-*************************************************
-
-.. contents::
- :local:
-
-VMware dynamic inventory plugin - customizing hostnames
-=======================================================
-
-
-VMware inventory plugin allows you to configure hostnames using the ``hostnames`` configuration parameter.
-
-In this scenario guide we will see how you configure hostnames from the given VMware guest in the inventory.
-
-Requirements
-------------
-
-To use the VMware dynamic inventory plugins, you must install `pyVmomi <https://github.com/vmware/pyvmomi>`_
-on your control node (the host running Ansible).
-
-To include tag-related information for the virtual machines in your dynamic inventory, you also need the `vSphere Automation SDK <https://code.vmware.com/web/sdk/65/vsphere-automation-python>`_, which supports REST API features such as tagging and content libraries, on your control node.
-You can install the ``vSphere Automation SDK`` following `these instructions <https://github.com/vmware/vsphere-automation-sdk-python#installing-required-python-packages>`_.
-
-.. code-block:: bash
-
- $ pip install pyvmomi
-
-Starting in Ansible 2.10, the VMware dynamic inventory plugin is available in the ``community.vmware`` collection included Ansible.
-To install the latest ``community.vmware`` collection:
-
-.. code-block:: bash
-
- $ ansible-galaxy collection install community.vmware
-
-To use this VMware dynamic inventory plugin:
-
-1. Enable it first by specifying the following in the ``ansible.cfg`` file:
-
-.. code-block:: ini
-
- [inventory]
- enable_plugins = community.vmware.vmware_vm_inventory
-
-2. Create a file that ends in ``vmware.yml`` or ``vmware.yaml`` in your working directory.
-
-The ``vmware_vm_inventory`` inventory plugin takes in the same authentication information as any other VMware modules does.
-
-Here's an example of a valid inventory file with custom hostname for the given VMware guest:
-
-.. code-block:: yaml
-
- plugin: community.vmware.vmware_vm_inventory
- strict: False
- hostname: 10.65.223.31
- username: administrator@vsphere.local
- password: Esxi@123$%
- validate_certs: False
- with_tags: False
- hostnames:
- - config.name
-
-
-Here, we have configured a custom hostname by setting the ``hostnames`` parameter to ``config.name``. This will retrieve
-the ``config.name`` property from the virtual machine and populate it in the inventory.
-
-You can check all allowed properties for the given virtual machine at :ref:`ansible_collections.community.vmware.docsite.vmware_inventory_vm_attributes`.
-
-Executing ``ansible-inventory --list -i <filename>.vmware.yml`` creates a list of the virtual machines that are ready to be configured using Ansible.
-
-What to expect
---------------
-
-You will notice that instead of default behavior of representing the hostname as ``config.name + _ + config.uuid``,
-the inventory hosts show value as ``config.name``.
-
-
-.. code-block:: yaml
-
- {
- "_meta": {
- "hostvars": {
- "template_001": {
- "config.name": "template_001",
- "guest.toolsRunningStatus": "guestToolsNotRunning",
- ...
- "guest.toolsStatus": "toolsNotInstalled",
- "name": "template_001"
- },
- "vm_8046": {
- "config.name": "vm_8046",
- "guest.toolsRunningStatus": "guestToolsNotRunning",
- ...
- "guest.toolsStatus": "toolsNotInstalled",
- "name": "vm_8046"
- },
- ...
- }
-
-Troubleshooting
----------------
-
-If the custom property specified in ``hostnames`` fails:
-
-- Check if the values provided for username and password are correct.
-- Make sure it is a valid property, see :ref:`ansible_collections.community.vmware.docsite.vmware_inventory_vm_attributes`.
-- Use ``strict: True`` to get more information about the error.
-- Please make sure that you are using latest version VMware collection.
-
-
-.. seealso::
-
- `pyVmomi <https://github.com/vmware/pyvmomi>`_
- The GitHub Page of pyVmomi
- `pyVmomi Issue Tracker <https://github.com/vmware/pyvmomi/issues>`_
- The issue tracker for the pyVmomi project
- `vSphere Automation SDK GitHub Page <https://github.com/vmware/vsphere-automation-sdk-python>`_
- The GitHub Page of vSphere Automation SDK for Python
- `vSphere Automation SDK Issue Tracker <https://github.com/vmware/vsphere-automation-sdk-python/issues>`_
- The issue tracker for vSphere Automation SDK for Python
- :ref:`ansible_collections.community.vmware.docsite.vmware_inventory_vm_attributes`
- Using Virtual machine attributes in VMware dynamic inventory plugin
- :ref:`working_with_playbooks`
- An introduction to playbooks
- :ref:`playbooks_vault`
- Using Vault in playbooks
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_vm_attributes.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_vm_attributes.rst
deleted file mode 100644
index eda856ee3..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_inventory_vm_attributes.rst
+++ /dev/null
@@ -1,1184 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_inventory_vm_attributes:
-
-*******************************************************************
-Using Virtual machine attributes in VMware dynamic inventory plugin
-*******************************************************************
-
-.. contents::
- :local:
-
-Virtual machine attributes
-==========================
-
-You can use virtual machine properties which can be used to populate ``hostvars`` for the given
-virtual machine in a VMware dynamic inventory plugin.
-
-capability
-----------
-
-This section describes settings for the runtime capabilities of the virtual machine.
-
-snapshotOperationsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports snapshot operations.
-
-multipleSnapshotsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports multiple snapshots.
- This value is not set when the virtual machine is unavailable, for instance, when it is being created or deleted.
-
-snapshotConfigSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports snapshot config.
-
-poweredOffSnapshotsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports snapshot operations in ``poweredOff`` state.
-
-memorySnapshotsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports memory snapshots.
-
-revertToSnapshotSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports reverting to a snapshot.
-
-quiescedSnapshotsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports quiesced snapshots.
-
-disableSnapshotsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not snapshots can be disabled.
-
-lockSnapshotsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not the snapshot tree can be locked.
-
-consolePreferencesSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether console preferences can be set for the virtual machine.
-
-cpuFeatureMaskSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether CPU feature requirements masks can be set for the virtual machine.
-
-s1AcpiManagementSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not a virtual machine supports ACPI S1 settings management.
-
-settingScreenResolutionSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not the virtual machine supports setting the screen resolution of the console window.
-
-toolsAutoUpdateSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Supports tools auto-update.
-
-vmNpivWwnSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Supports virtual machine NPIV WWN.
-
-npivWwnOnNonRdmVmSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Supports assigning NPIV WWN to virtual machines that do not have RDM disks.
-
-vmNpivWwnDisableSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the NPIV disabling operation is supported on the virtual machine.
-
-vmNpivWwnUpdateSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the update of NPIV WWNs are supported on the virtual machine.
-
-swapPlacementSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Flag indicating whether the virtual machine has a configurable (swapfile placement policy).
-
-toolsSyncTimeSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether asking tools to sync time with the host is supported.
-
-virtualMmuUsageSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not the use of nested page table hardware support can be explicitly set.
-
-diskSharesSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether resource settings for disks can be applied to the virtual machine.
-
-bootOptionsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether boot options can be configured for the virtual machine.
-
-bootRetryOptionsSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether automatic boot retry can be configured for the virtual machine.
-
-settingVideoRamSizeSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Flag indicating whether the video RAM size of the virtual machine can be configured.
-
-settingDisplayTopologySupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not the virtual machine supports setting the display topology of the console window.
-
-recordReplaySupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether record and replay functionality is supported on the virtual machine.
-
-changeTrackingSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates that change tracking is supported for virtual disks of the virtual machine.
- However, even if change tracking is supported, it might not be available for all disks of the virtual machine.
- For example, passthru raw disk mappings or disks backed by any Ver1BackingInfo cannot be tracked.
-
-multipleCoresPerSocketSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether multiple virtual cores per socket is supported on the virtual machine.
-
-hostBasedReplicationSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates that host based replication is supported on the virtual machine.
- However, even if host based replication is supported, it might not be available for all disk types.
- For example, passthru raw disk mappings can not be replicated.
-
-guestAutoLockSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not guest autolock is supported on the virtual machine.
-
-memoryReservationLockSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether :ref:`ansible_collections.community.vmware.docsite.memory_reservation_locked_to_max` may be set to true for the virtual machine.
-
-featureRequirementSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the featureRequirement feature is supported.
-
-poweredOnMonitorTypeChangeSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether a monitor type change is supported while the virtual machine is in the ``poweredOn`` state.
-
-seSparseDiskSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the virtual machine supports the Flex-SE (space-efficent, sparse) format for virtual disks.
-
-nestedHVSupported (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the virtual machine supports nested hardware-assisted virtualization.
-
-vPMCSupported (bool)
-^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the virtual machine supports virtualized CPU performance counters.
-
-
-config
-------
-
-This section describes the configuration settings of the virtual machine, including the name and UUID.
-This property is set when a virtual machine is created or when the ``reconfigVM`` method is called.
-The virtual machine configuration is not guaranteed to be available.
-For example, the configuration information would be unavailable if the server is unable to access the virtual machine files on disk, and is often also unavailable during the initial phases of virtual machine creation.
-
-changeVersion (str)
-^^^^^^^^^^^^^^^^^^^
-
- The changeVersion is a unique identifier for a given version of the configuration.
- Each change to the configuration updates this value. This is typically implemented as an ever increasing count or a time-stamp.
- However, a client should always treat this as an opaque string.
-
-modified (datetime)
-^^^^^^^^^^^^^^^^^^^
-
- Last time a virtual machine's configuration was modified.
-
-name (str)
-^^^^^^^^^^
-
- Display name of the virtual machine. Any / (slash), \ (backslash), character used in this name element is escaped. Similarly, any % (percent) character used in this name element is escaped, unless it is used to start an escape sequence. A slash is escaped as %2F or %2f. A backslash is escaped as %5C or %5c, and a percent is escaped as %25.
-
-.. _ansible_collections.community.vmware.docsite.guest_full_name:
-
-guestFullName (str)
-^^^^^^^^^^^^^^^^^^^
-
- This is the full name of the guest operating system for the virtual machine. For example: Windows 2000 Professional. See :ref:`ansible_collections.community.vmware.docsite.alternate_guest_name`.
-
-version (str)
-^^^^^^^^^^^^^
-
- The version string for the virtual machine.
-
-uuid (str)
-^^^^^^^^^^
-
- 128-bit SMBIOS UUID of a virtual machine represented as a hexadecimal string in "12345678-abcd-1234-cdef-123456789abc" format.
-
-instanceUuid (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- VirtualCenter-specific 128-bit UUID of a virtual machine, represented as a hexademical string. This identifier is used by VirtualCenter to uniquely identify all virtual machine instances, including those that may share the same SMBIOS UUID.
-
-npivNodeWorldWideName (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- A 64-bit node WWN (World Wide Name).
-
-npivPortWorldWideName (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- A 64-bit port WWN (World Wide Name).
-
-npivWorldWideNameType (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The source that provides/generates the assigned WWNs.
-
-npivDesiredNodeWwns (short, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The NPIV node WWNs to be extended from the original list of WWN numbers.
-
-npivDesiredPortWwns (short, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The NPIV port WWNs to be extended from the original list of WWN numbers.
-
-npivTemporaryDisabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- This property is used to enable or disable the NPIV capability on a desired virtual machine on a temporary basis.
-
-npivOnNonRdmDisks (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- This property is used to check whether the NPIV can be enabled on the Virtual machine with non-rdm disks in the configuration, so this is potentially not enabling npiv on vmfs disks.
- Also this property is used to check whether RDM is required to generate WWNs for a virtual machine.
-
-locationId (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Hash incorporating the virtual machine's config file location and the UUID of the host assigned to run the virtual machine.
-
-template (bool)
-^^^^^^^^^^^^^^^
-
- Flag indicating whether or not a virtual machine is a template.
-
-guestId (str)
-^^^^^^^^^^^^^
-
- Guest operating system configured on a virtual machine.
-
-.. _ansible_collections.community.vmware.docsite.alternate_guest_name:
-
-alternateGuestName (str)
-^^^^^^^^^^^^^^^^^^^^^^^^
-
- Used as display name for the operating system if guestId isotherorother-64. See :ref:`ansible_collections.community.vmware.docsite.guest_full_name`.
-
-annotation (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Description for the virtual machine.
-
-files (vim.vm.FileInfo)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- Information about the files associated with a virtual machine.
- This information does not include files for specific virtual disks or snapshots.
-
-tools (vim.vm.ToolsConfigInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Configuration of VMware Tools running in the guest operating system.
-
-flags (vim.vm.FlagInfo)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- Additional flags for a virtual machine.
-
-consolePreferences (vim.vm.ConsolePreferences, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Legacy console viewer preferences when doing power operations.
-
-defaultPowerOps (vim.vm.DefaultPowerOpInfo)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Configuration of default power operations.
-
-hardware (vim.vm.VirtualHardware)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Processor, memory, and virtual devices for a virtual machine.
-
-cpuAllocation (vim.ResourceAllocationInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Resource limits for CPU.
-
-memoryAllocation (vim.ResourceAllocationInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Resource limits for memory.
-
-latencySensitivity (vim.LatencySensitivity, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The latency-sensitivity of the virtual machine.
-
-memoryHotAddEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Whether memory can be added while the virtual machine is running.
-
-cpuHotAddEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Whether virtual processors can be added while the virtual machine is running.
-
-cpuHotRemoveEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Whether virtual processors can be removed while the virtual machine is running.
-
-hotPlugMemoryLimit (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The maximum amount of memory, in MB, than can be added to a running virtual machine.
-
-hotPlugMemoryIncrementSize (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Memory, in MB that can be added to a running virtual machine.
-
-cpuAffinity (vim.vm.AffinityInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Affinity settings for CPU.
-
-memoryAffinity (vim.vm.AffinityInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Affinity settings for memory.
-
-networkShaper (vim.vm.NetworkShaperInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Resource limits for network.
-
-extraConfig (vim.option.OptionValue, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Additional configuration information for the virtual machine.
-
-cpuFeatureMask (vim.host.CpuIdInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Specifies CPU feature compatibility masks that override the defaults from the ``GuestOsDescriptor`` of the virtual machine's guest OS.
-
-datastoreUrl (vim.vm.ConfigInfo.DatastoreUrlPair, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Enumerates the set of datastores that the virtual machine is stored on, as well as the URL identification for each of these.
-
-swapPlacement (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Virtual machine swapfile placement policy.
-
-bootOptions (vim.vm.BootOptions, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Configuration options for the boot behavior of the virtual machine.
-
-ftInfo (vim.vm.FaultToleranceConfigInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Fault tolerance settings for the virtual machine.
-
-vAppConfig (vim.vApp.VmConfigInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- vApp meta-data for the virtual machine.
-
-vAssertsEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether user-configured virtual asserts will be triggered during virtual machine replay.
-
-changeTrackingEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether changed block tracking for the virtual machine's disks is active.
-
-firmware (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^
-
- Information about firmware type for the virtual machine.
-
-maxMksConnections (int, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates the maximum number of active remote display connections that the virtual machine will support.
-
-guestAutoLockEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the guest operating system will logout any active sessions whenever there are no remote display connections open to the virtual machine.
-
-managedBy (vim.ext.ManagedByInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Specifies that the virtual machine is managed by a VC Extension.
-
-.. _ansible_collections.community.vmware.docsite.memory_reservation_locked_to_max:
-
-memoryReservationLockedToMax (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- If set true, memory resource reservation for the virtual machine will always be equal to the virtual machine's memory size; increases in memory size will be rejected when a corresponding reservation increase is not possible.
-
-initialOverhead (vim.vm.ConfigInfo.OverheadInfo), optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Set of values to be used only to perform admission control when determining if a host has sufficient resources for the virtual machine to power on.
-
-nestedHVEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the virtual machine is configured to use nested hardware-assisted virtualization.
-
-vPMCEnabled (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether the virtual machine have virtual CPU performance counters enabled.
-
-scheduledHardwareUpgradeInfo (vim.vm.ScheduledHardwareUpgradeInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Configuration of scheduled hardware upgrades and result from last attempt to run scheduled hardware upgrade.
-
-vFlashCacheReservation (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Specifies the total vFlash resource reservation for the vFlash caches associated with the virtual machine's virtual disks, in bytes.
-
-layout
-------
-
-Detailed information about the files that comprise the virtual machine.
-
-configFile (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- A list of files that makes up the configuration of the virtual machine (excluding the .vmx file, since that file is represented in the FileInfo).
- These are relative paths from the configuration directory.
- A slash is always used as a separator.
- This list will typically include the NVRAM file, but could also include other meta-data files.
-
-logFile (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- A list of files stored in the virtual machine's log directory.
- These are relative paths from the ``logDirectory``.
- A slash is always used as a separator.
-
-disk (vim.vm.FileLayout.DiskLayout, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Files making up each virtual disk.
-
-snapshot (vim.vm.FileLayout.SnapshotLayout, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Files of each snapshot.
-
-swapFile (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^
-
- The swapfile specific to the virtual machine, if any. This is a complete datastore path, not a relative path.
-
-
-layoutEx
---------
-
-Detailed information about the files that comprise the virtual machine.
-
-file (vim.vm.FileLayoutEx.FileInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Information about all the files that constitute the virtual machine including configuration files, disks, swap file, suspend file, log files, core files, memory file and so on.
-
-disk (vim.vm.FileLayoutEx.DiskLayout, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Layout of each virtual disk attached to the virtual machine.
- For a virtual machine with snaphots, this property gives only those disks that are attached to it at the current point of running.
-
-snapshot (vim.vm.FileLayoutEx.SnapshotLayout, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Layout of each snapshot of the virtual machine.
-
-timestamp (datetime)
-^^^^^^^^^^^^^^^^^^^^
-
- Time when values in this structure were last updated.
-
-storage (vim.vm.StorageInfo)
-----------------------------
-
-Storage space used by the virtual machine, split by datastore.
-
-perDatastoreUsage (vim.vm.StorageInfo.UsageOnDatastore, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Storage space used by the virtual machine on all datastores that it is located on.
- Total storage space committed to the virtual machine across all datastores is simply an aggregate of the property ``committed``
-
-timestamp (datetime)
-^^^^^^^^^^^^^^^^^^^^
-
- Time when values in this structure were last updated.
-
-environmentBrowser (vim.EnvironmentBrowser)
--------------------------------------------
-
-The current virtual machine's environment browser object.
-This contains information on all the configurations that can be used on the virtual machine.
-This is identical to the environment browser on the ComputeResource to which the virtual machine belongs.
-
-datastoreBrowser (vim.host.DatastoreBrowser)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- DatastoreBrowser to browse datastores that are available on this entity.
-
-resourcePool (vim.ResourcePool)
--------------------------------
-
-The current resource pool that specifies resource allocation for the virtual machine.
-This property is set when a virtual machine is created or associated with a different resource pool.
-Returns null if the virtual machine is a template or the session has no access to the resource pool.
-
-summary (vim.ResourcePool.Summary)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Basic information about a resource pool.
-
-runtime (vim.ResourcePool.RuntimeInfo)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Runtime information about a resource pool.
-
-owner (vim.ComputeResource)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The ComputeResource to which this set of one or more nested resource pools belong.
-
-resourcePool (vim.ResourcePool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The set of child resource pools.
-
-vm (vim.VirtualMachine)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- The set of virtual machines associated with this resource pool.
-
-config (vim.ResourceConfigSpec)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Configuration of this resource pool.
-
-childConfiguration (vim.ResourceConfigSpec)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The resource configuration of all direct children (VirtualMachine and ResourcePool) of this resource group.
-
-parentVApp (vim.ManagedEntity)
-------------------------------
-
-Reference to the parent vApp.
-
-parent (vim.ManagedEntity)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Parent of this entity.
- This value is null for the root object and for (VirtualMachine) objects that are part of a (VirtualApp).
-
-customValue (vim.CustomFieldsManager.Value)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Custom field values.
-
-overallStatus (vim.ManagedEntity.Status)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- General health of this managed entity.
-
-configStatus (vim.ManagedEntity.Status)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The configStatus indicates whether or not the system has detected a configuration issue involving this entity.
- For example, it might have detected a duplicate IP address or MAC address, or a host in a cluster might be out of ``compliance.property``.
-
-configIssue (vim.event.Event)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current configuration issues that have been detected for this entity.
-
-effectiveRole (int)
-^^^^^^^^^^^^^^^^^^^
-
- Access rights the current session has to this entity.
-
-permission (vim.AuthorizationManager.Permission)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- List of permissions defined for this entity.
-
-name (str)
-^^^^^^^^^^
-
- Name of this entity, unique relative to its parent.
- Any / (slash), \ (backslash), character used in this name element will be escaped.
- Similarly, any % (percent) character used in this name element will be escaped, unless it is used to start an escape sequence.
- A slash is escaped as %2F or %2f. A backslash is escaped as %5C or %5c, and a percent is escaped as %25.
-
-disabledMethod (str)
-^^^^^^^^^^^^^^^^^^^^
-
- List of operations that are disabled, given the current runtime state of the entity.
- For example, a power-on operation always fails if a virtual machine is already powered on.
-
-recentTask (vim.Task)
-^^^^^^^^^^^^^^^^^^^^^
-
- The set of recent tasks operating on this managed entity.
- A task in this list could be in one of the four states: pending, running, success or error.
-
-declaredAlarmState (vim.alarm.AlarmState)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- A set of alarm states for alarms that apply to this managed entity.
-
-triggeredAlarmState (vim.alarm.AlarmState)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- A set of alarm states for alarms triggered by this entity or by its descendants.
-
-alarmActionsEnabled (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Whether alarm actions are enabled for this entity. True if enabled; false otherwise.
-
-tag (vim.Tag)
-^^^^^^^^^^^^^
-
- The set of tags associated with this managed entity. Experimental. Subject to change.
-
-resourceConfig (vim.ResourceConfigSpec)
----------------------------------------
-
- The resource configuration for a virtual machine.
-
-entity (vim.ManagedEntity, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Reference to the entity with this resource specification: either a VirtualMachine or a ResourcePool.
-
-changeVersion (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The changeVersion is a unique identifier for a given version of the configuration. Each change to the configuration will update this value.
- This is typically implemented as an ever increasing count or a time-stamp.
-
-
-lastModified (datetime, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Timestamp when the resources were last modified. This is ignored when the object is used to update a configuration.
-
-cpuAllocation (vim.ResourceAllocationInfo)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Resource allocation for CPU.
-
-memoryAllocation (vim.ResourceAllocationInfo)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Resource allocation for memory.
-
-runtime (vim.vm.RuntimeInfo)
-----------------------------
-
-Execution state and history for the virtual machine.
-
-device (vim.vm.DeviceRuntimeInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Per-device runtime info. This array will be empty if the host software does not provide runtime info for any of the device types currently in use by the virtual machine.
-
-host (vim.HostSystem, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The host that is responsible for running a virtual machine.
- This property is null if the virtual machine is not running and is not assigned to run on a particular host.
-
-connectionState (vim.VirtualMachine.ConnectionState)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Indicates whether or not the virtual machine is available for management.
-
-powerState (vim.VirtualMachine.PowerState)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The current power state of the virtual machine.
-
-faultToleranceState (vim.VirtualMachine.FaultToleranceState)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The fault tolerance state of the virtual machine.
-
-dasVmProtection (vim.vm.RuntimeInfo.DasProtectionState, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The vSphere HA protection state for a virtual machine.
- Property is unset if vSphere HA is not enabled.
-
-toolsInstallerMounted (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Flag to indicate whether or not the VMware Tools installer is mounted as a CD-ROM.
-
-suspendTime (datetime, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The timestamp when the virtual machine was most recently suspended.
- This property is updated every time the virtual machine is suspended.
-
-bootTime (datetime, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The timestamp when the virtual machine was most recently powered on.
- This property is updated when the virtual machine is powered on from the poweredOff state, and is cleared when the virtual machine is powered off.
- This property is not updated when a virtual machine is resumed from a suspended state.
-
-suspendInterval (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The total time the virtual machine has been suspended since it was initially powered on.
- This time excludes the current period, if the virtual machine is currently suspended.
- This property is updated when the virtual machine resumes, and is reset to zero when the virtual machine is powered off.
-
-question (vim.vm.QuestionInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The current question, if any, that is blocking the virtual machine's execution.
-
-memoryOverhead (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The amount of memory resource (in bytes) that will be used by the virtual machine above its guest memory requirements.
- This value is set if and only if the virtual machine is registered on a host that supports memory resource allocation features.
- For powered off VMs, this is the minimum overhead required to power on the VM on the registered host.
- For powered on VMs, this is the current overhead reservation, a value which is almost always larger than the minimum overhead, and which grows with time.
-
-maxCpuUsage (int, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current upper-bound on CPU usage.
- The upper-bound is based on the host the virtual machine is current running on, as well as limits configured on the virtual machine itself or any parent resource pool.
- Valid while the virtual machine is running.
-
-maxMemoryUsage (int, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current upper-bound on memory usage.
- The upper-bound is based on memory configuration of the virtual machine, as well as limits configured on the virtual machine itself or any parent resource pool.
- Valid while the virtual machine is running.
-
-numMksConnections (int)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- Number of active MKS connections to the virtual machine.
-
-recordReplayState (vim.VirtualMachine.RecordReplayState)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Record / replay state of the virtual machine.
-
-cleanPowerOff (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- For a powered off virtual machine, indicates whether the virtual machine's last shutdown was an orderly power off or not.
- Unset if the virtual machine is running or suspended.
-
-needSecondaryReason (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- If set, indicates the reason the virtual machine needs a secondary.
-
-onlineStandby (bool)
-^^^^^^^^^^^^^^^^^^^^
-
- This property indicates whether the guest has gone into one of the s1, s2 or s3 standby modes. False indicates the guest is awake.
-
-minRequiredEVCModeKey (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- For a powered-on or suspended virtual machine in a cluster with Enhanced VMotion Compatibility (EVC) enabled, this identifies the least-featured EVC mode (among those for the appropriate CPU vendor) that could admit the virtual machine.
- This property will be unset if the virtual machine is powered off or is not in an EVC cluster.
- This property may be used as a general indicator of the CPU feature baseline currently in use by the virtual machine.
- However, the virtual machine may be suppressing some of the features present in the CPU feature baseline of the indicated mode, either explicitly (in the virtual machine's configured ``cpuFeatureMask``) or implicitly (in the default masks for the ``GuestOsDescriptor`` appropriate for the virtual machine's configured guest OS).
-
-consolidationNeeded (bool)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Whether any disk of the virtual machine requires consolidation.
- This can happen for example when a snapshot is deleted but its associated disk is not committed back to the base disk.
-
-offlineFeatureRequirement (vim.vm.FeatureRequirement, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- These requirements must have equivalent host capabilities ``featureCapability`` in order to power on.
-
-featureRequirement (vim.vm.FeatureRequirement, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- These requirements must have equivalent host capabilities ``featureCapability`` in order to power on, resume, or migrate to the host.
-
-featureMask (vim.host.FeatureMask, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- The masks applied to an individual virtual machine as a result of its configuration.
-
-vFlashCacheAllocation (long, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Specifies the total allocated vFlash resource for the vFlash caches associated with VM's VMDKs when VM is powered on, in bytes.
-
-
-guest (vim.vm.GuestInfo)
-------------------------
-
-Information about VMware Tools and about the virtual machine from the perspective of VMware Tools.
-Information about the guest operating system is available in VirtualCenter.
-Guest operating system information reflects the last known state of the virtual machine.
-For powered on machines, this is current information.
-For powered off machines, this is the last recorded state before the virtual machine was powered off.
-
-toolsStatus (vim.vm.GuestInfo.ToolsStatus, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current status of VMware Tools in the guest operating system, if known.
-
-toolsVersionStatus (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current version status of VMware Tools in the guest operating system, if known.
-
-toolsVersionStatus2 (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current version status of VMware Tools in the guest operating system, if known.
-
-toolsRunningStatus (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current running status of VMware Tools in the guest operating system, if known.
-
-toolsVersion (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current version of VMware Tools, if known.
-
-guestId (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest operating system identifier (short name), if known.
-
-guestFamily (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest operating system family, if known.
-
-guestFullName (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- See :ref:`ansible_collections.community.vmware.docsite.guest_full_name`.
-
-hostName (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^
-
- Hostname of the guest operating system, if known.
-
-ipAddress (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Primary IP address assigned to the guest operating system, if known.
-
-net (vim.vm.GuestInfo.NicInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest information about network adapters, if known.
-
-ipStack (vim.vm.GuestInfo.StackInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest information about IP networking stack, if known.
-
-disk (vim.vm.GuestInfo.DiskInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest information about disks.
- You can obtain Linux guest disk information for the following file system types only: Ext2, Ext3, Ext4, ReiserFS, ZFS, NTFS, VFAT, UFS, PCFS, HFS, and MS-DOS.
-
-screen (vim.vm.GuestInfo.ScreenInfo, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest screen resolution info, if known.
-
-guestState (str)
-^^^^^^^^^^^^^^^^
-
- Operation mode of guest operating system.
-
-appHeartbeatStatus (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Application heartbeat status.
-
-appState (str, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^
-
- Application state.
- If vSphere HA is enabled and the vm is configured for Application Monitoring and this field's value is ``appStateNeedReset`` then HA will attempt immediately reset the virtual machine.
- There are some system conditions which may delay the immediate reset.
- The immediate reset will be performed as soon as allowed by vSphere HA and ESX.
- If during these conditions the value is changed to ``appStateOk`` the reset will be cancelled.
-
-guestOperationsReady (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest Operations availability. If true, the vitrual machine is ready to process guest operations.
-
-interactiveGuestOperationsReady (bool, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Interactive Guest Operations availability. If true, the virtual machine is ready to process guest operations as the user interacting with the guest desktop.
-
-generationInfo (vim.vm.GuestInfo.NamespaceGenerationInfo, privilege: VirtualMachine.Namespace.EventNotify, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- A list of namespaces and their corresponding generation numbers. Only namespaces with non-zero ``maxSizeEventsFromGuest`` are guaranteed to be present here.
-
-
-summary (vim.vm.Summary)
-------------------------
-
- Basic information about the virtual machine.
-
-vm (vim.VirtualMachine, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Reference to the virtual machine managed object.
-
-runtime (vim.vm.RuntimeInfo)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Runtime and state information of a running virtual machine.
- Most of this information is also available when a virtual machine is powered off.
- In that case, it contains information from the last run, if available.
-
-guest (vim.vm.Summary.GuestSummary, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Guest operating system and VMware Tools information.
-
-config (vim.vm.Summary.ConfigSummary)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Basic configuration information about the virtual machine.
- This information is not available when the virtual machine is unavailable, for instance, when it is being created or deleted.
-
-storage (vim.vm.Summary.StorageSummary, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Storage information of the virtual machine.
-
-quickStats (vim.vm.Summary.QuickStats)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- A set of statistics that are typically updated with near real-time regularity.
-
-overallStatus (vim.ManagedEntity.Status)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Overall alarm status on this node.
-
-customValue (vim.CustomFieldsManager.Value, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Custom field values.
-
-
-datastore (vim.Datastore)
--------------------------
-
- A collection of references to the subset of datastore objects in the datacenter that is used by the virtual machine.
-
-info (vim.Datastore.Info)
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Specific information about the datastore.
-
-summary (vim.Datastore.Summary)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Global properties of the datastore.
-
-host (vim.Datastore.HostMount)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Hosts attached to this datastore.
-
-vm (vim.VirtualMachine)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- Virtual machines stored on this datastore.
-
-browser (vim.host.DatastoreBrowser)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- DatastoreBrowser used to browse this datastore.
-
-capability (vim.Datastore.Capability)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Capabilities of this datastore.
-
-iormConfiguration (vim.StorageResourceManager.IORMConfigInfo)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Configuration of storage I/O resource management for the datastore.
- Currently VMware only support storage I/O resource management on VMFS volumes of a datastore.
- This configuration may not be available if the datastore is not accessible from any host, or if the datastore does not have VMFS volume.
-
-network (vim.Network)
----------------------
-
- A collection of references to the subset of network objects in the datacenter that is used by the virtual machine.
-
-name (str)
-^^^^^^^^^^
-
- Name of this network.
-
-summary (vim.Network.Summary)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Properties of a network.
-
-host (vim.HostSystem)
-^^^^^^^^^^^^^^^^^^^^^
-
- Hosts attached to this network.
-
-vm (vim.VirtualMachine)
-^^^^^^^^^^^^^^^^^^^^^^^
-
- Virtual machines using this network.
-
-
-snapshot (vim.vm.SnapshotInfo)
--------------------------------
-
-Current snapshot and tree.
-The property is valid if snapshots have been created for the virtual machine.
-
-currentSnapshot (vim.vm.Snapshot, optional)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Current snapshot of the virtual machineThis property is set by calling ``Snapshot.revert`` or ``VirtualMachine.createSnapshot``.
- This property will be empty when the working snapshot is at the root of the snapshot tree.
-
-rootSnapshotList (vim.vm.SnapshotTree)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Data for the entire set of snapshots for one virtual machine.
-
-rootSnapshot (vim.vm.Snapshot)
-------------------------------
-
-The roots of all snapshot trees for the virtual machine.
-
-config (vim.vm.ConfigInfo)
-^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- Information about the configuration of the virtual machine when this snapshot was taken.
- The datastore paths for the virtual machine disks point to the head of the disk chain that represents the disk at this given snapshot.
-
-childSnapshot (vim.vm.Snapshot)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- All snapshots for which this snapshot is the parent.
-
-guestHeartbeatStatus (vim.ManagedEntity.Status)
------------------------------------------------
-
- The guest heartbeat.
-
-.. seealso::
-
- `pyVmomi <https://github.com/vmware/pyvmomi>`_
- The GitHub Page of pyVmomi
- `pyVmomi Issue Tracker <https://github.com/vmware/pyvmomi/issues>`_
- The issue tracker for the pyVmomi project
- rst/scenario_guides/guide_vmware.rst
- The GitHub Page of vSphere Automation SDK for Python
- `vSphere Automation SDK Issue Tracker <https://github.com/vmware/vsphere-automation-sdk-python/issues>`_
- The issue tracker for vSphere Automation SDK for Python
- :ref:`working_with_playbooks`
- An introduction to playbooks
- :ref:`playbooks_vault`
- Using Vault in playbooks
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_module_reference.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_module_reference.rst
deleted file mode 100644
index 9a9a36e98..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_module_reference.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-:orphan:
-
-.. _ansible_collections.community.vmware.docsite.vmware_ansible_module_index:
-
-***************************
-Ansible VMware Module Guide
-***************************
-
-This will be a listing similar to the module index in our core docs.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_requirements.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_requirements.rst
deleted file mode 100644
index 8244afe2f..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_requirements.rst
+++ /dev/null
@@ -1,73 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_requirements:
-
-********************
-VMware Prerequisites
-********************
-
-.. contents::
- :local:
-
-ESXi License
-============
-
-Access to the vSphere API is governed by the various vSphere Editions which provides both read and write access to the API.
-If you are using vSphere Hypervisor (free edition of ESXi), the vSphere API will only be available as read-only.
-All modules requires API write access to perform various actions. Hence, a free ESXi license will not be supported.
-Please check `this blog post <https://blogs.vmware.com/vsphere/2012/02/introduction-to-the-vsphere-api-part-1.html>`_ for more details.
-
-
-Installing SSL Certificates
-===========================
-
-All vCenter and ESXi servers require SSL encryption on all connections to enforce secure communication. You must enable SSL encryption for Ansible by installing the server's SSL certificates on your Ansible control node or delegate node.
-
-If the SSL certificate of your vCenter or ESXi server is not correctly installed on your Ansible control node, you will see the following warning when using Ansible VMware modules:
-
-``Unable to connect to vCenter or ESXi API at xx.xx.xx.xx on TCP/443: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)``
-
-To install the SSL certificate for your VMware server, and run your Ansible VMware modules in encrypted mode, please follow the instructions for the server you are running with VMware.
-
-Installing vCenter SSL certificates for Ansible
------------------------------------------------
-
-* From any web browser, go to the base URL of the vCenter Server without port number like ``https://vcenter-domain.example.com``
-
-* Click the "Download trusted root CA certificates" link at the bottom of the grey box on the right and download the file.
-
-* Change the extension of the file to .zip. The file is a ZIP file of all root certificates and all CRLs.
-
-* Extract the contents of the zip file. The extracted directory contains a ``.certs`` directory that contains two types of files. Files with a number as the extension (.0, .1, and so on) are root certificates.
-
-* Install the certificate files are trusted certificates by the process that is appropriate for your operating system.
-
-
-Installing ESXi SSL certificates for Ansible
---------------------------------------------
-
-* Enable SSH Service on ESXi either by using Ansible VMware module `vmware_host_service_manager <https://github.com/ansible-collections/vmware/blob/main/plugins/modules/vmware_host_config_manager.py>`_ or manually using vSphere Web interface.
-
-* SSH to ESXi server using administrative credentials, and navigate to directory ``/etc/vmware/ssl``
-
-* Secure copy (SCP) ``rui.crt`` located in ``/etc/vmware/ssl`` directory to Ansible control node.
-
-* Install the certificate file by the process that is appropriate for your operating system.
-
-Using custom path for SSL certificates
---------------------------------------
-
-If you need to use a custom path for SSL certificates, you can set the ``REQUESTS_CA_BUNDLE`` environment variable in your playbook.
-
-For example, if ``/var/vmware/certs/vcenter1.crt`` is the SSL certificate for your vCenter Server, you can use the :ref:`environment <playbooks_environment>` keyword to pass it to the modules:
-
-.. code-block:: yaml
-
- - name: Gather all tags from vCenter
- community.vmware.vmware_tag_info:
- validate_certs: True
- hostname: '{{ vcenter_hostname }}'
- username: '{{ vcenter_username }}'
- password: '{{ vcenter_password }}'
- environment:
- REQUESTS_CA_BUNDLE: /var/vmware/certs/vcenter1.crt
-
-There is a `known issue <https://github.com/psf/requests/issues/3829>`_ in ``requests`` library (version 2) which you may want to consider when using this environment variable. Basically, setting ``REQUESTS_CA_BUNDLE`` environment variable on managed nodes overrides the ``validate_certs`` value. This may result in unexpected behavior while running the playbook. Please see `community.vmware issue 601 <https://github.com/ansible-collections/community.vmware/issues/601>`_ and `vmware issue 254 <https://github.com/vmware/vsphere-automation-sdk-python/issues/254>`_ for more information.
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_scenarios.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_scenarios.rst
deleted file mode 100644
index e34aa43d5..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_scenarios.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_scenarios:
-
-****************************
-Ansible for VMware Scenarios
-****************************
-
-These scenarios teach you how to accomplish common VMware tasks using Ansible. To get started, please select the task you want to accomplish.
-
-.. toctree::
- :maxdepth: 1
-
- scenario_clone_template
- scenario_rename_vm
- scenario_remove_vm
- scenario_find_vm_folder
- scenario_vmware_http
- scenario_vmware_tools_connection
diff --git a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_troubleshooting.rst b/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_troubleshooting.rst
deleted file mode 100644
index b0243c28c..000000000
--- a/ansible_collections/community/vmware/docs/docsite/rst/vmware_scenarios/vmware_troubleshooting.rst
+++ /dev/null
@@ -1,103 +0,0 @@
-.. _ansible_collections.community.vmware.docsite.vmware_troubleshooting:
-
-**********************************
-Troubleshooting Ansible for VMware
-**********************************
-
-.. contents::
- :local:
-
-This section lists things that can go wrong and possible ways to fix them.
-
-Debugging Ansible for VMware
-============================
-
-When debugging or creating a new issue, you will need information about your VMware infrastructure. You can get this information using
-`govc <https://github.com/vmware/govmomi/tree/master/govc>`_, For example:
-
-
-.. code-block:: bash
-
- $ export GOVC_USERNAME=ESXI_OR_VCENTER_USERNAME
- $ export GOVC_PASSWORD=ESXI_OR_VCENTER_PASSWORD
- $ export GOVC_URL=https://ESXI_OR_VCENTER_HOSTNAME:443
- $ govc find /
-
-Known issues with Ansible for VMware
-====================================
-
-
-Network settings with vmware_guest in Ubuntu 18.04
---------------------------------------------------
-
-Setting the network with ``vmware_guest`` in Ubuntu 18.04 is known to be broken, due to missing support for ``netplan`` in the ``open-vm-tools``.
-This issue is tracked via:
-
-* https://github.com/vmware/open-vm-tools/issues/240
-* https://github.com/ansible/ansible/issues/41133
-
-Potential Workarounds
-^^^^^^^^^^^^^^^^^^^^^
-
-There are several workarounds for this issue.
-
-1) Modify the Ubuntu 18.04 images and installing ``ifupdown`` in them via ``sudo apt install ifupdown``.
- If so you need to remove ``netplan`` via ``sudo apt remove netplan.io`` and you need stop ``systemd-networkd`` via ``sudo systemctl disable systemctl-networkd``.
-
-2) Generate the ``systemd-networkd`` files with a task in your VMware Ansible role:
-
-.. code-block:: yaml
-
- - name: make sure cache directory exists
- file: path="{{ inventory_dir }}/cache" state=directory
- delegate_to: localhost
-
- - name: generate network templates
- template: src=network.j2 dest="{{ inventory_dir }}/cache/{{ inventory_hostname }}.network"
- delegate_to: localhost
-
- - name: copy generated files to vm
- vmware_guest_file_operation:
- hostname: "{{ vmware_general.hostname }}"
- username: "{{ vmware_username }}"
- password: "{{ vmware_password }}"
- datacenter: "{{ vmware_general.datacenter }}"
- validate_certs: "{{ vmware_general.validate_certs }}"
- vm_id: "{{ inventory_hostname }}"
- vm_username: root
- vm_password: "{{ template_password }}"
- copy:
- src: "{{ inventory_dir }}/cache/{{ inventory_hostname }}.network"
- dest: "/etc/systemd/network/ens160.network"
- overwrite: False
- delegate_to: localhost
-
- - name: restart systemd-networkd
- vmware_vm_shell:
- hostname: "{{ vmware_general.hostname }}"
- username: "{{ vmware_username }}"
- password: "{{ vmware_password }}"
- datacenter: "{{ vmware_general.datacenter }}"
- folder: /vm
- vm_id: "{{ inventory_hostname}}"
- vm_username: root
- vm_password: "{{ template_password }}"
- vm_shell: /bin/systemctl
- vm_shell_args: " restart systemd-networkd"
- delegate_to: localhost
-
- - name: restart systemd-resolved
- vmware_vm_shell:
- hostname: "{{ vmware_general.hostname }}"
- username: "{{ vmware_username }}"
- password: "{{ vmware_password }}"
- datacenter: "{{ vmware_general.datacenter }}"
- folder: /vm
- vm_id: "{{ inventory_hostname}}"
- vm_username: root
- vm_password: "{{ template_password }}"
- vm_shell: /bin/systemctl
- vm_shell_args: " restart systemd-resolved"
- delegate_to: localhost
-
-3) Wait for ``netplan`` support in ``open-vm-tools``
diff --git a/ansible_collections/community/vmware/meta/runtime.yml b/ansible_collections/community/vmware/meta/runtime.yml
index 92196f500..621c815bd 100644
--- a/ansible_collections/community/vmware/meta/runtime.yml
+++ b/ansible_collections/community/vmware/meta/runtime.yml
@@ -11,6 +11,7 @@ action_groups:
- vcenter_root_password_expiration
- vcenter_standard_key_provider
- vmware_about_info
+ - vmware_all_snapshots_info
- vmware_category
- vmware_category_info
- vmware_cfg_backup
diff --git a/ansible_collections/community/vmware/plugins/doc_fragments/vmware.py b/ansible_collections/community/vmware/plugins/doc_fragments/vmware.py
index 5df2762c1..18fe01972 100644
--- a/ansible_collections/community/vmware/plugins/doc_fragments/vmware.py
+++ b/ansible_collections/community/vmware/plugins/doc_fragments/vmware.py
@@ -15,6 +15,7 @@ class ModuleDocFragment(object):
DOCUMENTATION = r'''
notes:
- All modules requires API write access and hence is not supported on a free ESXi license.
+ - All variables and VMware object names are case sensitive.
options:
hostname:
description:
diff --git a/ansible_collections/community/vmware/plugins/doc_fragments/vmware_rest_client.py b/ansible_collections/community/vmware/plugins/doc_fragments/vmware_rest_client.py
index f852173d6..50af0ba50 100644
--- a/ansible_collections/community/vmware/plugins/doc_fragments/vmware_rest_client.py
+++ b/ansible_collections/community/vmware/plugins/doc_fragments/vmware_rest_client.py
@@ -12,6 +12,9 @@ __metaclass__ = type
class ModuleDocFragment(object):
# Parameters for VMware REST Client based modules
DOCUMENTATION = r'''
+notes:
+ - All modules requires API write access and hence is not supported on a free ESXi license.
+ - All variables and VMware object names are case sensitive.
options:
hostname:
description:
diff --git a/ansible_collections/community/vmware/plugins/module_utils/vmware.py b/ansible_collections/community/vmware/plugins/module_utils/vmware.py
index a7b61bdae..12bdf5107 100644
--- a/ansible_collections/community/vmware/plugins/module_utils/vmware.py
+++ b/ansible_collections/community/vmware/plugins/module_utils/vmware.py
@@ -1088,11 +1088,11 @@ def option_diff(options, current_options, truthy_strings_as_bool=True):
for option_key, option_value in options.items():
if truthy_strings_as_bool and is_boolean(option_value):
option_value = VmomiSupport.vmodlTypes['bool'](is_truthy(option_value))
- elif type(option_value) is int:
+ elif isinstance(option_value, int):
option_value = VmomiSupport.vmodlTypes['int'](option_value)
- elif type(option_value) is float:
+ elif isinstance(option_value, float):
option_value = VmomiSupport.vmodlTypes['float'](option_value)
- elif type(option_value) is str:
+ elif isinstance(option_value, str):
option_value = VmomiSupport.vmodlTypes['string'](option_value)
if option_key not in current_options_dict or current_options_dict[option_key] != option_value:
diff --git a/ansible_collections/community/vmware/plugins/modules/vcenter_folder.py b/ansible_collections/community/vmware/plugins/modules/vcenter_folder.py
index 7103e6285..46be0df4b 100644
--- a/ansible_collections/community/vmware/plugins/modules/vcenter_folder.py
+++ b/ansible_collections/community/vmware/plugins/modules/vcenter_folder.py
@@ -30,14 +30,12 @@ options:
folder_name:
description:
- Name of folder to be managed.
- - This is case sensitive parameter.
- Folder name should be under 80 characters. This is a VMware restriction.
required: true
type: str
parent_folder:
description:
- Name of the parent folder under which new folder needs to be created.
- - This is case sensitive parameter.
- "If user wants to create a folder under '/DC0/vm/vm_folder', this value will be 'vm_folder'."
- "If user wants to create a folder under '/DC0/vm/folder1/folder2', this value will be 'folder1/folder2'."
required: false
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_all_snapshots_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_all_snapshots_info.py
new file mode 100644
index 000000000..934781a6c
--- /dev/null
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_all_snapshots_info.py
@@ -0,0 +1,204 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# Copyright: (c) 2018, Ansible Project
+# Copyright: (c) 2024, Fernando Mendieta <fernandomendietaovejero@gmail.com>
+# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+
+DOCUMENTATION = r'''
+---
+module: vmware_all_snapshots_info
+short_description: Gathers information about all snapshots across virtual machines in a specified vmware datacenter
+description:
+- This module collects detailed information of all the snapshots of the datacenter, can be used with filter options
+author:
+- Fernando Mendieta (@valkiriaaquatica)
+options:
+ datacenter:
+ description:
+ - The name of the datacenter to gather snapshot information from. You can get it in the vmware UI.
+ required: true
+ type: str
+ filters:
+ description:
+ - Optional filters to apply to the snapshot data being gathered, you can apply one or more.
+ - Filters are applied based on the variable match_type specified. If match_type exact, filters require exact matches.
+ - On the other hand when match_type includes it gets the values that contain that value.
+ - Available filter options creation_time, description, folder, id, name, quiesced, state, vm_name.
+ - Multiple filters can be applied the snapshot must meet all filter criteria to be included in the results.
+ required: false
+ type: dict
+ default: {}
+ match_type:
+ description:
+ - Indicates whether the filter match should be exact or includes.
+ - For example when you want to get all the snapshots that contain in their name the word test you place the filter name test and the match_type includes.
+ - For example when you want to get all snapshots that are in state poweredOn you skip the match_type default is exact or you write match_type exact.
+ required: false
+ type: str
+ choices: ['exact', 'includes']
+ default: exact
+extends_documentation_fragment:
+- community.vmware.vmware.documentation
+'''
+
+EXAMPLES = r'''
+ - name: Gather information about all snapshots in VMware vCenter
+ vmware_snapshot_info_all:
+ hostname: '{{ vcenter_hostname }}'
+ username: '{{ vcenter_username }}'
+ password: '{{ vcenter_password }}'
+ validate_certs: no
+ datacenter: '{{ datacenter_name }}'
+ delegate_to: localhost
+ - name: Gather information of a snapshot with filters applied and match_type in exacts.
+ vmware_snapshot_info_all:
+ hostname: '{{ vcenter_hostname }}'
+ username: '{{ vcenter_username }}'
+ password: '{{ vcenter_password }}'
+ validate_certs: yes
+ datacenter: '{{ datacenter_name }}'
+ filters:
+ state: "poweredOn"
+ vm_name: "you_marchine_name"
+ delegate_to: localhost
+ - name: Gather information of snapshots that in their name contain the "test" in their name.
+ vmware_snapshot_info_all:
+ hostname: '{{ vcenter_hostname }}'
+ username: '{{ vcenter_username }}'
+ password: '{{ vcenter_password }}'
+ validate_certs: yes
+ datacenter: '{{ datacenter_name }}'
+ match_type: "includes"
+ filters:
+ name: "test"
+ delegate_to: localhost
+'''
+
+RETURN = r'''
+vmware_all_snapshots_info:
+ description: A list of all snapshots information across all virtual machines in the specified datacenter
+ returned: always
+ type: list
+ elements: dict
+ contains:
+ vm_name:
+ description: The name of the virtual machine that appears in the iu.
+ type: str
+ returned: always
+ folder:
+ description: The folder path of the virtual machine in the datacenter, normally is vm
+ type: str
+ returned: always
+ name:
+ description: The name of the snapshot
+ type: str
+ returned: always
+ description:
+ description: The description of the snapshot.
+ type: str
+ returned: when it exists because depends if it has or not
+ creation_time:
+ description: The time the snapshot was created
+ type: str
+ returned: always
+ state:
+ description: The state of the virtual machine at the snapshot (powered on/off)
+ type: str
+ returned: always
+ id:
+ description: The unique identifier of the snapshot
+ type: int
+ returned: always
+ quiesced:
+ description: Indicates if the snapshot was created with the virtual machines file system quiesced
+ type: bool
+ returned: always
+'''
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.community.vmware.plugins.module_utils.vmware import (
+ PyVmomi,
+ vmware_argument_spec,
+ list_snapshots_recursively,
+)
+
+try:
+ from pyVmomi import vim
+except ImportError:
+ pass
+
+
+class VMwareSnapshotInfo(PyVmomi):
+ def __init__(self, module):
+ super(VMwareSnapshotInfo, self).__init__(module)
+
+ def list_snapshots(self, vm):
+ return (
+ list_snapshots_recursively(vm.snapshot.rootSnapshotList)
+ if vm.snapshot
+ else []
+ )
+
+ def get_all_vms(self):
+ content = self.content
+ container = content.viewManager.CreateContainerView(
+ content.rootFolder, [vim.VirtualMachine], True
+ )
+ vms = container.view
+ container.Destroy()
+ return vms
+
+ def gather_snapshots_info(self, filters, match_type):
+ snapshot_data = []
+ for vm in self.get_all_vms():
+ for snapshot in self.list_snapshots(vm):
+ snapshot_info = {
+ "vm_name": vm.name,
+ "folder": vm.parent.name,
+ **snapshot,
+ }
+ if self.passes_filters(snapshot_info, filters, match_type):
+ snapshot_data.append(snapshot_info)
+ return snapshot_data
+
+ def passes_filters(self, snapshot_info, filters, match_type):
+ for key, value in filters.items():
+ if key not in snapshot_info:
+ continue
+ actual_value = str(snapshot_info[key]).lower()
+ desired_value = str(value).lower()
+
+ if match_type == "exact" and actual_value != desired_value:
+ return False
+ elif match_type == "includes" and desired_value not in actual_value:
+ return False
+ return True
+
+
+def main():
+ argument_spec = vmware_argument_spec()
+ argument_spec.update(
+ datacenter=dict(required=True, type="str"),
+ filters=dict(required=False, type="dict", default={}),
+ match_type=dict(
+ required=False, type="str", choices=["exact", "includes"], default="exact"
+ ),
+ )
+
+ module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)
+ vmware_snapshot_info = VMwareSnapshotInfo(module)
+ filters = module.params.get("filters")
+ match_type = module.params.get("match_type")
+ all_snapshots = vmware_snapshot_info.gather_snapshots_info(filters, match_type)
+ module.exit_json(changed=False, vmware_all_snapshots_info=all_snapshots)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_category.py b/ansible_collections/community/vmware/plugins/modules/vmware_category.py
index c107c4f13..6e76a8b97 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_category.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_category.py
@@ -17,7 +17,6 @@ short_description: Manage VMware categories
description:
- This module can be used to create / delete / update VMware categories.
- Tag feature is introduced in vSphere 6 version, so this module is not supported in the earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_category_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_category_info.py
index 10fdb162f..71d228f83 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_category_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_category_info.py
@@ -17,7 +17,6 @@ short_description: Gather info about VMware tag categories
description:
- This module can be used to gather information about VMware tag categories.
- Tag feature is introduced in vSphere 6 version, so this module is not supported in earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_cluster.py b/ansible_collections/community/vmware/plugins/modules/vmware_cluster.py
index 479d31520..8af4d881c 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_cluster.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_cluster.py
@@ -17,7 +17,6 @@ short_description: Manage VMware vSphere clusters
description:
- Adds or removes VMware vSphere clusters.
- To manage DRS, HA and VSAN related configurations, use the modules vmware_cluster_drs, vmware_cluster_ha and vmware_cluster_vsan.
- - All values and VMware object names are case sensitive.
author:
- Joseph Callen (@jcpowermac)
- Abhijeet Kasurde (@Akasurde)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_dpm.py b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_dpm.py
index 61551263c..1215f52c3 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_dpm.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_dpm.py
@@ -17,7 +17,6 @@ module: vmware_cluster_dpm
short_description: Manage Distributed Power Management (DPM) on VMware vSphere clusters
description:
- Manages DPM on VMware vSphere clusters.
- - All values and VMware object names are case sensitive.
author:
- Olivia Luetolf (@olilu)
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_drs.py b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_drs.py
index 3027c2910..873e87709 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_drs.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_drs.py
@@ -16,7 +16,6 @@ module: vmware_cluster_drs
short_description: Manage Distributed Resource Scheduler (DRS) on VMware vSphere clusters
description:
- Manages DRS on VMware vSphere clusters.
- - All values and VMware object names are case sensitive.
author:
- Joseph Callen (@jcpowermac)
- Abhijeet Kasurde (@Akasurde)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_ha.py b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_ha.py
index 1ad532d4b..cad1eb519 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_ha.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_ha.py
@@ -17,7 +17,6 @@ module: vmware_cluster_ha
short_description: Manage High Availability (HA) on VMware vSphere clusters
description:
- Manages HA configuration on VMware vSphere clusters.
- - All values and VMware object names are case sensitive.
author:
- Joseph Callen (@jcpowermac)
- Abhijeet Kasurde (@Akasurde)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_info.py
index a015b6fc3..24ca77bc8 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_info.py
@@ -16,7 +16,6 @@ module: vmware_cluster_info
short_description: Gather info about clusters available in given vCenter
description:
- This module can be used to gather information about clusters in VMWare infrastructure.
- - All values and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
- Christian Neugum (@digifuchsi)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vcls.py b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vcls.py
index f553adcdb..19d07ad86 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vcls.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vcls.py
@@ -17,7 +17,6 @@ short_description: Override the default vCLS (vSphere Cluster Services) VM disk
description:
- Override the default vCLS VM disk placement for this cluster.
- Some datastores cannot be selected for vCLS 'Allowed' as they are blocked by solutions as SRM or vSAN maintenance mode where vCLS cannot be configured.
- - All values and VMware object names are case sensitive.
author:
- Joseph Callen (@jcpowermac)
- Nina Loser (@Nina2244)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vsan.py b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vsan.py
index 9f82aada8..0f4eb9cad 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vsan.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_cluster_vsan.py
@@ -16,7 +16,6 @@ module: vmware_cluster_vsan
short_description: Manages virtual storage area network (vSAN) configuration on VMware vSphere clusters
description:
- Manages vSAN on VMware vSphere clusters.
- - All values and VMware object names are case sensitive.
author:
- Joseph Callen (@jcpowermac)
- Abhijeet Kasurde (@Akasurde)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_ovf_template.py b/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_ovf_template.py
index c74151904..f2a76bab2 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_ovf_template.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_ovf_template.py
@@ -15,7 +15,6 @@ module: vmware_content_deploy_ovf_template
short_description: Deploy Virtual Machine from ovf template stored in content library.
description:
- Module to deploy virtual machine from ovf template in content library.
-- All variables and VMware object names are case sensitive.
author:
- Lev Goncharv (@ultral)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_template.py b/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_template.py
index 3e0603373..31050a84a 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_template.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_content_deploy_template.py
@@ -19,7 +19,6 @@ description:
- Content Library feature is introduced in vSphere 6.0 version.
- vmtx templates feature is introduced in vSphere 67U1 and APIs for clone template from content library in 67U2.
- This module does not work with vSphere version older than 67U2.
-- All variables and VMware object names are case sensitive.
author:
- Pavan Bidkar (@pgbidkar)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_content_library_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_content_library_info.py
index 69cbb7cd0..abd3d0a44 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_content_library_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_content_library_info.py
@@ -18,7 +18,6 @@ description:
- Module to list the content libraries.
- Module to get information about specific content library.
- Content Library feature is introduced in vSphere 6.0 version, so this module is not supported in the earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Pavan Bidkar (@pgbidkar)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_content_library_manager.py b/ansible_collections/community/vmware/plugins/modules/vmware_content_library_manager.py
index 932b77b6d..38ba6ba42 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_content_library_manager.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_content_library_manager.py
@@ -17,7 +17,6 @@ short_description: Create, update and delete VMware content library
description:
- Module to manage VMware content Library
- Content Library feature is introduced in vSphere 6.0 version, so this module is not supported in the earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Pavan Bidkar (@pgbidkar)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster.py b/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster.py
index 7a7dccbaf..9922499b4 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster.py
@@ -16,7 +16,6 @@ module: vmware_datastore_cluster
short_description: Manage VMware vSphere datastore clusters
description:
- This module can be used to add and delete datastore cluster in given VMware environment.
- - All parameters and VMware object values are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
options:
@@ -43,7 +42,6 @@ options:
description:
- Destination folder, absolute path to place datastore cluster in.
- The folder should include the datacenter.
- - This parameter is case sensitive.
- You must specify either a O(folder) or a O(datacenter_name).
- 'Examples:'
- ' folder: /datacenter1/datastore'
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster_manager.py b/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster_manager.py
index b36b45af1..cfd7c0ea9 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster_manager.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_datastore_cluster_manager.py
@@ -16,7 +16,6 @@ module: vmware_datastore_cluster_manager
short_description: Manage VMware vSphere datastore cluster's members
description:
- This module can be used to add datastore in the datastore cluster.
- - All parameters and VMware object values are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_datastore_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_datastore_info.py
index 053c1bb1f..4c3fdc1e1 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_datastore_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_datastore_info.py
@@ -16,7 +16,6 @@ module: vmware_datastore_info
short_description: Gather info about datastores available in given vCenter
description:
- This module can be used to gather information about datastores in VMWare infrastructure.
- - All values and VMware object names are case sensitive.
author:
- Tim Rightnour (@garbled1)
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_deploy_ovf.py b/ansible_collections/community/vmware/plugins/modules/vmware_deploy_ovf.py
index 06ca29f74..da59cda4d 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_deploy_ovf.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_deploy_ovf.py
@@ -36,14 +36,12 @@ options:
- Cluster to deploy to.
- This is a required parameter, if O(esxi_hostname) is not set and O(hostname) is set to the vCenter server.
- O(esxi_hostname) and O(cluster) are mutually exclusive parameters.
- - This parameter is case sensitive.
type: str
esxi_hostname:
description:
- The ESXi hostname where the virtual machine will run.
- This is a required parameter, if O(cluster) is not set and O(hostname) is set to the vCenter server.
- O(esxi_hostname) and O(cluster) are mutually exclusive parameters.
- - This parameter is case sensitive.
type: str
datastore:
default: datastore1
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_dvswitch.py b/ansible_collections/community/vmware/plugins/modules/vmware_dvswitch.py
index 604385568..4ab0d4c07 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_dvswitch.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_dvswitch.py
@@ -167,7 +167,6 @@ options:
description:
- Destination folder, absolute path to place dvswitch in.
- The folder should include the datacenter.
- - This parameter is case sensitive.
- Required if O(datacenter) is not provided.
- Mutually exclusive with O(datacenter) parameter.
- 'Examples:'
@@ -195,6 +194,13 @@ options:
type: int
description: Identifies the information related to the switch.
default: 0
+ switch_ip:
+ type: str
+ description:
+ - Assign an IP address to see the distributed switch as a single network device in the NetFlow collector.
+ - This is instead of as multiple devices corresponding to each host.
+ - In an IPv6 environment, the ESXi hosts ignore the switch IP address.
+ version_added: '4.3.0'
active_flow_timeout:
type: int
description: The time, in seconds, to wait before sending information after the flow is initiated.
@@ -268,6 +274,7 @@ EXAMPLES = r'''
collector_ip: 192.168.10.50
collector_port: 50034
observation_domain_id: 0
+ switch_ip: 192.168.10.40
active_flow_timeout: 60
idle_flow_timeout: 15
sampling_rate: 4096
@@ -306,6 +313,7 @@ result:
"net_flow_collector_ip": "192.168.10.50",
"net_flow_collector_port": 50034,
"net_flow_observation_domain_id": 0,
+ "net_flow_switch_ip": "192.168.10.40",
"net_flow_active_flow_timeout": 60,
"net_flow_idle_flow_timeout": 15,
"net_flow_sampling_rate": 4096,
@@ -393,6 +401,7 @@ class VMwareDvSwitch(PyVmomi):
self.netFlow_collector_ip = self.module.params['net_flow'].get('collector_ip') or None
self.netFlow_collector_port = self.module.params['net_flow'].get('collector_port')
self.netFlow_observation_domain_id = self.module.params['net_flow'].get('observation_domain_id')
+ self.netFlow_switch_ip = self.module.params['net_flow'].get('switch_ip')
self.netFlow_active_flow_timeout = self.module.params['net_flow'].get('active_flow_timeout')
self.netFlow_idle_flow_timeout = self.module.params['net_flow'].get('idle_flow_timeout')
self.netFlow_sampling_rate = self.module.params['net_flow'].get('sampling_rate')
@@ -529,11 +538,13 @@ class VMwareDvSwitch(PyVmomi):
results['net_flow_idle_flow_timeout'] = self.netFlow_idle_flow_timeout
results['net_flow_sampling_rate'] = self.netFlow_sampling_rate
results['net_flow_internal_flows_only'] = self.netFlow_internal_flows_only
+ results['net_flow_switch_ip'] = self.netFlow_switch_ip
result = self.check_netFlow_config()
- changed_netFlow = result[1]
+ changed_netFlow = result[2]
if changed_netFlow:
spec.ipfixConfig = result[0]
+ spec.switchIpAddress = result[1]
if changed_multicast or changed_network_policy or changed_netFlow:
self.update_dvs_config(self.dvs, spec)
@@ -663,15 +674,22 @@ class VMwareDvSwitch(PyVmomi):
def check_netFlow_config(self):
"""Check NetFlow config"""
changed = changed_collectorIpAddress = changed_collectorPort = changed_observationDomainId = \
- changed_activeFlowTimeout = changed_idleFlowTimeout = changed_samplingRate = changed_internalFlowsOnly = False
+ changed_activeFlowTimeout = changed_idleFlowTimeout = changed_samplingRate = changed_internalFlowsOnly = \
+ changed_switchIpAddress = False
collectorIpAddress_previous = collectorPort_previous = observationDomainId_previous = activeFlowTimeout_previous = \
- idleFlowTimeout_previous = samplingRate_previous = internalFlowsOnly_previous = None
+ idleFlowTimeout_previous = samplingRate_previous = internalFlowsOnly_previous = switchIpAddress_previous = None
current_config = self.dvs.config.ipfixConfig
if current_config is None:
new_config = vim.dvs.VmwareDistributedVirtualSwitch.IpfixConfig()
else:
new_config = current_config
+ current_switchIpAddress = self.dvs.config.switchIpAddress
+ if current_switchIpAddress is None:
+ new_config_spec = vim.dvs.VmwareDistributedVirtualSwitch.ConfigSpec()
+ new_switchIpAddress = new_config_spec.switchIpAddress
+ else:
+ new_switchIpAddress = current_switchIpAddress
if self.netFlow_collector_ip is not None:
if current_config.collectorIpAddress != self.netFlow_collector_ip:
@@ -702,11 +720,16 @@ class VMwareDvSwitch(PyVmomi):
changed = changed_internalFlowsOnly = True
internalFlowsOnly_previous = current_config.internalFlowsOnly
new_config.internalFlowsOnly = self.netFlow_internal_flows_only
+ if self.netFlow_switch_ip is not None and current_switchIpAddress != self.netFlow_switch_ip:
+ changed = changed_switchIpAddress = True
+ switchIpAddress_previous = current_switchIpAddress
+ new_switchIpAddress = self.netFlow_switch_ip
- return (new_config, changed, changed_collectorIpAddress, collectorIpAddress_previous,
+ return (new_config, new_switchIpAddress, changed, changed_collectorIpAddress, collectorIpAddress_previous,
changed_collectorPort, collectorPort_previous, changed_observationDomainId, observationDomainId_previous,
changed_activeFlowTimeout, activeFlowTimeout_previous, changed_idleFlowTimeout, idleFlowTimeout_previous,
- changed_samplingRate, samplingRate_previous, changed_internalFlowsOnly, internalFlowsOnly_previous)
+ changed_samplingRate, samplingRate_previous, changed_internalFlowsOnly, internalFlowsOnly_previous,
+ changed_switchIpAddress, switchIpAddress_previous)
def exit_unchanged(self):
"""Exit with status message"""
@@ -905,10 +928,12 @@ class VMwareDvSwitch(PyVmomi):
results['net_flow_idle_flow_timeout'] = self.netFlow_idle_flow_timeout
results['net_flow_sampling_rate'] = self.netFlow_sampling_rate
results['net_flow_internal_flows_only'] = self.netFlow_internal_flows_only
- (ipfixConfig, changed_netFlow, changed_collectorIpAddress, collectorIpAddress_previous,
- changed_collectorPort, collectorPort_previous, changed_observationDomainId, observationDomainId_previous,
- changed_activeFlowTimeout, activeFlowTimeout_previous, changed_idleFlowTimeout, idleFlowTimeout_previous,
- changed_samplingRate, samplingRate_previous, changed_internalFlowsOnly, internalFlowsOnly_previous) = self.check_netFlow_config()
+ results['net_flow_switch_ip'] = self.netFlow_switch_ip
+
+ (ipfixConfig, switchIpAddress_netFlow, changed_netFlow, changed_collectorIpAddress, collectorIpAddress_previous,
+ changed_collectorPort, collectorPort_previous, changed_observationDomainId, observationDomainId_previous, changed_activeFlowTimeout,
+ activeFlowTimeout_previous, changed_idleFlowTimeout, idleFlowTimeout_previous, changed_samplingRate, samplingRate_previous,
+ changed_internalFlowsOnly, internalFlowsOnly_previous, changed_switchIpAddress, switchIpAddress_previous) = self.check_netFlow_config()
if changed_netFlow:
changed = changed_settings = True
changed_list.append("netFlow")
@@ -926,8 +951,11 @@ class VMwareDvSwitch(PyVmomi):
results['net_flow_sampling_rate_previous'] = samplingRate_previous
if changed_internalFlowsOnly:
results['net_flow_internal_flows_only_previous'] = internalFlowsOnly_previous
+ if changed_switchIpAddress:
+ results['net_flow_switch_ip_previous'] = switchIpAddress_previous
config_spec.ipfixConfig = ipfixConfig
+ config_spec.switchIpAddress = switchIpAddress_netFlow
if changed:
if self.module.check_mode:
@@ -1020,6 +1048,7 @@ def main():
collector_ip=dict(type='str'),
collector_port=dict(type='int', default=0),
observation_domain_id=dict(type='int', default=0),
+ switch_ip=dict(type='str'),
active_flow_timeout=dict(type='int', default=60),
idle_flow_timeout=dict(type='int', default=15),
sampling_rate=dict(type='int', default=4096),
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_export_ovf.py b/ansible_collections/community/vmware/plugins/modules/vmware_export_ovf.py
index 6ea440a4e..1c40cdfc3 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_export_ovf.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_export_ovf.py
@@ -39,13 +39,11 @@ options:
default: ha-datacenter
description:
- Datacenter name of the virtual machine to export.
- - This parameter is case sensitive.
type: str
folder:
description:
- Destination folder, absolute path to find the specified guest.
- The folder should include the datacenter. ESX datacenter is ha-datacenter.
- - This parameter is case sensitive.
- 'If multiple machines are found with same name, this parameter is used to identify'
- 'Examples:'
- ' folder: /ha-datacenter/vm'
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest.py
index 1f5a0a818..eb3923038 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest.py
@@ -64,7 +64,6 @@ options:
identify uniqueness of the virtual machine.
- This parameter is required, if O(state=poweredon), O(state=powered-on), O(state=poweredoff), O(state=powered-off),
O(state=present), O(state=restarted), O(state=suspended) and virtual machine does not exists.
- - This parameter is case sensitive.
type: str
name_match:
description:
@@ -89,7 +88,6 @@ options:
- Template or existing virtual machine used to create new virtual machine.
- If this value is not set, virtual machine is created without using a template.
- If the virtual machine already exists, this parameter will be ignored.
- - This parameter is case sensitive.
- From version 2.8 onwards, absolute path to virtual machine or template can be used.
aliases: [ 'template_src' ]
type: str
@@ -107,7 +105,6 @@ options:
description:
- Destination folder, absolute path to find an existing guest or create the new guest.
- "The folder should include the datacenter. ESXi's datacenter is ha-datacenter."
- - This parameter is case sensitive.
- 'If multiple machines are found with same name, this parameter is used to identify'
- 'uniqueness of the virtual machine.'
- 'Examples:'
@@ -126,7 +123,6 @@ options:
default: {}
description:
- "Manage virtual machine's hardware attributes."
- - All parameters case sensitive.
suboptions:
hotadd_cpu:
type: bool
@@ -243,7 +239,6 @@ options:
default: {}
description:
- Manage virtual machine encryption settings
- - All parameters case sensitive.
version_added: '3.9.0'
suboptions:
encrypted_vmotion:
@@ -258,7 +253,6 @@ options:
type: str
description:
- Set the guest ID.
- - This parameter is case sensitive.
- This field is required when creating a virtual machine, not required when creating from the template.
- >
Valid values are referenced here:
@@ -266,7 +260,6 @@ options:
disk:
description:
- A list of disks to add.
- - This parameter is case sensitive.
- Shrinking disks is not supported.
- Removing existing disks of the virtual machine is not supported.
- 'Attributes O(disk.controller_type), O(disk.controller_number), O(disk.unit_number) are used to configure multiple types of disk
@@ -419,7 +412,6 @@ options:
resource_pool:
description:
- Use the given resource pool for virtual machine operation.
- - This parameter is case sensitive.
- Resource pool should be child of the selected host parent.
- When not specified I(Resources) is taken as default value.
type: str
@@ -459,7 +451,6 @@ options:
snapshot_src:
description:
- Name of the existing snapshot to use to create a clone of a virtual machine.
- - This parameter is case sensitive.
- While creating linked clone using O(linked_clone) parameter, this parameter is required.
type: str
linked_clone:
@@ -485,7 +476,6 @@ options:
datacenter:
description:
- Destination datacenter for the deploy operation.
- - This parameter is case sensitive.
default: ha-datacenter
type: str
cluster:
@@ -493,14 +483,12 @@ options:
- The cluster name where the virtual machine will run.
- This is a required parameter, if O(esxi_hostname) is not set.
- O(esxi_hostname) and O(cluster) are mutually exclusive parameters.
- - This parameter is case sensitive.
type: str
esxi_hostname:
description:
- The ESXi hostname where the virtual machine will run.
- This is a required parameter, if O(cluster) is not set.
- O(esxi_hostname) and O(cluster) are mutually exclusive parameters.
- - This parameter is case sensitive.
type: str
advanced_settings:
description:
@@ -527,10 +515,9 @@ options:
description:
- A list of networks (in the order of the NICs).
- Removing NICs is not allowed, while reconfiguring the virtual machine.
- - All parameters and VMware object names are case sensitive.
- The I(type), I(ip), I(netmask), I(gateway), I(domain), I(dns_servers) options don't set to a guest when creating a blank new virtual machine.
They are set by the customization via vmware-tools.
- If you want to set the value of the options to a guest, you need to clone from a template with installed OS and vmware-tools(also Perl when Linux).
+ If you want to set the value of the options to a guest, you need to clone from a template with installed OS and vmware-tools (also Perl when Linux).
type: list
default: []
elements: dict
@@ -648,7 +635,6 @@ options:
- Not all operating systems are supported for customization with respective vCenter version,
please check VMware documentation for respective OS customization.
- For supported customization operating system matrix, (see U(http://partnerweb.vmware.com/programs/guestOS/guest-os-customization-matrix.pdf))
- - All parameters and VMware object names are case sensitive.
- Linux based OSes requires Perl package to be installed for OS customizations.
suboptions:
existing_vm:
@@ -747,7 +733,7 @@ options:
orgname:
type: str
description:
- - Organisation name.
+ - Organization name.
- Specific to Windows customization.
- If unset, "ACME" will be used as a fall-back.
password:
@@ -797,7 +783,6 @@ options:
customization_spec:
description:
- Unique name identifying the requested customization specification.
- - This parameter is case sensitive.
- If set, then overrides O(customization) parameter values.
type: str
datastore:
@@ -2670,6 +2655,7 @@ class PyVmomiHelper(PyVmomi):
diskspec.device = disks[disk_index]
else:
diskspec = self.device_helper.create_hard_disk(scsi_ctl, disk_index)
+ diskspec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
disk_modified = True
# increment index for next disk search
@@ -2698,11 +2684,10 @@ class PyVmomiHelper(PyVmomi):
if expected_disk_spec['filename']:
self.add_existing_vmdk(vm_obj, expected_disk_spec, diskspec, scsi_ctl)
continue
- if vm_obj is None or self.params['template']:
- # We are creating new VM or from Template
- # Only create virtual device if not backed by vmdk in original template
- if diskspec.device.backing.fileName == '':
- diskspec.fileOperation = vim.vm.device.VirtualDeviceSpec.FileOperation.create
+
+ # Only create virtual device if not backed by vmdk in original template
+ if diskspec.device.backing.fileName == '':
+ diskspec.fileOperation = vim.vm.device.VirtualDeviceSpec.FileOperation.create
# which datastore?
if expected_disk_spec.get('datastore'):
@@ -2977,6 +2962,14 @@ class PyVmomiHelper(PyVmomi):
vm_obj = self.get_vm_or_template(template_name=self.params['template'])
if vm_obj is None:
self.module.fail_json(msg="Could not find a template named %(template)s" % self.params)
+ if self.params['guest_id'] is not None and vm_obj.summary.config.guestId is not None and self.params['guest_id'] != vm_obj.summary.config.guestId:
+ details = {
+ 'vm_guest_id': self.params['guest_id'],
+ 'template_guest_id': vm_obj.summary.config.guestId,
+ }
+ self.module.fail_json(msg="Could not create vm from template with different guest_ids",
+ details=details)
+
else:
vm_obj = None
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_boot_manager.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_boot_manager.py
index ad89e6aed..2700ff4ba 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_boot_manager.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_boot_manager.py
@@ -53,7 +53,6 @@ options:
elements: str
boot_hdd_name:
description:
- - Name of disk to be set as boot disk, which is case sensitive, e.g., 'Hard disk 1'.
- This parameter is optional, if not set, will use the first virtual disk found in VM device list.
type: str
version_added: '3.2.0'
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_controller.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_controller.py
index df92a9a05..7084d9a21 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_controller.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_controller.py
@@ -16,7 +16,6 @@ module: vmware_guest_controller
short_description: Manage disk or USB controllers related to virtual machine in given vCenter infrastructure
description:
- This module can be used to add, remove disk controllers or USB controllers belonging to given virtual machine.
- - All parameters and VMware object names are case sensitive.
author:
- Diane Wang (@Tomorrow9) <dianew@vmware.com>
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_cross_vc_clone.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_cross_vc_clone.py
index 8d7c4abac..748948c5e 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_cross_vc_clone.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_cross_vc_clone.py
@@ -83,7 +83,6 @@ options:
destination_vm_folder:
description:
- Destination folder, absolute path to deploy the cloned vm.
- - This parameter is case sensitive.
- 'Examples:'
- ' folder: vm'
- ' folder: ha-datacenter/vm'
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_customization_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_customization_info.py
index 3f97c533b..5fd637d36 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_customization_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_customization_info.py
@@ -16,7 +16,6 @@ module: vmware_guest_customization_info
short_description: Gather info about VM customization specifications
description:
- This module can be used to gather information about customization specifications.
- - All parameters and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk.py
index 56251b444..20ebc14ca 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk.py
@@ -16,7 +16,6 @@ module: vmware_guest_disk
short_description: Manage disks related to virtual machine in given vCenter infrastructure
description:
- This module can be used to add, remove and update disks belonging to given virtual machine.
- - All parameters and VMware object names are case sensitive.
- This module is destructive in nature, please read documentation carefully before proceeding.
- Be careful while removing disk specified as this may lead to data loss.
author:
@@ -67,7 +66,6 @@ options:
description:
- A list of disks to add or remove.
- The virtual disk related information is provided using this list.
- - All values and parameters are case sensitive.
suboptions:
size:
description:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk_info.py
index 06c5d3565..2be78c64b 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_disk_info.py
@@ -17,7 +17,6 @@ module: vmware_guest_disk_info
short_description: Gather info about disks of given virtual machine
description:
- This module can be used to gather information about disks belonging to given virtual machine.
- - All parameters and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde) <akasurde@redhat.com>
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_instant_clone.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_instant_clone.py
index 2b824338c..3b8c17972 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_instant_clone.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_instant_clone.py
@@ -18,7 +18,6 @@ short_description: Instant Clone VM
description:
- This module can be used for Creating a powered-on Instant Clone of a virtual machine.
-- All variables and VMware object names are case sensitive.
- M(community.vmware.vmware_guest) module is needed for creating a VM with poweredon state which would be used as a parent VM.
- M(community.vmware.vmware_guest_powerstate) module is also needed to poweroff the instant cloned module.
- The powered off VM would in turn be deleted by again using M(community.vmware.vmware_guest) module.
@@ -75,7 +74,6 @@ options:
folder:
description:
- Destination folder, absolute path to deploy the cloned vm.
- - This parameter is case sensitive.
- 'Examples:'
- 'folder: ha-datacenter/vm'
- 'folder: /datacenter1/vm'
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_move.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_move.py
index 53f27adb3..2b7e4ae5a 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_move.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_move.py
@@ -49,7 +49,6 @@ options:
description:
- Absolute path to move an existing guest
- The dest_folder should include the datacenter. ESX's datacenter is ha-datacenter.
- - This parameter is case sensitive.
- 'Examples:'
- ' dest_folder: /ha-datacenter/vm'
- ' dest_folder: ha-datacenter/vm'
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_powerstate.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_powerstate.py
index aaff49d45..1391c6181 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_powerstate.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_powerstate.py
@@ -21,7 +21,6 @@ options:
datacenter:
description:
- The datacenter where the VM you'd like to operate the power.
- - This parameter is case sensitive.
default: ha-datacenter
type: str
state:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_register_operation.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_register_operation.py
index bd99f1ca4..6873b35d5 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_register_operation.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_register_operation.py
@@ -20,7 +20,6 @@ options:
datacenter:
description:
- Destination datacenter for the register/unregister operation.
- - This parameter is case sensitive.
type: str
default: ha-datacenter
cluster:
@@ -31,7 +30,6 @@ options:
description:
- Description folder, absolute path of the target folder.
- The folder should include the datacenter. ESX's datacenter is ha-datacenter.
- - This parameter is case sensitive.
- 'Examples:'
- ' folder: /ha-datacenter/vm'
- ' folder: ha-datacenter/vm'
@@ -53,7 +51,6 @@ options:
esxi_hostname:
description:
- The ESXi hostname where the virtual machine will run.
- - This parameter is case sensitive.
type: str
template:
description:
@@ -70,7 +67,6 @@ options:
resource_pool:
description:
- Specify a resource pool name to register VM.
- - This parameter is case sensitive.
- Resource pool should be child of the selected host parent.
type: str
state:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_screenshot.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_screenshot.py
index 7c71997c7..5ba4eb784 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_screenshot.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_screenshot.py
@@ -16,7 +16,6 @@ module: vmware_guest_screenshot
short_description: Create a screenshot of the Virtual Machine console.
description:
- This module is used to take screenshot of the given virtual machine when virtual machine is powered on.
- - All parameters and VMware object names are case sensitive.
author:
- Diane Wang (@Tomorrow9) <dianew@vmware.com>
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_sendkey.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_sendkey.py
index 8d1c56cff..5340a2da6 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_sendkey.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_sendkey.py
@@ -16,7 +16,6 @@ module: vmware_guest_sendkey
short_description: Send USB HID codes to the Virtual Machine's keyboard.
description:
- This module is used to send keystrokes to given virtual machine.
- - All parameters and VMware object names are case sensitive.
author:
- Diane Wang (@Tomorrow9) <dianew@vmware.com>
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_snapshot.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_snapshot.py
index da0cf5565..7d7dbfecd 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_snapshot.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_snapshot.py
@@ -16,7 +16,6 @@ module: vmware_guest_snapshot
short_description: Manages virtual machines snapshots in vCenter
description:
- This module can be used to create, delete and update snapshot(s) of the given virtual machine.
- - All parameters and VMware object names are case sensitive.
author:
- Loic Blot (@nerzhul) <loic.blot@unix-experience.fr>
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_storage_policy.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_storage_policy.py
index 2c855eac5..7ae239d85 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_storage_policy.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_storage_policy.py
@@ -69,14 +69,12 @@ options:
vm_home:
description:
- A storage profile policy to set on VM Home.
- - All values and parameters are case sensitive.
- At least one of O(disk) or O(vm_home) are required parameters.
required: false
type: str
disk:
description:
- A list of disks with storage profile policies to enforce.
- - All values and parameters are case sensitive.
- At least one of O(disk) and O(vm_home) are required parameters.
required: false
type: list
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_tools_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_tools_info.py
index e707cc82c..e01c25753 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_tools_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_tools_info.py
@@ -143,13 +143,18 @@ class PyVmomiHelper(PyVmomi):
vm_ipaddress=self.current_vm_obj.summary.guest.ipAddress,
vm_tools_running_status=self.current_vm_obj.summary.guest.toolsRunningStatus,
vm_tools_install_status=self.current_vm_obj.summary.guest.toolsStatus,
- vm_tools_version_status=self.current_vm_obj.summary.guest.toolsVersionStatus,
+ vm_tools_version_status=self.current_vm_obj.summary.guest.toolsVersionStatus2,
vm_tools_install_type=self.current_vm_obj.config.tools.toolsInstallType,
vm_tools_version=self.current_vm_obj.config.tools.toolsVersion,
vm_tools_upgrade_policy=self.current_vm_obj.config.tools.toolsUpgradePolicy,
vm_tools_last_install_count=self.current_vm_obj.config.tools.lastInstallInfo.counter,
)
+ self.module.deprecate(
+ msg="The API providing vm_tools_install_status has been deprecated by VMware; use vm_tools_running_status / vm_tools_version_status instead",
+ version="5.0.0",
+ collection_name="community.vmware"
+ )
return {'changed': False, 'failed': False, 'vmtools_info': vmtools_info}
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_tpm.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_tpm.py
index 2b0178474..1e60caf2c 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_tpm.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_tpm.py
@@ -52,7 +52,6 @@ options:
datacenter:
description:
- The vCenter datacenter name used to get specified cluster or host.
- - This parameter is case sensitive.
type: str
required: true
state:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu.py
index 1c8557681..b3ecd5244 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu.py
@@ -16,7 +16,6 @@ module: vmware_guest_vgpu
short_description: Modify vGPU video card profile of the specified virtual machine in the given vCenter infrastructure
description:
- This module is used to reconfigure vGPU card profile of the given virtual machine.
- - All parameters and VMware object names are case sensitive.
- VM must be power off M(community.vmware.vmware_guest_powerstate) module can perform that task.
author:
- Mohamed Alibi (@Medalibi)
@@ -57,7 +56,6 @@ options:
default: ha-datacenter
description:
- The datacenter name to which virtual machine belongs to.
- - This parameter is case sensitive.
type: str
state:
default: present
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu_info.py
index 090c71588..1bdeae6f2 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_vgpu_info.py
@@ -17,7 +17,6 @@ version_added: '3.3.0'
short_description: Gather information about vGPU profiles of the specified virtual machine in the given vCenter infrastructure
description:
- This module is used to gather metadata about vGPU profiles of the given virtual machine.
- - All parameters and VMware object names are case sensitive.
author:
- Jared Priddy (@jdptechnc)
options:
@@ -56,7 +55,6 @@ options:
default: ha-datacenter
description:
- The datacenter name to which virtual machine belongs to.
- - This parameter is case sensitive.
type: str
use_instance_uuid:
description:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_guest_video.py b/ansible_collections/community/vmware/plugins/modules/vmware_guest_video.py
index de5e4c628..62c3ad9c7 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_guest_video.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_guest_video.py
@@ -16,7 +16,6 @@ module: vmware_guest_video
short_description: Modify video card configurations of specified virtual machine in given vCenter infrastructure
description:
- This module is used to reconfigure video card settings of given virtual machine.
- - All parameters and VMware object names are case sensitive.
author:
- Diane Wang (@Tomorrow9) <dianew@vmware.com>
options:
@@ -55,7 +54,6 @@ options:
default: ha-datacenter
description:
- The datacenter name to which virtual machine belongs to.
- - This parameter is case sensitive.
type: str
gather_video_facts:
description:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_host_datastore.py b/ansible_collections/community/vmware/plugins/modules/vmware_host_datastore.py
index db8b9be91..fa41c0ade 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_host_datastore.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_host_datastore.py
@@ -18,7 +18,6 @@ description:
- This module can be used to mount/umount datastore on ESXi host.
- This module only supports NFS (NFS v3 or NFS v4.1) and VMFS datastores.
- For VMFS datastore, available device must already be connected on ESXi host.
-- All parameters and VMware object names are case sensitive.
author:
- Ludovic Rivallain (@lrivallain) <ludovic.rivallain@gmail.com>
- Christian Kotte (@ckotte) <christian.kotte@gmx.de>
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_host_dns_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_host_dns_info.py
index bee8c58eb..b03c25d42 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_host_dns_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_host_dns_info.py
@@ -15,7 +15,6 @@ module: vmware_host_dns_info
short_description: Gathers info about an ESXi host's DNS configuration information
description:
- This module can be used to gather information about an ESXi host's DNS configuration information when ESXi hostname or Cluster name is given.
-- All parameters and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
options:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown.py b/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown.py
index 023f116b7..a5b1da457 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown.py
@@ -15,7 +15,6 @@ module: vmware_host_lockdown
short_description: Manage administrator permission for the local administrative account for the ESXi host
description:
- This module can be used to manage administrator permission for the local administrative account for the host when ESXi hostname is given.
-- All parameters and VMware objects values are case sensitive.
- This module is destructive as administrator permission are managed using APIs used, please read options carefully and proceed.
- Please specify O(hostname) as vCenter IP or hostname only, as lockdown operations are not possible from standalone ESXi server.
author:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown_exceptions.py b/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown_exceptions.py
index 892daeb39..709243ee0 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown_exceptions.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_host_lockdown_exceptions.py
@@ -16,7 +16,6 @@ version_added: '3.1.0'
short_description: Manage Lockdown Mode Exception Users
description:
- This module can be used to manage Lockdown Mode Exception Users.
-- All parameters and VMware objects values are case sensitive.
- Please specify O(hostname) as vCenter IP or hostname only, as lockdown operations are not possible from standalone ESXi server.
author:
- Mario Lenz (@mariolenz)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_host_scanhba.py b/ansible_collections/community/vmware/plugins/modules/vmware_host_scanhba.py
index 0087c8a2c..54addd438 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_host_scanhba.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_host_scanhba.py
@@ -18,7 +18,6 @@ description:
- This module can force a rescan of the hosts HBA subsystem which is needed when wanting to mount a new datastore.
- You could use this before using M(community.vmware.vmware_host_datastore) to mount a new datastore to ensure your device/volume is ready.
- You can also optionally force a Refresh of the Storage System in vCenter/ESXi Web Client.
-- All parameters and VMware object names are case sensitive.
- You can supply an esxi_hostname or a cluster_name
author:
- Michael Eaton (@michaeldeaton)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_local_user_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_local_user_info.py
index bd4ef522f..d5bf17e35 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_local_user_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_local_user_info.py
@@ -16,7 +16,6 @@ module: vmware_local_user_info
short_description: Gather info about users on the given ESXi host
description:
- This module can be used to gather information about users present on the given ESXi host system in VMware infrastructure.
- - All variables and VMware object names are case sensitive.
- User must hold the 'Authorization.ModifyPermissions' privilege to invoke this module.
author:
- Abhijeet Kasurde (@Akasurde)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_object_rename.py b/ansible_collections/community/vmware/plugins/modules/vmware_object_rename.py
index 8f5cbb752..6b5be8471 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_object_rename.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_object_rename.py
@@ -15,7 +15,6 @@ module: vmware_object_rename
short_description: Renames VMware objects
description:
- This module can be used to rename VMware objects.
-- All variables and VMware object names are case sensitive.
- Renaming Host and Network is not supported by VMware APIs.
author:
- Abhijeet Kasurde (@Akasurde)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_tag.py b/ansible_collections/community/vmware/plugins/modules/vmware_tag.py
index c37f310a7..fdb33c811 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_tag.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_tag.py
@@ -17,7 +17,6 @@ short_description: Manage VMware tags
description:
- This module can be used to create / delete / update VMware tags.
- Tag feature is introduced in vSphere 6 version, so this module is not supported in the earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_tag_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_tag_info.py
index 25132efa8..fcc545576 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_tag_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_tag_info.py
@@ -17,7 +17,6 @@ short_description: Manage VMware tag info
description:
- This module can be used to collect information about VMware tags.
- Tag feature is introduced in vSphere 6 version, so this module is not supported in the earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_tag_manager.py b/ansible_collections/community/vmware/plugins/modules/vmware_tag_manager.py
index 109188b45..d78a5a3dc 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_tag_manager.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_tag_manager.py
@@ -17,7 +17,6 @@ short_description: Manage association of VMware tags with VMware objects
description:
- This module can be used to assign / remove VMware tags from the given VMware objects.
- Tag feature is introduced in vSphere 6 version, so this module is not supported in the earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Abhijeet Kasurde (@Akasurde)
- Frederic Van Reet (@GBrawl)
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_vc_infraprofile_info.py b/ansible_collections/community/vmware/plugins/modules/vmware_vc_infraprofile_info.py
index a4312e62e..af5594416 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_vc_infraprofile_info.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_vc_infraprofile_info.py
@@ -17,7 +17,6 @@ short_description: List and Export VMware vCenter infra profile configs.
description:
- Module to manage VMware vCenter infra profile configs.
- vCenter infra profile Library feature is introduced in vSphere 7.0 version, so this module is not supported in the earlier versions of vSphere.
-- All variables and VMware object names are case sensitive.
author:
- Naveenkumar G P (@ngp)
requirements:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_vm_config_option.py b/ansible_collections/community/vmware/plugins/modules/vmware_vm_config_option.py
index fd1e67837..9201d2724 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_vm_config_option.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_vm_config_option.py
@@ -26,7 +26,6 @@ options:
datacenter:
description:
- The datacenter name used to get specified cluster or host.
- - This parameter is case sensitive.
default: ha-datacenter
type: str
cluster_name:
diff --git a/ansible_collections/community/vmware/plugins/modules/vmware_vm_shell.py b/ansible_collections/community/vmware/plugins/modules/vmware_vm_shell.py
index 76f1d5308..51d1230eb 100644
--- a/ansible_collections/community/vmware/plugins/modules/vmware_vm_shell.py
+++ b/ansible_collections/community/vmware/plugins/modules/vmware_vm_shell.py
@@ -47,6 +47,7 @@ options:
- ' folder: /folder1/datacenter1/vm'
- ' folder: folder1/datacenter1/vm'
- ' folder: /folder1/datacenter1/vm/folder2'
+ - Required if O(vm_id_type=inventory_path)
type: str
vm_id:
description:
diff --git a/ansible_collections/community/vmware/scripts/inventory/vmware_inventory.py b/ansible_collections/community/vmware/scripts/inventory/vmware_inventory.py
index 618e09e20..c265a2620 100644
--- a/ansible_collections/community/vmware/scripts/inventory/vmware_inventory.py
+++ b/ansible_collections/community/vmware/scripts/inventory/vmware_inventory.py
@@ -283,7 +283,7 @@ class VMWareInventory(object):
self.maxlevel = int(config.get('vmware', 'max_object_level'))
self.debugl('max object level is %s' % self.maxlevel)
self.lowerkeys = config.get('vmware', 'lower_var_keys')
- if type(self.lowerkeys) != bool:
+ if not isinstance(self.lowerkeys, bool):
if str(self.lowerkeys).lower() in ['yes', 'true', '1']:
self.lowerkeys = True
else:
diff --git a/ansible_collections/community/vmware/tests/sanity/ignore-2.18.txt b/ansible_collections/community/vmware/tests/sanity/ignore-2.18.txt
new file mode 100644
index 000000000..4a0d49a7d
--- /dev/null
+++ b/ansible_collections/community/vmware/tests/sanity/ignore-2.18.txt
@@ -0,0 +1,4 @@
+plugins/modules/vmware_deploy_ovf.py replace-urlopen!skip
+plugins/modules/vmware_deploy_ovf.py use-argspec-type-path!skip
+scripts/inventory/vmware_inventory.py pep8!skip
+tests/unit/mock/loader.py pep8!skip
diff --git a/ansible_collections/community/vmware/tests/unit/mock/loader.py b/ansible_collections/community/vmware/tests/unit/mock/loader.py
index e5dff78c1..edeac4526 100644
--- a/ansible_collections/community/vmware/tests/unit/mock/loader.py
+++ b/ansible_collections/community/vmware/tests/unit/mock/loader.py
@@ -30,7 +30,7 @@ class DictDataLoader(DataLoader):
def __init__(self, file_mapping=None):
file_mapping = {} if file_mapping is None else file_mapping
- assert type(file_mapping) == dict
+ assert isinstance(file_mapping, dict)
super(DictDataLoader, self).__init__()
diff --git a/ansible_collections/containers/podman/CHANGELOG.rst b/ansible_collections/containers/podman/CHANGELOG.rst
index 7f94f59cc..84fa3621b 100644
--- a/ansible_collections/containers/podman/CHANGELOG.rst
+++ b/ansible_collections/containers/podman/CHANGELOG.rst
@@ -5,6 +5,58 @@ Ansible Podman modules and plugins Release Notes
.. contents:: Topics
+v1.13.0
+=======
+
+Release Summary
+---------------
+
+Quadlet support for Podman
+
+Major Changes
+-------------
+
+- Add quadlet support for Podman modules
+
+Bugfixes
+--------
+
+- Fix pod info for non-existant pods
+
+v1.12.1
+=======
+
+Release Summary
+---------------
+
+Support for Podman v5 and bugfixes
+
+Minor Changes
+-------------
+
+- CI - Fix rootfs test in CI
+- CI - add custom podman path to tasks
+- CI - add parametrized executables to tests
+- podman_container - Add pasta as default network mode after v5
+- podman_container_exec - Return data for podman exec module
+- podman_generate_systemd - Fix broken example for podman_generate_systemd (#708)
+- podman_login - Update podman_login.py
+- podman_play - Add support for kube yaml files with multi-documents (#724)
+- podman_play - Update the logic for deleting pods/containers in podman_play
+- podman_pod_info - handle return being list in Podman 5 (#713)
+
+Bugfixes
+--------
+
+- podman_container - Add check and fixed for v5 network diff
+- podman_container - Fix pasta networking idempotency for v5 (#728)
+- podman_container_exec - Remove unnecessary quotes in podman_container_exec module
+- podman_image_info - Fix wrong return data type in podman_image_info
+- podman_play - Fix kube play annotations
+- podman_pod - Fix broken info of pods in Podman v5
+- podman_pod - Fix pod for Podman v5
+- podman_pod - Fix podman pod v5 broken info issue
+
v1.12.0
=======
diff --git a/ansible_collections/containers/podman/FILES.json b/ansible_collections/containers/podman/FILES.json
index 717a994c3..ebc8fb138 100644
--- a/ansible_collections/containers/podman/FILES.json
+++ b/ansible_collections/containers/podman/FILES.json
@@ -8,101 +8,80 @@
"format": 1
},
{
- "name": "setup.py",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "85ef52c56819164efc5178d25aa03a432cdb8431ad0c99255802ce19a1719602",
- "format": 1
- },
- {
- "name": "test-requirements.txt",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "9b72b7289eba420f51eb614c54f609181bb26e96caef2abf06c02339a77d2e08",
+ "name": "docs",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "changelogs",
+ "name": "docs/_static",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "changelogs/config.yaml",
+ "name": "docs/_static/pygments.css",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "72cc16b684890f4595ab75ffdd6f80f5ae19bc84cbb2d82606bc840eb7842209",
+ "chksum_sha256": "6f6d5ca74e8fbc721d70c8db260ab4ac75b69316daa3854a4614d9f3b2ff0631",
"format": 1
},
{
- "name": "changelogs/changelog.yaml",
+ "name": "docs/_static/minus.png",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1bb58fab4d48702b87006c6ac9577c634e8f42aef65280dbca266caf6468d50b",
- "format": 1
- },
- {
- "name": "meta",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "chksum_sha256": "47e7fc50db3699f1ca41ce9a2ffa202c00c5d1d5180c55f62ba859b1bd6cc008",
"format": 1
},
{
- "name": "meta/runtime.yml",
+ "name": "docs/_static/documentation_options.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f07aa47b7583a6a8420798081029b8cdfb09cbf5564acff6f49b6c3237102618",
- "format": 1
- },
- {
- "name": "docs",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "chksum_sha256": "e2718b75af040caf95a8915192026ec541cc7ad4c73b0160b7c4c2f4564d7d4f",
"format": 1
},
{
- "name": "docs/_static",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "docs/_static/language_data.js",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "95b1d44e1ba5a3155d89f8427a3b2c981158f956bf48b9cdf0030265e8b7a609",
"format": 1
},
{
- "name": "docs/_static/custom.css",
+ "name": "docs/_static/underscore-1.13.1.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "39f23a6561786e3cb4e33e4a96562a1305a8b74c0d45dc215a64018692cd5d4c",
+ "chksum_sha256": "cc10f799cd0f6b65f95c4012445497e5ba3cb9f51964a9468940b27bde98b487",
"format": 1
},
{
- "name": "docs/_static/sphinx_highlight.js",
+ "name": "docs/_static/jquery-3.6.0.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0a20464b65797522de18421a7db1a0851a26aae6dd06b7109d442236313c27ee",
+ "chksum_sha256": "1fe2bb5390a75e5d61e72c107cab528fc3c29a837d69aab7d200e1dbb5dcd239",
"format": 1
},
{
- "name": "docs/_static/documentation_options.js",
+ "name": "docs/_static/alabaster.css",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e2718b75af040caf95a8915192026ec541cc7ad4c73b0160b7c4c2f4564d7d4f",
+ "chksum_sha256": "13f494414f5bca3551442ddf4ad0e42e2403a8757304c1b9787b18ef539a2eac",
"format": 1
},
{
- "name": "docs/_static/pygments.css",
+ "name": "docs/_static/custom.css",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f6d5ca74e8fbc721d70c8db260ab4ac75b69316daa3854a4614d9f3b2ff0631",
+ "chksum_sha256": "39f23a6561786e3cb4e33e4a96562a1305a8b74c0d45dc215a64018692cd5d4c",
"format": 1
},
{
- "name": "docs/_static/alabaster.css",
+ "name": "docs/_static/underscore-1.3.1.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13f494414f5bca3551442ddf4ad0e42e2403a8757304c1b9787b18ef539a2eac",
+ "chksum_sha256": "f808f0aa32fbe90fb9c9c846917faff3fdd4e236c284b76c02dd33753dc90177",
"format": 1
},
{
@@ -113,17 +92,17 @@
"format": 1
},
{
- "name": "docs/_static/jquery-3.6.0.js",
+ "name": "docs/_static/file.png",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1fe2bb5390a75e5d61e72c107cab528fc3c29a837d69aab7d200e1dbb5dcd239",
+ "chksum_sha256": "5c4bc9a16aebf38c4b950f59b8e501ca36495328cb9eb622218bce9064a35e3e",
"format": 1
},
{
- "name": "docs/_static/searchtools.js",
+ "name": "docs/_static/jquery-3.5.1.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b9facbcb36e5e15e409e2db42439fb8cbc1e43275e337a645bb3c76c3191b93",
+ "chksum_sha256": "416a3b2c3bf16d64f6b5b6d0f7b079df2267614dd6847fc2f3271b4409233c37",
"format": 1
},
{
@@ -134,24 +113,24 @@
"format": 1
},
{
- "name": "docs/_static/language_data.js",
+ "name": "docs/_static/basic.css",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95b1d44e1ba5a3155d89f8427a3b2c981158f956bf48b9cdf0030265e8b7a609",
+ "chksum_sha256": "9980fa28cbdcd8d6b437edcb1a911e0e2a788d7fa0dfe6ea25a302d824a3094d",
"format": 1
},
{
- "name": "docs/_static/underscore-1.3.1.js",
+ "name": "docs/_static/doctools.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f808f0aa32fbe90fb9c9c846917faff3fdd4e236c284b76c02dd33753dc90177",
+ "chksum_sha256": "3d62b81f63b0418a39a8f5a323203d88ddafc8c5226f86d311970025d86d7b6c",
"format": 1
},
{
- "name": "docs/_static/basic.css",
+ "name": "docs/_static/plus.png",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9980fa28cbdcd8d6b437edcb1a911e0e2a788d7fa0dfe6ea25a302d824a3094d",
+ "chksum_sha256": "54115199b96a130cba02147c47c0deb43dcc9b9f08b5162bba8642b34980ac63",
"format": 1
},
{
@@ -162,206 +141,206 @@
"format": 1
},
{
- "name": "docs/_static/jquery-3.5.1.js",
+ "name": "docs/_static/antsibull-minimal.css",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "416a3b2c3bf16d64f6b5b6d0f7b079df2267614dd6847fc2f3271b4409233c37",
+ "chksum_sha256": "dd914facd58095fed7317de336bdf32ac00ff3de539432463df397d2ae15a696",
"format": 1
},
{
- "name": "docs/_static/doctools.js",
+ "name": "docs/_static/sphinx_highlight.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3d62b81f63b0418a39a8f5a323203d88ddafc8c5226f86d311970025d86d7b6c",
+ "chksum_sha256": "0a20464b65797522de18421a7db1a0851a26aae6dd06b7109d442236313c27ee",
"format": 1
},
{
- "name": "docs/_static/underscore-1.13.1.js",
+ "name": "docs/_static/searchtools.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cc10f799cd0f6b65f95c4012445497e5ba3cb9f51964a9468940b27bde98b487",
+ "chksum_sha256": "5b9facbcb36e5e15e409e2db42439fb8cbc1e43275e337a645bb3c76c3191b93",
"format": 1
},
{
- "name": "docs/_static/plus.png",
+ "name": "docs/podman_secret_info_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "54115199b96a130cba02147c47c0deb43dcc9b9f08b5162bba8642b34980ac63",
+ "chksum_sha256": "afbe8b5e852d8ac13eda2acb5a4424bbe50e04775b182de9c73acdbd4e4572c3",
"format": 1
},
{
- "name": "docs/_static/antsibull-minimal.css",
+ "name": "docs/podman_prune_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dd914facd58095fed7317de336bdf32ac00ff3de539432463df397d2ae15a696",
+ "chksum_sha256": "52583bf414f29d8a289f7844bb87e870e438eb4c680fe6efe3b84ac9b24919cf",
"format": 1
},
{
- "name": "docs/_static/minus.png",
+ "name": "docs/podman_container_exec_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "47e7fc50db3699f1ca41ce9a2ffa202c00c5d1d5180c55f62ba859b1bd6cc008",
+ "chksum_sha256": "3c7a400e7e16df1d1904f5dad17d5358e90a95e8ae611072a7cc4b2fd19b0f70",
"format": 1
},
{
- "name": "docs/_static/file.png",
+ "name": "docs/podman_unshare_become.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c4bc9a16aebf38c4b950f59b8e501ca36495328cb9eb622218bce9064a35e3e",
+ "chksum_sha256": "6caccafc43ebbbeb0c043d2e8a2fa2c8736166a0f94a117514eed3be946685ec",
"format": 1
},
{
- "name": "docs/.nojekyll",
+ "name": "docs/objects.inv",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "chksum_sha256": "4e8f308bf4441db6759e6d8a1b54535cf24e77f1ecee4d66caf6b5582f79efa7",
"format": 1
},
{
- "name": "docs/podman_runlabel_module.html",
+ "name": "docs/podman_image_info_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd2c799ac88932287c4882a8eb6df2658a00db7555612154b0eca97045f11e73",
+ "chksum_sha256": "e8b61d10e778183647fd7b720d030addce99763e759ad1eb7daa14ece8b9913b",
"format": 1
},
{
- "name": "docs/podman_image_module.html",
+ "name": "docs/podman_secret_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad81d2bc548a343fbc3d4a3a05b1c33d2d68e25e508f2693a701e6f01dcf417b",
+ "chksum_sha256": "62e01ebdfbc9e2a163c747e013c5aa3ec7219b3bb260147a929080d445f0dbbd",
"format": 1
},
{
- "name": "docs/podman_container_exec_module.html",
+ "name": "docs/podman_network_info_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "883fc959057af7f386aa0660220cab0747ecac6eb6d407b94d2df2dc35c74a7e",
+ "chksum_sha256": "b5763fa0a99790ef332056f61dc499b455de1a37349d006289427922aae21395",
"format": 1
},
{
- "name": "docs/podman_container_info_module.html",
+ "name": "docs/podman_image_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1586177c16bee40047743f246310abd28bb7b51abd946c720b8470a22b5bd749",
+ "chksum_sha256": "9b6b1b68675c355b8306fae41e7a399d1c203028b18aab10e2515c710f4a9a13",
"format": 1
},
{
- "name": "docs/podman_play_module.html",
+ "name": "docs/podman_volume_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "24e23f870e9fe67c6ef322ec6b2ccfae6bc050c15bbf8dda518db96f144326db",
+ "chksum_sha256": "9eb4b8acf3aecbd24f06e73c0b9d52370377032f5884327f4bb7de0483d2db2f",
"format": 1
},
{
- "name": "docs/podman_containers_module.html",
+ "name": "docs/podman_load_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1178735f6fadfbf2d7cbd4985b604aaa430546edafa114af5e3d20dc04e5460a",
+ "chksum_sha256": "4532a90f7cba943ba79959f0cd05af85c790bdd51f30888de95861e60ab77bd0",
"format": 1
},
{
- "name": "docs/podman_pod_info_module.html",
+ "name": "docs/podman_runlabel_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f2ffd379e0f542e651766415c6287f569f2dd42ee5a3e9933684bc250b0d11fd",
+ "chksum_sha256": "4089cfd62f3250303175edaac0e1b9ed017e7dcfa8ebd11c334862e5e4be6324",
"format": 1
},
{
- "name": "docs/podman_login_info_module.html",
+ "name": "docs/podman_play_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ce4892819aba341084ce055cc05d9bb5bb613e266f3efe4a2052da2aa20094ca",
+ "chksum_sha256": "ef65885a17acc3bfcabad46054472594f0fb7cc3968e8d25746bff6bf99722da",
"format": 1
},
{
- "name": "docs/buildah_connection.html",
+ "name": "docs/podman_container_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "881d9972167f058e968516dbc4fe01bc1cea54a16fb0e6f9de03addf58ca7fc8",
+ "chksum_sha256": "538fd60bc9d58b266c163ed7ac7bcf3305dc787935222f7f2c4c9e112a4cf30b",
"format": 1
},
{
- "name": "docs/podman_import_module.html",
+ "name": "docs/podman_containers_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b288cf15269fc040df5d04a3ae7e96c08635006c9322b53c1675e5c6d44ee81",
+ "chksum_sha256": "c929fa197c9e07d10d05101e6472dcdef409ced23a50da5918ec4841a4e50d08",
"format": 1
},
{
- "name": "docs/podman_unshare_become.html",
+ "name": "docs/index.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "79fa1444a95d81dc3a7dbdd1c4796fdb14e277e787b96b7229a3fe0561c862d1",
+ "chksum_sha256": "a05292a1b3cd446a6ea3667d7519b521dc50c7efc04fd3b1af4d42dc219fe37d",
"format": 1
},
{
- "name": "docs/podman_volume_module.html",
+ "name": "docs/podman_logout_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cf2a4a5caff2f79ccc6e51d9bdfee1484b24523fd31b9f6a058bd2bf3f741470",
+ "chksum_sha256": "4d81428e5df90da2490fd620e3af3b1a1ddd347b086cee77dff057a580267002",
"format": 1
},
{
"name": "docs/podman_save_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c7ce5ddbc8c5d95d67fb1d7d90d6393f772a256f1f76a7b71062e4f9f177c847",
+ "chksum_sha256": "5cf2070ca153d3bf60ea9e0440ffb1b72b847e32565a3fd8f953ca7de24a9586",
"format": 1
},
{
- "name": "docs/podman_generate_systemd_module.html",
+ "name": "docs/genindex.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e5d799252e205b60924cd5158976f71995f5e4e06edd348bb0fa608199dfcef",
+ "chksum_sha256": "267654c6dfb8d96914725b0bd774e09c72dfdcfb065ae073f9fc732b01b543d0",
"format": 1
},
{
- "name": "docs/searchindex.js",
+ "name": "docs/podman_network_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "68a79c703ad84cc805f3945b454e0871f6e2562c6e75ec6f20702a8c1a96a6fa",
+ "chksum_sha256": "367a0a1343aa808bb256561200464764dc2b165271d028b1508d95b6b7251410",
"format": 1
},
{
- "name": "docs/podman_container_module.html",
+ "name": "docs/buildah_connection.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c9489eb47093750ec7c7780a6e6fcd84041f34b115371e7300df05af4ae3b112",
+ "chksum_sha256": "a2f915dd35461f1a8d9806999382c0976f9b1fe03e2fe7b3e1973e20a46157b1",
"format": 1
},
{
- "name": "docs/podman_network_info_module.html",
+ "name": "docs/searchindex.js",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "50a9aa361b09cbeb8311501040429f537223523ac993cc29e8e841c1a330b338",
+ "chksum_sha256": "668d68ce702cf98c3d9cbc91d08d64a1fda5060257ad8393f99b06fe0de1d9a7",
"format": 1
},
{
- "name": "docs/podman_logout_module.html",
+ "name": "docs/podman_container_info_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "980d9040d448274ca106e7e3ea1a2d7e8781a83518bcf30acb4f088f9a8e5585",
+ "chksum_sha256": "13dc267968457dd4b2271a4a03b497d80354ed3aadb843c4ce0a8829f7ae99e5",
"format": 1
},
{
- "name": "docs/objects.inv",
+ "name": "docs/podman_tag_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d0b13de8051aab95f660ee9e17f976cc53853a562fead4c6e95ac30562f6252d",
+ "chksum_sha256": "176e3fedadbfe0c2bd801ac7b2ad9d90027b76d33a2cb28a2fef572e4e7846fc",
"format": 1
},
{
- "name": "docs/podman_load_module.html",
+ "name": "docs/environment_variables.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0c34f66544c9547d6873175f5f828992f22eb7180ed2867f7e1b113495e832d1",
+ "chksum_sha256": "754ab0bc744fd2f640f433d8ec17c4520c35bf5985108501b479b3653fe3c0d0",
"format": 1
},
{
- "name": "docs/podman_tag_module.html",
+ "name": "docs/podman_volume_info_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b0318bb65447c742ad02998a8e0ec8c3b322fb552fdcc97c86d0d5aa94b0511d",
+ "chksum_sha256": "b8a2a6fad503cd6adb9160e77bb2f31118bf0daa6d977fa03759e28eb6c3f131",
"format": 1
},
{
@@ -372,122 +351,122 @@
"format": 1
},
{
- "name": "docs/podman_pod_module.html",
+ "name": "docs/podman_login_info_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "291e6c4c92da12468197580b183b4e33f3764f2363c21d811318fbd5fdad31d4",
+ "chksum_sha256": "94a726afed1d890e8b184d3084ca0c0070313a067b90dfdbc542b55ecdeea1ca",
"format": 1
},
{
- "name": "docs/podman_network_module.html",
+ "name": "docs/podman_login_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0e41390cf13ce9e63c26d28fbb7c919ddba089f32405bd1c86144dbe25fec98",
+ "chksum_sha256": "c66423dcc7cc34aed5e2d110a4a874fbd6540cc6f1612e86c33406c919bcf79c",
"format": 1
},
{
- "name": "docs/podman_image_info_module.html",
+ "name": "docs/podman_pod_info_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8052d065501c86d3fce53e1a870b257b1b120d4cee5787d65b09e33a8dcb3cc5",
+ "chksum_sha256": "a28ac5a8b511831dfa23f72c1f9bb344ef8ba447b35fa5324abb75d01c48c229",
"format": 1
},
{
- "name": "docs/podman_secret_module.html",
+ "name": "docs/podman_export_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1aa857495902d922a8d34cc1f99ea5ed5832bba967598980ee126d3e2d672194",
+ "chksum_sha256": "678fc32756bc2c3bfe8666d9b32144bcee1371e213e1885abea262bee7da0b86",
"format": 1
},
{
- "name": "docs/genindex.html",
+ "name": "docs/podman_import_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "267654c6dfb8d96914725b0bd774e09c72dfdcfb065ae073f9fc732b01b543d0",
+ "chksum_sha256": "efe1e379667f9f72c2d6b68dac89fce6a21b1c2bed58e6159a8da49fa343c7c0",
"format": 1
},
{
- "name": "docs/podman_login_module.html",
+ "name": "docs/podman_generate_systemd_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f85b0efcef6198ef699a371ba9cdfe4dd13563fd1982e82b9d5faaa47be08324",
+ "chksum_sha256": "a39b726dd24891ea2baed0fa82f0d6441a8de98ec924a34f1429d8f3b5c0db90",
"format": 1
},
{
- "name": "docs/index.html",
+ "name": "docs/podman_pod_module.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b7c42262b9c12a137d255adf2a28983e897e6651689f7a49573b919d32e0722",
+ "chksum_sha256": "8df83296245cffb0523875e8045091ef06d9052f1c0193d48c4e4f6fb43ff3fb",
"format": 1
},
{
- "name": "docs/environment_variables.html",
+ "name": "docs/.nojekyll",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "754ab0bc744fd2f640f433d8ec17c4520c35bf5985108501b479b3653fe3c0d0",
+ "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"format": 1
},
{
- "name": "docs/podman_export_module.html",
+ "name": "docs/podman_connection.html",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba113aee00093ea0a28f737e4b0d628c509ac7a901714b33e921faba02ab1b22",
+ "chksum_sha256": "163a4dd0ca2c99c1d58fe2e2400f9c4b3b431feb5913408185a6d175ad5f23e7",
"format": 1
},
{
- "name": "docs/podman_volume_info_module.html",
+ "name": "Makefile",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a4aebadb3c98b409f3b467ef8c4bccdc58d0368ec499779854c1dd888cd452ef",
+ "chksum_sha256": "77424e5d6417f24ffd8e4d00d85e942ba4eaa912129ae01f5f4e26a2e2500d2d",
"format": 1
},
{
- "name": "docs/podman_prune_module.html",
+ "name": "ansible-collection-containers-podman.spec",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df4a1997ae54270f03a880ab39fd691e19b14ed22c1840605b54481168894738",
+ "chksum_sha256": "78cf0e2fef0e96de69fd18ab38b358a03a22a5ce2e0ecafbd149407d6bcafb47",
"format": 1
},
{
- "name": "docs/podman_secret_info_module.html",
+ "name": "setup.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "02c6ca29827997e672d37dc06699e7ef832c7d5738ed3e93e592a00c6de05804",
+ "chksum_sha256": "85ef52c56819164efc5178d25aa03a432cdb8431ad0c99255802ce19a1719602",
"format": 1
},
{
- "name": "docs/podman_connection.html",
+ "name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8c5acf0a527705c23c59bc4153c6f24a825d1ce2bd77b4672ff185ab34d4b61",
+ "chksum_sha256": "0b3c0bf86d855ce3b4341bf6f72a5ea3e6300c09ca88d793ca3b149175eaa30c",
"format": 1
},
{
- "name": "CHANGELOG.rst",
+ "name": "CODE-OF-CONDUCT.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "96fa1187145da3dfde0d211ecf989620afdaf7e7f43970273741cb962be65dde",
+ "chksum_sha256": "5b42ff686c8d61fc9879d2512a9fa01f8810a7274318e7952ad3322eeea02f11",
"format": 1
},
{
- "name": "plugins",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "SECURITY.md",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b73dc04e41dbb3774a3244e8e40d13eb97d169caa3e1230a622e077d60c1edd9",
"format": 1
},
{
- "name": "plugins/become",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "COPYING",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986",
"format": 1
},
{
- "name": "plugins/become/podman_unshare.py",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "2dab878a68742976acd46a1310a37e9e0777b1953f86ee31dd9e0a29e9dfc3f3",
+ "name": "plugins",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
@@ -526,108 +505,108 @@
"format": 1
},
{
- "name": "plugins/modules/podman_volume_info.py",
+ "name": "plugins/modules/podman_generate_systemd.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb8cf9d38d438d24589d547458f4c0ba8341f687eb8a1ded30de1fc0b8933c83",
+ "chksum_sha256": "262b7b1263967adfa45d98192ac38169e51026db3b60eac7b365dc81bbd7b784",
"format": 1
},
{
- "name": "plugins/modules/podman_import.py",
+ "name": "plugins/modules/podman_login_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b17de1350a59abf3d1dd3b6faa6b7a66e7085bb06746027bee22be1371ba5b5",
+ "chksum_sha256": "e8f615071a379d21b8f012a60c24036c4812239faf8e6aea2be6e5ca21bbcc4f",
"format": 1
},
{
- "name": "plugins/modules/podman_secret.py",
+ "name": "plugins/modules/podman_export.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6b19a2f4453349e74339f952ca4d86512b55e792c3ed8d991ec7a681ec1de850",
+ "chksum_sha256": "48a73c06e5fe4b1f1d4cd70262d32559a13e73eda7012ea5c074fdbabbc2470a",
"format": 1
},
{
- "name": "plugins/modules/podman_load.py",
+ "name": "plugins/modules/podman_network_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "96694bda39431f44186d599db567446d72debdf52a4a5c51f5fd66fa515229fc",
+ "chksum_sha256": "9beb6e0c733ca304f38f95116dfd89569df21a68428039ef59ec9650314c5222",
"format": 1
},
{
- "name": "plugins/modules/podman_export.py",
+ "name": "plugins/modules/podman_image_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "48a73c06e5fe4b1f1d4cd70262d32559a13e73eda7012ea5c074fdbabbc2470a",
+ "chksum_sha256": "30d4db967b76884039d8ccaaf99f098e86b85efd9bef6bc0ceea4b8292905e6b",
"format": 1
},
{
- "name": "plugins/modules/podman_prune.py",
+ "name": "plugins/modules/podman_container_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "214aa5244363a5d1e8423c82a770e5c02f7dfc331b8756607a567995e6d6ec50",
+ "chksum_sha256": "c0ccb2118efb225624f13e01c499eec274d0d864fd151cca94e0128e994d4b5e",
"format": 1
},
{
- "name": "plugins/modules/podman_volume.py",
+ "name": "plugins/modules/podman_pod.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "880e428a2c953a1b550330b8e70159b775166dd21547056e75d64650c0892091",
+ "chksum_sha256": "32d5458b844ee1798d4abdc5384dc9b1056bd3a3585e6e38b48bfd3bd0ea43f5",
"format": 1
},
{
- "name": "plugins/modules/podman_pod.py",
+ "name": "plugins/modules/podman_container.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c2f505a53d4948d78ada958c5f33d94f5a703c684b97e12f47b5837654a55575",
+ "chksum_sha256": "ada302bbc6c4378e586edc7f0e2c0d9e78b161f325b7d886bfa9ee4deeb41882",
"format": 1
},
{
- "name": "plugins/modules/podman_image.py",
+ "name": "plugins/modules/podman_prune.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "03afa78794f979607671d9ce4676e1e51daa11fb1f706a2d3dbb498b2cee16bd",
+ "chksum_sha256": "214aa5244363a5d1e8423c82a770e5c02f7dfc331b8756607a567995e6d6ec50",
"format": 1
},
{
- "name": "plugins/modules/podman_container.py",
+ "name": "plugins/modules/podman_secret.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f31967e1063756efda806e7645d28c0d7bf1d794f92302c79d907dd44f2f3b68",
+ "chksum_sha256": "6b19a2f4453349e74339f952ca4d86512b55e792c3ed8d991ec7a681ec1de850",
"format": 1
},
{
- "name": "plugins/modules/podman_save.py",
+ "name": "plugins/modules/podman_tag.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ddb55cc96d2a174a1f2e61fcd22a435b11394d53199bd2afeca374139a43be2c",
+ "chksum_sha256": "f748d6640b2cd18ac2caaf0a9d74917c1f139649df48dd514a11d8a1e7abc7cf",
"format": 1
},
{
- "name": "plugins/modules/podman_play.py",
+ "name": "plugins/modules/__init__.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "453838a1c683a4e7e9cbc2e72f7ad8912961a16e87c3aa2d3ed3319fb934eb90",
+ "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"format": 1
},
{
- "name": "plugins/modules/podman_network_info.py",
+ "name": "plugins/modules/podman_logout.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9beb6e0c733ca304f38f95116dfd89569df21a68428039ef59ec9650314c5222",
+ "chksum_sha256": "7cc7da9cf123ffb9180e98f2fe5704f628831d44014efd25c48cedd1c28a9b7c",
"format": 1
},
{
- "name": "plugins/modules/__init__.py",
+ "name": "plugins/modules/podman_load.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "chksum_sha256": "96694bda39431f44186d599db567446d72debdf52a4a5c51f5fd66fa515229fc",
"format": 1
},
{
- "name": "plugins/modules/podman_login_info.py",
+ "name": "plugins/modules/podman_save.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e8f615071a379d21b8f012a60c24036c4812239faf8e6aea2be6e5ca21bbcc4f",
+ "chksum_sha256": "ddb55cc96d2a174a1f2e61fcd22a435b11394d53199bd2afeca374139a43be2c",
"format": 1
},
{
@@ -638,80 +617,80 @@
"format": 1
},
{
- "name": "plugins/modules/podman_image_info.py",
+ "name": "plugins/modules/podman_pod_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d79ccfb526e599404fcb618d04195f8c7fa8158a7cce1f2d5d592b626a6976e2",
+ "chksum_sha256": "dae42675e5739995587997d9d2475219339f222053a99a121f28270444f717b9",
"format": 1
},
{
- "name": "plugins/modules/podman_network.py",
+ "name": "plugins/modules/podman_container_exec.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ca507252b965895a3ed3e24ccbb28541700212ac0f2b340abb901b35a909d760",
+ "chksum_sha256": "936c9c3ff873c18d2283dd352e6dbaaf46c228678db474dd88eb9df1e824d833",
"format": 1
},
{
- "name": "plugins/modules/podman_containers.py",
+ "name": "plugins/modules/podman_login.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "166b573ae344ccf93b2e33703fc8d8eeb1cd5e251eba40a95ba037cad4716b7a",
+ "chksum_sha256": "1414953f8525bcfa294fb57d70565a02ede619e29ef256d88c34bdb6b2712fb3",
"format": 1
},
{
- "name": "plugins/modules/podman_generate_systemd.py",
+ "name": "plugins/modules/podman_play.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "54348fd0d118db0d4f7596c60250814aa61ef9dc2a4bae74522bf61287fa35a7",
+ "chksum_sha256": "1fef01d23b5083bd5687f63d23e3e692fe0230f73e9a59da523fd8ce8be3509d",
"format": 1
},
{
- "name": "plugins/modules/podman_container_info.py",
+ "name": "plugins/modules/podman_containers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0ccb2118efb225624f13e01c499eec274d0d864fd151cca94e0128e994d4b5e",
+ "chksum_sha256": "166b573ae344ccf93b2e33703fc8d8eeb1cd5e251eba40a95ba037cad4716b7a",
"format": 1
},
{
- "name": "plugins/modules/podman_logout.py",
+ "name": "plugins/modules/podman_import.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7cc7da9cf123ffb9180e98f2fe5704f628831d44014efd25c48cedd1c28a9b7c",
+ "chksum_sha256": "9b17de1350a59abf3d1dd3b6faa6b7a66e7085bb06746027bee22be1371ba5b5",
"format": 1
},
{
- "name": "plugins/modules/podman_secret_info.py",
+ "name": "plugins/modules/podman_volume_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d6254c8325c6ff5fffb632062f7401d8a1a94d5f1786691e88bee07fe26734f9",
+ "chksum_sha256": "eb8cf9d38d438d24589d547458f4c0ba8341f687eb8a1ded30de1fc0b8933c83",
"format": 1
},
{
- "name": "plugins/modules/podman_login.py",
+ "name": "plugins/modules/podman_secret_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "54abe75a9053423a2189bdadee8b0e6c9b8f530ba82523a8024ea211626ecde2",
+ "chksum_sha256": "d6254c8325c6ff5fffb632062f7401d8a1a94d5f1786691e88bee07fe26734f9",
"format": 1
},
{
- "name": "plugins/modules/podman_pod_info.py",
+ "name": "plugins/modules/podman_network.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "18e5fd6f6142467654af44f458a13c662d3beb2fa7957b137cbc13852cfcb440",
+ "chksum_sha256": "28e23bfd5e1a689ec64ecd78dc5c2ade91064cc8db4523e2a3c84b3f0a527f09",
"format": 1
},
{
- "name": "plugins/modules/podman_container_exec.py",
+ "name": "plugins/modules/podman_volume.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "071bce898ea72b63aff4d47909fd191bbdbdca0f53fb6813b48c1b4ace95478a",
+ "chksum_sha256": "b6807a2c1cbb53a163eb761017d9cc4af0e22a7b151c78e73be0d1cdf6822d61",
"format": 1
},
{
- "name": "plugins/modules/podman_tag.py",
+ "name": "plugins/modules/podman_image.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f748d6640b2cd18ac2caaf0a9d74917c1f139649df48dd514a11d8a1e7abc7cf",
+ "chksum_sha256": "61096d944871085194097913b73ad99565cb445245366fa19067f3a279e6fe56",
"format": 1
},
{
@@ -732,14 +711,14 @@
"name": "plugins/module_utils/podman/podman_pod_lib.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2d25257e5aa77d26f60370d64385254353450c6ef9b86b1a442723a7adf8e1f8",
+ "chksum_sha256": "0c5f4b77c737bc856aef858fe0515bcc2351dec0b1beacff3772a441a280d2fe",
"format": 1
},
{
- "name": "plugins/module_utils/podman/__init__.py",
+ "name": "plugins/module_utils/podman/quadlet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "chksum_sha256": "5574a455e924ea0eb4d8dd50cb0e04d86ee0ad3507826626be66bec766863c60",
"format": 1
},
{
@@ -750,10 +729,17 @@
"format": 1
},
{
+ "name": "plugins/module_utils/podman/__init__.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "format": 1
+ },
+ {
"name": "plugins/module_utils/podman/podman_container_lib.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab338a3648ebff54756f05cd349d74d686f626884db95440dba379232c40ea34",
+ "chksum_sha256": "8a80171364990a53ad52201232c9bee988d2f02a91f0883e862c533a06b5730a",
"format": 1
},
{
@@ -764,10 +750,31 @@
"format": 1
},
{
- "name": "COPYING",
+ "name": "plugins/become",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "plugins/become/podman_unshare.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986",
+ "chksum_sha256": "2dab878a68742976acd46a1310a37e9e0777b1953f86ee31dd9e0a29e9dfc3f3",
+ "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": "f07aa47b7583a6a8420798081029b8cdfb09cbf5564acff6f49b6c3237102618",
"format": 1
},
{
@@ -778,17 +785,45 @@
"format": 1
},
{
- "name": "Makefile",
+ "name": "changelogs",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "changelogs/config.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "77424e5d6417f24ffd8e4d00d85e942ba4eaa912129ae01f5f4e26a2e2500d2d",
+ "chksum_sha256": "72cc16b684890f4595ab75ffdd6f80f5ae19bc84cbb2d82606bc840eb7842209",
"format": 1
},
{
- "name": "SECURITY.md",
+ "name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b73dc04e41dbb3774a3244e8e40d13eb97d169caa3e1230a622e077d60c1edd9",
+ "chksum_sha256": "7a25ebd33b1475eaf97acf3e5ba1b50461aabd200f501a6130f0aae1cc2e2e74",
+ "format": 1
+ },
+ {
+ "name": "galaxy.yml.in",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ba21f50b97b7f801dd811f96d4941327fccab34b13311e9bfcc5facfeec16999",
+ "format": 1
+ },
+ {
+ "name": "CHANGELOG.rst",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "37440385853bd43f5b71ba017515bd1c7c68ac45c0429cfaae320b3661c75de1",
+ "format": 1
+ },
+ {
+ "name": "test-requirements.txt",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9b72b7289eba420f51eb614c54f609181bb26e96caef2abf06c02339a77d2e08",
"format": 1
},
{
@@ -806,38 +841,38 @@
"format": 1
},
{
- "name": "tests/sanity/ignore-2.18.txt",
+ "name": "tests/sanity/ignore-2.12.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.13.txt",
+ "name": "tests/sanity/ignore-2.9.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.10.txt",
+ "name": "tests/sanity/ignore-2.15.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.11.txt",
+ "name": "tests/sanity/ignore-2.13.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.9.txt",
+ "name": "tests/sanity/ignore-2.17.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
@@ -848,38 +883,45 @@
"format": 1
},
{
- "name": "tests/sanity/ignore-2.14.txt",
+ "name": "tests/sanity/ignore-2.11.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.12.txt",
+ "name": "tests/sanity/ignore-2.10.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.17.txt",
+ "name": "tests/sanity/ignore-2.18.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
"name": "tests/sanity/ignore-2.16.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
"format": 1
},
{
- "name": "tests/sanity/ignore-2.15.txt",
+ "name": "tests/sanity/ignore-2.14.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "361bd77aa7cbdafdfcdec95128188299e4641bcce983571a747031794cca7cf5",
+ "chksum_sha256": "67fc6067f750369421d81d68b9f2d30afe4eb13f9d0963eaa1aa07a8c924556b",
+ "format": 1
+ },
+ {
+ "name": "tests/.gitignore",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "b5726d3ec9335a09c124469eca039523847a6b0f08a083efaefd002b83326600",
"format": 1
},
{
@@ -904,13 +946,6 @@
"format": 1
},
{
- "name": "tests/unit/plugins/modules/test_common.py",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "79b1c212210b13bb60b8d97b140351ce088707f3574b8fc61b076e827e050891",
- "format": 1
- },
- {
"name": "tests/unit/plugins/modules/test_container_lib.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -918,10 +953,10 @@
"format": 1
},
{
- "name": "tests/.gitignore",
+ "name": "tests/unit/plugins/modules/test_common.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b5726d3ec9335a09c124469eca039523847a6b0f08a083efaefd002b83326600",
+ "chksum_sha256": "79b1c212210b13bb60b8d97b140351ce088707f3574b8fc61b076e827e050891",
"format": 1
},
{
@@ -939,507 +974,528 @@
"format": 1
},
{
- "name": "tests/integration/targets/podman_volume_info",
+ "name": "tests/integration/targets/podman_pod",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_volume_info/tasks",
+ "name": "tests/integration/targets/podman_pod/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_volume_info/tasks/main.yml",
+ "name": "tests/integration/targets/podman_pod/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d951a17810a5d38195f5b6b9f2b61997be78c33f425b3d6c8424250d658d4115",
+ "chksum_sha256": "1c065036caae1e7933a92eead273136e4ebc1340257766746ad8d4954269bc10",
"format": 1
},
{
- "name": "tests/integration/targets/podman_volume",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_pod/tasks/root-pod.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "32a941c1ab343de12be5b6b942885697a47a90e70b4ba8b8f6b41830fd748be7",
"format": 1
},
{
- "name": "tests/integration/targets/podman_volume/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_pod/tasks/network-tests.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "9a8a2c641891bca7bd86d7c984970b869bad967b127d9ea5cad004dbb7bf1401",
"format": 1
},
{
- "name": "tests/integration/targets/podman_volume/tasks/main.yml",
+ "name": "tests/integration/targets/podman_pod/tasks/net-pod.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fcf996710e030b8188cd7f49daa73c153c23513dfedcacea9e22615223ce8d7d",
+ "chksum_sha256": "a0f34f0ea7dc20a24b1a0bd29ef7b71fc5b145fd6ee364cea413c01cc858c30d",
"format": 1
},
{
- "name": "tests/integration/targets/podman_image",
+ "name": "tests/integration/targets/podman_pod/tasks/resource-limit.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c401b840f46b7d047ffff490a03eb414be614b23f41ac053bf85b2b9e2eaef44",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/podman_containers",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_image/files",
+ "name": "tests/integration/targets/podman_containers/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_image/files/Containerfile",
+ "name": "tests/integration/targets/podman_containers/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ec6bc9968ca494ec22fcb0bed27fc12ddf2241fea1fe58d0d8a4f0b33487b506",
- "format": 1
- },
- {
- "name": "tests/integration/targets/podman_image/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "chksum_sha256": "f0693a6b04d4dc0d91ff26d5c155f0dde26d8b54d38bad24379b4b45115572ba",
"format": 1
},
{
- "name": "tests/integration/targets/podman_image/tasks/main.yml",
+ "name": "tests/integration/targets/podman_containers/tasks/root-multi.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "71b89cf589c2372b615111daa3acc9134561569dafea88fbe85fb4601f341d76",
+ "chksum_sha256": "99e92a4d72c87817aa74687d7a9fc99da5adbeeaffb04fa8da55cac88d2082ad",
"format": 1
},
{
- "name": "tests/integration/targets/podman_save",
+ "name": "tests/integration/targets/podman_import",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_save/tasks",
+ "name": "tests/integration/targets/podman_import/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_save/tasks/main.yml",
+ "name": "tests/integration/targets/podman_import/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "18dd5ac7950abeb6dcfdb97f4b9b6e00aeacd1be3b41dae762cca6e237bbbf93",
+ "chksum_sha256": "aee5d8c4cdcd8ca56109a6fcc93be0dcce03ebc65cf6c8d606b1e195ad7bc37a",
"format": 1
},
{
- "name": "tests/integration/targets/podman_logout",
+ "name": "tests/integration/targets/podman_container_exec",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_logout/tasks",
+ "name": "tests/integration/targets/podman_container_exec/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_logout/tasks/main.yml",
+ "name": "tests/integration/targets/podman_container_exec/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e1c3fcd8cd0d917e7faad2dc447381ec2ccff2bc3a57b02060cd965ffbb45c1",
+ "chksum_sha256": "0e0ddeed9ec3f80a8dbe98de6b8ca92d6906a8ed8b4e732b57d7aa56ea603766",
"format": 1
},
{
- "name": "tests/integration/targets/connection_podman",
+ "name": "tests/integration/targets/podman_export",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/connection_podman/test_connection.inventory",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "05ecc4306d853f3a6057303bbcc0750d7fbb86e044cd135faf01c35ad06b6d25",
+ "name": "tests/integration/targets/podman_export/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/connection_podman/runme.sh",
+ "name": "tests/integration/targets/podman_export/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "06a213f3e9c159069f1fd055653438f8487d1b8939ee735a0025b151ef2a4626",
+ "chksum_sha256": "608c9d218d3e66b53ad1b5f2b3d6c295ca109edf2d82b08eccc3d8840278f4ab",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_exec",
+ "name": "tests/integration/targets/podman_container",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_exec/tasks",
+ "name": "tests/integration/targets/podman_container/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_exec/tasks/main.yml",
+ "name": "tests/integration/targets/podman_container/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f30d948810c85f961037c816face62e7a9591a26d566ecf5d19f6490161788de",
+ "chksum_sha256": "75e7c7c41efe6771b55a034dbeeb25b2ecfb16df84db581e3ba58a16f8192fbb",
"format": 1
},
{
- "name": "tests/integration/targets/podman_export",
+ "name": "tests/integration/targets/podman_image",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_export/tasks",
+ "name": "tests/integration/targets/podman_image/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_export/tasks/main.yml",
+ "name": "tests/integration/targets/podman_image/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "608c9d218d3e66b53ad1b5f2b3d6c295ca109edf2d82b08eccc3d8840278f4ab",
+ "chksum_sha256": "0d8f32e61e6e8357c8a08b3ec698a9a599b10b9dfdb0a03cef829d22b5eb177d",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency",
+ "name": "tests/integration/targets/podman_image/files",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/files",
+ "name": "tests/integration/targets/podman_image/files/Containerfile",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ec6bc9968ca494ec22fcb0bed27fc12ddf2241fea1fe58d0d8a4f0b33487b506",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/connection",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/files/start.sh",
+ "name": "tests/integration/targets/connection/create-nonroot-user.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb80ab18f5df29c7c77f8acea5285af4f0f4d1ddac161801d0ff26ac242c2d86",
+ "chksum_sha256": "7af8e41655a36f526418cadf93e37da7117cc67761e34ab9c41b68ac8c00a268",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/files/Dockerfile",
+ "name": "tests/integration/targets/connection/test_connection.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "002a8a2bf46c5da32a3583bc93c08347c6f7e16c51cd5abdf562d77df313da5c",
+ "chksum_sha256": "3b9bd8af9cbdf99e7d47189d08b57d0eb5030fde078c88a3387d2af701ae85a8",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks",
+ "name": "tests/integration/targets/podman_volume",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_ports.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "cc446d64740817d2b04de867ac5e17e3118a4191e332f1c4bc493a34bc58b298",
+ "name": "tests/integration/targets/podman_volume/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/main.yml",
+ "name": "tests/integration/targets/podman_volume/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b740c06632cb043c3fc57f226023b59b4a425dc28d4c3c1e005835bc3e6f727",
+ "chksum_sha256": "02a99c50e7aebf79d8a7d254f9c2c25f03bfa7f940b3593907d0b26bd018880e",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "ed7d2ee3e9e352efc0266c2264469b3f759f1630562794c98f5da83949506bec",
+ "name": "tests/integration/targets/podman_container_info",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_systemd.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "272808017955d5ef59448a1b9ce1bb98d18bce0b1e4b658d1fe6c5b4fcdc884b",
+ "name": "tests/integration/targets/podman_container_info/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_stopsignal.yml",
+ "name": "tests/integration/targets/podman_container_info/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "262e884e0b4a561fbc57726f13763e3b07a92786386c9a5c7ccd13270e38b475",
+ "chksum_sha256": "f753b105c6b8ca293911422dc3372b82e98ba5b3f7065cac0a20976933a0c03f",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "5e330c3f7359aaf7e6e3379db977b909e04bcec89b894f1f8f0d44dfebdecffd",
+ "name": "tests/integration/targets/podman_volume_info",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_network_aliases.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "04c6bf4fd56edcc1a49a47e98f448c89cf8e90e1d7d67db9997f0af94ef09dc6",
+ "name": "tests/integration/targets/podman_volume_info/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml",
+ "name": "tests/integration/targets/podman_volume_info/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a4d6028c7466608b10983c9acf25af9b99d9ce0aa27ed17500af287d28070af4",
+ "chksum_sha256": "d951a17810a5d38195f5b6b9f2b61997be78c33f425b3d6c8424250d658d4115",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_workdir.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "23d729589e61ae790bd81b281f89b48b443b830cf3a6932eb0bdf4289289f677",
+ "name": "tests/integration/targets/podman_runlabel",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_labels.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "d375e2ec31f9f9d16adca8328db880ee3d0b56238db5686ac9bbb0dcc2017fe7",
+ "name": "tests/integration/targets/podman_runlabel/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/build_test_container.yml",
+ "name": "tests/integration/targets/podman_runlabel/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a61627e2d0be2e1400f0d0f60df5d636eea74b18aa87fa2a0d7eb4c419c2a8ae",
+ "chksum_sha256": "0beafe98862363c62951e9c1a1398446a78b4e00aee1c91a7343e38eb5380fb0",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman-network.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "ab1cc0f347537ab4403395b2b2b43f815fe49c7ae35b88b498931fdcb33abd75",
+ "name": "tests/integration/targets/podman_runlabel/files",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_users.yml",
+ "name": "tests/integration/targets/podman_runlabel/files/testinstall.sh",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "36f44ffaa058046e62d0e53be0f7edf8232d9145ec44a948c64c15d0c0c3cd23",
+ "chksum_sha256": "6450871e198c27b65e85883b3ca93b78f63261667b2332689d7f5b01fd293077",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_pods.yml",
+ "name": "tests/integration/targets/podman_runlabel/files/Dockerfile",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "53d129901494fa24a8075ade0576e2536ae3cbfc5d8fb8d116a10978594a6a49",
+ "chksum_sha256": "4afccdec25a964d39944882c25dbb0df6f0f844cfcfb72bbd89bb505167d1241",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_networks.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "3a0f1de00361a8381b06934149d6433afd307d010d7396be307f7d7f6f27a52e",
+ "name": "tests/integration/targets/podman_image_info",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_all.yml",
+ "name": "tests/integration/targets/podman_image_info/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/podman_image_info/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f7ccc04c97fb27dfdf4462cc73f74e244c76759ce0a5b4b7d785e6f8a50b7a56",
+ "chksum_sha256": "2e2b22b24c5afbaf5f7565c37a37cd0294bb0be58d758a75fca3cf7828f283ac",
"format": 1
},
{
- "name": "tests/integration/targets/podman_secret_info",
+ "name": "tests/integration/targets/podman_load",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_secret_info/tasks",
+ "name": "tests/integration/targets/podman_load/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_secret_info/tasks/main.yml",
+ "name": "tests/integration/targets/podman_load/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3181d366cf3f25687ff6cceaf0677803bedc1d64e6b766fa66d5882c89240674",
+ "chksum_sha256": "078d5ae2eb9bf74046e34c6e7c003e87bb6e08f1a6fd49fcf5d6bb2174bae393",
"format": 1
},
{
- "name": "tests/integration/targets/podman_login",
+ "name": "tests/integration/targets/podman_play",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_login/tasks",
+ "name": "tests/integration/targets/podman_play/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_login/tasks/main.yml",
+ "name": "tests/integration/targets/podman_play/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5156c546ca2b45f035ae5b28a7220e06c4fb8051f93a6077e0308b06cafa15b3",
+ "chksum_sha256": "164bc510cd1be9cb89f2d4845154d7f5854149ca347cdd4f2a115e70316c10f2",
"format": 1
},
{
- "name": "tests/integration/targets/podman_tag",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_play/tasks/play-with-build.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "dbfd032b6d71ce241ee643cfcaa09997efc32ef57a0f4494982f43caad353678",
"format": 1
},
{
- "name": "tests/integration/targets/podman_tag/tasks",
+ "name": "tests/integration/targets/podman_play/tasks/files",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_tag/tasks/main.yml",
+ "name": "tests/integration/targets/podman_play/tasks/files/play-root3.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2d0f2ae65dac8386961528eb33d02de73fe60026cb5566ffa68b4467b7c45678",
+ "chksum_sha256": "3e26cb69976a1b7d1f79a5dafc74e368d9297bb63b29c1c213d5bbddc0e62bf3",
"format": 1
},
{
- "name": "tests/integration/targets/podman_containers",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_play/tasks/files/play1.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1031804932a82f741e8cddaa397e73554e4784a790a3d4493d1b5c8f5f6bbf7e",
"format": 1
},
{
- "name": "tests/integration/targets/podman_containers/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_play/tasks/files/Containerfile",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c0268928bf1b6b6307404eff5d25e292b78239d330dc585c87d810db40307609",
"format": 1
},
{
- "name": "tests/integration/targets/podman_containers/tasks/main.yml",
+ "name": "tests/integration/targets/podman_play/tasks/files/play3.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f0693a6b04d4dc0d91ff26d5c155f0dde26d8b54d38bad24379b4b45115572ba",
+ "chksum_sha256": "c92c31b3ad0cd9992a6a9e391d07d69b2b9f3cc39b410e1cbc710bda40323b3d",
"format": 1
},
{
- "name": "tests/integration/targets/podman_containers/tasks/root-multi.yml",
+ "name": "tests/integration/targets/podman_play/tasks/files/kube-buil-test.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "99e92a4d72c87817aa74687d7a9fc99da5adbeeaffb04fa8da55cac88d2082ad",
+ "chksum_sha256": "c813ffc1f16f8324acbbaad0cf5ad7ee00e0ebd47f314b9ad74f24fd9e2177b0",
"format": 1
},
{
- "name": "tests/integration/targets/podman_network",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_play/tasks/files/play-pod.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "28fd560a9ff59811770316563e3320dbd77ed04c2c2dd9d698c54870fbcaafb4",
"format": 1
},
{
- "name": "tests/integration/targets/podman_network/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_play/tasks/files/envdata.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d5ebdb092f5473ae5174dfbac83b6623343326f308d02eea8fb58fbb7b42d264",
"format": 1
},
{
- "name": "tests/integration/targets/podman_network/tasks/main.yml",
+ "name": "tests/integration/targets/podman_play/tasks/files/multi-yaml.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7659bb415aa72e1ff4ec1b2fc681ce7261fccdaa21804c1ecc9e9ee1a3b2cd0",
+ "chksum_sha256": "984f73601cc75a5052b22b3d9a670ea93e7cc0c4f3fe2fb89f4f341392fb8af6",
"format": 1
},
{
- "name": "tests/integration/targets/podman_image_info",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_play/tasks/files/play-root1.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "049f1ad67c57e019423f28c77ca8cec13e714ae8727fedfde71792ec56131344",
"format": 1
},
{
- "name": "tests/integration/targets/podman_image_info/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_play/tasks/play-with-options.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "fcf6f0e7a8768422425a667d29e28c831e4f284102ab3b62d8c7eb4b0fca6083",
"format": 1
},
{
- "name": "tests/integration/targets/podman_image_info/tasks/main.yml",
+ "name": "tests/integration/targets/podman_play/tasks/root-play.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e2b22b24c5afbaf5f7565c37a37cd0294bb0be58d758a75fca3cf7828f283ac",
+ "chksum_sha256": "65c0fccbaf7c464b539f895addc0cf3e7536f9cb8b9f7d8e28725a90d345326b",
"format": 1
},
{
- "name": "tests/integration/targets/podman_prune",
+ "name": "tests/integration/targets/podman_play/tasks/play-multi-yaml.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "099247fe1f2666caf7035895336008b05e7e773353747c18015d36d795d9afaa",
+ "format": 1
+ },
+ {
+ "name": "tests/integration/targets/podman_logout",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_prune/tasks",
+ "name": "tests/integration/targets/podman_logout/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_prune/tasks/main.yml",
+ "name": "tests/integration/targets/podman_logout/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "724466a522dc7a0d89201a540856373a6613e11f6869faf0accfe01497c972c8",
+ "chksum_sha256": "2e1c3fcd8cd0d917e7faad2dc447381ec2ccff2bc3a57b02060cd965ffbb45c1",
"format": 1
},
{
- "name": "tests/integration/targets/connection",
+ "name": "tests/integration/targets/connection_buildah",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/connection/create-nonroot-user.yml",
+ "name": "tests/integration/targets/connection_buildah/test_connection.inventory",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7af8e41655a36f526418cadf93e37da7117cc67761e34ab9c41b68ac8c00a268",
+ "chksum_sha256": "5012fc0a2af812b87b675f31cd605ecf8d80fe32667b6ed20ea51fe0c8685742",
"format": 1
},
{
- "name": "tests/integration/targets/connection/test_connection.yml",
+ "name": "tests/integration/targets/connection_buildah/runme.sh",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b9bd8af9cbdf99e7d47189d08b57d0eb5030fde078c88a3387d2af701ae85a8",
+ "chksum_sha256": "b4d64b01f03eb7aa81f3fbe7202c816188bc8432fedccb5251feeb330f7c16e4",
"format": 1
},
{
@@ -1450,346 +1506,339 @@
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod",
+ "name": "tests/integration/targets/podman_tag",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod/tasks",
+ "name": "tests/integration/targets/podman_tag/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod/tasks/main.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "bbe9d769c0aadaea64fb4a3263a8e1cb746e9f78e0f3308dfda1641b5abcc808",
- "format": 1
- },
- {
- "name": "tests/integration/targets/podman_pod/tasks/network-tests.yml",
+ "name": "tests/integration/targets/podman_tag/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9a8a2c641891bca7bd86d7c984970b869bad967b127d9ea5cad004dbb7bf1401",
+ "chksum_sha256": "2d0f2ae65dac8386961528eb33d02de73fe60026cb5566ffa68b4467b7c45678",
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod/tasks/net-pod.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "a0f34f0ea7dc20a24b1a0bd29ef7b71fc5b145fd6ee364cea413c01cc858c30d",
+ "name": "tests/integration/targets/podman_login_info",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod/tasks/root-pod.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "32a941c1ab343de12be5b6b942885697a47a90e70b4ba8b8f6b41830fd748be7",
+ "name": "tests/integration/targets/podman_login_info/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod/tasks/resource-limit.yml",
+ "name": "tests/integration/targets/podman_login_info/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "368abd818cd3d326f926d4e0d9e5ee7531f7fa337d48d9abfbb130e4c2e009a5",
+ "chksum_sha256": "21ef50fdd0d92d39240b082c1f9ba3782478e615863d3e8d9a0960b175b8158e",
"format": 1
},
{
- "name": "tests/integration/targets/podman_load",
+ "name": "tests/integration/targets/podman_network_info",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_load/tasks",
+ "name": "tests/integration/targets/podman_network_info/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_load/tasks/main.yml",
+ "name": "tests/integration/targets/podman_network_info/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "078d5ae2eb9bf74046e34c6e7c003e87bb6e08f1a6fd49fcf5d6bb2174bae393",
+ "chksum_sha256": "5d60cdf4f76199919395dd477e7feb32d8ebbb4b736d0a13052290a3fcb5e5e3",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play",
+ "name": "tests/integration/targets/podman_pod_info",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks",
+ "name": "tests/integration/targets/podman_pod_info/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/root-play.yml",
+ "name": "tests/integration/targets/podman_pod_info/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "65c0fccbaf7c464b539f895addc0cf3e7536f9cb8b9f7d8e28725a90d345326b",
+ "chksum_sha256": "f04166aa3908442835ca6e7f747429d54cdeb8bcbf272e3977de79f3ad653271",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files",
+ "name": "tests/integration/targets/podman_container_idempotency",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/kube-buil-test.yaml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "c813ffc1f16f8324acbbaad0cf5ad7ee00e0ebd47f314b9ad74f24fd9e2177b0",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/play3.yaml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c92c31b3ad0cd9992a6a9e391d07d69b2b9f3cc39b410e1cbc710bda40323b3d",
+ "chksum_sha256": "aa7ee1e6dad1b84726df6521d749c31263b9d6d2cb7c5ab38b04ddf8fadb58f9",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/Containerfile",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_network_aliases.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0268928bf1b6b6307404eff5d25e292b78239d330dc585c87d810db40307609",
+ "chksum_sha256": "04c6bf4fd56edcc1a49a47e98f448c89cf8e90e1d7d67db9997f0af94ef09dc6",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/envdata.yaml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5ebdb092f5473ae5174dfbac83b6623343326f308d02eea8fb58fbb7b42d264",
+ "chksum_sha256": "407d946210fd0801b2626b36ca0921299c75d644ff508caeac1cc2fa49ef6c50",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/play-root1.yaml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/build_test_container.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "049f1ad67c57e019423f28c77ca8cec13e714ae8727fedfde71792ec56131344",
+ "chksum_sha256": "a61627e2d0be2e1400f0d0f60df5d636eea74b18aa87fa2a0d7eb4c419c2a8ae",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/play-pod.yaml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_networks.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28fd560a9ff59811770316563e3320dbd77ed04c2c2dd9d698c54870fbcaafb4",
+ "chksum_sha256": "3a0f1de00361a8381b06934149d6433afd307d010d7396be307f7d7f6f27a52e",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/play1.yaml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_users.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1031804932a82f741e8cddaa397e73554e4784a790a3d4493d1b5c8f5f6bbf7e",
+ "chksum_sha256": "36f44ffaa058046e62d0e53be0f7edf8232d9145ec44a948c64c15d0c0c3cd23",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/files/play-root3.yaml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3e26cb69976a1b7d1f79a5dafc74e368d9297bb63b29c1c213d5bbddc0e62bf3",
+ "chksum_sha256": "ed7d2ee3e9e352efc0266c2264469b3f759f1630562794c98f5da83949506bec",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/main.yml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_pods.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e09a063081bc323f0bed0bde99945514ced8f79728cb0e6505cf9830e39210c",
+ "chksum_sha256": "53d129901494fa24a8075ade0576e2536ae3cbfc5d8fb8d116a10978594a6a49",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/play-with-build.yml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_workdir.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e69e16e846f4c167878eadf1701af4af637704a1441bf20fb9c05161e93c034f",
+ "chksum_sha256": "23d729589e61ae790bd81b281f89b48b443b830cf3a6932eb0bdf4289289f677",
"format": 1
},
{
- "name": "tests/integration/targets/podman_play/tasks/play-with-options.yml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_ports.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0774269b8b1a0fa19000a0c0bfe4bb6ff8410a7fa46b80d1c4876ac39108580c",
+ "chksum_sha256": "cc446d64740817d2b04de867ac5e17e3118a4191e332f1c4bc493a34bc58b298",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_systemd.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "272808017955d5ef59448a1b9ce1bb98d18bce0b1e4b658d1fe6c5b4fcdc884b",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/root-podman-network.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ab1cc0f347537ab4403395b2b2b43f815fe49c7ae35b88b498931fdcb33abd75",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container/tasks/main.yml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_all.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "01fca5192bb2072e35c91ce42643accf53cd7cc51166f8845bf71a373e99dd87",
+ "chksum_sha256": "f7ccc04c97fb27dfdf4462cc73f74e244c76759ce0a5b4b7d785e6f8a50b7a56",
"format": 1
},
{
- "name": "tests/integration/targets/podman_secret",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_stopsignal.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "262e884e0b4a561fbc57726f13763e3b07a92786386c9a5c7ccd13270e38b475",
"format": 1
},
{
- "name": "tests/integration/targets/podman_secret/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5e330c3f7359aaf7e6e3379db977b909e04bcec89b894f1f8f0d44dfebdecffd",
"format": 1
},
{
- "name": "tests/integration/targets/podman_secret/tasks/main.yml",
+ "name": "tests/integration/targets/podman_container_idempotency/tasks/idem_labels.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b9b9415b024f3f617149c74d980afccb22e7223dac8bb673465504507ca4e2aa",
+ "chksum_sha256": "d375e2ec31f9f9d16adca8328db880ee3d0b56238db5686ac9bbb0dcc2017fe7",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_info",
+ "name": "tests/integration/targets/podman_container_idempotency/files",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_info/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/podman_container_idempotency/files/start.sh",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "bb80ab18f5df29c7c77f8acea5285af4f0f4d1ddac161801d0ff26ac242c2d86",
"format": 1
},
{
- "name": "tests/integration/targets/podman_container_info/tasks/main.yml",
+ "name": "tests/integration/targets/podman_container_idempotency/files/Dockerfile",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f753b105c6b8ca293911422dc3372b82e98ba5b3f7065cac0a20976933a0c03f",
+ "chksum_sha256": "002a8a2bf46c5da32a3583bc93c08347c6f7e16c51cd5abdf562d77df313da5c",
"format": 1
},
{
- "name": "tests/integration/targets/podman_import",
+ "name": "tests/integration/targets/podman_secret",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_import/tasks",
+ "name": "tests/integration/targets/podman_secret/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_import/tasks/main.yml",
+ "name": "tests/integration/targets/podman_secret/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aee5d8c4cdcd8ca56109a6fcc93be0dcce03ebc65cf6c8d606b1e195ad7bc37a",
+ "chksum_sha256": "b9b9415b024f3f617149c74d980afccb22e7223dac8bb673465504507ca4e2aa",
"format": 1
},
{
- "name": "tests/integration/targets/podman_runlabel",
+ "name": "tests/integration/targets/podman_network",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_runlabel/files",
+ "name": "tests/integration/targets/podman_network/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_runlabel/files/testinstall.sh",
+ "name": "tests/integration/targets/podman_network/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6450871e198c27b65e85883b3ca93b78f63261667b2332689d7f5b01fd293077",
+ "chksum_sha256": "8415501667bf5315c747424b0ffbe15b3283803e26f52d78d7de13836bba1e90",
"format": 1
},
{
- "name": "tests/integration/targets/podman_runlabel/files/Dockerfile",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "4afccdec25a964d39944882c25dbb0df6f0f844cfcfb72bbd89bb505167d1241",
+ "name": "tests/integration/targets/podman_login",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_runlabel/tasks",
+ "name": "tests/integration/targets/podman_login/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_runlabel/tasks/main.yml",
+ "name": "tests/integration/targets/podman_login/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0beafe98862363c62951e9c1a1398446a78b4e00aee1c91a7343e38eb5380fb0",
+ "chksum_sha256": "5156c546ca2b45f035ae5b28a7220e06c4fb8051f93a6077e0308b06cafa15b3",
"format": 1
},
{
- "name": "tests/integration/targets/connection_buildah",
+ "name": "tests/integration/targets/podman_save",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/connection_buildah/test_connection.inventory",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "5012fc0a2af812b87b675f31cd605ecf8d80fe32667b6ed20ea51fe0c8685742",
+ "name": "tests/integration/targets/podman_save/tasks",
+ "ftype": "dir",
+ "chksum_type": null,
+ "chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/connection_buildah/runme.sh",
+ "name": "tests/integration/targets/podman_save/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b4d64b01f03eb7aa81f3fbe7202c816188bc8432fedccb5251feeb330f7c16e4",
+ "chksum_sha256": "18dd5ac7950abeb6dcfdb97f4b9b6e00aeacd1be3b41dae762cca6e237bbbf93",
"format": 1
},
{
- "name": "tests/integration/targets/podman_login_info",
+ "name": "tests/integration/targets/podman_secret_info",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_login_info/tasks",
+ "name": "tests/integration/targets/podman_secret_info/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_login_info/tasks/main.yml",
+ "name": "tests/integration/targets/podman_secret_info/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "21ef50fdd0d92d39240b082c1f9ba3782478e615863d3e8d9a0960b175b8158e",
+ "chksum_sha256": "3181d366cf3f25687ff6cceaf0677803bedc1d64e6b766fa66d5882c89240674",
"format": 1
},
{
@@ -1810,77 +1859,49 @@
"name": "tests/integration/targets/podman_generate_systemd/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4c4a2b75bf6b0c5816e27b25bd3b7ba836e3d040b606b84f2a15d8f96bfc7ad5",
+ "chksum_sha256": "e8a7e30fe0a898ba81b62400058b9bab61da64e588148084ddb14911943d2b8b",
"format": 1
},
{
- "name": "tests/integration/targets/podman_network_info",
+ "name": "tests/integration/targets/connection_podman",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_network_info/tasks",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
+ "name": "tests/integration/targets/connection_podman/test_connection.inventory",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "05ecc4306d853f3a6057303bbcc0750d7fbb86e044cd135faf01c35ad06b6d25",
"format": 1
},
{
- "name": "tests/integration/targets/podman_network_info/tasks/main.yml",
+ "name": "tests/integration/targets/connection_podman/runme.sh",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5d60cdf4f76199919395dd477e7feb32d8ebbb4b736d0a13052290a3fcb5e5e3",
+ "chksum_sha256": "06a213f3e9c159069f1fd055653438f8487d1b8939ee735a0025b151ef2a4626",
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod_info",
+ "name": "tests/integration/targets/podman_prune",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod_info/tasks",
+ "name": "tests/integration/targets/podman_prune/tasks",
"ftype": "dir",
"chksum_type": null,
"chksum_sha256": null,
"format": 1
},
{
- "name": "tests/integration/targets/podman_pod_info/tasks/main.yml",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "f04166aa3908442835ca6e7f747429d54cdeb8bcbf272e3977de79f3ad653271",
- "format": 1
- },
- {
- "name": "CODE-OF-CONDUCT.md",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "5b42ff686c8d61fc9879d2512a9fa01f8810a7274318e7952ad3322eeea02f11",
- "format": 1
- },
- {
- "name": "ansible-collection-containers-podman.spec",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "78cf0e2fef0e96de69fd18ab38b358a03a22a5ce2e0ecafbd149407d6bcafb47",
- "format": 1
- },
- {
- "name": "README.md",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "0b3c0bf86d855ce3b4341bf6f72a5ea3e6300c09ca88d793ca3b149175eaa30c",
- "format": 1
- },
- {
- "name": "galaxy.yml.in",
+ "name": "tests/integration/targets/podman_prune/tasks/main.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba21f50b97b7f801dd811f96d4941327fccab34b13311e9bfcc5facfeec16999",
+ "chksum_sha256": "ea735326ddf2a4077cab00b44e2c064c686d90d5d55e0c373a02c045aaabddf4",
"format": 1
}
],
diff --git a/ansible_collections/containers/podman/MANIFEST.json b/ansible_collections/containers/podman/MANIFEST.json
index 42a7515a2..ac80755e7 100644
--- a/ansible_collections/containers/podman/MANIFEST.json
+++ b/ansible_collections/containers/podman/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "containers",
"name": "podman",
- "version": "1.12.0",
+ "version": "1.13.0",
"authors": [
"Sagi Shnaidman <sshnaidm@redhat.com>",
"Ansible team"
@@ -28,7 +28,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b77266449f88b742113a208a520a3141a8e68154485dde86e743014eb8d58d58",
+ "chksum_sha256": "c7ca356d6a22a0996ed4045ff5711e5cf96cd60a62009e0da6f63fea100d538f",
"format": 1
},
"format": 1
diff --git a/ansible_collections/containers/podman/changelogs/changelog.yaml b/ansible_collections/containers/podman/changelogs/changelog.yaml
index 05857773e..bb58cacf4 100644
--- a/ansible_collections/containers/podman/changelogs/changelog.yaml
+++ b/ansible_collections/containers/podman/changelogs/changelog.yaml
@@ -257,6 +257,39 @@ releases:
name: podman_secret_info
namespace: ''
release_date: '2024-01-30'
+ 1.12.1:
+ changes:
+ bugfixes:
+ - podman_container - Add check and fixed for v5 network diff
+ - podman_container - Fix pasta networking idempotency for v5 (#728)
+ - podman_container_exec - Remove unnecessary quotes in podman_container_exec
+ module
+ - podman_image_info - Fix wrong return data type in podman_image_info
+ - podman_play - Fix kube play annotations
+ - podman_pod - Fix broken info of pods in Podman v5
+ - podman_pod - Fix pod for Podman v5
+ - podman_pod - Fix podman pod v5 broken info issue
+ minor_changes:
+ - CI - Fix rootfs test in CI
+ - CI - add custom podman path to tasks
+ - CI - add parametrized executables to tests
+ - podman_container - Add pasta as default network mode after v5
+ - podman_container_exec - Return data for podman exec module
+ - podman_generate_systemd - Fix broken example for podman_generate_systemd (#708)
+ - podman_login - Update podman_login.py
+ - podman_play - Add support for kube yaml files with multi-documents (#724)
+ - podman_play - Update the logic for deleting pods/containers in podman_play
+ - podman_pod_info - handle return being list in Podman 5 (#713)
+ release_summary: Support for Podman v5 and bugfixes
+ release_date: '2024-04-08'
+ 1.13.0:
+ changes:
+ bugfixes:
+ - Fix pod info for non-existant pods
+ major_changes:
+ - Add quadlet support for Podman modules
+ release_summary: Quadlet support for Podman
+ release_date: '2024-04-22'
1.2.0:
changes:
minor_changes:
diff --git a/ansible_collections/containers/podman/docs/buildah_connection.html b/ansible_collections/containers/podman/docs/buildah_connection.html
index 0d16691d4..28b73f8bf 100644
--- a/ansible_collections/containers/podman/docs/buildah_connection.html
+++ b/ansible_collections/containers/podman/docs/buildah_connection.html
@@ -37,7 +37,7 @@
<h1>containers.podman.buildah connection – Interact with an existing buildah container<a class="headerlink" href="#containers-podman-buildah-connection-interact-with-an-existing-buildah-container" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This connection plugin is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This connection plugin is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.</p>
diff --git a/ansible_collections/containers/podman/docs/index.html b/ansible_collections/containers/podman/docs/index.html
index ec765ccb4..8880530d7 100644
--- a/ansible_collections/containers/podman/docs/index.html
+++ b/ansible_collections/containers/podman/docs/index.html
@@ -34,7 +34,7 @@
<section id="containers-podman">
<span id="plugins-in-containers-podman"></span><h1>Containers.Podman<a class="headerlink" href="#containers-podman" title="Permalink to this heading">¶</a></h1>
-<p>Collection version 1.11.0</p>
+<p>Collection version 1.13.0</p>
<nav class="contents local" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#description" id="id1">Description</a></p></li>
diff --git a/ansible_collections/containers/podman/docs/objects.inv b/ansible_collections/containers/podman/docs/objects.inv
index 4800e7a8b..e51191bf4 100644
--- a/ansible_collections/containers/podman/docs/objects.inv
+++ b/ansible_collections/containers/podman/docs/objects.inv
Binary files differ
diff --git a/ansible_collections/containers/podman/docs/podman_connection.html b/ansible_collections/containers/podman/docs/podman_connection.html
index 666200432..d5a6f2b6f 100644
--- a/ansible_collections/containers/podman/docs/podman_connection.html
+++ b/ansible_collections/containers/podman/docs/podman_connection.html
@@ -36,7 +36,7 @@
<h1>containers.podman.podman connection – Interact with an existing podman container<a class="headerlink" href="#containers-podman-podman-connection-interact-with-an-existing-podman-container" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This connection plugin is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This connection plugin is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.</p>
diff --git a/ansible_collections/containers/podman/docs/podman_container_exec_module.html b/ansible_collections/containers/podman/docs/podman_container_exec_module.html
index 6f99748d8..f93c89afd 100644
--- a/ansible_collections/containers/podman/docs/podman_container_exec_module.html
+++ b/ansible_collections/containers/podman/docs/podman_container_exec_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_container_exec module – Executes a command in a running container.<a class="headerlink" href="#containers-podman-podman-container-exec-module-executes-a-command-in-a-running-container" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
@@ -114,13 +114,21 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</div></td>
</tr>
<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-executable"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-exec-module-parameter-executable"><strong>executable</strong></p>
+<a class="ansibleOptionLink" href="#parameter-executable" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>The path to the podman executable.</p>
+<p class="ansible-option-line"><strong class="ansible-option-default-bold">Default:</strong> <code class="ansible-option-default docutils literal notranslate"><span class="pre">&quot;podman&quot;</span></code></p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-name"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-exec-module-parameter-name"><strong>name</strong></p>
<a class="ansibleOptionLink" href="#parameter-name" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span> / <span class="ansible-option-required">required</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Name of the container where the command is executed.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-privileged"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-exec-module-parameter-privileged"><strong>privileged</strong></p>
<a class="ansibleOptionLink" href="#parameter-privileged" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -132,7 +140,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-tty"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-exec-module-parameter-tty"><strong>tty</strong></p>
<a class="ansibleOptionLink" href="#parameter-tty" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -144,7 +152,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-user"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-exec-module-parameter-user"><strong>user</strong></p>
<a class="ansibleOptionLink" href="#parameter-user" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -152,7 +160,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<p>Both user and group may be symbolic or numeric.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-workdir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-exec-module-parameter-workdir"><strong>workdir</strong></p>
<a class="ansibleOptionLink" href="#parameter-workdir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
diff --git a/ansible_collections/containers/podman/docs/podman_container_info_module.html b/ansible_collections/containers/podman/docs/podman_container_info_module.html
index ff1441845..516979249 100644
--- a/ansible_collections/containers/podman/docs/podman_container_info_module.html
+++ b/ansible_collections/containers/podman/docs/podman_container_info_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_container_info module – Gather facts about containers using podman<a class="headerlink" href="#containers-podman-podman-container-info-module-gather-facts-about-containers-using-podman" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_container_module.html b/ansible_collections/containers/podman/docs/podman_container_module.html
index 656e05d7c..6cb5f17ee 100644
--- a/ansible_collections/containers/podman/docs/podman_container_module.html
+++ b/ansible_collections/containers/podman/docs/podman_container_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_container module – Manage podman containers<a class="headerlink" href="#containers-podman-podman-container-module-manage-podman-containers" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
@@ -998,6 +998,27 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</div></td>
</tr>
<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_dir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-quadlet-dir"><strong>quadlet_dir</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_dir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Path to the directory to write quadlet file in. By default, it will be set as <code class="docutils literal notranslate"><span class="pre">/etc/containers/systemd/</span></code> for root user, <code class="docutils literal notranslate"><span class="pre">~/.config/containers/systemd/</span></code> for non-root users.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_filename"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-quadlet-filename"><strong>quadlet_filename</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_filename" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Name of quadlet file to write. By default it takes <code class="docutils literal notranslate"><span class="pre">name</span></code> value.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_options"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-quadlet-options"><strong>quadlet_options</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_options" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Options for the quadlet file. Provide missing in usual container args options as a list of lines to add.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-read_only"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-read-only"><strong>read_only</strong></p>
<a class="ansibleOptionLink" href="#parameter-read_only" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -1009,7 +1030,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-read_only_tmpfs"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-read-only-tmpfs"><strong>read_only_tmpfs</strong></p>
<a class="ansibleOptionLink" href="#parameter-read_only_tmpfs" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -1021,7 +1042,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-recreate"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-recreate"><strong>recreate</strong></p>
<a class="ansibleOptionLink" href="#parameter-recreate" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -1033,28 +1054,28 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-requires"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-requires"><strong>requires</strong></p>
<a class="ansibleOptionLink" href="#parameter-requires" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Specify one or more requirements. A requirement is a dependency container that will be started before this container. Containers can be specified by name or ID.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-restart_policy"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-restart-policy"><strong>restart_policy</strong></p>
<a class="ansibleOptionLink" href="#parameter-restart_policy" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Restart policy to follow when containers exit. Restart policy will not take effect if a container is stopped via the podman kill or podman stop commands. Valid values are * no - Do not restart containers on exit * on-failure[:max_retries] - Restart containers when they exit with a non-0 exit code, retrying indefinitely or until the optional max_retries count is hit * always - Restart containers when they exit, regardless of status, retrying indefinitely</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-restart_time"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-restart-time"><strong>restart_time</strong></p>
<a class="ansibleOptionLink" href="#parameter-restart_time" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Seconds to wait before forcibly stopping the container when restarting. Use -1 for infinite wait. Applies to “restarted” status.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-rm"></div>
<div class="ansibleOptionAnchor" id="parameter-remove"></div>
<div class="ansibleOptionAnchor" id="parameter-auto_remove"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-rm"><span id="ansible-collections-containers-podman-podman-container-module-parameter-remove"></span><span id="ansible-collections-containers-podman-podman-container-module-parameter-auto-remove"></span><strong>rm</strong></p>
@@ -1069,7 +1090,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-rootfs"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-rootfs"><strong>rootfs</strong></p>
<a class="ansibleOptionLink" href="#parameter-rootfs" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -1081,35 +1102,35 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-sdnotify"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-sdnotify"><strong>sdnotify</strong></p>
<a class="ansibleOptionLink" href="#parameter-sdnotify" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Determines how to use the NOTIFY_SOCKET, as passed with systemd and Type=notify. Can be container, conmon, ignore.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-secrets"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-secrets"><strong>secrets</strong></p>
<a class="ansibleOptionLink" href="#parameter-secrets" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Add the named secrets into the container. The format is <code class="docutils literal notranslate"><span class="pre">secret[,opt=opt...]</span></code>, see <a class="reference external" href="https://docs.podman.io/en/latest/markdown/podman-run.1.html#secret-secret-opt-opt">documentation</a> for more details.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-security_opt"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-security-opt"><strong>security_opt</strong></p>
<a class="ansibleOptionLink" href="#parameter-security_opt" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Security Options. For example security_opt “seccomp=unconfined”</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-shm_size"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-shm-size"><strong>shm_size</strong></p>
<a class="ansibleOptionLink" href="#parameter-shm_size" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Size of /dev/shm. The format is &lt;number&gt;&lt;unit&gt;. number must be greater than 0. Unit is optional and can be b (bytes), k (kilobytes), m(megabytes), or g (gigabytes). If you omit the unit, the system uses bytes. If you omit the size entirely, the system uses 64m</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-sig_proxy"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-sig-proxy"><strong>sig_proxy</strong></p>
<a class="ansibleOptionLink" href="#parameter-sig_proxy" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -1121,7 +1142,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-state"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-state"><strong>state</strong></p>
<a class="ansibleOptionLink" href="#parameter-state" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -1130,6 +1151,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<p><em>started</em> - Asserts there is a running container matching the name and any provided configuration. If no container matches the name, a container will be created and started. Use recreate to always re-create a matching container, even if it is running. Use force_restart to force a matching container to be stopped and restarted.</p>
<p><em>stopped</em> - Asserts that the container is first <em>present</em>, and then if the container is running moves it to a stopped state.</p>
<p><em>created</em> - Asserts that the container exists with given configuration. If container doesn’t exist, the module creates it and leaves it in ‘created’ state. If configuration doesn’t match or ‘recreate’ option is set, the container will be recreated</p>
+<p><em>quadlet</em> - Write a quadlet file with the specified configuration. Requires the <code class="docutils literal notranslate"><span class="pre">quadlet_dir</span></code> option to be set.</p>
<p class="ansible-option-line"><strong class="ansible-option-choices">Choices:</strong></p>
<ul class="simple">
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;absent&quot;</span></code></p></li>
@@ -1137,73 +1159,74 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;stopped&quot;</span></code></p></li>
<li><p><code class="ansible-option-default-bold docutils literal notranslate"><strong><span class="pre">&quot;started&quot;</span></strong></code> <span class="ansible-option-choices-default-mark">← (default)</span></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;created&quot;</span></code></p></li>
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;quadlet&quot;</span></code></p></li>
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-stop_signal"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-stop-signal"><strong>stop_signal</strong></p>
<a class="ansibleOptionLink" href="#parameter-stop_signal" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">integer</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Signal to stop a container. Default is SIGTERM.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-stop_time"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-stop-time"><strong>stop_time</strong></p>
<a class="ansibleOptionLink" href="#parameter-stop_time" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Seconds to wait before forcibly stopping the container. Use -1 for infinite wait. Applies to “stopped” status.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-stop_timeout"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-stop-timeout"><strong>stop_timeout</strong></p>
<a class="ansibleOptionLink" href="#parameter-stop_timeout" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">integer</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Timeout (in seconds) to stop a container. Default is 10.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-subgidname"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-subgidname"><strong>subgidname</strong></p>
<a class="ansibleOptionLink" href="#parameter-subgidname" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Run the container in a new user namespace using the map with ‘name’ in the /etc/subgid file.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-subuidname"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-subuidname"><strong>subuidname</strong></p>
<a class="ansibleOptionLink" href="#parameter-subuidname" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Run the container in a new user namespace using the map with ‘name’ in the /etc/subuid file.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-sysctl"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-sysctl"><strong>sysctl</strong></p>
<a class="ansibleOptionLink" href="#parameter-sysctl" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Configure namespaced kernel parameters at runtime</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-systemd"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-systemd"><strong>systemd</strong></p>
<a class="ansibleOptionLink" href="#parameter-systemd" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Run container in systemd mode. The default is true.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-timezone"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-timezone"><strong>timezone</strong></p>
<a class="ansibleOptionLink" href="#parameter-timezone" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Set timezone in container. This flag takes area-based timezones, GMT time, as well as local, which sets the timezone in the container to match the host machine. See /usr/share/zoneinfo/ for valid timezones. Remote connections use local containers.conf for defaults.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-tmpfs"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-tmpfs"><strong>tmpfs</strong></p>
<a class="ansibleOptionLink" href="#parameter-tmpfs" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Create a tmpfs mount. For example tmpfs “/tmp” “rw,size=787448k,mode=1777”</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-tty"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-tty"><strong>tty</strong></p>
<a class="ansibleOptionLink" href="#parameter-tty" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -1215,14 +1238,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-uidmap"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-uidmap"><strong>uidmap</strong></p>
<a class="ansibleOptionLink" href="#parameter-uidmap" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Run the container in a new user namespace using the supplied mapping.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-ulimit"></div>
<div class="ansibleOptionAnchor" id="parameter-ulimits"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-ulimits"><span id="ansible-collections-containers-podman-podman-container-module-parameter-ulimit"></span><strong>ulimit</strong></p>
<a class="ansibleOptionLink" href="#parameter-ulimit" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-aliases">aliases: ulimits</span></p>
@@ -1231,14 +1254,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<td><div class="ansible-option-cell"><p>Ulimit options</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-user"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-user"><strong>user</strong></p>
<a class="ansibleOptionLink" href="#parameter-user" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Sets the username or UID used and optionally the groupname or GID for the specified command.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-userns"></div>
<div class="ansibleOptionAnchor" id="parameter-userns_mode"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-userns-mode"><span id="ansible-collections-containers-podman-podman-container-module-parameter-userns"></span><strong>userns</strong></p>
<a class="ansibleOptionLink" href="#parameter-userns" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-aliases">aliases: userns_mode</span></p>
@@ -1247,14 +1270,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<td><div class="ansible-option-cell"><p>Set the user namespace mode for the container. It defaults to the PODMAN_USERNS environment variable. An empty value means user namespaces are disabled.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-uts"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-uts"><strong>uts</strong></p>
<a class="ansibleOptionLink" href="#parameter-uts" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Set the UTS mode for the container</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-volume"></div>
<div class="ansibleOptionAnchor" id="parameter-volumes"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-volumes"><span id="ansible-collections-containers-podman-podman-container-module-parameter-volume"></span><strong>volume</strong></p>
<a class="ansibleOptionLink" href="#parameter-volume" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-aliases">aliases: volumes</span></p>
@@ -1263,14 +1286,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<td><div class="ansible-option-cell"><p>Create a bind mount. If you specify, volume /HOST-DIR:/CONTAINER-DIR, podman bind mounts /HOST-DIR in the host to /CONTAINER-DIR in the podman container.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-volumes_from"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-volumes-from"><strong>volumes_from</strong></p>
<a class="ansibleOptionLink" href="#parameter-volumes_from" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Mount volumes from the specified container(s).</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-workdir"></div>
<div class="ansibleOptionAnchor" id="parameter-working_dir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-container-module-parameter-working-dir"><span id="ansible-collections-containers-podman-podman-container-module-parameter-workdir"></span><strong>workdir</strong></p>
<a class="ansibleOptionLink" href="#parameter-workdir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-aliases">aliases: working_dir</span></p>
@@ -1372,6 +1395,24 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">renew</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">--deploy-hook</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;echo</span><span class="nv"> </span><span class="s">1</span><span class="nv"> </span><span class="s">&gt;</span><span class="nv"> </span><span class="s">/var/lib/letsencrypt/complete&quot;</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create a Quadlet file</span>
+<span class="w"> </span><span class="nt">containers.podman.podman_container</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet-container</span>
+<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">nginx</span>
+<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet</span>
+<span class="w"> </span><span class="nt">quadlet_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">custome-container</span>
+<span class="w"> </span><span class="nt">device</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;/dev/sda:/dev/xvda:rwm&quot;</span>
+<span class="w"> </span><span class="nt">ports</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;8080:80&quot;</span>
+<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;/var/www:/usr/share/nginx/html&quot;</span>
+<span class="w"> </span><span class="nt">quadlet_options</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;AutoUpdate=registry&quot;</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;Pull=true&quot;</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">|</span>
+<span class="w"> </span><span class="no">[Install]</span>
+<span class="w"> </span><span class="no">WantedBy=default.target</span>
</pre></div>
</div>
</section>
diff --git a/ansible_collections/containers/podman/docs/podman_containers_module.html b/ansible_collections/containers/podman/docs/podman_containers_module.html
index e84707d36..adc0dca87 100644
--- a/ansible_collections/containers/podman/docs/podman_containers_module.html
+++ b/ansible_collections/containers/podman/docs/podman_containers_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_containers module – Manage podman containers in a batch<a class="headerlink" href="#containers-podman-podman-containers-module-manage-podman-containers-in-a-batch" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_export_module.html b/ansible_collections/containers/podman/docs/podman_export_module.html
index 5a51a171c..b5e525aa4 100644
--- a/ansible_collections/containers/podman/docs/podman_export_module.html
+++ b/ansible_collections/containers/podman/docs/podman_export_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_export module – Export a podman container<a class="headerlink" href="#containers-podman-podman-export-module-export-a-podman-container" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html b/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html
index 892160486..daec06e3f 100644
--- a/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html
+++ b/ansible_collections/containers/podman/docs/podman_generate_systemd_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_generate_systemd module – Generate systemd unit from a pod or a container<a class="headerlink" href="#containers-podman-podman-generate-systemd-module-generate-systemd-unit-from-a-pod-or-a-container" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
@@ -318,6 +318,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Postgres container must be started and enabled on systemd</span>
<span class="w"> </span><span class="nt">ansible.builtin.systemd</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">container-postgres_local</span>
+<span class="w"> </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">user</span>
<span class="w"> </span><span class="nt">daemon_reload</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">started</span>
<span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
diff --git a/ansible_collections/containers/podman/docs/podman_image_info_module.html b/ansible_collections/containers/podman/docs/podman_image_info_module.html
index be1f33883..b64277209 100644
--- a/ansible_collections/containers/podman/docs/podman_image_info_module.html
+++ b/ansible_collections/containers/podman/docs/podman_image_info_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_image_info module – Gather info about images using podman<a class="headerlink" href="#containers-podman-podman-image-info-module-gather-info-about-images-using-podman" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.</p>
@@ -123,7 +123,7 @@ To check whether it is installed, run <code class="code docutils literal notrans
<tbody>
<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="return-images"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-info-module-return-images"><strong>images</strong></p>
-<a class="ansibleOptionLink" href="#return-images" title="Permalink to this return value"></a><p class="ansible-option-type-line"><span class="ansible-option-type">dictionary</span></p>
+<a class="ansibleOptionLink" href="#return-images" title="Permalink to this return value"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>info from all or specified images</p>
<p class="ansible-option-line"><strong class="ansible-option-returned-bold">Returned:</strong> always</p>
diff --git a/ansible_collections/containers/podman/docs/podman_image_module.html b/ansible_collections/containers/podman/docs/podman_image_module.html
index 74c1dac80..941b06dfa 100644
--- a/ansible_collections/containers/podman/docs/podman_image_module.html
+++ b/ansible_collections/containers/podman/docs/podman_image_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_image module – Pull images for use by podman<a class="headerlink" href="#containers-podman-podman-image-module-pull-images-for-use-by-podman" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.</p>
@@ -344,6 +344,27 @@ To check whether it is installed, run <code class="code docutils literal notrans
</div></td>
</tr>
<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_dir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-module-parameter-quadlet-dir"><strong>quadlet_dir</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_dir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Path to the directory to write quadlet file in. By default, it will be set as <code class="docutils literal notranslate"><span class="pre">/etc/containers/systemd/</span></code> for root user, <code class="docutils literal notranslate"><span class="pre">~/.config/containers/systemd/</span></code> for non-root users.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_filename"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-module-parameter-quadlet-filename"><strong>quadlet_filename</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_filename" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Name of quadlet file to write. By default it takes image name without prefixes and tags.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_options"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-module-parameter-quadlet-options"><strong>quadlet_options</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_options" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-state"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-module-parameter-state"><strong>state</strong></p>
<a class="ansibleOptionLink" href="#parameter-state" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -353,10 +374,11 @@ To check whether it is installed, run <code class="code docutils literal notrans
<li><p><code class="ansible-option-default-bold docutils literal notranslate"><strong><span class="pre">&quot;present&quot;</span></strong></code> <span class="ansible-option-choices-default-mark">← (default)</span></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;absent&quot;</span></code></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;build&quot;</span></code></p></li>
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;quadlet&quot;</span></code></p></li>
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-tag"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-module-parameter-tag"><strong>tag</strong></p>
<a class="ansibleOptionLink" href="#parameter-tag" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -364,14 +386,14 @@ To check whether it is installed, run <code class="code docutils literal notrans
<p class="ansible-option-line"><strong class="ansible-option-default-bold">Default:</strong> <code class="ansible-option-default docutils literal notranslate"><span class="pre">&quot;latest&quot;</span></code></p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-username"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-module-parameter-username"><strong>username</strong></p>
<a class="ansibleOptionLink" href="#parameter-username" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>username to use when authenticating to remote registries.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-validate_certs"></div>
<div class="ansibleOptionAnchor" id="parameter-tlsverify"></div>
<div class="ansibleOptionAnchor" id="parameter-tls_verify"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-image-module-parameter-validate-certs"><span id="ansible-collections-containers-podman-podman-image-module-parameter-tlsverify"></span><span id="ansible-collections-containers-podman-podman-image-module-parameter-tls-verify"></span><strong>validate_certs</strong></p>
@@ -493,6 +515,18 @@ To check whether it is installed, run <code class="code docutils literal notrans
<span class="w"> </span><span class="nt">containers.podman.podman_image</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">nginx</span>
<span class="w"> </span><span class="nt">arch</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">amd64</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create a quadlet file for an image</span>
+<span class="w"> </span><span class="nt">containers.podman.podman_image</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">docker.io/library/alpine:latest</span>
+<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet</span>
+<span class="w"> </span><span class="nt">quadlet_dir</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/etc/containers/systemd</span>
+<span class="w"> </span><span class="nt">quadlet_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">alpine-latest</span>
+<span class="w"> </span><span class="nt">quadlet_options</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Variant=arm/v7</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="p p-Indicator">|</span>
+<span class="w"> </span><span class="no">[Install]</span>
+<span class="w"> </span><span class="no">WantedBy=default.target</span>
</pre></div>
</div>
</section>
diff --git a/ansible_collections/containers/podman/docs/podman_import_module.html b/ansible_collections/containers/podman/docs/podman_import_module.html
index e1dea2279..b7140a6b9 100644
--- a/ansible_collections/containers/podman/docs/podman_import_module.html
+++ b/ansible_collections/containers/podman/docs/podman_import_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_import module – Import Podman container from a tar file.<a class="headerlink" href="#containers-podman-podman-import-module-import-podman-container-from-a-tar-file" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_load_module.html b/ansible_collections/containers/podman/docs/podman_load_module.html
index a81014f03..256597ef5 100644
--- a/ansible_collections/containers/podman/docs/podman_load_module.html
+++ b/ansible_collections/containers/podman/docs/podman_load_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_load module – Load image from a tar file.<a class="headerlink" href="#containers-podman-podman-load-module-load-image-from-a-tar-file" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_login_info_module.html b/ansible_collections/containers/podman/docs/podman_login_info_module.html
index 7230f2de7..9b18049cd 100644
--- a/ansible_collections/containers/podman/docs/podman_login_info_module.html
+++ b/ansible_collections/containers/podman/docs/podman_login_info_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_login_info module – Return the logged-in user if any for a given registry<a class="headerlink" href="#containers-podman-podman-login-info-module-return-the-logged-in-user-if-any-for-a-given-registry" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_login_module.html b/ansible_collections/containers/podman/docs/podman_login_module.html
index 20a3e1475..61adafae2 100644
--- a/ansible_collections/containers/podman/docs/podman_login_module.html
+++ b/ansible_collections/containers/podman/docs/podman_login_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_login module – Login to a container registry using podman<a class="headerlink" href="#containers-podman-podman-login-module-login-to-a-container-registry-using-podman" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_logout_module.html b/ansible_collections/containers/podman/docs/podman_logout_module.html
index e52d3f016..9d0295c50 100644
--- a/ansible_collections/containers/podman/docs/podman_logout_module.html
+++ b/ansible_collections/containers/podman/docs/podman_logout_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_logout module – Log out of a container registry using podman<a class="headerlink" href="#containers-podman-podman-logout-module-log-out-of-a-container-registry-using-podman" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_network_info_module.html b/ansible_collections/containers/podman/docs/podman_network_info_module.html
index 488b52f62..cb8f98328 100644
--- a/ansible_collections/containers/podman/docs/podman_network_info_module.html
+++ b/ansible_collections/containers/podman/docs/podman_network_info_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_network_info module – Gather info about podman networks<a class="headerlink" href="#containers-podman-podman-network-info-module-gather-info-about-podman-networks" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_network_module.html b/ansible_collections/containers/podman/docs/podman_network_module.html
index c83643774..daaf3bc22 100644
--- a/ansible_collections/containers/podman/docs/podman_network_module.html
+++ b/ansible_collections/containers/podman/docs/podman_network_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_network module – Manage podman networks<a class="headerlink" href="#containers-podman-podman-network-module-manage-podman-networks" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
@@ -242,6 +242,27 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</div></td>
</tr>
<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_dir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-network-module-parameter-quadlet-dir"><strong>quadlet_dir</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_dir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Path to the directory to write quadlet file in. By default, it will be set as <code class="docutils literal notranslate"><span class="pre">/etc/containers/systemd/</span></code> for root user, <code class="docutils literal notranslate"><span class="pre">~/.config/containers/systemd/</span></code> for non-root users.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_filename"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-network-module-parameter-quadlet-filename"><strong>quadlet_filename</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_filename" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Name of quadlet file to write. By default it takes <em>name</em> value.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_options"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-network-module-parameter-quadlet-options"><strong>quadlet_options</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_options" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-recreate"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-network-module-parameter-recreate"><strong>recreate</strong></p>
<a class="ansibleOptionLink" href="#parameter-recreate" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -253,7 +274,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-state"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-network-module-parameter-state"><strong>state</strong></p>
<a class="ansibleOptionLink" href="#parameter-state" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -262,10 +283,11 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<ul class="simple">
<li><p><code class="ansible-option-default-bold docutils literal notranslate"><strong><span class="pre">&quot;present&quot;</span></strong></code> <span class="ansible-option-choices-default-mark">← (default)</span></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;absent&quot;</span></code></p></li>
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;quadlet&quot;</span></code></p></li>
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-subnet"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-network-module-parameter-subnet"><strong>subnet</strong></p>
<a class="ansibleOptionLink" href="#parameter-subnet" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -290,6 +312,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<span class="w"> </span><span class="nt">subnet</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">192.168.22.0/24</span>
<span class="w"> </span><span class="nt">gateway</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">192.168.22.1</span>
<span class="w"> </span><span class="nt">become</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create Quadlet file for podman network</span>
+<span class="w"> </span><span class="nt">containers.podman.podman_network</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">podman_network</span>
+<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet</span>
+<span class="w"> </span><span class="nt">quadlet_options</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">IPv6=true</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Label=&quot;ipv6 network&quot;</span>
</pre></div>
</div>
</section>
diff --git a/ansible_collections/containers/podman/docs/podman_play_module.html b/ansible_collections/containers/podman/docs/podman_play_module.html
index 4c27c4841..30a3654c8 100644
--- a/ansible_collections/containers/podman/docs/podman_play_module.html
+++ b/ansible_collections/containers/podman/docs/podman_play_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_play module – Play kubernetes YAML file using podman<a class="headerlink" href="#containers-podman-podman-play-module-play-kubernetes-yaml-file-using-podman" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
@@ -205,7 +205,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<div class="ansibleOptionAnchor" id="parameter-log_options/tag"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-log-options-tag"><span id="ansible-collections-containers-podman-podman-play-module-parameter-log-opt-tag"></span><strong>tag</strong></p>
<a class="ansibleOptionLink" href="#parameter-log_opt/tag" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
-<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>specify a custom log tag for the container. This option is currently supported only by the journald log driver in Podman.</p>
+<td><div class="ansible-option-indent-desc"></div><div class="ansible-option-cell"><p>Specify a custom log tag for the container. This option is currently supported only by the journald log driver in Podman.</p>
</div></td>
</tr>
<tr class="row-odd"><td><div class="ansible-option-cell">
@@ -223,6 +223,27 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</div></td>
</tr>
<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_dir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-quadlet-dir"><strong>quadlet_dir</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_dir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Path to the directory to write quadlet file in. By default, it will be set as <code class="docutils literal notranslate"><span class="pre">/etc/containers/systemd/</span></code> for root user, <code class="docutils literal notranslate"><span class="pre">~/.config/containers/systemd/</span></code> for non-root users.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_filename"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-quadlet-filename"><strong>quadlet_filename</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_filename" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Name of quadlet file to write. Must be specified if state is quadlet.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_options"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-quadlet-options"><strong>quadlet_options</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_options" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-quiet"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-quiet"><strong>quiet</strong></p>
<a class="ansibleOptionLink" href="#parameter-quiet" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -234,7 +255,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-recreate"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-recreate"><strong>recreate</strong></p>
<a class="ansibleOptionLink" href="#parameter-recreate" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -246,14 +267,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-seccomp_profile_root"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-seccomp-profile-root"><strong>seccomp_profile_root</strong></p>
<a class="ansibleOptionLink" href="#parameter-seccomp_profile_root" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Directory path for seccomp profiles (default is “/var/lib/kubelet/seccomp”). This option is not available with the remote Podman client</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-state"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-state"><strong>state</strong></p>
<a class="ansibleOptionLink" href="#parameter-state" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span> / <span class="ansible-option-required">required</span></p>
</div></td>
@@ -263,10 +284,11 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;created&quot;</span></code></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;started&quot;</span></code></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;absent&quot;</span></code></p></li>
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;quadlet&quot;</span></code></p></li>
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-tls_verify"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-tls-verify"><strong>tls_verify</strong></p>
<a class="ansibleOptionLink" href="#parameter-tls_verify" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -278,14 +300,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-username"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-username"><strong>username</strong></p>
<a class="ansibleOptionLink" href="#parameter-username" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>The username and password to use to authenticate with the registry if required.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-userns"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-play-module-parameter-userns"><strong>userns</strong></p>
<a class="ansibleOptionLink" href="#parameter-userns" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -314,6 +336,19 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<span class="w"> </span><span class="nt">log_opt</span><span class="p">:</span>
<span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/tmp/my-container.log</span>
<span class="w"> </span><span class="nt">max_size</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10mb</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create a Quadlet file</span>
+<span class="w"> </span><span class="nt">containers.podman.podman_play</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">kube_file</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">~/kube.yaml</span>
+<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet</span>
+<span class="w"> </span><span class="nt">annotations</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">greeting</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">hello</span>
+<span class="w"> </span><span class="nt">greet_to</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">world</span>
+<span class="w"> </span><span class="nt">userns</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">host</span>
+<span class="w"> </span><span class="nt">quadlet_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">kube-pod</span>
+<span class="w"> </span><span class="nt">quadlet_options</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;SetWorkingDirectory=yaml&quot;</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;ExitCodePropagation=any&quot;</span>
</pre></div>
</div>
<section id="authors">
diff --git a/ansible_collections/containers/podman/docs/podman_pod_info_module.html b/ansible_collections/containers/podman/docs/podman_pod_info_module.html
index b708bdb1f..d93a4370c 100644
--- a/ansible_collections/containers/podman/docs/podman_pod_info_module.html
+++ b/ansible_collections/containers/podman/docs/podman_pod_info_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_pod_info module – Gather info about podman pods<a class="headerlink" href="#containers-podman-podman-pod-info-module-gather-info-about-podman-pods" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_pod_module.html b/ansible_collections/containers/podman/docs/podman_pod_module.html
index ff057319e..6cd068f33 100644
--- a/ansible_collections/containers/podman/docs/podman_pod_module.html
+++ b/ansible_collections/containers/podman/docs/podman_pod_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_pod module – Manage Podman pods<a class="headerlink" href="#containers-podman-podman-pod-module-manage-podman-pods" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
@@ -486,6 +486,27 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</div></td>
</tr>
<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_dir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-quadlet-dir"><strong>quadlet_dir</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_dir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Path to the directory to write quadlet file in. By default, it will be set as <code class="docutils literal notranslate"><span class="pre">/etc/containers/systemd/</span></code> for root user, <code class="docutils literal notranslate"><span class="pre">~/.config/containers/systemd/</span></code> for non-root users.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_filename"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-quadlet-filename"><strong>quadlet_filename</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_filename" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Name of quadlet file to write. By default it takes <em>name</em> value.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_options"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-quadlet-options"><strong>quadlet_options</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_options" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Options for the quadlet file. Provide missing in usual container args options as a list of lines to add.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-recreate"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-recreate"><strong>recreate</strong></p>
<a class="ansibleOptionLink" href="#parameter-recreate" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -497,14 +518,14 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-share"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-share"><strong>share</strong></p>
<a class="ansibleOptionLink" href="#parameter-share" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>A comma delimited list of kernel namespaces to share. If none or “” is specified, no namespaces will be shared. The namespaces to choose from are ipc, net, pid, user, uts.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-state"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-state"><strong>state</strong></p>
<a class="ansibleOptionLink" href="#parameter-state" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -519,38 +540,39 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;stopped&quot;</span></code></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;paused&quot;</span></code></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;unpaused&quot;</span></code></p></li>
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;quadlet&quot;</span></code></p></li>
</ul>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-subgidname"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-subgidname"><strong>subgidname</strong></p>
<a class="ansibleOptionLink" href="#parameter-subgidname" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Name for GID map from the /etc/subgid file. Using this flag will run the container with user namespace enabled. This flag conflicts with `userns` and `gidmap`.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-subuidname"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-subuidname"><strong>subuidname</strong></p>
<a class="ansibleOptionLink" href="#parameter-subuidname" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Name for UID map from the /etc/subuid file. Using this flag will run the container with user namespace enabled. This flag conflicts with `userns` and `uidmap`.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-uidmap"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-uidmap"><strong>uidmap</strong></p>
<a class="ansibleOptionLink" href="#parameter-uidmap" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Run the container in a new user namespace using the supplied mapping. This option conflicts with the `userns` and `subuidname` options. This option provides a way to map host UIDs to container UIDs. It can be passed several times to map different ranges.</p>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-userns"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-userns"><strong>userns</strong></p>
<a class="ansibleOptionLink" href="#parameter-userns" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
<td><div class="ansible-option-cell"><p>Set the user namespace mode for all the containers in a pod. It defaults to the PODMAN_USERNS environment variable. An empty value (“”) means user namespaces are disabled.</p>
</div></td>
</tr>
-<tr class="row-even"><td><div class="ansible-option-cell">
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-volume"></div>
<div class="ansibleOptionAnchor" id="parameter-volumes"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-pod-module-parameter-volumes"><span id="ansible-collections-containers-podman-podman-pod-module-parameter-volume"></span><strong>volume</strong></p>
<a class="ansibleOptionLink" href="#parameter-volume" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-aliases">aliases: volumes</span></p>
@@ -565,7 +587,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<section id="examples">
<h2><a class="toc-backref" href="#id4" role="doc-backlink">Examples</a><a class="headerlink" href="#examples" title="Permalink to this heading">¶</a></h2>
<div class="highlight-yaml+jinja notranslate"><div class="highlight"><pre><span></span><span class="c1"># What modules does for example</span>
-<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">podman_pod</span><span class="p">:</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">containers.podman.podman_pod</span><span class="p">:</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">pod1</span>
<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">started</span>
<span class="w"> </span><span class="nt">ports</span><span class="p">:</span>
@@ -577,6 +599,16 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">pod2</span>
<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">started</span>
<span class="w"> </span><span class="nt">publish</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;127.0.0.1::80&quot;</span>
+
+<span class="c1"># Create a Quadlet file for a pod</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">containers.podman.podman_pod</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">qpod</span>
+<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet</span>
+<span class="w"> </span><span class="nt">ports</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;4444:5555&quot;</span>
+<span class="w"> </span><span class="nt">volume</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/var/run/docker.sock:/var/run/docker.sock</span>
+<span class="w"> </span><span class="nt">quadlet_dir</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/custom/dir</span>
</pre></div>
</div>
</section>
diff --git a/ansible_collections/containers/podman/docs/podman_prune_module.html b/ansible_collections/containers/podman/docs/podman_prune_module.html
index a596a9c9d..5340e199c 100644
--- a/ansible_collections/containers/podman/docs/podman_prune_module.html
+++ b/ansible_collections/containers/podman/docs/podman_prune_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_prune module – Allows to prune various podman objects<a class="headerlink" href="#containers-podman-podman-prune-module-allows-to-prune-various-podman-objects" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_runlabel_module.html b/ansible_collections/containers/podman/docs/podman_runlabel_module.html
index 133d14adf..9fa123e9d 100644
--- a/ansible_collections/containers/podman/docs/podman_runlabel_module.html
+++ b/ansible_collections/containers/podman/docs/podman_runlabel_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_runlabel module – Run given label from given image<a class="headerlink" href="#containers-podman-podman-runlabel-module-run-given-label-from-given-image" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_save_module.html b/ansible_collections/containers/podman/docs/podman_save_module.html
index 7a58a96b0..ea7fe01b5 100644
--- a/ansible_collections/containers/podman/docs/podman_save_module.html
+++ b/ansible_collections/containers/podman/docs/podman_save_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_save module – Saves podman image to tar file<a class="headerlink" href="#containers-podman-podman-save-module-saves-podman-image-to-tar-file" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_secret_info_module.html b/ansible_collections/containers/podman/docs/podman_secret_info_module.html
index acab00e36..7c8f69c54 100644
--- a/ansible_collections/containers/podman/docs/podman_secret_info_module.html
+++ b/ansible_collections/containers/podman/docs/podman_secret_info_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_secret_info module – Gather info about podman secrets<a class="headerlink" href="#containers-podman-podman-secret-info-module-gather-info-about-podman-secrets" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_secret_module.html b/ansible_collections/containers/podman/docs/podman_secret_module.html
index ace978f70..11b33f02c 100644
--- a/ansible_collections/containers/podman/docs/podman_secret_module.html
+++ b/ansible_collections/containers/podman/docs/podman_secret_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_secret module – Manage podman secrets<a class="headerlink" href="#containers-podman-podman-secret-module-manage-podman-secrets" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_tag_module.html b/ansible_collections/containers/podman/docs/podman_tag_module.html
index d7a369d5c..17687a89a 100644
--- a/ansible_collections/containers/podman/docs/podman_tag_module.html
+++ b/ansible_collections/containers/podman/docs/podman_tag_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_tag module – Add an additional name to a local image<a class="headerlink" href="#containers-podman-podman-tag-module-add-an-additional-name-to-a-local-image" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_unshare_become.html b/ansible_collections/containers/podman/docs/podman_unshare_become.html
index 0a149528d..ae5b9003b 100644
--- a/ansible_collections/containers/podman/docs/podman_unshare_become.html
+++ b/ansible_collections/containers/podman/docs/podman_unshare_become.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_unshare become – Run tasks using podman unshare<a class="headerlink" href="#containers-podman-podman-unshare-become-run-tasks-using-podman-unshare" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This become plugin is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This become plugin is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.</p>
diff --git a/ansible_collections/containers/podman/docs/podman_volume_info_module.html b/ansible_collections/containers/podman/docs/podman_volume_info_module.html
index 94481a108..35af76fc6 100644
--- a/ansible_collections/containers/podman/docs/podman_volume_info_module.html
+++ b/ansible_collections/containers/podman/docs/podman_volume_info_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_volume_info module – Gather info about podman volumes<a class="headerlink" href="#containers-podman-podman-volume-info-module-gather-info-about-podman-volumes" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
diff --git a/ansible_collections/containers/podman/docs/podman_volume_module.html b/ansible_collections/containers/podman/docs/podman_volume_module.html
index d982f9e1b..11f57bf97 100644
--- a/ansible_collections/containers/podman/docs/podman_volume_module.html
+++ b/ansible_collections/containers/podman/docs/podman_volume_module.html
@@ -37,7 +37,7 @@
<h1>containers.podman.podman_volume module – Manage Podman volumes<a class="headerlink" href="#containers-podman-podman-volume-module-manage-podman-volumes" title="Permalink to this heading">¶</a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
-<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.11.0).</p>
+<p>This module is part of the <a class="reference external" href="https://galaxy.ansible.com/ui/repo/published/containers/podman/">containers.podman collection</a> (version 1.13.0).</p>
<p>It is not included in <code class="docutils literal notranslate"><span class="pre">ansible-core</span></code>.
To check whether it is installed, run <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">list</span></code>.</p>
<p>To install it, use: <code class="code docutils literal notranslate"><span class="pre">ansible-galaxy</span> <span class="pre">collection</span> <span class="pre">install</span> <span class="pre">containers.podman</span></code>.
@@ -126,6 +126,27 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</div></td>
</tr>
<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_dir"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-volume-module-parameter-quadlet-dir"><strong>quadlet_dir</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_dir" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">path</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Path to the directory to write quadlet file in. By default, it will be set as <code class="docutils literal notranslate"><span class="pre">/etc/containers/systemd/</span></code> for root user, <code class="docutils literal notranslate"><span class="pre">~/.config/containers/systemd/</span></code> for non-root users.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_filename"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-volume-module-parameter-quadlet-filename"><strong>quadlet_filename</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_filename" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Name of quadlet file to write. By default it takes <em>name</em> value.</p>
+</div></td>
+</tr>
+<tr class="row-even"><td><div class="ansible-option-cell">
+<div class="ansibleOptionAnchor" id="parameter-quadlet_options"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-volume-module-parameter-quadlet-options"><strong>quadlet_options</strong></p>
+<a class="ansibleOptionLink" href="#parameter-quadlet_options" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">list</span> / <span class="ansible-option-elements">elements=string</span></p>
+</div></td>
+<td><div class="ansible-option-cell"><p>Options for the quadlet file. Provide missing in usual network args options as a list of lines to add.</p>
+</div></td>
+</tr>
+<tr class="row-odd"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-recreate"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-volume-module-parameter-recreate"><strong>recreate</strong></p>
<a class="ansibleOptionLink" href="#parameter-recreate" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">boolean</span></p>
</div></td>
@@ -137,7 +158,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
</ul>
</div></td>
</tr>
-<tr class="row-odd"><td><div class="ansible-option-cell">
+<tr class="row-even"><td><div class="ansible-option-cell">
<div class="ansibleOptionAnchor" id="parameter-state"></div><p class="ansible-option-title" id="ansible-collections-containers-podman-podman-volume-module-parameter-state"><strong>state</strong></p>
<a class="ansibleOptionLink" href="#parameter-state" title="Permalink to this option"></a><p class="ansible-option-type-line"><span class="ansible-option-type">string</span></p>
</div></td>
@@ -146,6 +167,7 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<ul class="simple">
<li><p><code class="ansible-option-default-bold docutils literal notranslate"><strong><span class="pre">&quot;present&quot;</span></strong></code> <span class="ansible-option-choices-default-mark">← (default)</span></p></li>
<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;absent&quot;</span></code></p></li>
+<li><p><code class="ansible-option-choices-entry docutils literal notranslate"><span class="pre">&quot;quadlet&quot;</span></code></p></li>
</ul>
</div></td>
</tr>
@@ -155,7 +177,8 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<section id="examples">
<h2><a class="toc-backref" href="#id4" role="doc-backlink">Examples</a><a class="headerlink" href="#examples" title="Permalink to this heading">¶</a></h2>
<div class="highlight-yaml+jinja notranslate"><div class="highlight"><pre><span></span><span class="c1"># What modules does for example</span>
-<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">podman_volume</span><span class="p">:</span>
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create a volume</span>
+<span class="w"> </span><span class="nt">containers.podman.podman_volume</span><span class="p">:</span>
<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">present</span>
<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">volume1</span>
<span class="w"> </span><span class="nt">label</span><span class="p">:</span>
@@ -164,6 +187,16 @@ see <a class="reference internal" href="#ansible-collections-containers-podman-p
<span class="w"> </span><span class="nt">options</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;device=/dev/loop1&quot;</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;type=ext4&quot;</span>
+
+<span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Create a Quadlet file for a volume</span>
+<span class="w"> </span><span class="nt">containers.podman.podman_volume</span><span class="p">:</span>
+<span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet</span>
+<span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">quadlet_volume</span>
+<span class="w"> </span><span class="nt">quadlet_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">custom-name</span>
+<span class="w"> </span><span class="nt">quadlet_options</span><span class="p">:</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Group=192</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Copy=true</span>
+<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Image=quay.io/centos/centos:latest</span>
</pre></div>
</div>
</section>
diff --git a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py
index ff4c18629..bf42ffdee 100644
--- a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py
+++ b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_container_lib.py
@@ -10,6 +10,9 @@ from ansible_collections.containers.podman.plugins.module_utils.podman.common im
from ansible_collections.containers.podman.plugins.module_utils.podman.common import delete_systemd
from ansible_collections.containers.podman.plugins.module_utils.podman.common import normalize_signal
from ansible_collections.containers.podman.plugins.module_utils.podman.common import ARGUMENTS_OPTS_DICT
+from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state
+from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import ContainerQuadlet
+
__metaclass__ = type
@@ -17,7 +20,7 @@ ARGUMENTS_SPEC_CONTAINER = dict(
name=dict(required=True, type='str'),
executable=dict(default='podman', type='str'),
state=dict(type='str', default='started', choices=[
- 'absent', 'present', 'stopped', 'started', 'created']),
+ 'absent', 'present', 'stopped', 'started', 'created', 'quadlet']),
image=dict(type='str'),
annotation=dict(type='dict'),
attach=dict(type='list', elements='str', choices=['stdout', 'stderr', 'stdin']),
@@ -116,6 +119,9 @@ ARGUMENTS_SPEC_CONTAINER = dict(
publish=dict(type='list', elements='str', aliases=[
'ports', 'published', 'published_ports']),
publish_all=dict(type='bool'),
+ quadlet_dir=dict(type='path'),
+ quadlet_filename=dict(type='str'),
+ quadlet_options=dict(type='list', elements='str'),
read_only=dict(type='bool'),
read_only_tmpfs=dict(type='bool'),
recreate=dict(type='bool', default=False),
@@ -743,6 +749,8 @@ class PodmanDefaults:
self.defaults['ipc'] = "private"
self.defaults['uts'] = "private"
self.defaults['pid'] = "private"
+ if (LooseVersion(self.version) >= LooseVersion('5.0.0')):
+ self.defaults['network'] = ["pasta"]
if (LooseVersion(self.version) >= LooseVersion('3.0.0')):
self.defaults['log_level'] = "warning"
if (LooseVersion(self.version) >= LooseVersion('4.1.0')):
@@ -1180,21 +1188,29 @@ class PodmanContainerDiff:
for cr_net_opt in cr_net:
if 'slirp4netns:' in cr_net_opt:
before = [cr_net_opt]
+ if net_mode_before == 'pasta':
+ cr_net = [i.lower() for i in self._createcommand('--network')]
+ for cr_net_opt in cr_net:
+ if 'pasta:' in cr_net_opt:
+ before = [cr_net_opt]
after = self.params['network'] or []
+ after = [i.lower() for i in after]
# If container is in pod and no networks are provided
if not self.module_params['network'] and self.params['pod']:
after = before
return self._diff_update_and_compare('network', before, after)
# Check special network modes
- if after in [['bridge'], ['host'], ['slirp4netns'], ['none']]:
+ if after in [['bridge'], ['host'], ['slirp4netns'], ['none'], ['pasta']]:
net_mode_after = after[0]
# If changes are only for network mode and container has no networks
if net_mode_after and not before:
# Remove differences between v1 and v2
net_mode_after = net_mode_after.replace('bridge', 'default')
net_mode_after = net_mode_after.replace('slirp4netns', 'default')
+ net_mode_after = net_mode_after.replace('pasta', 'default')
net_mode_before = net_mode_before.replace('bridge', 'default')
net_mode_before = net_mode_before.replace('slirp4netns', 'default')
+ net_mode_before = net_mode_before.replace('pasta', 'default')
return self._diff_update_and_compare('network', net_mode_before, net_mode_after)
# If container is attached to network of a different container
if "container" in net_mode_before:
@@ -1236,6 +1252,8 @@ class PodmanContainerDiff:
s = ":".join(
[str(h["hostport"]), p.replace('/tcp', '')]
).strip(":")
+ if h['hostip'] == '0.0.0.0' and LooseVersion(self.version) >= LooseVersion('5.0.0'):
+ return s
if h['hostip']:
return ":".join([h['hostip'], s])
return s
@@ -1669,6 +1687,9 @@ class PodmanManager:
else:
self.results['diff']['before'] += sysd['diff']['before']
self.results['diff']['after'] += sysd['diff']['after']
+ quadlet = ContainerQuadlet(self.module_params)
+ quadlet_content = quadlet.create_quadlet_content()
+ self.results.update({'podman_quadlet': quadlet_content})
def make_started(self):
"""Run actions if desired state is 'started'."""
@@ -1800,6 +1821,10 @@ class PodmanManager:
self.results.update({'container': {},
'podman_actions': self.container.actions})
+ def make_quadlet(self):
+ results_update = create_quadlet_state(self.module, "container")
+ self.results.update(results_update)
+
def execute(self):
"""Execute the desired action according to map of actions & states."""
states_map = {
@@ -1808,6 +1833,7 @@ class PodmanManager:
'absent': self.make_absent,
'stopped': self.make_stopped,
'created': self.make_created,
+ 'quadlet': self.make_quadlet,
}
process_action = states_map[self.state]
process_action()
diff --git a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py
index 4106136e2..e0031351f 100644
--- a/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py
+++ b/ansible_collections/containers/podman/plugins/module_utils/podman/podman_pod_lib.py
@@ -1,11 +1,12 @@
from __future__ import (absolute_import, division, print_function)
-import json
+import json # noqa: F402
from ansible.module_utils._text import to_bytes, to_native
from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion
from ansible_collections.containers.podman.plugins.module_utils.podman.common import lower_keys
from ansible_collections.containers.podman.plugins.module_utils.podman.common import generate_systemd
from ansible_collections.containers.podman.plugins.module_utils.podman.common import delete_systemd
+from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state, PodQuadlet
__metaclass__ = type
@@ -23,6 +24,7 @@ ARGUMENTS_SPEC_POD = dict(
'stopped',
'paused',
'unpaused',
+ 'quadlet'
]),
recreate=dict(type='bool', default=False),
add_host=dict(type='list', required=False, elements='str'),
@@ -62,6 +64,9 @@ ARGUMENTS_SPEC_POD = dict(
pod_id_file=dict(type='str', required=False),
publish=dict(type='list', required=False,
elements='str', aliases=['ports']),
+ quadlet_dir=dict(type='path'),
+ quadlet_filename=dict(type='str'),
+ quadlet_options=dict(type='list', elements='str'),
share=dict(type='str', required=False),
subgidname=dict(type='str', required=False),
subuidname=dict(type='str', required=False),
@@ -267,7 +272,7 @@ class PodmanPodModuleParams:
return c
def addparam_no_hosts(self, c):
- return c + ["=".join('--no-hosts', self.params['no_hosts'])]
+ return c + ["=".join(['--no-hosts', self.params['no_hosts']])]
def addparam_pid(self, c):
return c + ['--pid', self.params['pid']]
@@ -465,6 +470,7 @@ class PodmanPodDiff:
if before == ['podman']:
before = []
after = self.params['network'] or []
+ after = [i.lower() for i in after]
# Special case for options for slirp4netns rootless networking from v2
if net_mode_before == 'slirp4netns' and 'createcommand' in self.info:
cr_com = self.info['createcommand']
@@ -472,16 +478,24 @@ class PodmanPodDiff:
cr_net = cr_com[cr_com.index('--network') + 1].lower()
if 'slirp4netns:' in cr_net:
before = [cr_net]
+ if net_mode_before == 'pasta' and 'createcommand' in self.info:
+ cr_com = self.info['createcommand']
+ if '--network' in cr_com:
+ cr_net = cr_com[cr_com.index('--network') + 1].lower()
+ if 'pasta:' in cr_net:
+ before = [cr_net]
# Currently supported only 'host' and 'none' network modes idempotency
- if after in [['bridge'], ['host'], ['slirp4netns']]:
+ if after in [['bridge'], ['host'], ['slirp4netns'], ['pasta']]:
net_mode_after = after[0]
if net_mode_after and not before:
# Remove differences between v1 and v2
net_mode_after = net_mode_after.replace('bridge', 'default')
net_mode_after = net_mode_after.replace('slirp4netns', 'default')
+ net_mode_after = net_mode_after.replace('pasta', 'default')
net_mode_before = net_mode_before.replace('bridge', 'default')
net_mode_before = net_mode_before.replace('slirp4netns', 'default')
+ net_mode_before = net_mode_before.replace('pasta', 'default')
return self._diff_update_and_compare('network', net_mode_before, net_mode_after)
# For 4.4.0+ podman versions with no network specified
if not net_mode_after and net_mode_before == 'slirp4netns' and not after:
@@ -492,6 +506,11 @@ class PodmanPodDiff:
net_mode_after = 'bridge'
if before == ['bridge']:
after = ['bridge']
+ # For pasta networking for Podman v5
+ if not net_mode_after and net_mode_before == 'pasta' and not after:
+ net_mode_after = 'pasta'
+ if before == ['pasta']:
+ after = ['pasta']
before, after = sorted(list(set(before))), sorted(list(set(after)))
return self._diff_update_and_compare('network', before, after)
@@ -507,6 +526,8 @@ class PodmanPodDiff:
s = ":".join(
[str(h["hostport"]), p.replace('/tcp', '')]
).strip(":")
+ if h['hostip'] == '0.0.0.0' and LooseVersion(self.version) >= LooseVersion('5.0.0'):
+ return s
if h['hostip']:
return ":".join([h['hostip'], s])
return s
@@ -658,7 +679,16 @@ class PodmanPod:
# pylint: disable=unused-variable
rc, out, err = self.module.run_command(
[self.module_params['executable'], b'pod', b'inspect', self.name])
- return json.loads(out) if rc == 0 else {}
+ if rc == 0:
+ info = json.loads(out)
+ # from podman 5 onwards, this is a list of dicts,
+ # before it was just a single dict when querying
+ # a single pod
+ if isinstance(info, list):
+ return info[0]
+ else:
+ return info
+ return {}
def get_ps(self):
"""Inspect pod process and gather info about it."""
@@ -791,6 +821,8 @@ class PodmanPodManager:
(default: {True})
"""
facts = self.pod.get_info() if changed else self.pod.info
+ if isinstance(facts, list):
+ facts = facts[0]
out, err = self.pod.stdout, self.pod.stderr
self.results.update({'changed': changed, 'pod': facts,
'podman_actions': self.pod.actions},
@@ -812,6 +844,9 @@ class PodmanPodManager:
else:
self.results['diff']['before'] += sysd['diff']['before']
self.results['diff']['after'] += sysd['diff']['after']
+ quadlet = PodQuadlet(self.module_params)
+ quadlet_content = quadlet.create_quadlet_content()
+ self.results.update({'podman_quadlet': quadlet_content})
def execute(self):
"""Execute the desired action according to map of actions & states."""
@@ -824,7 +859,7 @@ class PodmanPodManager:
'killed': self.make_killed,
'paused': self.make_paused,
'unpaused': self.make_unpaused,
-
+ 'quadlet': self.make_quadlet,
}
process_action = states_map[self.state]
process_action()
@@ -926,3 +961,7 @@ class PodmanPodManager:
self.results.update({'changed': True})
self.results.update({'pod': {},
'podman_actions': self.pod.actions})
+
+ def make_quadlet(self):
+ results_update = create_quadlet_state(self.module, "pod")
+ self.results.update(results_update)
diff --git a/ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py b/ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py
new file mode 100644
index 000000000..17764b60d
--- /dev/null
+++ b/ansible_collections/containers/podman/plugins/module_utils/podman/quadlet.py
@@ -0,0 +1,636 @@
+# Copyright (c) 2024 Sagi Shnaidman (@sshnaidm)
+# 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 os
+
+from ansible_collections.containers.podman.plugins.module_utils.podman.common import compare_systemd_file_content
+
+QUADLET_ROOT_PATH = "/etc/containers/systemd/"
+QUADLET_NON_ROOT_PATH = "~/.config/containers/systemd/"
+
+
+class Quadlet:
+ param_map = {}
+
+ def __init__(self, section: str, params: dict):
+ self.section = section
+ self.custom_params = self.custom_prepare_params(params)
+ self.dict_params = self.prepare_params()
+
+ def custom_prepare_params(self, params: dict) -> dict:
+ """
+ Custom parameter processing for specific Quadlet types.
+ """
+ # This should be implemented in child classes if needed.
+ return params
+
+ def prepare_params(self) -> dict:
+ """
+ Convert parameter values as per param_map.
+ """
+ processed_params = []
+ for param_key, quadlet_key in self.param_map.items():
+ value = self.custom_params.get(param_key)
+ if value is not None:
+ if isinstance(value, list):
+ # Add an entry for each item in the list
+ for item in value:
+ processed_params.append([quadlet_key, item])
+ else:
+ if isinstance(value, bool):
+ value = str(value).lower()
+ # Add a single entry for the key
+ processed_params.append([quadlet_key, value])
+ return processed_params
+
+ def create_quadlet_content(self) -> str:
+ """
+ Construct the quadlet content as a string.
+ """
+ custom_user_options = self.custom_params.get("quadlet_options")
+ custom_text = "\n" + "\n".join(custom_user_options) if custom_user_options else ""
+ return f"[{self.section}]\n" + "\n".join(
+ f"{key}={value}" for key, value in self.dict_params
+ ) + custom_text + "\n"
+
+ def write_to_file(self, path: str):
+ """
+ Write the quadlet content to a file at the specified path.
+ """
+ content = self.create_quadlet_content()
+ with open(path, 'w') as file:
+ file.write(content)
+
+
+class ContainerQuadlet(Quadlet):
+ param_map = {
+ 'cap_add': 'AddCapability',
+ 'device': 'AddDevice',
+ 'annotation': 'Annotation',
+ 'name': 'ContainerName',
+ # the following are not implemented yet in Podman module
+ 'AutoUpdate': 'AutoUpdate',
+ 'ContainersConfModule': 'ContainersConfModule',
+ # end of not implemented yet
+ 'dns': 'DNS',
+ 'dns_option': 'DNSOption',
+ 'dns_search': 'DNSSearch',
+ 'cap_drop': 'DropCapability',
+ 'entrypoint': 'Entrypoint',
+ 'env': 'Environment',
+ 'env_file': 'EnvironmentFile',
+ 'env_host': 'EnvironmentHost',
+ 'command': 'Exec',
+ 'expose': 'ExposeHostPort',
+ 'gidmap': 'GIDMap',
+ 'global_args': 'GlobalArgs',
+ 'group': 'Group', # Does not exist in module parameters
+ 'healthcheck': 'HealthCheckCmd',
+ 'healthcheck_interval': 'HealthInterval',
+ 'healthcheck_failure_action': 'HealthOnFailure',
+ 'healthcheck_retries': 'HealthRetries',
+ 'healthcheck_start_period': 'HealthStartPeriod',
+ 'healthcheck_timeout': 'HealthTimeout',
+ # the following are not implemented yet in Podman module
+ 'HealthStartupCmd': 'HealthStartupCmd',
+ 'HealthStartupInterval': 'HealthStartupInterval',
+ 'HealthStartupRetries': 'HealthStartupRetries',
+ 'HealthStartupSuccess': 'HealthStartupSuccess',
+ 'HealthStartupTimeout': 'HealthStartupTimeout',
+ # end of not implemented yet
+ 'hostname': 'HostName',
+ 'image': 'Image',
+ 'ip': 'IP',
+ # the following are not implemented yet in Podman module
+ 'IP6': 'IP6',
+ # end of not implemented yet
+ 'label': 'Label',
+ 'log_driver': 'LogDriver',
+ "Mask": "Mask", # add it in security_opt
+ 'mount': 'Mount',
+ 'network': 'Network',
+ 'no_new_privileges': 'NoNewPrivileges',
+ 'sdnotify': 'Notify',
+ 'pids_limit': 'PidsLimit',
+ 'pod': 'Pod',
+ 'publish': 'PublishPort',
+ # the following are not implemented yet in Podman module
+ "Pull": "Pull",
+ # end of not implemented yet
+ 'read_only': 'ReadOnly',
+ 'read_only_tmpfs': 'ReadOnlyTmpfs',
+ 'rootfs': 'Rootfs',
+ 'init': 'RunInit',
+ 'SeccompProfile': 'SeccompProfile',
+ 'secrets': 'Secret',
+ # All these are in security_opt
+ 'SecurityLabelDisable': 'SecurityLabelDisable',
+ 'SecurityLabelFileType': 'SecurityLabelFileType',
+ 'SecurityLabelLevel': 'SecurityLabelLevel',
+ 'SecurityLabelNested': 'SecurityLabelNested',
+ 'SecurityLabelType': 'SecurityLabelType',
+ 'shm_size': 'ShmSize',
+ 'stop_timeout': 'StopTimeout',
+ 'subgidname': 'SubGIDMap',
+ 'subuidname': 'SubUIDMap',
+ 'sysctl': 'Sysctl',
+ 'timezone': 'Timezone',
+ 'tmpfs': 'Tmpfs',
+ 'uidmap': 'UIDMap',
+ 'ulimit': 'Ulimit',
+ 'Unmask': 'Unmask', # --security-opt unmask=ALL
+ 'user': 'User',
+ 'userns': 'UserNS',
+ 'volume': 'Volume',
+ 'workdir': 'WorkingDir',
+ 'podman_args': 'PodmanArgs',
+ }
+
+ def __init__(self, params: dict):
+ super().__init__("Container", params)
+
+ def custom_prepare_params(self, params: dict) -> dict:
+ """
+ Custom parameter processing for container-specific parameters.
+ """
+ # Work on params in params_map and convert them to a right form
+ if params["annotation"]:
+ params['annotation'] = ["%s=%s" %
+ (k, v) for k, v in params['annotation'].items()]
+ if params["cap_add"]:
+ params["cap_add"] = " ".join(params["cap_add"])
+ if params["cap_drop"]:
+ params["cap_drop"] = " ".join(params["cap_drop"])
+ if params["command"]:
+ params["command"] = (" ".join(params["command"])
+ if isinstance(params["command"], list)
+ else params["command"])
+ if params["label"]:
+ params["label"] = ["%s=%s" % (k, v) for k, v in params["label"].items()]
+ if params["env"]:
+ params["env"] = ["%s=%s" % (k, v) for k, v in params["env"].items()]
+ if params["sysctl"]:
+ params["sysctl"] = ["%s=%s" % (k, v) for k, v in params["sysctl"].items()]
+ if params["tmpfs"]:
+ params["tmpfs"] = ["%s:%s" % (k, v) if v else k for k, v in params["tmpfs"].items()]
+
+ # Work on params which are not in the param_map but can be calculated
+ params["global_args"] = []
+ if params["user"] and len(str(params["user"]).split(":")) > 1:
+ user, group = params["user"].split(":")
+ params["user"] = user
+ params["group"] = group
+ if params["security_opt"]:
+ if "no-new-privileges" in params["security_opt"]:
+ params["no_new_privileges"] = True
+ params["security_opt"].remove("no-new-privileges")
+ if params["log_level"]:
+ params["global_args"].append(f"--log-level {params['log_level']}")
+ if params["debug"]:
+ params["global_args"].append("--log-level debug")
+
+ # Work on params which are not in the param_map and add them to PodmanArgs
+ params["podman_args"] = []
+ if params["authfile"]:
+ params["podman_args"].append(f"--authfile {params['authfile']}")
+ if params["attach"]:
+ for attach in params["attach"]:
+ params["podman_args"].append(f"--attach {attach}")
+ if params["blkio_weight"]:
+ params["podman_args"].append(f"--blkio-weight {params['blkio_weight']}")
+ if params["blkio_weight_device"]:
+ params["podman_args"].append(" ".join([
+ f"--blkio-weight-device {':'.join(blkio)}" for blkio in params["blkio_weight_device"].items()]))
+ if params["cgroupns"]:
+ params["podman_args"].append(f"--cgroupns {params['cgroupns']}")
+ if params["cgroup_parent"]:
+ params["podman_args"].append(f"--cgroup-parent {params['cgroup_parent']}")
+ if params["cidfile"]:
+ params["podman_args"].append(f"--cidfile {params['cidfile']}")
+ if params["conmon_pidfile"]:
+ params["podman_args"].append(f"--conmon-pidfile {params['conmon_pidfile']}")
+ if params["cpuset_cpus"]:
+ params["podman_args"].append(f"--cpuset-cpus {params['cpuset_cpus']}")
+ if params["cpuset_mems"]:
+ params["podman_args"].append(f"--cpuset-mems {params['cpuset_mems']}")
+ if params["cpu_period"]:
+ params["podman_args"].append(f"--cpu-period {params['cpu_period']}")
+ if params["cpu_quota"]:
+ params["podman_args"].append(f"--cpu-quota {params['cpu_quota']}")
+ if params["cpu_rt_period"]:
+ params["podman_args"].append(f"--cpu-rt-period {params['cpu_rt_period']}")
+ if params["cpu_rt_runtime"]:
+ params["podman_args"].append(f"--cpu-rt-runtime {params['cpu_rt_runtime']}")
+ if params["cpu_shares"]:
+ params["podman_args"].append(f"--cpu-shares {params['cpu_shares']}")
+ if params["device_read_bps"]:
+ for i in params["device_read_bps"]:
+ params["podman_args"].append(f"--device-read-bps {i}")
+ if params["device_read_iops"]:
+ for i in params["device_read_iops"]:
+ params["podman_args"].append(f"--device-read-iops {i}")
+ if params["device_write_bps"]:
+ for i in params["device_write_bps"]:
+ params["podman_args"].append(f"--device-write-bps {i}")
+ if params["device_write_iops"]:
+ for i in params["device_write_iops"]:
+ params["podman_args"].append(f"--device-write-iops {i}")
+ if params["etc_hosts"]:
+ for host_ip in params['etc_hosts'].items():
+ params["podman_args"].append(f"--add-host {':'.join(host_ip)}")
+ if params["hooks_dir"]:
+ for hook in params["hooks_dir"]:
+ params["podman_args"].append(f"--hooks-dir {hook}")
+ if params["http_proxy"]:
+ params["podman_args"].append(f"--http-proxy {params['http_proxy']}")
+ if params["image_volume"]:
+ params["podman_args"].append(f"--image-volume {params['image_volume']}")
+ if params["init_path"]:
+ params["podman_args"].append(f"--init-path {params['init_path']}")
+ if params["interactive"]:
+ params["podman_args"].append("--interactive")
+ if params["ipc"]:
+ params["podman_args"].append(f"--ipc {params['ipc']}")
+ if params["kernel_memory"]:
+ params["podman_args"].append(f"--kernel-memory {params['kernel_memory']}")
+ if params["label_file"]:
+ params["podman_args"].append(f"--label-file {params['label_file']}")
+ if params["log_opt"]:
+ for k, v in params['log_opt'].items():
+ params["podman_args"].append(f"--log-opt {k.replace('max_size', 'max-size')}={v}")
+ if params["mac_address"]:
+ params["podman_args"].append(f"--mac-address {params['mac_address']}")
+ if params["memory"]:
+ params["podman_args"].append(f"--memory {params['memory']}")
+ if params["memory_reservation"]:
+ params["podman_args"].append(f"--memory-reservation {params['memory_reservation']}")
+ if params["memory_swap"]:
+ params["podman_args"].append(f"--memory-swap {params['memory_swap']}")
+ if params["memory_swappiness"]:
+ params["podman_args"].append(f"--memory-swappiness {params['memory_swappiness']}")
+ if params["network_aliases"]:
+ for alias in params["network_aliases"]:
+ params["podman_args"].append(f"--network-alias {alias}")
+ if params["no_hosts"] is not None:
+ params["podman_args"].append(f"--no-hosts={params['no_hosts']}")
+ if params["oom_kill_disable"]:
+ params["podman_args"].append(f"--oom-kill-disable={params['oom_kill_disable']}")
+ if params["oom_score_adj"]:
+ params["podman_args"].append(f"--oom-score-adj {params['oom_score_adj']}")
+ if params["pid"]:
+ params["podman_args"].append(f"--pid {params['pid']}")
+ if params["privileged"]:
+ params["podman_args"].append("--privileged")
+ if params["publish_all"]:
+ params["podman_args"].append("--publish-all")
+ if params["requires"]:
+ params["podman_args"].append(f"--requires {','.join(params['requires'])}")
+ if params["restart_policy"]:
+ params["podman_args"].append(f"--restart-policy {params['restart_policy']}")
+ if params["rm"]:
+ params["podman_args"].append("--rm")
+ if params["security_opt"]:
+ for security_opt in params["security_opt"]:
+ params["podman_args"].append(f"--security-opt {security_opt}")
+ if params["sig_proxy"]:
+ params["podman_args"].append(f"--sig-proxy {params['sig_proxy']}")
+ if params["stop_signal"]:
+ params["podman_args"].append(f"--stop-signal {params['stop_signal']}")
+ if params["systemd"]:
+ params["podman_args"].append(f"--systemd={str(params['systemd']).lower()}")
+ if params["tty"]:
+ params["podman_args"].append("--tty")
+ if params["uts"]:
+ params["podman_args"].append(f"--uts {params['uts']}")
+ if params["volumes_from"]:
+ for volume in params["volumes_from"]:
+ params["podman_args"].append(f"--volumes-from {volume}")
+ if params["cmd_args"]:
+ params["podman_args"].append(params["cmd_args"])
+
+ # Return params with custom processing applied
+ return params
+
+
+class NetworkQuadlet(Quadlet):
+ param_map = {
+ 'name': 'NetworkName',
+ 'internal': 'Internal',
+ 'driver': 'Driver',
+ 'gateway': 'Gateway',
+ 'disable_dns': 'DisableDNS',
+ 'subnet': 'Subnet',
+ 'ip_range': 'IPRange',
+ 'ipv6': 'IPv6',
+ "opt": "Options",
+ # Add more parameter mappings specific to networks
+ 'ContainersConfModule': 'ContainersConfModule',
+ "DNS": "DNS",
+ "IPAMDriver": "IPAMDriver",
+ "Label": "Label",
+ "global_args": "GlobalArgs",
+ "podman_args": "PodmanArgs",
+ }
+
+ def __init__(self, params: dict):
+ super().__init__("Network", params)
+
+ def custom_prepare_params(self, params: dict) -> dict:
+ """
+ Custom parameter processing for network-specific parameters.
+ """
+ # Work on params in params_map and convert them to a right form
+ if params["debug"]:
+ params["global_args"].append("--log-level debug")
+ if params["opt"]:
+ new_opt = []
+ for k, v in params["opt"].items():
+ if v is not None:
+ new_opt.append(f"{k}={v}")
+ params["opt"] = new_opt
+ return params
+
+
+# This is a inherited class that represents a Quadlet file for the Podman pod
+class PodQuadlet(Quadlet):
+ param_map = {
+ 'name': 'PodName',
+ "network": "Network",
+ "publish": "PublishPort",
+ "volume": "Volume",
+ 'ContainersConfModule': 'ContainersConfModule',
+ "global_args": "GlobalArgs",
+ "podman_args": "PodmanArgs",
+ }
+
+ def __init__(self, params: dict):
+ super().__init__("Pod", params)
+
+ def custom_prepare_params(self, params: dict) -> dict:
+ """
+ Custom parameter processing for pod-specific parameters.
+ """
+ # Work on params in params_map and convert them to a right form
+ params["global_args"] = []
+ params["podman_args"] = []
+
+ if params["add_host"]:
+ for host in params['add_host']:
+ params["podman_args"].append(f"--add-host {host}")
+ if params["cgroup_parent"]:
+ params["podman_args"].append(f"--cgroup-parent {params['cgroup_parent']}")
+ if params["blkio_weight"]:
+ params["podman_args"].append(f"--blkio-weight {params['blkio_weight']}")
+ if params["blkio_weight_device"]:
+ params["podman_args"].append(" ".join([
+ f"--blkio-weight-device {':'.join(blkio)}" for blkio in params["blkio_weight_device"].items()]))
+ if params["cpuset_cpus"]:
+ params["podman_args"].append(f"--cpuset-cpus {params['cpuset_cpus']}")
+ if params["cpuset_mems"]:
+ params["podman_args"].append(f"--cpuset-mems {params['cpuset_mems']}")
+ if params["cpu_shares"]:
+ params["podman_args"].append(f"--cpu-shares {params['cpu_shares']}")
+ if params["cpus"]:
+ params["podman_args"].append(f"--cpus {params['cpus']}")
+ if params["device"]:
+ for device in params["device"]:
+ params["podman_args"].append(f"--device {device}")
+ if params["device_read_bps"]:
+ for i in params["device_read_bps"]:
+ params["podman_args"].append(f"--device-read-bps {i}")
+ if params["device_write_bps"]:
+ for i in params["device_write_bps"]:
+ params["podman_args"].append(f"--device-write-bps {i}")
+ if params["dns"]:
+ for dns in params["dns"]:
+ params["podman_args"].append(f"--dns {dns}")
+ if params["dns_opt"]:
+ for dns_option in params["dns_opt"]:
+ params["podman_args"].append(f"--dns-option {dns_option}")
+ if params["dns_search"]:
+ for dns_search in params["dns_search"]:
+ params["podman_args"].append(f"--dns-search {dns_search}")
+ if params["gidmap"]:
+ for gidmap in params["gidmap"]:
+ params["podman_args"].append(f"--gidmap {gidmap}")
+ if params["hostname"]:
+ params["podman_args"].append(f"--hostname {params['hostname']}")
+ if params["infra"]:
+ params["podman_args"].append(f"--infra {params['infra']}")
+ if params["infra_command"]:
+ params["podman_args"].append(f"--infra-command {params['infra_command']}")
+ if params["infra_conmon_pidfile"]:
+ params["podman_args"].append(f"--infra-conmon-pidfile {params['infra_conmon_pidfile']}")
+ if params["infra_image"]:
+ params["podman_args"].append(f"--infra-image {params['infra_image']}")
+ if params["infra_name"]:
+ params["podman_args"].append(f"--infra-name {params['infra_name']}")
+ if params["ip"]:
+ params["podman_args"].append(f"--ip {params['ip']}")
+ if params["label"]:
+ for label, label_v in params["label"].items():
+ params["podman_args"].append(f"--label {label}={label_v}")
+ if params["label_file"]:
+ params["podman_args"].append(f"--label-file {params['label_file']}")
+ if params["mac_address"]:
+ params["podman_args"].append(f"--mac-address {params['mac_address']}")
+ if params["memory"]:
+ params["podman_args"].append(f"--memory {params['memory']}")
+ if params["memory_swap"]:
+ params["podman_args"].append(f"--memory-swap {params['memory_swap']}")
+ if params["no_hosts"]:
+ params["podman_args"].append(f"--no-hosts {params['no_hosts']}")
+ if params["pid"]:
+ params["podman_args"].append(f"--pid {params['pid']}")
+ if params["pod_id_file"]:
+ params["podman_args"].append(f"--pod-id-file {params['pod_id_file']}")
+ if params["share"]:
+ params["podman_args"].append(f"--share {params['share']}")
+ if params["subgidname"]:
+ params["podman_args"].append(f"--subgidname {params['subgidname']}")
+ if params["subuidname"]:
+ params["podman_args"].append(f"--subuidname {params['subuidname']}")
+ if params["uidmap"]:
+ for uidmap in params["uidmap"]:
+ params["podman_args"].append(f"--uidmap {uidmap}")
+ if params["userns"]:
+ params["podman_args"].append(f"--userns {params['userns']}")
+ if params["debug"]:
+ params["global_args"].append("--log-level debug")
+
+ return params
+
+
+# This is a inherited class that represents a Quadlet file for the Podman volume
+class VolumeQuadlet(Quadlet):
+ param_map = {
+ 'name': 'VolumeName',
+ 'driver': 'Driver',
+ 'label': 'Label',
+ # 'opt': 'Options',
+ 'ContainersConfModule': 'ContainersConfModule',
+ 'global_args': 'GlobalArgs',
+ 'podman_args': 'PodmanArgs',
+ }
+
+ def __init__(self, params: dict):
+ super().__init__("Volume", params)
+
+ def custom_prepare_params(self, params: dict) -> dict:
+ """
+ Custom parameter processing for volume-specific parameters.
+ """
+ # Work on params in params_map and convert them to a right form
+ params["global_args"] = []
+ params["podman_args"] = []
+
+ if params["debug"]:
+ params["global_args"].append("--log-level debug")
+ if params["label"]:
+ params["label"] = ["%s=%s" % (k, v) for k, v in params["label"].items()]
+ if params["options"]:
+ for opt in params["options"]:
+ params["podman_args"].append(f"--opt {opt}")
+
+ return params
+
+
+# This is a inherited class that represents a Quadlet file for the Podman kube
+class KubeQuadlet(Quadlet):
+ param_map = {
+ 'configmap': 'ConfigMap',
+ 'log_driver': 'LogDriver',
+ 'network': 'Network',
+ 'kube_file': 'Yaml',
+ 'userns': 'UserNS',
+ 'AutoUpdate': 'AutoUpdate',
+ 'ExitCodePropagation': 'ExitCodePropagation',
+ 'KubeDownForce': 'KubeDownForce',
+ 'PublishPort': 'PublishPort',
+ 'SetWorkingDirectory': 'SetWorkingDirectory',
+ 'ContainersConfModule': 'ContainersConfModule',
+ 'global_args': 'GlobalArgs',
+ 'podman_args': 'PodmanArgs',
+ }
+
+ def __init__(self, params: dict):
+ super().__init__("Kube", params)
+
+ def custom_prepare_params(self, params: dict) -> dict:
+ """
+ Custom parameter processing for kube-specific parameters.
+ """
+ # Work on params in params_map and convert them to a right form
+ params["global_args"] = []
+ params["podman_args"] = []
+
+ if params["debug"]:
+ params["global_args"].append("--log-level debug")
+
+ return params
+
+
+# This is a inherited class that represents a Quadlet file for the Podman image
+class ImageQuadlet(Quadlet):
+ param_map = {
+ 'AllTags': 'AllTags',
+ 'arch': 'Arch',
+ 'authfile': 'AuthFile',
+ 'ca_cert_dir': 'CertDir',
+ 'creds': 'Creds',
+ 'DecryptionKey': 'DecryptionKey',
+ 'name': 'Image',
+ 'ImageTag': 'ImageTag',
+ 'OS': 'OS',
+ 'validate_certs': 'TLSVerify',
+ 'Variant': 'Variant',
+ 'ContainersConfModule': 'ContainersConfModule',
+ 'global_args': 'GlobalArgs',
+ 'podman_args': 'PodmanArgs',
+ }
+
+ def __init__(self, params: dict):
+ super().__init__("Image", params)
+
+ def custom_prepare_params(self, params: dict) -> dict:
+ """
+ Custom parameter processing for image-specific parameters.
+ """
+ # Work on params in params_map and convert them to a right form
+ params["global_args"] = []
+ params["podman_args"] = []
+
+ if params["username"] and params["password"]:
+ params["creds"] = f"{params['username']}:{params['password']}"
+ # if params['validate_certs'] is not None:
+ # params['validate_certs'] = str(params['validate_certs']).lower()
+
+ return params
+
+
+def check_quadlet_directory(module, quadlet_dir):
+ '''Check if the directory exists and is writable. If not, fail the module.'''
+ if not os.path.exists(quadlet_dir):
+ try:
+ os.makedirs(quadlet_dir)
+ except Exception as e:
+ module.fail_json(
+ msg="Directory for quadlet_file can't be created: %s" % e)
+ if not os.access(quadlet_dir, os.W_OK):
+ module.fail_json(
+ msg="Directory for quadlet_file is not writable: %s" % quadlet_dir)
+
+
+def create_quadlet_state(module, issuer):
+ '''Create a quadlet file for the specified issuer.'''
+ class_map = {
+ "container": ContainerQuadlet,
+ "network": NetworkQuadlet,
+ "pod": PodQuadlet,
+ "volume": VolumeQuadlet,
+ "kube": KubeQuadlet,
+ "image": ImageQuadlet,
+ }
+ # Let's detect which user is running
+ user = "root" if os.geteuid() == 0 else "user"
+ quadlet_dir = module.params.get('quadlet_dir')
+ if not quadlet_dir:
+ if user == "root":
+ quadlet_dir = QUADLET_ROOT_PATH
+ else:
+ quadlet_dir = os.path.expanduser(QUADLET_NON_ROOT_PATH)
+ # Create a filename based on the issuer
+ if not module.params.get('name') and not module.params.get('quadlet_filename'):
+ module.fail_json(msg=f"Filename for {issuer} is required for creating a quadlet file.")
+ if issuer == "image":
+ name = module.params['name'].split("/")[-1].split(":")[0]
+ else:
+ name = module.params.get('name')
+ quad_file_name = module.params['quadlet_filename']
+ if quad_file_name and not quad_file_name.endswith(f".{issuer}"):
+ quad_file_name = f"{quad_file_name}.{issuer}"
+ filename = quad_file_name or f"{name}.{issuer}"
+ quadlet_file_path = os.path.join(quadlet_dir, filename)
+ # Check if the directory exists and is writable
+ check_quadlet_directory(module, quadlet_dir)
+ # Check if file already exists and if it's different
+ quadlet = class_map[issuer](module.params)
+ quadlet_content = quadlet.create_quadlet_content()
+ file_diff = compare_systemd_file_content(quadlet_file_path, quadlet_content)
+ if bool(file_diff):
+ quadlet.write_to_file(quadlet_file_path)
+ results_update = {
+ 'changed': True,
+ "diff": {
+ "before": "\n".join(file_diff[0]) if isinstance(file_diff[0], list) else file_diff[0] + "\n",
+ "after": "\n".join(file_diff[1]) if isinstance(file_diff[1], list) else file_diff[1] + "\n",
+ }}
+ else:
+ results_update = {}
+ return results_update
+
+# Check with following command:
+# QUADLET_UNIT_DIRS=<Directory> /usr/lib/systemd/system-generators/podman-system-generator {--user} --dryrun
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_container.py b/ansible_collections/containers/podman/plugins/modules/podman_container.py
index 51cb57a53..75349f14e 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_container.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_container.py
@@ -55,6 +55,8 @@ options:
If container doesn't exist, the module creates it and leaves it in
'created' state. If configuration doesn't match or 'recreate' option is
set, the container will be recreated
+ - I(quadlet) - Write a quadlet file with the specified configuration.
+ Requires the C(quadlet_dir) option to be set.
type: str
default: started
choices:
@@ -63,6 +65,7 @@ options:
- stopped
- started
- created
+ - quadlet
image:
description:
- Repository path (or image name) and tag used to create the container.
@@ -721,6 +724,22 @@ options:
- Publish all exposed ports to random ports on the host interfaces. The
default is false.
type: bool
+ quadlet_dir:
+ description:
+ - Path to the directory to write quadlet file in.
+ By default, it will be set as C(/etc/containers/systemd/) for root user,
+ C(~/.config/containers/systemd/) for non-root users.
+ type: path
+ quadlet_filename:
+ description:
+ - Name of quadlet file to write. By default it takes C(name) value.
+ type: str
+ quadlet_options:
+ description:
+ - Options for the quadlet file. Provide missing in usual container args
+ options as a list of lines to add.
+ type: list
+ elements: str
read_only:
description:
- Mount the container's root filesystem as read only. Default is false
@@ -994,6 +1013,23 @@ EXAMPLES = r"""
- --deploy-hook
- "echo 1 > /var/lib/letsencrypt/complete"
+- name: Create a Quadlet file
+ containers.podman.podman_container:
+ name: quadlet-container
+ image: nginx
+ state: quadlet
+ quadlet_filename: custome-container
+ device: "/dev/sda:/dev/xvda:rwm"
+ ports:
+ - "8080:80"
+ volumes:
+ - "/var/www:/usr/share/nginx/html"
+ quadlet_options:
+ - "AutoUpdate=registry"
+ - "Pull=true"
+ - |
+ [Install]
+ WantedBy=default.target
"""
RETURN = r"""
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py b/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py
index d30e85cdb..1827b0ce7 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_container_exec.py
@@ -40,6 +40,11 @@ options:
description:
- Set environment variables.
type: dict
+ executable:
+ description:
+ - The path to the podman executable.
+ type: str
+ default: podman
privileged:
description:
- Give extended privileges to the container.
@@ -141,6 +146,7 @@ def run_container_exec(module: AnsibleModule) -> dict:
tty = module.params['tty']
user = module.params['user']
workdir = module.params['workdir']
+ executable = module.params['executable']
if command is not None:
argv = shlex.split(command)
@@ -156,7 +162,7 @@ def run_container_exec(module: AnsibleModule) -> dict:
to_text(value, errors='surrogate_or_strict')
exec_options += ['--env',
- '%s="%s"' % (key, value)]
+ '%s=%s' % (key, value)]
if privileged:
exec_options.append('--privileged')
@@ -178,7 +184,7 @@ def run_container_exec(module: AnsibleModule) -> dict:
exec_with_args.extend(exec_options)
rc, stdout, stderr = run_podman_command(
- module=module, executable='podman', args=exec_with_args)
+ module=module, executable=executable, args=exec_with_args, ignore_errors=True)
result = {
'changed': changed,
@@ -211,6 +217,10 @@ def main():
'type': 'bool',
'default': False,
},
+ 'executable': {
+ 'type': 'str',
+ 'default': 'podman',
+ },
'env': {
'type': 'dict',
},
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py b/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py
index 486a18a86..b27c16c6e 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_generate_systemd.py
@@ -183,6 +183,7 @@ EXAMPLES = '''
- name: Postgres container must be started and enabled on systemd
ansible.builtin.systemd:
name: container-postgres_local
+ scope: user
daemon_reload: true
state: started
enabled: true
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_image.py b/ansible_collections/containers/podman/plugins/modules/podman_image.py
index 6305a5d5b..7fcb0041a 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_image.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_image.py
@@ -64,6 +64,7 @@ DOCUMENTATION = r'''
- present
- absent
- build
+ - quadlet
validate_certs:
description:
- Require HTTPS and validate certificates when pulling or pushing. Also used during build if a pull or push is necessary.
@@ -175,6 +176,24 @@ DOCUMENTATION = r'''
- docker-daemon
- oci-archive
- ostree
+ quadlet_dir:
+ description:
+ - Path to the directory to write quadlet file in.
+ By default, it will be set as C(/etc/containers/systemd/) for root user,
+ C(~/.config/containers/systemd/) for non-root users.
+ type: path
+ required: false
+ quadlet_filename:
+ description:
+ - Name of quadlet file to write. By default it takes image name without prefixes and tags.
+ type: str
+ quadlet_options:
+ description:
+ - Options for the quadlet file. Provide missing in usual network args
+ options as a list of lines to add.
+ type: list
+ elements: str
+ required: false
'''
EXAMPLES = r"""
@@ -280,6 +299,18 @@ EXAMPLES = r"""
containers.podman.podman_image:
name: nginx
arch: amd64
+
+- name: Create a quadlet file for an image
+ containers.podman.podman_image:
+ name: docker.io/library/alpine:latest
+ state: quadlet
+ quadlet_dir: /etc/containers/systemd
+ quadlet_filename: alpine-latest
+ quadlet_options:
+ - Variant=arm/v7
+ - |
+ [Install]
+ WantedBy=default.target
"""
RETURN = r"""
@@ -410,6 +441,7 @@ import shlex
from ansible.module_utils._text import to_native
from ansible.module_utils.basic import AnsibleModule
from ansible_collections.containers.podman.plugins.module_utils.podman.common import run_podman_command
+from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state
class PodmanImageManager(object):
@@ -451,6 +483,9 @@ class PodmanImageManager(object):
if self.state in ['absent']:
self.absent()
+ if self.state == 'quadlet':
+ self.make_quadlet()
+
def _run(self, args, expected_rc=0, ignore_errors=False):
cmd = " ".join([self.executable]
+ [to_native(i) for i in args])
@@ -537,6 +572,11 @@ class PodmanImageManager(object):
if not self.module.check_mode:
self.remove_image_id()
+ def make_quadlet(self):
+ results_update = create_quadlet_state(self.module, "image")
+ self.results.update(results_update)
+ self.module.exit_json(**self.results)
+
def find_image(self, image_name=None):
if image_name is None:
image_name = self.image_name
@@ -810,13 +850,16 @@ def main():
push=dict(type='bool', default=False),
path=dict(type='str'),
force=dict(type='bool', default=False),
- state=dict(type='str', default='present', choices=['absent', 'present', 'build']),
+ state=dict(type='str', default='present', choices=['absent', 'present', 'build', 'quadlet']),
validate_certs=dict(type='bool', aliases=['tlsverify', 'tls_verify']),
executable=dict(type='str', default='podman'),
auth_file=dict(type='path', aliases=['authfile']),
username=dict(type='str'),
password=dict(type='str', no_log=True),
ca_cert_dir=dict(type='path'),
+ quadlet_dir=dict(type='path', required=False),
+ quadlet_filename=dict(type='str'),
+ quadlet_options=dict(type='list', elements='str', required=False),
build=dict(
type='dict',
aliases=['build_args', 'buildargs'],
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_image_info.py b/ansible_collections/containers/podman/plugins/modules/podman_image_info.py
index d8af08814..02b0f9ed1 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_image_info.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_image_info.py
@@ -48,7 +48,7 @@ RETURN = r"""
images:
description: info from all or specified images
returned: always
- type: dict
+ type: list
sample: [
{
"Annotations": {},
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_login.py b/ansible_collections/containers/podman/plugins/modules/podman_login.py
index 8ae8418a9..25bdb8d99 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_login.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_login.py
@@ -154,10 +154,7 @@ def main():
supports_check_mode=True,
required_together=(
['username', 'password'],
- ),
- mutually_exclusive=(
- ['certdir', 'tlsverify'],
- ),
+ )
)
registry = module.params['registry']
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_network.py b/ansible_collections/containers/podman/plugins/modules/podman_network.py
index 3f52af4ce..37bfefede 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_network.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_network.py
@@ -127,11 +127,30 @@ options:
choices:
- present
- absent
+ - quadlet
recreate:
description:
- Recreate network even if exists.
type: bool
default: false
+ quadlet_dir:
+ description:
+ - Path to the directory to write quadlet file in.
+ By default, it will be set as C(/etc/containers/systemd/) for root user,
+ C(~/.config/containers/systemd/) for non-root users.
+ type: path
+ required: false
+ quadlet_filename:
+ description:
+ - Name of quadlet file to write. By default it takes I(name) value.
+ type: str
+ quadlet_options:
+ description:
+ - Options for the quadlet file. Provide missing in usual network args
+ options as a list of lines to add.
+ type: list
+ elements: str
+ required: false
"""
EXAMPLES = r"""
@@ -148,6 +167,14 @@ EXAMPLES = r"""
subnet: 192.168.22.0/24
gateway: 192.168.22.1
become: true
+
+- name: Create Quadlet file for podman network
+ containers.podman.podman_network:
+ name: podman_network
+ state: quadlet
+ quadlet_options:
+ - IPv6=true
+ - Label="ipv6 network"
"""
RETURN = r"""
@@ -197,7 +224,7 @@ network:
]
"""
-import json # noqa: F402
+import json
try:
import ipaddress
HAS_IP_ADDRESS_MODULE = True
@@ -208,6 +235,7 @@ from ansible.module_utils.basic import AnsibleModule # noqa: F402
from ansible.module_utils._text import to_bytes, to_native # noqa: F402
from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion
from ansible_collections.containers.podman.plugins.module_utils.podman.common import lower_keys
+from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state
class PodmanNetworkModuleParams:
@@ -620,6 +648,7 @@ class PodmanNetworkManager:
states_map = {
'present': self.make_present,
'absent': self.make_absent,
+ 'quadlet': self.make_quadlet,
}
process_action = states_map[self.state]
process_action()
@@ -652,12 +681,17 @@ class PodmanNetworkManager:
'podman_actions': self.network.actions})
self.module.exit_json(**self.results)
+ def make_quadlet(self):
+ results_update = create_quadlet_state(self.module, "network")
+ self.results.update(results_update)
+ self.module.exit_json(**self.results)
+
def main():
module = AnsibleModule(
argument_spec=dict(
state=dict(type='str', default="present",
- choices=['present', 'absent']),
+ choices=['present', 'absent', 'quadlet']),
name=dict(type='str', required=True),
disable_dns=dict(type='bool', required=False),
driver=dict(type='str', required=False),
@@ -681,6 +715,9 @@ def main():
executable=dict(type='str', required=False, default='podman'),
debug=dict(type='bool', default=False),
recreate=dict(type='bool', default=False),
+ quadlet_dir=dict(type='path', required=False),
+ quadlet_filename=dict(type='str', required=False),
+ quadlet_options=dict(type='list', elements='str', required=False),
),
required_by=dict( # for IP range and GW to set 'subnet' is required
ip_range=('subnet'),
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_play.py b/ansible_collections/containers/podman/plugins/modules/podman_play.py
index 10a9a06fa..66138efc0 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_play.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_play.py
@@ -103,7 +103,8 @@ options:
required: false
tag:
description:
- - specify a custom log tag for the container. This option is currently supported only by the journald log driver in Podman.
+ - Specify a custom log tag for the container.
+ This option is currently supported only by the journald log driver in Podman.
type: str
required: false
log_level:
@@ -131,6 +132,7 @@ options:
- created
- started
- absent
+ - quadlet
required: True
tls_verify:
description:
@@ -158,6 +160,24 @@ options:
An empty value ("") means user namespaces are disabled.
required: false
type: str
+ quadlet_dir:
+ description:
+ - Path to the directory to write quadlet file in.
+ By default, it will be set as C(/etc/containers/systemd/) for root user,
+ C(~/.config/containers/systemd/) for non-root users.
+ type: path
+ required: false
+ quadlet_filename:
+ description:
+ - Name of quadlet file to write. Must be specified if state is quadlet.
+ type: str
+ quadlet_options:
+ description:
+ - Options for the quadlet file. Provide missing in usual network args
+ options as a list of lines to add.
+ type: list
+ elements: str
+ required: false
'''
EXAMPLES = '''
@@ -178,6 +198,19 @@ EXAMPLES = '''
log_opt:
path: /tmp/my-container.log
max_size: 10mb
+
+- name: Create a Quadlet file
+ containers.podman.podman_play:
+ kube_file: ~/kube.yaml
+ state: quadlet
+ annotations:
+ greeting: hello
+ greet_to: world
+ userns: host
+ quadlet_filename: kube-pod
+ quadlet_options:
+ - "SetWorkingDirectory=yaml"
+ - "ExitCodePropagation=any"
'''
import re # noqa: F402
try:
@@ -187,6 +220,8 @@ except ImportError:
HAS_YAML = False
from ansible.module_utils.basic import AnsibleModule # noqa: F402
+from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion, get_podman_version
+from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state # noqa: F402
class PodmanKubeManagement:
@@ -196,11 +231,12 @@ class PodmanKubeManagement:
self.actions = []
self.executable = executable
self.command = [self.executable, 'play', 'kube']
+ self.version = get_podman_version(module)
creds = []
# pod_name = extract_pod_name(module.params['kube_file'])
if self.module.params['annotation']:
for k, v in self.module.params['annotation'].items():
- self.command.extend(['--annotation', '"{k}={v}"'.format(k=k, v=v)])
+ self.command.extend(['--annotation', '{k}={v}'.format(k=k, v=v)])
if self.module.params['username']:
creds += [self.module.params['username']]
if self.module.params['password']:
@@ -244,17 +280,31 @@ class PodmanKubeManagement:
self.module.log('PODMAN-PLAY-KUBE rc: %s' % rc)
return rc, out, err
+ def tear_down_pods(self):
+ '''
+ Tear down the pod and contaiers by using --down option in kube play
+ which is supported since Podman 3.4.0
+ '''
+ changed = False
+ kube_file = self.module.params['kube_file']
+
+ rc, out, err = self._command_run([self.executable, "kube", "play", "--down", kube_file])
+ if rc != 0:
+ self.module.fail_json(msg="Failed to delete Pod with %s" % (kube_file))
+ else:
+ changed = True
+
+ return changed, out, err
+
def discover_pods(self):
pod_name = ''
if self.module.params['kube_file']:
if HAS_YAML:
with open(self.module.params['kube_file']) as f:
- pod = yaml.safe_load(f)
- if 'metadata' in pod:
- pod_name = pod['metadata'].get('name')
- else:
- self.module.fail_json(
- "No metadata in Kube file!\n%s" % pod)
+ pods = list(yaml.safe_load_all(f))
+ for pod in pods:
+ if 'metadata' in pod and pod['kind'] in ['Deployment', 'Pod']:
+ pod_name = pod['metadata'].get('name')
else:
with open(self.module.params['kube_file']) as text:
# the following formats are matched for a kube name:
@@ -266,7 +316,7 @@ class PodmanKubeManagement:
if re_pod:
pod_name = re_pod.group(1)
if not pod_name:
- self.module.fail_json("Deployment doesn't have a name!")
+ self.module.fail_json("This Kube file doesn't have Pod or Deployment!")
# Find all pods
all_pods = ''
# In case of one pod or replicasets
@@ -294,8 +344,12 @@ class PodmanKubeManagement:
return changed, out_all, err_all
def pod_recreate(self):
- pods = self.discover_pods()
- self.remove_associated_pods(pods)
+ if self.version is not None and LooseVersion(self.version) >= LooseVersion('3.4.0'):
+ self.tear_down_pods()
+ else:
+ pods = self.discover_pods()
+ self.remove_associated_pods(pods)
+
# Create a pod
rc, out, err = self._command_run(self.command)
if rc != 0:
@@ -318,6 +372,12 @@ class PodmanKubeManagement:
changed = True
return changed, out, err
+ def make_quadlet(self):
+ results = {"changed": False}
+ results_update = create_quadlet_state(self.module, "kube")
+ results.update(results_update)
+ self.module.exit_json(**results)
+
def main():
module = AnsibleModule(
@@ -341,7 +401,7 @@ def main():
network=dict(type='list', elements='str'),
state=dict(
type='str',
- choices=['started', 'created', 'absent'],
+ choices=['started', 'created', 'absent', 'quadlet'],
required=True),
tls_verify=dict(type='bool'),
debug=dict(type='bool'),
@@ -351,16 +411,28 @@ def main():
log_level=dict(
type='str',
choices=["debug", "info", "warn", "error", "fatal", "panic"]),
+ quadlet_dir=dict(type='path', required=False),
+ quadlet_filename=dict(type='str', required=False),
+ quadlet_options=dict(type='list', elements='str', required=False),
),
supports_check_mode=True,
+ required_if=[
+ ('state', 'quadlet', ['quadlet_filename']),
+ ],
)
executable = module.get_bin_path(
module.params['executable'], required=True)
manage = PodmanKubeManagement(module, executable)
if module.params['state'] == 'absent':
- pods = manage.discover_pods()
- changed, out, err = manage.remove_associated_pods(pods)
+ if manage.version is not None and LooseVersion(manage.version) > LooseVersion('3.4.0'):
+ manage.module.log(msg="version: %s, kube file %s" % (manage.version, manage.module.params['kube_file']))
+ changed, out, err = manage.tear_down_pods()
+ else:
+ pods = manage.discover_pods()
+ changed, out, err = manage.remove_associated_pods(pods)
+ elif module.params['state'] == 'quadlet':
+ manage.make_quadlet()
else:
changed, out, err = manage.play()
results = {
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_pod.py b/ansible_collections/containers/podman/plugins/modules/podman_pod.py
index 7b57fd302..a975921ea 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_pod.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_pod.py
@@ -30,6 +30,7 @@ options:
- stopped
- paused
- unpaused
+ - quadlet
recreate:
description:
- Use with present and started states to force the re-creation of an
@@ -340,6 +341,22 @@ options:
required: false
aliases:
- ports
+ quadlet_dir:
+ description:
+ - Path to the directory to write quadlet file in.
+ By default, it will be set as C(/etc/containers/systemd/) for root user,
+ C(~/.config/containers/systemd/) for non-root users.
+ type: path
+ quadlet_filename:
+ description:
+ - Name of quadlet file to write. By default it takes I(name) value.
+ type: str
+ quadlet_options:
+ description:
+ - Options for the quadlet file. Provide missing in usual container args
+ options as a list of lines to add.
+ type: list
+ elements: str
share:
description:
- A comma delimited list of kernel namespaces to share. If none or "" is specified,
@@ -435,7 +452,7 @@ pod:
EXAMPLES = '''
# What modules does for example
-- podman_pod:
+- containers.podman.podman_pod:
name: pod1
state: started
ports:
@@ -447,6 +464,16 @@ EXAMPLES = '''
name: pod2
state: started
publish: "127.0.0.1::80"
+
+# Create a Quadlet file for a pod
+- containers.podman.podman_pod:
+ name: qpod
+ state: quadlet
+ ports:
+ - "4444:5555"
+ volume:
+ - /var/run/docker.sock:/var/run/docker.sock
+ quadlet_dir: /custom/dir
'''
from ansible.module_utils.basic import AnsibleModule # noqa: F402
from ..module_utils.podman.podman_pod_lib import PodmanPodManager # noqa: F402
@@ -454,9 +481,7 @@ from ..module_utils.podman.podman_pod_lib import ARGUMENTS_SPEC_POD # noqa: F40
def main():
- module = AnsibleModule(
- argument_spec=ARGUMENTS_SPEC_POD
- )
+ module = AnsibleModule(argument_spec=ARGUMENTS_SPEC_POD)
results = PodmanPodManager(module, module.params).execute()
module.exit_json(**results)
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py b/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py
index 8b2a4bf06..8597ae98d 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_pod_info.py
@@ -109,9 +109,12 @@ def get_pod_info(module, executable, name):
rc, out, err = module.run_command(command + [pod])
errs.append(err.strip())
rcs += [rc]
- if not out or json.loads(out) is None or not json.loads(out):
+ data = json.loads(out) if out else None
+ if isinstance(data, list) and data:
+ data = data[0]
+ if not out or data is None or not data:
continue
- result.append(json.loads(out))
+ result.append(data)
return result, errs, rcs
diff --git a/ansible_collections/containers/podman/plugins/modules/podman_volume.py b/ansible_collections/containers/podman/plugins/modules/podman_volume.py
index b4d5062fa..0b990354a 100644
--- a/ansible_collections/containers/podman/plugins/modules/podman_volume.py
+++ b/ansible_collections/containers/podman/plugins/modules/podman_volume.py
@@ -24,6 +24,7 @@ options:
choices:
- present
- absent
+ - quadlet
recreate:
description:
- Recreate volume even if exists.
@@ -62,6 +63,24 @@ options:
- Return additional information which can be helpful for investigations.
type: bool
default: False
+ quadlet_dir:
+ description:
+ - Path to the directory to write quadlet file in.
+ By default, it will be set as C(/etc/containers/systemd/) for root user,
+ C(~/.config/containers/systemd/) for non-root users.
+ type: path
+ required: false
+ quadlet_filename:
+ description:
+ - Name of quadlet file to write. By default it takes I(name) value.
+ type: str
+ quadlet_options:
+ description:
+ - Options for the quadlet file. Provide missing in usual network args
+ options as a list of lines to add.
+ type: list
+ elements: str
+ required: false
requirements:
- "podman"
@@ -88,7 +107,8 @@ volume:
EXAMPLES = '''
# What modules does for example
-- podman_volume:
+- name: Create a volume
+ containers.podman.podman_volume:
state: present
name: volume1
label:
@@ -97,6 +117,17 @@ EXAMPLES = '''
options:
- "device=/dev/loop1"
- "type=ext4"
+
+- name: Create a Quadlet file for a volume
+ containers.podman.podman_volume:
+ state: quadlet
+ name: quadlet_volume
+ quadlet_filename: custom-name
+ quadlet_options:
+ - Group=192
+ - Copy=true
+ - Image=quay.io/centos/centos:latest
+
'''
# noqa: F402
import json # noqa: F402
@@ -105,6 +136,7 @@ from ansible.module_utils.basic import AnsibleModule # noqa: F402
from ansible.module_utils._text import to_bytes, to_native # noqa: F402
from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion
from ansible_collections.containers.podman.plugins.module_utils.podman.common import lower_keys
+from ansible_collections.containers.podman.plugins.module_utils.podman.quadlet import create_quadlet_state
class PodmanVolumeModuleParams:
@@ -436,6 +468,7 @@ class PodmanVolumeManager:
states_map = {
'present': self.make_present,
'absent': self.make_absent,
+ 'quadlet': self.make_quadlet,
}
process_action = states_map[self.state]
process_action()
@@ -468,12 +501,17 @@ class PodmanVolumeManager:
'podman_actions': self.volume.actions})
self.module.exit_json(**self.results)
+ def make_quadlet(self):
+ results_update = create_quadlet_state(self.module, "volume")
+ self.results.update(results_update)
+ self.module.exit_json(**self.results)
+
def main():
module = AnsibleModule(
argument_spec=dict(
state=dict(type='str', default="present",
- choices=['present', 'absent']),
+ choices=['present', 'absent', 'quadlet']),
name=dict(type='str', required=True),
label=dict(type='dict', required=False),
driver=dict(type='str', required=False),
@@ -481,6 +519,9 @@ def main():
recreate=dict(type='bool', default=False),
executable=dict(type='str', required=False, default='podman'),
debug=dict(type='bool', default=False),
+ quadlet_dir=dict(type='path', required=False),
+ quadlet_filename=dict(type='str', required=False),
+ quadlet_options=dict(type='list', elements='str', required=False),
))
PodmanVolumeManager(module).execute()
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml
index a6fd44083..02d664afa 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container/tasks/main.yml
@@ -15,6 +15,11 @@
podman_version: 4
when: podman_v.stdout is version('4.0.0', '>=')
+ - name: Set podman version to 5
+ set_fact:
+ podman_version: 5
+ when: podman_v.stdout is version('5.0.0', '>=')
+
- name: Delete all container leftovers from tests
containers.podman.podman_container:
executable: "{{ test_executable | default('podman') }}"
@@ -702,7 +707,7 @@
path: /tmp/containzzzzcontainer1.service
register: service_file
- - name: Check that container has correct systemd output v4
+ - name: Check that container has correct systemd output v4 and quadlet
assert:
that:
- system14.podman_systemd.keys() | list | first == 'containzzzzcontainer1'
@@ -712,6 +717,11 @@
- "'autogenerated by Podman' not in system14.podman_systemd.values() | list | first"
- "'RestartSec=10' in system14.podman_systemd.values() | list | first"
- "'TimeoutStartSec=20' in system14.podman_systemd.values() | list | first"
+ - system14.podman_quadlet | length > 0
+ - system14.podman_quadlet | length > 0
+ - "'ContainerName=container1' in system14.podman_quadlet"
+ - "'Image=alpine' in system14.podman_quadlet"
+
when: podman_version == 4
- name: Check that container has correct systemd output v3
@@ -855,9 +865,14 @@
dest: "{{ container_tempdir.path }}/latest-releases.yaml"
register: alpine_releases_file
+ - name: Get content of alpine releases file
+ ansible.builtin.slurp:
+ src: "{{ container_tempdir.path }}/latest-releases.yaml"
+ register: latest_releases_file
+
- name: Download alpine latest rootfs
vars:
- latest_releases: "{{ lookup('file', alpine_releases_file.dest) }}"
+ latest_releases: "{{ latest_releases_file.content | b64decode }}"
latest_version: "{{ (latest_releases | from_yaml)[0].version }}"
latest_branch: "{{ (latest_releases | from_yaml)[0].branch }}"
ansible.builtin.unarchive:
@@ -1075,6 +1090,264 @@
- attach3 is failed
- "'No such file or directory' in attach3.stderr"
+ - name: Create a Quadlet for container with filename
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container-quadlet
+ image: alpine
+ state: quadlet
+ quadlet_dir: /tmp
+ quadlet_filename: customfile
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/customfile.container
+ register: quadlet_file_custom
+
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom.stat.exists
+
+ - name: Create a Quadlet for container with filename w/o dir
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container-quadlet
+ image: alpine
+ state: quadlet
+ quadlet_filename: container11.container
+
+ - name: Check if files exists
+ stat:
+ path: ~/.config/containers/systemd/container11.container
+ register: quadlet_file_custom2
+
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom2.stat.exists
+
+ - name: Create a Quadlet for container with filename w/o dir
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container-quadlet
+ image: alpine
+ state: quadlet
+
+ - name: Check if files exists
+ stat:
+ path: ~/.config/containers/systemd/container-quadlet.container
+ register: quadlet_file_custom3
+
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom3.stat.exists
+
+ - name: Create a Quadlet for container
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container-quadlet
+ image: alpine:3.12
+ state: quadlet
+ quadlet_dir: /tmp
+ command: sleep 1d
+ recreate: true
+ etc_hosts:
+ host1: 127.0.0.1
+ host2: 127.0.0.1
+ annotation:
+ this: "annotation_value"
+ dns:
+ - 1.1.1.1
+ - 8.8.4.4
+ dns_search: example.com
+ cap_add:
+ - SYS_TIME
+ - NET_ADMIN
+ publish:
+ - "9000:80"
+ - "9001:8000"
+ workdir: "/bin"
+ env:
+ FOO: bar=1
+ BAR: foo
+ TEST: 1
+ BOOL: false
+ label:
+ somelabel: labelvalue
+ otheralbe: othervalue
+ volumes:
+ - /tmp:/data
+ mounts:
+ - type=devpts,destination=/dev/pts
+ quadlet_options:
+ - AutoUpdate=registry
+ - Unmask=ALL
+ - SecurityLabelFileType=usr_t
+ - Annotation=key1=annotation_value1
+ - Annotation=key2=annotation_value2
+ - |
+ [Install]
+ WantedBy=default.target
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/container-quadlet.container
+ register: quadlet_file
+
+ - name: Check output is correct for Quadlet container in /tmp/container-quadlet.container file
+ assert:
+ that:
+ - quadlet_file.stat.exists
+
+ - name: Check for the existence of lines in /tmp/container-quadlet.container
+ lineinfile:
+ path: /tmp/container-quadlet.container
+ line: "{{ item }}"
+ state: present
+ check_mode: yes
+ register: line_check
+ loop:
+ - "[Container]"
+ - "Annotation=this=annotation_value"
+ - "Annotation=key1=annotation_value1"
+ - "Annotation=key2=annotation_value2"
+ - "ContainerName=container-quadlet"
+ - "Image=alpine:3.12"
+ - "Exec=sleep 1d"
+ - "Volume=/tmp:/data"
+ - "Mount=type=devpts,destination=/dev/pts"
+ - "WorkingDir=/bin"
+ - "Unmask=ALL"
+ - "SecurityLabelFileType=usr_t"
+ - "Environment=BOOL=False"
+ - "PublishPort=9001:8000"
+ - "PodmanArgs=--add-host host2:127.0.0.1"
+ - "Label=somelabel=labelvalue"
+ - "WantedBy=default.target"
+ loop_control:
+ label: "{{ item }}"
+
+ - name: Fail the task if any line is not present
+ fail:
+ msg: "The following line is not present in /tmp/container-quadlet.container: {{ item.item }}"
+ when: item.changed
+ loop: "{{ line_check.results }}"
+ loop_control:
+ label: "{{ item.item }}"
+
+ - name: Create a Quadlet for container - same
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container-quadlet
+ image: alpine:3.12
+ state: quadlet
+ quadlet_dir: /tmp
+ command: sleep 1d
+ recreate: true
+ etc_hosts:
+ host1: 127.0.0.1
+ host2: 127.0.0.1
+ annotation:
+ this: "annotation_value"
+ dns:
+ - 1.1.1.1
+ - 8.8.4.4
+ dns_search: example.com
+ cap_add:
+ - SYS_TIME
+ - NET_ADMIN
+ publish:
+ - "9000:80"
+ - "9001:8000"
+ workdir: "/bin"
+ env:
+ FOO: bar=1
+ BAR: foo
+ TEST: 1
+ BOOL: false
+ label:
+ somelabel: labelvalue
+ otheralbe: othervalue
+ volumes:
+ - /tmp:/data
+ mounts:
+ - type=devpts,destination=/dev/pts
+ quadlet_options:
+ - AutoUpdate=registry
+ - Unmask=ALL
+ - SecurityLabelFileType=usr_t
+ - Annotation=key1=annotation_value1
+ - Annotation=key2=annotation_value2
+ - |
+ [Install]
+ WantedBy=default.target
+ register: quad2
+
+ - name: Check if quadlet changed
+ assert:
+ that:
+ - quad2 is not changed
+
+ - name: Create a Quadlet for container - different
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container-quadlet
+ image: alpine:3.12
+ state: quadlet
+ quadlet_dir: /tmp
+ command: sleep 1d
+ recreate: true
+ etc_hosts:
+ host1: 127.0.0.45
+ host2: 127.0.0.1
+ annotation:
+ this: "annotation_value"
+ dns:
+ - 1.1.1.1
+ - 8.8.4.4
+ dns_search: example.com
+ cap_add:
+ - SYS_TIME
+ - NET_ADMIN
+ publish:
+ - "9000:80"
+ - "9001:8000"
+ workdir: "/bin"
+ env:
+ FOO: bar=1
+ BAR: foo
+ TEST: 1
+ BOOL: false
+ label:
+ somelabel: labelvalue
+ otheralbe: othervalue
+ volumes:
+ - /tmp:/data
+ mounts:
+ - type=devpts,destination=/dev/pts
+ quadlet_options:
+ - AutoUpdate=registry
+ - Unmask=ALL
+ - SecurityLabelFileType=usr_t
+ - Annotation=key1=annotation_value1
+ - Annotation=key2=annotation_value2
+ - |
+ [Install]
+ WantedBy=default.target
+ register: quad3
+
+ - name: Print diff
+ debug:
+ var: quad3.diff
+
+ - name: Check if changed and diff
+ assert:
+ that:
+ - quad3 is changed
+ - "'127.0.0.45' in quad3.diff.after"
+
always:
- name: Remove container
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml
index 2d2874325..623965c10 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container_exec/tasks/main.yml
@@ -12,6 +12,7 @@
- name: Test exec when the container doesn't exist
containers.podman.podman_container_exec:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ container_name }}"
command: "cat /etc/redhat-release"
ignore_errors: true
@@ -19,6 +20,7 @@
- name: Create and start a container for testing
containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ container_name }}"
image: registry.access.redhat.com/ubi8
command: sleep 1d
@@ -26,6 +28,7 @@
- name: Test exec with command and workdir options
containers.podman.podman_container_exec:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ container_name }}"
command: "cat redhat-release"
workdir: /etc
@@ -33,6 +36,7 @@
- name: Test exec with argv and env options
containers.podman.podman_container_exec:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ container_name }}"
argv:
- /bin/sh
@@ -45,6 +49,7 @@
- name: Test exec with detach option
containers.podman.podman_container_exec:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ container_name }}"
command: "cat redhat-release"
detach: true
@@ -59,6 +64,21 @@
- "'goodbye world' in exec2.stdout"
- exec3.exec_id is defined
+ - name: Test exec with failing command
+ containers.podman.podman_container_exec:
+ executable: "{{ test_executable | default('podman') }}"
+ name: "{{ container_name }}"
+ command: "ls /nonexistent"
+ register: exec4
+ ignore_errors: true
+
+ - name: Check if the result is as expected in case of a failing command
+ assert:
+ that:
+ - exec4 is failed
+ - "'No such file or directory' in exec4.stderr"
+ - exec4.rc != 0
+
always:
- name: Cleanup
containers.podman.podman_container:
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml
index 3d3654aea..02b66d250 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/main.yml
@@ -1,4 +1,24 @@
---
+
+- name: Discover podman version
+ shell: podman version | grep "^Version:" | awk {'print $2'}
+ register: podman_v
+
+- name: Set podman version to 3
+ set_fact:
+ podman_version: 3
+ when: podman_v.stdout is version('4.0.0', 'lt')
+
+- name: Set podman version to 4
+ set_fact:
+ podman_version: 4
+ when: podman_v.stdout is version('4.0.0', '>=')
+
+- name: Set podman version to 5
+ set_fact:
+ podman_version: 5
+ when: podman_v.stdout is version('5.0.0', '>=')
+
- name: Prepare a container
include_tasks: build_test_container.yml
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml
index 62dd3a5a0..3c16efac2 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_container_idempotency/tasks/rootless-podman-network.yml
@@ -109,53 +109,108 @@
that:
- info5 is changed
- - name: Run container with slirp4netns options
- containers.podman.podman_container:
- executable: "{{ test_executable | default('podman') }}"
- name: rootlessnet
- image: "{{ idem_image }}"
- command: 1h
- state: present
- network:
- - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24
- register: info6
+ - when: podman_version < 5
+ name: Run container tasks with slirp4netns options before v5
+ block:
+ - name: Run container with slirp4netns options
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: rootlessnet
+ image: "{{ idem_image }}"
+ command: 1h
+ state: present
+ network:
+ - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24
+ register: info6
- - name: Check info with slirp4netns options
- assert:
- that:
- - info6 is changed
+ - name: Check info with slirp4netns options
+ assert:
+ that:
+ - info6 is changed
- - name: Run container with slirp4netns options - again
- containers.podman.podman_container:
- executable: "{{ test_executable | default('podman') }}"
- name: rootlessnet
- image: "{{ idem_image }}"
- command: 1h
- state: present
- network:
- - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24
- register: info7
+ - name: Run container with slirp4netns options - again
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: rootlessnet
+ image: "{{ idem_image }}"
+ command: 1h
+ state: present
+ network:
+ - slirp4netns:allow_host_loopback=true,cidr=10.0.3.0/24
+ register: info7
- - name: Check info with slirp4netns options - again
- assert:
- that:
- - info7 is not changed
+ - name: Check info with slirp4netns options - again
+ assert:
+ that:
+ - info7 is not changed
- - name: Run container with different slirp4netns options
- containers.podman.podman_container:
- executable: "{{ test_executable | default('podman') }}"
- name: rootlessnet
- image: "{{ idem_image }}"
- command: 1h
- state: present
- network:
- - slirp4netns:allow_host_loopback=true,cidr=10.0.4.0/24
- register: info8
+ - name: Run container with different slirp4netns options
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: rootlessnet
+ image: "{{ idem_image }}"
+ command: 1h
+ state: present
+ network:
+ - slirp4netns:allow_host_loopback=true,cidr=10.0.4.0/24
+ register: info8
- - name: Check info with different slirp4netns options
- assert:
- that:
- - info8 is changed
+ - name: Check info with different slirp4netns options
+ assert:
+ that:
+ - info8 is changed
+
+
+ - when: podman_version >= 5
+ name: Run container tasks with pasta options for v5 and later
+ block:
+ - name: Run container with pasta options
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: rootlessnet
+ image: "{{ idem_image }}"
+ command: 1h
+ state: present
+ network:
+ - "pasta:-4,-t,8007,-u,4443,-T,3000"
+ register: info6
+
+ - name: Check info with pasta options
+ assert:
+ that:
+ - info6 is changed
+
+ - name: Run container with pasta options - again
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: rootlessnet
+ image: "{{ idem_image }}"
+ command: 1h
+ state: present
+ network:
+ - "pasta:-4,-t,8007,-u,4443,-T,3000"
+ register: info7
+
+ - name: Check info with pasta options - again
+ assert:
+ that:
+ - info7 is not changed
+
+ - name: Run container with different pasta options
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: rootlessnet
+ image: "{{ idem_image }}"
+ command: 1h
+ state: present
+ network:
+ - "pasta:-4,-t,8008,-u,4443,-T,3000"
+ register: info8
+
+ - name: Check info with different pasta options
+ assert:
+ that:
+ - info8 is changed
- name: Run container without options
containers.podman.podman_container:
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml
index 1e48a11dc..6b0c335cd 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_generate_systemd/tasks/main.yml
@@ -1,11 +1,14 @@
- name: A postgres container must exist, stopped
containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
name: postgres_local
image: docker.io/library/postgres:latest
+ # image: quay.io/enterprisedb/postgresql - use if docker is rate limited
state: stopped
- name: Generate the systemd units as Ansible variables
containers.podman.podman_generate_systemd:
+ executable: "{{ test_executable | default('podman') }}"
name: postgres_local
register: postgres_local_systemd_unit
ignore_errors: true
@@ -29,6 +32,7 @@
- name: Regenerate the systemd units and write them
containers.podman.podman_generate_systemd:
+ executable: "{{ test_executable | default('podman') }}"
name: postgres_local
dest: /tmp/podman_generate_systemd
register: postgres_local_systemd_unit
@@ -41,6 +45,7 @@
- name: Try to create a systemd unit file on the same path
containers.podman.podman_generate_systemd:
+ executable: "{{ test_executable | default('podman') }}"
name: postgres_local
dest: /tmp/podman_generate_systemd
register: generate1
@@ -58,6 +63,7 @@
- name: Force to create a systemd unit file on the same path
containers.podman.podman_generate_systemd:
+ executable: "{{ test_executable | default('podman') }}"
name: postgres_local
dest: /tmp/podman_generate_systemd
force: true
@@ -83,6 +89,7 @@
- name: Regenerate the systemd units with all the options
containers.podman.podman_generate_systemd:
+ executable: "{{ test_executable | default('podman') }}"
name: postgres_local
new: true
restart_policy: on-abnormal
@@ -100,7 +107,6 @@
after: drink.service
wants: water.service
requires: ice.service
- executable: /usr/bin/podman
register: postgres_local_systemd_unit
ignore_errors: true
@@ -123,13 +129,14 @@
- postgres_local_systemd_unit.podman_command is search("--after=drink.service")
- postgres_local_systemd_unit.podman_command is search("--wants=water.service")
- postgres_local_systemd_unit.podman_command is search("--requires=ice.service")
- - postgres_local_systemd_unit.podman_command is search("/usr/bin/podman")
+ - postgres_local_systemd_unit.podman_command is search("podman")
- name: Remove container
containers.podman.podman_container:
executable: "{{ test_executable | default('podman') }}"
name: postgres_local
state: absent
+
- name: Remove the systemd unit files directory
ansible.builtin.file:
path: /tmp/podman_generate_systemd
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml
index 0db4c050c..96133b9da 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_image/tasks/main.yml
@@ -329,6 +329,134 @@
- item.Architecture == "arm"
loop: "{{ imageinfo_arch.images }}"
+ - name: Create a Quadlet for image with filename
+ containers.podman.podman_image:
+ executable: "{{ test_executable | default('podman') }}"
+ name: quay.io/coreos/coreos-installer:latest
+ state: quadlet
+ arch: x86_64
+ quadlet_dir: /tmp
+ quadlet_filename: customfile
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/customfile.image
+ register: quadlet_file_custom
+
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom.stat.exists
+
+ - name: Create quadlet image file
+ containers.podman.podman_image:
+ executable: "{{ test_executable | default('podman') }}"
+ name: quay.io/coreos/coreos-installer:latest
+ state: quadlet
+ arch: x86_64
+ ca_cert_dir: /etc/docker/certs.d
+ username: user
+ password: pass
+ validate_certs: false
+ quadlet_dir: /tmp/
+ quadlet_options:
+ - "ImageTag=quay.io/coreos/coreos-installer:12345"
+ - "AllTags=true"
+ - |-
+ [Install]
+ WantedBy=default.target
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/coreos-installer.image
+ register: quadlet_file
+
+ - name: Check output is correct for Quadlet image in /tmp/coreos-installer.image file
+ assert:
+ that:
+ - quadlet_file.stat.exists
+
+ - name: Check for the existence of lines in /tmp/coreos-installer.image
+ lineinfile:
+ path: /tmp/coreos-installer.image
+ line: "{{ item }}"
+ state: present
+ check_mode: yes
+ register: line_check
+ loop:
+ - "[Image]"
+ - "Image=quay.io/coreos/coreos-installer:latest"
+ - "ImageTag=quay.io/coreos/coreos-installer:12345"
+ - "AllTags=true"
+ - "WantedBy=default.target"
+ - "Arch=x86_64"
+ - "CertDir=/etc/docker/certs.d"
+ - "Creds=user:pass"
+ - "TLSVerify=false"
+ loop_control:
+ label: "{{ item }}"
+
+ - name: Fail the task if any line is not present
+ fail:
+ msg: "The following line is not present in /tmp/coreos-installer.image: {{ item.item }}"
+ when: item.changed
+ loop: "{{ line_check.results }}"
+ loop_control:
+ label: "{{ item.item }}"
+
+ - name: Create quadlet image file - same
+ containers.podman.podman_image:
+ executable: "{{ test_executable | default('podman') }}"
+ name: quay.io/coreos/coreos-installer:latest
+ state: quadlet
+ arch: x86_64
+ ca_cert_dir: /etc/docker/certs.d
+ username: user
+ password: pass
+ validate_certs: false
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "ImageTag=quay.io/coreos/coreos-installer:12345"
+ - "AllTags=true"
+ - |-
+ [Install]
+ WantedBy=default.target
+ register: quad2
+
+ - name: Check if quadlet changed
+ assert:
+ that:
+ - quad2 is not changed
+
+ - name: Create quadlet image file - different
+ containers.podman.podman_image:
+ executable: "{{ test_executable | default('podman') }}"
+ name: quay.io/coreos/coreos-installer:latest
+ state: quadlet
+ arch: arm64
+ ca_cert_dir: /etc/docker/certs.d
+ username: user
+ password: pass
+ validate_certs: false
+ quadlet_dir: /tmp/
+ quadlet_options:
+ - "ImageTag=quay.io/coreos/coreos-installer:12345"
+ - "AllTags=true"
+ - |-
+ [Install]
+ WantedBy=default.target
+ register: quad3
+
+ - name: Print diff
+ debug:
+ var: quad3.diff
+
+ - name: Check if changed and diff
+ assert:
+ that:
+ - quad3 is changed
+ - "'arm64' in quad3.diff.after"
+
always:
- name: Cleanup images
containers.podman.podman_image:
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml
index d207e4cef..272ac6b43 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_network/tasks/main.yml
@@ -350,6 +350,131 @@
that:
- info17 is not changed
+ - name: Create a Quadlet for network with filename
+ containers.podman.podman_network:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testnet
+ state: quadlet
+ quadlet_dir: /tmp
+ quadlet_filename: customfile
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/customfile.network
+ register: quadlet_file_custom
+
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom.stat.exists
+
+ - name: Create quadlet network file
+ containers.podman.podman_network:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testnet
+ state: quadlet
+ disable_dns: true
+ subnet: "10.123.12.0"
+ internal: false
+ opt:
+ isolate: true
+ mtu: 1511
+ vlan: 111
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=Test=network"
+ - "Label=foo=bar"
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/testnet.network
+ register: quadlet_file
+
+ - name: Check output is correct for Quadlet network in /tmp/testnet.network file
+ assert:
+ that:
+ - quadlet_file.stat.exists
+
+ - name: Check for the existence of lines in /tmp/testnet.network
+ lineinfile:
+ path: /tmp/testnet.network
+ line: "{{ item }}"
+ state: present
+ check_mode: yes
+ register: line_check
+ loop:
+ - "[Network]"
+ - "NetworkName=testnet"
+ - "Subnet=10.123.12.0"
+ - "DisableDNS=true"
+ - "Internal=false"
+ - "Options=isolate=True"
+ - "Options=mtu=1511"
+ - "Options=vlan=111"
+ - "Label=Test=network"
+ - "Label=foo=bar"
+ loop_control:
+ label: "{{ item }}"
+
+ - name: Fail the task if any line is not present
+ fail:
+ msg: "The following line is not present in /tmp/testnet.network: {{ item.item }}"
+ when: item.changed
+ loop: "{{ line_check.results }}"
+ loop_control:
+ label: "{{ item.item }}"
+
+ - name: Create quadlet network file - same
+ containers.podman.podman_network:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testnet
+ state: quadlet
+ disable_dns: true
+ subnet: "10.123.12.0"
+ internal: false
+ opt:
+ isolate: true
+ mtu: 1511
+ vlan: 111
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=Test=network"
+ - "Label=foo=bar"
+ register: quad2
+
+ - name: Check if quadlet changed
+ assert:
+ that:
+ - quad2 is not changed
+
+ - name: Create quadlet network file - different
+ containers.podman.podman_network:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testnet
+ state: quadlet
+ disable_dns: true
+ subnet: "10.123.15.0"
+ internal: false
+ opt:
+ isolate: true
+ mtu: 1511
+ vlan: 111
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=Test=network"
+ - "Label=foo=bar"
+ register: quad3
+
+ - name: Print diff
+ debug:
+ var: quad3.diff
+
+ - name: Check if changed and diff
+ assert:
+ that:
+ - quad3 is changed
+ - "'10.123.15.0' in quad3.diff.after"
+
always:
- name: Cleanup
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml
new file mode 100644
index 000000000..2a969556b
--- /dev/null
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/files/multi-yaml.yml
@@ -0,0 +1,27 @@
+kind: ConfigMap
+metadata:
+ name: foo
+data:
+ FOO: bar
+---
+apiVersion: v1
+kind: Pod
+metadata:
+ name: foobar
+spec:
+ containers:
+ - command:
+ - top
+ name: container-1
+ image: alpine
+ envFrom:
+ - configMapRef:
+ name: foo
+ optional: false
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: foo2
+data:
+ FOO2: bar2 \ No newline at end of file
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml
index ae9d8572b..d22615e45 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/main.yml
@@ -107,6 +107,180 @@
that:
- info1['pods'][0]['State'] == 'Running'
+ - name: Remove pods created by kube play
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: /tmp/play3.yaml
+ state: absent
+ register: remove_pod
+
+ - name: Check if the pod was removed as expected
+ assert:
+ that:
+ - remove_pod is changed
+
+ - name: Get deleted pod info
+ containers.podman.podman_pod_info:
+ executable: "{{ test_executable | default('podman') }}"
+ name: web-deploy-pod
+ register: nonexist
+
+ - name: Check if the result is as expected
+ assert:
+ that:
+ - nonexist.pods == []
+
+
+ - name: Create a Quadlet for kube with filename
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: /home/kubeuser/tmp/multipod.yaml
+ state: quadlet
+ quadlet_dir: /tmp
+ quadlet_filename: customfile
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/customfile.kube
+ register: quadlet_file_custom
+
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom.stat.exists
+
+ - name: Create a kube quadlet without filename
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: /home/kubeuser/tmp/multipod.yaml
+ state: quadlet
+ quadlet_dir: /tmp
+ register: quadlet_file_no_name
+ ignore_errors: true
+
+ - name: Check that task failed
+ assert:
+ that:
+ - quadlet_file_no_name is failed
+
+ - name: Create a kube quadlet
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: /home/kubeuser/tmp/multipod.yaml
+ state: quadlet
+ userns: keep-id:uid=200,gid=210
+ log_driver: journald
+ network: host
+ configmap:
+ - /tmp/configmap1
+ - /tmp/configmap2
+ debug: true
+ quadlet_dir: /tmp
+ quadlet_filename: quadlet
+ quadlet_options:
+ - "PodmanArgs=--annotation=key1=value1"
+ - "PodmanArgs=--context-dir /my/path"
+ - |
+ [Install]
+ WantedBy=default.target
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/quadlet.kube
+ register: quadlet_file
+
+ - name: Check output is correct for Quadlet container in /tmp/quadlet.kube file
+ assert:
+ that:
+ - quadlet_file.stat.exists
+
+ - name: Check for the existence of lines in /tmp/quadlet.kube
+ lineinfile:
+ path: /tmp/quadlet.kube
+ line: "{{ item }}"
+ state: present
+ check_mode: yes
+ register: line_check
+ loop:
+ - "[Kube]"
+ - "ConfigMap=/tmp/configmap1"
+ - "ConfigMap=/tmp/configmap2"
+ - "LogDriver=journald"
+ - "Network=host"
+ - "Yaml=/home/kubeuser/tmp/multipod.yaml"
+ - "UserNS=keep-id:uid=200,gid=210"
+ - "GlobalArgs=--log-level debug"
+ - "WantedBy=default.target"
+ loop_control:
+ label: "{{ item }}"
+
+ - name: Fail the task if any line is not present
+ fail:
+ msg: "The following line is not present in /tmp/quadlet.kube: {{ item.item }}"
+ when: item.changed
+ loop: "{{ line_check.results }}"
+ loop_control:
+ label: "{{ item.item }}"
+
+ - name: Create a kube quadlet - same
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: /home/kubeuser/tmp/multipod.yaml
+ state: quadlet
+ userns: keep-id:uid=200,gid=210
+ log_driver: journald
+ network: host
+ configmap:
+ - /tmp/configmap1
+ - /tmp/configmap2
+ debug: true
+ quadlet_dir: /tmp
+ quadlet_filename: quadlet.kube
+ quadlet_options:
+ - "PodmanArgs=--annotation=key1=value1"
+ - "PodmanArgs=--context-dir /my/path"
+ - |
+ [Install]
+ WantedBy=default.target
+ register: quad2
+
+ - name: Check if quadlet changed
+ assert:
+ that:
+ - quad2 is not changed
+
+ - name: Create a kube quadlet - different
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: /home/kubeuser/tmp/multipod.yaml
+ state: quadlet
+ userns: keep-id:uid=200,gid=210
+ log_driver: journald
+ network: host
+ configmap:
+ - /tmp/configmap55
+ - /tmp/configmap2
+ debug: true
+ quadlet_dir: /tmp
+ quadlet_filename: quadlet.kube
+ quadlet_options:
+ - "PodmanArgs=--annotation=key1=value1"
+ - "PodmanArgs=--context-dir /my/path"
+ - |
+ [Install]
+ WantedBy=default.target
+ register: quad3
+
+ - name: Print diff
+ debug:
+ var: quad3.diff
+
+ - name: Check if changed and diff
+ assert:
+ that:
+ - quad3 is changed
+ - "'configmap55' in quad3.diff.after"
+
always:
- name: Delete all pods leftovers from tests
@@ -145,4 +319,12 @@
size: 10mb
userns: host
kube_dir: /tmp
- kube_file: play-pod.yaml \ No newline at end of file
+ kube_file: play-pod.yaml
+
+- name: Test play kube with multi doc yaml
+ include_tasks: play-multi-yaml.yml
+ vars:
+ ansible_python_interpreter: "/usr/bin/python"
+ kube_dir: /tmp
+ kube_file: multi-yaml.yml
+ target_container: foobar-container-1
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml
new file mode 100644
index 000000000..5eae4f5e5
--- /dev/null
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-multi-yaml.yml
@@ -0,0 +1,40 @@
+---
+- name: Test kube play wih multi doc yaml
+ block:
+ - name: Copy kube file
+ copy:
+ src: "{{ kube_file }}"
+ dest: "{{ kube_dir }}/{{ kube_file }}"
+ remote_src: false
+
+ - name: Create Pod with multi doc yaml
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: "{{ kube_dir }}/{{ kube_file }}"
+ state: started
+ recreate: true
+ register: play_pod
+
+ - name: Get pod info
+ containers.podman.podman_container_info:
+ executable: "{{ test_executable | default('podman') }}"
+ name: "{{ target_container }}"
+ register: info
+
+ - name: Check if an expected container is running
+ assert:
+ that:
+ - info.containers.0.State.Running == true
+ - '"FOO=bar" in info.containers.0.Config.Env'
+
+ - name: Cleanup pod
+ containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
+ kube_file: "{{ kube_dir }}/{{ kube_file }}"
+ state: absent
+ register: remove_pod
+
+ - name: Check if the pod was removed as expected
+ assert:
+ that:
+ - remove_pod is changed
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml
index e7601f531..32fde5d6a 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-build.yml
@@ -9,6 +9,7 @@
- name: Make sure that {{ image_name }} image is absent
containers.podman.podman_image:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ image_name }}"
state: absent
@@ -31,6 +32,7 @@
- name: Play kube file with image build
containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
kube_file: "{{ kube_dir }}/kube-buil-test.yaml"
build: true
context_dir: "{{ build_context_dir }}"
@@ -47,5 +49,6 @@
- name: Cleanup pods
containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
kube_file: "{{ kube_dir }}/kube-buil-test.yaml"
state: absent
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml
index aeb79a5bc..40167368b 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_play/tasks/play-with-options.yml
@@ -9,6 +9,7 @@
- name: Create Pod with many options
containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
kube_file: "{{ kube_dir }}/{{ kube_file }}"
state: started
recreate: true
@@ -23,6 +24,7 @@
- name: Get pod info
containers.podman.podman_pod_info:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ target_pod }}"
register: play_pod_info
@@ -33,6 +35,7 @@
- name: Get container info
containers.podman.podman_container_info:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ target_container }}"
register: play_container_info
@@ -48,5 +51,6 @@
- name: Cleanup pods
containers.podman.podman_play:
+ executable: "{{ test_executable | default('podman') }}"
kube_file: "{{ kube_dir }}/{{ kube_file }}"
state: absent
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml
index abee17596..cb455aa23 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/main.yml
@@ -15,6 +15,21 @@
podman_version: 2
when: podman_v.stdout is version('2.0.0', '>=')
+ - name: Set podman version to 3
+ set_fact:
+ podman_version: 3
+ when: podman_v.stdout is version('3.0.0', '>=')
+
+ - name: Set podman version to 4
+ set_fact:
+ podman_version: 4
+ when: podman_v.stdout is version('4.0.0', '>=')
+
+ - name: Set podman version to 5
+ set_fact:
+ podman_version: 5
+ when: podman_v.stdout is version('5.0.0', '>=')
+
- name: Discover cgroups version
shell: podman info | grep cgroupVersion | awk {'print $2'}
register: cgroups
@@ -153,6 +168,7 @@
pod6_info.pod['State']['status'] == 'Exited') or
(pod6_info.pod['State']['status'] is not defined and
pod6_info.pod['State'] == 'Exited')
+ when: podman_version < 5
- name: Start pod
containers.podman.podman_pod:
@@ -826,69 +842,289 @@
that:
- not podsys2_stat.stat.exists|bool
- - name: Run pod2 with network slirp4netns
+ - name: Run slirp4netns tests for podman < 5
+ when: podman_version < 5
+ block:
+
+ - name: Run pod2 with network slirp4netns
+ containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
+ name: pod2
+ state: started
+ network: slirp4netns:outbound_addr=10.10.10.46
+
+ - name: Run container1 in pod
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container1
+ image: alpine
+ command: top
+ pod: pod2
+ state: started
+
+ - name: Run pod2 with network slirp4netns - again
+ containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
+ name: pod2
+ state: started
+ network: slirp4netns:outbound_addr=10.10.10.46
+ register: slip4net_pod
+
+ - name: Run container1 in pod slirp4netns
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container1
+ image: alpine
+ command: top
+ pod: pod2
+ state: started
+ register: slip4net_cont
+
+ - name: Check that slirp4netns is idempotent
+ assert:
+ that:
+ - slip4net_pod is not changed
+ - slip4net_cont is not changed
+
+ - name: Run pod2 with different network slirp4netns
+ containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
+ name: pod2
+ state: started
+ network: slirp4netns:outbound_addr=10.10.10.47
+ register: slip4net_pod2
+
+ - name: Run container1 in different pod slirp4netns
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container1
+ image: alpine
+ command: top
+ pod: pod2
+ state: started
+ register: slip4net_cont2
+
+ - name: Check that slirp4netns is idempotent and changed
+ assert:
+ that:
+ - slip4net_pod2 is changed
+ - slip4net_cont2 is changed
+
+ - name: Run pasta tests for podman >= 5
+ when: podman_version >= 5
+ block:
+
+ - name: Run pod2 with network pasta
+ containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
+ name: pod2
+ state: started
+ network:
+ - "pasta:-4,-t,8007,-u,4443,-T,3000"
+
+ - name: Run container1 in pod
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container1
+ image: alpine
+ command: top
+ pod: pod2
+ state: started
+
+ - name: Run pod2 with network pasta - again
+ containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
+ name: pod2
+ state: started
+ network:
+ - "pasta:-4,-t,8007,-u,4443,-T,3000"
+ register: pasta_pod
+
+ - name: Run container1 in pod pasta
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container1
+ image: alpine
+ command: top
+ pod: pod2
+ state: started
+ register: pasta_cont
+
+ - name: Check that pasta is idempotent
+ assert:
+ that:
+ - pasta_pod is not changed
+ - pasta_cont is not changed
+
+ - name: Run pod2 with different network pasta
+ containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
+ name: pod2
+ state: started
+ network:
+ - "pasta:-4,-t,8008,-u,4443,-T,3000"
+ register: pasta_pod2
+
+ - name: Run container1 in different pod slirp4netns
+ containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
+ name: container1
+ image: alpine
+ command: top
+ pod: pod2
+ state: started
+ register: pasta_cont2
+
+ - name: Check that slirp4netns is idempotent and changed
+ assert:
+ that:
+ - pasta_pod2 is changed
+ - pasta_cont2 is changed
+
+ - name: Create a Quadlet for pod with filename
containers.podman.podman_pod:
executable: "{{ test_executable | default('podman') }}"
- name: pod2
- state: started
- network: slirp4netns:outbound_addr=10.10.10.46
+ name: podq
+ state: quadlet
+ network: examplenet
+ quadlet_dir: /tmp
+ quadlet_filename: customfile
- - name: Run container1 in pod
- containers.podman.podman_container:
- executable: "{{ test_executable | default('podman') }}"
- name: container1
- image: alpine
- command: top
- pod: pod2
- state: started
+ - name: Check if files exists
+ stat:
+ path: /tmp/customfile.pod
+ register: quadlet_file_custom
- - name: Run pod2 with network slirp4netns - again
- containers.podman.podman_pod:
- executable: "{{ test_executable | default('podman') }}"
- name: pod2
- state: started
- network: slirp4netns:outbound_addr=10.10.10.46
- register: slip4net_pod
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom.stat.exists
- - name: Run container1 in pod slirp4netns
- containers.podman.podman_container:
+ - name: Create a Quadlet pod file
+ containers.podman.podman_pod:
executable: "{{ test_executable | default('podman') }}"
- name: container1
- image: alpine
- command: top
- pod: pod2
- state: started
- register: slip4net_cont
+ name: podq
+ state: quadlet
+ network: examplenet
+ share: net
+ subuidname: username1
+ userns: auto
+ publish: 8000:8001
+ add_host:
+ - host1
+ volume:
+ - /tmp:/data
+ - /whocares:/data2:ro
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=somelabel=labelvalue"
+ - |
+ [Install]
+ WantedBy=default.target
+ register: quadlet_pod
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/podq.pod
+ register: quadlet_file
- - name: Check that slirp4netns is idempotent
+ - name: Check output is correct for Quadlet container in /tmp/podq.pod file
assert:
that:
- - slip4net_pod is not changed
- - slip4net_cont is not changed
-
- - name: Run pod2 with different network slirp4netns
+ - quadlet_file.stat.exists
+
+ - name: Check for the existence of lines in /tmp/podq.pod
+ lineinfile:
+ path: /tmp/podq.pod
+ line: "{{ item }}"
+ state: present
+ check_mode: yes
+ register: line_check
+ loop:
+ - "[Pod]"
+ - "Network=examplenet"
+ - "PodName=podq"
+ - "PublishPort=8000:8001"
+ - "Volume=/tmp:/data"
+ - "Volume=/whocares:/data2:ro"
+ - "PodmanArgs=--add-host host1"
+ - "PodmanArgs=--share net"
+ - "PodmanArgs=--subuidname username1"
+ - "PodmanArgs=--userns auto"
+ - "PodmanArgs=--add-host host1"
+ - "Label=somelabel=labelvalue"
+ - "WantedBy=default.target"
+ loop_control:
+ label: "{{ item }}"
+
+ - name: Fail the task if any line is not present
+ fail:
+ msg: "The following line is not present in /tmp/podq.pod: {{ item.item }}"
+ when: item.changed
+ loop: "{{ line_check.results }}"
+ loop_control:
+ label: "{{ item.item }}"
+
+ - name: Create a Quadlet pod file - same
containers.podman.podman_pod:
executable: "{{ test_executable | default('podman') }}"
- name: pod2
- state: started
- network: slirp4netns:outbound_addr=10.10.10.47
- register: slip4net_pod2
+ name: podq
+ state: quadlet
+ network: examplenet
+ share: net
+ subuidname: username1
+ userns: auto
+ publish: 8000:8001
+ add_host:
+ - host1
+ volume:
+ - /tmp:/data
+ - /whocares:/data2:ro
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=somelabel=labelvalue"
+ - |
+ [Install]
+ WantedBy=default.target
+ register: quad2
+
+ - name: Check if quadlet changed
+ assert:
+ that:
+ - quad2 is not changed
- - name: Run container1 in different pod slirp4netns
- containers.podman.podman_container:
+ - name: Create a Quadlet pod file - different
+ containers.podman.podman_pod:
executable: "{{ test_executable | default('podman') }}"
- name: container1
- image: alpine
- command: top
- pod: pod2
- state: started
- register: slip4net_cont2
-
- - name: Check that slirp4netns is idempotent and changed
+ name: podq
+ state: quadlet
+ network: examplenet
+ share: net
+ subuidname: username1
+ userns: auto
+ publish: 8000:8001
+ add_host:
+ - host1
+ volume:
+ - /tmp:/newdata
+ - /whocares:/data2:ro
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=somelabel=labelvalue"
+ - |
+ [Install]
+ WantedBy=default.target
+ register: quad3
+
+ - name: Print diff
+ debug:
+ var: quad3.diff
+
+ - name: Check if changed and diff
assert:
that:
- - slip4net_pod2 is changed
- - slip4net_cont2 is changed
+ - quad3 is changed
+ - "'newdata' in quad3.diff.after"
always:
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml
index 94017d9f9..8727d6e50 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_pod/tasks/resource-limit.yml
@@ -11,6 +11,7 @@
- name: Create pod for limiting resources
containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
name: limited-pod
state: created
blkio_weight: "{{ limit.blkio_weight }}"
@@ -20,6 +21,7 @@
- name: Get information on pod for limiting resources
containers.podman.podman_pod_info:
+ executable: "{{ test_executable | default('podman') }}"
name: limited-pod
register: pod_info
@@ -34,5 +36,6 @@
always:
- name: Cleanup
containers.podman.podman_pod:
+ executable: "{{ test_executable | default('podman') }}"
name: limited-pod
state: absent
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml
index 804543fe5..6e1a328af 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_prune/tasks/main.yml
@@ -9,6 +9,7 @@
# Create objects to be pruned
- name: Create container
containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ cname }}"
image: quay.io/podman/hello:latest
state: present
@@ -16,12 +17,14 @@
- name: Create network
containers.podman.podman_network:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ nname }}"
state: present
register: network
- name: Create volume
containers.podman.podman_volume:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ vname }}"
state: present
register: volume
@@ -29,12 +32,14 @@
# Prune objects
- name: Prune objects
containers.podman.podman_prune:
+ executable: "{{ test_executable | default('podman') }}"
container: true
network: true
volume: true
- name: Check if container exists
containers.podman.podman_container_info:
+ executable: "{{ test_executable | default('podman') }}"
register: container_exists
- name: Check if podman network exists
@@ -43,6 +48,7 @@
- name: Check if podman volume exists
containers.podman.podman_volume_info:
+ executable: "{{ test_executable | default('podman') }}"
register: volume_exists
- name: Verify assertions for network, container and volume
@@ -58,6 +64,7 @@
# Test with filters
- name: Prune objects with filters
containers.podman.podman_prune:
+ executable: "{{ test_executable | default('podman') }}"
image: true
image_filters:
dangling_only: false
@@ -65,6 +72,7 @@
- name: Check if image exists
containers.podman.podman_image_info:
+ executable: "{{ test_executable | default('podman') }}"
register: image_exists
- name: Verify assertions for image (with filters)
@@ -74,6 +82,7 @@
- name: Create container
containers.podman.podman_container:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ cname }}"
image: quay.io/podman/hello:latest
state: present
@@ -81,36 +90,43 @@
- name: Create network
containers.podman.podman_network:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ nname }}"
state: present
register: network_system
- name: Create volume
containers.podman.podman_volume:
+ executable: "{{ test_executable | default('podman') }}"
name: "{{ vname }}"
state: present
register: volume_system
- name: System prune
containers.podman.podman_prune:
+ executable: "{{ test_executable | default('podman') }}"
system: true
system_all: true
system_volumes: true
- name: Check if container exists
containers.podman.podman_container_info:
+ executable: "{{ test_executable | default('podman') }}"
register: container_system_exists
- name: Check if podman network exists
containers.podman.podman_network_info:
+ executable: "{{ test_executable | default('podman') }}"
register: network_system_exists
- name: Check if podman volume exists
containers.podman.podman_volume_info:
+ executable: "{{ test_executable | default('podman') }}"
register: volume_system_exists
- name: Check if image exists
containers.podman.podman_image_info:
+ executable: "{{ test_executable | default('podman') }}"
register: image_system_exists
- name: Verify assertions for system
diff --git a/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml b/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml
index 144a39f63..9d43f3f1c 100644
--- a/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml
+++ b/ansible_collections/containers/podman/tests/integration/targets/podman_volume/tasks/main.yml
@@ -161,6 +161,134 @@
- info10 is failed
- delete.volume == {}
+ - name: Create a Quadlet for volume with filename
+ containers.podman.podman_volume:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testvol
+ state: quadlet
+ quadlet_dir: /tmp
+ quadlet_filename: customfile
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/customfile.volume
+ register: quadlet_file_custom
+
+ - name: Fail if no file is present
+ assert:
+ that:
+ - quadlet_file_custom.stat.exists
+
+ - name: Create quadlet volume file
+ containers.podman.podman_volume:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testvol
+ state: quadlet
+ driver: local
+ label:
+ namelabel: value
+ foo: bar
+ debug: true
+ options:
+ - "device=/dev/loop1"
+ - "type=ext4"
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=Test=volume"
+ - "Label=test1=value1"
+
+ - name: Check if files exists
+ stat:
+ path: /tmp/testvol.volume
+ register: quadlet_file
+
+ - name: Check output is correct for Quadlet volume in /tmp/testvol.volume file
+ assert:
+ that:
+ - quadlet_file.stat.exists
+
+ - name: Check for the existence of lines in /tmp/testvol.volume
+ lineinfile:
+ path: /tmp/testvol.volume
+ line: "{{ item }}"
+ state: present
+ check_mode: yes
+ register: line_check
+ loop:
+ - "[Volume]"
+ - "VolumeName=testvol"
+ - "Driver=local"
+ - "Label=namelabel=value"
+ - "Label=foo=bar"
+ - "Label=Test=volume"
+ - "Label=test1=value1"
+ - "PodmanArgs=--opt device=/dev/loop1"
+ - "PodmanArgs=--opt type=ext4"
+ - "GlobalArgs=--log-level debug"
+ loop_control:
+ label: "{{ item }}"
+
+ - name: Fail the task if any line is not present
+ fail:
+ msg: "The following line is not present in /tmp/testvol.volume: {{ item.item }}"
+ when: item.changed
+ loop: "{{ line_check.results }}"
+ loop_control:
+ label: "{{ item.item }}"
+
+ - name: Create quadlet volume file - same
+ containers.podman.podman_volume:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testvol
+ state: quadlet
+ driver: local
+ label:
+ namelabel: value
+ foo: bar
+ debug: true
+ options:
+ - "device=/dev/loop1"
+ - "type=ext4"
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=Test=volume"
+ - "Label=test1=value1"
+ register: quad2
+
+ - name: Check if quadlet changed
+ assert:
+ that:
+ - quad2 is not changed
+
+ - name: Create quadlet volume file - different
+ containers.podman.podman_volume:
+ executable: "{{ test_executable | default('podman') }}"
+ name: testvol
+ state: quadlet
+ driver: local
+ label:
+ namelabel: value
+ foo: bar
+ debug: true
+ options:
+ - "device=/dev/loop5"
+ - "type=ext4"
+ quadlet_dir: /tmp
+ quadlet_options:
+ - "Label=Test=volume"
+ - "Label=test1=value1"
+ register: quad3
+
+ - name: Print diff
+ debug:
+ var: quad3.diff
+
+ - name: Check if changed and diff
+ assert:
+ that:
+ - quad3 is changed
+ - "'loop5' in quad3.diff.after"
+
always:
- name: Make sure volume doesn't exist
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.10.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.11.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.12.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.13.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.14.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.15.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.16.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.17.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.18.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt b/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt
index f2f4ca9ca..8b2980323 100644
--- a/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt
+++ b/ansible_collections/containers/podman/tests/sanity/ignore-2.9.txt
@@ -1,2 +1,3 @@
tests/integration/targets/connection_buildah/runme.sh shellcheck:SC2086
tests/integration/targets/connection_podman/runme.sh shellcheck:SC2086
+tests/integration/targets/podman_play/tasks/files/multi-yaml.yml yamllint!skip
diff --git a/ansible_collections/dellemc/powerflex/.github/CODEOWNERS b/ansible_collections/dellemc/powerflex/.github/CODEOWNERS
index f783d12bf..f3093ce14 100644
--- a/ansible_collections/dellemc/powerflex/.github/CODEOWNERS
+++ b/ansible_collections/dellemc/powerflex/.github/CODEOWNERS
@@ -15,4 +15,4 @@
# Trisha Datta (trisha-dell)
# for all files:
-* @kuttattz @Bhavneet-Sharma @Jennifer-John @meenakshidembi691 @Pavan-Mudunuri @trisha-dell
+* @kuttattz @Bhavneet-Sharma @Jennifer-John @meenakshidembi691 @Pavan-Mudunuri @trisha-dell @felixs88 @sachin-apa
diff --git a/ansible_collections/dellemc/powerflex/CHANGELOG.rst b/ansible_collections/dellemc/powerflex/CHANGELOG.rst
index 8e67089a3..6aec79d70 100644
--- a/ansible_collections/dellemc/powerflex/CHANGELOG.rst
+++ b/ansible_collections/dellemc/powerflex/CHANGELOG.rst
@@ -5,6 +5,21 @@ Dellemc.PowerFlex Change Logs
.. contents:: Topics
+v2.3.0
+======
+
+Minor Changes
+-------------
+
+- Added support for PowerFlex ansible modules and roles on Azure.
+- Added support for resource group provisioning to validate, deploy, edit, add nodes and delete a resource group.
+- The Info module is enhanced to list the firmware repositories.
+
+New Modules
+-----------
+
+- dellemc.powerflex.resource_group - Manage resource group deployments on Dell PowerFlex
+
v2.2.0
======
diff --git a/ansible_collections/dellemc/powerflex/FILES.json b/ansible_collections/dellemc/powerflex/FILES.json
index 63f1250cd..9d135a9a9 100644
--- a/ansible_collections/dellemc/powerflex/FILES.json
+++ b/ansible_collections/dellemc/powerflex/FILES.json
@@ -32,7 +32,7 @@
"name": ".github/CODEOWNERS",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "02e53b61090f135ec71115de45f5be3ec18cf5ebe90c17eeb41e4a15a0fa5df5",
+ "chksum_sha256": "64591e526136e05232234eaf058ee461ca6ff91ea32a07ead2da6c0e54dd917f",
"format": 1
},
{
@@ -109,7 +109,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "22481877ddc56823870ff6e2bdd9eec6c683d39bd79f991076e3dcb75488eedd",
+ "chksum_sha256": "45d7b5658389095f34e42e23f6ef321660ce5d2aebcb3905b688335d396616f8",
"format": 1
},
{
@@ -130,7 +130,7 @@
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b9979afcbcc34a8b63191ce20efa873eefdcbe51a2fa53860477eb79f3563aa2",
+ "chksum_sha256": "5af6cc66393e097bbb1f2bbb1477c602a11564ea1e9e7741d81be037c3976b8d",
"format": 1
},
{
@@ -144,14 +144,14 @@
"name": "changelogs/.plugin-cache.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8d9577349e7feb8bdd19d062101868da3cca572de5cb9dfda913c25256dbd15f",
+ "chksum_sha256": "5db03a24dc8b5b7ef2b678f130afa55c372b5151d6a2420682b4bcba22e654d8",
"format": 1
},
{
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "51a6d9b03a9ac47e7bd547d5d375b6e1021ceff6dc26ac69f06c0fbbc9f618d5",
+ "chksum_sha256": "932bfd76a42809ca17a1864376a9a2a88ad857bbb4990734d8522072466dcb8f",
"format": 1
},
{
@@ -200,21 +200,21 @@
"name": "docs/CONTRIBUTING.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6826d5757fe5a1bece4b674a3c304b6834602d4cd6aeab7bc86bfe85a36913fe",
+ "chksum_sha256": "196f895d4e1d69e8831017f36ed709f8ccb7ea035dc97d71abf7213e3e9be868",
"format": 1
},
{
"name": "docs/INSTALLATION.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "baa58ede82a6b28b7a2d83beead5ac1a100975dcdfca4cb3e0e44253dae316e5",
+ "chksum_sha256": "c8fa229fdcec0cb7cdaeb94cfaa429675d14add2d95f77eb4e83a2311ce21203",
"format": 1
},
{
"name": "docs/ISSUE_TRIAGE.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf51c339af375a21f6448ff4c504fca9c94362332f73d28bfc8ce2d3b1bb6983",
+ "chksum_sha256": "8bb1ea4a27677d9eb98f4c938fc0ed55c2e718f2abaa9bd5e1ee708e37ce2e1a",
"format": 1
},
{
@@ -228,21 +228,21 @@
"name": "docs/MAINTAINER_GUIDE.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "50e95d3b07b93b9633f1c77b6eaa5a19e4f4f7e9825498d958cc071ef014ac42",
+ "chksum_sha256": "2e0970f922c8b97af52284ea00bf00337929c5e764c417152f49036dd23d21b4",
"format": 1
},
{
"name": "docs/Release Notes.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "75ef358ffba38ac7cf03ff24d68626d9e5112a046a2b1eba2a10a6d345a97c0d",
+ "chksum_sha256": "a50b2c32c7ecc642e5794dcd0fbeef0bd4d3b0918300db814a72fd8f59cebd3c",
"format": 1
},
{
"name": "docs/SECURITY.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "27159d1a795f9d6328a1f85bd95b7b1f55b698de821c979b2feba6e6a70599e9",
+ "chksum_sha256": "081098364e1203078b92bfd17db3186a6dc049cb81ea94059b09882d419a4946",
"format": 1
},
{
@@ -277,7 +277,7 @@
"name": "docs/modules/info.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff01e0057c388959a6460ac1b1b6f026ecf7d57e190067beed9e28876cad4a67",
+ "chksum_sha256": "a2919a7d5b06991e9113acd068ab458e05be216f3fe4344cf1691603b9c29884",
"format": 1
},
{
@@ -309,6 +309,13 @@
"format": 1
},
{
+ "name": "docs/modules/resource_group.rst",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "12edaa4dea0ccd6f9b231b5ea10ddd5b100f4b8d23abf8e278769d7a45002c95",
+ "format": 1
+ },
+ {
"name": "docs/modules/sdc.rst",
"ftype": "file",
"chksum_type": "sha256",
@@ -368,7 +375,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67490e6204f2b0ef55e2cad348fa79da6d137455dd1e9a25c51cac5cc22dd464",
+ "chksum_sha256": "272017e3158d619273cbce9badfb648a524232f573aa80e5933541215490d9b3",
"format": 1
},
{
@@ -403,7 +410,7 @@
"name": "playbooks/modules/info.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "36b79dc7559347030ccf349b815be9e6431a807b3ab9064e009163c10970b397",
+ "chksum_sha256": "ffd7d70717a4e817f5a91a0e7d44c24078471dd3fe12ee54f4e09d89fdafb377",
"format": 1
},
{
@@ -435,6 +442,13 @@
"format": 1
},
{
+ "name": "playbooks/modules/resource_group.yml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "cb83c9435ef32003162e8d1e5946ea64d4c86eec0f3766f9c892dcdd9a431c32",
+ "format": 1
+ },
+ {
"name": "playbooks/modules/sdc.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -578,7 +592,7 @@
"name": "plugins/doc_fragments/powerflex.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "801968c2f21f016d0f0861831e74ed4fc804e68a39b021c05f39b38437978bc0",
+ "chksum_sha256": "fe81e9901c08fa0086544e591ea7dda990ef30905ce80ed61ffd3f138b8e57ca",
"format": 1
},
{
@@ -648,7 +662,7 @@
"name": "plugins/module_utils/storage/dell/utils.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "402f820473dc2725d9d3fa1787854861651003a86873c1613951f5faefe9e68c",
+ "chksum_sha256": "68b549b4dbeefc2eec8974ddc00db73eaafde275a1306522d18a75eb3ae1f963",
"format": 1
},
{
@@ -676,7 +690,7 @@
"name": "plugins/modules/info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "af50f59fca9f9bc84a8ecd622173279f436a7ac96654b86a5afa547aa317123f",
+ "chksum_sha256": "c4820b86a48d2884756dc4c2b3ff53285cf839b7b8db78494b90da93774ba44b",
"format": 1
},
{
@@ -708,6 +722,13 @@
"format": 1
},
{
+ "name": "plugins/modules/resource_group.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "40a4370a3a7a3fd9dbc98572870df22d94b877b0345a6d573e97675fd3715bfd",
+ "format": 1
+ },
+ {
"name": "plugins/modules/sdc.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2832,28 +2853,28 @@
"name": "tests/sanity/ignore-2.14.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2bbf73bd4314d2ddf3be259531d6053876cf3eedfb2064d3f499230d35a5e29d",
+ "chksum_sha256": "71fd11298139d7839c2d0cf9c6933ad687b3a6bf7ca09862ea3b984e43bf72a4",
"format": 1
},
{
"name": "tests/sanity/ignore-2.15.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2bbf73bd4314d2ddf3be259531d6053876cf3eedfb2064d3f499230d35a5e29d",
+ "chksum_sha256": "71fd11298139d7839c2d0cf9c6933ad687b3a6bf7ca09862ea3b984e43bf72a4",
"format": 1
},
{
"name": "tests/sanity/ignore-2.16.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "284e11dfcae8cd7417880d605cff0c5fca335d506122707fc0dff6485480c1eb",
+ "chksum_sha256": "9ae1170098d5b400a80d561fbaef8149b6707489c5f1424b64d418b80f1cecb9",
"format": 1
},
{
"name": "tests/sanity/ignore-2.17.txt",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e67ee7fbc5af526a8d088ddfdb7ce9a576c4fadac1d8146a5615ddc6654d3269",
+ "chksum_sha256": "51c1ac0a0e1858fc26f4e609e997a6084f49f18ee72bbed0b0e26377174ac60c",
"format": 1
},
{
@@ -2958,7 +2979,7 @@
"name": "tests/unit/plugins/module_utils/mock_info_api.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cab119466db38050d440bc7201e8b8a5124c5ec0696f4a695089a970c02d7602",
+ "chksum_sha256": "00610d4f77581b396be82ab4aeb8bef87e6a2b8347381664ae8319ebc00ca229",
"format": 1
},
{
@@ -2990,6 +3011,13 @@
"format": 1
},
{
+ "name": "tests/unit/plugins/module_utils/mock_resource_group_api.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "dde76ae958d17d0f149b29bcc72c48c00fa4df6bfc648ac62ddda4a8ad10ecc9",
+ "format": 1
+ },
+ {
"name": "tests/unit/plugins/module_utils/mock_sdc_api.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -3063,7 +3091,7 @@
"name": "tests/unit/plugins/modules/test_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e50a6d20e1e279a687e1b6b699530a3abe8d83768e0d215189e54b0f9d8a12f0",
+ "chksum_sha256": "a83671b974fb7179328165836be0da764ff4b7d4bb3ebc89124a1c05090b93fb",
"format": 1
},
{
@@ -3095,6 +3123,13 @@
"format": 1
},
{
+ "name": "tests/unit/plugins/modules/test_resource_group.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3499365b18657d8eac1e1636f46065e8e37ef3544f3660a4b20d6618a25d8e3a",
+ "format": 1
+ },
+ {
"name": "tests/unit/plugins/modules/test_sdc.py",
"ftype": "file",
"chksum_type": "sha256",
diff --git a/ansible_collections/dellemc/powerflex/MANIFEST.json b/ansible_collections/dellemc/powerflex/MANIFEST.json
index 50f25fa4c..d52c820f7 100644
--- a/ansible_collections/dellemc/powerflex/MANIFEST.json
+++ b/ansible_collections/dellemc/powerflex/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "dellemc",
"name": "powerflex",
- "version": "2.2.0",
+ "version": "2.3.0",
"authors": [
"Akash Shendge <ansible.team@dell.com>",
"Arindam Datta <ansible.team@dell.com>",
@@ -24,16 +24,16 @@
],
"license_file": null,
"dependencies": {},
- "repository": "https://github.com/dell/ansible-powerflex/tree/2.2.0",
- "documentation": "https://github.com/dell/ansible-powerflex/tree/2.2.0/docs",
- "homepage": "https://github.com/dell/ansible-powerflex/tree/2.2.0",
+ "repository": "https://github.com/dell/ansible-powerflex/tree/2.3.0",
+ "documentation": "https://github.com/dell/ansible-powerflex/tree/2.3.0/docs",
+ "homepage": "https://github.com/dell/ansible-powerflex/tree/2.3.0",
"issues": "https://www.dell.com/community/Automation/bd-p/Automation"
},
"file_manifest_file": {
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b6cac9b3795806daa37e451654c294ca112eab9b180e45ccc02b4ae0c2f12ff",
+ "chksum_sha256": "c91fc714e4e70b371ad5de1191d1e8d5a6a829f347016680a0ce39e4931fceb4",
"format": 1
},
"format": 1
diff --git a/ansible_collections/dellemc/powerflex/README.md b/ansible_collections/dellemc/powerflex/README.md
index a12d86b97..155631def 100644
--- a/ansible_collections/dellemc/powerflex/README.md
+++ b/ansible_collections/dellemc/powerflex/README.md
@@ -6,29 +6,29 @@ The capabilities of the Ansible modules are managing SDCs, volumes, snapshots, s
## Table of contents
-* [Code of conduct](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/CODE_OF_CONDUCT.md)
-* [Maintainer guide](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/MAINTAINER_GUIDE.md)
-* [Committer guide](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/COMMITTER_GUIDE.md)
-* [Contributing guide](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/CONTRIBUTING.md)
-* [Branching strategy](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/BRANCHING.md)
-* [List of adopters](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/ADOPTERS.md)
-* [Maintainers](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/MAINTAINERS.md)
-* [Support](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/SUPPORT.md)
+* [Code of conduct](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/CODE_OF_CONDUCT.md)
+* [Maintainer guide](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/MAINTAINER_GUIDE.md)
+* [Committer guide](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/COMMITTER_GUIDE.md)
+* [Contributing guide](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/CONTRIBUTING.md)
+* [Branching strategy](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/BRANCHING.md)
+* [List of adopters](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/ADOPTERS.md)
+* [Maintainers](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/MAINTAINERS.md)
+* [Support](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/SUPPORT.md)
* [License](#license)
-* [Security](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/SECURITY.md)
+* [Security](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/SECURITY.md)
* [Prerequisites](#prerequisites)
* [List of Ansible modules for Dell PowerFlex](#list-of-ansible-modules-for-dell-powerflex)
* [Installation and execution of Ansible modules for Dell PowerFlex](#installation-and-execution-of-ansible-modules-for-dell-powerflex)
* [Releasing, Maintenance and Deprecation](#releasing-maintenance-and-deprecation)
## License
-The Ansible collection for PowerFlex is released and licensed under the GPL-3.0 license. See [LICENSE](https://github.com/dell/ansible-powerflex/blob/2.2.0/LICENSE) for the full terms. Ansible modules and modules utilities that are part of the Ansible collection for PowerFlex are released and licensed under the Apache 2.0 license. See [MODULE-LICENSE](https://github.com/dell/ansible-powerflex/blob/2.2.0/MODULE-LICENSE) for the full terms.
+The Ansible collection for PowerFlex is released and licensed under the GPL-3.0 license. See [LICENSE](https://github.com/dell/ansible-powerflex/blob/2.3.0/LICENSE) for the full terms. Ansible modules and modules utilities that are part of the Ansible collection for PowerFlex are released and licensed under the Apache 2.0 license. See [MODULE-LICENSE](https://github.com/dell/ansible-powerflex/blob/2.3.0/MODULE-LICENSE) for the full terms.
## Prerequisites
| **Ansible Modules** | **PowerFlex/VxFlex OS Version** | **SDK version** | **Python version** | **Ansible** |
|---------------------|-----------------------|-------|--------------------|--------------------------|
-| v2.2.0 |3.6 <br> 4.0 <br> 4.5 | 1.9.0 | 3.9.x <br> 3.10.x <br> 3.11.x | 2.14 <br> 2.15 <br> 2.16 |
+| v2.3.0 |3.6 <br> 4.0 <br> 4.5 | 1.10.0 | 3.9.x <br> 3.10.x <br> 3.11.x | 2.14 <br> 2.15 <br> 2.16 |
* Please follow PyPowerFlex installation instructions on [PyPowerFlex Documentation](https://github.com/dell/python-powerflex)
@@ -36,22 +36,22 @@ The Ansible collection for PowerFlex is released and licensed under the GPL-3.0
The modules are written in such a way that all requests are idempotent and hence fault-tolerant. It essentially means that the result of a successfully performed request is independent of the number of times it is executed.
## List of Ansible modules for Dell PowerFlex
- * [Info module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/info.rst)
- * [Snapshot module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/snapshot.rst)
- * [SDC module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/sdc.rst)
- * [Storage pool module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/storagepool.rst)
- * [Volume module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/volume.rst)
- * [SDS module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/sds.rst)
- * [Device Module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/device.rst)
- * [Protection Domain Module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/protection_domain.rst)
- * [MDM Cluster Module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/mdm_cluster.rst)
- * [Replication Consistency Group Module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/replication_consistency_group.rst)
- * [Replication Pair Module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/replication_pair.rst)
- * [Snapshot Policy Module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/snapshot_policy.rst)
- * [Fault Sets Module](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/modules/fault_set.rst)
+ * [Info module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/info.rst)
+ * [Snapshot module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/snapshot.rst)
+ * [SDC module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/sdc.rst)
+ * [Storage pool module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/storagepool.rst)
+ * [Volume module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/volume.rst)
+ * [SDS module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/sds.rst)
+ * [Device Module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/device.rst)
+ * [Protection Domain Module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/protection_domain.rst)
+ * [MDM Cluster Module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/mdm_cluster.rst)
+ * [Replication Consistency Group Module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/replication_consistency_group.rst)
+ * [Replication Pair Module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/replication_pair.rst)
+ * [Snapshot Policy Module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/snapshot_policy.rst)
+ * [Fault Sets Module](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/modules/fault_set.rst)
## Installation and execution of Ansible modules for Dell PowerFlex
-The installation and execution steps of Ansible modules for Dell PowerFlex can be found [here](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/INSTALLATION.md).
+The installation and execution steps of Ansible modules for Dell PowerFlex can be found [here](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/INSTALLATION.md).
## Releasing, Maintenance and Deprecation
@@ -59,6 +59,6 @@ Ansible Modules for Dell Technologies PowerFlex follows [Semantic Versioning](ht
New version will be release regularly if significant changes (bug fix or new feature) are made in the collection.
-Released code versions are located on "release" branches with names of the form "release-x.y.z" where x.y.z corresponds to the version number. More information on branching strategy followed can be found [here](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/BRANCHING.md).
+Released code versions are located on "release" branches with names of the form "release-x.y.z" where x.y.z corresponds to the version number. More information on branching strategy followed can be found [here](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/BRANCHING.md).
Ansible Modules for Dell Technologies PowerFlex deprecation cycle is aligned with that of [Ansible](https://docs.ansible.com/ansible/latest/dev_guide/module_lifecycle.html). \ No newline at end of file
diff --git a/ansible_collections/dellemc/powerflex/changelogs/.plugin-cache.yaml b/ansible_collections/dellemc/powerflex/changelogs/.plugin-cache.yaml
index b2098aee6..ce26c2f7e 100644
--- a/ansible_collections/dellemc/powerflex/changelogs/.plugin-cache.yaml
+++ b/ansible_collections/dellemc/powerflex/changelogs/.plugin-cache.yaml
@@ -16,6 +16,11 @@ plugins:
name: device
namespace: ''
version_added: 1.1.0
+ fault_set:
+ description: Manage Fault Sets on Dell PowerFlex
+ name: fault_set
+ namespace: ''
+ version_added: 2.2.0
info:
description: Gathering information about Dell PowerFlex
name: info
@@ -41,6 +46,11 @@ plugins:
name: replication_pair
namespace: ''
version_added: 1.6.0
+ resource_group:
+ description: Manage resource group deployments on Dell PowerFlex.
+ name: resource_group
+ namespace: ''
+ version_added: 2.3.0
sdc:
description: Manage SDCs on Dell PowerFlex
name: sdc
@@ -76,4 +86,4 @@ plugins:
strategy: {}
test: {}
vars: {}
-version: 2.1.0
+version: 2.3.0
diff --git a/ansible_collections/dellemc/powerflex/changelogs/changelog.yaml b/ansible_collections/dellemc/powerflex/changelogs/changelog.yaml
index 8211b2b91..2c8926ed1 100644
--- a/ansible_collections/dellemc/powerflex/changelogs/changelog.yaml
+++ b/ansible_collections/dellemc/powerflex/changelogs/changelog.yaml
@@ -146,3 +146,15 @@ releases:
name: fault_set
namespace: ''
release_date: '2024-02-29'
+ 2.3.0:
+ changes:
+ minor_changes:
+ - Added support for resource group provisioning to validate, deploy,
+ edit, add nodes and delete a resource group.
+ - The Info module is enhanced to list the firmware repositories.
+ - Added support for PowerFlex ansible modules and roles on Azure.
+ modules:
+ - description: Manage resource group deployments on Dell PowerFlex
+ name: resource_group
+ namespace: ''
+ release_date: '2024-03-29'
diff --git a/ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md b/ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md
index 726c931d0..9c45af69c 100644
--- a/ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md
+++ b/ansible_collections/dellemc/powerflex/docs/CONTRIBUTING.md
@@ -10,7 +10,7 @@ You may obtain a copy of the License at
# How to contribute
-Become one of the contributors to this project! We thrive to build a welcoming and open community for anyone who wants to use the project or contribute to it. There are just a few small guidelines you need to follow. To help us create a safe and positive community experience for all, we require all participants to adhere to the [Code of Conduct](https://github.com/dell/ansible-powerflex/blob/2.2.0/CODE_OF_CONDUCT.md).
+Become one of the contributors to this project! We thrive to build a welcoming and open community for anyone who wants to use the project or contribute to it. There are just a few small guidelines you need to follow. To help us create a safe and positive community experience for all, we require all participants to adhere to the [Code of Conduct](https://github.com/dell/ansible-powerflex/blob/2.3.0/CODE_OF_CONDUCT.md).
## Table of contents
@@ -76,7 +76,7 @@ Triage helps ensure that issues resolve quickly by:
If you don't have the knowledge or time to code, consider helping with _issue triage_. The Ansible modules for Dell PowerFlex community will thank you for saving them time by spending some of yours.
-Read more about the ways you can [Triage issues](https://github.com/dell/ansible-powerflex/blob/2.2.0/ISSUE_TRIAGE.md).
+Read more about the ways you can [Triage issues](https://github.com/dell/ansible-powerflex/blob/2.3.0/ISSUE_TRIAGE.md).
## Your first contribution
@@ -89,7 +89,7 @@ When you're ready to contribute, it's time to create a pull request.
## Branching
-* [Branching Strategy for Ansible modules for Dell PowerFlex](https://github.com/dell/ansible-powerflex/blob/2.2.0/BRANCHING.md)
+* [Branching Strategy for Ansible modules for Dell PowerFlex](https://github.com/dell/ansible-powerflex/blob/2.3.0/BRANCHING.md)
## Signing your commits
@@ -144,7 +144,7 @@ Make sure that the title for your pull request uses the same format as the subje
### Quality gates for pull requests
-GitHub Actions are used to enforce quality gates when a pull request is created or when any commit is made to the pull request. These GitHub Actions enforce our minimum code quality requirement for any code that get checked into the repository. If any of the quality gates fail, it is expected that the contributor will look into the check log, understand the problem and resolve the issue. If help is needed, please feel free to reach out the maintainers of the project for [support](https://github.com/dell/ansible-powerflex/blob/2.2.0/SUPPORT.md).
+GitHub Actions are used to enforce quality gates when a pull request is created or when any commit is made to the pull request. These GitHub Actions enforce our minimum code quality requirement for any code that get checked into the repository. If any of the quality gates fail, it is expected that the contributor will look into the check log, understand the problem and resolve the issue. If help is needed, please feel free to reach out the maintainers of the project for [support](https://github.com/dell/ansible-powerflex/blob/2.3.0/SUPPORT.md).
#### Code sanitization
diff --git a/ansible_collections/dellemc/powerflex/docs/INSTALLATION.md b/ansible_collections/dellemc/powerflex/docs/INSTALLATION.md
index 86861574b..1aed4d367 100644
--- a/ansible_collections/dellemc/powerflex/docs/INSTALLATION.md
+++ b/ansible_collections/dellemc/powerflex/docs/INSTALLATION.md
@@ -41,7 +41,7 @@ You may obtain a copy of the License at
* Download the latest tar build from any of the available distribution channel [Ansible Galaxy](https://galaxy.ansible.com/dellemc/powerflex) /[Automation Hub](https://console.redhat.com/ansible/automation-hub/repo/published/dellemc/powerflex) and use this command to install the collection anywhere in your system:
- ansible-galaxy collection install dellemc-powerflex-2.2.0.tar.gz -p <install_path>
+ ansible-galaxy collection install dellemc-powerflex-2.3.0.tar.gz -p <install_path>
* Set the environment variable:
@@ -68,7 +68,7 @@ You may obtain a copy of the License at
## Ansible modules execution
-The Ansible server must be configured with Python library for PowerFlex to run the Ansible playbooks. The [Documents](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/) provide information on different Ansible modules along with their functions and syntax. The parameters table in the Product Guide provides information on various parameters which needs to be configured before running the modules.
+The Ansible server must be configured with Python library for PowerFlex to run the Ansible playbooks. The [Documents](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/) provide information on different Ansible modules along with their functions and syntax. The parameters table in the Product Guide provides information on various parameters which needs to be configured before running the modules.
## SSL certificate validation
diff --git a/ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md b/ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md
index 8871da8e3..939aca18d 100644
--- a/ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md
+++ b/ansible_collections/dellemc/powerflex/docs/ISSUE_TRIAGE.md
@@ -43,8 +43,8 @@ Should explain what happened, what was expected and how to reproduce it together
- Ansible Version: [e.g. 2.14]
- Python Version [e.g. 3.11]
- - Ansible modules for Dell PowerFlex Version: [e.g. 2.2.0]
- - PowerFlex SDK version: [e.g. PyPowerFlex 1.9.0]
+ - Ansible modules for Dell PowerFlex Version: [e.g. 2.3.0]
+ - PowerFlex SDK version: [e.g. PyPowerFlex 1.10.0]
- Any other additional information...
#### Feature requests
diff --git a/ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md b/ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md
index e2d1d90e0..b6efdd20b 100644
--- a/ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md
+++ b/ansible_collections/dellemc/powerflex/docs/MAINTAINER_GUIDE.md
@@ -27,7 +27,7 @@ If a candidate is approved, a Maintainer contacts the candidate to invite them t
## Maintainer policies
* Lead by example
-* Follow the [Code of Conduct](https://github.com/dell/ansible-powerflex/blob/2.2.0/CODE_OF_CONDUCT.md) and the guidelines in the [Contributing](https://github.com/dell/ansible-powerflex/blob/2.2.0/CONTRIBUTING.md) and [Committer](https://github.com/dell/ansible-powerflex/blob/2.2.0/COMMITTER_GUIDE.md) guides
+* Follow the [Code of Conduct](https://github.com/dell/ansible-powerflex/blob/2.3.0/CODE_OF_CONDUCT.md) and the guidelines in the [Contributing](https://github.com/dell/ansible-powerflex/blob/2.3.0/CONTRIBUTING.md) and [Committer](https://github.com/dell/ansible-powerflex/blob/2.3.0/COMMITTER_GUIDE.md) guides
* Promote a friendly and collaborative environment within our community
* Be actively engaged in discussions, answering questions, updating defects, and reviewing pull requests
* Criticize code, not people. Ideally, tell the contributor a better way to do what they need.
diff --git a/ansible_collections/dellemc/powerflex/docs/Release Notes.md b/ansible_collections/dellemc/powerflex/docs/Release Notes.md
index 9ce24b6d0..e9c5f24c2 100644
--- a/ansible_collections/dellemc/powerflex/docs/Release Notes.md
+++ b/ansible_collections/dellemc/powerflex/docs/Release Notes.md
@@ -1,6 +1,6 @@
**Ansible Modules for Dell Technologies PowerFlex**
=========================================
-### Release notes 2.2.0
+### Release notes 2.3.0
> © 2024 Dell Inc. or its subsidiaries. All rights reserved. Dell
> and other trademarks are trademarks of Dell Inc. or its
@@ -28,7 +28,7 @@ Table 1. Revision history
| Revision | Date | Description |
|----------|-----------------|-------------------------------------------------------------|
-| 01 | February 2024 | Current release of Ansible Modules for Dell PowerFlex 2.2.0 |
+| 01 | March 2024 | Current release of Ansible Modules for Dell PowerFlex 2.3.0 |
Product description
-------------------
@@ -36,7 +36,7 @@ Product description
The Ansible modules for Dell PowerFlex are used to automate and orchestrate
the deployment, configuration, and management of Dell PowerFlex storage
systems. The capabilities of Ansible modules are managing volumes,
-storage pools, SDCs, snapshots, snapshot policy, SDSs, replication consistency groups, replication pairs, devices, protection domain, MDM and fault sets.
+storage pools, SDCs, snapshots, snapshot policy, SDSs, replication consistency groups, replication pairs, resource group, devices, protection domain, MDM and fault sets.
cluster, and obtaining high-level information about a PowerFlex system information.
The modules use playbooks to list, show, create, delete, and modify
each of the entities.
@@ -44,15 +44,15 @@ each of the entities.
New features and enhancements
-----------------------------
Along with the previous release deliverables, this release supports following features -
-- Fault set module is introduced to create, get details, rename and delete fault sets.
-- The SDS module has been enhanced to facilitate SDS creation within a fault set.
-- The Info module is enhanced to retrieve lists related to fault sets, service templates, deployments, and managed devices.
+- Added support for resource group provisioning to validate, deploy, edit, add nodes and delete a resource group.
+- The Info module is enhanced to list out all the firmware repository.
+- Added support for PowerFlex ansible modules and roles on Azure.
Known issues
------------
- Setting the RF cache and performance profile of the SDS during its creation fails intermittently on PowerFlex version 3.5.
- The creation of replication pair fails when copy_type is specified as OfflineCopy on PowerFlex version 4.0.
-- Pagination in info module with offset and limit fetches more than expected records when listing service templates or deployments.
+- Pagination in info module with offset and limit fetches more than expected records when listing service templates, deployments or firmware repository.
- Templates are fetched using the info module in spite of setting include_templates to false when listing deployments.
Limitations
@@ -62,11 +62,11 @@ Limitations
Distribution
------------
The software package is available for download from the [Ansible Modules
-for PowerFlex GitHub](https://github.com/dell/ansible-powerflex/tree/2.2.0) page.
+for PowerFlex GitHub](https://github.com/dell/ansible-powerflex/tree/2.3.0) page.
Documentation
-------------
-The documentation is available on [Ansible Modules for PowerFlex GitHub](https://github.com/dell/ansible-powerflex/tree/2.2.0/docs)
+The documentation is available on [Ansible Modules for PowerFlex GitHub](https://github.com/dell/ansible-powerflex/tree/2.3.0/docs)
page. It includes the following:
- README
diff --git a/ansible_collections/dellemc/powerflex/docs/SECURITY.md b/ansible_collections/dellemc/powerflex/docs/SECURITY.md
index 77323e456..5ebcaa3ee 100644
--- a/ansible_collections/dellemc/powerflex/docs/SECURITY.md
+++ b/ansible_collections/dellemc/powerflex/docs/SECURITY.md
@@ -12,7 +12,7 @@ You may obtain a copy of the License at
The Ansible modules for Dell PowerFlex repository are inspected for security vulnerabilities via blackduck scans and static code analysis.
-In addition to this, there are various security checks that get executed against a branch when a pull request is created/updated. Please refer to [pull request](https://github.com/dell/ansible-powerflex/blob/2.2.0/docs/CONTRIBUTING.md#Pull-requests) for more information.
+In addition to this, there are various security checks that get executed against a branch when a pull request is created/updated. Please refer to [pull request](https://github.com/dell/ansible-powerflex/blob/2.3.0/docs/CONTRIBUTING.md#Pull-requests) for more information.
## Reporting a vulnerability
diff --git a/ansible_collections/dellemc/powerflex/docs/modules/info.rst b/ansible_collections/dellemc/powerflex/docs/modules/info.rst
index ced8e0aaa..7b933203f 100644
--- a/ansible_collections/dellemc/powerflex/docs/modules/info.rst
+++ b/ansible_collections/dellemc/powerflex/docs/modules/info.rst
@@ -14,7 +14,7 @@ Synopsis
Gathering information about Dell PowerFlex storage system includes getting the api details, list of volumes, SDSs, SDCs, storage pools, protection domains, snapshot policies, and devices.
-Gathering information about Dell PowerFlex Manager includes getting the list of managed devices, deployments and service templates.
+Gathering information about Dell PowerFlex Manager includes getting the list of managed devices, deployments, service templates and firmware repository.
@@ -22,9 +22,9 @@ Requirements
------------
The below requirements are needed on the host that executes this module.
-- A Dell PowerFlex storage system version 3.5 or later.
+- A Dell PowerFlex storage system version 3.6 or later.
- Ansible-core 2.14 or later.
-- PyPowerFlex 1.8.0.
+- PyPowerFlex 1.10.0.
- Python 3.9, 3.10 or 3.11.
@@ -33,7 +33,7 @@ Parameters
----------
gather_subset (optional, list, None)
- List of string variables to specify the Powerflex storage system entities for which information is required.
+ List of string variables to specify the PowerFlex storage system entities for which information is required.
Volumes - ``vol``.
@@ -61,6 +61,8 @@ Parameters
Deployments - ``deployment``.
+ FirmwareRepository - ``firmware_repository``.
+
filters (optional, list, None)
List of filters to support filtered output for storage entities.
@@ -77,7 +79,7 @@ Parameters
filter_operator (True, str, None)
Operation to be performed on filter key.
- Choice *'contains'* is supported for gather_subset keys *service_template*, *managed_device*, *deployment*.
+ Choice ``contains`` is supported for *gather_subset* keys ``service_template``, ``managed_device``, ``deployment``, ``firmware_repository``.
filter_value (True, str, None)
@@ -88,47 +90,65 @@ Parameters
limit (optional, int, 50)
Page limit.
- Supported for gather_subset keys *service_template*, *managed_device*, *deployment*.
+ Supported for *gather_subset* keys ``service_template``, ``managed_device``, ``deployment``, ``firmware_repository``.
offset (optional, int, 0)
Pagination offset.
- Supported for gather_subset keys *service_template*, *managed_device*, *deployment*.
+ Supported for *gather_subset* keys ``service_template``, ``managed_device``, ``deployment``, ``firmware_repository``.
sort (optional, str, None)
Sort the returned components based on specified field.
- Supported for gather_subset keys *service_template*, *managed_device*, *deployment*.
+ Supported for *gather_subset* keys ``service_template``, ``managed_device``, ``deployment``, ``firmware_repository``.
- The supported sort keys for the gather_subset can be referred from PowerFlex Manager API documentation in developer.dell.com.
+ The supported sort keys for the *gather_subset* can be referred from PowerFlex Manager API documentation in https://developer.dell.com.
include_devices (optional, bool, True)
Include devices in response.
- Applicable when gather_subset is *deployment*.
+ Applicable when *gather_subset* is ``deployment``.
include_template (optional, bool, True)
Include service templates in response.
- Applicable when gather_subset is *deployment*.
+ Applicable when *gather_subset* is ``deployment``.
full (optional, bool, False)
Specify if response is full or brief.
- Applicable when gather_subset is *deployment*, *service_template*.
+ Applicable when *gather_subset* is ``deployment``, ``service_template``.
- For *deployment* specify to use full templates including resources in response.
+ For ``deployment`` specify to use full templates including resources in response.
include_attachments (optional, bool, True)
Include attachments.
- Applicable when gather_subset is *service_template*.
+ Applicable when *gather_subset* is ``service_template``.
+
+
+ include_related (optional, bool, False)
+ Include related entities.
+
+ Applicable when *gather_subset* is ``firmware_repository``.
+
+
+ include_bundles (optional, bool, False)
+ Include software bundle entities.
+
+ Applicable when *gather_subset* is ``firmware_repository``.
+
+
+ include_components (optional, bool, False)
+ Include software component entities.
+
+ Applicable when *gather_subset* is ``firmware_repository``.
hostname (True, str, None)
@@ -169,8 +189,8 @@ Notes
.. note::
- The *check_mode* is supported.
- - The supported filter keys for the gather_subset can be referred from PowerFlex Manager API documentation in developer.dell.com.
- - The *filter*, *sort*, *limit* and *offset* options will be ignored when more than one *gather_subset* is specified along with *service_template*, *managed_device* or *deployment*.
+ - The supported filter keys for the *gather_subset* can be referred from PowerFlex Manager API documentation in https://developer.dell.com.
+ - The *filter*, *sort*, *limit* and *offset* options will be ignored when more than one *gather_subset* is specified along with ``service_template``, ``managed_device``, ``deployment`` or ``firmware_repository``.
- The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform.
@@ -184,10 +204,10 @@ Examples
- name: Get detailed list of PowerFlex entities
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- vol
- storage_pool
@@ -202,10 +222,10 @@ Examples
- name: Get a subset list of PowerFlex volumes
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- vol
filters:
@@ -215,10 +235,10 @@ Examples
- name: Get deployment and resource provisioning info
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- managed_device
- deployment
@@ -226,10 +246,10 @@ Examples
- name: Get deployment with filter, sort, pagination
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- deployment
filters:
@@ -242,6 +262,60 @@ Examples
include_devices: true
include_template: true
+ - name: Get the list of firmware repository.
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+
+ - name: Get the list of firmware repository
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+ include_related: true
+ include_bundles: true
+ include_components: true
+
+ - name: Get the list of firmware repository with filter
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+ filters:
+ - filter_key: "createdBy"
+ filter_operator: "equal"
+ filter_value: "admin"
+ sort: createdDate
+ limit: 10
+ include_related: true
+ include_bundles: true
+ include_components: true
+ register: result_repository_out
+
+ - name: Get the list of available firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository | selectattr('state', 'equalto', 'available') }}"
+
+ - name: Get the list of software components in the firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository |
+ selectattr('id', 'equalto', '8aaa80788b7') | map(attribute='softwareComponents') | flatten }}"
+
+ - name: Get the list of software bundles in the firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository |
+ selectattr('id', 'equalto', '8aaa80788b7') | map(attribute='softwareBundles') | flatten }}"
+
Return Values
@@ -841,6 +915,39 @@ ServiceTemplates (when I(gather_subset) is I(service_template), list, [{'id': '2
+FirmwareRepository (when I(gather_subset) is C(firmware_repository), list, [{'id': '8aaa03a78de4b2a5018de662818d000b', 'name': 'https://192.168.0.1/artifactory/path/pfxmlogs-bvt-pfmp-swo-upgrade-402-to-451-56.tar.gz', 'sourceLocation': 'https://192.168.0.2/artifactory/path/pfxmlogs-bvt-pfmp-swo-upgrade-402-to-451-56.tar.gz', 'sourceType': None, 'diskLocation': '', 'filename': '', 'md5Hash': None, 'username': '', 'password': '', 'downloadStatus': 'error', 'createdDate': '2024-02-26T17:07:11.884+00:00', 'createdBy': 'admin', 'updatedDate': '2024-03-01T06:21:10.917+00:00', 'updatedBy': 'system', 'defaultCatalog': False, 'embedded': False, 'state': 'errors', 'softwareComponents': [], 'softwareBundles': [], 'deployments': [], 'bundleCount': 0, 'componentCount': 0, 'userBundleCount': 0, 'minimal': True, 'downloadProgress': 100, 'extractProgress': 0, 'fileSizeInGigabytes': 0.0, 'signedKeySourceLocation': None, 'signature': 'Unknown', 'custom': False, 'needsAttention': False, 'jobId': 'Job-10d75a23-d801-4fdb-a2d0-7f6389ab75cf', 'rcmapproved': False}])
+ Details of all firmware repository.
+
+
+ id (, str, )
+ ID of the firmware repository.
+
+
+ name (, str, )
+ Name of the firmware repository.
+
+
+ sourceLocation (, str, )
+ Source location of the firmware repository.
+
+
+ state (, str, )
+ State of the firmware repository.
+
+
+ softwareComponents (, list, )
+ Software components of the firmware repository.
+
+
+ softwareBundles (, list, )
+ Software bundles of the firmware repository.
+
+
+ deployments (, list, )
+ Deployments of the firmware repository.
+
+
+
@@ -857,4 +964,5 @@ Authors
- Arindam Datta (@dattaarindam) <ansible.team@dell.com>
- Trisha Datta (@trisha-dell) <ansible.team@dell.com>
- Jennifer John (@Jennifer-John) <ansible.team@dell.com>
+- Felix Stephen (@felixs88) <ansible.team@dell.com>
diff --git a/ansible_collections/dellemc/powerflex/docs/modules/resource_group.rst b/ansible_collections/dellemc/powerflex/docs/modules/resource_group.rst
new file mode 100644
index 000000000..e8bdbde09
--- /dev/null
+++ b/ansible_collections/dellemc/powerflex/docs/modules/resource_group.rst
@@ -0,0 +1,281 @@
+.. _resource_group_module:
+
+
+resource_group -- Manage resource group deployments on Dell PowerFlex.
+======================================================================
+
+.. contents::
+ :local:
+ :depth: 1
+
+
+Synopsis
+--------
+
+Managing resource group deployments on PowerFlex storage system includes deploying, editing, adding nodes and deleting a resource group deployment.
+
+
+
+Requirements
+------------
+The below requirements are needed on the host that executes this module.
+
+- A Dell PowerFlex storage system version 3.6 or later.
+- Ansible-core 2.14 or later.
+- PyPowerFlex 1.10.0.
+- Python 3.9, 3.10 or 3.11.
+
+
+
+Parameters
+----------
+
+ resource_group_name (optional, str, None)
+ The name of the resource group.
+
+ This is a required field to deploy a resource group.
+
+ Either *resource_group_id* or *resource_group_name* must be specified to perform resource group operations.
+
+ Mutually exclusive with *resource_group_id*.
+
+
+ resource_group_id (optional, str, None)
+ The ID of the resource group.
+
+ Either *resource_group_id* or *resource_group_name* must be specified to perform resource group operations.
+
+ Mutually exclusive with *resource_group_name*.
+
+
+ template_name (optional, str, None)
+ The name of the published template.
+
+ Either *template_id* or *template_name* must be specified to deploy a resource group.
+
+ Mutually exclusive with *template_id*.
+
+
+ template_id (optional, str, None)
+ The ID of the published template.
+
+ Either *template_id* or *template_name* must be specified to deploy a resource group.
+
+ Mutually exclusive with *template_name*.
+
+
+ firmware_repository_id (optional, str, None)
+ The ID of the firmware repository if not using the appliance default catalog.
+
+ Mutually exclusive with *firmware_repository_name*.
+
+
+ firmware_repository_name (optional, str, None)
+ The name of the firmware repository if not using the appliance default catalog.
+
+ Mutually exclusive with *firmware_repository_id*.
+
+
+ new_resource_group_name (optional, str, None)
+ New name of the resource group to rename to.
+
+
+ description (optional, str, None)
+ The description of the resource group.
+
+
+ scaleup (optional, bool, False)
+ Whether to scale up the resource group. Specify as true to add nodes to the resource group.
+
+
+ clone_node (optional, str, None)
+ Resource to duplicate during scaleup, if more than one nodes are available in the resource group.
+
+
+ node_count (optional, int, 1)
+ Number of nodes to clone during scaleup.
+
+
+ validate (optional, bool, False)
+ Specify as true to validate the deployment of resource group.
+
+
+ schedule_date (optional, str, None)
+ Scheduled date for the resource group deployment.
+
+ Specify in YYYY-MM-DD HH:MM:SS.sss or YYYY-MM-DD format.
+
+
+ state (optional, str, present)
+ The state of the resource group.
+
+
+ hostname (True, str, None)
+ IP or FQDN of the PowerFlex host.
+
+
+ username (True, str, None)
+ The username of the PowerFlex host.
+
+
+ password (True, str, None)
+ The password of the PowerFlex host.
+
+
+ validate_certs (optional, bool, True)
+ Boolean variable to specify whether or not to validate SSL certificate.
+
+ ``true`` - Indicates that the SSL certificate should be verified.
+
+ ``false`` - Indicates that the SSL certificate should not be verified.
+
+
+ port (optional, int, 443)
+ Port number through which communication happens with PowerFlex host.
+
+
+ timeout (False, int, 120)
+ Time after which connection will get terminated.
+
+ It is to be mentioned in seconds.
+
+
+
+
+
+Notes
+-----
+
+.. note::
+ - The *check_mode* is supported.
+ - Resource group scale up can be done only when deployment is complete.
+ - The modules present in the collection named as 'dellemc.powerflex' are built to support the Dell PowerFlex storage platform.
+
+
+
+
+Examples
+--------
+
+.. code-block:: yaml+jinja
+
+
+ - name: Validate deployment of a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ port: "{{ port }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ description: ans_rg
+ template_id: c65d0172-8666-48ab-935e-9a0bf69ed66d
+ firmware_repository_id: 8aaa80788b5755d1018b576126d51ba3
+ validate: true
+
+ - name: Deploy a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ port: "{{ port }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ description: ans_rg
+ template_id: c65d0172-8666-48ab-935e-9a0bf69ed66d
+ firmware_repository_id: 8aaa80788b5755d1018b576126d51ba3
+
+ - name: Add a node to a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ scaleup: true
+ clone_node: "{{ node_1 }}"
+ node_count: "{{ node_count }}"
+
+ - name: Modify a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ new_resource_group_name: "{{ new_resource_group_name }}"
+ description: "description new"
+
+ - name: Delete a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ port: "{{ port }}"
+ resource_group_name: ans_rg
+ state: "absent"
+
+
+
+Return Values
+-------------
+
+changed (always, bool, false)
+ Whether or not the resource has changed.
+
+
+resource_group_details (When resource group exists., dict, {'id': '8aaa03a88de961fa018de96a88d80008', 'deploymentName': 'dep-ans-test-rg1', 'deploymentDescription': 'ans test rg', 'retry': True, 'teardown': False, 'serviceTemplate': {'id': '8aaa03a88de961fa018de96a88d80008', 'templateName': 'update-template (8aaa03a88de961fa018de96a88d80008)'}, 'scheduleDate': None, 'status': 'error', 'compliant': True, 'deploymentDevice': [{'refId': 'scaleio-block-legacy-gateway', 'refType': 'SCALEIO', 'deviceHealth': 'GREEN', 'compliantState': 'COMPLIANT', 'deviceType': 'scaleio', 'currentIpAddress': '1.3.9.2', 'componentId': '910bf934-d45a-4fe3-8ea2-dc481e063a81', 'statusMessage': 'The processing of PowerFlex is unsuccessful.', 'model': 'PowerFlex Gateway', 'brownfield': False}], 'updateServerFirmware': True, 'useDefaultCatalog': True, 'firmwareRepository': {'id': '8aaa80788b5755d1018b576126d51ba3', 'name': 'PowerFlex 4.5.0.0', 'rcmapproved': False}, 'firmwareRepositoryId': '8aaa80788b5755d1018b576126d51ba3', 'deploymentHealthStatusType': 'red', 'allUsersAllowed': False, 'owner': 'admin', 'numberOfDeployments': 0, 'lifecycleMode': False, 'vds': False, 'scaleUp': False, 'brownfield': False, 'templateValid': True, 'configurationChange': False})
+ Details of the resource group deployment.
+
+
+ id (, str, )
+ The ID of the deployed resource group.
+
+
+ deploymentName (, str, )
+ The name of the resource group deployment.
+
+
+ deploymentDescription (, str, )
+ The description of the resource group deployment.
+
+
+ serviceTemplate (, dict, )
+ The service template of the resource group.
+
+
+ id (, str, )
+ The ID of the service template.
+
+
+ templateName (, str, )
+ The name of the service template.
+
+
+
+ status (, str, )
+ The status of the deployment of the resource group.
+
+
+ firmwareRepositoryId (, str, )
+ The ID of the firmware repository of the resource group.
+
+
+
+
+
+
+Status
+------
+
+
+
+
+
+Authors
+~~~~~~~
+
+- Jennifer John (@johnj9) <ansible.team@dell.com>
+- Trisha Datta (@trisha-dell) <ansible.team@dell.com>
+
diff --git a/ansible_collections/dellemc/powerflex/meta/runtime.yml b/ansible_collections/dellemc/powerflex/meta/runtime.yml
index 6fa701d3a..dd41c3e91 100644
--- a/ansible_collections/dellemc/powerflex/meta/runtime.yml
+++ b/ansible_collections/dellemc/powerflex/meta/runtime.yml
@@ -3,37 +3,30 @@ requires_ansible: ">=2.14.0"
plugin_routing:
modules:
dellemc_powerflex_gatherfacts:
- redirect: dellemc.powerflex.info
- deprecation:
- removal_date: "2024-03-31"
+ tombstone:
+ removal_date: "2024-03-22"
warning_text: Use info module instead.
dellemc_powerflex_device:
- redirect: dellemc.powerflex.device
- deprecation:
- removal_date: "2024-03-31"
+ tombstone:
+ removal_date: "2024-03-22"
warning_text: Use device module instead.
dellemc_powerflex_sdc:
- redirect: dellemc.powerflex.sdc
- deprecation:
- removal_date: "2024-03-31"
+ tombstone:
+ removal_date: "2024-03-22"
warning_text: Use sdc module instead.
dellemc_powerflex_sds:
- redirect: dellemc.powerflex.sds
- deprecation:
- removal_date: "2024-03-31"
+ tombstone:
+ removal_date: "2024-03-22"
warning_text: Use sds module instead.
dellemc_powerflex_snapshot:
- redirect: dellemc.powerflex.snapshot
- deprecation:
- removal_date: "2024-03-31"
+ tombstone:
+ removal_date: "2024-03-22"
warning_text: Use snapshot module instead.
dellemc_powerflex_storagepool:
- redirect: dellemc.powerflex.storagepool
- deprecation:
- removal_date: "2024-03-31"
+ tombstone:
+ removal_date: "2024-03-22"
warning_text: Use storagepool module instead.
dellemc_powerflex_volume:
- redirect: dellemc.powerflex.volume
- deprecation:
- removal_date: "2024-03-31"
+ tombstone:
+ removal_date: "2024-03-22"
warning_text: Use volume module instead.
diff --git a/ansible_collections/dellemc/powerflex/playbooks/modules/info.yml b/ansible_collections/dellemc/powerflex/playbooks/modules/info.yml
index b1a16785a..fac8af87e 100644
--- a/ansible_collections/dellemc/powerflex/playbooks/modules/info.yml
+++ b/ansible_collections/dellemc/powerflex/playbooks/modules/info.yml
@@ -78,3 +78,60 @@
filter_value: "partial"
sort: name
limit: 10
+
+ - name: Get the list of firmware repository
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+
+ - name: Get the list of firmware repository
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+ include_related: true
+ include_bundles: true
+ include_components: true
+
+ - name: Get the list of firmware repository with filter
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+ filters:
+ - filter_key: "createdBy"
+ filter_operator: "equal"
+ filter_value: "admin"
+ sort: createdDate
+ limit: 10
+ include_related: true
+ include_bundles: true
+ include_components: true
+ register: result_repository_out
+
+ - name: Get the list of available firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository |
+ selectattr('state', 'equalto', 'available') }}"
+
+ - name: Get the list of software components in the firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository |
+ selectattr('id', 'equalto', '8aaa80788b7') |
+ map(attribute='softwareComponents') | flatten }}"
+
+ - name: Get the list of software bundles in the firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository |
+ selectattr('id', 'equalto', '8aaa80788b7') |
+ map(attribute='softwareBundles') | flatten }}"
diff --git a/ansible_collections/dellemc/powerflex/playbooks/modules/resource_group.yml b/ansible_collections/dellemc/powerflex/playbooks/modules/resource_group.yml
new file mode 100644
index 000000000..2cbc22e55
--- /dev/null
+++ b/ansible_collections/dellemc/powerflex/playbooks/modules/resource_group.yml
@@ -0,0 +1,71 @@
+---
+- name: Resource group operations on PowerFlex array.
+ hosts: localhost
+ connection: local
+ gather_facts: false
+ vars:
+ hostname: 'x.x.x.x'
+ username: 'admin'
+ password: 'Password'
+ validate_certs: false
+ host_port: 443
+ resource_group_name_1: "ans_rg"
+ node_1: "vpi2170"
+ template_id: "c65d0172-8666-48ab-935e-9a0bf69ed66d"
+
+ tasks:
+ - name: Validate deployment of a resource group
+ register: result
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ description: ans_rg
+ template_id: "{{ template_id }}"
+ firmware_repository_name: "PowerFlex 4.5.0.0"
+ validate: true
+
+ - name: Deploy a resource group
+ register: result
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ description: ans_rg
+ template_id: "{{ template_id }}"
+ firmware_repository_name: "PowerFlex 4.5.0.0"
+
+ - name: Add a node to a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ scaleup: true
+ clone_node: "{{ node_1 }}"
+ node_count: 2
+
+ - name: Modify a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ new_resource_group_name: "new_resource_group_name"
+ description: "description new"
+
+ - name: Delete a resource group
+ register: result
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ state: "absent"
diff --git a/ansible_collections/dellemc/powerflex/plugins/doc_fragments/powerflex.py b/ansible_collections/dellemc/powerflex/plugins/doc_fragments/powerflex.py
index 0c0e0d9e1..32b17a4d6 100644
--- a/ansible_collections/dellemc/powerflex/plugins/doc_fragments/powerflex.py
+++ b/ansible_collections/dellemc/powerflex/plugins/doc_fragments/powerflex.py
@@ -53,7 +53,7 @@ class ModuleDocFragment(object):
requirements:
- A Dell PowerFlex storage system version 3.6 or later.
- Ansible-core 2.14 or later.
- - PyPowerFlex 1.9.0.
+ - PyPowerFlex 1.10.0.
- Python 3.9, 3.10 or 3.11.
notes:
- The modules present in the collection named as 'dellemc.powerflex'
diff --git a/ansible_collections/dellemc/powerflex/plugins/module_utils/storage/dell/utils.py b/ansible_collections/dellemc/powerflex/plugins/module_utils/storage/dell/utils.py
index 94024d498..e3ba11971 100644
--- a/ansible_collections/dellemc/powerflex/plugins/module_utils/storage/dell/utils.py
+++ b/ansible_collections/dellemc/powerflex/plugins/module_utils/storage/dell/utils.py
@@ -8,11 +8,14 @@ __metaclass__ = type
import logging
import math
import re
+from datetime import datetime
from decimal import Decimal
from ansible_collections.dellemc.powerflex.plugins.module_utils.storage.dell.logging_handler \
import CustomRotatingFileHandler
import traceback
from ansible.module_utils.basic import missing_required_lib
+import random
+import string
"""import PyPowerFlex lib"""
try:
@@ -80,10 +83,10 @@ def ensure_required_libs(module):
exception=PKG_RSRC_IMP_ERR)
if not HAS_POWERFLEX_SDK:
- module.fail_json(msg=missing_required_lib("PyPowerFlex V 1.9.0 or above"),
+ module.fail_json(msg=missing_required_lib("PyPowerFlex V 1.10.0 or above"),
exception=POWERFLEX_SDK_IMP_ERR)
- min_ver = '1.9.0'
+ min_ver = '1.10.0'
try:
curr_version = pkg_resources.require("PyPowerFlex")[0].version
supported_version = (parse_version(curr_version) >= parse_version(min_ver))
@@ -193,3 +196,34 @@ def get_time_minutes(time, time_unit):
return time
else:
return 0
+
+
+def get_display_message(error_text):
+ match = re.search(r"displayMessage=([^']+)", error_text)
+ error_message = match.group(1) if match else error_text
+ return error_message
+
+
+def validate_date(date):
+ try:
+ return datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%f')
+ except ValueError:
+ try:
+ date_obj = datetime.strptime(date, '%Y-%m-%d')
+ return date_obj.replace(hour=0, minute=0, second=0, microsecond=0)
+ except ValueError:
+ return None
+
+
+def get_filter(name, id=None):
+ filter_type = "id" if id else "name"
+ filter_value = id or name
+ filter_query = f"eq,{filter_type},{filter_value}"
+ return filter_query
+
+
+def random_uuid_generation():
+ generate_uuid = ''.join(
+ [random.choice(string.ascii_lowercase + string.digits) for n in range(32)])
+
+ return generate_uuid
diff --git a/ansible_collections/dellemc/powerflex/plugins/modules/info.py b/ansible_collections/dellemc/powerflex/plugins/modules/info.py
index 33f3a8ad8..a114d0c51 100644
--- a/ansible_collections/dellemc/powerflex/plugins/modules/info.py
+++ b/ansible_collections/dellemc/powerflex/plugins/modules/info.py
@@ -22,7 +22,7 @@ description:
getting the api details, list of volumes, SDSs, SDCs, storage pools,
protection domains, snapshot policies, and devices.
- Gathering information about Dell PowerFlex Manager includes getting the
- list of managed devices, deployments and service templates.
+ list of managed devices, deployments, service templates and firmware repository.
extends_documentation_fragment:
- dellemc.powerflex.powerflex
@@ -31,11 +31,12 @@ author:
- Arindam Datta (@dattaarindam) <ansible.team@dell.com>
- Trisha Datta (@trisha-dell) <ansible.team@dell.com>
- Jennifer John (@Jennifer-John) <ansible.team@dell.com>
+- Felix Stephen (@felixs88) <ansible.team@dell.com>
options:
gather_subset:
description:
- - List of string variables to specify the Powerflex storage system
+ - List of string variables to specify the PowerFlex storage system
entities for which information is required.
- Volumes - C(vol).
- Storage pools - C(storage_pool).
@@ -50,9 +51,10 @@ options:
- Service templates - C(service_template).
- Managed devices - C(managed_device).
- Deployments - C(deployment).
+ - FirmwareRepository - C(firmware_repository).
choices: [vol, storage_pool, protection_domain, sdc, sds,
snapshot_policy, device, rcg, replication_pair,
- fault_set, service_template, managed_device, deployment]
+ fault_set, service_template, managed_device, deployment, firmware_repository]
type: list
elements: str
filters:
@@ -71,7 +73,8 @@ options:
filter_operator:
description:
- Operation to be performed on filter key.
- - Choice I('contains') is supported for gather_subset keys I(service_template), I(managed_device), I(deployment).
+ - Choice C(contains) is supported for I(gather_subset) keys C(service_template), C(managed_device),
+ C(deployment), C(firmware_repository).
type: str
choices: [equal, contains]
required: true
@@ -83,60 +86,81 @@ options:
limit:
description:
- Page limit.
- - Supported for gather_subset keys I(service_template), I(managed_device), I(deployment).
+ - Supported for I(gather_subset) keys C(service_template), C(managed_device), C(deployment), C(firmware_repository).
type: int
default: 50
offset:
description:
- Pagination offset.
- - Supported for gather_subset keys I(service_template), I(managed_device), I(deployment).
+ - Supported for I(gather_subset) keys C(service_template), C(managed_device), C(deployment), C(firmware_repository).
type: int
default: 0
sort:
description:
- Sort the returned components based on specified field.
- - Supported for gather_subset keys I(service_template), I(managed_device), I(deployment).
- - The supported sort keys for the gather_subset can be referred from PowerFlex Manager API documentation in developer.dell.com.
+ - Supported for I(gather_subset) keys C(service_template), C(managed_device), C(deployment), C(firmware_repository).
+ - The supported sort keys for the I(gather_subset) can be referred from PowerFlex Manager API documentation in U(https://developer.dell.com).
type: str
include_devices:
description:
- Include devices in response.
- - Applicable when gather_subset is I(deployment).
+ - Applicable when I(gather_subset) is C(deployment).
type: bool
default: true
include_template:
description:
- Include service templates in response.
- - Applicable when gather_subset is I(deployment).
+ - Applicable when I(gather_subset) is C(deployment).
type: bool
default: true
full:
description:
- Specify if response is full or brief.
- - Applicable when gather_subset is I(deployment), I(service_template).
- - For I(deployment) specify to use full templates including resources in response.
+ - Applicable when I(gather_subset) is C(deployment), C(service_template).
+ - For C(deployment) specify to use full templates including resources in response.
type: bool
default: false
include_attachments:
description:
- Include attachments.
- - Applicable when gather_subset is I(service_template).
+ - Applicable when I(gather_subset) is C(service_template).
type: bool
default: true
+ include_related:
+ description:
+ - Include related entities.
+ - Applicable when I(gather_subset) is C(firmware_repository).
+ type: bool
+ default: false
+ version_added: 2.3.0
+ include_bundles:
+ description:
+ - Include software bundle entities.
+ - Applicable when I(gather_subset) is C(firmware_repository).
+ type: bool
+ default: false
+ version_added: 2.3.0
+ include_components:
+ description:
+ - Include software component entities.
+ - Applicable when I(gather_subset) is C(firmware_repository).
+ type: bool
+ default: false
+ version_added: 2.3.0
notes:
- The I(check_mode) is supported.
- - The supported filter keys for the gather_subset can be referred from PowerFlex Manager API documentation in developer.dell.com.
+ - The supported filter keys for the I(gather_subset) can be referred from PowerFlex Manager API documentation in U(https://developer.dell.com).
- The I(filter), I(sort), I(limit) and I(offset) options will be ignored when more than one I(gather_subset) is specified along with
- I(service_template), I(managed_device) or I(deployment).
+ C(service_template), C(managed_device), C(deployment) or C(firmware_repository).
'''
EXAMPLES = r'''
- name: Get detailed list of PowerFlex entities
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- vol
- storage_pool
@@ -151,10 +175,10 @@ EXAMPLES = r'''
- name: Get a subset list of PowerFlex volumes
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- vol
filters:
@@ -164,10 +188,10 @@ EXAMPLES = r'''
- name: Get deployment and resource provisioning info
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- managed_device
- deployment
@@ -175,10 +199,10 @@ EXAMPLES = r'''
- name: Get deployment with filter, sort, pagination
dellemc.powerflex.info:
- hostname: "{{hostname}}"
- username: "{{username}}"
- password: "{{password}}"
- validate_certs: "{{validate_certs}}"
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
gather_subset:
- deployment
filters:
@@ -190,6 +214,60 @@ EXAMPLES = r'''
offset: 10
include_devices: true
include_template: true
+
+- name: Get the list of firmware repository.
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+
+- name: Get the list of firmware repository
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+ include_related: true
+ include_bundles: true
+ include_components: true
+
+- name: Get the list of firmware repository with filter
+ dellemc.powerflex.info:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ gather_subset:
+ - firmware_repository
+ filters:
+ - filter_key: "createdBy"
+ filter_operator: "equal"
+ filter_value: "admin"
+ sort: createdDate
+ limit: 10
+ include_related: true
+ include_bundles: true
+ include_components: true
+ register: result_repository_out
+
+- name: Get the list of available firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository | selectattr('state', 'equalto', 'available') }}"
+
+- name: Get the list of software components in the firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository |
+ selectattr('id', 'equalto', '8aaa80788b7') | map(attribute='softwareComponents') | flatten }}"
+
+- name: Get the list of software bundles in the firmware repository
+ ansible.builtin.debug:
+ msg: "{{ result_repository_out.FirmwareRepository |
+ selectattr('id', 'equalto', '8aaa80788b7') | map(attribute='softwareBundles') | flatten }}"
'''
RETURN = r'''
@@ -1763,6 +1841,67 @@ ServiceTemplates:
],
"blockServiceOperationsMap": {}
}]
+FirmwareRepository:
+ description: Details of all firmware repository.
+ returned: when I(gather_subset) is C(firmware_repository)
+ type: list
+ contains:
+ id:
+ description: ID of the firmware repository.
+ type: str
+ name:
+ description: Name of the firmware repository.
+ type: str
+ sourceLocation:
+ description: Source location of the firmware repository.
+ type: str
+ state:
+ description: State of the firmware repository.
+ type: str
+ softwareComponents:
+ description: Software components of the firmware repository.
+ type: list
+ softwareBundles:
+ description: Software bundles of the firmware repository.
+ type: list
+ deployments:
+ description: Deployments of the firmware repository.
+ type: list
+ sample: [{
+ "id": "8aaa03a78de4b2a5018de662818d000b",
+ "name": "https://192.168.0.1/artifactory/path/pfxmlogs-bvt-pfmp-swo-upgrade-402-to-451-56.tar.gz",
+ "sourceLocation": "https://192.168.0.2/artifactory/path/pfxmlogs-bvt-pfmp-swo-upgrade-402-to-451-56.tar.gz",
+ "sourceType": null,
+ "diskLocation": "",
+ "filename": "",
+ "md5Hash": null,
+ "username": "",
+ "password": "",
+ "downloadStatus": "error",
+ "createdDate": "2024-02-26T17:07:11.884+00:00",
+ "createdBy": "admin",
+ "updatedDate": "2024-03-01T06:21:10.917+00:00",
+ "updatedBy": "system",
+ "defaultCatalog": false,
+ "embedded": false,
+ "state": "errors",
+ "softwareComponents": [],
+ "softwareBundles": [],
+ "deployments": [],
+ "bundleCount": 0,
+ "componentCount": 0,
+ "userBundleCount": 0,
+ "minimal": true,
+ "downloadProgress": 100,
+ "extractProgress": 0,
+ "fileSizeInGigabytes": 0.0,
+ "signedKeySourceLocation": null,
+ "signature": "Unknown",
+ "custom": false,
+ "needsAttention": false,
+ "jobId": "Job-10d75a23-d801-4fdb-a2d0-7f6389ab75cf",
+ "rcmapproved": false
+ }]
'''
from ansible.module_utils.basic import AnsibleModule
@@ -2126,6 +2265,25 @@ class PowerFlexInfo(object):
msg = f'Get deployments from PowerFlex Manager failed with error {str(e)}'
return self.handle_error_exit(msg)
+ def get_pagination_params(self):
+ """ Get the pagination parameters """
+ return {'limit': self.get_param_value('limit'), 'offset': self.get_param_value('offset'),
+ 'sort': self.get_param_value('sort'), 'filters': self.populate_filter_list()}
+
+ def get_firmware_repository_list(self):
+ """ Get the list of firmware repository on a given PowerFlex Manager system """
+ try:
+ LOG.info('Getting firmware repository list ')
+ firmware_repository = self.powerflex_conn.firmware_repository.get(
+ **self.get_pagination_params(),
+ related=self.get_param_value('include_related'),
+ bundles=self.get_param_value('include_bundles'),
+ components=self.get_param_value('include_components'))
+ return firmware_repository
+ except Exception as e:
+ msg = f'Get firmware repository from PowerFlex Manager failed with error {str(e)}'
+ return self.handle_error_exit(msg)
+
def get_service_templates_list(self):
""" Get the list of service templates on a given PowerFlex Manager system """
try:
@@ -2246,6 +2404,7 @@ class PowerFlexInfo(object):
service_template = []
managed_device = []
deployment = []
+ firmware_repository = []
subset = self.module.params['gather_subset']
self.validate_subset(api_version, subset)
@@ -2276,6 +2435,8 @@ class PowerFlexInfo(object):
service_template = self.get_service_templates_list()
if 'deployment' in subset:
deployment = self.get_deployments_list()
+ if 'firmware_repository' in subset:
+ firmware_repository = self.get_firmware_repository_list()
self.module.exit_json(
Array_Details=array_details,
@@ -2292,7 +2453,8 @@ class PowerFlexInfo(object):
Fault_Sets=fault_sets,
ManagedDevices=managed_device,
ServiceTemplates=service_template,
- Deployments=deployment
+ Deployments=deployment,
+ FirmwareRepository=firmware_repository
)
@@ -2319,7 +2481,7 @@ def get_powerflex_info_parameters():
choices=['vol', 'storage_pool',
'protection_domain', 'sdc', 'sds', 'snapshot_policy',
'device', 'rcg', 'replication_pair', 'fault_set',
- 'service_template', 'managed_device', 'deployment']),
+ 'service_template', 'managed_device', 'deployment', 'firmware_repository']),
filters=dict(type='list', required=False, elements='dict',
options=dict(filter_key=dict(type='str', required=True, no_log=False),
filter_operator=dict(
@@ -2333,7 +2495,10 @@ def get_powerflex_info_parameters():
include_devices=dict(type='bool', default=True),
include_template=dict(type='bool', default=True),
full=dict(type='bool', default=False),
- include_attachments=dict(type='bool', default=True)
+ include_attachments=dict(type='bool', default=True),
+ include_related=dict(type='bool', default=False),
+ include_bundles=dict(type='bool', default=False),
+ include_components=dict(type='bool', default=False),
)
diff --git a/ansible_collections/dellemc/powerflex/plugins/modules/resource_group.py b/ansible_collections/dellemc/powerflex/plugins/modules/resource_group.py
new file mode 100644
index 000000000..768d0c973
--- /dev/null
+++ b/ansible_collections/dellemc/powerflex/plugins/modules/resource_group.py
@@ -0,0 +1,631 @@
+#!/usr/bin/python
+
+# Copyright: (c) 2024, Dell Technologies
+# Apache License version 2.0 (see MODULE-LICENSE or http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+""" Ansible module for managing resource group deployments on Dell Technologies (Dell) PowerFlex"""
+from __future__ import (absolute_import, division, print_function)
+
+__metaclass__ = type
+
+DOCUMENTATION = r'''
+module: resource_group
+version_added: '2.3.0'
+short_description: Manage resource group deployments on Dell PowerFlex.
+description:
+- Managing resource group deployments on PowerFlex storage system includes deploying,
+ editing, adding nodes and deleting a resource group deployment.
+author:
+- Jennifer John (@johnj9) <ansible.team@dell.com>
+- Trisha Datta (@trisha-dell) <ansible.team@dell.com>
+extends_documentation_fragment:
+ - dellemc.powerflex.powerflex
+options:
+ resource_group_name:
+ description:
+ - The name of the resource group.
+ - This is a required field to deploy a resource group.
+ - Either I(resource_group_id) or I(resource_group_name) must be specified to perform resource group operations.
+ - Mutually exclusive with I(resource_group_id).
+ type: str
+ resource_group_id:
+ description:
+ - The ID of the resource group.
+ - Either I(resource_group_id) or I(resource_group_name) must be specified to perform resource group operations.
+ - Mutually exclusive with I(resource_group_name).
+ type: str
+ template_name:
+ description:
+ - The name of the published template.
+ - Either I(template_id) or I(template_name) must be specified to deploy a resource group.
+ - Mutually exclusive with I(template_id).
+ type: str
+ template_id:
+ description:
+ - The ID of the published template.
+ - Either I(template_id) or I(template_name) must be specified to deploy a resource group.
+ - Mutually exclusive with I(template_name).
+ type: str
+ firmware_repository_id:
+ description:
+ - The ID of the firmware repository if not using the appliance default catalog.
+ - Mutually exclusive with I(firmware_repository_name).
+ type: str
+ firmware_repository_name:
+ description:
+ - The name of the firmware repository if not using the appliance default catalog.
+ - Mutually exclusive with I(firmware_repository_id).
+ type: str
+ new_resource_group_name:
+ description:
+ - New name of the resource group to rename to.
+ type: str
+ description:
+ description:
+ - The description of the resource group.
+ type: str
+ scaleup:
+ description:
+ - Whether to scale up the resource group. Specify as true to add nodes to the resource group.
+ type: bool
+ default: false
+ clone_node:
+ description:
+ - Resource to duplicate during scaleup, if more than one nodes are available in the resource group.
+ type: str
+ node_count:
+ description:
+ - Number of nodes to clone during scaleup.
+ type: int
+ default: 1
+ validate:
+ description:
+ - Specify as true to validate the deployment of resource group.
+ type: bool
+ default: false
+ schedule_date:
+ description:
+ - Scheduled date for the resource group deployment.
+ - Specify in YYYY-MM-DD HH:MM:SS.sss or YYYY-MM-DD format.
+ type: str
+ state:
+ description:
+ - The state of the resource group.
+ type: str
+ choices: ['absent', 'present']
+ default: 'present'
+notes:
+- The I(check_mode) is supported.
+- Resource group scale up can be done only when deployment is complete.
+'''
+
+EXAMPLES = r'''
+- name: Validate deployment of a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ port: "{{ port }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ description: ans_rg
+ template_id: c65d0172-8666-48ab-935e-9a0bf69ed66d
+ firmware_repository_id: 8aaa80788b5755d1018b576126d51ba3
+ validate: true
+
+- name: Deploy a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ port: "{{ port }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ description: ans_rg
+ template_id: c65d0172-8666-48ab-935e-9a0bf69ed66d
+ firmware_repository_id: 8aaa80788b5755d1018b576126d51ba3
+
+- name: Add a node to a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ scaleup: true
+ clone_node: "{{ node_1 }}"
+ node_count: "{{ node_count }}"
+
+- name: Modify a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ resource_group_name: "{{ resource_group_name_1 }}"
+ new_resource_group_name: "{{ new_resource_group_name }}"
+ description: "description new"
+
+- name: Delete a resource group
+ dellemc.powerflex.resource_group:
+ hostname: "{{ hostname }}"
+ username: "{{ username }}"
+ password: "{{ password }}"
+ validate_certs: "{{ validate_certs }}"
+ port: "{{ port }}"
+ resource_group_name: ans_rg
+ state: "absent"
+'''
+
+RETURN = r'''
+changed:
+ description: Whether or not the resource has changed.
+ returned: always
+ type: bool
+ sample: 'false'
+resource_group_details:
+ description: Details of the resource group deployment.
+ returned: When resource group exists.
+ type: dict
+ contains:
+ id:
+ description: The ID of the deployed resource group.
+ type: str
+ deploymentName:
+ description: The name of the resource group deployment.
+ type: str
+ deploymentDescription:
+ description: The description of the resource group deployment.
+ type: str
+ serviceTemplate:
+ description: The service template of the resource group.
+ type: dict
+ contains:
+ id:
+ description: The ID of the service template.
+ type: str
+ templateName:
+ description: The name of the service template.
+ type: str
+ status:
+ description: The status of the deployment of the resource group.
+ type: str
+ firmwareRepositoryId:
+ description: The ID of the firmware repository of the resource group.
+ type: str
+ sample: {
+ "id": "8aaa03a88de961fa018de96a88d80008",
+ "deploymentName": "dep-ans-test-rg1",
+ "deploymentDescription": "ans test rg",
+ "retry": true,
+ "teardown": false,
+ "serviceTemplate": {
+ "id": "8aaa03a88de961fa018de96a88d80008",
+ "templateName": "update-template (8aaa03a88de961fa018de96a88d80008)"
+ },
+ "scheduleDate": null,
+ "status": "error",
+ "compliant": true,
+ "deploymentDevice": [
+ {
+ "refId": "scaleio-block-legacy-gateway",
+ "refType": "SCALEIO",
+ "deviceHealth": "GREEN",
+ "compliantState": "COMPLIANT",
+ "deviceType": "scaleio",
+ "currentIpAddress": "1.3.9.2",
+ "componentId": "910bf934-d45a-4fe3-8ea2-dc481e063a81",
+ "statusMessage": "The processing of PowerFlex is unsuccessful.",
+ "model": "PowerFlex Gateway",
+ "brownfield": false
+ }
+ ],
+ "updateServerFirmware": true,
+ "useDefaultCatalog": true,
+ "firmwareRepository": {
+ "id": "8aaa80788b5755d1018b576126d51ba3",
+ "name": "PowerFlex 4.5.0.0",
+ "rcmapproved": false
+ },
+ "firmwareRepositoryId": "8aaa80788b5755d1018b576126d51ba3",
+ "deploymentHealthStatusType": "red",
+ "allUsersAllowed": false,
+ "owner": "admin",
+ "numberOfDeployments": 0,
+ "lifecycleMode": false,
+ "vds": false,
+ "scaleUp": false,
+ "brownfield": false,
+ "templateValid": true,
+ "configurationChange": false
+ }
+'''
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.dellemc.powerflex.plugins.module_utils.storage.dell \
+ import utils
+import json
+import copy
+
+LOG = utils.get_logger('resource_group')
+
+
+class PowerFlexResourceGroup:
+ def __init__(self):
+ """ Define all parameters required by this module"""
+ self.module_params = utils.get_powerflex_gateway_host_parameters()
+ self.module_params.update(get_powerflex_resource_group_parameters())
+ mut_ex_args = [['resource_group_name', 'resource_group_id'],
+ ['template_name', 'template_id'],
+ ['firmware_repository_id', 'firmware_repository_name']]
+
+ required_one_of_args = [['resource_group_name', 'resource_group_id']]
+
+ # initialize the Ansible module
+ self.module = AnsibleModule(
+ argument_spec=self.module_params,
+ mutually_exclusive=mut_ex_args,
+ required_one_of=required_one_of_args,
+ supports_check_mode=True)
+
+ utils.ensure_required_libs(self.module)
+
+ try:
+ self.powerflex_conn = utils.get_powerflex_gateway_host_connection(
+ self.module.params)
+ LOG.info("Got the PowerFlex system connection object instance")
+ except Exception as e:
+ LOG.error(str(e))
+ self.module.fail_json(msg=str(e))
+
+ def get_service_template(self, template_id=None, template_name=None, for_deployment=True):
+ """
+ Retrieves a service template based on the provided parameters.
+
+ Args:
+ template_id (str, optional): The ID of the service template. Defaults to None.
+ template_name (str, optional): The name of the service template. Defaults to None.
+ for_deployment (bool, optional): Indicates whether the template is for deployment. Defaults to True.
+
+ Returns:
+ ServiceTemplate: The retrieved service template.
+
+ Raises:
+ AnsibleFailJson: If either `template_id` or `template_name` is not specified for resource group deployment.
+ AnsibleFailJson: If the service template with the specified `template_name` is not found.
+ AnsibleFailJson: If the service template with the specified `template_id` is not found.
+ """
+ if not (template_id or template_name):
+ self.module.fail_json(msg="Either template_id or template_name must be specified for resource group deployment")
+ if template_name:
+ filter_query = utils.get_filter(template_name)
+ template = self.powerflex_conn.service_template.get(filters=[filter_query])
+ if not template:
+ error_msg = f"Service template {template_name} is not found"
+ self.module.fail_json(msg=error_msg)
+
+ template_id = template_id or template[0]['id']
+ return self.powerflex_conn.service_template.get_by_id(template_id, for_deployment)
+
+ def get_firmware_repo(self, firmware_repo_id=None, firmware_repo_name=None):
+ """
+ Retrieves the firmware repository ID based on the provided firmware repository name or ID.
+
+ Args:
+ firmware_repo_id (str, optional): The ID of the firmware repository. Defaults to None.
+ firmware_repo_name (str, optional): The name of the firmware repository. Defaults to None.
+
+ Returns:
+ str: The ID of the firmware repository.
+
+ Raises:
+ ValueError: If the firmware repository is not found.
+ """
+ firmware_repos = self.powerflex_conn.firmware_repository.get()
+ if firmware_repo_id:
+ firmware_repo = next((repo for repo in firmware_repos if repo.get('id') == firmware_repo_id), None)
+ else:
+ firmware_repo = next((repo for repo in firmware_repos if repo.get('name') == firmware_repo_name), None)
+ if not firmware_repo:
+ self.module.fail_json(msg=f"Firmware repository {firmware_repo_id or firmware_repo_name} is not found")
+ return firmware_repo['id']
+
+ def get_resource_group_name(self):
+ """ Retrieves the name of the resource group. """
+ resource_group_name = self.module.params['resource_group_name']
+ if not resource_group_name:
+ self.module.fail_json(msg="Specify resource_group_name for resource group deployment.")
+ return resource_group_name
+
+ def is_modify_needed(self, deployment_data):
+
+ modify_dict = False
+ if self.module.params["new_resource_group_name"] is not None and \
+ deployment_data["deploymentName"] != self.module.params["new_resource_group_name"]:
+ modify_dict = True
+ if self.module.params["description"] is not None and \
+ deployment_data["deploymentDescription"] != self.module.params["description"]:
+ modify_dict = True
+ if self.module.params["scaleup"]:
+ modify_dict = True
+
+ return modify_dict
+
+ def clone_component(self, deploy_data):
+ new_component = None
+ count_server = 0
+ server_name = []
+ for component in range(len(deploy_data["serviceTemplate"]["components"])):
+ if deploy_data["serviceTemplate"]["components"][component]["type"] == "SERVER":
+ count_server = count_server + 1
+ server_name.append(deploy_data["serviceTemplate"]["components"][component]["name"])
+ for component in range(len(deploy_data["serviceTemplate"]["components"])):
+ if self.module.params["clone_node"] is None:
+ if count_server == 1 and deploy_data["serviceTemplate"]["components"][component]["name"] == server_name[0]:
+ new_component = deploy_data["serviceTemplate"]["components"][component]
+ elif count_server != 1:
+ self.module.fail_json(msg="More than 1 server components exist. Provide the clone_node.")
+ else:
+ if deploy_data["serviceTemplate"]["components"][component]["name"] == self.module.params["clone_node"]:
+ new_component = deploy_data["serviceTemplate"]["components"][component]
+
+ return new_component
+
+ def prepare_add_node_payload(self, deploy_data):
+
+ new_component = self.clone_component(deploy_data=deploy_data)
+ if new_component is not None:
+ uuid = utils.random_uuid_generation()
+ new_component.update({
+ "identifier": None,
+ "asmGUID": None,
+ "puppetCertName": None,
+ "osPuppetCertName": None,
+ "managementIpAddress": None,
+ "brownfield": False,
+ "id": uuid,
+ "name": uuid})
+ resource_params = ["razor_image", "scaleio_enabled", "scaleio_role",
+ "compression_enabled", "replication_enabled"]
+
+ for resource in range(len(new_component["resources"])):
+ if new_component["resources"][resource]["id"] == "asm::server":
+ for param in range(len(new_component["resources"][resource]["parameters"])):
+ if new_component["resources"][resource]["parameters"][param]["id"] \
+ not in resource_params:
+ new_component["resources"][resource]["parameters"][param]["guid"] = None
+ new_component["resources"][resource]["parameters"][param]["value"] = None
+ return new_component
+
+ def modify_resource_group_details(self, deployment_data):
+ new_deployment_data = copy.deepcopy(deployment_data)
+
+ # edit resource group
+
+ if self.module.params["new_resource_group_name"]:
+ new_deployment_data["deploymentName"] = self.module.params["new_resource_group_name"]
+ if self.module.params["description"]:
+ new_deployment_data["deploymentDescription"] = self.module.params["description"]
+
+ # Add nodes
+
+ if self.module.params["scaleup"]:
+ new_deployment_data["scaleup"] = True
+ new_deployment_data["retry"] = True
+ node = 0
+ while node < self.module.params["node_count"]:
+ new_deployment_data1 = copy.deepcopy(deployment_data)
+ new_component = self.prepare_add_node_payload(deploy_data=new_deployment_data1)
+ if new_component:
+ new_deployment_data["serviceTemplate"]["components"].append(new_component)
+ node = node + 1
+
+ try:
+ if not self.module.check_mode:
+ self.powerflex_conn.deployment.edit(deployment_id=deployment_data["id"],
+ rg_data=new_deployment_data)
+
+ except Exception as e:
+ errmsg = f'Modifying a resource group deployment failed with error {utils.get_display_message(str(e))}'
+ self.module.fail_json(msg=errmsg)
+
+ def get_deployment_data(self):
+ """
+ Retrieves deployment data based on the provided parameters.
+
+ :return: A JSON string representing the deployment data.
+ """
+ template_id = self.module.params['template_id']
+ template_name = self.module.params['template_name']
+ resource_group_name = self.get_resource_group_name()
+ description = self.module.params['description']
+ firmware_repo_id = self.module.params['firmware_repository_id']
+ firmware_repo_name = self.module.params['firmware_repository_name']
+ schedule_date = self.module.params['schedule_date']
+ service_template = self.get_service_template(template_id, template_name, for_deployment=True)
+ deployment_data = {
+ "deploymentName": resource_group_name,
+ "deploymentDescription": description,
+ "serviceTemplate": service_template,
+ "updateServerFirmware": True,
+ "useDefaultCatalog": True
+ }
+
+ if firmware_repo_id or firmware_repo_name:
+ firmware_repository_id = self.get_firmware_repo(firmware_repo_id, firmware_repo_name)
+ deployment_data["firmwareRepositoryId"] = firmware_repository_id
+ deployment_data["useDefaultCatalog"] = False
+ if schedule_date:
+ if not utils.validate_date(schedule_date):
+ self.module.fail_json(msg="Invalid schedule_date format. Specify the date in the format 'YYYY-MM-DDTHH:MM:SS.sss'")
+ deployment_data["scheduleDate"] = schedule_date
+
+ return json.dumps(deployment_data)
+
+ def get_deployment_details(self, deployment_name=None, deployment_id=None):
+ """
+ Retrieves deployment details based on the provided deployment name or deployment ID.
+
+ Args:
+ deployment_name (str, optional): The name of the deployment. Defaults to None.
+ deployment_id (str, optional): The ID of the deployment. Defaults to None.
+
+ Returns:
+ list: A list of deployment details if the deployment name is provided and a matching deployment is found.
+ None: if the deployment ID is provided and no deployment is found with that ID.
+ """
+ try:
+ if deployment_name:
+ filter_query = utils.get_filter(deployment_name)
+ resp = self.powerflex_conn.deployment.get(filters=[filter_query])
+ if len(resp) > 0:
+ deployment_id = resp[0]["id"]
+ else:
+ return None
+ return self.powerflex_conn.deployment.get_by_id(deployment_id)
+
+ except Exception as e:
+ if hasattr(e, 'status') and str(e.status) == '404':
+ return None
+ else:
+ self.module.fail_json(msg=utils.get_display_message(str(e)))
+
+ def get_operation_mapping(self):
+ """
+ Get the operation mapping based on the deployment details and module parameters.
+
+ :return: The operation mapping for the given state, validate, and check_mode.
+ """
+ if not self.deployment_details:
+ operation_mapping = {
+ ('present', True, True): ValidateDeploy,
+ ('present', True, False): ValidateDeploy,
+ ('present', False, True): ValidateDeploy,
+ ('present', False, False): Deploy
+ }
+ else:
+ operation_mapping = {
+ ('absent', True, True): DeleteDeploy,
+ ('absent', True, False): DeleteDeploy,
+ ('absent', False, True): DeleteDeploy,
+ ('absent', False, False): DeleteDeploy,
+ ('present', True, True): ModifyResourceGroup,
+ ('present', True, False): ModifyResourceGroup,
+ ('present', False, True): ModifyResourceGroup,
+ ('present', False, False): ModifyResourceGroup
+ }
+
+ state = self.module.params['state']
+ validate = self.module.params['validate']
+ check_mode = self.module.check_mode
+
+ return operation_mapping.get((state, validate, check_mode))
+
+ def perform_module_operation(self):
+ """
+ Perform the module operation.
+
+ :return: A dictionary containing the result of the module operation.
+ """
+ result = dict(
+ changed=False,
+ resource_group_details=[]
+ )
+
+ self.deployment_details = self.get_deployment_details(
+ deployment_name=self.module.params['resource_group_name'],
+ deployment_id=self.module.params['resource_group_id'])
+ resource_group_operation = self.get_operation_mapping()
+ if resource_group_operation:
+ changed, resource_group_details = resource_group_operation.execute(self)
+ result['resource_group_details'] = resource_group_details
+ result['changed'] = changed
+
+ self.module.exit_json(**result)
+
+
+class Deploy:
+ def execute(self):
+ try:
+ rg_data = self.get_deployment_data()
+ response = self.powerflex_conn.deployment.create(rg_data)
+ return True, response
+ except Exception as e:
+ errmsg = f'Deploying a resource group failed with error {utils.get_display_message(str(e))}'
+ self.module.fail_json(msg=errmsg)
+
+
+class ValidateDeploy:
+ def execute(self):
+ try:
+ rg_data = self.get_deployment_data()
+ response = self.powerflex_conn.deployment.validate(rg_data)
+ return False, response
+ except Exception as e:
+ errmsg = f'Validating a resource group deployment failed with error {utils.get_display_message(str(e))}'
+ self.module.fail_json(msg=errmsg)
+
+
+class ModifyResourceGroup:
+ def execute(self):
+ try:
+ changed = False
+ rg_data = self.deployment_details
+ if self.is_modify_needed(deployment_data=rg_data):
+ self.modify_resource_group_details(deployment_data=rg_data)
+ changed = True
+
+ response = self.get_deployment_details(deployment_id=rg_data['id'])
+ return changed, response
+ except Exception as e:
+ errmsg = f'Editing a resource group failed with error {utils.get_display_message(str(e))}'
+ self.module.fail_json(msg=errmsg)
+
+
+class DeleteDeploy:
+ def execute(self):
+ try:
+ changed = False
+ if self.deployment_details:
+ if not self.module.check_mode:
+ self.powerflex_conn.deployment.delete(self.deployment_details['id'])
+ self.deployment_details = \
+ self.get_deployment_details(deployment_name=self.deployment_details['deploymentName'])
+ changed = True
+ return changed, self.deployment_details
+ except Exception as e:
+ errmsg = f'Deleting a resource group deployment failed with error {utils.get_display_message(str(e))}'
+ self.module.fail_json(msg=errmsg)
+
+
+def main():
+ """ Create PowerFlex resource group object and perform actions on it
+ based on user input from playbook"""
+ obj = PowerFlexResourceGroup()
+ obj.perform_module_operation()
+
+
+def get_powerflex_resource_group_parameters():
+ """This method provides parameters required for the resource group
+ module on PowerFlex"""
+ return dict(
+ resource_group_name=dict(),
+ resource_group_id=dict(),
+ template_name=dict(),
+ template_id=dict(),
+ firmware_repository_id=dict(),
+ firmware_repository_name=dict(),
+ new_resource_group_name=dict(),
+ description=dict(),
+ scaleup=dict(type='bool', default=False),
+ clone_node=dict(),
+ node_count=dict(type='int', default=1),
+ validate=dict(type='bool', default=False),
+ schedule_date=dict(),
+ state=dict(choices=['present', 'absent'], default='present')
+ )
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.14.txt b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.14.txt
index cb6ef4675..571402121 100644
--- a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.14.txt
+++ b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.14.txt
@@ -40,3 +40,6 @@ plugins/modules/replication_consistency_group.py import-2.7
plugins/modules/replication_consistency_group.py import-3.5
plugins/modules/replication_consistency_group.py compile-2.7
plugins/modules/replication_consistency_group.py compile-3.5
+plugins/modules/resource_group.py validate-modules:missing-gplv3-license
+plugins/modules/resource_group.py compile-2.7
+plugins/modules/resource_group.py import-2.7
diff --git a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.15.txt b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.15.txt
index cb6ef4675..571402121 100644
--- a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.15.txt
+++ b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.15.txt
@@ -40,3 +40,6 @@ plugins/modules/replication_consistency_group.py import-2.7
plugins/modules/replication_consistency_group.py import-3.5
plugins/modules/replication_consistency_group.py compile-2.7
plugins/modules/replication_consistency_group.py compile-3.5
+plugins/modules/resource_group.py validate-modules:missing-gplv3-license
+plugins/modules/resource_group.py compile-2.7
+plugins/modules/resource_group.py import-2.7
diff --git a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.16.txt b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.16.txt
index 531796f6c..0dbde689c 100644
--- a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.16.txt
+++ b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.16.txt
@@ -26,3 +26,6 @@ plugins/modules/replication_consistency_group.py import-2.7
plugins/modules/replication_consistency_group.py compile-2.7
plugins/modules/info.py compile-2.7
plugins/modules/info.py import-2.7
+plugins/modules/resource_group.py validate-modules:missing-gplv3-license
+plugins/modules/resource_group.py compile-2.7
+plugins/modules/resource_group.py import-2.7
diff --git a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.17.txt b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.17.txt
index 54067647b..a464e7b26 100644
--- a/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.17.txt
+++ b/ansible_collections/dellemc/powerflex/tests/sanity/ignore-2.17.txt
@@ -11,3 +11,4 @@ plugins/modules/replication_consistency_group.py validate-modules:missing-gplv3-
plugins/modules/replication_pair.py validate-modules:missing-gplv3-license
plugins/modules/snapshot_policy.py validate-modules:missing-gplv3-license
plugins/modules/fault_set.py validate-modules:missing-gplv3-license
+plugins/modules/resource_group.py validate-modules:missing-gplv3-license
diff --git a/ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_info_api.py b/ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_info_api.py
index 20de1c1c9..2682cbdd5 100644
--- a/ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_info_api.py
+++ b/ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_info_api.py
@@ -319,7 +319,8 @@ class MockInfoApi:
'system_exception': "Get array details from Powerflex array failed with error",
'managed_device_get_error': "Get managed devices from PowerFlex Manager failed with error",
'service_template_get_error': "Get service templates from PowerFlex Manager failed with error",
- 'deployment_get_error': "Get deployments from PowerFlex Manager failed with error"
+ 'deployment_get_error': "Get deployments from PowerFlex Manager failed with error",
+ 'firmware_repository_get_error': "Get firmware repository from PowerFlex Manager failed with error"
}
@staticmethod
diff --git a/ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_resource_group_api.py b/ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_resource_group_api.py
new file mode 100644
index 000000000..228443449
--- /dev/null
+++ b/ansible_collections/dellemc/powerflex/tests/unit/plugins/module_utils/mock_resource_group_api.py
@@ -0,0 +1,162 @@
+# Copyright: (c) 2024, Dell Technologies
+
+# Apache License version 2.0 (see MODULE-LICENSE or http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+"""Mock ApiException for Dell Technologies (Dell) PowerFlex Test modules"""
+
+from __future__ import (absolute_import, division, print_function)
+
+__metaclass__ = type
+
+
+class MockResourceResourceGroupAPI:
+
+ RG_COMMON_ARGS = {
+ "hostname": "**.***.**.***",
+ "username": "username",
+ "password": "password",
+ "validate_certs": False,
+ "port": "443",
+ "validate": False,
+ "template_name": None,
+ "template_id": None,
+ "firmware_repository_name": None,
+ "firmware_repository_id": None,
+ "resource_group_name": None,
+ "resource_group_id": None,
+ "schedule_date": None
+ }
+
+ RG_RESPONSE = [{
+ "id": "8aaa03a88de961fa018de96a88d80008",
+ "deploymentName": "ans_rg",
+ "deploymentDescription": "ans test rg",
+ "retry": True,
+ "teardown": False,
+ "serviceTemplate": {
+ "id": "8aaa03a88de961fa018de96a88d80008",
+ "templateName": "update-template (8aaa03a88de961fa018de96a88d80008)",
+ "components": [
+ {
+ "id": "a7dafed9-96f2-4a55-9518-57af4f45686e",
+ "componentID": "component-scaleio-gateway-1",
+ "identifier": None,
+ "componentValid": {
+ "valid": True,
+ "messages": []
+ },
+ "puppetCertName": "scaleio-block-legacy-gateway",
+ "osPuppetCertName": None,
+ "name": "block-legacy-gateway",
+ "type": "SERVER",
+ "subType": "COMPUTEONLY",
+ "teardown": False,
+ "helpText": None,
+ "managementIpAddress": None,
+ "configFile": None,
+ "serialNumber": None,
+ "asmGUID": "scaleio-block-legacy-gateway",
+ "relatedComponents": {
+ "fc0f8f08-18c7-4fa8-bae8-67f3e6f9ccd6": "Node (Software Only)"
+ },
+ "resources": [{
+ "id": "asm::server",
+ "parameters": [{
+ "id": "a7dafed9",
+ "guid": None,
+ "value": None}]}],
+ "refId": None,
+ "cloned": False,
+ "clonedFromId": None,
+ "manageFirmware": False,
+ "brownfield": False,
+ "instances": 1,
+ "clonedFromAsmGuid": None,
+ "ip": None
+ }]
+ },
+ "scheduleDate": None,
+ "status": "error",
+ "compliant": True,
+ "deploymentDevice": [{
+ "refId": "scaleio-block-legacy-gateway",
+ "refType": "SCALEIO",
+ "deviceHealth": "GREEN",
+ "compliantState": "COMPLIANT",
+ "deviceType": "scaleio",
+ "currentIpAddress": "1.3.9.2",
+ "componentId": "910bf934-d45a-4fe3-8ea2-dc481e063a81",
+ "statusMessage": "The processing of PowerFlex is unsuccessful.",
+ "model": "PowerFlex Gateway",
+ "brownfield": False}],
+ "updateServerFirmware": True,
+ "useDefaultCatalog": True,
+ "firmwareRepository": {
+ "id": "8aaa80788b5755d1018b576126d51ba3",
+ "name": "PowerFlex 4.5.0.0",
+ "rcmapproved": False},
+ "firmwareRepositoryId": "8aaa80788b5755d1018b576126d51ba3",
+ "deploymentHealthStatusType": "red",
+ "allUsersAllowed": False,
+ "owner": "admin",
+ "numberOfDeployments": 0,
+ "lifecycleMode": False,
+ "vds": False,
+ "scaleUp": False,
+ "brownfield": False,
+ "templateValid": True,
+ "configurationChange": False}]
+
+ RG_FIRMWARE_REPO = [{
+ "id": "8aaa80788b5755d1018b576126d51ba3",
+ "name": "firmware-name",
+ "sourceLocation": "https://100.65.27.72/artifactory/path/pfxmlogs-bvt-pfmp-swo-upgrade-402-to-451-56.tar.gz",
+ "sourceType": None,
+ "diskLocation": "",
+ "filename": "",
+ "md5Hash": None,
+ "username": "",
+ "password": "",
+ "downloadStatus": "error",
+ "createdDate": "2024-02-26T17:07:11.884+00:00",
+ "createdBy": "admin",
+ "updatedDate": "2024-03-01T06:21:10.917+00:00",
+ "updatedBy": "system",
+ "defaultCatalog": False,
+ "embedded": False,
+ "state": "errors",
+ "softwareComponents": [],
+ "softwareBundles": [],
+ "deployments": [],
+ "bundleCount": 0,
+ "componentCount": 0,
+ "userBundleCount": 0,
+ "minimal": True,
+ "downloadProgress": 100,
+ "extractProgress": 0,
+ "fileSizeInGigabytes": 0.0,
+ "signedKeySourceLocation": None,
+ "signature": "Unknown",
+ "custom": False,
+ "needsAttention": False,
+ "jobId": "Job-10d75a23-d801-4fdb-a2d0-7f6389ab75cf",
+ "rcmapproved": False
+ }]
+
+ RG_TEMPLATE_RESPONSE = [{
+ "id": "8aaa03a88de961fa018de96a88d80008",
+ "templateName": "update-template"
+ }]
+
+ @staticmethod
+ def resource_group_error(response_type):
+ return {
+ "get_delete_deploy_exception": "Deleting a resource group deployment failed with error ",
+ "get_validate_deploy_exception": "Validating a resource group deployment failed with error",
+ "get_create_deploy_exception": "Deploying a resource group failed with error",
+ "get_template_validate_error": "Deploying a resource group failed with error Either template_id",
+ "get_template_error": "Service template new-template is not found",
+ "invalid_date_format": "Deploying a resource group failed with error Invalid schedule_date format",
+ "resource_group_name_error": "Specify resource_group_name for resource group deployment",
+ "resource_group_edit_error": "Editing a resource group failed with error",
+ }[response_type]
diff --git a/ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_info.py b/ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_info.py
index ce5091212..043fcd566 100644
--- a/ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_info.py
+++ b/ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_info.py
@@ -604,3 +604,24 @@ class TestPowerflexInfo():
info_module_mock.perform_module_operation()
assert info_module_mock.get_param_value('limit') is None
assert info_module_mock.get_param_value('offset') is None
+
+ def test_get_firmware_repository_details(self, info_module_mock):
+ self.get_module_args.update({
+ "gather_subset": ['firmware_repository'],
+ "limit": 20
+ })
+ info_module_mock.module.params = self.get_module_args
+ info_module_mock.powerflex_conn.firmware_repository.get = MagicMock()
+ info_module_mock.perform_module_operation()
+ info_module_mock.powerflex_conn.firmware_repository.get.assert_called()
+
+ def test_get_deployment_details_throws_exception(self, info_module_mock):
+ self.get_module_args.update({
+ "gather_subset": ['firmware_repository']
+ })
+ info_module_mock.module.params = self.get_module_args
+ info_module_mock.powerflex_conn.firmware_repository.get = MagicMock(
+ side_effect=MockApiException
+ )
+ self.capture_fail_json_call(MockInfoApi.get_exception_response(
+ 'firmware_repository_get_error'), info_module_mock)
diff --git a/ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_resource_group.py b/ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_resource_group.py
new file mode 100644
index 000000000..1bf57f083
--- /dev/null
+++ b/ansible_collections/dellemc/powerflex/tests/unit/plugins/modules/test_resource_group.py
@@ -0,0 +1,228 @@
+# Copyright: (c) 2024, Dell Technologies
+
+# Apache License version 2.0 (see MODULE-LICENSE or http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+"""Unit Tests for Resource Group module on Dell Technologies (Dell) PowerFlex"""
+
+from __future__ import (absolute_import, division, print_function)
+
+__metaclass__ = type
+import pytest
+# pylint: disable=unused-import
+from ansible_collections.dellemc.powerflex.tests.unit.plugins.module_utils.libraries import initial_mock
+from mock.mock import MagicMock
+from ansible_collections.dellemc.powerflex.tests.unit.plugins.module_utils.mock_api_exception \
+ import MockApiException
+from ansible_collections.dellemc.powerflex.tests.unit.plugins.module_utils.mock_resource_group_api \
+ import MockResourceResourceGroupAPI
+from ansible_collections.dellemc.powerflex.tests.unit.plugins.module_utils.libraries.powerflex_unit_base \
+ import PowerFlexUnitBase
+from ansible_collections.dellemc.powerflex.plugins.modules.resource_group \
+ import PowerFlexResourceGroup
+
+
+class TestResourceGroup(PowerFlexUnitBase):
+
+ get_module_args = MockResourceResourceGroupAPI.RG_COMMON_ARGS
+
+ @pytest.fixture
+ def module_object(self):
+ return PowerFlexResourceGroup
+
+ def test_delete_deploy_check_mode(self, powerflex_module_mock):
+ self.set_module_params(powerflex_module_mock, self.get_module_args,
+ {"resource_group_name": "ans_rg", "state": "absent", "validate": True})
+ powerflex_module_mock.module.check_mode = True
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE)
+ powerflex_module_mock.powerflex_conn.deployment.delete = MagicMock(return_value=None)
+ powerflex_module_mock.perform_module_operation()
+ assert powerflex_module_mock.module.exit_json.call_args[1]['changed'] is True
+
+ def test_delete_deploy(self, powerflex_module_mock):
+ self.set_module_params(powerflex_module_mock, self.get_module_args,
+ {"resource_group_name": "ans_rg", "state": "absent", "validate": True})
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(return_value=[MagicMock()])
+ powerflex_module_mock.powerflex_conn.deployment.delete = MagicMock(return_value=None)
+ powerflex_module_mock.perform_module_operation()
+ assert powerflex_module_mock.module.exit_json.call_args[1]['changed'] is True
+
+ def test_delete_deploy_by_id(self, powerflex_module_mock):
+ self.set_module_params(powerflex_module_mock, self.get_module_args,
+ {"resource_group_id": "8aaa03a88de961fa018de96a88d80008",
+ "state": "absent", "validate": True, "resource_group_name": None})
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE[0])
+ powerflex_module_mock.powerflex_conn.deployment.delete = MagicMock(return_value=None)
+ powerflex_module_mock.perform_module_operation()
+ assert powerflex_module_mock.module.exit_json.call_args[1]['changed'] is True
+
+ def test_delete_deploy_by_id_exception(self, powerflex_module_mock):
+ self.set_module_params(powerflex_module_mock, self.get_module_args,
+ {"resource_group_id": "8aaa03a88de961fa018de96a88d80008",
+ "state": "absent", "validate": True, "resource_group_name": None})
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(side_effect=MockApiException)
+ powerflex_module_mock.powerflex_conn.deployment.delete = MagicMock(return_value=None)
+ self.capture_fail_json_call("", powerflex_module_mock, invoke_perform_module=True)
+
+ def test_delete_deploy_exception(self, powerflex_module_mock):
+ self.set_module_params(powerflex_module_mock, self.get_module_args,
+ {"resource_group_name": "ans_rg", "state": "absent", "validate": True,
+ "resource_group_id": None})
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE)
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE[0])
+ powerflex_module_mock.powerflex_conn.deployment.delete = MagicMock(side_effect=MockApiException)
+ self.capture_fail_json_call(
+ MockResourceResourceGroupAPI.resource_group_error('get_delete_deploy_exception'),
+ powerflex_module_mock, invoke_perform_module=True)
+
+ def test_validate_deploy(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": "c65d0172-8666-48ab-935e-9a0bf69ed66d",
+ "firmware_repository_id": "8aaa80788b5755d1018b576126d51ba3",
+ "validate": True, "resource_group_id": None, "state": "present"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(return_value=[])
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(return_value=[])
+ powerflex_module_mock.powerflex_conn.service_template.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.firmware_repository.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_FIRMWARE_REPO)
+ powerflex_module_mock.powerflex_conn.deployment.validate = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE)
+ powerflex_module_mock.perform_module_operation()
+ assert powerflex_module_mock.module.exit_json.call_args[1]['changed'] is False
+
+ def test_validate_deploy_exception(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": "c65d0172-8666-48ab-935e-9a0bf69ed66d",
+ "firmware_repository_id": "8aaa80788b5755d1018b576126d51ba3",
+ "validate": True, "resource_group_id": None, "state": "present"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.get_deployment_data = MagicMock(side_effect=MockApiException)
+ self.capture_fail_json_call(
+ MockResourceResourceGroupAPI.resource_group_error('get_validate_deploy_exception'),
+ powerflex_module_mock, invoke_perform_module=True)
+
+ def test_create_deploy(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": None, "template_name": "update-template",
+ "firmware_repository_id": None, "firmware_repository_name": "firmware-name",
+ "validate": False, "state": "present", "schedule_date": "2020-01-01"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(return_value=[])
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(return_value=[])
+ powerflex_module_mock.powerflex_conn.service_template.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.service_template.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.firmware_repository.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_FIRMWARE_REPO)
+ powerflex_module_mock.powerflex_conn.deployment.create = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE)
+ powerflex_module_mock.perform_module_operation()
+ assert powerflex_module_mock.module.exit_json.call_args[1]['changed'] is True
+
+ def test_create_deploy_exception(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": None, "template_name": "update-template",
+ "firmware_repository_id": None, "firmware_repository_name": "firmware-name",
+ "validate": False, "state": "present"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.get_deployment_data = MagicMock(side_effect=MockApiException)
+ self.capture_fail_json_call(
+ MockResourceResourceGroupAPI.resource_group_error('get_create_deploy_exception'),
+ powerflex_module_mock, invoke_perform_module=True)
+
+ def test_template_validation(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": None, "template_name": None,
+ "firmware_repository_id": None, "firmware_repository_name": "firmware-name",
+ "validate": False, "state": "present"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.powerflex_conn.service_template.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ self.capture_fail_json_call(
+ MockResourceResourceGroupAPI.resource_group_error('get_template_validate_error'),
+ powerflex_module_mock, invoke_perform_module=True)
+
+ def test_scheduled_data(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": None, "template_name": "update-template",
+ "firmware_repository_id": None, "firmware_repository_name": "firmware-name",
+ "validate": False, "state": "present", "schedule_date": "01/01/2024"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(return_value=[])
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(return_value=[])
+ powerflex_module_mock.powerflex_conn.service_template.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.service_template.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.firmware_repository.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_FIRMWARE_REPO)
+ self.capture_fail_json_call(
+ MockResourceResourceGroupAPI.resource_group_error('invalid_date_format'),
+ powerflex_module_mock, invoke_perform_module=True)
+
+ def test_resource_group_name_error(self, powerflex_module_mock):
+ arguments = {"resource_group_name": None, "description": "ans_rg",
+ "template_id": None, "template_name": "update-template",
+ "firmware_repository_id": None, "firmware_repository_name": "firmware-name",
+ "validate": False, "state": "present", "schedule_date": None}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(return_value=None)
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(return_value=None)
+ self.capture_fail_json_call(
+ MockResourceResourceGroupAPI.resource_group_error('resource_group_name_error'),
+ powerflex_module_mock, invoke_perform_module=True)
+
+ def test_resource_group_edit(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": None, "template_name": "update-template",
+ "firmware_repository_id": None, "firmware_repository_name": "firmware-name",
+ "validate": False, "state": "present", "schedule_date": "2020-01-01",
+ "scaleup": True, "node_count": 1, "clone_node": "block-legacy-gateway",
+ "new_resource_group_name": "ans_rg1"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE)
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE[0])
+ powerflex_module_mock.powerflex_conn.service_template.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.service_template.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.firmware_repository.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_FIRMWARE_REPO)
+ powerflex_module_mock.powerflex_conn.deployment.edit = MagicMock(
+ return_value=None)
+ powerflex_module_mock.perform_module_operation()
+ assert powerflex_module_mock.module.exit_json.call_args[1]['changed'] is True
+ arguments.update({"clone_node": None})
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.perform_module_operation()
+ assert powerflex_module_mock.module.exit_json.call_args[1]['changed'] is True
+
+ def test_modify_resource_group_exception(self, powerflex_module_mock):
+ arguments = {"resource_group_name": "ans_rg", "description": "ans_rg",
+ "template_id": None, "template_name": "update-template",
+ "firmware_repository_id": None, "firmware_repository_name": "firmware-name",
+ "validate": False, "state": "present", "schedule_date": "2020-01-01",
+ "scaleup": True, "node_count": 1, "clone_node": "block-legacy-gateway"}
+ self.set_module_params(powerflex_module_mock, self.get_module_args, arguments)
+ powerflex_module_mock.powerflex_conn.deployment.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE)
+ powerflex_module_mock.powerflex_conn.deployment.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_RESPONSE[0])
+ powerflex_module_mock.powerflex_conn.service_template.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.service_template.get_by_id = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_TEMPLATE_RESPONSE)
+ powerflex_module_mock.powerflex_conn.firmware_repository.get = MagicMock(
+ return_value=MockResourceResourceGroupAPI.RG_FIRMWARE_REPO)
+ powerflex_module_mock.modify_resource_group_details = MagicMock(side_effect=MockApiException)
+ self.capture_fail_json_call(
+ MockResourceResourceGroupAPI.resource_group_error('resource_group_edit_error'),
+ powerflex_module_mock, invoke_perform_module=True)
diff --git a/ansible_collections/fortinet/fortios/CHANGELOG.rst b/ansible_collections/fortinet/fortios/CHANGELOG.rst
index 4c4fcae19..0d17e07af 100644
--- a/ansible_collections/fortinet/fortios/CHANGELOG.rst
+++ b/ansible_collections/fortinet/fortios/CHANGELOG.rst
@@ -5,6 +5,34 @@ Fortinet.Fortios Release Notes
.. contents:: Topics
+v2.3.6
+======
+
+Release Summary
+---------------
+
+patch release of 2.3.6
+
+Major Changes
+-------------
+
+- Add notes for backup modules in the documentation in both monitor and monitor_fact modules.
+- Supported new FOS versions 7.4.2 and 7.4.3, and support data type mac_address in the collection.
+- Update the documentation for the supported versions from latest to a fix version number.
+- Update the required ansible version to 2.15.
+
+Bugfixes
+--------
+
+- Fix the issue that ssl-certificate cannot be set in `fortios_firewall_vip` and `fortios_firewall_vip6`.
+- Github issue
+- Github issue
+- Github issue
+- Github issue
+- Github issue
+- Github issue
+- mantis issue
+
v2.3.5
======
diff --git a/ansible_collections/fortinet/fortios/FILES.json b/ansible_collections/fortinet/fortios/FILES.json
index 337faea78..55ea5694d 100644
--- a/ansible_collections/fortinet/fortios/FILES.json
+++ b/ansible_collections/fortinet/fortios/FILES.json
@@ -81,7 +81,7 @@
"name": "plugins/module_utils/fortios/secret_field.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9bea3bcaf0be6ad9f00348e0dd3606812c4df7c1e1da61a58aeb810abe1d3f7b",
+ "chksum_sha256": "5b593961fc2471e5e2e138a2ca5faac8416e514f458c076a520c7f3a5e10004a",
"format": 1
},
{
@@ -158,7 +158,7 @@
"name": "plugins/module_utils/fortios/comparison.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f81bd10353196872dc191c4696431e2534de9d56a0732810e32486e39ccb9576",
+ "chksum_sha256": "6889e6d9f92b97658736b997b472c956c4f8380e9c450bae516a846c92f2516f",
"format": 1
},
{
@@ -221,798 +221,798 @@
"name": "plugins/modules/fortios_system_api_user.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dd7e5edc521c2d92b777ae9addfc737816c8fef5e98938a131d52b006bbafad0",
+ "chksum_sha256": "fc4c5bf5ed89bdd8df0858e99543635c18baf0bc2f0206eaf6b05c3bd2a0c3d6",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_timers.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bbc986558d84076baa4c2b0a52e643d0673d18e19c0c0ba7e55161f9a634060f",
+ "chksum_sha256": "50313bdcf3488871fef6a8dc782854a268f56cc796adbb727aa2aa8571596c36",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_proxy_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "effb40a0c126ab142ce9aafffd4dba9822fd8da47e074b7f64286ed824af4ff7",
+ "chksum_sha256": "3c094b0eed553167f91759d73aacdf2b0686b326525e1332b8c4238aa2267e21",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dns_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "89bdb2cb1d24579a0c6069fed2a18b5e42f4aedd98608f46fa4a4aef94da18a2",
+ "chksum_sha256": "34acb5b6c482f49c0781594c2472a953e39c207267e19bd64dc92f03f4860580",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_client.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "718569c11df47ba71c178af4e2b2c88cc34689b3801e5e40d2821c57c317c276",
+ "chksum_sha256": "9688f67c929bd21b804c809946e1bcc4cc78317f0bf8c459eda0192d327eca66",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_content.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "20a31f1159fead209953e325db849c8f2cf7fa5a6915fe55cd2fb158abf73757",
+ "chksum_sha256": "b414da23c0c10e6d9477e836b5a2818330ad29a1e5e8cf7f399fd7813c8adbde",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom_exception.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6d7a92e961b393f0733a2c4e4827d77ec119d88094fb84f3f8207c927f04e1ca",
+ "chksum_sha256": "d442f7a84fdaddfda45fa5e1e60b84549ad03c299357178b0172778bc2be5d8e",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer2_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df23f4800497d25696d122b898d6d343333140f657e76a546a4015d066aa5c22",
+ "chksum_sha256": "f5d47391e336b2e00c79ce7a6fced95f396b9c715404f3276222db81385c2a79",
"format": 1
},
{
"name": "plugins/modules/fortios_system_saml.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "43abbbb98d173e4fb33759f7842e652555a78562e8f61e83cb2a2320665b1e46",
+ "chksum_sha256": "d14495e6fd71f12a547d9714c273f702b3fc10abab59879a0fc59493eadfafec",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_client_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a387891aa15e67a0c4d6445ec3fe2c530e0ee1c453b535561c2c4e7108c2420a",
+ "chksum_sha256": "a71632fcdf758fe3b574b8fa74326f9d4b0a784d34fdc72a28848f9e4352b611",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_sflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ec974acdc4ff5265494eee81e8da962b57b66dc20eaec73a3bc1e944dfdc4371",
+ "chksum_sha256": "4d3a2200950a8f586548f80d6f374126a1abb859421f11db4572a374f7530d76",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_dnsbl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b70eb04b436ba759eea3808ae63b32195dfef508db8ab8a2f4743fd6fd8cf71",
+ "chksum_sha256": "0582b764857e7898e4cae12a09c4491a586144f2fe730e307f51e68fd06fa18a",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_addition.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63615269d4de40ad6ec6b84da986549c7ea866ac82ebeb07f919266a90deeeeb",
+ "chksum_sha256": "da82feec6fa403861e2201c9d7a881f2e773bf0739f482a534ea762bd9b7b97c",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_urlfilter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "35b0aeda672c901d7fdddeb7c65ef4c3bc95260aaf5ae1112c5fe3fc9b71dade",
+ "chksum_sha256": "1ac937be56336178a611c77cf6b795aee9160bc8a56a3e7237cf6e5fcd7b007a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_probe_response.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9c309722a76a7b1695c4fd6925a3ee4a0dbad3298fccfbfdd62c89327e68c939",
+ "chksum_sha256": "bb322793a9de05e8a3bd1a7f57039905300dce18599792e3035e773ce6d80236",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_ap_status.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8df694b2e493d4ddef9b5725219da60e74619d37f3e5bbcfe20b3c578d7c01fe",
+ "chksum_sha256": "dffdb9cc3a4f48c9384d72621de5349ebb9d5ee1cff2c6eb7c31a6f374525220",
"format": 1
},
{
"name": "plugins/modules/fortios_user_peergrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74a469484f74cef7c5a6fcef623ffd2125291a44c97d970b1035d59eae6c0ac1",
+ "chksum_sha256": "331f63a4a877e894a92c5adfc86710a36344ed056129bc3d712d994e854afb3e",
"format": 1
},
{
"name": "plugins/modules/fortios_system_password_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e3fca1461ffe4058be3e256c5e368ab73b4ba0f830b91d272f80a1355fb07a9",
+ "chksum_sha256": "8ae4f17ad05ba30be056dee67f11883334ac06f972c825a3431ca4c3cd877773",
"format": 1
},
{
"name": "plugins/modules/fortios_system_geoip_country.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7819412c615a4f900dcdd7d2788da8f93d2a83c12efe5c163e47ad62fed7f39",
+ "chksum_sha256": "c24e424c8dd5180a38644b6f333334089bf05ef90dce6c9c5761fef7aeb22c2f",
"format": 1
},
{
"name": "plugins/modules/fortios_system_automation_action.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4110818ef54692224186f3322084962f50ff930053b064b7630ba2f34df40b17",
+ "chksum_sha256": "d4440cbeba5a77804b9f27439994b609987f48102980fe61689f8ac28076b462",
"format": 1
},
{
"name": "plugins/modules/fortios_system_alias.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb62577bda049e70368b86955ca9ae9089c26617a3a708ce9e440b79bb3b95f2",
+ "chksum_sha256": "45ee07d0e8b817959a82935950d498a2c0554db0be673c86e6aee3ef62d7e3cb",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_mms_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1f37290f372a32b3986f25dd497f73eee559d7663365b514c6d0c7ee58bba3e0",
+ "chksum_sha256": "1ac1ebf54cd3843830f26270b4aef75f1363ccc1f36f2be0f098a75eeaed878a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_storage.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3c7d10b7bab2cb20865269333358d3afd64cc50a79452c7564e0189dd753613",
+ "chksum_sha256": "fc1717cc180106e0536f5abb72e9fd6de8a2673f795bd6e68cff55fee546206a",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_controller_extender.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "17e253c7a0c13af1a83c2e9ba7f3effab48d726f6911dca7ac60e6032f09ae3c",
+ "chksum_sha256": "687090cd81028d8b80023440dfd46c022a828182c77875566924d4298fe6c9d4",
"format": 1
},
{
"name": "plugins/modules/fortios_system_federated_upgrade.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad84d561dbe756715a1a9871bdb107af8802f2b28b6a7a039a21b27044e33ac4",
+ "chksum_sha256": "901292f423ef4ae391ed78fb3c945a988d06491c5c95280567c6aaf76f2b58b1",
"format": 1
},
{
"name": "plugins/modules/fortios_system_modem.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "849feca08b49b89379dbe3f28c1e35c8ffc84a05701709b46b06bc13acb8f7cf",
+ "chksum_sha256": "0807b9a6857464a0d92c55661463faec862448f5a753bbf59d20bc9489b6939e",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_tunnel_limit.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8ef45386d725f48ce523ff8b002bb17b3ce33f07ef1bd41527155f23ca3b3f72",
+ "chksum_sha256": "9211389438d28bc253dc2894f819fb081ddec6b272a52dbd5893182216a66bf8",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_lte_carrier_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "009a5e3725dd5a86cd0cd9f91f6ccdf62e314b69e8603d939cbacdb7f2fa2b03",
+ "chksum_sha256": "9a761c881e9457afbe938cfabb5a8b471a04285a76437cf7c05773687a369659",
"format": 1
},
{
"name": "plugins/modules/fortios_antivirus_notification.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8e95be23b6c7c8a0eb846806570954c60210cb191332a6df558f31c5505d2e83",
+ "chksum_sha256": "8c371c19f23d847cf513e76b44e651f2cf8a9d2fde919bd335fb415af9e9408f",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ha_monitor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8690ac56330e655cda47bfb2a8aa57141fc8033d137613342a1b4fd22d784d1b",
+ "chksum_sha256": "970887e396fdaa8d14decc533a8de42a2020972974204b243a3a1b09d221cc92",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_traffic_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aa88becfa91f45c0c143fd11f6a376f272573ac9068c8ac3965b2c6ec97998b0",
+ "chksum_sha256": "ea81c3eecfd8b4c3106790f791d5a1ed7489cef1f3eb17a7dfb11c5b9ebd9964",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_address.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "73294b37ed69587b2b78098f780142af90d63c975037c8ca39f7a2751722efef",
+ "chksum_sha256": "7a4f1d4a5e23ba149afe6307768e9f4ebeabc3bf64a21d9907a5960372222780",
"format": 1
},
{
"name": "plugins/modules/fortios_log_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "439593676e498dcad59fd73bac99e35384bb7eff1c52e0052e56c1b629ec7ead",
+ "chksum_sha256": "c3426278da3de1b4c352c6abb72a608030b6cf905cad397665b192b5b025884d",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_vap_status.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e751de9ed22c0a8f63e401df758e989d3d0296f3863bc47452063dfc452ef1c3",
+ "chksum_sha256": "4c5e95b00f9ded4f6dd7e438d3e867720ea8f74bebb30fd3bb5eb59b1d56b790",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd2_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a35506233192c8a6ebd9e19a1db65d78edd184f6a6d0937f1263c926350a7de7",
+ "chksum_sha256": "1f97bace65c3754cb1cb948871de2e3062700b034f5ac139ba8bc85af6714e45",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_addrgrp6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5a7b14246043ae9ae19133518c45c7541a6ae63e04f58b2a0f1bd5f94d89cfc4",
+ "chksum_sha256": "b6595a64413100f6cf8452e6f3ad1e11302e60f02d461eb19872ae4d05b5d72f",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0419029a5420c7b7efad382e72c2904c5fcfa8e13ef7f13d4e327c1878f53f10",
+ "chksum_sha256": "71c821570ea80482718b4ee945e19926e24cc8ae2caf4183ad287ae51b44352f",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dhcp6_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "504851c5948dda377ed19187121ab653460c55f430a34a493b0ab3b0edb2a072",
+ "chksum_sha256": "94f6bb3c926e6f977b0715af350b3b5ae7e38016f0eeb1d93f080ee789f652c9",
"format": 1
},
{
"name": "plugins/modules/fortios_antivirus_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6007ed49c48d6ae886dd0884efb1627a8896f7c8bcf0cf46f67199aaf0b81ef6",
+ "chksum_sha256": "e746f9a1c83aa3a648560b0583035832211e4a41a2061c6fee9c6b721124ee53",
"format": 1
},
{
"name": "plugins/modules/fortios_antivirus_mms_checksum.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "45d853325b68a03f1e0ba9d772ad319efd64614f3fd3bea0a04bd7c5590b0201",
+ "chksum_sha256": "01f88ac47fd6f0d6a6c670b102050a050e164814edfceb3bec1540be1c2d0579",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_qos_dot1p_map.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c2b81e23a8c2c444411ff053740b4af586c2ec6af128ff43953e45832d2f632",
+ "chksum_sha256": "4478d2f9f0ec5be7ac3966c60153aaa28bfa125c2ccf5f822c0cbfe8effb35bc",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom_property.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d31b7ee0e5a704d0593422b5e60323d221963b09a8a0a44493fa74a24a7fc821",
+ "chksum_sha256": "0ba413b216af86fcafb715842c6cb9928b68062a226752d8a5b6a1f4847afc0a",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_ips_urlfilter_setting6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3dcb16468f93f5b0e225c1eca8af10ccbd5e8662481df326e333a2d530e9e0b1",
+ "chksum_sha256": "2face3427b4de2440b54d1efd1e18319383031b682551cc09dac2eea7da2b811",
"format": 1
},
{
"name": "plugins/modules/fortios_system_device_upgrade.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0c2b52aa410de9d533f79bdf07eaaf9e293f7876e2478563f180c5017f353c6",
+ "chksum_sha256": "d4cf1ca58adf330b01907a8b42cf751ea04dc0113f5048e40733ee8051fbfd97",
"format": 1
},
{
"name": "plugins/modules/fortios_pfcp_message_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a8f53495a80945a3ff5d6a6b68c98db92c03d3398e39d8c5aa4b07b0fc19f8a",
+ "chksum_sha256": "50f526f5218d0834741d98ed6910545419bcb4c1f82d89ff1ed688a97a41c1a3",
"format": 1
},
{
"name": "plugins/modules/fortios_log_threat_weight.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6cf83cd4425f861ab4d7c621fec88b7ff9274bfaf91f13d31b6dd2ca5db9499e",
+ "chksum_sha256": "a242279977e39380057cb1c4e176de123f6d76e1ddea0d873024ece5014b83a6",
"format": 1
},
{
"name": "plugins/modules/fortios_waf_main_class.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4865c0e04bfd72f363feb0849346d757db77c009595a6739f244ef1b26a69e57",
+ "chksum_sha256": "38feac3aa59b23abdddf7885ac7c2335d4777b8f4da31dc82d5d3a2a1db62888",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ssh_host_key.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6ae8b773f02dc9388b71cdc85998af471055c251937e3b7f0b3d6342ee349994",
+ "chksum_sha256": "22489c89646bdb1ee04b8e95a13d571f5fef9dd0a24dc7a28f26b440f3dc4f9d",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_h2qp_advice_of_charge.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4c6b16010e4ff40931d67b94a724e23c29b8de1620b7cb6fa67fc55ff46ad096",
+ "chksum_sha256": "94420f6b1c865f386dab4d90468836c84da7393dd79a69d3a8bb6d0ff18b2e4b",
"format": 1
},
{
"name": "plugins/modules/fortios_system_evpn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b3aed9799513e0232af75bb6b091c2e54651c355eb7ae09cbf63ed5cc415ff1b",
+ "chksum_sha256": "08606730bead4e7af26df1e39ace2033a464d00aa05df93c238379edffaa6b42",
"format": 1
},
{
"name": "plugins/modules/fortios_user_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6eecd18b9814d439e2e93d46a582d394178c0247f26445874c7549ec9fd72d88",
+ "chksum_sha256": "ceec56c9973fde68459ec8eb1ae4d802217fbbcb99d052ef4834950ea0a03170",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_access_proxy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "538adfb6690787ab49df9d76bf9a7f0ead89b4b8d6c9f0ad68bc5fb4b12f5ee7",
+ "chksum_sha256": "d64bf452e126956f4d04ea65e92f2733f83cf846388b70d5c256ccd12814f7e5",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_ble_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ebbacb2f3837ff740c1eaf5bd0fdc52b940f42ba686fe106160c3a0124022ef0",
+ "chksum_sha256": "5bb4dd8164a2f67f8718107fb960efd55b9ef0f67b0fef93cff3148543ba155c",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_wtp_status.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4ead66fdfb42a3c9c60eb0b4045bba4f00d5ddc2f06c9cf5de16404d5ff7999a",
+ "chksum_sha256": "cce73f5436002f347e2762c5e28c69c8e53da18dd5c5aebc15acdc16717dcca1",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_override.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "781c2119ba5ad5d278ec2287f297d1a49525f731e9e5fe280d281232919af393",
+ "chksum_sha256": "cd31364e99703f2813cb76e9a1122e91978874e302cdcf30561c096bd08b438c",
"format": 1
},
{
"name": "plugins/modules/fortios_monitor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3ff2cb047e9f75637946cad239504cc4db86d8043f07a9ca424b9dbb60650c8c",
+ "chksum_sha256": "10bf9b1274b814f2d312a99633c6c7525c2854a02d264106044e656063f56311",
"format": 1
},
{
"name": "plugins/modules/fortios_router_multicast.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "23378d626c1a42f284cdba4fc5d3184e8945ca7db899bf0e4d49b38e02d60fde",
+ "chksum_sha256": "3e913ce148c2752e560a59282ab5971120a796e8c3d6f285808cd2bc72517db2",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_icap.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8aa1b93fa62cc10f1bb9187b653d3ecabd41dd4a797668569e7febc05aad4615",
+ "chksum_sha256": "9be2d49e6701e324597de5b66b713b68d328cb8562669528eadba7ff57a19a9c",
"format": 1
},
{
"name": "plugins/modules/fortios_monitoring_np6_ipsec_engine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "186c94183221808a408d5f2afcfe55042f580353b98e6ac3368a63b12e2029ed",
+ "chksum_sha256": "569f58bec7bc908cc950de7ae509164a6f267b242e488d7609028c278dcb2a34",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_address6_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9e85c4191de5580db0fb8c2d9d58a47d9dd05abd3b42fe42fb745f3c8ac14516",
+ "chksum_sha256": "2ba30eedb0050d940102259e6784bbd914682724c7af118ca391c41749e7ed36",
"format": 1
},
{
"name": "plugins/modules/fortios_system_object_tagging.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "58be97f341f1ca232fb0ce136d74bdc5f12cf6535e2ad0f4aa7b85b5979c1cb5",
+ "chksum_sha256": "5052a193e16a219aa50b0cdae3a3441470dda0be97d6f1f991d3ae9ac63871a1",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_poe.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3938ae8f064f65690781bc45a36d2dc0f019ef8bcaeb929a4f807f5df1d0d2e7",
+ "chksum_sha256": "d8f0bae556d98dc2c3277d127e6f6028228049e5f5753c2a8b6cac5624039d0b",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ike_gateway.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf756164b3325e85f655cc9ca21997fb028d90757fe5ec1892d7e939b6653da9",
+ "chksum_sha256": "1f38fd7985f080b3c6c8289cd0e9526bd90b801ced01819e1f1d79242768cab6",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fortiguard.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4edd311cd7a68fd7c733bbfa977922f0d0989bd4b4624554e8405c676b64b596",
+ "chksum_sha256": "91001b8097516587e7d863e6494c3b52eee4ca038543d90653c3e88d6dfb6faa",
"format": 1
},
{
"name": "plugins/modules/fortios_system_password_policy_guest_admin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1013f3bb973b28c178d876fa366987d94de26d0284736788b07edcd82dd25bc7",
+ "chksum_sha256": "b084b12a735418049ed5e534ae04b0b2dd0018cc558b331a36569e45847ee86a",
"format": 1
},
{
"name": "plugins/modules/fortios_user_password_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea4cccc45a4261c74a59daeb9a59b8303053ade1684cbf253c29a12e1d888c0d",
+ "chksum_sha256": "2fcb2f9657d7ef66eaa3f3d2018de21cfd2a2bb86fe05c92251e985c977d0243",
"format": 1
},
{
"name": "plugins/modules/fortios_casb_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b177ed0bced6e2b9c9c0b258aee54c81f402085e054c911b6bb7f99ca58165b4",
+ "chksum_sha256": "5c9971cad0178f3188693ab6e747a0398c0b9b71b26db8630aa6d0f324ee213d",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_identity_based_route.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "10a2acec1283f30fd416e37d0813fc6f199a9568af51d82ed796c360a918aee1",
+ "chksum_sha256": "e760171a7a3e6d41ae50178a5dcd59c3f946f904bd1be56969f376106e0a0cb4",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_mm7.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e23bc05d94cf3281354dc7bec83f5dac592d4524a5d8f05a5afcd9e2af112ee5",
+ "chksum_sha256": "29fa3d99b1a24591b9acaa3bf87024da1f5981d03fbce96daaee0a5c3d7890ce",
"format": 1
},
{
"name": "plugins/modules/fortios_application_name.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f690beec05cce5dae99f38f8170ca712325ccd9860a8b3af2eb59209ba9fb7a5",
+ "chksum_sha256": "18561ed5414a453eb7422c43cbc9549db539d970e9055fd610acec560f54bd10",
"format": 1
},
{
"name": "plugins/modules/fortios_system_zone.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5bd028dea4c2ab5576b8c97acc25dc97e9965daee26d7fa3927231106476830d",
+ "chksum_sha256": "30dbe654f6f882ecfed7f4c0ac4ab77ccac7da255a3d68615ed04b169d85b7a3",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_nac_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "207dd2d74074d7e8e2e4d1875ccacef85cdf90c5876cd9e2a12b8ffb4ba6ff15",
+ "chksum_sha256": "63789467156fe770831cc9f89760670155bf2069b4fa9bb43b69c55162abcd41",
"format": 1
},
{
"name": "plugins/modules/fortios_system_speed_test_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "887588c26bf8e4525eb7b6d11995020d830c3a6a6ff619197cb43504d6f94543",
+ "chksum_sha256": "20c02e889e0f822db3bf2b2e861688d822ad6af1990fe3be39d3f78518e6ef0e",
"format": 1
},
{
"name": "plugins/modules/fortios_application_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2b1b6a8a06cbf654808a97dc76538899ea2a954309cdee66165419cb486ea3d",
+ "chksum_sha256": "33dbce8c632a7acd0f8eda63111f5c5a0017f2363f304792c0f3ab0a424e780f",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_access_proxy_virtual_host.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "556d46d886d86c1e0e66e8a511100fc74b28dcddf46059ecd485d7b0af301023",
+ "chksum_sha256": "1af0a0a8b518dec40b1505e9f5fc280ca352ead5f51ae9f63f104fc8ae24859b",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_profile_protocol_options.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "670b5fc702071431439f9fc989d551b01dba3e8717f768c6995bccf179817745",
+ "chksum_sha256": "22d90d1813fbc47ff7ccd3336540a16c27282bc2445ab367804f4169f049927a",
"format": 1
},
{
"name": "plugins/modules/fortios_user_device_access_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "51a61c0fd9be6fd53d9211846aaa51e84d85f62af9a805086067e4b503d9f785",
+ "chksum_sha256": "13724a2af3a3f29531b456ffc08a954fa6f65c0c707aefad12ee1f490f8a15c2",
"format": 1
},
{
"name": "plugins/modules/fortios_monitoring_npu_hpe.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e4e0a960a28de3bcf40b3317c7bf1fc61d9b307714af4f9a5dcf60ed9de6c976",
+ "chksum_sha256": "ad90243c02d1d83e17c4c769acbc25bfb879ff23e1be61fb039cbaf8d3607c26",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom_link.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5760d7e9b24aad15d461d6ef0addb919cf9395747f653e581a86ec57a297af1a",
+ "chksum_sha256": "9751b009be2f2221d033ccebc4915ee24eed421a312ccf2310cacc1fb0d6f0a8",
"format": 1
},
{
"name": "plugins/modules/fortios_user_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b7f228f952687d3a8dc712cf6a20a6196435640c318eb25312798e2d54ad048",
+ "chksum_sha256": "c0cb0cab1b0d396e4578e8678ed7686303e5d3709b50d8f1016da369c057d7a1",
"format": 1
},
{
"name": "plugins/modules/fortios_system_3g_modem_custom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1f0a969f3fd9b111cdf991c1699b7ce5acd558311748455e9e8e90d77b5065cb",
+ "chksum_sha256": "04ac97a312a5e35c86b95408a125596e14fa39473db678e7d719ed5c39919559",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_ec.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f1ad6bf0fd1c39bd3edbeac4df0f4ce883bf7317410884fcccdd970ee56a6aad",
+ "chksum_sha256": "3ca5aa7e3435200a5fc258bb2604a6ab1b409198a0b73b391e929958a68cc4ae",
"format": 1
},
{
"name": "plugins/modules/fortios_system_smc_ntp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "61bfdadb4bdd15d4141ac48ae6ebaabd1fbd417a8ddaeb2aa461e0099497fab0",
+ "chksum_sha256": "5574fb73881397472a1cc03920626755bf5f9a3ce270f143850eb09d90c1a6a4",
"format": 1
},
{
"name": "plugins/modules/fortios_system_netflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "755ec4ca3e9e9b0ee7b5cd05345b30767f4b9f0fcec2e15078e8ae579a2b5294",
+ "chksum_sha256": "091ad4ed6e244cfccecbab7dbfa03ca23f5d3766178f8ea2056914854074a5d1",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ssl_web_portal.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "57904e8ed4cff2a32a6eca69752bed1a6490c02ef7959bcdf60da5bff9a00e58",
+ "chksum_sha256": "b510807996e02a7ccfe635e4685378194741f2ae98595c56d5edb0feea6d0692",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_fec.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "93bbeccacaedee52e2de50e2d0078cdb2d713f418bbc34f1c380f50ad6f3cbb7",
+ "chksum_sha256": "6a09a2812a456788b52a305794b75253274328c7175613888fa52ba2d5e2fdfa",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_phase2_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "06e0c35809b2d7f115bd0483be3c47f93eb3035d696ad949505901f1e8129862",
+ "chksum_sha256": "5289366b51f5765ff6c48048f70254b4c171e0872d4b81f79cdbac00bb787828",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ssl_web_realm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c4293075b37a16a9c79c5aaa2e77f050c1fea0a6d1ee9d2316c2e3083fe6aa02",
+ "chksum_sha256": "c8d0844b8682499e0db8cdfb667a559249a363d79cf8fe003273e57f15984b2b",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ips.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f2f459d4c7f07d8ab850741e2b985d3a9637de6cc0d6da568b131bf7feb3dea",
+ "chksum_sha256": "00b535f52491f0acc4f1de5ca9d8623a0ad8eaa36f030e4c9f20f927b124044a",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_service_custom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d93c275e8b4f180406eb9d03c4c8b506bf455558898273ae2e421cea0c4c2093",
+ "chksum_sha256": "edee215e347c0b529f8515f2b565582d2ce0f8daeae1d27860bc29270cb8b274",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_auto_config_default.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fdd29cc32ac28d8627cfee8ff4330251de48943896924800d0222aec04c9d98b",
+ "chksum_sha256": "5079720eec5238ed387773184d6476a798710832caa9f7de66aa719b1d0eca03",
"format": 1
},
{
"name": "plugins/modules/fortios_system_automation_destination.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4ff12fd40001de09f53b87ee1347d5d6d74b535c7495229500a17efc21eef094",
+ "chksum_sha256": "4ec8d441235321580bf20e8d2e3f297ad2ddead34d1785eb52a9f38d83fa6cee",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_auto_config_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9f025626a5c7d386671892d12e3c60a6163aaafdab3a39e3d1abbc99b12cb0eb",
+ "chksum_sha256": "27a95736f276858f940fd0e29fc6a86606650ac371354ef2bc0e189d0443a388",
"format": 1
},
{
"name": "plugins/modules/fortios_router_bfd6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8bfef5644b5680c501d58ea084454dc2105a7edcd2e9b115c864264a4559f620",
+ "chksum_sha256": "25f21bae0c75a2abe1ee709101473d2b9d393047f0315a58074d7202d90d2dae",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_anqp_nai_realm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "05178d828698f8a73c162e20d03567b19ffb6fa1f225c244e99ca07612c09b6e",
+ "chksum_sha256": "027c3ea89c7efc0aef679899a8737d8235b582d1f605b9131819c080ed4ad1e6",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_shaper_per_ip_shaper.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b248909058e1fb83fa358976897206ca97179a2fb8d697bf91545dec800ba424",
+ "chksum_sha256": "148846d752dafe70a071e57edc8229ec2db864d35e8fb0ba8be1e54193c6e2ff",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_traffic_sniffer.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bed798bc7940866a0cce1e2b950fe4647e1379b1d8c932a93b24c6e332e0f9bf",
+ "chksum_sha256": "d0e54e09df2279f287e94beee12288ab78e57d9fd94ca23fb674497614d24327",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_webcache.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0830de076fa9a4a7002a311c9cc130943da3069dc4cc2d573885d7fbe2920e2c",
+ "chksum_sha256": "47a5f6436471e24463effa8e015d7a1e449dfb515d3c2cbffa0374ea46dd3706",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_certificate_crl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "adbeaca1683537020cdbb8413265161d0e03b1303e122ac7c522b414dd1829b4",
+ "chksum_sha256": "1cebd60b39eab2b36ccd802ad7c3394ce3d79a595891f05d9a2805ee2f2d86f8",
"format": 1
},
{
"name": "plugins/modules/fortios_system_csf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c519f2a530e47529a5d6d61a6c9174f2ece2da2b1975890ba68d25a7d1a6d510",
+ "chksum_sha256": "78a230b88bf82a523112a3a716a67ae373e63ad1c45c1078d43dc3517a5a0c1d",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vip.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "70cee5d5d3657697c738ff5e339e8a7879d84cedb89987480a7b6f720ac0a5eb",
+ "chksum_sha256": "02a9a7d4c7452eb85ecc6879a8dcfba765ef91607dfa271fdcaa81b8c1c7f43d",
"format": 1
},
{
"name": "plugins/modules/fortios_log_gui_display.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad99af3bf99fdd28e80af24f5e4ff026d57e7125abe950eb12d7f94cdcb364ed",
+ "chksum_sha256": "37b015aa38a5c2ef3afad923b6fa4412d9b8523bb9ed17f82788a4ccbb9772b1",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0b15b066edc8abd9ab96b5724462148a6cfc83fc516b3e34890a1b1392636ed7",
+ "chksum_sha256": "dd6d65df2273da41c38b50f497ff21e515ba03a1f5b17058c2ce7a65f58c50bd",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_message_filter_v0v1.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "544bf975aa61033c3b0b2753a90a3325c7b2984a10d21d4b00cce4b8b459795d",
+ "chksum_sha256": "449e069d48cc173f89bd9efdb68b922d4b011259d8ab6e197cc01510bfb3861d",
"format": 1
},
{
"name": "plugins/modules/fortios_user_security_exempt_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "62d88c6c244086a82644703f7ae67fcba32706389b4e8bdacded8ff19c1f259b",
+ "chksum_sha256": "493836fd96791f329237a7ce32f85ab6c2b8841f77b45fb7e2888459eece4cd9",
"format": 1
},
{
"name": "plugins/modules/fortios_virtual_patch_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "31d9008122af8b9a5358d689a02081b68a65fb3641aa85e0fb18df87b79b9a8a",
+ "chksum_sha256": "4bfa11326a8ad04c1d3109e0a25483065e8754514afc1b8ba66281fc9bef0d70",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_system.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d4d49f789ebd0d32f320de95e7af66d485eeeb8e5109cada3060fef93c1275f3",
+ "chksum_sha256": "5b02071b7e6565bb89b831b634706b965d2313174e01c6de7cba76af3866e65a",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_city.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b25f28bc753edf969a1c1765b55ff92383dd1908e39164b3aba20d812cee557f",
+ "chksum_sha256": "92da9ffa999e3d277032a521c2a841aa44dd0432d9f93ec6a784ba40875a1289",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_ipbl_reason.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f93f8ba457f731b06923d6fe9e12ab2690e00b5336843146eae5ec3ed6b5985b",
+ "chksum_sha256": "17ddf962b7a23520d9d94208171d4d927f73fe2119476de940f1a0f006cadb1e",
"format": 1
},
{
"name": "plugins/modules/fortios_router_bfd.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d6cc05bd092d0d8d22571106b3fb0290aba3a47909496d504a8b52008d484ce",
+ "chksum_sha256": "e014a58323dc921aa838b7f958380054eb8579d88cae595630e8730877eb901e",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_managed_switch.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4c53ce41e84059b415fa51fbb1f60c98ce841edf27a62e898cd1e9e01493a450",
+ "chksum_sha256": "64690c3d3b2df4a7adf8fa2b9808ae30e3dca080cee9361bd8624edd69500eb5",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_options.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "99004fc3b349dcb77ff1b1bf021b24e448cecd5ba60dc822f64f55064a8c2ce4",
+ "chksum_sha256": "02f50e814fe3eb740c95a14cffe4e327adc7404f1975fe3338be479fb9e8b6eb",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ttl_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "128508d50f79cc4a8ed10e698aedefe8b2fa857a21feba2adc06e2278a57bea8",
+ "chksum_sha256": "8f3303bdc589ba1bc96179297cc02e7bc0ad1fd8384e75543f7082f9c01461b8",
"format": 1
},
{
"name": "plugins/modules/fortios_router_prefix_list6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e5ec88a17d26afa1326d68abb5d13a1b9899bf6dd10f409bda75635e59b24861",
+ "chksum_sha256": "182722befb258a6f247ca76d1b61ed3788787ee4092b326e5931e8909a416b66",
"format": 1
},
{
@@ -1026,350 +1026,371 @@
"name": "plugins/modules/fortios_web_proxy_forward_server_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5dfc329f5d66a9d6f8cb3ae86c8e0c8bbdc29ceae214da06c58f3db78384caa",
+ "chksum_sha256": "0148c96446db7d260e0112a2ba1f38dda6e27c75f63136ed3dd0984a31914e80",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_ftgd_local_rating.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b19184e98c766ba72d919cd6afd9f6631a62cabd29eb3d0b2057db5c49e7a19e",
+ "chksum_sha256": "e48817c1a64c8d736aefc37f067bd6a7a476b2481d666c0b8360f1802b67d3fb",
"format": 1
},
{
"name": "plugins/modules/fortios_user_nac_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "122868c8a4dda398cbe50fd5bf5db1896d6113471bbb2660911394dd7598e3fc",
+ "chksum_sha256": "cf49536c0855328cfd3134a5f9b77cade4ae4650a8598812fe027ec0dd9fb411",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/fortios_system_npu_vlink.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8c7e8cd2d3629b72b14d07f614657fc293dc8e4b6a61da0d1e640647bff54115",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_wildcard_fqdn_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "06af7a37cba01f9aef1f0f262aa754ab257ca0e57ab856645393aa7b1f0c5e8e",
+ "chksum_sha256": "24d35fa834afc32542d92701a0985bfefec95145d666b824ea20ce2d99e13b4d",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_bwl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e93886f065e79bfc18cd23408f56fa8c90c1f7e72faf17fa6bf2beb837564347",
+ "chksum_sha256": "742083fed80786f9f1b0189742453f6b20901e9a9b942e9a1f05b9c8de4ed478",
"format": 1
},
{
"name": "plugins/modules/fortios_log_tacacsplusaccounting_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f1ac9284841520d9a7c56801cb7b1f123765166c8dd6e808545cc5178fa4a7d5",
+ "chksum_sha256": "46ab28693ffed9df74398880dd3ade82d765bea5957104cae84d3f99297614f8",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_iptrust.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ce82ed813853a8ab0e6235ef90bdec783dc55b09321d115af91c5f19705047c3",
+ "chksum_sha256": "71dd1cf5901a97ea4411addf38e4d27e1d11d4b07707d9a11fcf563d11ea44a2",
"format": 1
},
{
"name": "plugins/modules/fortios_system_auto_script.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9a591dd1bbebbacea4ada9d91b36ad3e4ef484ab73fcbbc53a6b7b451c7e8b1e",
+ "chksum_sha256": "5d6856facce0f42e881760ee6c793c9fbbb41fc55a1acbe291371395f6dfa747",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_ie_white_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e917a5569d5393c3ac87cb296c7b40f5ca3a673c4f9ca8ef449d9c90ffb01046",
+ "chksum_sha256": "3ddd54b783764d573bb66dadf8bfc2b3e9d75333b690eefc947eb0222db7c1a8",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_region.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b8377348945fc2e8b60f51fe73cda50737e62e07f7d5b44a5dc50c225bf1ccc2",
+ "chksum_sha256": "24a70c4d3715c932c1845820bf18e87836f9f26b2fdbbbd808fb61315311f920",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ptp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0ea0183fe6ca1ca560b6c84d18caa78d592999c3ca11245a94c6f05f5ad8bb48",
+ "chksum_sha256": "a520b839c55407fb3e5cf617ded46632b04a9ce9bbb2d6d6a75e9dc7cec3e03a",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_acl_ingress.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "586948fae811cfe86bee22377ef0f33f843786e549a8dfabca44f8efc6d656d6",
+ "chksum_sha256": "a2d23c5c397479bb8d71225e3ed58e700a6c6304bfcc76b60648077e7e2c1a95",
"format": 1
},
{
"name": "plugins/modules/fortios_router_ospf6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "92cd9bb7cf5b80e6c1f05f3365fe3f4edea5101c8612511b0459e753f9e7d930",
+ "chksum_sha256": "81776bed1b6270f9d5421c7d7efd64a091f8798b690333f361101fc0d793a55e",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "58fa717265cd45b28dd732ce3882893c9e771cf1b8ebbb7e3744c8eef089329d",
+ "chksum_sha256": "eac53924fb25a678e2e9ba8290d55257b0440ff670a52a8b320d599dea90085a",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_address.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3153aefceb665737ebb7a9135b52eb795e7551fc03ed4de6465d96f441c2667f",
+ "chksum_sha256": "4c5d89ea71d7b132547f7060085769087c5ece22b71e9625ceeab549ee0bcadb",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/fortios_vpn_qkd.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f3f2a2c78e6c228a51a97e66ca7ac610837efc994beaf89a976397874831e7a6",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_fp_sensitivity.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82a9825be1f77ca17a2c99d28712a8e27c5c9db375fdb4260140633554993042",
+ "chksum_sha256": "919ebe6653cac516c29a83614cc86a7031c03401e60dad658c0043c94e1d8b7a",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_fortilink_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "69652c3b605995360642f76f55c64dc56ebbad048d6b941fe2582d6d402adacb",
+ "chksum_sha256": "b50b213b50a5e1ef700a16b21b3eedc0fc45ee85bd128465c94b3c14790e118d",
"format": 1
},
{
"name": "plugins/modules/fortios_router_isis.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0fcd418670df84b6c91806dade8188aade2baaff96b8875eab20a16779171d2b",
+ "chksum_sha256": "7c965048b86913ca469da1c81933d63b547a3eeb1355ac25cfa33789e3254aca",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ssh_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e2ef6349523a30add0b189190f32b2b9eb4130f19bcb9d32ab2150ba397659d",
+ "chksum_sha256": "b6dad011ad9b65197d4b0694f8aee31a5caf9f5b1b28fbed31dad3eda6584c9f",
"format": 1
},
{
"name": "plugins/modules/fortios_alertemail_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0e9d0175c43d321b02e2f308e2682624ec03430c5002c8dcaf922e76ee8b1edf",
+ "chksum_sha256": "6320ad7b198adc656a4501aa7f2d49675640f2b25fc2262dee684e0f0ecabfbd",
"format": 1
},
{
"name": "plugins/modules/fortios_hardware_nic.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f89fc8e66dbbb25e1be01797f04479de4c7b44f897ef16c8f4709a2f06be3fba",
+ "chksum_sha256": "1c7edfb33cc96ddc6a5af06d06c83aa2667d81b647453c8a6ba861758fe36ab4",
"format": 1
},
{
"name": "plugins/modules/fortios_report_style.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9f2b1a2c5ec2158589f9c883f7ac3b81dd5f951573c6be8f3e521b9ecf0cd5c8",
+ "chksum_sha256": "a03d9578247e6a5f6219bcba819f3bd3a6fdd5dbe50bb4ca5a9a337f1ce3f3f2",
"format": 1
},
{
"name": "plugins/modules/fortios_system_autoupdate_schedule.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "900f4cb3c1ead3d6805ab5699ae8da26f4fa987888e38e5b1fcc5a119bcd54f4",
+ "chksum_sha256": "118336e0b3b79f2f20677b8bf87d27c0d50791d0c4f3193f0c32293f2998a38a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_auth.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c4256ec4f451988ee432824dda8941ca0cab31575706e929524d0872661b51a1",
+ "chksum_sha256": "34af378cb292d7996e27743e83f8d935cafa7a88b5a598a136db1248f5886d2c",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_multicast_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "208e712364f436af735538c43b48dceefd4869c57d43bf86e771d9c7beaac91b",
+ "chksum_sha256": "cd32c75d15324214e63b7beacc3a1191694cb542061318aa362abb6c7ec0f593",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/fortios_diameter_filter_profile.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "cd41ca526f3bb7073586815c6188f8688f36aed139cdf4e7222a5423e9514f17",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "887a964146cd919a7872e4fb0e477143ecf61b6a287965cb746499dd5220c4bf",
+ "chksum_sha256": "e0318768b5da5f8b96e78d53a452a1ef39adb41b3a3695c8e3fdeb8ab1500376",
"format": 1
},
{
"name": "plugins/modules/fortios_antivirus_exempt_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7740502d84fda7e39888eaa89055f05debc0d068aab9bf0aac553b4ebdc0ee93",
+ "chksum_sha256": "a5e2acf8b45dedd1fcac41c21625d1e7f50720680ae5151586f04bda5b21ec41",
"format": 1
},
{
"name": "plugins/modules/fortios_log_memory_global_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9a052b19104e2914510a711e3ba891d2834cd63b1049116dc7e7d076d72f51fa",
+ "chksum_sha256": "44198d8c526f1c5c85ad716e14448f7006010e698dfbdeac2865b3f1d5278e7b",
"format": 1
},
{
"name": "plugins/modules/fortios_credential_store_domain_controller.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f0edccf6001c3c8a88851169ee7c0880a14eefa441d4b8a60277ca49d0a76d08",
+ "chksum_sha256": "e65f5ab28dd84b86e5968a3a132af672e3c3074ae6df5805d09b469e94847857",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ssl_web_user_group_bookmark.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b4cf8ca1e7db14de1ae0785167dcdbee29249c60179446aa87c1be86e812d400",
+ "chksum_sha256": "0f28542d6a3e20c1d27072a728f530e4f8aae5c794ec120f0ffc0ddbcfdccf0d",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ssl_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "57cb6b6e7063a98a59e28a1951f2b829b0bb4ebca531e2942d804336f3ea1996",
+ "chksum_sha256": "29c3aa9cc072e3592a0a14938d189dd18b9ad987930a142f25dfd8877ec4fd71",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_security_policy_802_1x.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cb44f476a5b5af6b461d7bc0bab94c57c398102a3b2d624cb7a11bc0539bbe25",
+ "chksum_sha256": "1a3b99831b4d8126f7dc63203c216edb34a9f777b22938e0d944a3d879ee8221",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_security_policy_captive_portal.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d8a63e5c520bbc246c29d9694112cbe8cbddcec43294bf08cb7a086a8d3a832b",
+ "chksum_sha256": "bd1b25ed36a88a507f6d75e1a6315e44b47ea90b2bf3c269b4ab85bec8aa8c67",
"format": 1
},
{
"name": "plugins/modules/fortios_file_filter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7ae523221e52bd4cf4de9733333d882dae1e5aac74fc7113745869fc877559ae",
+ "chksum_sha256": "181bc0f78df13d4283b6697d549ad4930682173943dfadf366e41735d94402d4",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ipmacbinding_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb1f7a44746f1ecafb93009fc4efff1734fa0c38223baa7e7c7761990eb211f0",
+ "chksum_sha256": "a224b361d9fc04a00eabca9088bb7b3acccfcae89ba5cd5b8e8518414a7c74ce",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_anqp_ip_address_type.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "783a62729d382d2ee3c63813477165bff855f53a4ae828b47a9c2e1a8d87e7d6",
+ "chksum_sha256": "326e9847718801f86490a6a0f15155392a73499187cecec499aef69a3ea9fa76",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_ie_allow_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "143aac32f0ca451bff0e5857e3b836db13026d581e93fd8d3b78064e6e38dfe1",
+ "chksum_sha256": "30658bd15919e1ee812c08a4a5bb2c2e651a3efafc7159d3f0ac6a258b219a83",
"format": 1
},
{
"name": "plugins/modules/fortios_system_session_helper.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c45e73c453f4fb51e175de6a501c5d342290f0ec973058e44aeac08c10537e56",
+ "chksum_sha256": "9b886a6dcbbd4b4aa5253324d34d6958e46affe30cc5a1a3d8dd9f03f92bf966",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_wag_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8dec8c7399c6c3ebe8a7970c0bdc0b27a333a99c990a2dfe3f05801d90079499",
+ "chksum_sha256": "6f1ecbf39a7ca907824981254512e5010d2d1065150ae61a6eefff6ab4d9437f",
"format": 1
},
{
"name": "plugins/modules/fortios_system_affinity_packet_redistribution.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4cd6aede5a3cf21ac7cebda43895ec4dfd9642edc4da7e727a824cc681e0c975",
+ "chksum_sha256": "346c11a2d85e7e3f981cd739446cee1dfb687f0215888112c4f7504f998eee01",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ssl_web_user_bookmark.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3863ef18f696db2081562d855e8ab2239f889d6040320a1ff904775b2bfe96ed",
+ "chksum_sha256": "97410a87dc7611057107e3026946a61b231a071a330fc5a7b10eef55a1bc4f5c",
"format": 1
},
{
"name": "plugins/modules/fortios_system_custom_language.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8417377fb79c864a1a2e302b9070852aa80b6d99b665ecaa06cf2f5aad96df93",
+ "chksum_sha256": "597ade28b627548c02cf0ad4dc3654d7ef434564eb9612cea8dca80701a3b50d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_automation_trigger.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a256a2e473acb57d1a9d72f75c00113c3dbd4cd30ef8201faf99537494256d4c",
+ "chksum_sha256": "b5f336f0692e45e555d28176f295b479278958f5616b39745600ffcfd4ea7d46",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ippool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "57c444528f4665273e50c2e3e10de656ad7177ac30ce052df9ec2bac73e09173",
+ "chksum_sha256": "a18dd1898e22ef0c25fbca209625366ebe34ab6d92cae38f3218cc2bc1fc32a5",
"format": 1
},
{
"name": "plugins/modules/fortios_system_central_management.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "decf0d64134ce4899ad7b7febf75892f9d9edb7f9c1b83ead90f14f89b913d76",
+ "chksum_sha256": "6ca36e055aed4f7393b0b44fd0a231637b7043f47aefb72b1372dafcd826c6fe",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ssh_local_key.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "42067dd868c794ec8be708f40e629807bc52b62d3a65c8b87c49bfb854981acb",
+ "chksum_sha256": "dabe5f157a334ab98b56d143904e9bede29957920779e40e94d959a1f7a8532e",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vip6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "826aa050d5242f637a7f7e5becaf3e322f0db1d0af4695a83ffbc71a36cb0c74",
+ "chksum_sha256": "b15db0a73d5d488d4ee5a17645edc2922409a8bedff8e083c584c4e864ed0008",
"format": 1
},
{
"name": "plugins/modules/fortios_router_ripng.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cf34dee2fd1da4d231f816bc5fa5b2261e34476571e360ab308fffafa6d4a3eb",
+ "chksum_sha256": "69cecdaacbeae322f00eaef9b8b50a5e9e28265324ef17f44b6a039372a9f466",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_anqp_roaming_consortium.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d816b1be406ffee4f6c5f692e4a3dfd26ae269dad07be29edfb139dded6e7cbf",
+ "chksum_sha256": "a3f9c67b3a04a309ead2f475342dc58c817f6da853d86b4effa237ddcf4e0057",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ssl_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9011c1e5f487d829012ddd04f510bef57338d8ee2df629ac4c65bf7ae902f573",
+ "chksum_sha256": "8589c9fe9edc58f119e57348bd6793212aa666b4a8c54c5de53ca4249b3ca0e4",
"format": 1
},
{
@@ -1383,1365 +1404,1372 @@
"name": "plugins/modules/fortios_system_replacemsg_nac_quar.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "902b0e7ae24c6b53ab6572f0c61e4a32b8c2a6b936579651f4d938ce7cef8122",
+ "chksum_sha256": "01170b5c04cb489d2340e0605ac5176d4cc99276a44ad51735b514a556933f40",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_h2qp_terms_and_conditions.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2acb9b4f74d3e26e7b7c11ccf2165d76c884b30e4696048a565807a562de34f6",
+ "chksum_sha256": "78e9a426e7d39ace052cf67ac409ae43bcd948d42ea7c46ac9234671eda6c7fa",
"format": 1
},
{
"name": "plugins/modules/fortios_system_nd_proxy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a8c8ffa81fdfcca35a8ed4b9a711d0f537635348cbea93c3458f303654ddf9b",
+ "chksum_sha256": "a381bab05c2f2949854a08a90e8421c6fc08e49dc52d7d1a170b382f4d26f6aa",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_search_engine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a397ef3ac5fe72ef99975b9b0002c758ec8985a77efcfd4c88b79afdfb917d4",
+ "chksum_sha256": "e54976ebce40bab2c44fb152fa42cc6a05bedbfd50fcd7bc40a6157b8e4f184d",
"format": 1
},
{
"name": "plugins/modules/fortios_videofilter_youtube_channel_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3475f5100a23f5838e2f4f2e00b43a5f921da4d74d486608e890afdccdad855c",
+ "chksum_sha256": "f96ab954ea6e9354ade13ca329868fae9b5cf197ccb2aafb7af8944325760c61",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_custom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c4941abe49c4b73b1aa61f6641177919b13bdf8bd3dc4ea34a5a0f8b13fedfc",
+ "chksum_sha256": "1f9ac0dfd9941ed147c61f2747037a2f1a398c9ae806d81d88c9f69048bf7405",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_rf_analysis.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "299b5ccd12d3579a1ddabacf6599df1e47b5982ba6ab8c3937d94e36071f0cc2",
+ "chksum_sha256": "37d9b6d6982a82f165a8b38634bab8d727b9c8aeaa8ca9deae26c80f72871a92",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd4_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "26a57975f3895079d6c7cc2a10e93e832a9627f5337c6a7d4cbda17bedf8e172",
+ "chksum_sha256": "0ca48a40c130aba048c8ae6204c1f8c4f3cec0c4fda39645ea5c7e343ca936d0",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_local_in_policy6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0cc5147b88c31f8ee1cce04b3691375c162314b75ec68fcc5fa2219dae383c60",
+ "chksum_sha256": "5589af09c9c8e71f5005499df022c19a368b09532ec124c74ca2bf5b5c20ad99",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_mm1.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a1bc847f33fbe26b1ca34b5de2b8f2f168068cb14c69a807d3f23b4435d13567",
+ "chksum_sha256": "9f7332d7fc10e806fb568904e91ca34ae2f9c980d025f1fc730d3ea13d512932",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_content_delivery_network_rule.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "85df28da6f1e52811e3ca51e6d1462c15f4eb3b2e890c38c5e9ea6dec4304223",
+ "chksum_sha256": "165991a4819631f73465a91db5b28e8171374b755dad949f2c87cdbbdb4c6a5a",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_global.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c82ec778c4b098e9c874db9e6bba11e27bc28f1b8925b33e768ea2135706881",
+ "chksum_sha256": "f527ad98a8656cfbf0635999aea87371957e052c350bfe8e80efb1f6ce194704",
"format": 1
},
{
"name": "plugins/modules/fortios_report_layout.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6d37df914b8036c01dd5be4781ab670e50f5fa0eb5de4557e63943b149ccbef5",
+ "chksum_sha256": "7569c55cdb4ee61a776e5cff4fb7cb8ec2e4245b5e8593327bdbe7c76655ccfe",
"format": 1
},
{
"name": "plugins/modules/fortios_log_eventfilter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cee0e4db54df8158c9de8d6deec85d1cb824d46594457405781fe9a6bf69515d",
+ "chksum_sha256": "a371ae91931cc795fa28dc09c81c6e44596421c15570223a44dcfedbfecdfe28",
"format": 1
},
{
"name": "plugins/modules/fortios_extension_controller_fortigate_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b072d5b1887957f088e187f8254206e9001f7a8354f82943ecb8800c1b08f0e",
+ "chksum_sha256": "07a087918b7d5063fb729b34478366f7fb86cf590058bd889c5e8d1fd6a25a2b",
"format": 1
},
{
"name": "plugins/modules/fortios_dpdk_global.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2be736ae79e2d71c8a494820f4e94b7cea94864bd2688fbb95e953447d10f9c9",
+ "chksum_sha256": "10b3a5b2cfc8e17242e007a0f20fdae438d70f1ee63075e8eb2e90afbbc9d20f",
"format": 1
},
{
"name": "plugins/modules/fortios_user_local.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ceb8e0350d1a4845e3a09b44e6d40d3ca2ecb8649f87a4fbd17500d62d7d3054",
+ "chksum_sha256": "836b2d829435547ee9c437b9b30b2bae468f5a143d7b3bcd6a18bc65acc528ff",
"format": 1
},
{
"name": "plugins/modules/fortios_system_auto_install.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee35dce8fcf95213214b30ddb9f9e55b0b0d0e5455d8c8efd2b3652eb1d85560",
+ "chksum_sha256": "2a57bc9278a8ce7b689e33e2e6aa7f2ca20cce5d76cee0d58e67712a74c1bc06",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_wildcard_fqdn_custom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d203182e20828c479d4d5b4c8a90cc54f9bd0e218664be02197ff0022895dc84",
+ "chksum_sha256": "efce750f732e05a68385a4c080e1ff8a6780c44b090c9d66dfaaea29a44441e6",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_h2qp_conn_capability.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "91a03eacffa374c341a1e4d0119bc29ecfc8a7f0c32e7892b9d2d75f8db5e7a6",
+ "chksum_sha256": "3846b14505a0918d5f518a149b88809f0bd3ca37b400449f3ad054e6d76c5107",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_manualkey_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea99c9cd124a91ef1a4d93d51462b920acb0bee94d36c8a1834577794b5b7749",
+ "chksum_sha256": "d5b22f4b64c8c6321dcf0d4b6c686acb2dbfb0842b7d0d0b6d1975715832dd70",
"format": 1
},
{
"name": "plugins/modules/fortios_monitor_fact.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9d5dbb9c5c968269e7389e681f0d99cd9b5348338bda942a6eb4e34d5c94a9ab",
+ "chksum_sha256": "26f2865011183343d9e7e824ce445ef3e0b4d6c4e685074eadfe77ab82421345",
"format": 1
},
{
"name": "plugins/modules/fortios_router_static6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "823fe5fadcb1b2b15d66a4570715bbd10639d44c8b18018a18e294d2de6badda",
+ "chksum_sha256": "ba46ee581e53e3e140800e78809a83a6cbedff2a7cdfb72e1c8addbdd53a5ef9",
"format": 1
},
{
"name": "plugins/modules/fortios_certificate_crl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9fdbc154d18117a7e4608851cebbc4b815d47e73b51990b961363f051c15ac4e",
+ "chksum_sha256": "c5ac5310e239186994543c14a1065feb026ec751b96c65470818f755621cb24f",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_switch_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f0ea02ecdc5cbfb9203d6f387a16321392b412a6892844c71000047c83027bb6",
+ "chksum_sha256": "560130a7a7621b8854af4c10ec287b05863dc1595ab454fc88dd9808428485dc",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_network_monitor_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b4976b74f49b0af1e070b68b46c88a5e303e76a55f83be92d1a962652daafece",
+ "chksum_sha256": "5835c583ad3b3f1587e79e7293ee5aa218e8059ba46218c7f1e3377184edd3e3",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vipgrp46.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4b6ebe842c94a3c46ec3c50832d59a7f8d51e10316fb66b76c6691bd49c9c1aa",
+ "chksum_sha256": "d99f8a1b2757fde44718d8403a1e65aa1b4e13412923deb300f9b100052c5dd7",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd2_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2f97249fcc3df8e80218322b6122b85bcac9633765d295275dbac61daf064f8a",
+ "chksum_sha256": "3e83e0f5e90089bfee83750546e7976b289ffd3cd37e419248bfc172934b6d88",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_bwl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "40b97634abf021998342a84677563edbeee01574893ddc9edd33914fa48d6764",
+ "chksum_sha256": "a81d13ea6ea09cd4a8f58f8ec7202f48eab347628545d4b8f4f5bdd4fbe6c89d",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_forward_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63eaa68d29aea4e25a9b50cbe3243b50d2ea4e2e436d3eefd256ae67abfe42fb",
+ "chksum_sha256": "2b4ce5e774ddc58bcfaff1515622852cf06403044e0eddbf7e200bd6a5af0bdf",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ipip_tunnel.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "377a2ec480fd6b315536c3ab70cb4b8fc45e5bd7a2098c20d94edbf7e3f46226",
+ "chksum_sha256": "a6347914c112092ffdc052240d2329694d7dccbcc6fad8993bb473f645d83a8a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_geneve.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b733e960815524fe15ecd9cc9aa69f5bc1497448624364bf24b6f248cb5bea0",
+ "chksum_sha256": "e3178db928d48a330df8444a86cf7a0cf6801012790618823b4d17cb51cf570d",
"format": 1
},
{
"name": "plugins/modules/fortios_dnsfilter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dfddd11239472156435ffdbc5cee850fa853e66e35d5947bb29b79c1b4d3d507",
+ "chksum_sha256": "a477b8707b3773d19d7ef1bc0fe0a6ede6dc1724bb38fe696f20cf379208cb67",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_inter_controller.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "36add1a597f71905659a9e77c2ffcdbdf73ff7b2975c994c1eb6f9dde51a9707",
+ "chksum_sha256": "b28b02c9130eafacbd0cdc7508700bda051ce4403e5efd2c0185171c42d73945",
"format": 1
},
{
"name": "plugins/modules/fortios_dpdk_cpus.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e77eda04d82df4f85a7ff361da311de00740d96e2a3d9eaf7bde9c283701b304",
+ "chksum_sha256": "0b68233d25a64e2b71eaa7f0200ac6d6b2fc67c61f539d03ff8408378efcdae0",
"format": 1
},
{
"name": "plugins/modules/fortios_icap_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cb8d5431a8c795f83fdc2b5eddda09f7653bf60868fa0c3ca058185bdf89c8d9",
+ "chksum_sha256": "d1d980263dfcb035d07f9adf315918176bf7aeb85aad593eaf6a2d14cb7ad726",
"format": 1
},
{
"name": "plugins/modules/fortios_log_disk_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "17cba6643e9cc06ec7e1ebab0f5bc84b8c3f9eb630b59722fc8e9b2b12897aad",
+ "chksum_sha256": "e3d63de1d1e2cc9d77ac868453942bb7b64639d02f8a7589a7d1af7722f7d283",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_vlan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "710b9030c1f04a47e852f1d654430525594ebf65e9e50205e92f62f9846e7828",
+ "chksum_sha256": "8aebce3cc77393e87a9fde311b51981cc53305f3eedc6b68b5b01ca0dcc37d52",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ipv6_eh_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7cfe0ea64bb7c42127e7f99642ca4967925e74263b469b0e0559f465c8e57666",
+ "chksum_sha256": "4729a7b3bda8651c7e9360536dd825eec049d0e46cb6438a1b73374e64ce4436",
"format": 1
},
{
"name": "plugins/modules/fortios_system_geoip_override.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "46ca8e6e7da454dfac0790c508a13313da18c586f9bd22ee4f981f402e5e0cf7",
+ "chksum_sha256": "f098f0ad04727c939e25d8536f00a7aea10698a653da5cf8bb684dd2ec0dd307",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_mms.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "151589469fac412fa116ed330986165acf6fcb254a4ffd5af399620b8e136a97",
+ "chksum_sha256": "f777cbb56c93a0335abd5dbfb4253bcaa7571cf6c73536e1f63cfdd25bc56780",
"format": 1
},
{
"name": "plugins/modules/fortios_router_extcommunity_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a4e7e77d228aaf300fa718360ec80a96ab6a37f4ad78884b855633158db4d20b",
+ "chksum_sha256": "699dcd3964336ff20d51a0a1a7361d63538ff9473fd23b39a8866bd36726109b",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_lldp_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5a717b33b8e04479cd52d40955a6f1cb4397825bd9f1f08cda7de2e806cf5ac2",
+ "chksum_sha256": "74428341c5a699cc9c5a342f812c4bc5ed0f5633d00a8879c0ffe96d85a6b935",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_mpsk_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "88643f635212cf4c222ebc9a013d582acef2d00999ec41ca38914447244ef1d0",
+ "chksum_sha256": "1feca1fbf44c2c3334caadc52b3c31de07cac12c7e5611c3d5dfd70c3528ae62",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_auth_portal.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "06b1fcb3ebdecb93f6bb34adc96aae3210df54545cbea60328d5daadbb8e2d52",
+ "chksum_sha256": "2459661b5f1422c07a49bdf17b7d1a29d2ef40ea0f29c2a4e62d391abc2f3aac",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ipam.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ee810529dd01c3a4014ecfa653f1795f1658fbf888ca138b6b89161a3b0580e3",
+ "chksum_sha256": "0335375f75319521c490404bce8c49bff5ed9b7755199366adf6a76b83f302e7",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_phase1.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ed819ae6c7cb5d0c5593bf6eadd9775a6189e9ed98b02f92efe10c1227da4a2b",
+ "chksum_sha256": "eed4f908f3f0ed78385a4fbf2eacc3a16dfa0690fcbedc6e26288ff573f0ef42",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_content_header.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "44d6ed09dd247266d6365bcf7d9e6b739c5a462d05feb0cfcee0b5034b417abb",
+ "chksum_sha256": "8d8b16ce6022261dc7ea967af15dec8d9ae91fb41445d72d04ad6699b3082867",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_sensor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c6e5b4c7bf4e894d4e125f05c03de3bc3a0fb5f12088cc2c3d6379600c6606c8",
+ "chksum_sha256": "b1559e932964eb3ea70037f3e83b00e618bdc03381039a2d72aa018c5e7dfd73",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_apn_shaper.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d691bbe89d81b45178af60ea53f05449300c0470bb599abd853b60a8bb8e034d",
+ "chksum_sha256": "cdbee99573b608551d15852d8e78a7317f175025e0c4b77e51b4052eab7faf7c",
"format": 1
},
{
"name": "plugins/modules/fortios_sctp_filter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "204360fada1efc486b094416967fb44f23955309c0a107e0215db4d2a4b76537",
+ "chksum_sha256": "9bae1fa8e6e600a7e86e8ca81d8faca59ac4877cc7c99f02fec3034513e252c2",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_alertmail.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d0cdd3b29da6ee8f2ce4b64f62b31a9c49e5cac0a2377994996acd6592c2af0b",
+ "chksum_sha256": "a7663bd69187719cebef069757407d513ebaac73bcd2f1939fafeb87ed9b5fb2",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_arrp_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6cb46f577272efd29b0b7dd602e2dbe2da513b1ab3bd60a8f8acd6d3a7fa9ba7",
+ "chksum_sha256": "db4962b2799142db25ef0c360301f4c0c696d5c2e36abdedb24fc84896de8cf8",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_hs_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "86babdb059891e23e66a8c2c4a9150e9be7c7fea69a8b127ddca88ad43b382ec",
+ "chksum_sha256": "07407d86bcfdfc95dc4a98bfdf3eb3499e60257f2612a0b84e4f3d300c9f1480",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_device_detection_portal.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "295e85f128d6a10cf5a2fff65ca0454433ebf86372232dbaa011f6d0853ff308",
+ "chksum_sha256": "4c75035d6bf9c18ae6d85f21ab9a9389aa9a742978634af24bcffc337ab37b2a",
"format": 1
},
{
"name": "plugins/modules/fortios_router_route_map.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9f175fd2472701939e6c4756105333b2a8c47650e2e2da039011dafaee3af526",
+ "chksum_sha256": "2cf0c99469a8e3c5a9f3c6d4d014e493d0bb932583a352c739db48159f94f748",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_decoder.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0300046bc90864d6debbba284907eb89d2ba78dfe55ed132d8009eaa50f639ac",
+ "chksum_sha256": "e7e13eeb452384b0d01806eb401e55b8ce4456e9aaf33369ee71b41dcc9cc96e",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd3_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c7951d3e86caef295358336546d6dce0bae2656e5a3a4c95f9d589867457eef5",
+ "chksum_sha256": "ddfa9e5e845b919144b7e33b7bc824e92ac59cd6663fa64fc9be8b188529830d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_virtual_wan_link.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "226753943cb758c2e915b0796dba194e5fb9ded9d3c9fb8b896c274f43c9ab80",
+ "chksum_sha256": "0f4ce79ead4a3801a331673fbe1a8dc6d878f58d46e1112c5b1664a652e9cb70",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_dynamic_port_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e595bb10bad8a0c0a3c71577138989d372f00f164aa38c1cf6f65c3fdeb9c5b",
+ "chksum_sha256": "5a7ce327a5dd51d3bd1ff82e856e0eefedc3fae9a1255f8ae1eb4d27237840d7",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_bword.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "10a4c008887c9fd64e0f5744165341f21f279cea04eae5a10ca626a14730bae6",
+ "chksum_sha256": "005f07d50d7f2894dd084d0e165dd9b7929cb7210256227e8d5973a37437ac3a",
"format": 1
},
{
"name": "plugins/modules/fortios_nsxt_service_chain.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2fc37326c994d6856a97db6c2465156f8b6616d1a7a9a284eaa016434ec2a328",
+ "chksum_sha256": "9022483a3997900262d2014ea4ce242d232e67dcfd96ada5a5ce5b1ca144921e",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_traffic_class.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2cd5631bd359bd9457a745b36ecf087f4a96d50a2fa201c5dc86d053ba2828b3",
+ "chksum_sha256": "6961a2eefebcdf0b0dc56813a5760bcac362af100080e800f5b7a6971e3cdcdf",
"format": 1
},
{
"name": "plugins/modules/fortios_extension_controller_extender.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea2ed96c7e747f545549672f9c028be9b199ca0f57ff8c8e07db7827705ad2be",
+ "chksum_sha256": "03d7839a45f47093175f04ac45cb02b654cc842be24896900a8c5866e364b252",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_network_service_dynamic.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7d581f8549fb02a0893631d60f501cf5fff41dc17c4833f3ed15ab73a8222bd8",
+ "chksum_sha256": "0035019e241b278177a2747750fe6effe506e45e80810685e6e5608c4df15ea2",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer3_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bd78a3ea1032540848dc3d2a723b239c482a5ae590919c282a885318a5a3b357",
+ "chksum_sha256": "16cc561a6a735e7e2945e7bba3dff4e86ac3e09210572b503316ceec080e7e20",
"format": 1
},
{
"name": "plugins/modules/fortios_log_disk_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5ce70adcbc97c84ac655b33fab673f7c85ab591a60e4e05b12922ce75e12de29",
+ "chksum_sha256": "082f31e040171b1cf5b6c154964db7493c5490b4d2532a16bfede894e71db319",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd3_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5550163df712d50a5bfcdd8d77bf99eff8e9616eca29c18d9d3ce0ae2872fb7b",
+ "chksum_sha256": "e57501c28ebabf0bb484d3fcf7b9607a9f461893ccef7adddce8afc8cbc7b16d",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_initial_config_template.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b39ba7cba6db48b173592b7f4c0dcd5548de4d463f3521366382ce9f2ced3691",
+ "chksum_sha256": "33905c808907330075479c2c0deca707e70c8d93650b01b2f9f7a7c62ece7877",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_custom_command.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0792028cfa29a5022f3dfebb8147e1e81baf27887031eb5ee21ba8dbb8697c1c",
+ "chksum_sha256": "e3a5f6faf01e1f855c11e72a3771fd7465be72f6492bf1d783dd0b12c56b98a3",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fortisandbox.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea3a296319c341addac9353de912c8d4bd8294217a04061057b17a06f8b827f6",
+ "chksum_sha256": "34ab6a97502e6190124b6c8faf61a64cc621da6f4f4a25fb25492ee951a7d738",
"format": 1
},
{
"name": "plugins/modules/fortios_report_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d8171d215918f7b4f6a83e2f467fc34306dbbaffbe50e1cdbb341288db50a6c5",
+ "chksum_sha256": "016aaaa28bd6485a80df93ca8c62a4c5d03e23914ce4617cc2b7f2e9749012c7",
"format": 1
},
{
"name": "plugins/modules/fortios_system_performance_top.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6304487479cdde57f6c37831f5956820409aebea61effdfc2527002be091804",
+ "chksum_sha256": "cdbb838bf2cc82137765b49292e800d3cedf41300ff3bc70939412e6bdd03e9a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_network_visibility.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ebc1f584cf9a6d75199fe0c605985705672d455a0db74b1a8baf8b5ce1e01b47",
+ "chksum_sha256": "ffbf2307e811c676ed8cdb76c26d830c629d836511fb15fb73dc186fb200bc62",
"format": 1
},
{
"name": "plugins/modules/fortios_router_multicast_flow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "01adb9080ad7710b8dd360fa2cc60f7b20f7fcef0e4b4a51fa321bd07dde0286",
+ "chksum_sha256": "dcf0f693883102a7f8ffff0f9136e457c84186e61518e0a0a6b03fdc587b3067",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_snmp_trap_threshold.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "384783d2589e4d8be91e43653373340dcd81b175755066d61147401ea4e3bf8a",
+ "chksum_sha256": "37d661e0620580ac08aa062634cf7e2da7a386cbf8f3a01c8c1061f74a858a2a",
"format": 1
},
{
"name": "plugins/modules/fortios_casb_user_activity.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6fb6997820803f397133b774244cc1a8cc4a768dfadcd074fa04d1d7bdf3cb6f",
+ "chksum_sha256": "ad1fd99a28c2f7e9acf80f4f0ce3fc97ee3567fe5d765562c2a2c441870db2f5",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_access_proxy6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f690964f878c0ccdb3834313bd2dec30ac3b58504b275a0611b2aa821b67448",
+ "chksum_sha256": "cb8146e6e3b41f142824f0381446e81fa93cdbf099298281c8739d56aa09f9f6",
"format": 1
},
{
"name": "plugins/modules/fortios_system_autoupdate_tunneling.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c524635762434d497f8bd29627dd8f899b40a7fd67a34d035519c6deaf63be62",
+ "chksum_sha256": "7cfaa41b2a8a715ac6b11f62131faae85514af3da017b3a125a1b51e8f1c360c",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "477f6d652fc419a859cc58512970e1029eb55d5a63e1c8aa2fcd28925c7331c3",
+ "chksum_sha256": "486e9decede451afba97469fb3a625d2ad4199e10c29d79b0995bd3e80769005",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_mheader.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e46123db274fd5f1d3c0df3e085ebdc8f4e8c5e10aa5dcca18cdbcd91699ef13",
+ "chksum_sha256": "c30ccafdb544157bd8d064bd2213f6d72a36b748c4de571c50580261d585e941",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_lldp_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1091d76873450a9ba13eb3c6110d089e7a0837865a9b69cf7cccbfec4c59af41",
+ "chksum_sha256": "6bee98bd17d188840a9d71a34e1824e005b96fc1073c776f45f745c56cc969fc",
"format": 1
},
{
"name": "plugins/modules/fortios_router_static.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a0fdcbd7d642fd365da3ab29eddff29cc8802335ef95a872c21a135bb497805c",
+ "chksum_sha256": "f3b01402f65d04c8d6f694fc5eb78b37f9d5946175249677764ea0a772a68eb3",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c60689237a47f590e4b3fc940c4d24411e9f5d8b474c41c0e5b0f59c8a867c3d",
+ "chksum_sha256": "3605348e85ea638e1d08df0e6c01e6a3b8f0fe6a949260d00cf585cb7f75a035",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_mm3.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5c5ff6cacfdb3aa533f40eee30f2cc8ad32931a071194e6e48df2a1fca986165",
+ "chksum_sha256": "5d1d81a0a5acf623d986c6ae43c97746289dba26436257fc0a5cd85a07de2d6a",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_schedule_recurring.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d147f8206f5f3f70e06eed27d8563578e2d055040e1f5875742d00df54bd8e74",
+ "chksum_sha256": "f587e588a63c58364473cb65a52407a136da0c27e8f15981b95cbd585efc1806",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_certificate_ocsp_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "817a803b7217ed0bab4b856a3dd4a84e2dfc23671505038bf9c33b89152e8c0b",
+ "chksum_sha256": "534d23049e57834bd16a7d4b2bca4d41e1cd0c7edaf95ac7c7d5545595858dca",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sms_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c6b60ca1eae5c7ff84c90cd2094885a7a5423d401fb00a1161cbcde4439fb4c3",
+ "chksum_sha256": "dc65419ec91f10b6acffdd0a44259aa46b1078db7a401071dbea07b80c313c65",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd3_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4526c61a17b596697ff70889b82ac6103c04aa1e101ff264d793306fecd3317f",
+ "chksum_sha256": "6667cd8a23cfc3b21bde77fb0b4cc0d7beafa81ef28528e4dfcf77e6a40fb6a3",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd2_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "47f46cde60b98c3e972a20eea0a8cc03cb2a6a57af6f08f866365ac5e4c5cfb1",
+ "chksum_sha256": "80efc6ae694eb8170125789eee6dd0a4e287e97f13aaf953849cf2eb10b167f2",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_controller_dataplan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6acadf460c76f3c0dc53fe2c884375cc762c1ea8b1476fe056eeef55ff82f76",
+ "chksum_sha256": "9441a170dab13ebf08b8eb2a9fa6cd7f082a48f2a6fb29d46b23e4c07586cec7",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_dictionary.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b3f00c62be831e3b354363e4d8c6e9a0fc51451785b744d4ba49f851b2074f2b",
+ "chksum_sha256": "3265d4231eb4699d1db5aac11c7ae195cf7cc0deac1af2f4ae58c99a026cb057",
"format": 1
},
{
"name": "plugins/modules/fortios_user_adgrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "81fb4ef83553cf685d1b1f7112631f8a505d45518cfa6279f8e2dc492f9f2ef8",
+ "chksum_sha256": "86f06e3d8c5439b7a4d7c81306dae1dce23755999ce46e9224d9c72818ce0979",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_bword.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fb3e7c2ff4c0fd2844ed0e0263b19675dfeebc9cea5956b65cc3d13d4e6e7ab2",
+ "chksum_sha256": "c19aa8948a828986d04cc655659fb07c94646c6f9e058fc982f22c9b8b9fb996",
"format": 1
},
{
"name": "plugins/modules/fortios_system_alarm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8fd82b101bfd771282c959d30caf4ffac4f3dc0b3f56d2329254dc3d13058ee8",
+ "chksum_sha256": "21a49baeaf98d57765b95d4b3ff9de9e261bd935b6e6dccca4749020d2e214b9",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_wtp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a80179af7713d1a486406fb8a0cc98ca71b7fdc068fe6df73094d3d09179080e",
+ "chksum_sha256": "3400f66cc2d5aa1a043f3cc8ed52842fd975452ec14d4311e1b371fb8b655248",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_interface_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "756b7db30e3daffdb1ae8035a4c340fe802585996676913290de537103f82745",
+ "chksum_sha256": "2b1d72ce7e4a3515e4b200ae82db5f5ffde2a1a4213fee349ff2c2f9f1b782ef",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_iptrust.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a3dc0809edb93778544803675119cfeb0b7514ffc3be5326485bab5682fe555c",
+ "chksum_sha256": "fb6d5402bb5bdbf354fec14d02281063ef79d4da93d324eab0f2068fecec650a",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_controller_extender_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab12c9f5fb51b4e930f58e2e2eb5a8cb348cba4ade153611fb0961e14b94214e",
+ "chksum_sha256": "783087d36f02f935b649410a28ab388cab02d6253879fd44ec47add3498f7231",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_utm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "795d0c03e25d5de0f2e6e8642597d7947deaa3802482a6de4a1ddc10eac2d149",
+ "chksum_sha256": "1c49c24e1c3aadbf5893af3632bf512f65b4d6618e1a068fae3b8c8c2956be4d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_global.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9f754a8019254ac41f541713ef3f34de1f849182577b160fa27275057fe3ff5a",
+ "chksum_sha256": "c4fae5a0e401f0ee61010f49dbeb0e46a20dc72472b0db86c55a769ef7312fb2",
"format": 1
},
{
"name": "plugins/modules/fortios_system_mem_mgr.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6227715f425cbdad80c73e26d04b7e166a8d18281f96674e55cfc17b2556e809",
+ "chksum_sha256": "babfc2cab08fbbf7a3171a470ba7888cf818a0de2dfff47f1334e0c16f85273c",
"format": 1
},
{
"name": "plugins/modules/fortios_system_speed_test_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d0b52d4fcae132e6b1a1f1fa9ac0f9e7d040bdd80c21e59251bf9f8f3d5805d3",
+ "chksum_sha256": "28726eeea8350fb9bf9d6520e5935d24e7987dbd2912439a92b0bc8b845d8be8",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_global.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aff4c38368ded8797e83bcb85d522215fa1174d7f5bff62221ae074e6d5de92b",
+ "chksum_sha256": "cdf0a511522751ef4b3fd2eb056aea136a8d61e5714634e18135c3518e9d05cf",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "45662ce9349fb8749623cfcd8f7585d5a9c165bab2434ced066a4ab16d8e0601",
+ "chksum_sha256": "022942b9829ca99ab5e0ed8ff6afd6303043464363e83e0d58374d4699480bfb",
"format": 1
},
{
"name": "plugins/modules/fortios_system_standalone_cluster.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7bfd809e8bee3ad090c54f6696c6496c1d3c5c3b230a9a9ae6bb86e35aa9a0c1",
+ "chksum_sha256": "8758e945e7e4948eaf0c43fa71238aff613abd0f6a2a9a1b967dd4c7658fb61a",
"format": 1
},
{
"name": "plugins/modules/fortios_cifs_domain_controller.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "83620821002fe44c3e3639a97a6a264650d99e3f25af673042d528d6c6428006",
+ "chksum_sha256": "b685a9c75c87bb33592bf4b3818cc61500eda54b8bc7bcbf3efe9f5e6f02df26",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_snmp_sysinfo.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "05b67bcdefbea2ce23f2eafa53e2c687dd5351945a3f27880fefc00be1f7bbf8",
+ "chksum_sha256": "ee9aa75cf81f168f1d373b8a8afd6e5641beb5671f84110d0eccff0782e5272f",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_switch_interface_tag.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d9d3e35eb1e0b33dd66c9e15a6985e9ee9c1760c78e6ee217c2e17582370f791",
+ "chksum_sha256": "3967e8164eeb5211286bfca300837617e8beac527b40a5235fe7b7d8ed3ce9ce",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d05db447e58a528752da274713dc283a8bd68618f7b5a0233be01e4ed75f8c69",
+ "chksum_sha256": "f407c290ade3b53741a4745c0eddb8f5642c7672a4cd7e8c0596da75bc76b708",
"format": 1
},
{
"name": "plugins/modules/fortios_system_proxy_arp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "53b39b12c5e49319985305ecbe588db225e1cf7c31d5564765e185130033de2a",
+ "chksum_sha256": "74c044892a993d624ddfac9657ad2fafa29e6d53cfac4dfed5e45adb2eabe7e1",
"format": 1
},
{
"name": "plugins/modules/fortios_hardware_npu_np6_session_stats.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1893afeb29c0bbbe92c6ed1b4e51684c2ace9be27c2a2ae4d8a66d45d31e0441",
+ "chksum_sha256": "a279ab0110162e01a53534446647315eb979fcb83da4e0610d4f04d20a851178",
"format": 1
},
{
"name": "plugins/modules/fortios_system_cluster_sync.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8761d5fd1c621160ac83e787d558121f61f46a5b7b31edd39129f5664e7b2c4a",
+ "chksum_sha256": "a54092553f7f1eaeb69a5ba02b43a68a824f459691eea1ee9225cb940cdb9bd2",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_icon.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "840e7e7f81413f3547955c8841d8a39d5be84b0245e29157556cd4344de50094",
+ "chksum_sha256": "e94e9f288357be0291cfeb2d90f1404c1d61b15ca91851e59435cf69360ee759",
"format": 1
},
{
"name": "plugins/modules/fortios_log_custom_field.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "987ad568a193b43ef4f13c2e12b21a6785e70c5a5162851bdf2d72fcd6923dfc",
+ "chksum_sha256": "43f98e2739716abedbae314ec31805c42dbc7476217f8ed43138dbe08a75d4b3",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vip46.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7fbf9e4f4d6432aa7cecd34d71c5425ffe98223ec84cb2fae68f4dfe74d7739d",
+ "chksum_sha256": "457020644c6a7caa802e2ddbeccda840bd038dc7362a20153d99ffb6218cf0be",
"format": 1
},
{
"name": "plugins/modules/fortios_system_lte_modem.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a39dcd67cf3216f090d859592d0b6149c3b5f58df6d8e873f91aa41e13d5d48a",
+ "chksum_sha256": "9f657318d82c0f31fb25e267ff13d28274c253973188d215b758c475af88c07c",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_options.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "258f57b73bd8ffb82ba277d288958e977e8144ad80ff2ac5ee20bb1e5021ce5d",
+ "chksum_sha256": "30a317ba020e227a40f7eeadcafdf54b9f65357d7d297c16c34639271e729a64",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_cloud_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "544b0b5eae231663c35ac1ba3374e02177383b670d8ea03bd491c442924d0824",
+ "chksum_sha256": "74261b6d79bb61672c81da05e56e9b1308f08c949ac55546ec04069a0721efa1",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ippool6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "58bff2c856becb1431c1841dd0c72eb4c06a24affa3987f33b39844a599ef8fa",
+ "chksum_sha256": "a2892f31ad202b30f272c5933fc23bf426c98a69d1c7490a112123b0493dc857",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_utm_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b29025e5633a148ddd68c4a8e5aeebe2bee49dd4a538f1becb2ae9c29e3ea635",
+ "chksum_sha256": "4c4a196c7671d1086d332eb0779babc895ab1fe08707f74f8d235b1866b15744",
"format": 1
},
{
"name": "plugins/modules/fortios_router_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6473df9c9b02b88387003a0482e14b35725e096af202e4d720e8bb4b309b6f0",
+ "chksum_sha256": "f3234d0ecebe5e53d9daf5a5211baf16218b3cd8da8cf7f8e6072b03febf99ee",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sdwan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "602caabd5ea36c582a402883dc61e5751053f2a7f015f3a1d9fa265a5c3f402f",
+ "chksum_sha256": "354f5ec70c2bcd5d65db28201c3e5558819153a1d4e7a43ed2967bcf4304e248",
"format": 1
},
{
"name": "plugins/modules/fortios_log_tacacsplusaccounting3_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55f5427bd43fb574eb66bca11e134647adc9b8c0a3fa2e64ff34879144afb673",
+ "chksum_sha256": "ac65a08d439961d85cc68eb9377065983e99275a4de476415a09306f62e07fca",
"format": 1
},
{
"name": "plugins/modules/fortios_antivirus_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "837447f9cf28fb5ae74c4f13d4fa095874f50bd1baf146fe34bffa0e94b5d2a2",
+ "chksum_sha256": "70416b8a950df1320f841fbc80bb3ffb6f143adc715d1f74ed5caea5abc027c5",
"format": 1
},
{
"name": "plugins/modules/fortios_router_rip.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "80ec683af88a33d8a014939974354e96fe218c0bc91ed9501778bbfe7cf5bd68",
+ "chksum_sha256": "d4fe6a91daa360bdda34c30bea7e6367cc5bcfbaf32f4438a9bee4f100e54ca8",
"format": 1
},
{
"name": "plugins/modules/fortios_system_accprofile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "852b969732abeb50e443d21e1f02e0c3d3da2306aa1293b2f7520c5e09a81fe1",
+ "chksum_sha256": "c2c6dfa00dfc28f2a4008108d8a0af67987c993982cc6207117746c7756795e6",
"format": 1
},
{
"name": "plugins/modules/fortios_antivirus_quarantine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba8f5b1abfee162c35742589aac2c3aa06cc607c7cc191fa233686890ecdae86",
+ "chksum_sha256": "0714c4ec8edb30f87ede4bdb7ebcb3cf207212ae6b5ca4b2bc7736eb7170248f",
"format": 1
},
{
"name": "plugins/modules/fortios_user_ldap.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df77852213b4b73e7536032ee457f59fca527aaaeac1a046c75a3da11c827204",
+ "chksum_sha256": "40279379081c5adb677f0deb58d5a8627d3a3db22920abb590be6c7183fee3fc",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_fctems_override.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dba4c3f254c7be5d502aa204fc6795597146c075f5fb181118707b94baae7c22",
+ "chksum_sha256": "74042dcb716737a122b06c819279ff8bc6e6cacdafc2b40ed2df7432f4f8174b",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_access_proxy_ssh_client_cert.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a2189f23c62e1f57aeab0bf0cec4032c10f7e0bdf1f52ab9eedc501a94d524c",
+ "chksum_sha256": "1934a631997745307d0a4db2824c38a22dd679aa00ca0da476364b6ec40683f4",
"format": 1
},
{
"name": "plugins/modules/fortios_casb_saas_application.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3fb76ab9bc1b8141d4b9c22ea2e811286ff719f3329e6a99ff32b4a43e631c53",
+ "chksum_sha256": "7dab4cdb1e3e10a664d7dd20c40eb78a490844f7cb7fc1d07e2df084cd2744ed",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_gtp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "714c1a371f7cd7e3395b8b670bb9695c965dc021f9024e64061bff03a69c9c40",
+ "chksum_sha256": "bd9fde6c88fb22913b3cd3b2f7fc2e3e53c93e81e14995c77da2f89e0a138721",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sso_fortigate_cloud_admin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4a9ce6a369d6efaad1e6e230334676daa31143424304ae1f48204daf50b712e9",
+ "chksum_sha256": "f39dfea0e92d3bc7b663d0a91c152543ed52ca769448206da3613c42cc443a49",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_wids_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "925f045d701201730ac3d78481c721cf0842839d93c94228679c8a490d88a405",
+ "chksum_sha256": "a441686402c32a27cb095bebb75e7d6a05e25c8dce5ff1ecc5f758ed26011857",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sdn_connector.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a5f475be7f5c6bcf6fb0c370b1fe5c552f036062252f26348ace48f604e23146",
+ "chksum_sha256": "63a5aabf04d18a7956dd21970e08a08978b473c79f932b5d4d404dc1db27efe5",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ipmacbinding_table.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0a192cefb5a1df0a901471dc2b560acaac96b9007f76d555e8d098e57b4a2c00",
+ "chksum_sha256": "681c0620508c1d0f1ca08f294240426b834c3c947cf2f97964ce2ad6d311b6bd",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_qos_queue_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "815a909af979d277dc64a9f394a930dec418d1ce24145de3ecb72c5e511d40b0",
+ "chksum_sha256": "4b2b2f99f247dfca9b47faded8709df77cd8ca3bfa5b44601330b6598d0ba498",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_fortiguard.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "597bffb1e48fbd8ef87d55a9d691b47a2be56f049f6a35c787f161029e9d3e02",
+ "chksum_sha256": "0670d436ef080c2bf03623e3cc58a2a9564225ed990397434c46ff6aab4336cc",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom_netflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8e9245f1256c673fc2c87ddeeb30cb263bfd4b2f9574b26a6c0d8df683e66e9c",
+ "chksum_sha256": "a1eb931a87be1ac905cb81e508e1de0f674b41de27422b9312056010fc44333f",
"format": 1
},
{
"name": "plugins/modules/fortios_router_bgp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3cbc6b946ba05f25fc0f2466a1fc5ed7ce449220fe502d4f21c9eafcd229e871",
+ "chksum_sha256": "c32d9cd6a7f81e67d7043b2dfb72ad3ef9d8d39dbf1198fb45505d26f6ad7e03",
"format": 1
},
{
"name": "plugins/modules/fortios_user_certificate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "835b8996fea1528948402095fa24f52fc30fa2cc5e7410df3cd22012da1ee11d",
+ "chksum_sha256": "cd7595fd28f279aae91f154658517f4a0cc1471960a8a35c8ec7d8cc4017094a",
"format": 1
},
{
"name": "plugins/modules/fortios_application_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e502494fed01c345c2420241a58dbb557a668839d773e6b5534746d2c41441bc",
+ "chksum_sha256": "d51ebbecc478ddcf854c5ea4b69bec6476805ef1fb6b26c681676f879defc5e6",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8fbcdcde119f8874ff08a1e1a22484716f245f6f1cbac226746756dd7721a6e5",
+ "chksum_sha256": "ae46aeebd78561490a9fed40778aa994fa1ccb12e659c34c34d986f6ba4ae3a0",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/fortios_dlp_exact_data_match.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "0295672de5545770493a84442bfc8c69eae89c30a50d6fddda1947bfb49f0e27",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vipgrp64.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "02c991f9870c7335fea9f1cf92234282908c70531fc17e899b2c3b56c239d98c",
+ "chksum_sha256": "65c5806d9cbb7a41021b2c0532bf830f84b1b529fa29f12d6a0ecad16bbba44f",
"format": 1
},
{
"name": "plugins/modules/fortios_automation_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a2d694889ab79c8e9250bd2a3713aa4dcddf4e01d7a0d076d09a3f29d1691da1",
+ "chksum_sha256": "ffc8b6d8891a681f118080083302c62e2ac5a78f6716fe09c8b7cd10a8c7c574",
"format": 1
},
{
"name": "plugins/modules/fortios_router_ospf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d497d6d58493d93ad6e577ef9f6f0e696649b09c086aa6e8c7a26f0b27fb48b7",
+ "chksum_sha256": "4c47735e542ffd6acb399c47e1af93c5cccced79d339d7f3c23d3dbfc6b73259",
"format": 1
},
{
"name": "plugins/modules/fortios_waf_signature.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "febbf42e2b5628e540454d328c2af1df6867231ecd84b500838762f0a726c21a",
+ "chksum_sha256": "8cf84850f9048b7e1c8494407baafd45d8a65b1964297f171b447bd3479d88f0",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_custom_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "144317e515012afcfd47be286369bf0c9bb4bef67d471eb1c18b96e5d6a63750",
+ "chksum_sha256": "78088aa7b4d9a90cdf7d954e47794572c697c04964271f4ac96536ed725d7a67",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_security_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6b59b918089efecf15132a5ea6fb7baacf30a5fca917cb784133922d9f12efdd",
+ "chksum_sha256": "e6f549e17bf184dbff36ec8e9df5c29f1956dc1a5ae7273a2ac219795815995a",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_qos_map.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5002cd0f99ff5690d1822fc570a890e6a033d8aeb927185b5114f319ebbc2efe",
+ "chksum_sha256": "3e5f78a55b055acb62ae396396e874d74903f3cc69ce3726df9cb3ee4dab889c",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_proute.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9b729b684b85e65fb8a05a765c4cab17c923d3a359aaebcf8759df0fd62b6909",
+ "chksum_sha256": "41a5280943792d031a27bca395da39441153bab94a0554f506db52e15dc81347",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sso_forticloud_admin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8c709aeef1c97fbcde83f20cfa2d0d404c46ac5b515e54f2f4aa1236794a775d",
+ "chksum_sha256": "0ca0f140d4794c4aff884569ffa59355dc2bff2d77a2bfb7c0edac465d13ac35",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ips_urlfilter_dns.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a5e7a6405d8aecbb0727659792313fb9ff1716b18505ff3180d9c69ddd5af867",
+ "chksum_sha256": "10aa48a595023fa9090fe1446e89661ebb8a6a33f228e40bee3fe66847150bdb",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_vlan_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c71e9cea23205c7e9d08233759b8123894410fda1b9700403cf31fd0bce26ca4",
+ "chksum_sha256": "0403e0f6243fb8f3768feebbeaeee2f9b03370e5433490b318008c9e636d88b3",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_shaper_traffic_shaper.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5664670a65f099a36a012463c6b72a18a179d0e7afd42faa2c06a81ea3d2889d",
+ "chksum_sha256": "4b6fa11524277d52d3b18541b26888ba69033d229019603c6209a5d16b41fdab",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_mheader.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f382d2eb6e310307e8fe1a8c2a5d796408138eb66f7471c3f7ca4185f6717f26",
+ "chksum_sha256": "1bf805788f89088201a3acf124fa5cd4ce1fd941bd7e9d88273a405d98499d53",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ssl_client.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "eb912b4efcba5c6a85c1084769d7fa00010ed2f77ac964df59553a05eec43262",
+ "chksum_sha256": "1d3e28c3b8dbbdead5a59444992aff6d5335f047131ab8c290ccb56771a5df5e",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_block_allow_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad9737a0fff318117677c3cae31b934512219b7e0236c20163aa07d44f723bda",
+ "chksum_sha256": "8d4bbd8a821784f3f7f5af362cf248db17f117b13e1a283012b8b8a7fc973459",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_fctems.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b2ce433b011ef262b2a8d0bd0b6158cf610885821b44654e66d4d1430092ca3d",
+ "chksum_sha256": "2ed55a4b10bf581842d8fdc3aeb5d79be1005ada6f2d9b7a4adbba7fd071c242",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_shaping_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "93fd4fe3d61b03475d14ea6aadbeb62c394cca0f87d37cc6a7520c1a63597780",
+ "chksum_sha256": "49de064756b6bcf6f7125b9d55096937252c5092ddba22ccfd5611c4456a1383",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_url.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13abafd238cafd611fb8f3d00f481dc91748be409f59fc010a31831d42941660",
+ "chksum_sha256": "1219ae0688631765227d9687d074d1bf6f750ce4838b43adf6e284bb5d67b350",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_pfcp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2ad21784970f4910a843b8a78020fb4861676453821d0766210a6052ed2be412",
+ "chksum_sha256": "fd521f68965c540c6e709f0e81e3f3b1659c9e32ccb8032f9cda88bb20a79e19",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dedicated_mgmt.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb9fa301118703791f6eab1a93076ae2bba91f4cde74638802fab2b23d6a6799",
+ "chksum_sha256": "239c7226b4f11da544a08429aeb1bf499521d0269387e962ab6cb37091926b0b",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_fortiguard_wf.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2fbe05a0535ef3a8587b6753f5f82e0054b9350621079fb1397533403c8024ed",
+ "chksum_sha256": "bc74d24235b24928bf4d28216d718ab267bd8e2cf44feff5477e401f4708b67f",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6dc9a3158a2817a0929a0dfcc3b199daee7a296ef0446ce8e012f9ae9954ccb5",
+ "chksum_sha256": "5812f94f922d4944a817b4986d522df50ad01e1f3635cd841e51da6b35f7a569",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_bonjour_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "db06f83c4b368f7a7790af04c1933f8b5924f5314dc1e723af387c51d4107a28",
+ "chksum_sha256": "3151e83a65bcda64e85b25559bccf9dbb9268f7784ecbde64901cfebb0941c41",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_flow_tracking.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2956334a15f6493ee92676e32270841454e5cc835a739bfc61a588f824d5ff31",
+ "chksum_sha256": "179f1cdca889383963833b42b5a8edda248d66bf20d4bf6df2bf92b6758cc428",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_ftp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5ea0bb5572f7281b35a3f4cabac8e87eb374d2f55209ba0e76db12cae06bad73",
+ "chksum_sha256": "d1a6972a61365ec5db9c27b63f8e691ede8e6b80df488a846f18947618a70fe0",
"format": 1
},
{
"name": "plugins/modules/fortios_cifs_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "23ee061f092ce38ee6a168bb452053956956e81d98e965f97c054b76bb1b335d",
+ "chksum_sha256": "abb91410b21ff7c00f2cdfc726ad609c96ab7898900a727daccac571ae040dc2",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_name.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "530dd7adaddd4a171b252f83c3402ecb788aaee5578a8481f799d7357c0a10f2",
+ "chksum_sha256": "24f59de59b4e6b04c4408ce8d618a8c28339f2a94f5195dca7c634ddd23c842b",
"format": 1
},
{
"name": "plugins/modules/fortios_extension_controller_extender_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3cf85073596ece394b2db0ea948fdafefbf8eaf2876de894914b2466a95bba45",
+ "chksum_sha256": "b9769a39af141d454a344778d7f8459b2e6c449c6298a004314842cf6c8ab1cb",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_location.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "293c484aa04c2ada4996f79c27769a889930c5fa0ecbf4378a0f0ff3178f655e",
+ "chksum_sha256": "935f41e58568b9437532b487c6becde268f9bbf294dfd942b788ff532cc92bba",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_phase1_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a515014c070a72d27a191ac55b2aacdd845315a4d7e5226fcf8c130d2961ccf",
+ "chksum_sha256": "26272174f834bb2f1a76df8cfca4726cd07f8ff87a4774a3de88bb128373922d",
"format": 1
},
{
"name": "plugins/modules/fortios_log_webtrends_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04c0445d3ba4da0bca560e2f7a241d934f3b187d219cb5dd84041ead301c3564",
+ "chksum_sha256": "d2afb10b29018d6d9cddc348a7737bac542cdaef77950ee8f4e850debffdf5c5",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a19b13a1bc2b2c400d9313ec6377d7e7efb53559e77c0929800c3f30dbcd0792",
+ "chksum_sha256": "95bfd26761efffd78ddefc7b67c8dfbe5307b836c4a3d593e68a132629f58a0d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ftm_push.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7f72ea825665b5cfe860b28c788862bd9f99cd0803ec9e802cfee6eb22c24d70",
+ "chksum_sha256": "4b4d9657b8743f224797cf159c4383ff64b801eb8fc321a75dcc89b31461247c",
"format": 1
},
{
"name": "plugins/modules/fortios_antivirus_heuristic.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aae041efc9354b9a9028ecc0e2288d50ad166df466d05b61f427de4c07f22d92",
+ "chksum_sha256": "65fc53f121c3f96887294b04d7e3ef8ab2130ccd06c0fa80ec336b103b11222f",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_extender_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d3e70fde20d938b80a475d681a0580af7ae7a3ff83a81747fa511f050d23505a",
+ "chksum_sha256": "66234bde73d2c8764dc9b9ec9c5b73ac7c1a0e2a90585c3d9978e2c00515b08c",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_image.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5298d96fddc67c2403f1ea2694fdf1413fd7fb3b104ec386ba46ef395e9f7cb3",
+ "chksum_sha256": "3902b0b0edb0c5f28a3ac3b69b7a24c771b9ccfc627b2727399d97455e200491",
"format": 1
},
{
"name": "plugins/modules/fortios_system_isf_queue_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a0227fa5614fe29896af41a5821be2193e5372d306005957a011269bcb5d1df0",
+ "chksum_sha256": "247bca6a96b90a15601c131b681ae2a2281e3f9da224490a9815d4de727a812e",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_sensor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "116edadeda60169b26f2fc42b9182ac426cd70c1d28f48d5be86cf8017b87ed7",
+ "chksum_sha256": "c386fe225e14cbcd4634b2b8c1bc6acacf8e0a8013a11e933fab3a8c79493101",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_service_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e50e3dd52636d0a78a7cc29d27a819c1e274c1ca5f7a8dd3bac55e259c47e700",
+ "chksum_sha256": "482130b0617c41316e11ac4ee7165275867e7f3102d9dce4fb8299663b391986",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_local_in_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d9fd837a9a6f758bc0aea8cdd96117b9984d65003b9bf90d868d9d55e9efbe51",
+ "chksum_sha256": "f0e63278c30839945ca41f7ffa58f1351f4127052ed99591c8cab0a3ef0f9cf7",
"format": 1
},
{
"name": "plugins/modules/fortios_system_acme.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3403932b02e7eab3e33426e0cbcaa844074717ae46b6ff78dfd55ad85733bab9",
+ "chksum_sha256": "95362d9571280bd89b07292ca00eef86af4b08167f71f589123be35ccfebc50b",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_802_1x_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8b8124b017968c82dd7fb7907ba5e9d5385b7895449d0de47b844187476c78c",
+ "chksum_sha256": "6c3bf3dbd74b76dd735fdadea7ea3f7c46c2eb16d4b94651e3ce690f5e8c4420",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_stp_instance.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3e84a2125053948ab0138c5ad4b129fbe08652070d0d526237537c29243b271",
+ "chksum_sha256": "2adce2179035a4a180d6194f242bcae2b30976abc71101c2f6899a6b22651b55",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ipsec_aggregate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dc0248877b5269ff2ef75bf2777645af9705825d82473058110eef182f0f55a2",
+ "chksum_sha256": "6fd28b03db44a4597369189bfc941588a68b63c73a8505851aec2b6424c1adc8",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_address6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e755128ff5fb8f2d713d8b281ab72e176ab2fd2d2604c8912437be68e0a3f44",
+ "chksum_sha256": "f9ac6629ae44bff931c899182f28e8a2b5959ebef8d7b57eafe94731f1207bbe",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_multicast_policy6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0dd390260d78d23ce9b537782dec076c3f7643aa4272d1f1d3e479a9eea4073c",
+ "chksum_sha256": "43d80e9883319a2f03c2b1634f10be389818dda3337020ed5ef03c8979000c39",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_phase2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "40fadcb1ce76a47dcf7d2a167d7f0fadc64d37a34f4ce2d3ab044b5472bbee0c",
+ "chksum_sha256": "577d8145bc3c4833c3c02bed48ef6c8e81049c8c8f70b4938dac920ccb8d3bd1",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_qos_qos_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "471d28e240c6cfa4d053991aee9d42b2d3601c6f5d59b1425331cf572954b4f0",
+ "chksum_sha256": "c3cce8b42394d6f8b1f69fd24fd2e6171c60e54a9c4eb147000670d20f538de0",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_status.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5fdd9a81c34956636c2957ba855626a20f7df022227a29ae38da73214a22da92",
+ "chksum_sha256": "848aa8bfa2cda6829be95393767cd0b697bdcd8f3bf56228d22d3b9204260585",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dns_database.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f733a78ea10e440aab86d08125d1fec9b796de2df0a9c4db9050fd0d154b888c",
+ "chksum_sha256": "63d8c4d9def68822d9198a8dcf05ead99b881a1e32d4da5d9a7aed4c64872153",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b586ef869af41ad7261998a305ff4e60eb70d866de3e6624e8b2a2e231173f3",
+ "chksum_sha256": "db078f86b942735725959d54598f1626aa67804748f5b81a07f53aa2ccc10c1b",
"format": 1
},
{
@@ -2755,2135 +2783,2149 @@
"name": "plugins/modules/fortios_system_ddns.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f1fe2e92b683099483085e563c8d65280a2de55a391a96d48334ddadb079d7b8",
+ "chksum_sha256": "47da518d7509e856478af77d37202e485ffc4e4849e64e3a462fa367e90c97e4",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_virtual_port_pool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9c4cb934405b2df6048a8600392d5a0030928d2346b0ea781e528848aa23ea2b",
+ "chksum_sha256": "a1cf526c3c2b93fab537066519d00e02804de8d1470404ba3cb4f74bd673048f",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "354db788457ae47c760d7558f036362b286b79503fbe9a8bf0c961418d0dbb25",
+ "chksum_sha256": "d7c8ac79dc579e58f3aedf89cf49322444649df2237a56d7d9b03098812f6018",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b4e75050f8002f7f22b4630b0d9952a388e98c4a2ec0b815b63a4350dd1fae9a",
+ "chksum_sha256": "02d25f9806d2a0fb45a00c7918ad0996581aeca90d7e07784509602a768761e7",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_explicit.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19fbe25181adcade03ff24791f6245aee928c47e29d97e4692ef0d685b7564ed",
+ "chksum_sha256": "24760d8c5c5c30d60ada113980f5606578716434fe206be80b1793a813c759dc",
"format": 1
},
{
"name": "plugins/modules/fortios_system_snmp_mib_view.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f5fec6ee248575f6cb9d9feb66a3ec11a4ff37d6da9d16da9ea5788d6e0aa78",
+ "chksum_sha256": "f255e3216ed73aae0be3f8b5996c307ea9673a01543cf292224b2b9e50ac3cc2",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_cache_service.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1cd5d7e3d1cd653fcc383f798e6fb8d00cc02b5a5b8d2a85bf0a5de209674356",
+ "chksum_sha256": "d1ab11d09be478b9378068adf3d993c20ed2110a3ab0b865b5e05d9abebef740",
"format": 1
},
{
"name": "plugins/modules/fortios_dnsfilter_domain_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a18d542f53f262bf850e0b4081a2f45afd3a4b24d0da78cbf4712e5c104aad30",
+ "chksum_sha256": "1d5f1dde00503bef4031095bb853252a97e7eccd7de536c2cdcea76c53525577",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_certificate_remote.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "715d1571c0bc15d196d8388328d8bfc487fa187b99f89b3532c70f3f635f2c0f",
+ "chksum_sha256": "764d9323113a432dd1dd408b4ac905b33f0da27455739ae4dd3e13359538ffbf",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_fast_fallback.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "04d9541b334a21ea55229fcf71ee0c7a5503d5e268528503096adf61f7994b37",
+ "chksum_sha256": "db6e76b154cb0cf1deeed9f73b21b126a7092cbbf6019eddefacb5d43885e71e",
"format": 1
},
{
"name": "plugins/modules/fortios_user_pop3.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "198ce14d04848b79ebecc39e9dd1570b3bda465f15a9733551e9925c28b2490d",
+ "chksum_sha256": "8fd4bfa23696bccc26a3b04712e775f833bf2736db74ae4d47f3f56c59749ac9",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_concentrator.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a893e9b71854c7646a460bb4885ff22fa65b63ded0334c891a2ef319bf348aad",
+ "chksum_sha256": "3a950a45e5dafaaaa657fd4383ee61e6f7acb9bd8a158298d39fd8c88527d561",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_debug_url.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "75a764aa7e78185476e0d98f0faedb181b9f918efb26404e7796b34db8edf043",
+ "chksum_sha256": "60c5d94bfdcb2e9e69510c4cfa6678bd4d86f199238091f1be3e000cf8bca7b5",
"format": 1
},
{
"name": "plugins/modules/fortios_router_multicast6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63a4e340ddf4c622e257977917e99a5f32842a3b1b15849adf32bac5f307703c",
+ "chksum_sha256": "3aa26ed91e3c07988f3a878980a58bb909b451ea2571fafa8d9674827a1bca87",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_rule.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cc27ed652274ae679e25782fd5553374056ddffa6b789e07bd38d5bd71776871",
+ "chksum_sha256": "fd641687ebc4f6191323f4b8b8a7b94fe87ec115bf5801c28f172e95e67d0881",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fortimanager.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7504c3c38976768cc3251ee8a976581fa88678a5dc87d8f06004c0f5503f4cc2",
+ "chksum_sha256": "b01c823437591d32dab8877bbae95c355ea99bb36ec1048d704ed34668370cbf",
"format": 1
},
{
"name": "plugins/modules/fortios_user_fortitoken.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f5fe9af61dd058348adf6af9df41afab85b4d21c1c222ced7bc4c67e356891b5",
+ "chksum_sha256": "db647968822d93d25eab65d28ebfa35bd727e783e646272804658295ecdbbd72",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ldb_monitor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c87b307b0eef862b86f2a3eaa5c09b70391563b7a1fb69043d5dabd0a2c50224",
+ "chksum_sha256": "c6e2c567e59800dc00645f4868a0c794c1baa27cafbbf66feea0885e0cb942e6",
"format": 1
},
{
"name": "plugins/modules/fortios_log_tacacsplusaccounting2_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1d7c5c38b604ff7b6e6b0a8bc8d1bd8d942722a66de72c52f2d0eb59fbbf8bde",
+ "chksum_sha256": "325b2a9e99c2189dede3c26a58e141ee11b3f210da37bfabea66916a8a6a87ca",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_fortishield.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ea1fd9d18c86d9715ae83b91aefa239a71d45f820ebedae90011fc0f05419f0b",
+ "chksum_sha256": "be2acefabef6237a4eb24a22c65ddf5a75c563aff18b877e54cee7b4e8f157d2",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer3_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "16a531d8fba59bdb5bacf23359b8bef92093bcf724abaa3adf0ccb56c8ae52c0",
+ "chksum_sha256": "0f7965817b6ea8983445a34823a9e5009fb1f8562012c2eb7b5eaa6847370a62",
"format": 1
},
{
"name": "plugins/modules/fortios_system_speed_test_schedule.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d043dc376d8166b8b145ace56e5d6f504bdc89bb06c567902557e27c75ecdad1",
+ "chksum_sha256": "66909aa0bd2818e4b601609d8122d0f885ad2d8534f26983d4cc249dcc6ade45",
"format": 1
},
{
"name": "plugins/modules/fortios_system_np6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "163e6be7eedef6ff79466b4d93f7e4ff6d14727f37230676edb72c1feac16942",
+ "chksum_sha256": "f6a02ce26175b9ec648f303143478c4df69ca131193a745a06f316cbd3b1910d",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_reputation.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d26e06f271c1c70d9ca34beb35f6621e694a1c4c50d02d1d4cfc50d55340e6e3",
+ "chksum_sha256": "070c1727f25545a510a7b14b6127ee3aa887f8735c8045957e0a3e4617970824",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_spam.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b4e98acd799d7d909ad813279df43acc45bd15a32fb99fc892f747ac2436b10a",
+ "chksum_sha256": "4ff031f8dfcfe8d96be911004a8b1bb58f65caeaebc3735ca5c640f20e7f9417",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_data_type.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dac6978dcf84244da9d3d4f297daffd51214d1e0220f665de0404a4602353d72",
+ "chksum_sha256": "18a1289060ea5234aaf49fae8ac29dec944da911627fef3cc7407265a9f3f875",
"format": 1
},
{
"name": "plugins/modules/fortios_system_resource_limits.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4d5112b0b47261a8fcc2e37e62727880e49e6b9be8af6b40d96f43fde0dfa6cb",
+ "chksum_sha256": "697ccd314f86c4c061f5b7e99de0b65b66ad02cf08b515e9cf0c99cd4b768d1f",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_storm_control.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b48aa5e0e2c77ab292773bb8a20935807a6b82a2be2018ae4612d2253e51b28",
+ "chksum_sha256": "b5082869140b31395c0d1704e3d7f2072e8022e49c10e24da4bd22af862e6d1d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_management_tunnel.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5a4b2614aef9e2c6e19a5beb2c9a53e6c918d5dcf8085d4ccef926223acccfc2",
+ "chksum_sha256": "fb82d58cfe40e8e8ee9f086d1942227c3748d3e60bae002911d72be2a84247f2",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4ba251cee585d1988fa047b02dfdce9d4b0896be923301732914c7d33c65f647",
+ "chksum_sha256": "f8865b6bb57ba3099ff6f70b170e4d0ac663f5be0bfb76bdb5164613b5d9e446",
"format": 1
},
{
"name": "plugins/modules/fortios_system_lldp_network_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d45f98d72de96022316074f447a2491ee1f58e331a16e4fc8f81b4edead9830d",
+ "chksum_sha256": "0184a9eec50e35c236ad38062fe2ad9906f0230be176b747592500b69f00a60d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_stp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5f4b7fe589c43bd5dfa6d23fbe7ed20f727b3da3b1c70c87d48b68107f912bbb",
+ "chksum_sha256": "a10160b9edc743ab5e58e9d6f13397fad4cec11b58e2216a04c4645e9999aa83",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "673eab75a47a4065525764d4be417610f6b09c4f725204f9df17ed3c26e9dbea",
+ "chksum_sha256": "5a1af573da38183c6b53b3d946527583ce00490a97b30888bd985af5b889e9f1",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fm.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29ba73ef52b2b61e71c2453365ea430ccfd96907fab21f77a56110d423d5697a",
+ "chksum_sha256": "6a5efb3e43af5e013b078405e8fa7aefc69bbad4e89fef11ecb1cc58ecd5670c",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_iprope_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c9b7aa34365462ca852287ebf4d42bb4dc5e31f2f420b7b84dc39a0e4b79051",
+ "chksum_sha256": "9d1f8431f220a20c2d07dedc56d6d4bdf87fdecdc13a33767a4395c81fc0b0e7",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_carrier_endpoint_bwl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "566c6444be9c3d38abae3edf6232f7edb3f394553e03081d22520fc1e68f0547",
+ "chksum_sha256": "80268b4d10e0859bd5c9524a320e2978c3b9af823e71ab2dabf6d394b1c417b7",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom_dns.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4744e0e96ea34b0c6bd9e427575c497014df797651c4d8398cb7f8c33fdc108b",
+ "chksum_sha256": "66c9c396e05d2157ee4155455154bd9c22a26b7addba39be0022ed058d3f2498",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom_sflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c4de8a005af940c6d1175d93281b7da5b189e26f27697d59b3b18fc714c192d",
+ "chksum_sha256": "1d708cc619b53493298b649e6188630cef09666912fc00015c451a3404fa288a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_admin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2011df55ff2e35bab9c54d0057f5c0b09311773ec5bcfd2187ac1f756d8e1e36",
+ "chksum_sha256": "5ef4991944c9cb241c8eeb4813e90d4d23c3218b6d376d98e375f37387b502f7",
"format": 1
},
{
"name": "plugins/modules/fortios_user_exchange.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3cf4f54b9b03b3cdb3ff9bf04b3965372378eb1ccbf74eae1db5d585674e4aa1",
+ "chksum_sha256": "f27a43c389a89c45eaa99cfeffb7a146e5b144739cedd5596a0052075ffba645",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_acl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6476dad082b78969a2e888896e9395e380be6f7b1b50b5adbdb1f853100c0303",
+ "chksum_sha256": "7af8f1adcbaedc3ddfa810af88a57bda281d62916c4953fa086dbc3034e3840d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dscp_based_priority.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3730700d2ecfba619103bdc32906d9bb4e185c21d1b0274c930147a8c78844b",
+ "chksum_sha256": "e7107e635bfc5304b3714e7cedc7ee1e8c2d494a4946682be241077b69013c1c",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_switch_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "639a645bce4591d5731c8caa2bb21608eeda2719cdd2a56682927c1d8a7a5968",
+ "chksum_sha256": "9729ef2e44bbd00317bb86c851f12f8374e9ed56de138b0c61e34f04d0129bce",
"format": 1
},
{
"name": "plugins/modules/fortios_log_memory_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "90a734177202f3e8014a2aebebfcbce1338ae1f261d5eab4e588f4c2f22e1e61",
+ "chksum_sha256": "fe78a302d37354204f3022bf540e114963e6bb85c4a8c4588a7dfbbbdbb62c04",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/fortios_videofilter_keyword.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "d0f45b8117e8505d5cbdf035bacdb8ba5ed799b74fd69ba0935b6c43f8546290",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_country.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff7ea110ca8c88550ee1e1b655af3f136ba7a6fc2dd34f8ce66929065ba0a996",
+ "chksum_sha256": "eac954a3f900a5babbb2ca4ee1f6c1f109fb5167051c0fb65aada134ef8c51c9",
"format": 1
},
{
"name": "plugins/modules/fortios_log_null_device_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e3ba37bc51de1ec29f57a14b9bd6ee9d2115f47edbe550a55d7833e67c68bf94",
+ "chksum_sha256": "ccd47eb60d1519b29099f2f7f837c2a76caa44b43a09a6dd8b754a23f7dce936",
"format": 1
},
{
"name": "plugins/modules/fortios_user_radius.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fd43659e6e142a876c4af5dc23af5afff7e8990d5906015fb109bee93a6a24aa",
+ "chksum_sha256": "7c930aa0df5de43642a02c61617c3ad6ae32eb8d97961e65d32b5b6f95f00850",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_url_match.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f97c384b4ba08e04a4b81c63f9bedb37142658c9f6ba034d2a05d76c1b9cf7fa",
+ "chksum_sha256": "464beb03390b727217da61fb6dd0ae5ffe54106fa9a81ab8b1da7498a68e7a56",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer3_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cd5116103b52391b33f3b1fa2aee4e5136bd9d32ee685841234544a0b7060817",
+ "chksum_sha256": "dee355d45d859bff5f3ade1acd945278aa0dd7b05ff6b0506ff375b829ccc78c",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_modem_status.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1d5c8e14393fe3f4f168775d8beaf4e657d642b31237157a3ca8e9e5315cd90",
+ "chksum_sha256": "031a09279142d06518de18f57055b8b57a44e333870b7397dea3c32fab0f91cd",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_consolidated_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c351f786d2fe05565d92d336508bbb28af87b419a56be9242ccc5ba7a3f94bbd",
+ "chksum_sha256": "b3b589e63bae41f58baaa478250b8ff9f477ee540f1797010fcd9480be2c8d94",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_dnstranslation.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bfe4d573a434828bffe5842ed1f2c84e82ee558ce6513e9b209b7627d6e59371",
+ "chksum_sha256": "beda0015977ee54881504e271a67af6e598e34c4f538cc6849a0d3d312ca08c7",
"format": 1
},
{
"name": "plugins/modules/fortios_user_fsso.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2bb6db8a8c6da84a2bb615ab3520148859fb0ac4c28e25d26511567eae92b341",
+ "chksum_sha256": "234d4d0f021b8219d7eb50632fbc1bae3b36e52b76012bb7b297380847123a1c",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_auth_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b7ee89ae74ae7966a8fe2c8eb0714ca4aa4a82e23acbcdf331636912d9ee19e3",
+ "chksum_sha256": "96adb2a7af60571f37373897ac42f86268d82f492a9555da5e7d2c1933f6a586",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dns64.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2dbc939900f77c244a5a8f1af4e895f6af9f36b8c592413d5018d33233824124",
+ "chksum_sha256": "9fd1d0ba1bb9d86bb49d5350012b5f589acbf2bf985a533b099c176b3f1453c5",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fips_cc.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f00cf830da5c16f97533ed84bfacaf25f84bbc3090f23d768a9c8caa3bb92044",
+ "chksum_sha256": "af23929fdb78a201689f2fcbfe54c0b26def6da580d96296b4218ebb8160979f",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6b3ed04ff6694e320bbbafc69ae55c43ae1ddedb57eef63ece859386e1ba9c03",
+ "chksum_sha256": "82e28898270ba8475e445a75717bb44f09ac036f33ff00a6dfb7600411611566",
"format": 1
},
{
"name": "plugins/modules/fortios_videofilter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ed9cea7726a8378ac9a3d99b66aa486a392da36849410a42dffca05a640fa6e3",
+ "chksum_sha256": "409cfaab42cc01711f6b43843c51b201163b6e62c4340a63d04814559224c941",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_forticlient_ems.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e13b94de13b3d3eedccd145f56afd9dd4abdecac1407c28f7801da62329609e9",
+ "chksum_sha256": "7a267270e45200681b9f5a546bbf41143e2e53c7b2fd6626ed74032d57eeff77",
"format": 1
},
{
"name": "plugins/modules/fortios_system_admin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6621d797689467c93000424f605569c8afd05ca89076befc0bc2dce281871aeb",
+ "chksum_sha256": "f53e87ea5ef1d98205044bb3c147505560ce56b2aada11a25a5dab0755d54d48",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ntp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "514b3e4898c31184332234ae200fdf607537721a0449218d1812588f9e9316bc",
+ "chksum_sha256": "f03892f9dd9887274c33803c2c675cca885486942128ec58fa3833a84ef69bde",
"format": 1
},
{
"name": "plugins/modules/fortios_router_key_chain.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab8d0ad3d2ea2132acf90007e0eb8f2ff4894b2f320dac135f982dfeb63fb041",
+ "chksum_sha256": "37f00825a1574a138aa1207a30210b4e404bea6cf3618a5542f09676fcd44875",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortiguard_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6a28855fed46a7aaa4774dc71d72cacc243e43ca44c326645f8d2a9d2c8332fb",
+ "chksum_sha256": "6432f837e69f07ec0877044d9e87fedd8853813e8ad08db294f50cbbf6aa42b3",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_mail.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "533e1673284365cbff528191d706b8b7a65fa7a0561ec40379cb6b8dc28f6a78",
+ "chksum_sha256": "05c730981a0390fc28e985f199bb4ef0c999574da4a0a61310edceb4736f0a1c",
"format": 1
},
{
"name": "plugins/modules/fortios_user_fsso_polling.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d0d053b6edb6b107733db7238e41abcb298046d8406653eaec8426aa0c014276",
+ "chksum_sha256": "d7a0b4df8521fc5d0fd9e53267310798e18347a906e0dfe60ab14c44b19c343e",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_certificate_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9e2c445afcebeab333f6a0257b0f9fd22e737f01f246c6c04be00f78c0b1dbf2",
+ "chksum_sha256": "bd39153a3a9c32e4d83fe269f8c25c89025b7f0cbfa98e411da5036d39a2b53e",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd4_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e6ee86341a2c41ca1301e72a7682d3ab03a1cc776e42b3a5922a2632e613dd9c",
+ "chksum_sha256": "0144d48dd317f1a5218f1e6a619f84d2d876a56324e695a5a3a57377fb792feb",
"format": 1
},
{
"name": "plugins/modules/fortios_export_config_playbook.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d2b870ed88764af648dd5df585781fda2233b70e717588ebc6b07c0b76b06518",
+ "chksum_sha256": "9fce1486841a9eb4ff5c7627b5347003937beb42e0529b2538493b6bfca33de5",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_addrgrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "176c96fe3017f02aa642d56b29009acc7e055266b9a727deba21b1b10d3fb777",
+ "chksum_sha256": "7aff802ce22cb370a6802b19cfbadf05e7c90f0cf29d18411dc32a30911a84f0",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_wtp_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ec5bee39ba477b3b73c6df82a656bb16f685746411e2ae9f24948a62cda61b86",
+ "chksum_sha256": "c0f17bc09c09710a0b1b7325ede9454354b930b94d15ff4fabf3fffb570e55aa",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_multicast_address6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b48b666eeb91efea142cf18b03fa6cca67979af1afa194737a2fab17073db27f",
+ "chksum_sha256": "8e5e87e8855c43a518b2cca14f15fabbecf1cd555115352759b36424f14d3840",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_snmp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ec3e0cbc9d28642810645cf6452cfad14a32ed2e5382336a0cb4eaf9936d15cf",
+ "chksum_sha256": "5997f7ad0debb296389f2315052fc261cc347ddca6aa5dd5a3807d17ee11e431",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider_nai.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0efd63e53d34d63f832eaa122bbb42981d8d14b0203dba8db45f2b389f4cf683",
+ "chksum_sha256": "dd0e38e056459337a276337f9093ca1969cd1f096166a5dbbf1ad95f17f6b11e",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ssl_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "526d15940d4325ea53297320ea802f892bfc64445158d21cd8ccc1b9ed9bb800",
+ "chksum_sha256": "03ad59b0cbf39a9dab577663ca8863abc05884658187a47588a3dd6bf1b58859",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_sld.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "969a2d896f96aea663419132d863c83c491c459f2f0bae27c3289a70bb6c4cf1",
+ "chksum_sha256": "cbc3ebf48f35c5bcf6f05a5e6431866834d72491a50ab8f3f72126c3606d096d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_link_monitor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5801a660bd13e43b326728af4b21530ad9f78bbe6e45a9b724810029bbdfa1aa",
+ "chksum_sha256": "79826cfee5335cf98ab22f40a13079b466206aed0e9e8a03ce3cfb8ebe669c18",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_dos_policy6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e2f35d585c9df5455a41cf7a3ff56ba137447fa8c7977da821e7944f05df7b86",
+ "chksum_sha256": "c727b6a55183693b190f614af9391ec49e2aeb56345d17afc263e69ea82389e5",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "10d322b3989e4e31be726e4137fe065c969044bfd1d4b4832ef0f0f493a85ff4",
+ "chksum_sha256": "ddad02af393cf52a21ddaf2d63408c51dd5fd0f7f956ca929674b8e9e4ee6fd6",
"format": 1
},
{
"name": "plugins/modules/fortios_system_snmp_community.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4ab5bcd583f7b1fe7b069d560fb44ae80ef6e999eb8c15e7975d544eeb07c78a",
+ "chksum_sha256": "80913d526b878ca4cb0d9ce6df16246bc2b8795573692a6e5c83fe311f07df42",
"format": 1
},
{
"name": "plugins/modules/fortios_emailfilter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "167cc4e4c8ddaea9b58a87643e4e322cd55a6025e623c629f36c85ee500da37c",
+ "chksum_sha256": "1ba3e9036276fa8c02b4303a04eb0afb03149245fdc2bb7fa9a10d3bc50dfef3",
"format": 1
},
{
"name": "plugins/modules/fortios_report_theme.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e67b8b9d0fe43142162d07397504998bd3e8d429c10fb1ff9a3966888678ee94",
+ "chksum_sha256": "6f9c87c1f3a77702019a1678a841ebec6ef4903b707fe9eddfead28976ec336c",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_acl_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b8854df333461728aaabcb8f57c6815aea4e68157faf6dd639bb82fbf5834fd4",
+ "chksum_sha256": "cff615d167909d288afed03a27652552f39a6185b7c103ce73335bf5de730270",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_l2tp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "12deb78f39ef02e2e50c0762b58d094790f9e68233989f213e3b8321feb12332",
+ "chksum_sha256": "3edec3021824dda50ac12131070044704e17832a3a732a8e8d44fac809e1e0d4",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ssl_web_host_check_software.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c06bdb29d43dc8b4f4b4224c477e8dc9c08559634075b2e51c7bfefbde62f6d",
+ "chksum_sha256": "b3ccf374a30d49527b075ec4fa59fc954f46c4da506fb4e0532b516fb6b792ad",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd3_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4f1a689bff1ed9fca8b9da3328e2905cf287c7992aa0dfb47f48ff2352c5f85b",
+ "chksum_sha256": "2fb2f01626eff8611b660b7c4c5ccd440e21ac83e1a79cad82769670378ce6de",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fortindr.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "07406f448b4cb4fece5d5d870fb6f70e3aabf67dec9e851b5bdc04f120596850",
+ "chksum_sha256": "09a093d59635f8a086ff2ddb335fc8f1b283fa3ae52986984ed5d02e166d1f67",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_initial_config_vlans.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "635717190c9fae1ec169754ac97abba297379431bdb4294eecd4ffa0ea067265",
+ "chksum_sha256": "114847adbefd773d40c4a6b1df021608edc32d2093aea8edfb622afd37a463c9",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_sslvpn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6e727311da29129be6ddf032ed0104e78fd638b392800528c27e0b1593ddb1e9",
+ "chksum_sha256": "6f9c19d8b6050a33b68a3ef02e1a1ad684d89f9b7b60358fbe32a0c47e96be7b",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_proxy_address.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f59ed2cd48da8f415b5293affecdd7c885ad4bdc054533cfba69775675ea7b12",
+ "chksum_sha256": "93f61f68817f2104f17976b41dbedc6d042dcea6d1017fd128a917210bd5a4d7",
"format": 1
},
{
"name": "plugins/modules/fortios_router_aspath_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4266ecd03cb4ce2b960faa83ba19563bea4fcdcd7ff22db31b4ac627961feeed",
+ "chksum_sha256": "3ffe37c0e663d39f02d70b3c62b31620eb345cca4229c4caa47eaab9fb05cf0f",
"format": 1
},
{
"name": "plugins/modules/fortios_router_auth_path.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ca017c642fecb66587a89e284d88de89af6c148bc2abaf936964310f101af03b",
+ "chksum_sha256": "8037b2859f42ac266f16efd00ebc088dd6edc3596783f97f57cb292014742d6b",
"format": 1
},
{
"name": "plugins/modules/fortios_log_webtrends_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "badc9da3217358c182730d769ec645a44e99dffa1d19ac604377905304abe322",
+ "chksum_sha256": "80b778889bde1200d060481439ed01b8c1506e86202543d5a79d76d526dec8c9",
"format": 1
},
{
"name": "plugins/modules/fortios_authentication_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5f8d3e8d74b6b50f0b7c558d8f269c2d4273e43d242f2dc2b3da51803ccb0d42",
+ "chksum_sha256": "3620232694d6920b7b8be11358f731eb0dcb924b4e49258a53d951d821f9e236",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_ptp_interface_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f7fafb3120158b60d2a2e6a85b5b725058eda69e7957ca7d29e20c89b8bb37e8",
+ "chksum_sha256": "a242b54a356bd374fa630504288a151c627b1c81b0b0762cf331690180b9b604",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_security_policy_local_access.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c73121f046166451a35bad69050cc6b034fdcf314d5fc151720df110479ecb87",
+ "chksum_sha256": "fc35bce04d5dfb0e5f10a5370f2f5f2bae8250ba8c862ef386c12b70eb0a73fa",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_access_control_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "30ca50447d0166e3b07e58c17d72656cc16b74d2d4c22418ea3a4545294a5856",
+ "chksum_sha256": "36c31b03dfcade9faee8ecbd21a9c157577e73abc64c680d39f223e2ed35f666",
"format": 1
},
{
"name": "plugins/modules/fortios_videofilter_youtube_key.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e8c39b5e39712c98dce8cc2a70adf56bfd09bcf30b2de937b566d0bc4ad7bd42",
+ "chksum_sha256": "a33c2c14f34ede12c0d84f7176fd2e7936e3008a46c790f3749a414e37d378ae",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "238a7b4f2fa3b5528103afea8cf35d22157a4553cb55306bfcd174906c3227f2",
+ "chksum_sha256": "c138f96d0f9c3f8f580c1d1c7c1a2f790abfbc5ac3d643a7fb57d2c86b51282b",
"format": 1
},
{
"name": "plugins/modules/fortios_certificate_ca.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "38e7b51038970873c402605585e964d4e5059596d27074db2c7584dc0747a35d",
+ "chksum_sha256": "e5da5b4f820122dee73791ce573915bb7da2fb0d13f17b1914087be9e1202263",
"format": 1
},
{
"name": "plugins/modules/fortios_log_tacacsplusaccounting3_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "83434b818b5cb1eacd3544031479890b9533eeadf4827561c8529dbe864d3497",
+ "chksum_sha256": "c56a6985b4b57db5098404e8fccddfdba190c6fe82cbe5b3290b11ee442c3c5c",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_service_category.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "185f1a432f42a7752e52924cb5878a1a9ddce516b6aa9dd6cd6cd1be6554582b",
+ "chksum_sha256": "b67a4858782a4ed83a4df5993259a677bd874d4420c81db77a58f7fb9b2eae59",
"format": 1
},
{
"name": "plugins/modules/fortios_icap_server_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bace9a373c607f46719c1f5b0c32815a0c09f68e0c304df3a6dff217f6c1625c",
+ "chksum_sha256": "190e5c5d258fc17f09360b32256577a1889b5c416829b73d8c19329ef34619a0",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_owner.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d1ef78594f8fc6af313b5a83be8258bae5443b8a470c17fbee513086c7581bb8",
+ "chksum_sha256": "4db3cda9d262891ff3164969286e349baab7faef3adea54c664f251b37295e03",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_cloud_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4170db1359b0d6cfb3822d1af23b947d0e8ab50277b16e1a906d8024aaafc746",
+ "chksum_sha256": "0071d3009924dd05f1ddb1cf6c545a266145c5bc2306a16e87a9e3819bfab176",
"format": 1
},
{
"name": "plugins/modules/fortios_system_mac_address_table.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5b05774654afafbe05a90e8612202d573b49fa7086dceb70b2cc10957e62d9b1",
+ "chksum_sha256": "2ac65722f7780d47443481e584942416ff27a4bd430c383fe780fd300e371008",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd2_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "213345ee7c8d1f6c5e21ce7423350ce3bf8f15029c30acbe2fd0f5515dd909c8",
+ "chksum_sha256": "1b5289a92de54e5c22c6a3d9418c9988f0edb540da31233964f361522a72cf28",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_webproxy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9f76911d8d1aab9f5a9de3237b0ec9c75682d5d95c077a92bf521df32e904f07",
+ "chksum_sha256": "78063f730ae2b34dfcfdeba58f00c884b8d93a8cf25b11787caa49cd12c7afbd",
"format": 1
},
{
"name": "plugins/modules/fortios_voip_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "52452a8eee6cd8afccd8269ab3c1b1ebd493a7c7c197ccbd260f6d3ecdb91a40",
+ "chksum_sha256": "f9f595f6a3cf06296e497d034b28b8fe032b7a6eaefa1697d1eb6df802b57a36",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_wtp_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b8cf153f7a47cb2063632bb3f11ed478f5a59077025a292fcf8c60cc8778407",
+ "chksum_sha256": "8b328a387139665c84d026de8c322b1177df1b2bd1b2a87ffdb63946f62eecca",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_extension.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "505d5b79b347dbc695f76ca17066d7b5dda294f59e2fcd7d8f852e7507451e1e",
+ "chksum_sha256": "16b7a1c792ab9cd539162274d3a730c32037141eb0e805cf39e848d624991342",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ipv6_neighbor_cache.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a82fccab2f509f5182f49c5978073c5ac6dc8567907074e4789ed4ff06813696",
+ "chksum_sha256": "737d8fa3e57b606e43e36a08fe412f9a9bf95794b9313231c9e19286bfca72c9",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_qos_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "06899ff5ff510cf2c0d92bff78394d7b13722d3337795203aea3a9e317a84bff",
+ "chksum_sha256": "97a1c62ccbebf4d7ca8733fc0cadd03a418d682c8f72e02c9e654c8538747897",
"format": 1
},
{
"name": "plugins/modules/fortios_user_device_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de9e815f48f1d82d976134291ad2cd0410da1d43f9dc35eef8c8a04df7ca3253",
+ "chksum_sha256": "c684d13b1a92f9e460e53d9410687a0e01da566fe4f9cf5150a6dce9e6c97f35",
"format": 1
},
{
"name": "plugins/modules/fortios_system_pppoe_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "81691a01a65b4f845a0adb6cba43d3ea5148da3aca4e1a9fefe8c3d03949825d",
+ "chksum_sha256": "7f0281a11354568e9abb12ed9595070657c9135cfadae3d468ef9033c33f7b30",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_global.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "506f060d014b77d39dee1d77f4995d57e4c13ce0d8cfc127b5c5a03c3d3c267e",
+ "chksum_sha256": "fd2aaea08af1dd13fbdffc8145ef7f70f731c5d341a7e7f666750c7acd681de6",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_mac_sync_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b67be92cdf6402a1b93d201df20f7e016ec370e7b687de8a3aa8469db0b62760",
+ "chksum_sha256": "c86d9cad1b1ecc22ae5b0cd856264f09b6ff131a33cb2d4c56abc2fe208b0d44",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_shaping_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "865df51ac805924fc4640ee555abc6ecc275764bf7768c34f4781084a23f7cd8",
+ "chksum_sha256": "b576d94c15ff19261ff2e17a121d7825b836afd69db039d7407644d7f1daed11",
"format": 1
},
{
"name": "plugins/modules/fortios_system_autoupdate_push_update.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f9b5d1899263fc7ce427d77bebb83c46d2a9c2577d2ac4a679a4c5398deb4c16",
+ "chksum_sha256": "de30f3a657fc57e77575dd43905e7a418ef84531ca8dca65fb9f8c4f65876d57",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "60d198f45df9572690b40c4ee6d601b1c1cd7c8541798e33391b0195244f986f",
+ "chksum_sha256": "11ed868126eddbc4cf5317a78ce8dc6f86b388c88f4e501b0b961f40a500001a",
"format": 1
},
{
"name": "plugins/modules/fortios_authentication_rule.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ade52e88a50d5fe51a29f7b2b665eaa309827c31125e52da676c16c4dcd7c2a6",
+ "chksum_sha256": "2a4c9f45ce6008ad71f746bbf08e674a685f80b4e131c020c225ae557da77a6f",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bf87cfa32925218e60bb073c8615fc9e1fcc4c378c675bc0cd92e7e3edd1d73b",
+ "chksum_sha256": "f27f656b981fe0dd93b7a40e9404c32cc981275731b9d500ef38b2c85003049a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sdn_proxy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9303d906f87ac398f7eb66b0e488a89ae2d93b64d428ce74dce367e725167ef9",
+ "chksum_sha256": "0ce6d311bd22520b669428035a33dafed0025af2503863643a13ee72789eea93",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_ptp_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "382f3121f2209ff8c298e3b2f9f2046fd930a856d826ba29eb63d0fe0de240be",
+ "chksum_sha256": "58d8538fbd298f4fe76559cdfe5c562f688ce8880526b7947c428e6c85d4d4df",
"format": 1
},
{
"name": "plugins/modules/fortios_system_snmp_user.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7df7e4d02f2179cae1d88ad7a3ea1d6dc23e1ce9db94d12d3b435df8e6262b13",
+ "chksum_sha256": "49bfceb418a55fe6caaa80f41ded3fcd7f761566887af50ff3e4322fa83e110e",
"format": 1
},
{
"name": "plugins/modules/fortios_application_custom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d5b190e4d53f35a3c66b6bd1a18fdc6c142e86d547710a8f2b97014dcc8d1951",
+ "chksum_sha256": "ce11eed2bfbcffb0ff0369aea3424fd3edd4fb01af8e7bfd085d207b870c9c5b",
"format": 1
},
{
"name": "plugins/modules/fortios_system_nat64.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f688bd8ef2e8496f944bb2b8354bf33f9ae4a83f956e2e5866feabd928b85094",
+ "chksum_sha256": "4f14c286efcbbfdb745ddc13083e3ef43a13dc40373e7ca8733339e42429369b",
"format": 1
},
{
"name": "plugins/modules/fortios_system_console.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5370d7ae8dbe195e38e6082665851b1e2c40776348efb7d20b935160825f58d2",
+ "chksum_sha256": "147d2f5c1dc45f47fd2f027dbb745a890ccf9995c294d0f8b036bb7820df8b0d",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_anqp_3gpp_cellular.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9792d41971bdaad555c24da61dd3cc87cbf5de414fadbacfc0fac5521c85d294",
+ "chksum_sha256": "71b273160a09ac25815a401c19b82fdec5e652cdbf587d7d2ab153c94403e138",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ike.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82674db4afb4efef189bebffd500c761132409ed62d4e341a2762325f369d71d",
+ "chksum_sha256": "95d7fa189db68ca6cbc83f7fac5d7daabba13e9c7e04fe9ebba90292172deb00",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_remote_log.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "63632e3c85349b9d1f3b79a2d1ea0a8d81501d6b20ff2b4560405fd0a953357c",
+ "chksum_sha256": "8bc5ceac4d0b05d244326e69911ff691552d1211b2c754dc65b9ccacc39dfe47",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sso_admin.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "756a79f8aa196b83d555f303ca8f35dfaf326ce1c4cd594aae423df803eef57e",
+ "chksum_sha256": "a4e52d037ffad2866514599aad14feefe8872b815babb6a248818456261bf5ac",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_cloud_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e7105b4b99016d324db3acd990e575b31afeafd0cdd44e98407364e2016e7c7",
+ "chksum_sha256": "d17deba17dab7aa75091544193f47a2f3f01e7cae4218222659c9fa05170dadf",
"format": 1
},
{
"name": "plugins/modules/fortios_extension_controller_dataplan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b0915c8bbdd233f71b673e6e5c4898251ef192dd0f34ef30baa5088b0aae95e0",
+ "chksum_sha256": "aa772e05118c2f8e28b0d26d3c7b04e1ec8ac4ce468da06b4c357d5c784f39e1",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_ips_urlfilter_cache_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ece4a7028079e787dcfd46223bb6093877cc85c6c47bc27af9ed1637cb139526",
+ "chksum_sha256": "31cb1bec90725f36df2d72d49c4849c53af8cd161957af71c480c49f5da9b5cd",
"format": 1
},
{
"name": "plugins/modules/fortios_system_session_ttl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f35eb05b71fc2ef1fbed6050d3e4762eaf61a03a43091b0395c8feebd243588a",
+ "chksum_sha256": "99a48b8f8153aebc541faed50fb76566f50a0e6ae3b181aca9d03a0462d64b78",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_profile_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "239c1d583e52ff7dc5ec1090c686532995223958234d1eb67ad3d31952fde340",
+ "chksum_sha256": "8f100de645e3673df29e81391b5fccaa46402c49b6c4520281ac5d0d8116d9ef",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_pptp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "968c7f79696769cd3f4069556fddee47557d2eee13d17b644c295437441268a6",
+ "chksum_sha256": "b08a5d42e5dd6d12f469c687ef5177fa4e61b33f2b898be5b80f7046812c2865",
"format": 1
},
{
"name": "plugins/modules/fortios_waf_sub_class.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de9461a3f79f60f773c6f33b25c61a79fd16528774d1fdbe08a0c7858520625a",
+ "chksum_sha256": "7054826aa2b66a2c8f6b42b42d2849ba736f3cefa8f09d01d1ba56c6f48c2703",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c37e5b11d4ec225227656168e016b15170d0c7aa5b158cb917e0d1c65b344d9a",
+ "chksum_sha256": "82921760f5b2c80e9cd614d990dde2d42c2c8ed0d8b5b5957330432d6a509407",
"format": 1
},
{
"name": "plugins/modules/fortios_user_saml.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7268240b9ed2903929490ded7bdab43c567c5c7be07558debaa4458c61c49f38",
+ "chksum_sha256": "9b475ae9db4fb85440918b2b9aed17afa58e0096a48d1a34830418286b1d99e8",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fsso_polling.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f37fae0bdb3c728d03482fd976867bf7bfc6d08a6bc6897c0335064809125e75",
+ "chksum_sha256": "ef34f4df535943386cf6b9ed1fb123f719f994c5c08212b3fe565fa557331ca4",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_decrypted_traffic_mirror.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ffe958f2e339ff4c5c9272bf0d94427030251962d30d30fc75083e6b6e3e5c9b",
+ "chksum_sha256": "b4a1605c2383987fe17fedcd6653862ba1a98db15a2ee2dc2469ac433fc6b7b5",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_forticlient_registration_sync.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a660387d0c8d817b050857ef56947e7698c130586378ee5e2dd719918fd6acc7",
+ "chksum_sha256": "4bdcb4b709aedfc9492ec4a9c9741ba034073a39a8209fe65f1d0a28a2157bd4",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ssl_ssh_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1c177e30801af03caab31532a8f9741db1508281fd681df6c1bde5054f30a7fa",
+ "chksum_sha256": "86676252444f5e24412aed3b57428f8ab3822e8fbd0427aa3d4728b4fd7223ea",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fortiai.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13dc87a033f5f1b6d8ff9c997d5bd5422a0a1749745aac8cff3d7a0f0106a6e3",
+ "chksum_sha256": "cf4e0bbd27bc149414e12f5a1c5774cb570926a75346d13a7147fa08e44d924d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sit_tunnel.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d9efb4e09da2be095ef246a8ddab22117d0d569023baada26eaf8edc5f6db7a4",
+ "chksum_sha256": "c9f97f34bccde0c7a934b0a5001381d92d7a33ebe3f4e9c8b350af9497f1040a",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_mac_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "005fb6ae3508245f1fe7e6be083c39929280a6196c689edf61c57f684925343e",
+ "chksum_sha256": "301778c9b45ba650f965c7427ec22b15216009d87bed320cf84ea2841044c71d",
"format": 1
},
{
"name": "plugins/modules/fortios_router_prefix_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b92ddcb7d9d7a1a84207ec1bf2c8fe9763b5602c1d9917d2e3cdbdd6bd871696",
+ "chksum_sha256": "8e093dcdd7a74f719078f797d0fd8dc0b4418d82a6256be3f2fef51dd3925677",
"format": 1
},
{
"name": "plugins/modules/fortios_system_virtual_wire_pair.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "95223f0e02a1621052a47d05532e128dfebdb7082830fe714e67a015668b951d",
+ "chksum_sha256": "cb35520f5c7a17559f675d6185ccb38cf4408cbf09f64d79751085ede4e58658",
"format": 1
},
{
"name": "plugins/modules/fortios_system_external_resource.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fad798c37b2c9c7df63de7bf8fdf4e71a9ca9dd3cc947500b34b8d2dc51b2eda",
+ "chksum_sha256": "09bfa9508c6e9be9e66c8999d646a9641f803a05424ece113944bb32b6c9cbbd",
"format": 1
},
{
"name": "plugins/modules/fortios_report_chart.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55947c04a3edd7982f4949790a8e43399d18f01d77130d4e7d32f4833aef927e",
+ "chksum_sha256": "53ca68c7eab24758b427bd8689138c1b658bfb0676447f4ced2f100bad521586",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_sniffer.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "19d21d3bed22ccfd9b49f2524da61cb6dfc66818eade825238ad338418989671",
+ "chksum_sha256": "14b16d8f131978350886902725ff6e0e38d7fea5355352021e4338e96035a9ec",
"format": 1
},
{
"name": "plugins/modules/fortios_user_domain_controller.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "62debb8f8c6c7ef784026e904b131c5bca9d8358db89ef020822284c3df0898e",
+ "chksum_sha256": "6cd1eb0772efb5ec67d8c9cc7e6847d2f541da0c0623c01bb31838bbc09fc2a3",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "50a40a9143780fd5026c82daf7d6093e4fbef196cbbe58c42306c6264bdddbfe",
+ "chksum_sha256": "14b1b6791f68c387cc7975fe20733012ac2697431fdead15c28dd9aa54954bfa",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_auto_config_custom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e9a7d7f9d366df4eef5a6e76a473548860531131a77fdd1e17f5aa99192101e1",
+ "chksum_sha256": "f89786e6ede9eabc05ad3d2c7ccf2ae8a9a4617c3f7d20c8ee4486b19eedec18",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_ftgd_local_cat.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "33772d1ea115401a1a0963f9f5b7ff5faa9e73f06adf6b4f17e2561bdbb62702",
+ "chksum_sha256": "d883f3aea10a275f38a3b1c1e62ef2a4acb2b4bdbea1a00273addf932332ed0c",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_forticlient.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb48d550f347bb3bc2de87f85a3b28e48a5ee3687e046e0cf09aae5048ca15be",
+ "chksum_sha256": "8649fe0096de75d18ee716774a49c989c89f0e9030ff08c68a461b5abb70e511",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dhcp_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ffe8734286ab3465c1152cb000dbce82f975264e614929993e047beb4278368b",
+ "chksum_sha256": "628c6c63fd7213c3c0d7f7fe68b748be76ea4596912fe10b7d972f5daa0fc5a0",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_ipbl_vendor.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "332ab95ad0a53d6e2036846063ecb42c005af3339e9e3ad6297505f0e76f58d8",
+ "chksum_sha256": "eba2fa5cfac8d52e7710e97069156c9aca52716e8640c7162f13566354eb6c1e",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_spectral_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7b2a55925976f048152df9ff7a71a2cbf672cfd0490fda1a32c19d6d8d8b6def",
+ "chksum_sha256": "5eb8607e4304e447f00f68850d3ffb25ca4c06ffe2b883bfadaa0812eb9874e7",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ipsec_manualkey.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6544b7f72dc1b4f94aa4451699ffc189bfb7b02b89084d57f0bbcc1caf5f485c",
+ "chksum_sha256": "f2c77883821d074a017ae11da493470aba09634b464c2b2c696cf666d2bf3822",
"format": 1
},
{
"name": "plugins/modules/fortios_router_access_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2510be1990b63845b59067b47b1647f7cc3fa922921be35d213af6e39324bdb1",
+ "chksum_sha256": "79692477e82f8ef19bc7140cafb147a1503634be630ff64ae50e7b4520ffdba6",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortiguard_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "50f2b051d0eb0282455092b4f716d6abf32390245c941f88505ba2e7ec8759e9",
+ "chksum_sha256": "830f7cfd9068759b3ec4b8393755eb3e56a2dcf872217fae702127f451e29749",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_policy64.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9c0ab4fdae5f102e4e8897a8afa87f1c8f54596d3932e0ff6c854045bc3af4c4",
+ "chksum_sha256": "fc6cd3fa8618db232b0fc09a70c52f68cb33fd9e70e01fc8f17e474964e7e58f",
"format": 1
},
{
"name": "plugins/modules/fortios_system_wccp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "aeec58f51326b9840f78b26cf740ec059b20320170119ebc4acc5078805d933e",
+ "chksum_sha256": "aa821421f8a947d09073817be94972c4ccbdfc01f38bc703e79e37537352249f",
"format": 1
},
{
"name": "plugins/modules/fortios_user_tacacsplus.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f580cb53509739c0b46722c44ecf5fd9048b5df298b3b7fab1f1ab84c0267420",
+ "chksum_sha256": "8defe2be81d5256276ba48c87e955420e6d005e2b4ad9d5c6dd952ff50c1c266",
"format": 1
},
{
"name": "plugins/modules/fortios_user_device_category.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ba2722d13dc98234290367920463372761d6203680f303f1d6c330e8628cbba1",
+ "chksum_sha256": "473adb25deb32a193fc08db7bb93a384f94d6f73107147da3592d77f0ba6c05b",
"format": 1
},
{
"name": "plugins/modules/fortios_certificate_remote.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f6714f3f0ea06ff07f56b2fd3d91c3bdc2e26c2e2a730ec9e505a165505d441e",
+ "chksum_sha256": "d25e487b486e037701accb51c08d9855b9e42875f0847694f559813a0abcb793",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_apngrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f0e7589a9f557764cfb1f68bf32002dd3672b2a146b402a812bacf378fb8479",
+ "chksum_sha256": "2d14de8b9dba7c04d914eecbadb634a168f2ce58e374b0dd17e5c88e3a0f9de0",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_peer.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cd0522e73e094837e855274fe29d2b18cea70d41559bb3e5f4c69004e5438095",
+ "chksum_sha256": "72eadbc0c61f63c9c306f2b4dad1856b38d566a292d7959117aa827fb85e1dea",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer_cloud_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7422af87068536b891be7e57780be2f8d05ccef28944d712c1be27ef1755a137",
+ "chksum_sha256": "c832b0f53a187128bae6fc3fdae2937964913fdcc9f76c96b116f45a17763d46",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vxlan.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "79a46657b533624c64b5833811190901da79d41e56289b3e343b0bac6fd20d2f",
+ "chksum_sha256": "93f5725e685e783990662504135109c974e6ad3341c1a2f4c8e991efb72f94e8",
"format": 1
},
{
"name": "plugins/modules/fortios_system_arp_table.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cd24bd17f130c815bc25b37d7a444ca150f22fedf417ccc0bf5c3570fd87dee6",
+ "chksum_sha256": "4a7f1abde06cfd69378fa0a6692536952f7a8f9edcead8f9fd63ac6a8c1672f5",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_stp_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13b8d79d98ca18f9ca34a3b2abf0a0a06882a1f20222a2ec408622db85967c07",
+ "chksum_sha256": "6d53ab3085205a0ebc2e1ce2c2b0512ff615d6140df4bf2679f9261bfb69ff40",
"format": 1
},
{
"name": "plugins/modules/fortios_authentication_scheme.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2542148029835ba0d3fe9058dafa214820374cb17ab47ed5d18ebd99b27b81df",
+ "chksum_sha256": "d56764ccf723c49e751d5fbec3e7a327458722da1d4dcbe024590250753c1430",
"format": 1
},
{
"name": "plugins/modules/fortios_system_automation_stitch.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "01fc4e72285e3f6283d78b6c1b129b8300a86d6d3e9ab018bc40ab671c6e91e3",
+ "chksum_sha256": "fa03758d7198f9f3f6940c6432ce0e2b6e982a97478c70a9eba4d7b573b94a62",
+ "format": 1
+ },
+ {
+ "name": "plugins/modules/fortios_user_external_identity_provider.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "981b507467b10821f16d340dda5b432cc2ab8af6803582e96a3ebc96a41a224c",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67a23f944010357534b7cd61da6b4862e7c30840f2329b7d179a148defb1e5f1",
+ "chksum_sha256": "e106188ca37a5f44f0756f42d1fcb70ccabd9b992e3e946dcce1f20dc20b6b11",
"format": 1
},
{
"name": "plugins/modules/fortios_system_snmp_sysinfo.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "50b97f6b304eb4740606c7a766c18c0208a6c0076683288f964aaa3540040918",
+ "chksum_sha256": "0944c15e4abb2d67086ab878329064f4216aec7a2f5afeb7e5c0e7653f65fdf1",
"format": 1
},
{
"name": "plugins/modules/fortios_icap_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "17c3171c524f729befc33e3f8d6cd0ee964e5bed524638e044b61323366f67ce",
+ "chksum_sha256": "193a52ae8dd992c61a7510379be2feb23f740474bc186c45aa7b18e764c06cce",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7781bc6f6da65987f20403dff73f941760dee7927c414311a842d874928a1175",
+ "chksum_sha256": "305d515f7ca74878366a63216ef150f17cb101ef1db7522261e56b7c1a3230de",
"format": 1
},
{
"name": "plugins/modules/fortios_system_switch_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8375e85ff21ffdaeb40ab946fac356c3d72198bdd5e6b5fdc5055786b9ae4de8",
+ "chksum_sha256": "b9f1c051f97d45275fb25aac296da390843198fdc1b0351f1ecbe66ba73d07ca",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_botnet.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ecccb65606e0360e710b6f14688a28df53ca04868cd73d0cf3dcef2cb5cdc28a",
+ "chksum_sha256": "1a620cbf6d9ebe00b47582c47c12df20dea61f0daa695870782b4c8be7cbdd78",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_schedule_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "18e9de702254919bbfec379afd29c76d5828030ccf8427d9b27f62bfa0354831",
+ "chksum_sha256": "557587de6a188a43426171a5eadbf4fedd80bb42554ee18ddea815bb9936382d",
"format": 1
},
{
"name": "plugins/modules/fortios_log_memory_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d60fa2c66ae0413b81954254808c452b89a6c18be1bb0fbbf96d1d78f953b4ed",
+ "chksum_sha256": "e94747536b87db63996dfb8c3f61a29ed623fbd93aa697467fb9109e20a0237d",
"format": 1
},
{
"name": "plugins/modules/fortios_router_access_list6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1bc388dbc87575e6957d68a0342e69777f29a5d3072caac3120eb06dbda01876",
+ "chksum_sha256": "2337bd546a39048fe65ba0110df1fab07723a00634663e40287e5ec12d92ce18",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ssh_local_ca.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "20fa8c5105b7ac8477f4175f3189dd2eca6dbc39cdae62c9bcc5a534c00d2b6a",
+ "chksum_sha256": "3325d748644f4296588c325574a669e20b3a06441836a5e96849b62433cf20ca",
"format": 1
},
{
"name": "plugins/modules/fortios_ssh_filter_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "600dc8b94a49962015e55104b7206e6f0a82b9c98f4ebd0e71c5dad6c2441b01",
+ "chksum_sha256": "0c31799a19218972b82e7a2bd1c8a484ed0b3db1e20fb23e171c7367966b86fc",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_igmp_snooping.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f8fa42466a615a85afe9275a2f7d9a7b00c00bb8a75288b06867e3e6533e152",
+ "chksum_sha256": "39b85b3e58b724627de7b052378bdaafe4706e0a8ec125f0c578e5f65dbf149a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_email_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cbd62846407a11bbd231f4e2d6289d3d9a9197b877996159b299eb5ef403c9c6",
+ "chksum_sha256": "0e6726d870eb46dd1582e6ddb7f85a40d72809538ea5fb17accd87137be4c84a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_sflow.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8693fd65623c6dadac560ef93a856b04d6244c93d877eaff33c471ef1bc6b3de",
+ "chksum_sha256": "3bfb73e002f64f4a2927c5976ea638f6207caa55914229ba42f299ba64765124",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_wisp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "298f9bb4e2882377a913f03b7a6fd03b406a883065bc60f262fd31e3311edd78",
+ "chksum_sha256": "1b789739b70a76ea14858fee70d61bdfd8cd7ad4854cbb70d9785085f0e1afa0",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_storm_control_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "753a231d2a95c2e30e26f366fb0b68ea3d17f4234fb40cfbd32686ea3b1b212d",
+ "chksum_sha256": "9976a6bdcff56d894c8dd8db0926d24943ee9163538e870b9ae8151349fa377d",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_ocvpn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3c6dfa383bd60d351462d5f81aab0a32d3163c4789f9dda8186e98a806175781",
+ "chksum_sha256": "7693a349fbd44a4dd4c2a1bef45db434f41122ae0a4ae64fb2b18dbc425542a0",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_sensitivity.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9abfe5060e300a17112e92f41a1593ca41c42750e1c9c6d6ccd7231c1be75e67",
+ "chksum_sha256": "1f1e27f050d17fc3e15f0570b46f03eacfd5b11d24f4ed7a819934b6bac824cd",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_h2qp_wan_metric.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a4130fc343df074bcf05a5cfc0eaaf06a8f0c8a74c335b303db0b1c58e447c89",
+ "chksum_sha256": "969ed421422d4839562bac9c7b0be2f72bed5a557d6962e71be158a1396b0f4e",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_automation.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3a8fafbbce8663ac5a37a80cdb9a86fa801b2f2f9761b7f18d72b48ca25e1607",
+ "chksum_sha256": "1d91713fef39815cb164ac41fb78d175cc7de1171a374f18ba61186fe4815f99",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_h2qp_operator_name.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "44939fd46615be759ad432b8ecdfb7972ca7c440b67936899c922f67126eb61b",
+ "chksum_sha256": "49a4b72d24cf8abcd43a55e0a686a09bed82907505fe0562ed513974826f8f0b",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_proxy_addrgrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2750cee24c670a124f33ad02c81b17aa02ca41804e3fb619f1ae46e14ac6d2bd",
+ "chksum_sha256": "9de1269f1da9bdd020e1d0f736f90a0bc30890087bb67eb7dec19b8bbc7b6f50",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd4_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e312e0d14fd8022931a114eb8b6cac829fd7dcc7122aa452d03f5ee472d8b21",
+ "chksum_sha256": "7a0156880072038b57b2d0e16bdcf34221458e90b0921e8e2c4eb02cc6b036b0",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_global.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13fe55d6cb06a4ed375252eb5e92755000fa72787b49d1c77857b1f163c3a545",
+ "chksum_sha256": "10f9be3ef9c82fb9d952daf66e90226be75114b07407bb8f20aeee47548e84dc",
"format": 1
},
{
"name": "plugins/modules/fortios_system_dns.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "29eb46d990f8527772c66cce8d90f9b837c782b8a136a24899318c120b3adaff",
+ "chksum_sha256": "503a7093fa6c4b9d104bd59d5e5e31435db9d69f0bd34b0e27756fdda984ab55",
"format": 1
},
{
"name": "plugins/modules/fortios_web_proxy_global.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "27cddccccddc91b86a8b48ec8a1f986e215880d11682794d02ad94fe44e3b4b2",
+ "chksum_sha256": "e66dfa975f1c6bbf07dd75fe49965d6a91a78cc66121d4511fb7ae12358714f8",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_name.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a71ef801e6233471907780df9eac93fc2bb23d71136f3ac9b2e25d139cdaaa84",
+ "chksum_sha256": "6c4076cdf4139e0136bf9d7cb3689ac912bc7fdf3da56bee80391478f1fe006e",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_port_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7319100568bd3bdd0c7e7aff09b98c20e193393e590c1140477144642167ddbe",
+ "chksum_sha256": "410d50c51ae33f37579d1c1ce1facccd69d2e8f1ca4218d332f1d1debbf95e25",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_interface_policy6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7a58c94964e25279c12e378781862e8cc58dd99bd3ee1d60051565d7405c5352",
+ "chksum_sha256": "5d0f101b6ce6fa488432344971ce76d2c9c487a766dfbe401e131bac4222d7b6",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_syslog_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ef02c568b46f8ba309764982bc3a5c49f950f52e4410b635a447e4a0026bca15",
+ "chksum_sha256": "3802ab708735465cab88f953f1e04af7cf75e22071424c6d6eb387f952721a06",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_ptp_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3fef645d46f3f75a6eae3bbb8240ac83ac24a451023606958a9191393de24f80",
+ "chksum_sha256": "e9895005265d87decb72ee8538ef416dca549d12dc9eda1e7cdbc97871b43c60",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_schedule_onetime.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f968c67bbcb511de1896ad17e049aa58fa804e01125df15366e3c7bc0d6945f2",
+ "chksum_sha256": "782f2b0fe3a1cc463d66a60ed3c730b45080a77659544502a9c462aa189a5ccf",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_status.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "13fc8a21f5f821211071051155f49f807eb1cd8c5237181d4d7b8d2b67397a4a",
+ "chksum_sha256": "cb7ccb369f0dbd2e2fb959b3db792fc86c359559e01827a70d56fe7141290eae",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_rule_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c01b1fa34f244b9c36166d10f55d8cfe32ca0585630f2ddfc0c99aafbf1cc0f1",
+ "chksum_sha256": "3e6548e2ef5565f6c6aaefe431e121dcea13edd3cce460e045e7cd4fbf23ac7d",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vendor_mac.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fad67956844f1ba23ad1c0d3d9d4332f5b6cdabbbfc9d302383a6d2fb5d91927",
+ "chksum_sha256": "9487e0453fc519b129b210be1484c86c5dc0f3edc224f3ad8f56dd0415626384",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_ip_translation.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "96d34a5f0251c8e25ee29a3bb219d72ca5749bc13e6259fc889ef6cf6262600c",
+ "chksum_sha256": "4b5768b7bd69b6842d0af91e4423969e42ad25cf6d6a4c89028f2f3685ec8e02",
"format": 1
},
{
"name": "plugins/modules/fortios_router_community_list.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b1b9237cfb352517dea28dc28d4bfd8ae902ea903a1376d5f5954f3902c43060",
+ "chksum_sha256": "9d92d9b360757e1330b746d43b95bde66efa4b12eda930d3d0f2bc8d3bcd7f58",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_rat_timeout_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6960c995e2441d00b84b1e48b568b8b9982fdf8c2679c4c864d889386652467c",
+ "chksum_sha256": "b9edbfaa9beb121e33d9d431e1cac155a8c69a7d729ef79aca2e2b737cb77828",
"format": 1
},
{
"name": "plugins/modules/fortios_user_device.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9a063c020236ba58ba5c7cd39460e44cafb786f60f7df57f3d129860fcb16fa8",
+ "chksum_sha256": "2ac90b74d4284189bff4e665ba636acae3d7b3602cceacf804fb0ba82bf22c57",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_qos_ip_dscp_map.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "fbcf1c59b70d9e73b9b23c988433c041aa113f50afb26c8404c5685b3bd53616",
+ "chksum_sha256": "4bee38cbbdb972007cafaa6fe4053c905026665ecd11d1e69b5a8af0e827c01d",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer2_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1a55a10dce4ce75b8b1e6d17fa4f39330d23414a34df72343feb7ec46418a53a",
+ "chksum_sha256": "b69883f4a74cb31e5ea70d1a5b24d7d1960ba59ec9971d62b4638871de10d87c",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_nac_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c1997c98282535565cfa70bb7934c2ad7a65b7ec3e91756a368c4c4bd0c4058d",
+ "chksum_sha256": "949ec70189066fa1e4f8e0f8fb09b034f46e52400cfdab058533a1863ea4ab55",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_dos_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "73ffa93222f9122fe45dd2c1905ce60b45bb353d4f369e4443f653986720e8c9",
+ "chksum_sha256": "a04b9a221326b56a63e9c44c83657dab76ba5ee9859ed8ed656cd17714bfbcee",
"format": 1
},
{
"name": "plugins/modules/fortios_nsxt_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b010d3e41a14b981f2c5ecce3fa0811f64eb440e36324f8c8b0e9e09db6a3176",
+ "chksum_sha256": "8059afea74728aa5a505ae1a0f53005d3467362bc99afb3f4262a98303056fd2",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_snmp_user.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c0f68dbb3c21ba27928f064a5a87ec9eff86a2be90aa277e00b16f4f44467849",
+ "chksum_sha256": "3b0bb50ab2b0eb055684cb8c101cfe1bdc47034e3a2037b2e86bd6b0f43f15c8",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ips_urlfilter_dns6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "41904c7559048fcba46f5aff5496f47c75b8d3d1809f680b3b914d71bf020cea",
+ "chksum_sha256": "62fb916eb75c11596a858ae2781ab408436b6a84e12314bc74a1ae93b4aabc1a",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ipv6_tunnel.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "67734032ddb071928d73c155c107c6f1a50c2bd6a0478f0bbe9402ec3f0ec02b",
+ "chksum_sha256": "38bc49d578aeb00b57b9106a2684162649e59650d070ddbcb9b6d4f3721f0405",
"format": 1
},
{
"name": "plugins/modules/fortios_application_rule_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3ddb7614efee15d6c8906464b7a3f65f54eefced8a7f75fc475318f727f04f6e",
+ "chksum_sha256": "07328278f10d7bb8f7e3c50818fb689e826723ddb48006fdb2fe0bbe1ae29e99",
"format": 1
},
{
"name": "plugins/modules/fortios_report_dataset.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cc47f0cd86466862b460bd68f98ac96f16b1ce35c1615be010940e7868e8692d",
+ "chksum_sha256": "fdce9de8c50d5b331d8f32c1b2a92e4ed600e1395bfa5ec44cdfa02f141ce124",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_definition.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9688bbc373dcba4e330a5df25aa364b9e19da19d287481bc8678cea71b3e0ae2",
+ "chksum_sha256": "0c35924f33074c0fb8494a69f46f00f37e60ea99325b59e34aaa5b513dbf0251",
"format": 1
},
{
"name": "plugins/modules/fortios_system_gi_gk.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a36ba9ef7721584e2d97407c3a2d8e70d907723dce908b5a60f4643c028c0c3a",
+ "chksum_sha256": "8e5a96eafea4f01dbc7cfaab9f5fabe2b3cae7acdc091c5f2c16a97c4759272f",
"format": 1
},
{
"name": "plugins/modules/fortios_user_krb_keytab.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "840ef444fbdf8be8a9d29c52422e59240b33e638824ee8594f1f5a96511cd193",
+ "chksum_sha256": "a796865ec83b7530ac8a5d3c67867d38bc8977834d6a1f28b5543e8f4840b6f1",
"format": 1
},
{
"name": "plugins/modules/fortios_wanopt_remote_storage.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a5e2e1e71acc0ee86eee9ba6d77e7ac9fe505fb963ca7a95d36a2837c7c3931f",
+ "chksum_sha256": "cf94e88b28b8916d12ddf01fc3aca85a38c38bb6adede94a744039afe971f8bd",
"format": 1
},
{
"name": "plugins/modules/fortios_log_tacacsplusaccounting2_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2bfbe79b7de8607cf7a671b37afb87320d5a0933bf4723b2ab2474dd6a70a353",
+ "chksum_sha256": "1a61d422c420bacd8c2f16513e874996e957883e693012268b4ed6db04c5c072",
"format": 1
},
{
"name": "plugins/modules/fortios_system_interface.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74222b3e00fda535680341c79f0bdc7f5c325222e110a7f2b3a570ff3787774d",
+ "chksum_sha256": "b006c886d7847b9c9f148cab2ce6582971cb5dd2bbb9750eea1986f2dcfe70f0",
"format": 1
},
{
"name": "plugins/modules/fortios_system_gre_tunnel.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "35c6f8bfc32542cfd6a82a9284cfbf4d824d8dd9e6fd47fce01b82993b790959",
+ "chksum_sha256": "5b5554d577cc014e1fa36742bc30f6c7bf17dfb4459dc3ef234071b417d1b185",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vdom_radius_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "da67c8290d3a22dd0053f6838011285c1e5af059b8a1815b5861ed0b1e9cc211",
+ "chksum_sha256": "688ddfd071ffd264c4f0658090d523c60136ca3e3c23920a0b3214a16b4059d6",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_custom.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7d6f0fccfb15c9f99e78bfc37fa977c306de4233ef049c40de77df936080d206",
+ "chksum_sha256": "3e60d05e75848f7a151bc16659affc119230949ccbe2d3b52fd995bfc8dab64a",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_lte_carrier_by_mcc_mnc.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "90ddf43b0a1bc2a4200e6131682f491d542dabda610bd212e090798108984ca1",
+ "chksum_sha256": "0fb98b531a38eb67a5e725e26c8fad82bddfb4425f6da2699f2c37a69cf8eb9b",
"format": 1
},
{
"name": "plugins/modules/fortios_hardware_npu_np6_sse_stats.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c7cf27a998e914a8e913be50144319563db01d38c51bd578251b01cb0dee3a6",
+ "chksum_sha256": "438c99b33fbbc115529fb0a90cbe5bac24b60ecc062af72fa45624eb66084bca",
"format": 1
},
{
"name": "plugins/modules/fortios_system_affinity_interrupt.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "644597b17606a11a2db75a9887de4a16d07e1e75caf803dca4bf6b6ad6a8c94a",
+ "chksum_sha256": "7c01e0ab63ca856af0ecfc13869ba6ae28ec72494ef822161a737f19784706ca",
"format": 1
},
{
"name": "plugins/modules/fortios_system_mobile_tunnel.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dbdf71f3846226c7bdf64225198354623ab16fe13d4cda5e8a8437f3e6b4fe90",
+ "chksum_sha256": "72e634c05614f040588bd2056ca399fd39f56a55629b6da7649f6d6a3af3bec4",
"format": 1
},
{
"name": "plugins/modules/fortios_extension_controller_fortigate.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "052125dbeb10f43831caee6eba03f77da137cd28230c9ab38bd4eb0739c67f34",
+ "chksum_sha256": "2cb9806c0db1b77dfbf8f2ea814474306f1d876b809f84bf1efb242c1b16ac9f",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7cf79e087bf5f1c5b41e06d5fb03a3cbf15cf4ee137540ec897980e49e243276",
+ "chksum_sha256": "7b0c71cc9cc2b232ae42817adbc366cbf3300661c1527f94e6800dc557a9fb09",
"format": 1
},
{
"name": "plugins/modules/fortios_system_virtual_switch.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2ee4ccd37d52bd14e10ced8ab818e0eab11623a2124fc05332b456759e6ee46b",
+ "chksum_sha256": "440b290a9f7b815f114f8951626f8db735eae3866f0d287a02c8020e9f0014a9",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer2_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "450a96fbc4a84ee154a4a804486a527493d030f4fb34cc63b0a00aab4b8a54af",
+ "chksum_sha256": "afcc09ed85e7b02b3cc186c7938d76deeeb46fd84a8f0be4e4acfb804ddcb326",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_log.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2e7c7bf5458122fc5906df489c83494f73d51044ccb781216e6b7eb4be8a8e22",
+ "chksum_sha256": "e5ca5021378ad59972e82ef411b884b8e1789ed6121748068a56c9f319228386",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer2_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e788c097c67f4eef3be507e1e5492b73cc72822231eaff8009d2cf80f3ecbfdf",
+ "chksum_sha256": "a8e053c24b32d182be32f2c89aa78111bcc4645c4f1c9bddeed200e042b83c9f",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_nac_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "60b1016d962e2c95f4cf47085074431bc09a0d813a0cc2dc60a8f4a3e0e43513",
+ "chksum_sha256": "e29d559d21d905969f694e52e60162cf280a2f01da9b3c74820222356d3ff610",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vipgrp6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "43096053344c3d866370ea997aa2f48cb4edf807ed4529674ba3db9293c2f53a",
+ "chksum_sha256": "29dd6b27e7bf2f5985ae9a7ca59cd38a128c3f3fc8222c212e5637e7ff516017",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_quarantine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "78bd766db409f021bb05c266caf16c7619c4f14b514372242ef7e04df6b2080e",
+ "chksum_sha256": "0791f186a7e1d27b63dbfb8695e01136038f65bcdbd185f441cbebb5327fb615",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_certificate_local.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7dba051a7d826daa4ecc61af49a633b6e3a07807884321f2931cc5b5f56c7469",
+ "chksum_sha256": "95ef267abc58a8a4895428c99f48c85d62410b85edbf9214599d7c803e32710d",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortiguard_override_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8bd4b532dd6420ebcd778bedd43787e2f80ed4f771f46b62b8b295f98ccf5ace",
+ "chksum_sha256": "91b66642dd90037840c270da35a16d66f384f2390a2abdd98d8ad1a5fcd1bf2d",
"format": 1
},
{
"name": "plugins/modules/fortios_log_syslogd4_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a088e71b5b700703e6c9ab5f9f2ffe758394b365ef6fd79530d2f8b1f3da7252",
+ "chksum_sha256": "2705ea6d7b40753a30948eee8f474890ade01b2c3b98a0972d4b721e7c04171d",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_ssid_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f206e3531cd3239a84990608eedb6b2ef39bda8315ce0119394172eae8809b16",
+ "chksum_sha256": "7940b71bdd99edb2c35ecf8f9671a723c156cd44a8d26f67c7b74891044837e7",
"format": 1
},
{
"name": "plugins/modules/fortios_configuration_fact.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "797586a4bd774400e183e615ba4a7bdfb83695e5dbf81f5b71f74c0940f89007",
+ "chksum_sha256": "aa78218110c71eea3a4f37dd8cb5d3b36b6ff178b3533c594f41fe807fe09f0c",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_fp_doc_source.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "41b7a8a63fa0b250f6be4015da0b9f985b3992f523d5212820508a12d8adfc51",
+ "chksum_sha256": "e2c2cc49689c240a9c52fe856d5ca28f9f8c47c2da0c9845d502ed7098c3925c",
"format": 1
},
{
"name": "plugins/modules/fortios_system_pcp_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "958cbdc6bdf604083982a037b03a802b8e5ab90eae7abb8e3a9e6211efef0f80",
+ "chksum_sha256": "d8cc3c1febefd79aaa7379cfe714cc0ffd9948c887047ac42963d027fbb6ad41",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_policy46.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2fb1814f7af95032e4c891bca4f9eb3c7190fb7f8dc0e26c69644e7f760a23d4",
+ "chksum_sha256": "6547dd5d4594d248d8a5df9b6c1fde66279301c2fd8ae575ad9f5de8ffff1a37",
"format": 1
},
{
"name": "plugins/modules/fortios_system_npu.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "68dbdc9317d022a6c4fd27d50350feee7bebbe669310dd9b287ec22e125269da",
+ "chksum_sha256": "4e80bd96258773164129f7ab376b64a6aee598d9efab405695fa70d0b6852554",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vip64.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "32efd409a8b9710a96b45abc5021ef2512bbc8ed822c206930f21da97c942dd5",
+ "chksum_sha256": "18448bc13ef5986057617d48e57fefc6e2c0f64aa713638e1b1c2374ecc639c4",
"format": 1
},
{
"name": "plugins/modules/fortios_dlp_filepattern.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "61939c240fe308f257f6719d8545700ea5545ff0f193190a7fdd2d87eb66379b",
+ "chksum_sha256": "a584eccdd6a33d6b071edb24d34f0d77c3efcd753e63cfd76d71c8d965f244ea",
"format": 1
},
{
"name": "plugins/modules/fortios_certificate_local.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "a29875c7ee05db409ef072ebb206f850f9ba1e7dd877cce0ac1bf1c4b23eb28e",
+ "chksum_sha256": "cd169f025137fea96824eeb381f2133f810f82d2e5eb6b1cad2c2c18898a0f50",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_hotspot20_anqp_network_auth_type.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9ca65da46b764eb2215a59f0a53158f67b5533ae1f7545423bc23d0e7b7317a5",
+ "chksum_sha256": "fc0bf7039c084857dfd3d80ceb8a1f91160ae6a1f42ca6dadd6051715d56ff21",
"format": 1
},
{
"name": "plugins/modules/fortios_router_policy6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3e55bee9a2f825994ca027067f3d68e5111eaaa9ef60c899c4c41ea8989b9a7",
+ "chksum_sha256": "d4a09dae63ee0ef8c76b878503f9d9255b1e79404fbb9b5cdda5400fbab11bf1",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_kmip_server.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e47632103e78340985d645e8c6ac1a7d179248c43d026c81c55a9ba20f4633a9",
+ "chksum_sha256": "397f780a5d45a51ba4778d51480976f8ec10debc878436505f23c18769a879a4",
"format": 1
},
{
"name": "plugins/modules/fortios_endpoint_control_registered_forticlient.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1fedbc3528b43338de2a525622f1e74496e59c24b9eec71f04e4f9467aa835c6",
+ "chksum_sha256": "3aecdff3c238f2e3140aeaabb0bc4a14c6faf7ed703cee5048339149a1502e7a",
"format": 1
},
{
"name": "plugins/modules/fortios_router_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4b41034470cff0dd007c64789f99453f1e25041a4407cfe9c842434523e64e01",
+ "chksum_sha256": "1129541afc18484c022f465bab719fc926d3efbb31fca10b452401cfcf134d8c",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortianalyzer3_filter.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "670928c39e5309f390496b698be70f4aeaa799f02134628182bd8efedc12f090",
+ "chksum_sha256": "b1a33f10d74f68c652e9336bde587558acb431b12dc113036df751a344d39d62",
"format": 1
},
{
"name": "plugins/modules/fortios_system_physical_switch.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5bc65a55985d91f812ff7cf29530cf0c45c9a7fd2f201696a54501170caf8b25",
+ "chksum_sha256": "5c5ac63b5a1cc52e0b6ad51bcd8a5077cab5bccf7693c2546c0688f0a67fb328",
"format": 1
},
{
"name": "plugins/modules/fortios_user_quarantine.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ae85b3c3532a6f85bc9ce18947cabffcc7e39fb54c124509801c1cf8ce95496a",
+ "chksum_sha256": "f139f3ce711b2cdd911ac1fc3eb58fb2a165e5079f6f5f3d75ef756171b7e216",
"format": 1
},
{
"name": "plugins/modules/fortios_system_vne_tunnel.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "be6fb6ed37d81b9d26fead07cb6824becea2ccfad251b94e84bc4ab3233d9f47",
+ "chksum_sha256": "45c462da062a74ac3837d9da4e3bbd157d85c161946ce911dde5286b50994629",
"format": 1
},
{
"name": "plugins/modules/fortios_webfilter_ips_urlfilter_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "d7538dbd8968b12291eb061c7baa96d230443b80e0c88cfd1a5e8fdf4844024e",
+ "chksum_sha256": "b76edd07a0c73b7ed312fdff14f3140d539971110f1868a8c32d03103d5719da",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_vap.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "489316a6310004b0808dd8db557aae7ceff33efa268a4846dfdef797299a5bbf",
+ "chksum_sha256": "6c9ac828798945cda96c8b97cd35d6576bc90061f4f0bb958becc444fb0ed0fa",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_message_filter_v2.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "c58e30636a089a7bacef2ead3043a450f8853515e163955d7ba67c78f1829b0b",
+ "chksum_sha256": "db3407ae678f32089d273c10ee009c4dcd695c75fe372788936dbb17beb99b75",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_policy6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "5f4db3a94c92760b107eb6f783c90914638fe41cc9691bb46948934a461e04f4",
+ "chksum_sha256": "9dbf030ca8712f05b724f9581cb05ee7f9ece44d858759f2f786e3aa40a35799",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_traffic_quota.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8485dbcda2ccd223aa31333717fdf107791f83024327339806b27be78b05085",
+ "chksum_sha256": "430ddd14307f00328fe208f7e2ed685817c2452f9be2a8ccd344c0fae6ba5fc2",
"format": 1
},
{
"name": "plugins/modules/fortios_system_fabric_vpn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "131da021cba1d8d6cb296894bd364a0efaa0c1b8f16a2584e93cd137aa68179e",
+ "chksum_sha256": "ed5d36ca6a7d557e6986cb2d59fc73952b671b45c84666995ed2fdbc65cecbe7",
"format": 1
},
{
"name": "plugins/modules/fortios_vpn_certificate_ca.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "1fc9e338ce598639838d8c788630f107341eb35b6b7174941dc35e1fbd022e78",
+ "chksum_sha256": "d2f1171903eda9108b3be8656d845b404bf1b189b3f4290bdfb494fa50653331",
"format": 1
},
{
"name": "plugins/modules/fortios_user_peer.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0d4f49c02874cfc4182883fd6bb060cdcdd41074d70045792bbfdcfb285a64c5",
+ "chksum_sha256": "b182ff9657893f25084813f57265532cbeef0e37530267439d3c557fc264a10d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_settings.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f8a70abad07a6d03e0d52e653c91b6cbd0b0e978e40d36fe5b5f20c026cb9860",
+ "chksum_sha256": "60733e4235557cd8f810757105522542556c8d53a18d4de8f6c7f025dd7c64fb",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_apcfg_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bb80073aa15e40fb1dc455cf60a11117dd97b0b3dfdb7041cbed6a526e1a296c",
+ "chksum_sha256": "86d5fac05f7582f808c3dbd640caf8c061ecc89f8c9d2490c2c499767f0fa2e1",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_acl6.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "93864fc97a5e17efcff80c10b06159195b833d9a0fb82771c149999a978f160d",
+ "chksum_sha256": "e51cd74e05b69e95beefb3c05e59672a6d7565a004c077da78ee6ce219143b20",
"format": 1
},
{
"name": "plugins/modules/fortios_extender_sys_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "128ce50983de1ebafc1962096a8c3ca4bd2501a9cb084ebf27d8cabe5a7117c3",
+ "chksum_sha256": "d5f10fc83a63b9c54fc35dc86570964aa3d178075faf120ebbd62de624fc9c5a",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_central_snat_map.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "046753c8608f33f89cce8bd56eff4203fcd90295bed200816fb06985bf9d569c",
+ "chksum_sha256": "90b034ef241e94aad82589d619ee963860384350de65c734373d48fefed5c49d",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_ptp_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "11af45630e31fd69c188c712403c1a50712a20c3c8f8c5d30fc64c90e143bf28",
+ "chksum_sha256": "94f11d624063aebe6b0460e972fd612ea600e8beb34c2dad6d4db4e8c2f93576",
"format": 1
},
{
"name": "plugins/modules/fortios_system_ha.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ad78bd7f77f2eb340819a3a0bdc85c7d10ddb7ef01ab66a6c98372f4ec4f5e26",
+ "chksum_sha256": "06b3d8e84707c260ebba61c88f76f4cb3523ab573888184683f43cd1e71cef6a",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_multicast_address.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0dabdb36ace812763fe010482603cdd34ca0a263aa7c1264fc5951d8afa624f3",
+ "chksum_sha256": "b449c77b1b5046947bc0fe244d761c0df88606e95dddef69ffcab568dcf2af9e",
"format": 1
},
{
"name": "plugins/modules/fortios_gtp_apn.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "59978e7c42918dd6e530de1c1378ce68556e3bed31b113e6b3bb317ce2dd5deb",
+ "chksum_sha256": "9aab3505385188b9d20dd1f66b4a977671629977d7ebb15c92d295f3d512ea52",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_http.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab1b61796942452a914c340c12d2de93025d5f9670f543e8eb2b84828eeb7e8f",
+ "chksum_sha256": "299e2108315a7fe2899598b5f34c08cf40248e393d1392e88f4fc40ea6d3749f",
"format": 1
},
{
"name": "plugins/modules/fortios_system_tos_based_priority.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2abccd85d2ad3a69506674521b7d6968809cd20a32df88b097426519a679bab3",
+ "chksum_sha256": "823113c7d50d815c2fccacf20b7a896846427c24b88d690766d9ae6f476aa55d",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_mm4.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4e703995f119bd579e80d83496c4122f688498ae91566fcd1da0b86a27eb2705",
+ "chksum_sha256": "867e4d8806239a486cf5b80b91df7456188932748bc8d06d26c29e9166fb3efd",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_switch_log.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "bdd876d232cb66a48467ca97170447ef18af452a39ce3db701a7c25ade030d5e",
+ "chksum_sha256": "fae764cf943e4bdc3d1fc062b413a0e5ff52ea708b501cd441c882de78286263",
"format": 1
},
{
"name": "plugins/modules/fortios_log_fortiguard_override_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "55806df3589080054b984d1d68f5cedeb43832bec0222406635eebdd778812a9",
+ "chksum_sha256": "d79a860f190d59deeb0a64acb8d32c9a5b3cd7f9af4edb86e4fa063dd6918e07",
"format": 1
},
{
"name": "plugins/modules/fortios_system_replacemsg_nntp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "69fbbb1ab8807391496d028922d0fbaa7c2e9d6fd3159c01aeccd5cfc4dc8974",
+ "chksum_sha256": "38e6da0e70fda164fbaa6d2336031a95f69f0ddfa78661337892982a1067aed8",
"format": 1
},
{
"name": "plugins/modules/fortios_waf_profile.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "021ed74542a15e1c583f9b54bb5bd4c0af1a53a89f16bdea709cf170c9f7539a",
+ "chksum_sha256": "0c439f369a0308d5c4381aa3046970dfd7f9c017b7c4f3288fb110acd0272536",
"format": 1
},
{
"name": "plugins/modules/fortios_log_null_device_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b195bc9a29fa1d88459708d07f41706929e11bf5a8cadb14a72889ec9f6d8b2c",
+ "chksum_sha256": "44da9a29d0fd0435d739255638ff84dea64488f84b3dfc0bb739c179199091eb",
"format": 1
},
{
"name": "plugins/modules/fortios_log_tacacsplusaccounting_setting.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "710dbb74ee20d260fb8299ab67a0f4ce778e51a19965dee21b873ced15ce47af",
+ "chksum_sha256": "c2db619a1c025aeccbd47ca5ef8672cc8d40b28ca833591b984216153086b919",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_fortishield.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "81aeab1d426ce3544154b5e91c28c14443e9fa190488a949c18e55ac75d574f4",
+ "chksum_sha256": "bbb615bfe965e2a2c4d9061456b0c36a32e5f1b30732d3d641c6102808094481",
"format": 1
},
{
"name": "plugins/modules/fortios_spamfilter_dnsbl.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ab7343037821403d37e224719b343f0d37da307d8a2e96eea6d70d74633ad0ec",
+ "chksum_sha256": "b392df29f24a2b737941573d0a4c3600e8d35ed64be15bdcbba90d89d02dd236",
"format": 1
},
{
"name": "plugins/modules/fortios_ips_view_map.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "00ba13fec73ac8b6dab9e0e24eb56c70987ed2ac82fb9f9fcef6380cd05f7129",
+ "chksum_sha256": "e48fbce28b7b475a1f3dc31dd97804791b9ebbf0bddd60e88729c1d38c0e1ad8",
"format": 1
},
{
"name": "plugins/modules/fortios_ftp_proxy_explicit.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f6bd978826094722487eb13dba860a9bb6976ec56a8544f1530d8f409c1e6667",
+ "chksum_sha256": "c436b0ad53d5a87a7d9b753957bc19b140755c3cb1c518cfa9cffe64cb765d8c",
"format": 1
},
{
"name": "plugins/modules/fortios_hardware_npu_np6_dce.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "529d5ed44246e1a64970db66425a4a7e1d4caae8965014f57a59625993985b6e",
+ "chksum_sha256": "a3688a30ad9829a105931e92a9b8ec662ae38262adf4ec5d0298cf17c47965a7",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_region.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f0a9ad7523823c7f06cfb3fb80079e837c2b31115bf223c04a0fc06182994613",
+ "chksum_sha256": "118ddc535f4aa3956fa1cad7d4386fa6b8fa27c4b3c3b90b7604f9eb8a756f57",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_addrgrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28133e8c83869fa085e55652ca6fb36f5694b003cf4e20e88a01b71d71040362",
+ "chksum_sha256": "d3673c47c663f9ea35217809b7eed138ea72ccb88b34ad27f6e8696d5b2adc70",
"format": 1
},
{
"name": "plugins/modules/fortios_wireless_controller_vap_group.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e33eda10b07ac07993babac49b15c4507238c6c97a07a7fcb2f6794f8d618e35",
+ "chksum_sha256": "7742883a5b0706e7e1801d6be703ed98922be18e03f82d1898fea830e6c05c9c",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_vipgrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0a02cba060b5b3463845f781867e590dc8cd90221abe84112dd6c0463f7fb3d2",
+ "chksum_sha256": "72754fb0cafeef3ecc09cc2a50256c15fe1ea9aa5ec4a01bca8340a891da5040",
"format": 1
},
{
"name": "plugins/modules/fortios_firewall_internet_service_append.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9bf04f16bc29775a8a7d4e4d34cac127b6da95d3233242a5e9967a915e45e4c0",
+ "chksum_sha256": "631b9d90064d6613f46d9d5c8a98c4827f4081cbf6d617c25b4b29a3b6e49f3c",
"format": 1
},
{
"name": "plugins/modules/fortios_switch_controller_snmp_community.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7416fc6e84495a4bcdf48c8cdd0bf967ccd9a977cbecca03afc39d64e94e12a3",
+ "chksum_sha256": "d1eb41b45ab82d4a0a3ed183859be301fe3266b1311cd8ef1b84af7612105717",
"format": 1
},
{
@@ -4925,7 +4967,7 @@
"name": "meta/runtime.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4833e2900333e7a035d7e0f63f6d55777c2697476ee0a2f9bfcf250167c7571d",
+ "chksum_sha256": "16fee19238e61fab14a7974fd79800cd659367bbc8b052d9f0b190108f6a2c53",
"format": 1
},
{
@@ -4953,28 +4995,28 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "304508b2188848abfde7f52aaca442040d33cf2934ad2c7ec74b66e155d8c27f",
+ "chksum_sha256": "63375e63757114267a9b0cb88bff7e982bf7d72ae9dcb95764e3d8131dc5eedb",
"format": 1
},
{
"name": "changelogs/.plugin-cache.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7a5de4e5e1abdf8efcfa25d4786b700eaafa2903feb65393632a02c941e9f5f1",
+ "chksum_sha256": "23fc019ada15f1677c0a0f7c2fb7f1626783a935e40404b394d9924df06c61ef",
"format": 1
},
{
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ff4c923c42bd810ee674767665a3db00dabe1468b4e6e4273f79495339995933",
+ "chksum_sha256": "12d5512587e0c8dd386124b96b0f25663ea0087ddb2c29a0a9c820989fa58006",
"format": 1
},
{
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "798045ce36adaccce819db885d577fa12d1b173d7f85a68454b1963651a98b2c",
+ "chksum_sha256": "1ced7febb3f8e030e0f1b29165bc8d8e33ed6d6f57f376dbd2cc64408e935ab7",
"format": 1
}
],
diff --git a/ansible_collections/fortinet/fortios/MANIFEST.json b/ansible_collections/fortinet/fortios/MANIFEST.json
index f233a486f..28af7e1ae 100644
--- a/ansible_collections/fortinet/fortios/MANIFEST.json
+++ b/ansible_collections/fortinet/fortios/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "fortinet",
"name": "fortios",
- "version": "2.3.5",
+ "version": "2.3.6",
"authors": [
"Frank Shen (@frankshen01)",
"Hongbin Lu (@fgtdev-hblu)",
@@ -36,7 +36,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "df922021f51c884a96d2aed15957a1d8d97b15c40d7c543e4df4cb07df31bc0d",
+ "chksum_sha256": "d160b2068fe402a1b4c497afa2a977ee1f9971eaa6564099649d19c5a8384f43",
"format": 1
},
"format": 1
diff --git a/ansible_collections/fortinet/fortios/README.md b/ansible_collections/fortinet/fortios/README.md
index 48ad9348c..c2c9ff1ae 100644
--- a/ansible_collections/fortinet/fortios/README.md
+++ b/ansible_collections/fortinet/fortios/README.md
@@ -9,7 +9,7 @@ The collection is the FortiOS Ansible Automation project. It includes the module
This collection is distributed via [ansible-galaxy](https://galaxy.ansible.com/), the installation steps are as follows:
1. Install or upgrade to Ansible 2.14+
-2. Download this collection from galaxy: `ansible-galaxy collection install fortinet.fortios:2.3.5`
+2. Download this collection from galaxy: `ansible-galaxy collection install fortinet.fortios:2.3.6`
## Requirements
* Ansible 2.14+ is required to support the newer Ansible Collections format
@@ -17,7 +17,7 @@ This collection is distributed via [ansible-galaxy](https://galaxy.ansible.com/)
## Supported FortiOS Versions
From `v2.0.0` on, FortiOS galaxy collections are unified, and cover FortiOS 6.0, 6.2, 6.4, 7.0, 7.2 versions. There is only one sequential collection at any moment. users who install these collections are expected to find the version compatibility information for each module and its parameters.
-The latest version is 2.3.5, path to install: `ansible-galaxy collection install fortinet.fortios:2.3.5`
+The latest version is 2.3.6, path to install: `ansible-galaxy collection install fortinet.fortios:2.3.6`
Prior to FortiOS collection `v2.0.0`, FortiOS Galaxy collections were built over three FOS major versions, i.e. `v6.0`, `v6.2` and `v6.4`, thus, users are expected to install the collection according to the following table to avoid potential compatibility issues.
@@ -72,8 +72,10 @@ The collection provides the following modules:
* `fortios_cifs_profile` Configure CIFS profile in Fortinet's FortiOS and FortiGate.
* `fortios_configuration_fact` Retrieve Facts of FortiOS Configurable Objects.
* `fortios_credential_store_domain_controller` Define known domain controller servers in Fortinet's FortiOS and FortiGate.
+* `fortios_diameter_filter_profile` Configure Diameter filter profiles in Fortinet's FortiOS and FortiGate.
* `fortios_dlp_data_type` Configure predefined data type used by DLP blocking in Fortinet's FortiOS and FortiGate.
* `fortios_dlp_dictionary` Configure dictionaries used by DLP blocking in Fortinet's FortiOS and FortiGate.
+* `fortios_dlp_exact_data_match` Configure exact-data-match template used by DLP scan in Fortinet's FortiOS and FortiGate.
* `fortios_dlp_filepattern` Configure file patterns used by DLP blocking in Fortinet's FortiOS and FortiGate.
* `fortios_dlp_fp_doc_source` Create a DLP fingerprint database by allowing the FortiGate to access a file server containing files from which to create fingerprints in Fortinet's FortiOS and FortiGate.
* `fortios_dlp_fp_sensitivity` Create self-explanatory DLP sensitivity levels to be used when setting sensitivity under config fp-doc-source in Fortinet's FortiOS and FortiGate.
@@ -487,6 +489,7 @@ The collection provides the following modules:
* `fortios_system_netflow` Configure NetFlow in Fortinet's FortiOS and FortiGate.
* `fortios_system_network_visibility` Configure network visibility settings in Fortinet's FortiOS and FortiGate.
* `fortios_system_np6` Configure NP6 attributes in Fortinet's FortiOS and FortiGate.
+* `fortios_system_npu_vlink` Configure NPU VDOM link in Fortinet's FortiOS and FortiGate.
* `fortios_system_npu` Configure NPU attributes in Fortinet's FortiOS and FortiGate.
* `fortios_system_ntp` Configure system NTP information in Fortinet's FortiOS and FortiGate.
* `fortios_system_object_tagging` Configure object tagging in Fortinet's FortiOS and FortiGate.
@@ -574,6 +577,7 @@ The collection provides the following modules:
* `fortios_user_device` Configure devices in Fortinet's FortiOS and FortiGate.
* `fortios_user_domain_controller` Configure domain controller entries in Fortinet's FortiOS and FortiGate.
* `fortios_user_exchange` Configure MS Exchange server entries in Fortinet's FortiOS and FortiGate.
+* `fortios_user_external_identity_provider` Configure external identity provider in Fortinet's FortiOS and FortiGate.
* `fortios_user_fortitoken` Configure FortiToken in Fortinet's FortiOS and FortiGate.
* `fortios_user_fsso_polling` Configure FSSO active directory servers for polling mode in Fortinet's FortiOS and FortiGate.
* `fortios_user_fsso` Configure Fortinet Single Sign On (FSSO) agents in Fortinet's FortiOS and FortiGate.
@@ -592,6 +596,7 @@ The collection provides the following modules:
* `fortios_user_security_exempt_list` Configure security exemption list in Fortinet's FortiOS and FortiGate.
* `fortios_user_setting` Configure user authentication setting in Fortinet's FortiOS and FortiGate.
* `fortios_user_tacacsplus` Configure TACACS+ server entries in Fortinet's FortiOS and FortiGate.
+* `fortios_videofilter_keyword` Configure video filter keywords in Fortinet's FortiOS and FortiGate.
* `fortios_videofilter_profile` Configure VideoFilter profile in Fortinet's FortiOS and FortiGate.
* `fortios_videofilter_youtube_channel_filter` Configure YouTube channel filter in Fortinet's FortiOS and FortiGate.
* `fortios_videofilter_youtube_key` Configure YouTube API keys in Fortinet's FortiOS and FortiGate.
@@ -617,6 +622,7 @@ The collection provides the following modules:
* `fortios_vpn_l2tp` Configure L2TP in Fortinet's FortiOS and FortiGate.
* `fortios_vpn_ocvpn` Configure Overlay Controller VPN settings in Fortinet's FortiOS and FortiGate.
* `fortios_vpn_pptp` Configure PPTP in Fortinet's FortiOS and FortiGate.
+* `fortios_vpn_qkd` Configure Quantum Key Distribution server in Fortinet's FortiOS and FortiGate.
* `fortios_vpn_ssl_client` Client in Fortinet's FortiOS and FortiGate.
* `fortios_vpn_ssl_settings` Configure SSL-VPN in Fortinet's FortiOS and FortiGate.
* `fortios_vpn_ssl_web_host_check_software` SSL-VPN host check software in Fortinet's FortiOS and FortiGate.
diff --git a/ansible_collections/fortinet/fortios/changelogs/.plugin-cache.yaml b/ansible_collections/fortinet/fortios/changelogs/.plugin-cache.yaml
index 7ff0ccb3f..b083d6257 100644
--- a/ansible_collections/fortinet/fortios/changelogs/.plugin-cache.yaml
+++ b/ansible_collections/fortinet/fortios/changelogs/.plugin-cache.yaml
@@ -25,4 +25,4 @@ plugins:
strategy: {}
test: {}
vars: {}
-version: 2.3.5
+version: 2.3.6
diff --git a/ansible_collections/fortinet/fortios/changelogs/changelog.yaml b/ansible_collections/fortinet/fortios/changelogs/changelog.yaml
index e18766b3f..f2b637108 100644
--- a/ansible_collections/fortinet/fortios/changelogs/changelog.yaml
+++ b/ansible_collections/fortinet/fortios/changelogs/changelog.yaml
@@ -279,3 +279,27 @@ releases:
fragments:
- 2.3.5_release.yml
release_date: "2024-02-06"
+ 2.3.6:
+ changes:
+ bugfixes:
+ - Fix the issue that ssl-certificate cannot be set in `fortios_firewall_vip`
+ and `fortios_firewall_vip6`.
+ - Github issue
+ - Github issue
+ - Github issue
+ - Github issue
+ - Github issue
+ - Github issue
+ - mantis issue
+ major_changes:
+ - Add notes for backup modules in the documentation in both monitor and monitor_fact
+ modules.
+ - Supported new FOS versions 7.4.2 and 7.4.3, and support data type mac_address
+ in the collection.
+ - Update the documentation for the supported versions from latest to a fix version
+ number.
+ - Update the required ansible version to 2.15.
+ release_summary: patch release of 2.3.6
+ fragments:
+ - 2.3.6_relase.yml
+ release_date: "2024-04-03"
diff --git a/ansible_collections/fortinet/fortios/meta/runtime.yml b/ansible_collections/fortinet/fortios/meta/runtime.yml
index be99ccf4b..898ad8ff5 100644
--- a/ansible_collections/fortinet/fortios/meta/runtime.yml
+++ b/ansible_collections/fortinet/fortios/meta/runtime.yml
@@ -1,2 +1,2 @@
---
-requires_ansible: '>=2.14.0'
+requires_ansible: '>=2.15.0'
diff --git a/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/comparison.py b/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/comparison.py
index 0ed53cffb..2accf3ed5 100644
--- a/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/comparison.py
+++ b/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/comparison.py
@@ -121,7 +121,7 @@ def serialize(data):
else:
return sorted(data)
- if isinstance(data[0], dict):
+ if isinstance(data, dict):
result = {}
for key, value in data.items():
result[key] = serialize(value)
diff --git a/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/secret_field.py b/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/secret_field.py
index 597efeb04..9bf291e43 100644
--- a/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/secret_field.py
+++ b/ansible_collections/fortinet/fortios/plugins/module_utils/fortios/secret_field.py
@@ -25,7 +25,9 @@ secret_fields = [
"ddns_keyname", "eap_password", "n_mhae_key", "passwd1", "passwd2", "passwd3", "http_password", "password_attr",
"passwd_policy", "passwd_time", "rsso_secret", "secondary_secret", "secret", "sso_attribute_key", "secondary_key",
"tertiary_key", "sae_private_key", "tertiary_secret", "search_key", "est_http_password", "est_srp_password",
- "fortitoken_cloud_sync_interval", "mfa_password", "default_user_password_policy", "polestar_server_token"
+ "fortitoken_cloud_sync_interval", "mfa_password", "default_user_password_policy", "polestar_server_token",
+ "ssh_hostkey", "ssh_hostkey_password", "keyword", "sam_private_key", "sam_private_key_password",
+ "videofilter_keyword"
]
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_alertemail_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_alertemail_setting.py
index b4b2ab226..c7ee4fe64 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_alertemail_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_alertemail_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -483,11 +483,10 @@ def underscore_to_hyphen(data):
def alertemail_setting(data, fos):
vdom = data["vdom"]
alertemail_setting_data = data["alertemail_setting"]
- filtered_data = underscore_to_hyphen(
- filter_alertemail_setting_data(alertemail_setting_data)
- )
+ filtered_data = filter_alertemail_setting_data(alertemail_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("alertemail", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("alertemail", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_exempt_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_exempt_list.py
index 675bfae2e..ec2e3d8ff 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_exempt_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_exempt_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -243,12 +243,11 @@ def antivirus_exempt_list(data, fos):
state = data["state"]
antivirus_exempt_list_data = data["antivirus_exempt_list"]
- filtered_data = underscore_to_hyphen(
- filter_antivirus_exempt_list_data(antivirus_exempt_list_data)
- )
+ filtered_data = filter_antivirus_exempt_list_data(antivirus_exempt_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("antivirus", "exempt-list", data=filtered_data, vdom=vdom)
+ return fos.set("antivirus", "exempt-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_heuristic.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_heuristic.py
index 3b7bfd769..89952e9a7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_heuristic.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_heuristic.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -206,11 +206,10 @@ def underscore_to_hyphen(data):
def antivirus_heuristic(data, fos):
vdom = data["vdom"]
antivirus_heuristic_data = data["antivirus_heuristic"]
- filtered_data = underscore_to_hyphen(
- filter_antivirus_heuristic_data(antivirus_heuristic_data)
- )
+ filtered_data = filter_antivirus_heuristic_data(antivirus_heuristic_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("antivirus", "heuristic", data=filtered_data, vdom=vdom)
+ return fos.set("antivirus", "heuristic", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_mms_checksum.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_mms_checksum.py
index f68cfc0b0..522df04bb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_mms_checksum.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_mms_checksum.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -264,9 +264,8 @@ def antivirus_mms_checksum(data, fos, check_mode=False):
state = data["state"]
antivirus_mms_checksum_data = data["antivirus_mms_checksum"]
- filtered_data = underscore_to_hyphen(
- filter_antivirus_mms_checksum_data(antivirus_mms_checksum_data)
- )
+ filtered_data = filter_antivirus_mms_checksum_data(antivirus_mms_checksum_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -330,7 +329,7 @@ def antivirus_mms_checksum(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("antivirus", "mms-checksum", data=filtered_data, vdom=vdom)
+ return fos.set("antivirus", "mms-checksum", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_notification.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_notification.py
index 02bf6577f..952a75f1c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_notification.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_notification.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -267,9 +267,8 @@ def antivirus_notification(data, fos, check_mode=False):
state = data["state"]
antivirus_notification_data = data["antivirus_notification"]
- filtered_data = underscore_to_hyphen(
- filter_antivirus_notification_data(antivirus_notification_data)
- )
+ filtered_data = filter_antivirus_notification_data(antivirus_notification_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -333,7 +332,7 @@ def antivirus_notification(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("antivirus", "notification", data=filtered_data, vdom=vdom)
+ return fos.set("antivirus", "notification", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_profile.py
index 4afe858b4..e0ea03688 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -470,7 +470,7 @@ options:
- 'ignore'
fortisandbox_max_upload:
description:
- - Maximum size of files that can be uploaded to FortiSandbox.
+ - Maximum size of files that can be uploaded to FortiSandbox in Mbytes.
type: int
fortisandbox_mode:
description:
@@ -1973,12 +1973,11 @@ def antivirus_profile(data, fos):
antivirus_profile_data = data["antivirus_profile"]
antivirus_profile_data = flatten_multilists_attributes(antivirus_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_antivirus_profile_data(antivirus_profile_data)
- )
+ filtered_data = filter_antivirus_profile_data(antivirus_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("antivirus", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("antivirus", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("antivirus", "profile", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_quarantine.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_quarantine.py
index 2f52d03e3..ef8e41946 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_quarantine.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_quarantine.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -522,11 +522,10 @@ def antivirus_quarantine(data, fos):
vdom = data["vdom"]
antivirus_quarantine_data = data["antivirus_quarantine"]
antivirus_quarantine_data = flatten_multilists_attributes(antivirus_quarantine_data)
- filtered_data = underscore_to_hyphen(
- filter_antivirus_quarantine_data(antivirus_quarantine_data)
- )
+ filtered_data = filter_antivirus_quarantine_data(antivirus_quarantine_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("antivirus", "quarantine", data=filtered_data, vdom=vdom)
+ return fos.set("antivirus", "quarantine", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_settings.py
index a1df0ea8c..9e811f979 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_antivirus_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -261,11 +261,10 @@ def underscore_to_hyphen(data):
def antivirus_settings(data, fos):
vdom = data["vdom"]
antivirus_settings_data = data["antivirus_settings"]
- filtered_data = underscore_to_hyphen(
- filter_antivirus_settings_data(antivirus_settings_data)
- )
+ filtered_data = filter_antivirus_settings_data(antivirus_settings_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("antivirus", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("antivirus", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_custom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_custom.py
index a6894a1ac..f7ab53a2b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_custom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_custom.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -281,9 +281,8 @@ def application_custom(data, fos, check_mode=False):
state = data["state"]
application_custom_data = data["application_custom"]
- filtered_data = underscore_to_hyphen(
- filter_application_custom_data(application_custom_data)
- )
+ filtered_data = filter_application_custom_data(application_custom_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -347,7 +346,7 @@ def application_custom(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("application", "custom", data=filtered_data, vdom=vdom)
+ return fos.set("application", "custom", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("application", "custom", mkey=filtered_data["tag"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_group.py
index 9cd734797..40cb1ef17 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -364,9 +364,8 @@ def application_group(data, fos, check_mode=False):
application_group_data = data["application_group"]
application_group_data = flatten_multilists_attributes(application_group_data)
- filtered_data = underscore_to_hyphen(
- filter_application_group_data(application_group_data)
- )
+ filtered_data = filter_application_group_data(application_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -430,7 +429,7 @@ def application_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("application", "group", data=filtered_data, vdom=vdom)
+ return fos.set("application", "group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("application", "group", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_list.py
index 4a203f5d5..358fea9fe 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -709,9 +709,8 @@ def application_list(data, fos, check_mode=False):
application_list_data = data["application_list"]
application_list_data = flatten_multilists_attributes(application_list_data)
- filtered_data = underscore_to_hyphen(
- filter_application_list_data(application_list_data)
- )
+ filtered_data = filter_application_list_data(application_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -775,7 +774,7 @@ def application_list(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("application", "list", data=filtered_data, vdom=vdom)
+ return fos.set("application", "list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("application", "list", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_name.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_name.py
index 88df2a230..3389f546c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_name.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_name.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -333,9 +333,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"default value": "default_value"}
+ speciallist = {"default value": "default_value"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -344,8 +344,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -361,10 +364,8 @@ def application_name(data, fos, check_mode=False):
state = data["state"]
application_name_data = data["application_name"]
- filtered_data = underscore_to_hyphen(
- filter_application_name_data(application_name_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_application_name_data(application_name_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_rule_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_rule_settings.py
index 0ece60975..5521d63ea 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_rule_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_application_rule_settings.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -227,9 +227,10 @@ def application_rule_settings(data, fos, check_mode=False):
state = data["state"]
application_rule_settings_data = data["application_rule_settings"]
- filtered_data = underscore_to_hyphen(
- filter_application_rule_settings_data(application_rule_settings_data)
+ filtered_data = filter_application_rule_settings_data(
+ application_rule_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -293,7 +294,7 @@ def application_rule_settings(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("application", "rule-settings", data=filtered_data, vdom=vdom)
+ return fos.set("application", "rule-settings", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_rule.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_rule.py
index 1691002b8..c3d00da44 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_rule.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_rule.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -395,9 +395,8 @@ def authentication_rule(data, fos, check_mode=False):
state = data["state"]
authentication_rule_data = data["authentication_rule"]
- filtered_data = underscore_to_hyphen(
- filter_authentication_rule_data(authentication_rule_data)
- )
+ filtered_data = filter_authentication_rule_data(authentication_rule_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -461,7 +460,7 @@ def authentication_rule(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("authentication", "rule", data=filtered_data, vdom=vdom)
+ return fos.set("authentication", "rule", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_scheme.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_scheme.py
index b48908fb5..937120032 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_scheme.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_scheme.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -373,9 +373,8 @@ def authentication_scheme(data, fos, check_mode=False):
authentication_scheme_data = flatten_multilists_attributes(
authentication_scheme_data
)
- filtered_data = underscore_to_hyphen(
- filter_authentication_scheme_data(authentication_scheme_data)
- )
+ filtered_data = filter_authentication_scheme_data(authentication_scheme_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -439,7 +438,7 @@ def authentication_scheme(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("authentication", "scheme", data=filtered_data, vdom=vdom)
+ return fos.set("authentication", "scheme", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_setting.py
index bff03f6c2..595a3df27 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_authentication_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -190,7 +190,7 @@ options:
suboptions:
name:
description:
- - CA certificate list. Source vpn.certificate.ca.name.
+ - CA certificate list. Source vpn.certificate.ca.name vpn.certificate.local.name.
required: true
type: str
"""
@@ -224,7 +224,7 @@ EXAMPLES = """
update_time: "<your_own_value>"
user_cert_ca:
-
- name: "default_name_25 (source vpn.certificate.ca.name)"
+ name: "default_name_25 (source vpn.certificate.ca.name vpn.certificate.local.name)"
"""
RETURN = """
@@ -357,11 +357,10 @@ def underscore_to_hyphen(data):
def authentication_setting(data, fos):
vdom = data["vdom"]
authentication_setting_data = data["authentication_setting"]
- filtered_data = underscore_to_hyphen(
- filter_authentication_setting_data(authentication_setting_data)
- )
+ filtered_data = filter_authentication_setting_data(authentication_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("authentication", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("authentication", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_automation_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_automation_setting.py
index 3a4f75391..bd7c31503 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_automation_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_automation_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -210,11 +210,10 @@ def underscore_to_hyphen(data):
def automation_setting(data, fos):
vdom = data["vdom"]
automation_setting_data = data["automation_setting"]
- filtered_data = underscore_to_hyphen(
- filter_automation_setting_data(automation_setting_data)
- )
+ filtered_data = filter_automation_setting_data(automation_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("automation", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("automation", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_profile.py
index 27ea05cff..98cb82fd1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -210,6 +210,13 @@ options:
- Safe search control name.
required: true
type: str
+ status:
+ description:
+ - Enable/disable setting.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
tenant_control:
description:
- Enable/disable tenant control.
@@ -264,10 +271,11 @@ EXAMPLES = """
safe_search_control:
-
name: "default_name_22"
+ status: "enable"
tenant_control: "enable"
tenant_control_tenants:
-
- name: "default_name_25"
+ name: "default_name_26"
"""
RETURN = """
@@ -411,10 +419,11 @@ def casb_profile(data, fos):
casb_profile_data = data["casb_profile"]
casb_profile_data = flatten_multilists_attributes(casb_profile_data)
- filtered_data = underscore_to_hyphen(filter_casb_profile_data(casb_profile_data))
+ filtered_data = filter_casb_profile_data(casb_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("casb", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("casb", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("casb", "profile", mkey=filtered_data["name"], vdom=vdom)
@@ -464,6 +473,11 @@ versioned_schema = {
"type": "string",
"required": True,
},
+ "status": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"safe_search": {
"v_range": [["v7.4.1", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_saas_application.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_saas_application.py
index 92e2f79d9..832e9e74e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_saas_application.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_saas_application.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
- SaaS application name.
required: true
type: str
+ status:
+ description:
+ - Enable/disable setting.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
type:
description:
- SaaS application type.
@@ -138,6 +145,7 @@ EXAMPLES = """
-
domain: "<your_own_value>"
name: "default_name_7"
+ status: "enable"
type: "built-in"
uuid: "<your_own_value>"
"""
@@ -222,7 +230,15 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post
def filter_casb_saas_application_data(json):
- option_list = ["casb_name", "description", "domains", "name", "type", "uuid"]
+ option_list = [
+ "casb_name",
+ "description",
+ "domains",
+ "name",
+ "status",
+ "type",
+ "uuid",
+ ]
json = remove_invalid_fields(json)
dictionary = {}
@@ -253,12 +269,11 @@ def casb_saas_application(data, fos):
state = data["state"]
casb_saas_application_data = data["casb_saas_application"]
- filtered_data = underscore_to_hyphen(
- filter_casb_saas_application_data(casb_saas_application_data)
- )
+ filtered_data = filter_casb_saas_application_data(casb_saas_application_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("casb", "saas-application", data=filtered_data, vdom=vdom)
+ return fos.set("casb", "saas-application", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -302,6 +317,11 @@ versioned_schema = {
"children": {
"name": {"v_range": [["v7.4.1", ""]], "type": "string", "required": True},
"uuid": {"v_range": [["v7.4.1", ""]], "type": "string"},
+ "status": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"type": {
"v_range": [["v7.4.1", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_user_activity.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_user_activity.py
index c5d53b97a..d233061d3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_user_activity.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_casb_user_activity.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -193,6 +193,13 @@ options:
- Operation value.
required: true
type: str
+ status:
+ description:
+ - CASB control option status.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
description:
description:
- CASB user activity description.
@@ -301,6 +308,13 @@ options:
- CASB user activity name.
required: true
type: str
+ status:
+ description:
+ - CASB user activity status.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
type:
description:
- CASB user activity type.
@@ -341,10 +355,11 @@ EXAMPLES = """
values:
-
value: "<your_own_value>"
+ status: "enable"
description: "<your_own_value>"
match:
-
- id: "22"
+ id: "23"
rules:
-
case_sensitive: "enable"
@@ -352,7 +367,7 @@ EXAMPLES = """
-
domain: "<your_own_value>"
header_name: "<your_own_value>"
- id: "28"
+ id: "29"
match_pattern: "simple"
match_value: "<your_own_value>"
methods:
@@ -362,7 +377,8 @@ EXAMPLES = """
type: "domains"
strategy: "and"
match_strategy: "and"
- name: "default_name_37"
+ name: "default_name_38"
+ status: "enable"
type: "built-in"
uuid: "<your_own_value>"
"""
@@ -456,6 +472,7 @@ def filter_casb_user_activity_data(json):
"match",
"match_strategy",
"name",
+ "status",
"type",
"uuid",
]
@@ -489,12 +506,11 @@ def casb_user_activity(data, fos):
state = data["state"]
casb_user_activity_data = data["casb_user_activity"]
- filtered_data = underscore_to_hyphen(
- filter_casb_user_activity_data(casb_user_activity_data)
- )
+ filtered_data = filter_casb_user_activity_data(casb_user_activity_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("casb", "user-activity", data=filtered_data, vdom=vdom)
+ return fos.set("casb", "user-activity", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -538,6 +554,11 @@ versioned_schema = {
"children": {
"name": {"v_range": [["v7.4.1", ""]], "type": "string", "required": True},
"uuid": {"v_range": [["v7.4.1", ""]], "type": "string"},
+ "status": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"description": {"v_range": [["v7.4.1", ""]], "type": "string"},
"type": {
"v_range": [["v7.4.1", ""]],
@@ -657,6 +678,11 @@ versioned_schema = {
"type": "string",
"required": True,
},
+ "status": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"operations": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_ca.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_ca.py
index 09e7cefa7..c33ee103b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_ca.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_ca.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -321,9 +321,8 @@ def certificate_ca(data, fos, check_mode=False):
state = data["state"]
certificate_ca_data = data["certificate_ca"]
- filtered_data = underscore_to_hyphen(
- filter_certificate_ca_data(certificate_ca_data)
- )
+ filtered_data = filter_certificate_ca_data(certificate_ca_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -387,7 +386,7 @@ def certificate_ca(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("certificate", "ca", data=filtered_data, vdom=vdom)
+ return fos.set("certificate", "ca", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("certificate", "ca", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_crl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_crl.py
index 10478a682..301aea9e0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_crl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_crl.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -312,9 +312,8 @@ def certificate_crl(data, fos, check_mode=False):
state = data["state"]
certificate_crl_data = data["certificate_crl"]
- filtered_data = underscore_to_hyphen(
- filter_certificate_crl_data(certificate_crl_data)
- )
+ filtered_data = filter_certificate_crl_data(certificate_crl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -378,7 +377,7 @@ def certificate_crl(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("certificate", "crl", data=filtered_data, vdom=vdom)
+ return fos.set("certificate", "crl", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("certificate", "crl", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_local.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_local.py
index cdfbc0ee2..8c79352c1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_local.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_local.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -474,9 +474,8 @@ def certificate_local(data, fos, check_mode=False):
state = data["state"]
certificate_local_data = data["certificate_local"]
- filtered_data = underscore_to_hyphen(
- filter_certificate_local_data(certificate_local_data)
- )
+ filtered_data = filter_certificate_local_data(certificate_local_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -540,7 +539,7 @@ def certificate_local(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("certificate", "local", data=filtered_data, vdom=vdom)
+ return fos.set("certificate", "local", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("certificate", "local", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_remote.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_remote.py
index b2d1eb470..c0e3b688d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_remote.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_certificate_remote.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -247,9 +247,8 @@ def certificate_remote(data, fos, check_mode=False):
state = data["state"]
certificate_remote_data = data["certificate_remote"]
- filtered_data = underscore_to_hyphen(
- filter_certificate_remote_data(certificate_remote_data)
- )
+ filtered_data = filter_certificate_remote_data(certificate_remote_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -313,7 +312,7 @@ def certificate_remote(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("certificate", "remote", data=filtered_data, vdom=vdom)
+ return fos.set("certificate", "remote", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_domain_controller.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_domain_controller.py
index b3722ed1b..1e8eb09f8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_domain_controller.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_domain_controller.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -263,9 +263,8 @@ def cifs_domain_controller(data, fos, check_mode=False):
state = data["state"]
cifs_domain_controller_data = data["cifs_domain_controller"]
- filtered_data = underscore_to_hyphen(
- filter_cifs_domain_controller_data(cifs_domain_controller_data)
- )
+ filtered_data = filter_cifs_domain_controller_data(cifs_domain_controller_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -329,7 +328,7 @@ def cifs_domain_controller(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("cifs", "domain-controller", data=filtered_data, vdom=vdom)
+ return fos.set("cifs", "domain-controller", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_profile.py
index 0a39b3308..c8a6dec21 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_cifs_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -379,7 +379,8 @@ def cifs_profile(data, fos, check_mode=False):
cifs_profile_data = data["cifs_profile"]
cifs_profile_data = flatten_multilists_attributes(cifs_profile_data)
- filtered_data = underscore_to_hyphen(filter_cifs_profile_data(cifs_profile_data))
+ filtered_data = filter_cifs_profile_data(cifs_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -443,7 +444,7 @@ def cifs_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("cifs", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("cifs", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("cifs", "profile", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_configuration_fact.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_configuration_fact.py
index 2c1d96e9f..14117cf4a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_configuration_fact.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_configuration_fact.py
@@ -414,6 +414,7 @@ options:
- 'vpn.certificate_crl'
- 'vpn.certificate_ocsp-server'
- 'vpn.certificate_setting'
+ - 'vpn_qkd'
- 'vpn.ssl.web_realm'
- 'vpn.ssl.web_host-check-software'
- 'vpn.ssl.web_portal'
@@ -421,16 +422,16 @@ options:
- 'vpn.ssl.web_user-bookmark'
- 'vpn.ssl_settings'
- 'vpn.ssl_client'
- - 'vpn_kmip-server'
+ - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1'
- 'vpn.ipsec_phase2'
- 'vpn.ipsec_manualkey'
- 'vpn.ipsec_concentrator'
- - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1-interface'
- 'vpn.ipsec_phase2-interface'
- 'vpn.ipsec_manualkey-interface'
- 'vpn.ipsec_forticlient'
+ - 'vpn_kmip-server'
- 'vpn_pptp'
- 'vpn_l2tp'
- 'certificate_ca'
@@ -454,6 +455,7 @@ options:
- 'ips_global'
- 'ips_settings'
- 'sctp-filter_profile'
+ - 'diameter-filter_profile'
- 'web-proxy_profile'
- 'web-proxy_global'
- 'web-proxy_explicit'
@@ -477,6 +479,7 @@ options:
- 'application_group'
- 'dlp_data-type'
- 'dlp_dictionary'
+ - 'dlp_exact-data-match'
- 'dlp_sensor'
- 'dlp_filepattern'
- 'dlp_sensitivity'
@@ -484,7 +487,7 @@ options:
- 'dlp_profile'
- 'dlp_settings'
- 'videofilter_youtube-key'
- - 'videofilter_youtube-channel-filter'
+ - 'videofilter_keyword'
- 'videofilter_profile'
- 'emailfilter_bword'
- 'emailfilter_block-allow-list'
@@ -553,6 +556,8 @@ options:
- 'icap_server'
- 'icap_server-group'
- 'icap_profile'
+ - 'user_peer'
+ - 'user_peergrp'
- 'user_certificate'
- 'user_radius'
- 'user_tacacs+'
@@ -562,6 +567,7 @@ options:
- 'user_domain-controller'
- 'user_pop3'
- 'user_saml'
+ - 'user_external-identity-provider'
- 'user_fsso'
- 'user_adgrp'
- 'user_fsso-polling'
@@ -569,8 +575,6 @@ options:
- 'user_password-policy'
- 'user_local'
- 'user_setting'
- - 'user_peer'
- - 'user_peergrp'
- 'user_quarantine'
- 'user_group'
- 'user_security-exempt-list'
@@ -640,22 +644,14 @@ options:
- 'system_isf-queue-profile'
- 'system_npu'
- 'system_np6'
+ - 'system_gi-gk'
- 'system_modem'
- 'system.3g-modem_custom'
- 'system_lte-modem'
- - 'firewall_acl'
- - 'firewall_acl6'
- - 'monitoring_np6-ipsec-engine'
- - 'monitoring_npu-hpe'
- - 'switch-controller.ptp_settings'
- - 'switch-controller.ptp_policy'
- - 'system_physical-switch'
- - 'system_virtual-switch'
- - 'system_stp'
- - 'system_gi-gk'
- 'firewall_gtp'
- 'firewall_pfcp'
- - 'vpn_ocvpn'
+ - 'firewall_acl'
+ - 'firewall_acl6'
- 'gtp_apn'
- 'gtp_apngrp'
- 'gtp_message-filter-v0v1'
@@ -665,6 +661,17 @@ options:
- 'gtp_tunnel-limit'
- 'gtp_apn-shaper'
- 'pfcp_message-filter'
+ - 'monitoring_np6-ipsec-engine'
+ - 'monitoring_npu-hpe'
+ - 'system_npu-vlink'
+ - 'system_physical-switch'
+ - 'system_virtual-switch'
+ - 'system_stp'
+ - 'system_smc-ntp'
+ - 'videofilter_youtube-channel-filter'
+ - 'switch-controller.ptp_settings'
+ - 'switch-controller.ptp_policy'
+ - 'vpn_ocvpn'
- 'system.replacemsg_mail'
- 'system.replacemsg_http'
- 'system.replacemsg_webproxy'
@@ -829,7 +836,6 @@ options:
- 'firewall_policy6'
- 'antivirus_notification'
- 'antivirus_mms-checksum'
- - 'system_smc-ntp'
- 'switch-controller_vlan'
- 'switch-controller.security-policy_captive-portal'
- 'user_device'
@@ -1145,6 +1151,7 @@ options:
- 'vpn.certificate_crl'
- 'vpn.certificate_ocsp-server'
- 'vpn.certificate_setting'
+ - 'vpn_qkd'
- 'vpn.ssl.web_realm'
- 'vpn.ssl.web_host-check-software'
- 'vpn.ssl.web_portal'
@@ -1152,16 +1159,16 @@ options:
- 'vpn.ssl.web_user-bookmark'
- 'vpn.ssl_settings'
- 'vpn.ssl_client'
- - 'vpn_kmip-server'
+ - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1'
- 'vpn.ipsec_phase2'
- 'vpn.ipsec_manualkey'
- 'vpn.ipsec_concentrator'
- - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1-interface'
- 'vpn.ipsec_phase2-interface'
- 'vpn.ipsec_manualkey-interface'
- 'vpn.ipsec_forticlient'
+ - 'vpn_kmip-server'
- 'vpn_pptp'
- 'vpn_l2tp'
- 'certificate_ca'
@@ -1185,6 +1192,7 @@ options:
- 'ips_global'
- 'ips_settings'
- 'sctp-filter_profile'
+ - 'diameter-filter_profile'
- 'web-proxy_profile'
- 'web-proxy_global'
- 'web-proxy_explicit'
@@ -1208,6 +1216,7 @@ options:
- 'application_group'
- 'dlp_data-type'
- 'dlp_dictionary'
+ - 'dlp_exact-data-match'
- 'dlp_sensor'
- 'dlp_filepattern'
- 'dlp_sensitivity'
@@ -1215,7 +1224,7 @@ options:
- 'dlp_profile'
- 'dlp_settings'
- 'videofilter_youtube-key'
- - 'videofilter_youtube-channel-filter'
+ - 'videofilter_keyword'
- 'videofilter_profile'
- 'emailfilter_bword'
- 'emailfilter_block-allow-list'
@@ -1284,6 +1293,8 @@ options:
- 'icap_server'
- 'icap_server-group'
- 'icap_profile'
+ - 'user_peer'
+ - 'user_peergrp'
- 'user_certificate'
- 'user_radius'
- 'user_tacacs+'
@@ -1293,6 +1304,7 @@ options:
- 'user_domain-controller'
- 'user_pop3'
- 'user_saml'
+ - 'user_external-identity-provider'
- 'user_fsso'
- 'user_adgrp'
- 'user_fsso-polling'
@@ -1300,8 +1312,6 @@ options:
- 'user_password-policy'
- 'user_local'
- 'user_setting'
- - 'user_peer'
- - 'user_peergrp'
- 'user_quarantine'
- 'user_group'
- 'user_security-exempt-list'
@@ -1371,22 +1381,14 @@ options:
- 'system_isf-queue-profile'
- 'system_npu'
- 'system_np6'
+ - 'system_gi-gk'
- 'system_modem'
- 'system.3g-modem_custom'
- 'system_lte-modem'
- - 'firewall_acl'
- - 'firewall_acl6'
- - 'monitoring_np6-ipsec-engine'
- - 'monitoring_npu-hpe'
- - 'switch-controller.ptp_settings'
- - 'switch-controller.ptp_policy'
- - 'system_physical-switch'
- - 'system_virtual-switch'
- - 'system_stp'
- - 'system_gi-gk'
- 'firewall_gtp'
- 'firewall_pfcp'
- - 'vpn_ocvpn'
+ - 'firewall_acl'
+ - 'firewall_acl6'
- 'gtp_apn'
- 'gtp_apngrp'
- 'gtp_message-filter-v0v1'
@@ -1396,6 +1398,17 @@ options:
- 'gtp_tunnel-limit'
- 'gtp_apn-shaper'
- 'pfcp_message-filter'
+ - 'monitoring_np6-ipsec-engine'
+ - 'monitoring_npu-hpe'
+ - 'system_npu-vlink'
+ - 'system_physical-switch'
+ - 'system_virtual-switch'
+ - 'system_stp'
+ - 'system_smc-ntp'
+ - 'videofilter_youtube-channel-filter'
+ - 'switch-controller.ptp_settings'
+ - 'switch-controller.ptp_policy'
+ - 'vpn_ocvpn'
- 'system.replacemsg_mail'
- 'system.replacemsg_http'
- 'system.replacemsg_webproxy'
@@ -1560,7 +1573,6 @@ options:
- 'firewall_policy6'
- 'antivirus_notification'
- 'antivirus_mms-checksum'
- - 'system_smc-ntp'
- 'switch-controller_vlan'
- 'switch-controller.security-policy_captive-portal'
- 'user_device'
@@ -2853,6 +2865,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "None",
"mkey_type": None,
},
+ "vpn_qkd": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"vpn.ssl.web_realm": {
"mkey": "url_path",
"mkey_type": str,
@@ -2881,7 +2897,7 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
- "vpn_kmip-server": {
+ "vpn.ipsec_fec": {
"mkey": "name",
"mkey_type": str,
},
@@ -2901,10 +2917,6 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "id",
"mkey_type": int,
},
- "vpn.ipsec_fec": {
- "mkey": "name",
- "mkey_type": str,
- },
"vpn.ipsec_phase1-interface": {
"mkey": "name",
"mkey_type": str,
@@ -2921,6 +2933,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "realm",
"mkey_type": str,
},
+ "vpn_kmip-server": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"vpn_pptp": {
"mkey": "None",
"mkey_type": None,
@@ -3013,6 +3029,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "diameter-filter_profile": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"web-proxy_profile": {
"mkey": "name",
"mkey_type": str,
@@ -3105,6 +3125,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "dlp_exact-data-match": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"dlp_sensor": {
"mkey": "name",
"mkey_type": str,
@@ -3133,7 +3157,7 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "id",
"mkey_type": int,
},
- "videofilter_youtube-channel-filter": {
+ "videofilter_keyword": {
"mkey": "id",
"mkey_type": int,
},
@@ -3409,6 +3433,14 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "user_peer": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
+ "user_peergrp": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"user_certificate": {
"mkey": "name",
"mkey_type": str,
@@ -3445,6 +3477,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "user_external-identity-provider": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"user_fsso": {
"mkey": "name",
"mkey_type": str,
@@ -3473,14 +3509,6 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "None",
"mkey_type": None,
},
- "user_peer": {
- "mkey": "name",
- "mkey_type": str,
- },
- "user_peergrp": {
- "mkey": "name",
- "mkey_type": str,
- },
"user_quarantine": {
"mkey": "None",
"mkey_type": None,
@@ -3757,6 +3785,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "system_gi-gk": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
"system_modem": {
"mkey": "None",
"mkey_type": None,
@@ -3769,6 +3801,14 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "None",
"mkey_type": None,
},
+ "firewall_gtp": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
+ "firewall_pfcp": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"firewall_acl": {
"mkey": "policyid",
"mkey_type": int,
@@ -3777,86 +3817,86 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "policyid",
"mkey_type": int,
},
- "monitoring_np6-ipsec-engine": {
- "mkey": "None",
- "mkey_type": None,
- },
- "monitoring_npu-hpe": {
- "mkey": "None",
- "mkey_type": None,
- },
- "switch-controller.ptp_settings": {
- "mkey": "None",
- "mkey_type": None,
- },
- "switch-controller.ptp_policy": {
+ "gtp_apn": {
"mkey": "name",
"mkey_type": str,
},
- "system_physical-switch": {
+ "gtp_apngrp": {
"mkey": "name",
"mkey_type": str,
},
- "system_virtual-switch": {
+ "gtp_message-filter-v0v1": {
"mkey": "name",
"mkey_type": str,
},
- "system_stp": {
- "mkey": "None",
- "mkey_type": None,
- },
- "system_gi-gk": {
- "mkey": "None",
- "mkey_type": None,
- },
- "firewall_gtp": {
+ "gtp_message-filter-v2": {
"mkey": "name",
"mkey_type": str,
},
- "firewall_pfcp": {
+ "gtp_rat-timeout-profile": {
"mkey": "name",
"mkey_type": str,
},
- "vpn_ocvpn": {
- "mkey": "None",
- "mkey_type": None,
- },
- "gtp_apn": {
+ "gtp_ie-allow-list": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_apngrp": {
+ "gtp_tunnel-limit": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_message-filter-v0v1": {
- "mkey": "name",
- "mkey_type": str,
+ "gtp_apn-shaper": {
+ "mkey": "id",
+ "mkey_type": int,
},
- "gtp_message-filter-v2": {
+ "pfcp_message-filter": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_rat-timeout-profile": {
+ "monitoring_np6-ipsec-engine": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "monitoring_npu-hpe": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "system_npu-vlink": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_ie-allow-list": {
+ "system_physical-switch": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_tunnel-limit": {
+ "system_virtual-switch": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_apn-shaper": {
+ "system_stp": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "system_smc-ntp": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "videofilter_youtube-channel-filter": {
"mkey": "id",
"mkey_type": int,
},
- "pfcp_message-filter": {
+ "switch-controller.ptp_settings": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "switch-controller.ptp_policy": {
"mkey": "name",
"mkey_type": str,
},
+ "vpn_ocvpn": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
"system.replacemsg_mail": {
"mkey": "msg_type",
"mkey_type": str,
@@ -4513,10 +4553,6 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "id",
"mkey_type": int,
},
- "system_smc-ntp": {
- "mkey": "None",
- "mkey_type": None,
- },
"switch-controller_vlan": {
"mkey": "name",
"mkey_type": str,
@@ -4993,6 +5029,7 @@ def main():
"vpn.certificate_crl",
"vpn.certificate_ocsp-server",
"vpn.certificate_setting",
+ "vpn_qkd",
"vpn.ssl.web_realm",
"vpn.ssl.web_host-check-software",
"vpn.ssl.web_portal",
@@ -5000,16 +5037,16 @@ def main():
"vpn.ssl.web_user-bookmark",
"vpn.ssl_settings",
"vpn.ssl_client",
- "vpn_kmip-server",
+ "vpn.ipsec_fec",
"vpn.ipsec_phase1",
"vpn.ipsec_phase2",
"vpn.ipsec_manualkey",
"vpn.ipsec_concentrator",
- "vpn.ipsec_fec",
"vpn.ipsec_phase1-interface",
"vpn.ipsec_phase2-interface",
"vpn.ipsec_manualkey-interface",
"vpn.ipsec_forticlient",
+ "vpn_kmip-server",
"vpn_pptp",
"vpn_l2tp",
"certificate_ca",
@@ -5033,6 +5070,7 @@ def main():
"ips_global",
"ips_settings",
"sctp-filter_profile",
+ "diameter-filter_profile",
"web-proxy_profile",
"web-proxy_global",
"web-proxy_explicit",
@@ -5056,6 +5094,7 @@ def main():
"application_group",
"dlp_data-type",
"dlp_dictionary",
+ "dlp_exact-data-match",
"dlp_sensor",
"dlp_filepattern",
"dlp_sensitivity",
@@ -5063,7 +5102,7 @@ def main():
"dlp_profile",
"dlp_settings",
"videofilter_youtube-key",
- "videofilter_youtube-channel-filter",
+ "videofilter_keyword",
"videofilter_profile",
"emailfilter_bword",
"emailfilter_block-allow-list",
@@ -5132,6 +5171,8 @@ def main():
"icap_server",
"icap_server-group",
"icap_profile",
+ "user_peer",
+ "user_peergrp",
"user_certificate",
"user_radius",
"user_tacacs+",
@@ -5141,6 +5182,7 @@ def main():
"user_domain-controller",
"user_pop3",
"user_saml",
+ "user_external-identity-provider",
"user_fsso",
"user_adgrp",
"user_fsso-polling",
@@ -5148,8 +5190,6 @@ def main():
"user_password-policy",
"user_local",
"user_setting",
- "user_peer",
- "user_peergrp",
"user_quarantine",
"user_group",
"user_security-exempt-list",
@@ -5219,22 +5259,14 @@ def main():
"system_isf-queue-profile",
"system_npu",
"system_np6",
+ "system_gi-gk",
"system_modem",
"system.3g-modem_custom",
"system_lte-modem",
- "firewall_acl",
- "firewall_acl6",
- "monitoring_np6-ipsec-engine",
- "monitoring_npu-hpe",
- "switch-controller.ptp_settings",
- "switch-controller.ptp_policy",
- "system_physical-switch",
- "system_virtual-switch",
- "system_stp",
- "system_gi-gk",
"firewall_gtp",
"firewall_pfcp",
- "vpn_ocvpn",
+ "firewall_acl",
+ "firewall_acl6",
"gtp_apn",
"gtp_apngrp",
"gtp_message-filter-v0v1",
@@ -5244,6 +5276,17 @@ def main():
"gtp_tunnel-limit",
"gtp_apn-shaper",
"pfcp_message-filter",
+ "monitoring_np6-ipsec-engine",
+ "monitoring_npu-hpe",
+ "system_npu-vlink",
+ "system_physical-switch",
+ "system_virtual-switch",
+ "system_stp",
+ "system_smc-ntp",
+ "videofilter_youtube-channel-filter",
+ "switch-controller.ptp_settings",
+ "switch-controller.ptp_policy",
+ "vpn_ocvpn",
"system.replacemsg_mail",
"system.replacemsg_http",
"system.replacemsg_webproxy",
@@ -5408,7 +5451,6 @@ def main():
"firewall_policy6",
"antivirus_notification",
"antivirus_mms-checksum",
- "system_smc-ntp",
"switch-controller_vlan",
"switch-controller.security-policy_captive-portal",
"user_device",
@@ -5732,6 +5774,7 @@ def main():
"vpn.certificate_crl",
"vpn.certificate_ocsp-server",
"vpn.certificate_setting",
+ "vpn_qkd",
"vpn.ssl.web_realm",
"vpn.ssl.web_host-check-software",
"vpn.ssl.web_portal",
@@ -5739,16 +5782,16 @@ def main():
"vpn.ssl.web_user-bookmark",
"vpn.ssl_settings",
"vpn.ssl_client",
- "vpn_kmip-server",
+ "vpn.ipsec_fec",
"vpn.ipsec_phase1",
"vpn.ipsec_phase2",
"vpn.ipsec_manualkey",
"vpn.ipsec_concentrator",
- "vpn.ipsec_fec",
"vpn.ipsec_phase1-interface",
"vpn.ipsec_phase2-interface",
"vpn.ipsec_manualkey-interface",
"vpn.ipsec_forticlient",
+ "vpn_kmip-server",
"vpn_pptp",
"vpn_l2tp",
"certificate_ca",
@@ -5772,6 +5815,7 @@ def main():
"ips_global",
"ips_settings",
"sctp-filter_profile",
+ "diameter-filter_profile",
"web-proxy_profile",
"web-proxy_global",
"web-proxy_explicit",
@@ -5795,6 +5839,7 @@ def main():
"application_group",
"dlp_data-type",
"dlp_dictionary",
+ "dlp_exact-data-match",
"dlp_sensor",
"dlp_filepattern",
"dlp_sensitivity",
@@ -5802,7 +5847,7 @@ def main():
"dlp_profile",
"dlp_settings",
"videofilter_youtube-key",
- "videofilter_youtube-channel-filter",
+ "videofilter_keyword",
"videofilter_profile",
"emailfilter_bword",
"emailfilter_block-allow-list",
@@ -5871,6 +5916,8 @@ def main():
"icap_server",
"icap_server-group",
"icap_profile",
+ "user_peer",
+ "user_peergrp",
"user_certificate",
"user_radius",
"user_tacacs+",
@@ -5880,6 +5927,7 @@ def main():
"user_domain-controller",
"user_pop3",
"user_saml",
+ "user_external-identity-provider",
"user_fsso",
"user_adgrp",
"user_fsso-polling",
@@ -5887,8 +5935,6 @@ def main():
"user_password-policy",
"user_local",
"user_setting",
- "user_peer",
- "user_peergrp",
"user_quarantine",
"user_group",
"user_security-exempt-list",
@@ -5958,22 +6004,14 @@ def main():
"system_isf-queue-profile",
"system_npu",
"system_np6",
+ "system_gi-gk",
"system_modem",
"system.3g-modem_custom",
"system_lte-modem",
- "firewall_acl",
- "firewall_acl6",
- "monitoring_np6-ipsec-engine",
- "monitoring_npu-hpe",
- "switch-controller.ptp_settings",
- "switch-controller.ptp_policy",
- "system_physical-switch",
- "system_virtual-switch",
- "system_stp",
- "system_gi-gk",
"firewall_gtp",
"firewall_pfcp",
- "vpn_ocvpn",
+ "firewall_acl",
+ "firewall_acl6",
"gtp_apn",
"gtp_apngrp",
"gtp_message-filter-v0v1",
@@ -5983,6 +6021,17 @@ def main():
"gtp_tunnel-limit",
"gtp_apn-shaper",
"pfcp_message-filter",
+ "monitoring_np6-ipsec-engine",
+ "monitoring_npu-hpe",
+ "system_npu-vlink",
+ "system_physical-switch",
+ "system_virtual-switch",
+ "system_stp",
+ "system_smc-ntp",
+ "videofilter_youtube-channel-filter",
+ "switch-controller.ptp_settings",
+ "switch-controller.ptp_policy",
+ "vpn_ocvpn",
"system.replacemsg_mail",
"system.replacemsg_http",
"system.replacemsg_webproxy",
@@ -6147,7 +6196,6 @@ def main():
"firewall_policy6",
"antivirus_notification",
"antivirus_mms-checksum",
- "system_smc-ntp",
"switch-controller_vlan",
"switch-controller.security-policy_captive-portal",
"user_device",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_credential_store_domain_controller.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_credential_store_domain_controller.py
index bbbb07b07..82d4b0792 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_credential_store_domain_controller.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_credential_store_domain_controller.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -269,11 +269,10 @@ def credential_store_domain_controller(data, fos, check_mode=False):
state = data["state"]
credential_store_domain_controller_data = data["credential_store_domain_controller"]
- filtered_data = underscore_to_hyphen(
- filter_credential_store_domain_controller_data(
- credential_store_domain_controller_data
- )
+ filtered_data = filter_credential_store_domain_controller_data(
+ credential_store_domain_controller_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -342,7 +341,7 @@ def credential_store_domain_controller(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "credential-store", "domain-controller", data=filtered_data, vdom=vdom
+ "credential-store", "domain-controller", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_diameter_filter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_diameter_filter_profile.py
new file mode 100644
index 000000000..98e9920f3
--- /dev/null
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_diameter_filter_profile.py
@@ -0,0 +1,542 @@
+#!/usr/bin/python
+from __future__ import absolute_import, division, print_function
+
+# Copyright: (c) 2022 Fortinet
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+# 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.
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "status": ["preview"],
+ "supported_by": "community",
+ "metadata_version": "1.1",
+}
+
+DOCUMENTATION = """
+---
+module: fortios_diameter_filter_profile
+short_description: Configure Diameter filter profiles in Fortinet's FortiOS and FortiGate.
+description:
+ - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the
+ user to set and modify diameter_filter feature and profile category.
+ Examples include all parameters and values need to be adjusted to datasources before usage.
+ Tested with FOS v6.0.0
+version_added: "2.0.0"
+author:
+ - Link Zheng (@chillancezen)
+ - Jie Xue (@JieX19)
+ - Hongbin Lu (@fgtdev-hblu)
+ - Frank Shen (@frankshen01)
+ - Miguel Angel Munoz (@mamunozgonzalez)
+ - Nicolas Thomas (@thomnico)
+notes:
+ - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
+
+requirements:
+ - ansible>=2.15
+options:
+ access_token:
+ description:
+ - Token-based authentication.
+ Generated from GUI of Fortigate.
+ type: str
+ required: false
+ enable_log:
+ description:
+ - Enable/Disable logging for task.
+ type: bool
+ required: false
+ default: false
+ vdom:
+ description:
+ - Virtual domain, among those defined previously. A vdom is a
+ virtual instance of the FortiGate that can be configured and
+ used as a different unit.
+ type: str
+ default: root
+ member_path:
+ type: str
+ description:
+ - Member attribute path to operate on.
+ - Delimited by a slash character if there are more than one attribute.
+ - Parameter marked with member_path is legitimate for doing member operation.
+ member_state:
+ type: str
+ description:
+ - Add or delete a member under specified attribute path.
+ - When member_state is specified, the state option is ignored.
+ choices:
+ - 'present'
+ - 'absent'
+
+ state:
+ description:
+ - Indicates whether to create or remove the object.
+ type: str
+ required: true
+ choices:
+ - 'present'
+ - 'absent'
+ diameter_filter_profile:
+ description:
+ - Configure Diameter filter profiles.
+ default: null
+ type: dict
+ suboptions:
+ cmd_flags_reserve_set:
+ description:
+ - Action to be taken for messages with cmd flag reserve bits set.
+ type: str
+ choices:
+ - 'allow'
+ - 'block'
+ - 'reset'
+ - 'monitor'
+ command_code_invalid:
+ description:
+ - Action to be taken for messages with invalid command code.
+ type: str
+ choices:
+ - 'allow'
+ - 'block'
+ - 'reset'
+ - 'monitor'
+ command_code_range:
+ description:
+ - Valid range for command codes (0-16777215).
+ type: str
+ comment:
+ description:
+ - Comment.
+ type: str
+ log_packet:
+ description:
+ - Enable/disable packet log for triggered diameter settings.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+ message_length_invalid:
+ description:
+ - Action to be taken for invalid message length.
+ type: str
+ choices:
+ - 'allow'
+ - 'block'
+ - 'reset'
+ - 'monitor'
+ missing_request_action:
+ description:
+ - Action to be taken for answers without corresponding request.
+ type: str
+ choices:
+ - 'allow'
+ - 'block'
+ - 'reset'
+ - 'monitor'
+ monitor_all_messages:
+ description:
+ - Enable/disable logging for all User Name and Result Code AVP messages.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+ name:
+ description:
+ - Profile name.
+ required: true
+ type: str
+ protocol_version_invalid:
+ description:
+ - Action to be taken for invalid protocol version.
+ type: str
+ choices:
+ - 'allow'
+ - 'block'
+ - 'reset'
+ - 'monitor'
+ request_error_flag_set:
+ description:
+ - Action to be taken for request messages with error flag set.
+ type: str
+ choices:
+ - 'allow'
+ - 'block'
+ - 'reset'
+ - 'monitor'
+ track_requests_answers:
+ description:
+ - Enable/disable validation that each answer has a corresponding request.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+"""
+
+EXAMPLES = """
+- name: Configure Diameter filter profiles.
+ fortinet.fortios.fortios_diameter_filter_profile:
+ vdom: "{{ vdom }}"
+ state: "present"
+ access_token: "<your_own_value>"
+ diameter_filter_profile:
+ cmd_flags_reserve_set: "allow"
+ command_code_invalid: "allow"
+ command_code_range: "<your_own_value>"
+ comment: "Comment."
+ log_packet: "disable"
+ message_length_invalid: "allow"
+ missing_request_action: "allow"
+ monitor_all_messages: "disable"
+ name: "default_name_11"
+ protocol_version_invalid: "allow"
+ request_error_flag_set: "allow"
+ track_requests_answers: "disable"
+"""
+
+RETURN = """
+build:
+ description: Build number of the fortigate image
+ returned: always
+ type: str
+ sample: '1547'
+http_method:
+ description: Last method used to provision the content into FortiGate
+ returned: always
+ type: str
+ sample: 'PUT'
+http_status:
+ description: Last result given by FortiGate on last operation applied
+ returned: always
+ type: str
+ sample: "200"
+mkey:
+ description: Master key (id) used in the last call to FortiGate
+ returned: success
+ type: str
+ sample: "id"
+name:
+ description: Name of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "urlfilter"
+path:
+ description: Path of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "webfilter"
+revision:
+ description: Internal revision number
+ returned: always
+ type: str
+ sample: "17.0.2.10658"
+serial:
+ description: Serial number of the unit
+ returned: always
+ type: str
+ sample: "FGVMEVYYQT3AB5352"
+status:
+ description: Indication of the operation's result
+ returned: always
+ type: str
+ sample: "success"
+vdom:
+ description: Virtual domain used
+ returned: always
+ type: str
+ sample: "root"
+version:
+ description: Version of the FortiGate
+ returned: always
+ type: str
+ sample: "v5.6.3"
+"""
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.connection import Connection
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ FortiOSHandler,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_legacy_fortiosapi,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ schema_to_module_spec,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_schema_versioning,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import (
+ FAIL_SOCKET_MSG,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post_processor import (
+ remove_invalid_fields,
+)
+
+
+def filter_diameter_filter_profile_data(json):
+ option_list = [
+ "cmd_flags_reserve_set",
+ "command_code_invalid",
+ "command_code_range",
+ "comment",
+ "log_packet",
+ "message_length_invalid",
+ "missing_request_action",
+ "monitor_all_messages",
+ "name",
+ "protocol_version_invalid",
+ "request_error_flag_set",
+ "track_requests_answers",
+ ]
+
+ json = remove_invalid_fields(json)
+ dictionary = {}
+
+ for attribute in option_list:
+ if attribute in json and json[attribute] is not None:
+ dictionary[attribute] = json[attribute]
+
+ return dictionary
+
+
+def underscore_to_hyphen(data):
+ if isinstance(data, list):
+ for i, elem in enumerate(data):
+ data[i] = underscore_to_hyphen(elem)
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[k.replace("_", "-")] = underscore_to_hyphen(v)
+ data = new_data
+
+ return data
+
+
+def diameter_filter_profile(data, fos):
+ vdom = data["vdom"]
+
+ state = data["state"]
+
+ diameter_filter_profile_data = data["diameter_filter_profile"]
+ filtered_data = filter_diameter_filter_profile_data(diameter_filter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+
+ if state == "present" or state is True:
+ return fos.set("diameter-filter", "profile", data=converted_data, vdom=vdom)
+
+ elif state == "absent":
+ return fos.delete(
+ "diameter-filter", "profile", mkey=filtered_data["name"], vdom=vdom
+ )
+ else:
+ fos._module.fail_json(msg="state must be present or absent!")
+
+
+def is_successful_status(resp):
+ return (
+ "status" in resp
+ and resp["status"] == "success"
+ or "http_status" in resp
+ and resp["http_status"] == 200
+ or "http_method" in resp
+ and resp["http_method"] == "DELETE"
+ and resp["http_status"] == 404
+ )
+
+
+def fortios_diameter_filter(data, fos):
+ fos.do_member_operation("diameter-filter", "profile")
+ if data["diameter_filter_profile"]:
+ resp = diameter_filter_profile(data, fos)
+ else:
+ fos._module.fail_json(msg="missing task body: %s" % ("diameter_filter_profile"))
+
+ return (
+ not is_successful_status(resp),
+ is_successful_status(resp)
+ and (resp["revision_changed"] if "revision_changed" in resp else True),
+ resp,
+ {},
+ )
+
+
+versioned_schema = {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {"v_range": [["v7.4.2", ""]], "type": "string", "required": True},
+ "comment": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "monitor_all_messages": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "log_packet": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "track_requests_answers": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "missing_request_action": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "block"},
+ {"value": "reset"},
+ {"value": "monitor"},
+ ],
+ },
+ "protocol_version_invalid": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "block"},
+ {"value": "reset"},
+ {"value": "monitor"},
+ ],
+ },
+ "message_length_invalid": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "block"},
+ {"value": "reset"},
+ {"value": "monitor"},
+ ],
+ },
+ "request_error_flag_set": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "block"},
+ {"value": "reset"},
+ {"value": "monitor"},
+ ],
+ },
+ "cmd_flags_reserve_set": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "block"},
+ {"value": "reset"},
+ {"value": "monitor"},
+ ],
+ },
+ "command_code_invalid": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "block"},
+ {"value": "reset"},
+ {"value": "monitor"},
+ ],
+ },
+ "command_code_range": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ },
+ "v_range": [["v7.4.2", ""]],
+}
+
+
+def main():
+ module_spec = schema_to_module_spec(versioned_schema)
+ mkeyname = "name"
+ fields = {
+ "access_token": {"required": False, "type": "str", "no_log": True},
+ "enable_log": {"required": False, "type": "bool", "default": False},
+ "vdom": {"required": False, "type": "str", "default": "root"},
+ "member_path": {"required": False, "type": "str"},
+ "member_state": {
+ "type": "str",
+ "required": False,
+ "choices": ["present", "absent"],
+ },
+ "state": {"required": True, "type": "str", "choices": ["present", "absent"]},
+ "diameter_filter_profile": {
+ "required": False,
+ "type": "dict",
+ "default": None,
+ "options": {},
+ },
+ }
+ for attribute_name in module_spec["options"]:
+ fields["diameter_filter_profile"]["options"][attribute_name] = module_spec[
+ "options"
+ ][attribute_name]
+ if mkeyname and mkeyname == attribute_name:
+ fields["diameter_filter_profile"]["options"][attribute_name][
+ "required"
+ ] = True
+
+ module = AnsibleModule(argument_spec=fields, supports_check_mode=False)
+ check_legacy_fortiosapi(module)
+
+ is_error = False
+ has_changed = False
+ result = None
+ diff = None
+
+ versions_check_result = None
+ if module._socket_path:
+ connection = Connection(module._socket_path)
+ if "access_token" in module.params:
+ connection.set_option("access_token", module.params["access_token"])
+
+ if "enable_log" in module.params:
+ connection.set_option("enable_log", module.params["enable_log"])
+ else:
+ connection.set_option("enable_log", False)
+ fos = FortiOSHandler(connection, module, mkeyname)
+ versions_check_result = check_schema_versioning(
+ fos, versioned_schema, "diameter_filter_profile"
+ )
+
+ is_error, has_changed, result, diff = fortios_diameter_filter(
+ module.params, fos
+ )
+
+ else:
+ module.fail_json(**FAIL_SOCKET_MSG)
+
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.warn(
+ "Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv"
+ )
+
+ if not is_error:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.exit_json(
+ changed=has_changed,
+ version_check_warning=versions_check_result,
+ meta=result,
+ diff=diff,
+ )
+ else:
+ module.exit_json(changed=has_changed, meta=result, diff=diff)
+ else:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.fail_json(
+ msg="Error in repo",
+ version_check_warning=versions_check_result,
+ meta=result,
+ )
+ else:
+ module.fail_json(msg="Error in repo", meta=result)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_data_type.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_data_type.py
index 21779c20a..d0d8a34a6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_data_type.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_data_type.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -100,11 +100,19 @@ options:
description:
- Number of characters required to save for verification (1 - 255).
type: int
+ match_ahead:
+ description:
+ - Number of characters behind for match-around (1 - 4096).
+ type: int
match_around:
description:
- Dictionary to check whether it has a match around (Only support match-any and basic types, no repeat supported). Source dlp.dictionary
.name.
type: str
+ match_back:
+ description:
+ - Number of characters in front for match-around (1 - 4096).
+ type: int
name:
description:
- Name of table containing the data type.
@@ -129,6 +137,10 @@ options:
choices:
- 'enable'
- 'disable'
+ verify2:
+ description:
+ - Extra regular expression pattern string used to verify the data type.
+ type: str
"""
EXAMPLES = """
@@ -141,12 +153,15 @@ EXAMPLES = """
comment: "Optional comments."
look_ahead: "1"
look_back: "1"
+ match_ahead: "1"
match_around: "<your_own_value> (source dlp.dictionary.name)"
- name: "default_name_7"
+ match_back: "1"
+ name: "default_name_9"
pattern: "<your_own_value>"
transform: "<your_own_value>"
verify: "<your_own_value>"
verify_transformed_pattern: "enable"
+ verify2: "<your_own_value>"
"""
RETURN = """
@@ -233,12 +248,15 @@ def filter_dlp_data_type_data(json):
"comment",
"look_ahead",
"look_back",
+ "match_ahead",
"match_around",
+ "match_back",
"name",
"pattern",
"transform",
"verify",
"verify_transformed_pattern",
+ "verify2",
]
json = remove_invalid_fields(json)
@@ -270,10 +288,11 @@ def dlp_data_type(data, fos):
state = data["state"]
dlp_data_type_data = data["dlp_data_type"]
- filtered_data = underscore_to_hyphen(filter_dlp_data_type_data(dlp_data_type_data))
+ filtered_data = filter_dlp_data_type_data(dlp_data_type_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("dlp", "data-type", data=filtered_data, vdom=vdom)
+ return fos.set("dlp", "data-type", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("dlp", "data-type", mkey=filtered_data["name"], vdom=vdom)
@@ -316,9 +335,12 @@ versioned_schema = {
"name": {"v_range": [["v7.2.0", ""]], "type": "string", "required": True},
"pattern": {"v_range": [["v7.2.0", ""]], "type": "string"},
"verify": {"v_range": [["v7.2.0", ""]], "type": "string"},
+ "verify2": {"v_range": [["v7.4.2", ""]], "type": "string"},
"match_around": {"v_range": [["v7.4.0", ""]], "type": "string"},
"look_back": {"v_range": [["v7.2.0", ""]], "type": "integer"},
"look_ahead": {"v_range": [["v7.2.0", ""]], "type": "integer"},
+ "match_back": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "match_ahead": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"transform": {"v_range": [["v7.2.0", ""]], "type": "string"},
"verify_transformed_pattern": {
"v_range": [["v7.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_dictionary.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_dictionary.py
index aeab4d3a0..ac576cd86 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_dictionary.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_dictionary.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -295,12 +295,11 @@ def dlp_dictionary(data, fos):
state = data["state"]
dlp_dictionary_data = data["dlp_dictionary"]
- filtered_data = underscore_to_hyphen(
- filter_dlp_dictionary_data(dlp_dictionary_data)
- )
+ filtered_data = filter_dlp_dictionary_data(dlp_dictionary_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("dlp", "dictionary", data=filtered_data, vdom=vdom)
+ return fos.set("dlp", "dictionary", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("dlp", "dictionary", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_exact_data_match.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_exact_data_match.py
new file mode 100644
index 000000000..189dbd6f7
--- /dev/null
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_exact_data_match.py
@@ -0,0 +1,411 @@
+#!/usr/bin/python
+from __future__ import absolute_import, division, print_function
+
+# Copyright: (c) 2022 Fortinet
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+# 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.
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "status": ["preview"],
+ "supported_by": "community",
+ "metadata_version": "1.1",
+}
+
+DOCUMENTATION = """
+---
+module: fortios_dlp_exact_data_match
+short_description: Configure exact-data-match template used by DLP scan in Fortinet's FortiOS and FortiGate.
+description:
+ - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the
+ user to set and modify dlp feature and exact_data_match category.
+ Examples include all parameters and values need to be adjusted to datasources before usage.
+ Tested with FOS v6.0.0
+version_added: "2.0.0"
+author:
+ - Link Zheng (@chillancezen)
+ - Jie Xue (@JieX19)
+ - Hongbin Lu (@fgtdev-hblu)
+ - Frank Shen (@frankshen01)
+ - Miguel Angel Munoz (@mamunozgonzalez)
+ - Nicolas Thomas (@thomnico)
+notes:
+ - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
+
+requirements:
+ - ansible>=2.15
+options:
+ access_token:
+ description:
+ - Token-based authentication.
+ Generated from GUI of Fortigate.
+ type: str
+ required: false
+ enable_log:
+ description:
+ - Enable/Disable logging for task.
+ type: bool
+ required: false
+ default: false
+ vdom:
+ description:
+ - Virtual domain, among those defined previously. A vdom is a
+ virtual instance of the FortiGate that can be configured and
+ used as a different unit.
+ type: str
+ default: root
+ member_path:
+ type: str
+ description:
+ - Member attribute path to operate on.
+ - Delimited by a slash character if there are more than one attribute.
+ - Parameter marked with member_path is legitimate for doing member operation.
+ member_state:
+ type: str
+ description:
+ - Add or delete a member under specified attribute path.
+ - When member_state is specified, the state option is ignored.
+ choices:
+ - 'present'
+ - 'absent'
+
+ state:
+ description:
+ - Indicates whether to create or remove the object.
+ type: str
+ required: true
+ choices:
+ - 'present'
+ - 'absent'
+ dlp_exact_data_match:
+ description:
+ - Configure exact-data-match template used by DLP scan.
+ default: null
+ type: dict
+ suboptions:
+ columns:
+ description:
+ - DLP exact-data-match column types.
+ type: list
+ elements: dict
+ suboptions:
+ index:
+ description:
+ - Column index. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ optional:
+ description:
+ - Enable/disable optional match.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ type:
+ description:
+ - Data-type for this column. Source dlp.data-type.name.
+ type: str
+ data:
+ description:
+ - External resource for exact data match. Source system.external-resource.name.
+ type: str
+ name:
+ description:
+ - Name of table containing the exact-data-match template.
+ required: true
+ type: str
+ optional:
+ description:
+ - Number of optional columns need to match.
+ type: int
+"""
+
+EXAMPLES = """
+- name: Configure exact-data-match template used by DLP scan.
+ fortinet.fortios.fortios_dlp_exact_data_match:
+ vdom: "{{ vdom }}"
+ state: "present"
+ access_token: "<your_own_value>"
+ dlp_exact_data_match:
+ columns:
+ -
+ index: "<you_own_value>"
+ optional: "enable"
+ type: "<your_own_value> (source dlp.data-type.name)"
+ data: "<your_own_value> (source system.external-resource.name)"
+ name: "default_name_8"
+ optional: "0"
+"""
+
+RETURN = """
+build:
+ description: Build number of the fortigate image
+ returned: always
+ type: str
+ sample: '1547'
+http_method:
+ description: Last method used to provision the content into FortiGate
+ returned: always
+ type: str
+ sample: 'PUT'
+http_status:
+ description: Last result given by FortiGate on last operation applied
+ returned: always
+ type: str
+ sample: "200"
+mkey:
+ description: Master key (id) used in the last call to FortiGate
+ returned: success
+ type: str
+ sample: "id"
+name:
+ description: Name of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "urlfilter"
+path:
+ description: Path of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "webfilter"
+revision:
+ description: Internal revision number
+ returned: always
+ type: str
+ sample: "17.0.2.10658"
+serial:
+ description: Serial number of the unit
+ returned: always
+ type: str
+ sample: "FGVMEVYYQT3AB5352"
+status:
+ description: Indication of the operation's result
+ returned: always
+ type: str
+ sample: "success"
+vdom:
+ description: Virtual domain used
+ returned: always
+ type: str
+ sample: "root"
+version:
+ description: Version of the FortiGate
+ returned: always
+ type: str
+ sample: "v5.6.3"
+"""
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.connection import Connection
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ FortiOSHandler,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_legacy_fortiosapi,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ schema_to_module_spec,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_schema_versioning,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import (
+ FAIL_SOCKET_MSG,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post_processor import (
+ remove_invalid_fields,
+)
+
+
+def filter_dlp_exact_data_match_data(json):
+ option_list = ["columns", "data", "name", "optional"]
+
+ json = remove_invalid_fields(json)
+ dictionary = {}
+
+ for attribute in option_list:
+ if attribute in json and json[attribute] is not None:
+ dictionary[attribute] = json[attribute]
+
+ return dictionary
+
+
+def underscore_to_hyphen(data):
+ if isinstance(data, list):
+ for i, elem in enumerate(data):
+ data[i] = underscore_to_hyphen(elem)
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[k.replace("_", "-")] = underscore_to_hyphen(v)
+ data = new_data
+
+ return data
+
+
+def dlp_exact_data_match(data, fos):
+ vdom = data["vdom"]
+
+ state = data["state"]
+
+ dlp_exact_data_match_data = data["dlp_exact_data_match"]
+ filtered_data = filter_dlp_exact_data_match_data(dlp_exact_data_match_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+
+ if state == "present" or state is True:
+ return fos.set("dlp", "exact-data-match", data=converted_data, vdom=vdom)
+
+ elif state == "absent":
+ return fos.delete(
+ "dlp", "exact-data-match", mkey=filtered_data["name"], vdom=vdom
+ )
+ else:
+ fos._module.fail_json(msg="state must be present or absent!")
+
+
+def is_successful_status(resp):
+ return (
+ "status" in resp
+ and resp["status"] == "success"
+ or "http_status" in resp
+ and resp["http_status"] == 200
+ or "http_method" in resp
+ and resp["http_method"] == "DELETE"
+ and resp["http_status"] == 404
+ )
+
+
+def fortios_dlp(data, fos):
+ fos.do_member_operation("dlp", "exact-data-match")
+ if data["dlp_exact_data_match"]:
+ resp = dlp_exact_data_match(data, fos)
+ else:
+ fos._module.fail_json(msg="missing task body: %s" % ("dlp_exact_data_match"))
+
+ return (
+ not is_successful_status(resp),
+ is_successful_status(resp)
+ and (resp["revision_changed"] if "revision_changed" in resp else True),
+ resp,
+ {},
+ )
+
+
+versioned_schema = {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {"v_range": [["v7.4.2", ""]], "type": "string", "required": True},
+ "optional": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "data": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "columns": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "index": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ "required": True,
+ },
+ "type": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "optional": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ },
+ "v_range": [["v7.4.2", ""]],
+}
+
+
+def main():
+ module_spec = schema_to_module_spec(versioned_schema)
+ mkeyname = "name"
+ fields = {
+ "access_token": {"required": False, "type": "str", "no_log": True},
+ "enable_log": {"required": False, "type": "bool", "default": False},
+ "vdom": {"required": False, "type": "str", "default": "root"},
+ "member_path": {"required": False, "type": "str"},
+ "member_state": {
+ "type": "str",
+ "required": False,
+ "choices": ["present", "absent"],
+ },
+ "state": {"required": True, "type": "str", "choices": ["present", "absent"]},
+ "dlp_exact_data_match": {
+ "required": False,
+ "type": "dict",
+ "default": None,
+ "options": {},
+ },
+ }
+ for attribute_name in module_spec["options"]:
+ fields["dlp_exact_data_match"]["options"][attribute_name] = module_spec[
+ "options"
+ ][attribute_name]
+ if mkeyname and mkeyname == attribute_name:
+ fields["dlp_exact_data_match"]["options"][attribute_name]["required"] = True
+
+ module = AnsibleModule(argument_spec=fields, supports_check_mode=False)
+ check_legacy_fortiosapi(module)
+
+ is_error = False
+ has_changed = False
+ result = None
+ diff = None
+
+ versions_check_result = None
+ if module._socket_path:
+ connection = Connection(module._socket_path)
+ if "access_token" in module.params:
+ connection.set_option("access_token", module.params["access_token"])
+
+ if "enable_log" in module.params:
+ connection.set_option("enable_log", module.params["enable_log"])
+ else:
+ connection.set_option("enable_log", False)
+ fos = FortiOSHandler(connection, module, mkeyname)
+ versions_check_result = check_schema_versioning(
+ fos, versioned_schema, "dlp_exact_data_match"
+ )
+
+ is_error, has_changed, result, diff = fortios_dlp(module.params, fos)
+
+ else:
+ module.fail_json(**FAIL_SOCKET_MSG)
+
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.warn(
+ "Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv"
+ )
+
+ if not is_error:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.exit_json(
+ changed=has_changed,
+ version_check_warning=versions_check_result,
+ meta=result,
+ diff=diff,
+ )
+ else:
+ module.exit_json(changed=has_changed, meta=result, diff=diff)
+ else:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.fail_json(
+ msg="Error in repo",
+ version_check_warning=versions_check_result,
+ meta=result,
+ )
+ else:
+ module.fail_json(msg="Error in repo", meta=result)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_filepattern.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_filepattern.py
index 50b97819b..8fca42f8e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_filepattern.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_filepattern.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -325,9 +325,8 @@ def dlp_filepattern(data, fos, check_mode=False):
state = data["state"]
dlp_filepattern_data = data["dlp_filepattern"]
- filtered_data = underscore_to_hyphen(
- filter_dlp_filepattern_data(dlp_filepattern_data)
- )
+ filtered_data = filter_dlp_filepattern_data(dlp_filepattern_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -391,7 +390,7 @@ def dlp_filepattern(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("dlp", "filepattern", data=filtered_data, vdom=vdom)
+ return fos.set("dlp", "filepattern", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("dlp", "filepattern", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_doc_source.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_doc_source.py
index e014de687..1431686a6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_doc_source.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_doc_source.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -361,9 +361,8 @@ def dlp_fp_doc_source(data, fos, check_mode=False):
state = data["state"]
dlp_fp_doc_source_data = data["dlp_fp_doc_source"]
- filtered_data = underscore_to_hyphen(
- filter_dlp_fp_doc_source_data(dlp_fp_doc_source_data)
- )
+ filtered_data = filter_dlp_fp_doc_source_data(dlp_fp_doc_source_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -427,7 +426,7 @@ def dlp_fp_doc_source(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("dlp", "fp-doc-source", data=filtered_data, vdom=vdom)
+ return fos.set("dlp", "fp-doc-source", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("dlp", "fp-doc-source", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_sensitivity.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_sensitivity.py
index 36cbf1c92..db83f2c60 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_sensitivity.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_fp_sensitivity.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -226,9 +226,8 @@ def dlp_fp_sensitivity(data, fos, check_mode=False):
state = data["state"]
dlp_fp_sensitivity_data = data["dlp_fp_sensitivity"]
- filtered_data = underscore_to_hyphen(
- filter_dlp_fp_sensitivity_data(dlp_fp_sensitivity_data)
- )
+ filtered_data = filter_dlp_fp_sensitivity_data(dlp_fp_sensitivity_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -292,7 +291,7 @@ def dlp_fp_sensitivity(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("dlp", "fp-sensitivity", data=filtered_data, vdom=vdom)
+ return fos.set("dlp", "fp-sensitivity", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_profile.py
index fb91042ac..04086a066 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -466,9 +466,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -477,8 +477,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -495,8 +498,8 @@ def dlp_profile(data, fos):
dlp_profile_data = data["dlp_profile"]
dlp_profile_data = flatten_multilists_attributes(dlp_profile_data)
- filtered_data = underscore_to_hyphen(filter_dlp_profile_data(dlp_profile_data))
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_dlp_profile_data(dlp_profile_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
if state == "present" or state is True:
return fos.set("dlp", "profile", data=converted_data, vdom=vdom)
@@ -597,7 +600,10 @@ versioned_schema = {
"options": [
{"value": "sensor"},
{"value": "mip"},
- {"value": "fingerprint"},
+ {
+ "value": "fingerprint",
+ "v_range": [["v7.2.0", "v7.4.1"], ["v7.4.3", ""]],
+ },
{"value": "encrypted"},
{"value": "none"},
],
@@ -613,9 +619,12 @@ versioned_schema = {
"required": True,
}
},
- "v_range": [["v7.2.0", ""]],
+ "v_range": [["v7.2.0", "v7.4.1"], ["v7.4.3", ""]],
+ },
+ "match_percentage": {
+ "v_range": [["v7.2.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
},
- "match_percentage": {"v_range": [["v7.2.0", ""]], "type": "integer"},
"file_type": {"v_range": [["v7.2.0", ""]], "type": "integer"},
"sensor": {
"type": "list",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensitivity.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensitivity.py
index 1d9807c98..d91ff52c9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensitivity.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensitivity.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -226,9 +226,8 @@ def dlp_sensitivity(data, fos, check_mode=False):
state = data["state"]
dlp_sensitivity_data = data["dlp_sensitivity"]
- filtered_data = underscore_to_hyphen(
- filter_dlp_sensitivity_data(dlp_sensitivity_data)
- )
+ filtered_data = filter_dlp_sensitivity_data(dlp_sensitivity_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -292,7 +291,7 @@ def dlp_sensitivity(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("dlp", "sensitivity", data=filtered_data, vdom=vdom)
+ return fos.set("dlp", "sensitivity", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("dlp", "sensitivity", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensor.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensor.py
index 541b4b9bb..c2c3e8987 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensor.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_sensor.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,7 +112,7 @@ options:
type: int
dictionary:
description:
- - Select a DLP dictionary. Source dlp.dictionary.name.
+ - Select a DLP dictionary. Source dlp.dictionary.name dlp.exact-data-match.name.
type: str
id:
description:
@@ -360,7 +360,7 @@ EXAMPLES = """
entries:
-
count: "1"
- dictionary: "<your_own_value> (source dlp.dictionary.name)"
+ dictionary: "<your_own_value> (source dlp.dictionary.name dlp.exact-data-match.name)"
id: "8"
status: "enable"
eval: "<your_own_value>"
@@ -560,9 +560,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -571,8 +571,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -589,8 +592,8 @@ def dlp_sensor(data, fos, check_mode=False):
dlp_sensor_data = data["dlp_sensor"]
dlp_sensor_data = flatten_multilists_attributes(dlp_sensor_data)
- filtered_data = underscore_to_hyphen(filter_dlp_sensor_data(dlp_sensor_data))
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_dlp_sensor_data(dlp_sensor_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_settings.py
index c4d6419dc..1a741cdb6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dlp_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,9 +232,10 @@ def underscore_to_hyphen(data):
def dlp_settings(data, fos):
vdom = data["vdom"]
dlp_settings_data = data["dlp_settings"]
- filtered_data = underscore_to_hyphen(filter_dlp_settings_data(dlp_settings_data))
+ filtered_data = filter_dlp_settings_data(dlp_settings_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("dlp", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("dlp", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_domain_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_domain_filter.py
index 5b2b7895d..9970f74f1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_domain_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_domain_filter.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -282,9 +282,8 @@ def dnsfilter_domain_filter(data, fos, check_mode=False):
state = data["state"]
dnsfilter_domain_filter_data = data["dnsfilter_domain_filter"]
- filtered_data = underscore_to_hyphen(
- filter_dnsfilter_domain_filter_data(dnsfilter_domain_filter_data)
- )
+ filtered_data = filter_dnsfilter_domain_filter_data(dnsfilter_domain_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -348,7 +347,7 @@ def dnsfilter_domain_filter(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("dnsfilter", "domain-filter", data=filtered_data, vdom=vdom)
+ return fos.set("dnsfilter", "domain-filter", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_profile.py
index 1fe68e823..068cac689 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dnsfilter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -497,9 +497,8 @@ def dnsfilter_profile(data, fos, check_mode=False):
dnsfilter_profile_data = data["dnsfilter_profile"]
dnsfilter_profile_data = flatten_multilists_attributes(dnsfilter_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_dnsfilter_profile_data(dnsfilter_profile_data)
- )
+ filtered_data = filter_dnsfilter_profile_data(dnsfilter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -563,7 +562,7 @@ def dnsfilter_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("dnsfilter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("dnsfilter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("dnsfilter", "profile", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_cpus.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_cpus.py
index ca3100626..d16d79dbe 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_cpus.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_cpus.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -101,6 +101,10 @@ options:
description:
- CPUs enabled to run DPDK VNP engines.
type: str
+ vnpsp_cpus:
+ description:
+ - CPUs enabled to run DPDK VNP slow path.
+ type: str
"""
EXAMPLES = """
@@ -113,6 +117,7 @@ EXAMPLES = """
rx_cpus: "<your_own_value>"
tx_cpus: "<your_own_value>"
vnp_cpus: "<your_own_value>"
+ vnpsp_cpus: "<your_own_value>"
"""
RETURN = """
@@ -195,7 +200,14 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post
def filter_dpdk_cpus_data(json):
- option_list = ["ips_cpus", "isolated_cpus", "rx_cpus", "tx_cpus", "vnp_cpus"]
+ option_list = [
+ "ips_cpus",
+ "isolated_cpus",
+ "rx_cpus",
+ "tx_cpus",
+ "vnp_cpus",
+ "vnpsp_cpus",
+ ]
json = remove_invalid_fields(json)
dictionary = {}
@@ -223,9 +235,10 @@ def underscore_to_hyphen(data):
def dpdk_cpus(data, fos):
vdom = data["vdom"]
dpdk_cpus_data = data["dpdk_cpus"]
- filtered_data = underscore_to_hyphen(filter_dpdk_cpus_data(dpdk_cpus_data))
+ filtered_data = filter_dpdk_cpus_data(dpdk_cpus_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("dpdk", "cpus", data=filtered_data, vdom=vdom)
+ return fos.set("dpdk", "cpus", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -268,6 +281,7 @@ versioned_schema = {
"v_range": [["v7.0.0", "v7.0.12"], ["v7.2.1", "v7.2.2"], ["v7.4.0", ""]],
"type": "string",
},
+ "vnpsp_cpus": {"v_range": [["v7.4.2", ""]], "type": "string"},
"ips_cpus": {
"v_range": [["v7.0.0", "v7.0.12"], ["v7.2.1", "v7.2.2"], ["v7.4.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_global.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_global.py
index 594142a1c..f91b77c1d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_global.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_dpdk_global.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -128,6 +128,10 @@ options:
- 'disable'
- 'traffic-log-only'
- 'enable'
+ protects:
+ description:
+ - Special arguments for device
+ type: str
sleep_on_idle:
description:
- Enable/disable sleep-on-idle support for all FDH engines.
@@ -158,6 +162,7 @@ EXAMPLES = """
mbufpool_percentage: "25"
multiqueue: "disable"
per_session_accounting: "disable"
+ protects: "<your_own_value>"
sleep_on_idle: "disable"
status: "disable"
"""
@@ -250,6 +255,7 @@ def filter_dpdk_global_data(json):
"mbufpool_percentage",
"multiqueue",
"per_session_accounting",
+ "protects",
"sleep_on_idle",
"status",
]
@@ -280,9 +286,10 @@ def underscore_to_hyphen(data):
def dpdk_global(data, fos):
vdom = data["vdom"]
dpdk_global_data = data["dpdk_global"]
- filtered_data = underscore_to_hyphen(filter_dpdk_global_data(dpdk_global_data))
+ filtered_data = filter_dpdk_global_data(dpdk_global_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("dpdk", "global", data=filtered_data, vdom=vdom)
+ return fos.set("dpdk", "global", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -353,6 +360,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
+ "protects": {"v_range": [["v7.4.2", ""]], "type": "string"},
"per_session_accounting": {
"v_range": [["v7.0.0", "v7.0.12"], ["v7.2.1", "v7.2.2"], ["v7.4.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_block_allow_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_block_allow_list.py
index 7a169c588..c99ddf02e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_block_allow_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_block_allow_list.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -306,12 +306,15 @@ def emailfilter_block_allow_list(data, fos):
state = data["state"]
emailfilter_block_allow_list_data = data["emailfilter_block_allow_list"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_block_allow_list_data(emailfilter_block_allow_list_data)
+ filtered_data = filter_emailfilter_block_allow_list_data(
+ emailfilter_block_allow_list_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("emailfilter", "block-allow-list", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "emailfilter", "block-allow-list", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bwl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bwl.py
index 7aa111ad8..f400318bd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bwl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bwl.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -307,9 +307,8 @@ def emailfilter_bwl(data, fos, check_mode=False):
state = data["state"]
emailfilter_bwl_data = data["emailfilter_bwl"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_bwl_data(emailfilter_bwl_data)
- )
+ filtered_data = filter_emailfilter_bwl_data(emailfilter_bwl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -373,7 +372,7 @@ def emailfilter_bwl(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("emailfilter", "bwl", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "bwl", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("emailfilter", "bwl", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bword.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bword.py
index c1b5c4118..7bf52c535 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bword.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_bword.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -308,9 +308,8 @@ def emailfilter_bword(data, fos, check_mode=False):
state = data["state"]
emailfilter_bword_data = data["emailfilter_bword"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_bword_data(emailfilter_bword_data)
- )
+ filtered_data = filter_emailfilter_bword_data(emailfilter_bword_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -374,7 +373,7 @@ def emailfilter_bword(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("emailfilter", "bword", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "bword", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("emailfilter", "bword", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_dnsbl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_dnsbl.py
index fdd7c758e..f22e971d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_dnsbl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_dnsbl.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -272,9 +272,8 @@ def emailfilter_dnsbl(data, fos, check_mode=False):
state = data["state"]
emailfilter_dnsbl_data = data["emailfilter_dnsbl"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_dnsbl_data(emailfilter_dnsbl_data)
- )
+ filtered_data = filter_emailfilter_dnsbl_data(emailfilter_dnsbl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -338,7 +337,7 @@ def emailfilter_dnsbl(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("emailfilter", "dnsbl", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "dnsbl", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("emailfilter", "dnsbl", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_fortishield.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_fortishield.py
index ab639b3b4..849739524 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_fortishield.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_fortishield.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -218,11 +218,10 @@ def underscore_to_hyphen(data):
def emailfilter_fortishield(data, fos):
vdom = data["vdom"]
emailfilter_fortishield_data = data["emailfilter_fortishield"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_fortishield_data(emailfilter_fortishield_data)
- )
+ filtered_data = filter_emailfilter_fortishield_data(emailfilter_fortishield_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("emailfilter", "fortishield", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "fortishield", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_iptrust.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_iptrust.py
index 9bb676f86..7a1c908cc 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_iptrust.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_iptrust.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -277,9 +277,8 @@ def emailfilter_iptrust(data, fos, check_mode=False):
state = data["state"]
emailfilter_iptrust_data = data["emailfilter_iptrust"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_iptrust_data(emailfilter_iptrust_data)
- )
+ filtered_data = filter_emailfilter_iptrust_data(emailfilter_iptrust_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -343,7 +342,7 @@ def emailfilter_iptrust(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("emailfilter", "iptrust", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "iptrust", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("emailfilter", "iptrust", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_mheader.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_mheader.py
index de16b5b78..cad6ff0e7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_mheader.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_mheader.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -285,9 +285,8 @@ def emailfilter_mheader(data, fos, check_mode=False):
state = data["state"]
emailfilter_mheader_data = data["emailfilter_mheader"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_mheader_data(emailfilter_mheader_data)
- )
+ filtered_data = filter_emailfilter_mheader_data(emailfilter_mheader_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -351,7 +350,7 @@ def emailfilter_mheader(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("emailfilter", "mheader", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "mheader", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("emailfilter", "mheader", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_options.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_options.py
index 4379b81c5..91ccb872f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_options.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_options.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -202,11 +202,10 @@ def underscore_to_hyphen(data):
def emailfilter_options(data, fos):
vdom = data["vdom"]
emailfilter_options_data = data["emailfilter_options"]
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_options_data(emailfilter_options_data)
- )
+ filtered_data = filter_emailfilter_options_data(emailfilter_options_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("emailfilter", "options", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "options", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_profile.py
index 616ab6247..d9772cabb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_emailfilter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -740,9 +740,8 @@ def emailfilter_profile(data, fos, check_mode=False):
emailfilter_profile_data = data["emailfilter_profile"]
emailfilter_profile_data = flatten_multilists_attributes(emailfilter_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_emailfilter_profile_data(emailfilter_profile_data)
- )
+ filtered_data = filter_emailfilter_profile_data(emailfilter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -806,7 +805,7 @@ def emailfilter_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("emailfilter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("emailfilter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_client.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_client.py
index 1f654b73b..0e5930c87 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_client.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_client.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -252,9 +252,8 @@ def endpoint_control_client(data, fos, check_mode=False):
state = data["state"]
endpoint_control_client_data = data["endpoint_control_client"]
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_client_data(endpoint_control_client_data)
- )
+ filtered_data = filter_endpoint_control_client_data(endpoint_control_client_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -318,7 +317,7 @@ def endpoint_control_client(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("endpoint-control", "client", data=filtered_data, vdom=vdom)
+ return fos.set("endpoint-control", "client", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems.py
index fb345fec1..3ce0a8236 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -214,6 +214,13 @@ options:
choices:
- 'enable'
- 'disable'
+ send_tags_to_all_vdoms:
+ description:
+ - Relax restrictions on tags to send all EMS tags to all VDOMs
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
serial_number:
description:
- EMS Serial Number.
@@ -248,13 +255,17 @@ options:
choices:
- 'enable'
- 'disable'
+ verifying_ca:
+ description:
+ - Lowest CA cert on Fortigate in verified EMS cert chain. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
websocket_override:
description:
- Enable/disable override behavior for how this FortiGate unit connects to EMS using a WebSocket connection.
type: str
choices:
- - 'disable'
- 'enable'
+ - 'disable'
"""
EXAMPLES = """
@@ -284,6 +295,7 @@ EXAMPLES = """
pull_sysinfo: "enable"
pull_tags: "enable"
pull_vulnerabilities: "enable"
+ send_tags_to_all_vdoms: "enable"
serial_number: "<your_own_value>"
server: "192.168.100.40"
source_ip: "84.230.14.43"
@@ -291,7 +303,8 @@ EXAMPLES = """
status_check_interval: "90"
tenant_id: "<your_own_value>"
trust_ca_cn: "enable"
- websocket_override: "disable"
+ verifying_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
+ websocket_override: "enable"
"""
RETURN = """
@@ -404,6 +417,7 @@ def filter_endpoint_control_fctems_data(json):
"pull_sysinfo",
"pull_tags",
"pull_vulnerabilities",
+ "send_tags_to_all_vdoms",
"serial_number",
"server",
"source_ip",
@@ -411,6 +425,7 @@ def filter_endpoint_control_fctems_data(json):
"status_check_interval",
"tenant_id",
"trust_ca_cn",
+ "verifying_ca",
"websocket_override",
]
@@ -475,9 +490,8 @@ def endpoint_control_fctems(data, fos, check_mode=False):
endpoint_control_fctems_data = flatten_multilists_attributes(
endpoint_control_fctems_data
)
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_fctems_data(endpoint_control_fctems_data)
- )
+ filtered_data = filter_endpoint_control_fctems_data(endpoint_control_fctems_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -541,7 +555,7 @@ def endpoint_control_fctems(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("endpoint-control", "fctems", data=filtered_data, vdom=vdom)
+ return fos.set("endpoint-control", "fctems", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -657,10 +671,15 @@ versioned_schema = {
},
"call_timeout": {"v_range": [["v6.2.0", ""]], "type": "integer"},
"out_of_sync_threshold": {"v_range": [["v7.0.8", ""]], "type": "integer"},
+ "send_tags_to_all_vdoms": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"websocket_override": {
"v_range": [["v7.0.0", ""]],
"type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
+ "options": [{"value": "enable"}, {"value": "disable"}],
},
"preserve_ssl_session": {
"v_range": [["v7.0.1", ""]],
@@ -681,6 +700,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "verifying_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"cloud_server_type": {
"v_range": [["v6.4.0", "v7.4.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems_override.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems_override.py
index b883fa09e..e5c7c874b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems_override.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_fctems_override.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -202,6 +202,13 @@ options:
choices:
- 'enable'
- 'disable'
+ send_tags_to_all_vdoms:
+ description:
+ - Relax restrictions on tags to send all EMS tags to all VDOMs
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
serial_number:
description:
- EMS Serial Number.
@@ -232,13 +239,17 @@ options:
choices:
- 'enable'
- 'disable'
+ verifying_ca:
+ description:
+ - Lowest CA cert on Fortigate in verified EMS cert chain. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
websocket_override:
description:
- Enable/disable override behavior for how this FortiGate unit connects to EMS using a WebSocket connection.
type: str
choices:
- - 'disable'
- 'enable'
+ - 'disable'
"""
EXAMPLES = """
@@ -265,13 +276,15 @@ EXAMPLES = """
pull_sysinfo: "enable"
pull_tags: "enable"
pull_vulnerabilities: "enable"
+ send_tags_to_all_vdoms: "enable"
serial_number: "<your_own_value>"
server: "192.168.100.40"
source_ip: "84.230.14.43"
status: "enable"
tenant_id: "<your_own_value>"
trust_ca_cn: "enable"
- websocket_override: "disable"
+ verifying_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
+ websocket_override: "enable"
"""
RETURN = """
@@ -372,12 +385,14 @@ def filter_endpoint_control_fctems_override_data(json):
"pull_sysinfo",
"pull_tags",
"pull_vulnerabilities",
+ "send_tags_to_all_vdoms",
"serial_number",
"server",
"source_ip",
"status",
"tenant_id",
"trust_ca_cn",
+ "verifying_ca",
"websocket_override",
]
@@ -442,15 +457,14 @@ def endpoint_control_fctems_override(data, fos):
endpoint_control_fctems_override_data = flatten_multilists_attributes(
endpoint_control_fctems_override_data
)
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_fctems_override_data(
- endpoint_control_fctems_override_data
- )
+ filtered_data = filter_endpoint_control_fctems_override_data(
+ endpoint_control_fctems_override_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "endpoint-control", "fctems-override", data=filtered_data, vdom=vdom
+ "endpoint-control", "fctems-override", data=converted_data, vdom=vdom
)
elif state == "absent":
@@ -564,10 +578,15 @@ versioned_schema = {
},
"call_timeout": {"v_range": [["v7.4.0", ""]], "type": "integer"},
"out_of_sync_threshold": {"v_range": [["v7.4.0", ""]], "type": "integer"},
+ "send_tags_to_all_vdoms": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"websocket_override": {
"v_range": [["v7.4.0", ""]],
"type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
+ "options": [{"value": "enable"}, {"value": "disable"}],
},
"preserve_ssl_session": {
"v_range": [["v7.4.0", ""]],
@@ -585,6 +604,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "verifying_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"cloud_server_type": {
"v_range": [["v7.4.0", "v7.4.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_ems.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_ems.py
index 18971307c..c397b24eb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_ems.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_ems.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -287,11 +287,10 @@ def endpoint_control_forticlient_ems(data, fos, check_mode=False):
state = data["state"]
endpoint_control_forticlient_ems_data = data["endpoint_control_forticlient_ems"]
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_forticlient_ems_data(
- endpoint_control_forticlient_ems_data
- )
+ filtered_data = filter_endpoint_control_forticlient_ems_data(
+ endpoint_control_forticlient_ems_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -360,7 +359,7 @@ def endpoint_control_forticlient_ems(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "endpoint-control", "forticlient-ems", data=filtered_data, vdom=vdom
+ "endpoint-control", "forticlient-ems", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_registration_sync.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_registration_sync.py
index 3882b9b49..c6bb27e3a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_registration_sync.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_forticlient_registration_sync.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,11 +232,10 @@ def endpoint_control_forticlient_registration_sync(data, fos, check_mode=False):
endpoint_control_forticlient_registration_sync_data = data[
"endpoint_control_forticlient_registration_sync"
]
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_forticlient_registration_sync_data(
- endpoint_control_forticlient_registration_sync_data
- )
+ filtered_data = filter_endpoint_control_forticlient_registration_sync_data(
+ endpoint_control_forticlient_registration_sync_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -310,7 +309,7 @@ def endpoint_control_forticlient_registration_sync(data, fos, check_mode=False):
return fos.set(
"endpoint-control",
"forticlient-registration-sync",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_profile.py
index efc02ab82..7b357b4f0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -918,9 +918,8 @@ def endpoint_control_profile(data, fos, check_mode=False):
state = data["state"]
endpoint_control_profile_data = data["endpoint_control_profile"]
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_profile_data(endpoint_control_profile_data)
- )
+ filtered_data = filter_endpoint_control_profile_data(endpoint_control_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -984,7 +983,7 @@ def endpoint_control_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("endpoint-control", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("endpoint-control", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_registered_forticlient.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_registered_forticlient.py
index e265b7bef..9807482bb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_registered_forticlient.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_registered_forticlient.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -257,11 +257,10 @@ def endpoint_control_registered_forticlient(data, fos, check_mode=False):
endpoint_control_registered_forticlient_data = data[
"endpoint_control_registered_forticlient"
]
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_registered_forticlient_data(
- endpoint_control_registered_forticlient_data
- )
+ filtered_data = filter_endpoint_control_registered_forticlient_data(
+ endpoint_control_registered_forticlient_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -330,7 +329,7 @@ def endpoint_control_registered_forticlient(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "endpoint-control", "registered-forticlient", data=filtered_data, vdom=vdom
+ "endpoint-control", "registered-forticlient", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_settings.py
index 8c046bf51..eb8553c6a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_endpoint_control_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -315,11 +315,12 @@ def underscore_to_hyphen(data):
def endpoint_control_settings(data, fos):
vdom = data["vdom"]
endpoint_control_settings_data = data["endpoint_control_settings"]
- filtered_data = underscore_to_hyphen(
- filter_endpoint_control_settings_data(endpoint_control_settings_data)
+ filtered_data = filter_endpoint_control_settings_data(
+ endpoint_control_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("endpoint-control", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("endpoint-control", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_export_config_playbook.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_export_config_playbook.py
index 7d17c9199..382ca0f2f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_export_config_playbook.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_export_config_playbook.py
@@ -418,6 +418,7 @@ options:
- 'vpn.certificate_crl'
- 'vpn.certificate_ocsp-server'
- 'vpn.certificate_setting'
+ - 'vpn_qkd'
- 'vpn.ssl.web_realm'
- 'vpn.ssl.web_host-check-software'
- 'vpn.ssl.web_portal'
@@ -425,16 +426,16 @@ options:
- 'vpn.ssl.web_user-bookmark'
- 'vpn.ssl_settings'
- 'vpn.ssl_client'
- - 'vpn_kmip-server'
+ - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1'
- 'vpn.ipsec_phase2'
- 'vpn.ipsec_manualkey'
- 'vpn.ipsec_concentrator'
- - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1-interface'
- 'vpn.ipsec_phase2-interface'
- 'vpn.ipsec_manualkey-interface'
- 'vpn.ipsec_forticlient'
+ - 'vpn_kmip-server'
- 'vpn_pptp'
- 'vpn_l2tp'
- 'certificate_ca'
@@ -458,6 +459,7 @@ options:
- 'ips_global'
- 'ips_settings'
- 'sctp-filter_profile'
+ - 'diameter-filter_profile'
- 'web-proxy_profile'
- 'web-proxy_global'
- 'web-proxy_explicit'
@@ -481,6 +483,7 @@ options:
- 'application_group'
- 'dlp_data-type'
- 'dlp_dictionary'
+ - 'dlp_exact-data-match'
- 'dlp_sensor'
- 'dlp_filepattern'
- 'dlp_sensitivity'
@@ -488,7 +491,7 @@ options:
- 'dlp_profile'
- 'dlp_settings'
- 'videofilter_youtube-key'
- - 'videofilter_youtube-channel-filter'
+ - 'videofilter_keyword'
- 'videofilter_profile'
- 'emailfilter_bword'
- 'emailfilter_block-allow-list'
@@ -557,6 +560,8 @@ options:
- 'icap_server'
- 'icap_server-group'
- 'icap_profile'
+ - 'user_peer'
+ - 'user_peergrp'
- 'user_certificate'
- 'user_radius'
- 'user_tacacs+'
@@ -566,6 +571,7 @@ options:
- 'user_domain-controller'
- 'user_pop3'
- 'user_saml'
+ - 'user_external-identity-provider'
- 'user_fsso'
- 'user_adgrp'
- 'user_fsso-polling'
@@ -573,8 +579,6 @@ options:
- 'user_password-policy'
- 'user_local'
- 'user_setting'
- - 'user_peer'
- - 'user_peergrp'
- 'user_quarantine'
- 'user_group'
- 'user_security-exempt-list'
@@ -644,22 +648,14 @@ options:
- 'system_isf-queue-profile'
- 'system_npu'
- 'system_np6'
+ - 'system_gi-gk'
- 'system_modem'
- 'system.3g-modem_custom'
- 'system_lte-modem'
- - 'firewall_acl'
- - 'firewall_acl6'
- - 'monitoring_np6-ipsec-engine'
- - 'monitoring_npu-hpe'
- - 'switch-controller.ptp_settings'
- - 'switch-controller.ptp_policy'
- - 'system_physical-switch'
- - 'system_virtual-switch'
- - 'system_stp'
- - 'system_gi-gk'
- 'firewall_gtp'
- 'firewall_pfcp'
- - 'vpn_ocvpn'
+ - 'firewall_acl'
+ - 'firewall_acl6'
- 'gtp_apn'
- 'gtp_apngrp'
- 'gtp_message-filter-v0v1'
@@ -669,6 +665,17 @@ options:
- 'gtp_tunnel-limit'
- 'gtp_apn-shaper'
- 'pfcp_message-filter'
+ - 'monitoring_np6-ipsec-engine'
+ - 'monitoring_npu-hpe'
+ - 'system_npu-vlink'
+ - 'system_physical-switch'
+ - 'system_virtual-switch'
+ - 'system_stp'
+ - 'system_smc-ntp'
+ - 'videofilter_youtube-channel-filter'
+ - 'switch-controller.ptp_settings'
+ - 'switch-controller.ptp_policy'
+ - 'vpn_ocvpn'
- 'system.replacemsg_mail'
- 'system.replacemsg_http'
- 'system.replacemsg_webproxy'
@@ -833,7 +840,6 @@ options:
- 'firewall_policy6'
- 'antivirus_notification'
- 'antivirus_mms-checksum'
- - 'system_smc-ntp'
- 'switch-controller_vlan'
- 'switch-controller.security-policy_captive-portal'
- 'user_device'
@@ -1149,6 +1155,7 @@ options:
- 'vpn.certificate_crl'
- 'vpn.certificate_ocsp-server'
- 'vpn.certificate_setting'
+ - 'vpn_qkd'
- 'vpn.ssl.web_realm'
- 'vpn.ssl.web_host-check-software'
- 'vpn.ssl.web_portal'
@@ -1156,16 +1163,16 @@ options:
- 'vpn.ssl.web_user-bookmark'
- 'vpn.ssl_settings'
- 'vpn.ssl_client'
- - 'vpn_kmip-server'
+ - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1'
- 'vpn.ipsec_phase2'
- 'vpn.ipsec_manualkey'
- 'vpn.ipsec_concentrator'
- - 'vpn.ipsec_fec'
- 'vpn.ipsec_phase1-interface'
- 'vpn.ipsec_phase2-interface'
- 'vpn.ipsec_manualkey-interface'
- 'vpn.ipsec_forticlient'
+ - 'vpn_kmip-server'
- 'vpn_pptp'
- 'vpn_l2tp'
- 'certificate_ca'
@@ -1189,6 +1196,7 @@ options:
- 'ips_global'
- 'ips_settings'
- 'sctp-filter_profile'
+ - 'diameter-filter_profile'
- 'web-proxy_profile'
- 'web-proxy_global'
- 'web-proxy_explicit'
@@ -1212,6 +1220,7 @@ options:
- 'application_group'
- 'dlp_data-type'
- 'dlp_dictionary'
+ - 'dlp_exact-data-match'
- 'dlp_sensor'
- 'dlp_filepattern'
- 'dlp_sensitivity'
@@ -1219,7 +1228,7 @@ options:
- 'dlp_profile'
- 'dlp_settings'
- 'videofilter_youtube-key'
- - 'videofilter_youtube-channel-filter'
+ - 'videofilter_keyword'
- 'videofilter_profile'
- 'emailfilter_bword'
- 'emailfilter_block-allow-list'
@@ -1288,6 +1297,8 @@ options:
- 'icap_server'
- 'icap_server-group'
- 'icap_profile'
+ - 'user_peer'
+ - 'user_peergrp'
- 'user_certificate'
- 'user_radius'
- 'user_tacacs+'
@@ -1297,6 +1308,7 @@ options:
- 'user_domain-controller'
- 'user_pop3'
- 'user_saml'
+ - 'user_external-identity-provider'
- 'user_fsso'
- 'user_adgrp'
- 'user_fsso-polling'
@@ -1304,8 +1316,6 @@ options:
- 'user_password-policy'
- 'user_local'
- 'user_setting'
- - 'user_peer'
- - 'user_peergrp'
- 'user_quarantine'
- 'user_group'
- 'user_security-exempt-list'
@@ -1375,22 +1385,14 @@ options:
- 'system_isf-queue-profile'
- 'system_npu'
- 'system_np6'
+ - 'system_gi-gk'
- 'system_modem'
- 'system.3g-modem_custom'
- 'system_lte-modem'
- - 'firewall_acl'
- - 'firewall_acl6'
- - 'monitoring_np6-ipsec-engine'
- - 'monitoring_npu-hpe'
- - 'switch-controller.ptp_settings'
- - 'switch-controller.ptp_policy'
- - 'system_physical-switch'
- - 'system_virtual-switch'
- - 'system_stp'
- - 'system_gi-gk'
- 'firewall_gtp'
- 'firewall_pfcp'
- - 'vpn_ocvpn'
+ - 'firewall_acl'
+ - 'firewall_acl6'
- 'gtp_apn'
- 'gtp_apngrp'
- 'gtp_message-filter-v0v1'
@@ -1400,6 +1402,17 @@ options:
- 'gtp_tunnel-limit'
- 'gtp_apn-shaper'
- 'pfcp_message-filter'
+ - 'monitoring_np6-ipsec-engine'
+ - 'monitoring_npu-hpe'
+ - 'system_npu-vlink'
+ - 'system_physical-switch'
+ - 'system_virtual-switch'
+ - 'system_stp'
+ - 'system_smc-ntp'
+ - 'videofilter_youtube-channel-filter'
+ - 'switch-controller.ptp_settings'
+ - 'switch-controller.ptp_policy'
+ - 'vpn_ocvpn'
- 'system.replacemsg_mail'
- 'system.replacemsg_http'
- 'system.replacemsg_webproxy'
@@ -1564,7 +1577,6 @@ options:
- 'firewall_policy6'
- 'antivirus_notification'
- 'antivirus_mms-checksum'
- - 'system_smc-ntp'
- 'switch-controller_vlan'
- 'switch-controller.security-policy_captive-portal'
- 'user_device'
@@ -2818,6 +2830,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "None",
"mkey_type": None,
},
+ "vpn_qkd": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"vpn.ssl.web_realm": {
"mkey": "url_path",
"mkey_type": str,
@@ -2846,7 +2862,7 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
- "vpn_kmip-server": {
+ "vpn.ipsec_fec": {
"mkey": "name",
"mkey_type": str,
},
@@ -2866,10 +2882,6 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "id",
"mkey_type": int,
},
- "vpn.ipsec_fec": {
- "mkey": "name",
- "mkey_type": str,
- },
"vpn.ipsec_phase1-interface": {
"mkey": "name",
"mkey_type": str,
@@ -2886,6 +2898,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "realm",
"mkey_type": str,
},
+ "vpn_kmip-server": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"vpn_pptp": {
"mkey": "None",
"mkey_type": None,
@@ -2978,6 +2994,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "diameter-filter_profile": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"web-proxy_profile": {
"mkey": "name",
"mkey_type": str,
@@ -3070,6 +3090,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "dlp_exact-data-match": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"dlp_sensor": {
"mkey": "name",
"mkey_type": str,
@@ -3098,7 +3122,7 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "id",
"mkey_type": int,
},
- "videofilter_youtube-channel-filter": {
+ "videofilter_keyword": {
"mkey": "id",
"mkey_type": int,
},
@@ -3374,6 +3398,14 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "user_peer": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
+ "user_peergrp": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"user_certificate": {
"mkey": "name",
"mkey_type": str,
@@ -3410,6 +3442,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "user_external-identity-provider": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"user_fsso": {
"mkey": "name",
"mkey_type": str,
@@ -3438,14 +3474,6 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "None",
"mkey_type": None,
},
- "user_peer": {
- "mkey": "name",
- "mkey_type": str,
- },
- "user_peergrp": {
- "mkey": "name",
- "mkey_type": str,
- },
"user_quarantine": {
"mkey": "None",
"mkey_type": None,
@@ -3722,6 +3750,10 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "name",
"mkey_type": str,
},
+ "system_gi-gk": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
"system_modem": {
"mkey": "None",
"mkey_type": None,
@@ -3734,6 +3766,14 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "None",
"mkey_type": None,
},
+ "firewall_gtp": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
+ "firewall_pfcp": {
+ "mkey": "name",
+ "mkey_type": str,
+ },
"firewall_acl": {
"mkey": "policyid",
"mkey_type": int,
@@ -3742,86 +3782,86 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "policyid",
"mkey_type": int,
},
- "monitoring_np6-ipsec-engine": {
- "mkey": "None",
- "mkey_type": None,
- },
- "monitoring_npu-hpe": {
- "mkey": "None",
- "mkey_type": None,
- },
- "switch-controller.ptp_settings": {
- "mkey": "None",
- "mkey_type": None,
- },
- "switch-controller.ptp_policy": {
+ "gtp_apn": {
"mkey": "name",
"mkey_type": str,
},
- "system_physical-switch": {
+ "gtp_apngrp": {
"mkey": "name",
"mkey_type": str,
},
- "system_virtual-switch": {
+ "gtp_message-filter-v0v1": {
"mkey": "name",
"mkey_type": str,
},
- "system_stp": {
- "mkey": "None",
- "mkey_type": None,
- },
- "system_gi-gk": {
- "mkey": "None",
- "mkey_type": None,
- },
- "firewall_gtp": {
+ "gtp_message-filter-v2": {
"mkey": "name",
"mkey_type": str,
},
- "firewall_pfcp": {
+ "gtp_rat-timeout-profile": {
"mkey": "name",
"mkey_type": str,
},
- "vpn_ocvpn": {
- "mkey": "None",
- "mkey_type": None,
- },
- "gtp_apn": {
+ "gtp_ie-allow-list": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_apngrp": {
+ "gtp_tunnel-limit": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_message-filter-v0v1": {
- "mkey": "name",
- "mkey_type": str,
+ "gtp_apn-shaper": {
+ "mkey": "id",
+ "mkey_type": int,
},
- "gtp_message-filter-v2": {
+ "pfcp_message-filter": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_rat-timeout-profile": {
+ "monitoring_np6-ipsec-engine": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "monitoring_npu-hpe": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "system_npu-vlink": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_ie-allow-list": {
+ "system_physical-switch": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_tunnel-limit": {
+ "system_virtual-switch": {
"mkey": "name",
"mkey_type": str,
},
- "gtp_apn-shaper": {
+ "system_stp": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "system_smc-ntp": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "videofilter_youtube-channel-filter": {
"mkey": "id",
"mkey_type": int,
},
- "pfcp_message-filter": {
+ "switch-controller.ptp_settings": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
+ "switch-controller.ptp_policy": {
"mkey": "name",
"mkey_type": str,
},
+ "vpn_ocvpn": {
+ "mkey": "None",
+ "mkey_type": None,
+ },
"system.replacemsg_mail": {
"mkey": "msg_type",
"mkey_type": str,
@@ -4478,10 +4518,6 @@ MODULE_MKEY_DEFINITONS = {
"mkey": "id",
"mkey_type": int,
},
- "system_smc-ntp": {
- "mkey": "None",
- "mkey_type": None,
- },
"switch-controller_vlan": {
"mkey": "name",
"mkey_type": str,
@@ -4618,6 +4654,7 @@ SPECIAL_ATTRIBUTE_TABLE = {
["pingserver_monitor_interface"],
["vcluster", "monitor"],
["vcluster", "pingserver_monitor_interface"],
+ ["ipsec_phase2_proposal"],
["secondary_vcluster", "monitor"],
["secondary_vcluster", "pingserver_monitor_interface"],
],
@@ -4914,14 +4951,14 @@ SPECIAL_ATTRIBUTE_TABLE = {
["neighbor", "attribute_unchanged"],
["neighbor", "attribute_unchanged6"],
["neighbor", "attribute_unchanged_vpnv4"],
+ ["neighbor", "attribute_unchanged_vpnv6"],
["neighbor_group", "attribute_unchanged"],
["neighbor_group", "attribute_unchanged6"],
["neighbor_group", "attribute_unchanged_vpnv4"],
+ ["neighbor_group", "attribute_unchanged_vpnv6"],
],
"router_isis": [["overload_bit_suppress"]],
"system_modem": [["authtype1"], ["authtype2"], ["authtype3"]],
- "monitoring_np6_ipsec_engine": [["threshold"]],
- "monitoring_npu_hpe": [["multipliers"]],
"firewall_gtp": [
["apn", "selection_mode"],
["imsi", "selection_mode"],
@@ -4934,6 +4971,8 @@ SPECIAL_ATTRIBUTE_TABLE = {
["policy_v2", "uli"],
["ie_remove_policy", "remove_ies"],
],
+ "monitoring_np6_ipsec_engine": [["threshold"]],
+ "monitoring_npu_hpe": [["multipliers"]],
"ips_rule": [["location"]],
"extender_controller_extender_profile": [
["allowaccess"],
@@ -5025,8 +5064,8 @@ PLAYBOOK_BASIC_CONFIG = [
"gather_facts": "no",
"vars": {
"vdom": "root",
- "ansible_httpapi_use_ssl": "yes",
- "ansible_httpapi_validate_certs": "no",
+ "ansible_httpapi_use_ssl": "true",
+ "ansible_httpapi_validate_certs": "false",
"ansible_httpapi_port": 443,
},
}
@@ -5468,6 +5507,7 @@ def main():
"vpn.certificate_crl",
"vpn.certificate_ocsp-server",
"vpn.certificate_setting",
+ "vpn_qkd",
"vpn.ssl.web_realm",
"vpn.ssl.web_host-check-software",
"vpn.ssl.web_portal",
@@ -5475,16 +5515,16 @@ def main():
"vpn.ssl.web_user-bookmark",
"vpn.ssl_settings",
"vpn.ssl_client",
- "vpn_kmip-server",
+ "vpn.ipsec_fec",
"vpn.ipsec_phase1",
"vpn.ipsec_phase2",
"vpn.ipsec_manualkey",
"vpn.ipsec_concentrator",
- "vpn.ipsec_fec",
"vpn.ipsec_phase1-interface",
"vpn.ipsec_phase2-interface",
"vpn.ipsec_manualkey-interface",
"vpn.ipsec_forticlient",
+ "vpn_kmip-server",
"vpn_pptp",
"vpn_l2tp",
"certificate_ca",
@@ -5508,6 +5548,7 @@ def main():
"ips_global",
"ips_settings",
"sctp-filter_profile",
+ "diameter-filter_profile",
"web-proxy_profile",
"web-proxy_global",
"web-proxy_explicit",
@@ -5531,6 +5572,7 @@ def main():
"application_group",
"dlp_data-type",
"dlp_dictionary",
+ "dlp_exact-data-match",
"dlp_sensor",
"dlp_filepattern",
"dlp_sensitivity",
@@ -5538,7 +5580,7 @@ def main():
"dlp_profile",
"dlp_settings",
"videofilter_youtube-key",
- "videofilter_youtube-channel-filter",
+ "videofilter_keyword",
"videofilter_profile",
"emailfilter_bword",
"emailfilter_block-allow-list",
@@ -5607,6 +5649,8 @@ def main():
"icap_server",
"icap_server-group",
"icap_profile",
+ "user_peer",
+ "user_peergrp",
"user_certificate",
"user_radius",
"user_tacacs+",
@@ -5616,6 +5660,7 @@ def main():
"user_domain-controller",
"user_pop3",
"user_saml",
+ "user_external-identity-provider",
"user_fsso",
"user_adgrp",
"user_fsso-polling",
@@ -5623,8 +5668,6 @@ def main():
"user_password-policy",
"user_local",
"user_setting",
- "user_peer",
- "user_peergrp",
"user_quarantine",
"user_group",
"user_security-exempt-list",
@@ -5694,22 +5737,14 @@ def main():
"system_isf-queue-profile",
"system_npu",
"system_np6",
+ "system_gi-gk",
"system_modem",
"system.3g-modem_custom",
"system_lte-modem",
- "firewall_acl",
- "firewall_acl6",
- "monitoring_np6-ipsec-engine",
- "monitoring_npu-hpe",
- "switch-controller.ptp_settings",
- "switch-controller.ptp_policy",
- "system_physical-switch",
- "system_virtual-switch",
- "system_stp",
- "system_gi-gk",
"firewall_gtp",
"firewall_pfcp",
- "vpn_ocvpn",
+ "firewall_acl",
+ "firewall_acl6",
"gtp_apn",
"gtp_apngrp",
"gtp_message-filter-v0v1",
@@ -5719,6 +5754,17 @@ def main():
"gtp_tunnel-limit",
"gtp_apn-shaper",
"pfcp_message-filter",
+ "monitoring_np6-ipsec-engine",
+ "monitoring_npu-hpe",
+ "system_npu-vlink",
+ "system_physical-switch",
+ "system_virtual-switch",
+ "system_stp",
+ "system_smc-ntp",
+ "videofilter_youtube-channel-filter",
+ "switch-controller.ptp_settings",
+ "switch-controller.ptp_policy",
+ "vpn_ocvpn",
"system.replacemsg_mail",
"system.replacemsg_http",
"system.replacemsg_webproxy",
@@ -5883,7 +5929,6 @@ def main():
"firewall_policy6",
"antivirus_notification",
"antivirus_mms-checksum",
- "system_smc-ntp",
"switch-controller_vlan",
"switch-controller.security-policy_captive-portal",
"user_device",
@@ -6207,6 +6252,7 @@ def main():
"vpn.certificate_crl",
"vpn.certificate_ocsp-server",
"vpn.certificate_setting",
+ "vpn_qkd",
"vpn.ssl.web_realm",
"vpn.ssl.web_host-check-software",
"vpn.ssl.web_portal",
@@ -6214,16 +6260,16 @@ def main():
"vpn.ssl.web_user-bookmark",
"vpn.ssl_settings",
"vpn.ssl_client",
- "vpn_kmip-server",
+ "vpn.ipsec_fec",
"vpn.ipsec_phase1",
"vpn.ipsec_phase2",
"vpn.ipsec_manualkey",
"vpn.ipsec_concentrator",
- "vpn.ipsec_fec",
"vpn.ipsec_phase1-interface",
"vpn.ipsec_phase2-interface",
"vpn.ipsec_manualkey-interface",
"vpn.ipsec_forticlient",
+ "vpn_kmip-server",
"vpn_pptp",
"vpn_l2tp",
"certificate_ca",
@@ -6247,6 +6293,7 @@ def main():
"ips_global",
"ips_settings",
"sctp-filter_profile",
+ "diameter-filter_profile",
"web-proxy_profile",
"web-proxy_global",
"web-proxy_explicit",
@@ -6270,6 +6317,7 @@ def main():
"application_group",
"dlp_data-type",
"dlp_dictionary",
+ "dlp_exact-data-match",
"dlp_sensor",
"dlp_filepattern",
"dlp_sensitivity",
@@ -6277,7 +6325,7 @@ def main():
"dlp_profile",
"dlp_settings",
"videofilter_youtube-key",
- "videofilter_youtube-channel-filter",
+ "videofilter_keyword",
"videofilter_profile",
"emailfilter_bword",
"emailfilter_block-allow-list",
@@ -6346,6 +6394,8 @@ def main():
"icap_server",
"icap_server-group",
"icap_profile",
+ "user_peer",
+ "user_peergrp",
"user_certificate",
"user_radius",
"user_tacacs+",
@@ -6355,6 +6405,7 @@ def main():
"user_domain-controller",
"user_pop3",
"user_saml",
+ "user_external-identity-provider",
"user_fsso",
"user_adgrp",
"user_fsso-polling",
@@ -6362,8 +6413,6 @@ def main():
"user_password-policy",
"user_local",
"user_setting",
- "user_peer",
- "user_peergrp",
"user_quarantine",
"user_group",
"user_security-exempt-list",
@@ -6433,22 +6482,14 @@ def main():
"system_isf-queue-profile",
"system_npu",
"system_np6",
+ "system_gi-gk",
"system_modem",
"system.3g-modem_custom",
"system_lte-modem",
- "firewall_acl",
- "firewall_acl6",
- "monitoring_np6-ipsec-engine",
- "monitoring_npu-hpe",
- "switch-controller.ptp_settings",
- "switch-controller.ptp_policy",
- "system_physical-switch",
- "system_virtual-switch",
- "system_stp",
- "system_gi-gk",
"firewall_gtp",
"firewall_pfcp",
- "vpn_ocvpn",
+ "firewall_acl",
+ "firewall_acl6",
"gtp_apn",
"gtp_apngrp",
"gtp_message-filter-v0v1",
@@ -6458,6 +6499,17 @@ def main():
"gtp_tunnel-limit",
"gtp_apn-shaper",
"pfcp_message-filter",
+ "monitoring_np6-ipsec-engine",
+ "monitoring_npu-hpe",
+ "system_npu-vlink",
+ "system_physical-switch",
+ "system_virtual-switch",
+ "system_stp",
+ "system_smc-ntp",
+ "videofilter_youtube-channel-filter",
+ "switch-controller.ptp_settings",
+ "switch-controller.ptp_policy",
+ "vpn_ocvpn",
"system.replacemsg_mail",
"system.replacemsg_http",
"system.replacemsg_webproxy",
@@ -6622,7 +6674,6 @@ def main():
"firewall_policy6",
"antivirus_notification",
"antivirus_mms-checksum",
- "system_smc-ntp",
"switch-controller_vlan",
"switch-controller.security-policy_captive-portal",
"user_device",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_dataplan.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_dataplan.py
index 3157f52e2..7013edfde 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_dataplan.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_dataplan.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -377,9 +377,10 @@ def extender_controller_dataplan(data, fos, check_mode=False):
state = data["state"]
extender_controller_dataplan_data = data["extender_controller_dataplan"]
- filtered_data = underscore_to_hyphen(
- filter_extender_controller_dataplan_data(extender_controller_dataplan_data)
+ filtered_data = filter_extender_controller_dataplan_data(
+ extender_controller_dataplan_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -443,7 +444,9 @@ def extender_controller_dataplan(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("extender-controller", "dataplan", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "extender-controller", "dataplan", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender.py
index a21850cec..02aa319c5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -955,9 +955,10 @@ def extender_controller_extender(data, fos, check_mode=False):
extender_controller_extender_data = flatten_multilists_attributes(
extender_controller_extender_data
)
- filtered_data = underscore_to_hyphen(
- filter_extender_controller_extender_data(extender_controller_extender_data)
+ filtered_data = filter_extender_controller_extender_data(
+ extender_controller_extender_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1021,7 +1022,9 @@ def extender_controller_extender(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("extender-controller", "extender", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "extender-controller", "extender", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender_profile.py
index 66909bce9..598e163a8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_controller_extender_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -819,15 +819,14 @@ def extender_controller_extender_profile(data, fos):
extender_controller_extender_profile_data = flatten_multilists_attributes(
extender_controller_extender_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_extender_controller_extender_profile_data(
- extender_controller_extender_profile_data
- )
+ filtered_data = filter_extender_controller_extender_profile_data(
+ extender_controller_extender_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "extender-controller", "extender-profile", data=filtered_data, vdom=vdom
+ "extender-controller", "extender-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_extender_info.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_extender_info.py
index 8da3dfa1f..bd3d344fa 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_extender_info.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_extender_info.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<sn>": "sn"}
+ speciallist = {"<sn>": "sn"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def extender_extender_info(data, fos, check_mode=False):
vdom = data["vdom"]
extender_extender_info_data = data["extender_extender_info"]
- filtered_data = underscore_to_hyphen(
- filter_extender_extender_info_data(extender_extender_info_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_extender_extender_info_data(extender_extender_info_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("extender", "extender-info", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_by_mcc_mnc.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_by_mcc_mnc.py
index 1e8c76755..6f845a126 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_by_mcc_mnc.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_by_mcc_mnc.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<sn>": "sn"}
+ speciallist = {"<sn>": "sn"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,12 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def extender_lte_carrier_by_mcc_mnc(data, fos):
vdom = data["vdom"]
extender_lte_carrier_by_mcc_mnc_data = data["extender_lte_carrier_by_mcc_mnc"]
- filtered_data = underscore_to_hyphen(
- filter_extender_lte_carrier_by_mcc_mnc_data(
- extender_lte_carrier_by_mcc_mnc_data
- )
+ filtered_data = filter_extender_lte_carrier_by_mcc_mnc_data(
+ extender_lte_carrier_by_mcc_mnc_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("extender", "lte-carrier-by-mcc-mnc", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_list.py
index e147cad46..49f94e1b8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_lte_carrier_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<sn>": "sn"}
+ speciallist = {"<sn>": "sn"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def extender_lte_carrier_list(data, fos):
vdom = data["vdom"]
extender_lte_carrier_list_data = data["extender_lte_carrier_list"]
- filtered_data = underscore_to_hyphen(
- filter_extender_lte_carrier_list_data(extender_lte_carrier_list_data)
+ filtered_data = filter_extender_lte_carrier_list_data(
+ extender_lte_carrier_list_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("extender", "lte-carrier-list", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_modem_status.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_modem_status.py
index a1cf6646b..442310ead 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_modem_status.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_modem_status.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<sn>": "sn", "[1|2]": "set_1_2"}
+ speciallist = {"<sn>": "sn", "[1|2]": "set_1_2"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def extender_modem_status(data, fos):
vdom = data["vdom"]
extender_modem_status_data = data["extender_modem_status"]
- filtered_data = underscore_to_hyphen(
- filter_extender_modem_status_data(extender_modem_status_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_extender_modem_status_data(extender_modem_status_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("extender", "modem-status", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_sys_info.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_sys_info.py
index a9a4b3d71..5bfc9e9d5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_sys_info.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extender_sys_info.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<sn>": "sn"}
+ speciallist = {"<sn>": "sn"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def extender_sys_info(data, fos, check_mode=False):
vdom = data["vdom"]
extender_sys_info_data = data["extender_sys_info"]
- filtered_data = underscore_to_hyphen(
- filter_extender_sys_info_data(extender_sys_info_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_extender_sys_info_data(extender_sys_info_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("extender", "sys-info", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_dataplan.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_dataplan.py
index ec0e256d8..856f3cbec 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_dataplan.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_dataplan.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -352,13 +352,14 @@ def extension_controller_dataplan(data, fos):
state = data["state"]
extension_controller_dataplan_data = data["extension_controller_dataplan"]
- filtered_data = underscore_to_hyphen(
- filter_extension_controller_dataplan_data(extension_controller_dataplan_data)
+ filtered_data = filter_extension_controller_dataplan_data(
+ extension_controller_dataplan_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "extension-controller", "dataplan", data=filtered_data, vdom=vdom
+ "extension-controller", "dataplan", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender.py
index 896e7475d..6ea232463 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -397,13 +397,14 @@ def extension_controller_extender(data, fos):
extension_controller_extender_data = flatten_multilists_attributes(
extension_controller_extender_data
)
- filtered_data = underscore_to_hyphen(
- filter_extension_controller_extender_data(extension_controller_extender_data)
+ filtered_data = filter_extension_controller_extender_data(
+ extension_controller_extender_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "extension-controller", "extender", data=filtered_data, vdom=vdom
+ "extension-controller", "extender", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender_profile.py
index b985cd29b..83c1659d5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_extender_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -807,15 +807,14 @@ def extension_controller_extender_profile(data, fos):
extension_controller_extender_profile_data = flatten_multilists_attributes(
extension_controller_extender_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_extension_controller_extender_profile_data(
- extension_controller_extender_profile_data
- )
+ filtered_data = filter_extension_controller_extender_profile_data(
+ extension_controller_extender_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "extension-controller", "extender-profile", data=filtered_data, vdom=vdom
+ "extension-controller", "extender-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate.py
index 8fe5a4f6c..8afbef6d7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -258,13 +258,14 @@ def extension_controller_fortigate(data, fos):
state = data["state"]
extension_controller_fortigate_data = data["extension_controller_fortigate"]
- filtered_data = underscore_to_hyphen(
- filter_extension_controller_fortigate_data(extension_controller_fortigate_data)
+ filtered_data = filter_extension_controller_fortigate_data(
+ extension_controller_fortigate_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "extension-controller", "fortigate", data=filtered_data, vdom=vdom
+ "extension-controller", "fortigate", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate_profile.py
index 68867a07c..ac4701320 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_extension_controller_fortigate_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -244,15 +244,14 @@ def extension_controller_fortigate_profile(data, fos):
extension_controller_fortigate_profile_data = data[
"extension_controller_fortigate_profile"
]
- filtered_data = underscore_to_hyphen(
- filter_extension_controller_fortigate_profile_data(
- extension_controller_fortigate_profile_data
- )
+ filtered_data = filter_extension_controller_fortigate_profile_data(
+ extension_controller_fortigate_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "extension-controller", "fortigate-profile", data=filtered_data, vdom=vdom
+ "extension-controller", "fortigate-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_file_filter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_file_filter_profile.py
index accdb5951..282be0ad6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_file_filter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_file_filter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -141,7 +141,7 @@ options:
type: str
direction:
description:
- - Traffic direction (HTTP, FTP, SSH, CIFS only).
+ - Traffic direction (HTTP, FTP, SSH, CIFS, and MAPI only).
type: str
choices:
- 'incoming'
@@ -379,9 +379,8 @@ def file_filter_profile(data, fos, check_mode=False):
file_filter_profile_data = data["file_filter_profile"]
file_filter_profile_data = flatten_multilists_attributes(file_filter_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_file_filter_profile_data(file_filter_profile_data)
- )
+ filtered_data = filter_file_filter_profile_data(file_filter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -445,7 +444,7 @@ def file_filter_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("file-filter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("file-filter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy.py
index 557851a75..568387937 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1550,12 +1550,11 @@ def firewall_access_proxy(data, fos):
firewall_access_proxy_data = flatten_multilists_attributes(
firewall_access_proxy_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_access_proxy_data(firewall_access_proxy_data)
- )
+ filtered_data = filter_firewall_access_proxy_data(firewall_access_proxy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("firewall", "access-proxy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "access-proxy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy6.py
index ac57f145e..a8724766f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1390,12 +1390,11 @@ def firewall_access_proxy6(data, fos):
firewall_access_proxy6_data = flatten_multilists_attributes(
firewall_access_proxy6_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_access_proxy6_data(firewall_access_proxy6_data)
- )
+ filtered_data = filter_firewall_access_proxy6_data(firewall_access_proxy6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("firewall", "access-proxy6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "access-proxy6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_ssh_client_cert.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_ssh_client_cert.py
index 0d2a3e4d2..7e1378f56 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_ssh_client_cert.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_ssh_client_cert.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -317,15 +317,14 @@ def firewall_access_proxy_ssh_client_cert(data, fos):
firewall_access_proxy_ssh_client_cert_data = data[
"firewall_access_proxy_ssh_client_cert"
]
- filtered_data = underscore_to_hyphen(
- filter_firewall_access_proxy_ssh_client_cert_data(
- firewall_access_proxy_ssh_client_cert_data
- )
+ filtered_data = filter_firewall_access_proxy_ssh_client_cert_data(
+ firewall_access_proxy_ssh_client_cert_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "firewall", "access-proxy-ssh-client-cert", data=filtered_data, vdom=vdom
+ "firewall", "access-proxy-ssh-client-cert", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_virtual_host.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_virtual_host.py
index f9e0ca5d9..f934ad52a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_virtual_host.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_access_proxy_virtual_host.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,17 @@ options:
description:
- SSL certificate for this host. Source vpn.certificate.local.name.
type: str
+ ssl_certificate_dict:
+ description:
+ - SSL certificates for this host. Use the parameter ssl_certificate if the fortiOS firmware version <= 7.4.1
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Certificate list. Source vpn.certificate.local.name.
+ required: true
+ type: str
"""
EXAMPLES = """
@@ -126,6 +137,9 @@ EXAMPLES = """
name: "default_name_5"
replacemsg_group: "<your_own_value> (source system.replacemsg-group.name)"
ssl_certificate: "<your_own_value> (source vpn.certificate.local.name)"
+ ssl_certificate_dict:
+ -
+ name: "default_name_9 (source vpn.certificate.local.name)"
"""
RETURN = """
@@ -208,7 +222,14 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post
def filter_firewall_access_proxy_virtual_host_data(json):
- option_list = ["host", "host_type", "name", "replacemsg_group", "ssl_certificate"]
+ option_list = [
+ "host",
+ "host_type",
+ "name",
+ "replacemsg_group",
+ "ssl_certificate",
+ "ssl_certificate_dict",
+ ]
json = remove_invalid_fields(json)
dictionary = {}
@@ -233,21 +254,45 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"ssl-certificate-dict": "ssl-certificate"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def firewall_access_proxy_virtual_host(data, fos):
vdom = data["vdom"]
state = data["state"]
firewall_access_proxy_virtual_host_data = data["firewall_access_proxy_virtual_host"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_access_proxy_virtual_host_data(
- firewall_access_proxy_virtual_host_data
- )
+ filtered_data = filter_firewall_access_proxy_virtual_host_data(
+ firewall_access_proxy_virtual_host_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
if state == "present" or state is True:
return fos.set(
- "firewall", "access-proxy-virtual-host", data=filtered_data, vdom=vdom
+ "firewall", "access-proxy-virtual-host", data=converted_data, vdom=vdom
)
elif state == "absent":
@@ -296,7 +341,18 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {"v_range": [["v7.0.0", ""]], "type": "string", "required": True},
- "ssl_certificate": {"v_range": [["v7.0.0", ""]], "type": "string"},
+ "ssl_certificate_dict": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"host": {"v_range": [["v7.0.0", ""]], "type": "string"},
"host_type": {
"v_range": [["v7.0.0", ""]],
@@ -307,6 +363,7 @@ versioned_schema = {
"v_range": [["v7.0.8", "v7.0.12"], ["v7.2.1", ""]],
"type": "string",
},
+ "ssl_certificate": {"v_range": [["v7.0.0", "v7.4.1"]], "type": "string"},
},
"v_range": [["v7.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl.py
index e412e5346..1e5a3c0d1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -310,7 +310,8 @@ def firewall_acl(data, fos, check_mode=False):
state = data["state"]
firewall_acl_data = data["firewall_acl"]
- filtered_data = underscore_to_hyphen(filter_firewall_acl_data(firewall_acl_data))
+ filtered_data = filter_firewall_acl_data(firewall_acl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -374,7 +375,7 @@ def firewall_acl(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "acl", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "acl", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "acl", mkey=filtered_data["policyid"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl6.py
index e9db22779..a1668ce56 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_acl6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -310,7 +310,8 @@ def firewall_acl6(data, fos, check_mode=False):
state = data["state"]
firewall_acl6_data = data["firewall_acl6"]
- filtered_data = underscore_to_hyphen(filter_firewall_acl6_data(firewall_acl6_data))
+ filtered_data = filter_firewall_acl6_data(firewall_acl6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -374,7 +375,7 @@ def firewall_acl6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "acl6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "acl6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "acl6", mkey=filtered_data["policyid"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address.py
index b3aa18cce..524f370d9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -253,15 +253,6 @@ options:
description:
- SDN. Source system.sdn-connector.name.
type: str
- choices:
- - 'aci'
- - 'aws'
- - 'azure'
- - 'gcp'
- - 'nsx'
- - 'nuage'
- - 'oci'
- - 'openstack'
sdn_addr_type:
description:
- Type of addresses to collect.
@@ -425,7 +416,7 @@ EXAMPLES = """
os: "<your_own_value>"
policy_group: "<your_own_value>"
route_tag: "0"
- sdn: "aci"
+ sdn: "<your_own_value> (source system.sdn-connector.name)"
sdn_addr_type: "private"
sdn_tag: "<your_own_value>"
start_ip: "<your_own_value>"
@@ -618,9 +609,8 @@ def firewall_address(data, fos, check_mode=False):
state = data["state"]
firewall_address_data = data["firewall_address"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_address_data(firewall_address_data)
- )
+ filtered_data = filter_firewall_address_data(firewall_address_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -684,7 +674,7 @@ def firewall_address(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "address", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "address", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "address", mkey=filtered_data["name"], vdom=vdom)
@@ -791,20 +781,7 @@ versioned_schema = {
"wildcard_fqdn": {"v_range": [["v6.0.0", ""]], "type": "string"},
"cache_ttl": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"wildcard": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "sdn": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [
- {"value": "aci", "v_range": [["v6.0.0", "v6.0.11"]]},
- {"value": "aws", "v_range": [["v6.0.0", "v6.0.11"]]},
- {"value": "azure", "v_range": [["v6.0.0", "v6.0.11"]]},
- {"value": "gcp", "v_range": [["v6.0.0", "v6.0.11"]]},
- {"value": "nsx", "v_range": [["v6.0.0", "v6.0.11"]]},
- {"value": "nuage", "v_range": [["v6.0.0", "v6.0.11"]]},
- {"value": "oci", "v_range": [["v6.0.0", "v6.0.11"]]},
- {"value": "openstack", "v_range": [["v6.0.0", "v6.0.11"]]},
- ],
- },
+ "sdn": {"v_range": [["v6.0.0", ""]], "type": "string"},
"fsso_group": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6.py
index 64dd69015..2bdd058b0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -487,9 +487,8 @@ def firewall_address6(data, fos, check_mode=False):
state = data["state"]
firewall_address6_data = data["firewall_address6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_address6_data(firewall_address6_data)
- )
+ filtered_data = filter_firewall_address6_data(firewall_address6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -553,7 +552,7 @@ def firewall_address6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "address6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "address6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "address6", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6_template.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6_template.py
index 3aabafe75..13d09f471 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6_template.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_address6_template.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -300,9 +300,10 @@ def firewall_address6_template(data, fos, check_mode=False):
state = data["state"]
firewall_address6_template_data = data["firewall_address6_template"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_address6_template_data(firewall_address6_template_data)
+ filtered_data = filter_firewall_address6_template_data(
+ firewall_address6_template_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -366,7 +367,7 @@ def firewall_address6_template(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "address6-template", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "address6-template", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp.py
index d9e26bd82..bf22f839e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -364,9 +364,8 @@ def firewall_addrgrp(data, fos, check_mode=False):
state = data["state"]
firewall_addrgrp_data = data["firewall_addrgrp"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_addrgrp_data(firewall_addrgrp_data)
- )
+ filtered_data = filter_firewall_addrgrp_data(firewall_addrgrp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -430,7 +429,7 @@ def firewall_addrgrp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "addrgrp", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "addrgrp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "addrgrp", mkey=filtered_data["name"], vdom=vdom)
@@ -487,6 +486,11 @@ versioned_schema = {
],
},
"uuid": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "allow_routing": {
+ "v_range": [["v6.0.0", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"member": {
"type": "list",
"elements": "dict",
@@ -543,11 +547,6 @@ versioned_schema = {
},
"v_range": [["v6.0.0", ""]],
},
- "allow_routing": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
"fabric_object": {
"v_range": [["v6.4.4", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp6.py
index 55f61decf..0ce118313 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_addrgrp6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -336,9 +336,8 @@ def firewall_addrgrp6(data, fos, check_mode=False):
state = data["state"]
firewall_addrgrp6_data = data["firewall_addrgrp6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_addrgrp6_data(firewall_addrgrp6_data)
- )
+ filtered_data = filter_firewall_addrgrp6_data(firewall_addrgrp6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -402,7 +401,7 @@ def firewall_addrgrp6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "addrgrp6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "addrgrp6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "addrgrp6", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_auth_portal.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_auth_portal.py
index f21b36905..ba9f277d2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_auth_portal.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_auth_portal.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -240,11 +240,10 @@ def underscore_to_hyphen(data):
def firewall_auth_portal(data, fos):
vdom = data["vdom"]
firewall_auth_portal_data = data["firewall_auth_portal"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_auth_portal_data(firewall_auth_portal_data)
- )
+ filtered_data = filter_firewall_auth_portal_data(firewall_auth_portal_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("firewall", "auth-portal", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "auth-portal", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_carrier_endpoint_bwl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_carrier_endpoint_bwl.py
index 138c34467..689a2f8ea 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_carrier_endpoint_bwl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_carrier_endpoint_bwl.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -319,9 +319,10 @@ def firewall_carrier_endpoint_bwl(data, fos, check_mode=False):
firewall_carrier_endpoint_bwl_data = flatten_multilists_attributes(
firewall_carrier_endpoint_bwl_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_carrier_endpoint_bwl_data(firewall_carrier_endpoint_bwl_data)
+ filtered_data = filter_firewall_carrier_endpoint_bwl_data(
+ firewall_carrier_endpoint_bwl_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -388,7 +389,7 @@ def firewall_carrier_endpoint_bwl(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "carrier-endpoint-bwl", data=filtered_data, vdom=vdom
+ "firewall", "carrier-endpoint-bwl", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_central_snat_map.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_central_snat_map.py
index 26bc1fbd2..57ed19cd5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_central_snat_map.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_central_snat_map.py
@@ -42,7 +42,7 @@ notes:
- Only one of [after, before] must be specified when action is moving an object.
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -450,9 +450,10 @@ def firewall_central_snat_map(data, fos, check_mode=False):
state = data["state"]
firewall_central_snat_map_data = data["firewall_central_snat_map"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_central_snat_map_data(firewall_central_snat_map_data)
+ filtered_data = filter_firewall_central_snat_map_data(
+ firewall_central_snat_map_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -516,7 +517,7 @@ def firewall_central_snat_map(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "central-snat-map", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "central-snat-map", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_city.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_city.py
index 833cbe296..479db74cd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_city.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_city.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,7 +232,8 @@ def firewall_city(data, fos, check_mode=False):
state = data["state"]
firewall_city_data = data["firewall_city"]
- filtered_data = underscore_to_hyphen(filter_firewall_city_data(firewall_city_data))
+ filtered_data = filter_firewall_city_data(firewall_city_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -296,7 +297,7 @@ def firewall_city(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "city", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "city", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "city", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_consolidated_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_consolidated_policy.py
index 837cea7da..0f7a38c3b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_consolidated_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_consolidated_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1011,9 +1011,10 @@ def firewall_consolidated_policy(data, fos, check_mode=False):
state = data["state"]
firewall_consolidated_policy_data = data["firewall_consolidated_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_consolidated_policy_data(firewall_consolidated_policy_data)
+ filtered_data = filter_firewall_consolidated_policy_data(
+ firewall_consolidated_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1077,7 +1078,9 @@ def firewall_consolidated_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.consolidated", "policy", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "firewall.consolidated", "policy", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_country.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_country.py
index a0c2c9870..39d08dac2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_country.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_country.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,9 +246,8 @@ def firewall_country(data, fos, check_mode=False):
state = data["state"]
firewall_country_data = data["firewall_country"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_country_data(firewall_country_data)
- )
+ filtered_data = filter_firewall_country_data(firewall_country_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -312,7 +311,7 @@ def firewall_country(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "country", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "country", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "country", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_decrypted_traffic_mirror.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_decrypted_traffic_mirror.py
index 7ab8e3199..dd6971daa 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_decrypted_traffic_mirror.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_decrypted_traffic_mirror.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -294,11 +294,10 @@ def firewall_decrypted_traffic_mirror(data, fos, check_mode=False):
firewall_decrypted_traffic_mirror_data = flatten_multilists_attributes(
firewall_decrypted_traffic_mirror_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_decrypted_traffic_mirror_data(
- firewall_decrypted_traffic_mirror_data
- )
+ filtered_data = filter_firewall_decrypted_traffic_mirror_data(
+ firewall_decrypted_traffic_mirror_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -367,7 +366,7 @@ def firewall_decrypted_traffic_mirror(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "decrypted-traffic-mirror", data=filtered_data, vdom=vdom
+ "firewall", "decrypted-traffic-mirror", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dnstranslation.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dnstranslation.py
index 1503328b4..14574dc10 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dnstranslation.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dnstranslation.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -244,9 +244,8 @@ def firewall_dnstranslation(data, fos, check_mode=False):
state = data["state"]
firewall_dnstranslation_data = data["firewall_dnstranslation"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_dnstranslation_data(firewall_dnstranslation_data)
- )
+ filtered_data = filter_firewall_dnstranslation_data(firewall_dnstranslation_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -310,7 +309,7 @@ def firewall_dnstranslation(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "dnstranslation", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "dnstranslation", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy.py
index b350bf947..0890e912e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -141,6 +141,92 @@ options:
choices:
- 'disable'
- 'enable'
+ synproxy_tcp_mss:
+ description:
+ - Determine TCP maximum segment size (MSS) value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '0'
+ - '256'
+ - '512'
+ - '1024'
+ - '1300'
+ - '1360'
+ - '1460'
+ - '1500'
+ synproxy_tcp_sack:
+ description:
+ - enable/disable TCP selective acknowledage (SACK) for packets replied by syn proxy module.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ synproxy_tcp_timestamp:
+ description:
+ - enable/disable TCP timestamp option for packets replied by syn proxy module.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ synproxy_tcp_window:
+ description:
+ - Determine TCP Window size for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '4096'
+ - '8192'
+ - '16384'
+ - '32768'
+ synproxy_tcp_windowscale:
+ description:
+ - Determine TCP window scale option value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '0'
+ - '1'
+ - '2'
+ - '3'
+ - '4'
+ - '5'
+ - '6'
+ - '7'
+ - '8'
+ - '9'
+ - '10'
+ - '11'
+ - '12'
+ - '13'
+ - '14'
+ synproxy_tos:
+ description:
+ - Determine TCP differentiated services code point value (type of service).
+ type: str
+ choices:
+ - '0'
+ - '10'
+ - '12'
+ - '14'
+ - '18'
+ - '20'
+ - '22'
+ - '26'
+ - '28'
+ - '30'
+ - '34'
+ - '36'
+ - '38'
+ - '40'
+ - '46'
+ - '255'
+ synproxy_ttl:
+ description:
+ - Determine Time to live (TTL) value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '32'
+ - '64'
+ - '128'
+ - '255'
threshold:
description:
- Anomaly threshold. Number of detected instances (packets per second or concurrent session number) that triggers the anomaly
@@ -226,21 +312,28 @@ EXAMPLES = """
quarantine_expiry: "<your_own_value>"
quarantine_log: "disable"
status: "disable"
+ synproxy_tcp_mss: "0"
+ synproxy_tcp_sack: "enable"
+ synproxy_tcp_timestamp: "enable"
+ synproxy_tcp_window: "4096"
+ synproxy_tcp_windowscale: "0"
+ synproxy_tos: "0"
+ synproxy_ttl: "32"
threshold: "0"
threshold_default: "0"
comments: "<your_own_value>"
dstaddr:
-
- name: "default_name_15 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_22 (source firewall.address.name firewall.addrgrp.name)"
interface: "<your_own_value> (source system.zone.name system.interface.name)"
- name: "default_name_17"
+ name: "default_name_24"
policyid: "<you_own_value>"
service:
-
- name: "default_name_20 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_27 (source firewall.service.custom.name firewall.service.group.name)"
srcaddr:
-
- name: "default_name_22 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_29 (source firewall.address.name firewall.addrgrp.name)"
status: "enable"
"""
@@ -369,9 +462,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"threshold(default)": "threshold_default"}
+ speciallist = {"threshold(default)": "threshold_default"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -380,8 +473,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -397,10 +493,8 @@ def firewall_dos_policy(data, fos, check_mode=False):
state = data["state"]
firewall_dos_policy_data = data["firewall_dos_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_dos_policy_data(firewall_dos_policy_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_firewall_dos_policy_data(firewall_dos_policy_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
@@ -592,6 +686,93 @@ versioned_schema = {
"options": [{"value": "disable"}, {"value": "enable"}],
},
"threshold": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "synproxy_ttl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "32"},
+ {"value": "64"},
+ {"value": "128"},
+ {"value": "255"},
+ ],
+ },
+ "synproxy_tos": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "10"},
+ {"value": "12"},
+ {"value": "14"},
+ {"value": "18"},
+ {"value": "20"},
+ {"value": "22"},
+ {"value": "26"},
+ {"value": "28"},
+ {"value": "30"},
+ {"value": "34"},
+ {"value": "36"},
+ {"value": "38"},
+ {"value": "40"},
+ {"value": "46"},
+ {"value": "255"},
+ ],
+ },
+ "synproxy_tcp_mss": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "256"},
+ {"value": "512"},
+ {"value": "1024"},
+ {"value": "1300"},
+ {"value": "1360"},
+ {"value": "1460"},
+ {"value": "1500"},
+ ],
+ },
+ "synproxy_tcp_sack": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "synproxy_tcp_timestamp": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "synproxy_tcp_window": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "4096"},
+ {"value": "8192"},
+ {"value": "16384"},
+ {"value": "32768"},
+ ],
+ },
+ "synproxy_tcp_windowscale": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "1"},
+ {"value": "2"},
+ {"value": "3"},
+ {"value": "4"},
+ {"value": "5"},
+ {"value": "6"},
+ {"value": "7"},
+ {"value": "8"},
+ {"value": "9"},
+ {"value": "10"},
+ {"value": "11"},
+ {"value": "12"},
+ {"value": "13"},
+ {"value": "14"},
+ ],
+ },
"threshold_default": {
"v_range": [["v6.0.0", "v7.0.5"], ["v7.2.0", "v7.2.0"]],
"type": "integer",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy6.py
index 163bacfc9..2dc3f2b9c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_dos_policy6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -141,6 +141,92 @@ options:
choices:
- 'disable'
- 'enable'
+ synproxy_tcp_mss:
+ description:
+ - Determine TCP maximum segment size (MSS) value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '0'
+ - '256'
+ - '512'
+ - '1024'
+ - '1300'
+ - '1360'
+ - '1460'
+ - '1500'
+ synproxy_tcp_sack:
+ description:
+ - enable/disable TCP selective acknowledage (SACK) for packets replied by syn proxy module.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ synproxy_tcp_timestamp:
+ description:
+ - enable/disable TCP timestamp option for packets replied by syn proxy module.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ synproxy_tcp_window:
+ description:
+ - Determine TCP Window size for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '4096'
+ - '8192'
+ - '16384'
+ - '32768'
+ synproxy_tcp_windowscale:
+ description:
+ - Determine TCP window scale option value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '0'
+ - '1'
+ - '2'
+ - '3'
+ - '4'
+ - '5'
+ - '6'
+ - '7'
+ - '8'
+ - '9'
+ - '10'
+ - '11'
+ - '12'
+ - '13'
+ - '14'
+ synproxy_tos:
+ description:
+ - Determine TCP differentiated services code point value (type of service).
+ type: str
+ choices:
+ - '0'
+ - '10'
+ - '12'
+ - '14'
+ - '18'
+ - '20'
+ - '22'
+ - '26'
+ - '28'
+ - '30'
+ - '34'
+ - '36'
+ - '38'
+ - '40'
+ - '46'
+ - '255'
+ synproxy_ttl:
+ description:
+ - Determine Time to live (TTL) value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '32'
+ - '64'
+ - '128'
+ - '255'
threshold:
description:
- Anomaly threshold. Number of detected instances (packets per second or concurrent session number) that triggers the anomaly
@@ -226,21 +312,28 @@ EXAMPLES = """
quarantine_expiry: "<your_own_value>"
quarantine_log: "disable"
status: "disable"
+ synproxy_tcp_mss: "0"
+ synproxy_tcp_sack: "enable"
+ synproxy_tcp_timestamp: "enable"
+ synproxy_tcp_window: "4096"
+ synproxy_tcp_windowscale: "0"
+ synproxy_tos: "0"
+ synproxy_ttl: "32"
threshold: "0"
threshold_default: "0"
comments: "<your_own_value>"
dstaddr:
-
- name: "default_name_15 (source firewall.address6.name firewall.addrgrp6.name)"
+ name: "default_name_22 (source firewall.address6.name firewall.addrgrp6.name)"
interface: "<your_own_value> (source system.zone.name system.interface.name)"
- name: "default_name_17"
+ name: "default_name_24"
policyid: "<you_own_value>"
service:
-
- name: "default_name_20 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_27 (source firewall.service.custom.name firewall.service.group.name)"
srcaddr:
-
- name: "default_name_22 (source firewall.address6.name firewall.addrgrp6.name)"
+ name: "default_name_29 (source firewall.address6.name firewall.addrgrp6.name)"
status: "enable"
"""
@@ -369,9 +462,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"threshold(default)": "threshold_default"}
+ speciallist = {"threshold(default)": "threshold_default"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -380,8 +473,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -397,10 +493,8 @@ def firewall_dos_policy6(data, fos, check_mode=False):
state = data["state"]
firewall_dos_policy6_data = data["firewall_dos_policy6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_dos_policy6_data(firewall_dos_policy6_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_firewall_dos_policy6_data(firewall_dos_policy6_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
@@ -592,6 +686,93 @@ versioned_schema = {
"options": [{"value": "disable"}, {"value": "enable"}],
},
"threshold": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "synproxy_ttl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "32"},
+ {"value": "64"},
+ {"value": "128"},
+ {"value": "255"},
+ ],
+ },
+ "synproxy_tos": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "10"},
+ {"value": "12"},
+ {"value": "14"},
+ {"value": "18"},
+ {"value": "20"},
+ {"value": "22"},
+ {"value": "26"},
+ {"value": "28"},
+ {"value": "30"},
+ {"value": "34"},
+ {"value": "36"},
+ {"value": "38"},
+ {"value": "40"},
+ {"value": "46"},
+ {"value": "255"},
+ ],
+ },
+ "synproxy_tcp_mss": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "256"},
+ {"value": "512"},
+ {"value": "1024"},
+ {"value": "1300"},
+ {"value": "1360"},
+ {"value": "1460"},
+ {"value": "1500"},
+ ],
+ },
+ "synproxy_tcp_sack": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "synproxy_tcp_timestamp": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "synproxy_tcp_window": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "4096"},
+ {"value": "8192"},
+ {"value": "16384"},
+ {"value": "32768"},
+ ],
+ },
+ "synproxy_tcp_windowscale": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "1"},
+ {"value": "2"},
+ {"value": "3"},
+ {"value": "4"},
+ {"value": "5"},
+ {"value": "6"},
+ {"value": "7"},
+ {"value": "8"},
+ {"value": "9"},
+ {"value": "10"},
+ {"value": "11"},
+ {"value": "12"},
+ {"value": "13"},
+ {"value": "14"},
+ ],
+ },
"threshold_default": {
"v_range": [["v6.0.0", "v7.0.5"], ["v7.2.0", "v7.2.0"]],
"type": "integer",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_global.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_global.py
index 6a501fe08..3d9ac4002 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_global.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_global.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -206,11 +206,10 @@ def underscore_to_hyphen(data):
def firewall_global(data, fos):
vdom = data["vdom"]
firewall_global_data = data["firewall_global"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_global_data(firewall_global_data)
- )
+ filtered_data = filter_firewall_global_data(firewall_global_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("firewall", "global", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "global", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_gtp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_gtp.py
index c435490c7..82a04ec7e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_gtp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_gtp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1811,10 +1811,11 @@ def firewall_gtp(data, fos):
firewall_gtp_data = data["firewall_gtp"]
firewall_gtp_data = flatten_multilists_attributes(firewall_gtp_data)
- filtered_data = underscore_to_hyphen(filter_firewall_gtp_data(firewall_gtp_data))
+ filtered_data = filter_firewall_gtp_data(firewall_gtp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("firewall", "gtp", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "gtp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "gtp", mkey=filtered_data["name"], vdom=vdom)
@@ -1855,262 +1856,266 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"comment": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"remove_if_echo_expires": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"remove_if_recovery_differ": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"send_delete_when_timeout": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"send_delete_when_timeout_v2": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"gtp_in_gtp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"unknown_version_action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"min_message_length": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"max_message_length": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"control_plane_message_rate_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"sub_second_sampling": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"rate_sampling_interval": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"sub_second_interval": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "0.5"}, {"value": "0.25"}, {"value": "0.1"}],
},
"echo_request_interval": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"user_plane_message_rate_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"tunnel_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"global_tunnel_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"tunnel_timeout": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"half_open_timeout": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"half_close_timeout": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"default_apn_action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"default_imsi_action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"default_policy_action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"default_ip_action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"default_noip_action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"apn_filter": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"imsi_filter": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"policy_filter": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"ie_remover": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"ip_filter": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"noip_filter": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"monitor_mode": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "enable"},
{"value": "disable"},
{
"value": "vdom",
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
],
},
"forwarded_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"denied_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"rate_limited_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"state_invalid_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"tunnel_limit_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"extension_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"traffic_count_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"log_freq": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"gtpu_forwarded_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"gtpu_denied_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"gtpu_log_freq": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"log_gtpu_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"log_imsi_prefix": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"log_msisdn_prefix": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"invalid_reserved_field": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"reserved_ie": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"miss_must_ie": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"out_of_state_message": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"out_of_state_ie": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"spoof_src_addr": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"handover_group": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"handover_group6": {
@@ -2118,11 +2123,12 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
"type": "string",
},
"authorized_sgsns": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"authorized_sgsns6": {
@@ -2130,11 +2136,12 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
"type": "string",
},
"invalid_sgsns_to_log": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"invalid_sgsns6_to_log": {
@@ -2142,11 +2149,12 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
"type": "string",
},
"authorized_ggsns": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"authorized_ggsns6": {
@@ -2154,6 +2162,7 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -2162,7 +2171,11 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
@@ -2171,43 +2184,71 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"required": True,
}
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
"action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"selection_mode": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [{"value": "ms"}, {"value": "net"}, {"value": "vrf"}],
"multiple_values": True,
"elements": "str",
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"imsi": {
"type": "list",
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
"mcc_mnc": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"msisdn_prefix": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"apnmember": {
@@ -2215,34 +2256,54 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"required": True,
}
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
"action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"selection_mode": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [{"value": "ms"}, {"value": "net"}, {"value": "vrf"}],
"multiple_values": True,
"elements": "str",
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"policy": {
"type": "list",
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
@@ -2251,15 +2312,27 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"required": True,
}
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
"messages": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [
{"value": "create-req"},
@@ -2271,14 +2344,22 @@ versioned_schema = {
"elements": "str",
},
"apn_sel_mode": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [{"value": "ms"}, {"value": "net"}, {"value": "vrf"}],
"multiple_values": True,
"elements": "str",
},
"max_apn_restriction": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [
{"value": "all"},
@@ -2289,15 +2370,27 @@ versioned_schema = {
],
},
"imsi_prefix": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"msisdn_prefix": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"rat_type": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [
{"value": "any"},
@@ -2308,48 +2401,80 @@ versioned_schema = {
{"value": "hspa"},
{
"value": "eutran",
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "virtual",
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "nbiot",
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
],
"multiple_values": True,
"elements": "str",
},
"imei": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"rai": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"uli": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"imsi": {"v_range": [["v6.0.0", "v6.0.11"]], "type": "string"},
"msisdn": {"v_range": [["v6.0.0", "v6.0.11"]], "type": "string"},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"policy_v2": {
"type": "list",
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
@@ -2358,15 +2483,27 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"required": True,
}
},
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
"messages": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [
{"value": "create-ses-req"},
@@ -2378,14 +2515,22 @@ versioned_schema = {
"elements": "str",
},
"apn_sel_mode": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [{"value": "ms"}, {"value": "net"}, {"value": "vrf"}],
"multiple_values": True,
"elements": "str",
},
"max_apn_restriction": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [
{"value": "all"},
@@ -2396,15 +2541,27 @@ versioned_schema = {
],
},
"imsi_prefix": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"msisdn_prefix": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"rat_type": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [
{"value": "any"},
@@ -2422,6 +2579,7 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
},
{
@@ -2430,6 +2588,7 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
},
],
@@ -2437,37 +2596,49 @@ versioned_schema = {
"elements": "str",
},
"mei": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"action": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"uli": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"multiple_values": True,
"elements": "str",
},
},
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"addr_notify": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"port_notify": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"interface_notify": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"context_id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"ie_remove_policy": {
@@ -2475,12 +2646,20 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
"sgsn_addr": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"sgsn_addr6": {
@@ -2488,11 +2667,16 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
"type": "string",
},
"remove_ies": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "list",
"options": [
{"value": "apn-restriction"},
@@ -2505,23 +2689,35 @@ versioned_schema = {
"elements": "str",
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"ip_policy": {
"type": "list",
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
"srcaddr": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"dstaddr": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"srcaddr6": {
@@ -2529,6 +2725,7 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -2537,408 +2734,741 @@ versioned_schema = {
["v6.4.0", "v6.4.0"],
["v6.4.4", "v7.0.8"],
["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
],
"type": "string",
},
"action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"noip_policy": {
"type": "list",
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
"type": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "etsi"}, {"value": "ietf"}],
},
"start": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"end": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"message_filter_v0v1": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"message_filter_v2": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"ie_allow_list_v0v1": {
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"ie_allow_list_v2": {
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"rat_timeout_profile": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"ie_validation": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"imsi": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"rai": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"reordering_required": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"ms_validated": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"selection_mode": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"nsapi": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"charging_ID": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"end_user_addr": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"mm_context": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"pdp_context": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"gsn_addr": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"msisdn": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"qos_profile": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"apn_restriction": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"rat_type": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"uli": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"ms_tzone": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"imei": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"charging_gateway_addr": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
},
},
"message_rate_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"echo_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"echo_reponse": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"version_not_support": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_pdp_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"update_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"update_pdp_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_pdp_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_aa_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_aa_pdp_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_aa_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_aa_pdp_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"error_indication": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"pdu_notify_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"pdu_notify_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"pdu_notify_rej_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"pdu_notify_rej_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"support_ext_hdr_notify": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"send_route_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"send_route_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"failure_report_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"failure_report_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"note_ms_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"note_ms_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"identification_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"identification_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"sgsn_context_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"sgsn_context_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"sgsn_context_ack": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"fwd_relocation_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"fwd_relocation_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"fwd_relocation_complete": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"relocation_cancel_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"relocation_cancel_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"fwd_srns_context": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"fwd_reloc_complete_ack": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"fwd_srns_context_ack": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"ran_info": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_notify_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_notify_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_notify_rej_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_notify_rej_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_mbms_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_mbms_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"update_mbms_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"update_mbms_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_mbms_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_mbms_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_reg_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_reg_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_de_reg_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_de_reg_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_ses_start_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_ses_start_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_ses_stop_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"mbms_ses_stop_response": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"g_pdu": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
},
},
"rate_limit_mode": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "per-profile"},
@@ -2947,59 +3477,95 @@ versioned_schema = {
],
},
"warning_threshold": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"message_rate_limit_v0": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"echo_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
},
},
"message_rate_limit_v1": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"echo_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_pdp_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
},
},
"message_rate_limit_v2": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"echo_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"create_session_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"delete_session_request": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
},
@@ -3009,29 +3575,45 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
"apn": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"version": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"rate_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"ie_white_list_v0v1": {"v_range": [["v6.0.0", "v6.4.4"]], "type": "string"},
"ie_white_list_v2": {"v_range": [["v6.0.0", "v6.4.4"]], "type": "string"},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_identity_based_route.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_identity_based_route.py
index cefe11ddf..398703665 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_identity_based_route.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_identity_based_route.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -268,9 +268,10 @@ def firewall_identity_based_route(data, fos, check_mode=False):
state = data["state"]
firewall_identity_based_route_data = data["firewall_identity_based_route"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_identity_based_route_data(firewall_identity_based_route_data)
+ filtered_data = filter_firewall_identity_based_route_data(
+ firewall_identity_based_route_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -337,7 +338,7 @@ def firewall_identity_based_route(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "identity-based-route", data=filtered_data, vdom=vdom
+ "firewall", "identity-based-route", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy.py
index 1147a73fa..d38612de3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -265,6 +265,10 @@ options:
choices:
- 'enable'
- 'disable'
+ uuid:
+ description:
+ - Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
+ type: str
webfilter_profile:
description:
- Web filter profile. Source webfilter.profile.name.
@@ -319,6 +323,7 @@ EXAMPLES = """
-
name: "default_name_32 (source firewall.address.name firewall.addrgrp.name)"
status: "enable"
+ uuid: "<your_own_value>"
webfilter_profile: "<your_own_value> (source webfilter.profile.name)"
webfilter_profile_status: "enable"
"""
@@ -441,6 +446,7 @@ def filter_firewall_interface_policy_data(json):
"spamfilter_profile_status",
"srcaddr",
"status",
+ "uuid",
"webfilter_profile",
"webfilter_profile_status",
]
@@ -474,9 +480,10 @@ def firewall_interface_policy(data, fos, check_mode=False):
state = data["state"]
firewall_interface_policy_data = data["firewall_interface_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_interface_policy_data(firewall_interface_policy_data)
+ filtered_data = filter_firewall_interface_policy_data(
+ firewall_interface_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -540,7 +547,7 @@ def firewall_interface_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "interface-policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "interface-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -586,6 +593,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"policyid": {"v_range": [["v6.0.0", ""]], "type": "integer", "required": True},
+ "uuid": {"v_range": [["v7.4.2", ""]], "type": "string"},
"status": {
"v_range": [["v6.0.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy6.py
index 28d381a3b..3f9d2c5d7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_interface_policy6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -265,6 +265,10 @@ options:
choices:
- 'enable'
- 'disable'
+ uuid:
+ description:
+ - Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
+ type: str
webfilter_profile:
description:
- Web filter profile. Source webfilter.profile.name.
@@ -319,6 +323,7 @@ EXAMPLES = """
-
name: "default_name_32 (source firewall.address6.name firewall.addrgrp6.name)"
status: "enable"
+ uuid: "<your_own_value>"
webfilter_profile: "<your_own_value> (source webfilter.profile.name)"
webfilter_profile_status: "enable"
"""
@@ -441,6 +446,7 @@ def filter_firewall_interface_policy6_data(json):
"spamfilter_profile_status",
"srcaddr6",
"status",
+ "uuid",
"webfilter_profile",
"webfilter_profile_status",
]
@@ -474,9 +480,10 @@ def firewall_interface_policy6(data, fos, check_mode=False):
state = data["state"]
firewall_interface_policy6_data = data["firewall_interface_policy6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_interface_policy6_data(firewall_interface_policy6_data)
+ filtered_data = filter_firewall_interface_policy6_data(
+ firewall_interface_policy6_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -540,7 +547,7 @@ def firewall_interface_policy6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "interface-policy6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "interface-policy6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -586,6 +593,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"policyid": {"v_range": [["v6.0.0", ""]], "type": "integer", "required": True},
+ "uuid": {"v_range": [["v7.4.2", ""]], "type": "string"},
"status": {
"v_range": [["v6.0.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service.py
index cd678ebdb..ef774e149 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -343,9 +343,10 @@ def firewall_internet_service(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_data = data["firewall_internet_service"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_data(firewall_internet_service_data)
+ filtered_data = filter_firewall_internet_service_data(
+ firewall_internet_service_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -409,7 +410,7 @@ def firewall_internet_service(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "internet-service", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "internet-service", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_addition.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_addition.py
index 0092a76ea..5330fde64 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_addition.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_addition.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -283,11 +283,10 @@ def firewall_internet_service_addition(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_addition_data = data["firewall_internet_service_addition"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_addition_data(
- firewall_internet_service_addition_data
- )
+ filtered_data = filter_firewall_internet_service_addition_data(
+ firewall_internet_service_addition_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -356,7 +355,7 @@ def firewall_internet_service_addition(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-addition", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-addition", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_append.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_append.py
index c85ed1763..6b713b941 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_append.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_append.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -216,13 +216,14 @@ def underscore_to_hyphen(data):
def firewall_internet_service_append(data, fos):
vdom = data["vdom"]
firewall_internet_service_append_data = data["firewall_internet_service_append"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_append_data(
- firewall_internet_service_append_data
- )
+ filtered_data = filter_firewall_internet_service_append_data(
+ firewall_internet_service_append_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("firewall", "internet-service-append", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "firewall", "internet-service-append", data=converted_data, vdom=vdom
+ )
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_botnet.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_botnet.py
index fc96218b1..121519bdf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_botnet.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_botnet.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,11 +232,10 @@ def firewall_internet_service_botnet(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_botnet_data = data["firewall_internet_service_botnet"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_botnet_data(
- firewall_internet_service_botnet_data
- )
+ filtered_data = filter_firewall_internet_service_botnet_data(
+ firewall_internet_service_botnet_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -305,7 +304,7 @@ def firewall_internet_service_botnet(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-botnet", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-botnet", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom.py
index a47519849..cdab87e2a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -376,11 +376,10 @@ def firewall_internet_service_custom(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_custom_data = data["firewall_internet_service_custom"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_custom_data(
- firewall_internet_service_custom_data
- )
+ filtered_data = filter_firewall_internet_service_custom_data(
+ firewall_internet_service_custom_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -449,7 +448,7 @@ def firewall_internet_service_custom(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-custom", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-custom", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom_group.py
index 7a647731b..9b2f42f53 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_custom_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,11 +246,10 @@ def firewall_internet_service_custom_group(data, fos, check_mode=False):
firewall_internet_service_custom_group_data = data[
"firewall_internet_service_custom_group"
]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_custom_group_data(
- firewall_internet_service_custom_group_data
- )
+ filtered_data = filter_firewall_internet_service_custom_group_data(
+ firewall_internet_service_custom_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -319,7 +318,7 @@ def firewall_internet_service_custom_group(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-custom-group", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-custom-group", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_definition.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_definition.py
index f85f08b7b..252317dac 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_definition.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_definition.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -282,11 +282,10 @@ def firewall_internet_service_definition(data, fos, check_mode=False):
firewall_internet_service_definition_data = data[
"firewall_internet_service_definition"
]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_definition_data(
- firewall_internet_service_definition_data
- )
+ filtered_data = filter_firewall_internet_service_definition_data(
+ firewall_internet_service_definition_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -355,7 +354,7 @@ def firewall_internet_service_definition(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-definition", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-definition", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_extension.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_extension.py
index c9c97ceed..7cff4eddc 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_extension.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_extension.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -414,11 +414,10 @@ def firewall_internet_service_extension(data, fos, check_mode=False):
firewall_internet_service_extension_data = data[
"firewall_internet_service_extension"
]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_extension_data(
- firewall_internet_service_extension_data
- )
+ filtered_data = filter_firewall_internet_service_extension_data(
+ firewall_internet_service_extension_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -487,7 +486,7 @@ def firewall_internet_service_extension(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-extension", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-extension", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_group.py
index a40dd9482..f64ff19b1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -258,11 +258,10 @@ def firewall_internet_service_group(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_group_data = data["firewall_internet_service_group"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_group_data(
- firewall_internet_service_group_data
- )
+ filtered_data = filter_firewall_internet_service_group_data(
+ firewall_internet_service_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -331,7 +330,7 @@ def firewall_internet_service_group(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-group", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-group", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_reason.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_reason.py
index 7999e8800..f527562b3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_reason.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_reason.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -234,11 +234,10 @@ def firewall_internet_service_ipbl_reason(data, fos, check_mode=False):
firewall_internet_service_ipbl_reason_data = data[
"firewall_internet_service_ipbl_reason"
]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_ipbl_reason_data(
- firewall_internet_service_ipbl_reason_data
- )
+ filtered_data = filter_firewall_internet_service_ipbl_reason_data(
+ firewall_internet_service_ipbl_reason_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -307,7 +306,7 @@ def firewall_internet_service_ipbl_reason(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-ipbl-reason", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-ipbl-reason", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_vendor.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_vendor.py
index 7047dc742..bcae3b08c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_vendor.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_ipbl_vendor.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -234,11 +234,10 @@ def firewall_internet_service_ipbl_vendor(data, fos, check_mode=False):
firewall_internet_service_ipbl_vendor_data = data[
"firewall_internet_service_ipbl_vendor"
]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_ipbl_vendor_data(
- firewall_internet_service_ipbl_vendor_data
- )
+ filtered_data = filter_firewall_internet_service_ipbl_vendor_data(
+ firewall_internet_service_ipbl_vendor_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -307,7 +306,7 @@ def firewall_internet_service_ipbl_vendor(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-ipbl-vendor", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-ipbl-vendor", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_list.py
index fc8df6e28..af3635bb5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_list.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,9 +232,10 @@ def firewall_internet_service_list(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_list_data = data["firewall_internet_service_list"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_list_data(firewall_internet_service_list_data)
+ filtered_data = filter_firewall_internet_service_list_data(
+ firewall_internet_service_list_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -303,7 +304,7 @@ def firewall_internet_service_list(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-list", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-list", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_name.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_name.py
index 7fe80c70f..e88111e0e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_name.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_name.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -260,9 +260,10 @@ def firewall_internet_service_name(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_name_data = data["firewall_internet_service_name"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_name_data(firewall_internet_service_name_data)
+ filtered_data = filter_firewall_internet_service_name_data(
+ firewall_internet_service_name_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -331,7 +332,7 @@ def firewall_internet_service_name(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-name", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-name", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_owner.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_owner.py
index 00c4a98c3..697fc13ff 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_owner.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_owner.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,11 +232,10 @@ def firewall_internet_service_owner(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_owner_data = data["firewall_internet_service_owner"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_owner_data(
- firewall_internet_service_owner_data
- )
+ filtered_data = filter_firewall_internet_service_owner_data(
+ firewall_internet_service_owner_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -305,7 +304,7 @@ def firewall_internet_service_owner(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-owner", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-owner", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_reputation.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_reputation.py
index 4f14c2ccb..66a112d0d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_reputation.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_reputation.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -234,11 +234,10 @@ def firewall_internet_service_reputation(data, fos, check_mode=False):
firewall_internet_service_reputation_data = data[
"firewall_internet_service_reputation"
]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_reputation_data(
- firewall_internet_service_reputation_data
- )
+ filtered_data = filter_firewall_internet_service_reputation_data(
+ firewall_internet_service_reputation_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -307,7 +306,7 @@ def firewall_internet_service_reputation(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-reputation", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-reputation", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_sld.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_sld.py
index 44fd072d7..342bd3821 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_sld.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_internet_service_sld.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,9 +232,10 @@ def firewall_internet_service_sld(data, fos, check_mode=False):
state = data["state"]
firewall_internet_service_sld_data = data["firewall_internet_service_sld"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_internet_service_sld_data(firewall_internet_service_sld_data)
+ filtered_data = filter_firewall_internet_service_sld_data(
+ firewall_internet_service_sld_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -301,7 +302,7 @@ def firewall_internet_service_sld(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "internet-service-sld", data=filtered_data, vdom=vdom
+ "firewall", "internet-service-sld", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ip_translation.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ip_translation.py
index d5a86f9c9..0f7ae5d03 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ip_translation.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ip_translation.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def firewall_ip_translation(data, fos, check_mode=False):
state = data["state"]
firewall_ip_translation_data = data["firewall_ip_translation"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ip_translation_data(firewall_ip_translation_data)
- )
+ filtered_data = filter_firewall_ip_translation_data(firewall_ip_translation_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def firewall_ip_translation(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "ip-translation", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ip-translation", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_setting.py
index 2a0a8254e..7b01e5c32 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -221,11 +221,12 @@ def underscore_to_hyphen(data):
def firewall_ipmacbinding_setting(data, fos):
vdom = data["vdom"]
firewall_ipmacbinding_setting_data = data["firewall_ipmacbinding_setting"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ipmacbinding_setting_data(firewall_ipmacbinding_setting_data)
+ filtered_data = filter_firewall_ipmacbinding_setting_data(
+ firewall_ipmacbinding_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("firewall.ipmacbinding", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.ipmacbinding", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_table.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_table.py
index 405168349..b14e2fc95 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_table.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipmacbinding_table.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -250,9 +250,10 @@ def firewall_ipmacbinding_table(data, fos, check_mode=False):
state = data["state"]
firewall_ipmacbinding_table_data = data["firewall_ipmacbinding_table"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ipmacbinding_table_data(firewall_ipmacbinding_table_data)
+ filtered_data = filter_firewall_ipmacbinding_table_data(
+ firewall_ipmacbinding_table_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -316,7 +317,7 @@ def firewall_ipmacbinding_table(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.ipmacbinding", "table", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.ipmacbinding", "table", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool.py
index 9c633222b..bec2ec72d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -182,7 +182,7 @@ options:
- 'enable'
type:
description:
- - IP pool type (overload, one-to-one, fixed port range, or port block allocation).
+ - 'IP pool type: overload, one-to-one, fixed-port-range, port-block-allocation, cgn-resource-allocation (hyperscale vdom only)'
type: str
choices:
- 'overload'
@@ -361,9 +361,8 @@ def firewall_ippool(data, fos, check_mode=False):
state = data["state"]
firewall_ippool_data = data["firewall_ippool"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ippool_data(firewall_ippool_data)
- )
+ filtered_data = filter_firewall_ippool_data(firewall_ippool_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -427,7 +426,7 @@ def firewall_ippool(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "ippool", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ippool", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "ippool", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool6.py
index 3ec84ca6d..f621717ec 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ippool6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -256,9 +256,8 @@ def firewall_ippool6(data, fos, check_mode=False):
state = data["state"]
firewall_ippool6_data = data["firewall_ippool6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ippool6_data(firewall_ippool6_data)
- )
+ filtered_data = filter_firewall_ippool6_data(firewall_ippool6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -322,7 +321,7 @@ def firewall_ippool6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "ippool6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ippool6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "ippool6", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_iprope_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_iprope_list.py
index 39dc763e9..d5769f6d4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_iprope_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_iprope_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<group_number>": "group_number"}
+ speciallist = {"<group_number>": "group_number"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def firewall_iprope_list(data, fos):
vdom = data["vdom"]
firewall_iprope_list_data = data["firewall_iprope_list"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_iprope_list_data(firewall_iprope_list_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_firewall_iprope_list_data(firewall_iprope_list_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("firewall.iprope", "list", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipv6_eh_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipv6_eh_filter.py
index 9ffaf05ad..bebbb16e9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipv6_eh_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ipv6_eh_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -299,11 +299,10 @@ def firewall_ipv6_eh_filter(data, fos):
firewall_ipv6_eh_filter_data = flatten_multilists_attributes(
firewall_ipv6_eh_filter_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_ipv6_eh_filter_data(firewall_ipv6_eh_filter_data)
- )
+ filtered_data = filter_firewall_ipv6_eh_filter_data(firewall_ipv6_eh_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("firewall", "ipv6-eh-filter", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ipv6-eh-filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ldb_monitor.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ldb_monitor.py
index 3b663fff1..379619245 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ldb_monitor.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ldb_monitor.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -309,9 +309,8 @@ def firewall_ldb_monitor(data, fos, check_mode=False):
state = data["state"]
firewall_ldb_monitor_data = data["firewall_ldb_monitor"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ldb_monitor_data(firewall_ldb_monitor_data)
- )
+ filtered_data = filter_firewall_ldb_monitor_data(firewall_ldb_monitor_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -375,7 +374,7 @@ def firewall_ldb_monitor(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "ldb-monitor", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ldb-monitor", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -430,7 +429,11 @@ versioned_schema = {
{"value": "dns", "v_range": [["v7.0.0", ""]]},
{
"value": "passive-sip",
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy.py
index 19732d4ab..ad3b80368 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -130,6 +130,17 @@ options:
description:
- Incoming interface name from available options. Source system.zone.name system.interface.name.
type: str
+ intf_dict:
+ description:
+ - Incoming interface name from available options. Use the parameter intf if the fortiOS firmware version <= 7.4.1
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Address name. Source system.zone.name system.interface.name.
+ required: true
+ type: str
policyid:
description:
- User defined local in policy ID. see <a href='#notes'>Notes</a>.
@@ -211,15 +222,18 @@ EXAMPLES = """
dstaddr_negate: "enable"
ha_mgmt_intf_only: "enable"
intf: "<your_own_value> (source system.zone.name system.interface.name)"
+ intf_dict:
+ -
+ name: "default_name_11 (source system.zone.name system.interface.name)"
policyid: "<you_own_value>"
schedule: "<your_own_value> (source firewall.schedule.onetime.name firewall.schedule.recurring.name firewall.schedule.group.name)"
service:
-
- name: "default_name_13 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_15 (source firewall.service.custom.name firewall.service.group.name)"
service_negate: "enable"
srcaddr:
-
- name: "default_name_16 (source firewall.address.name firewall.addrgrp.name system.external-resource.name)"
+ name: "default_name_18 (source firewall.address.name firewall.addrgrp.name system.external-resource.name)"
srcaddr_negate: "enable"
status: "enable"
uuid: "<your_own_value>"
@@ -322,6 +336,7 @@ def filter_firewall_local_in_policy_data(json):
"dstaddr_negate",
"ha_mgmt_intf_only",
"intf",
+ "intf_dict",
"policyid",
"schedule",
"service",
@@ -356,15 +371,39 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"intf-dict": "intf"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def firewall_local_in_policy(data, fos, check_mode=False):
vdom = data["vdom"]
state = data["state"]
firewall_local_in_policy_data = data["firewall_local_in_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_local_in_policy_data(firewall_local_in_policy_data)
- )
+ filtered_data = filter_firewall_local_in_policy_data(firewall_local_in_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
# check_mode starts from here
if check_mode:
@@ -428,7 +467,7 @@ def firewall_local_in_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "local-in-policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "local-in-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -480,7 +519,18 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "intf": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "intf_dict": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"srcaddr": {
"type": "list",
"elements": "dict",
@@ -549,6 +599,7 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"comments": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "intf": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy6.py
index 166a3a11f..23b0b56b6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_local_in_policy6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -123,6 +123,17 @@ options:
description:
- Incoming interface name from available options. Source system.zone.name system.interface.name.
type: str
+ intf_dict:
+ description:
+ - Incoming interface name from available options. Use the parameter intf if the fortiOS firmware version <= 7.4.1
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Address name. Source system.zone.name system.interface.name.
+ required: true
+ type: str
policyid:
description:
- User defined local in policy ID. see <a href='#notes'>Notes</a>.
@@ -203,15 +214,18 @@ EXAMPLES = """
name: "default_name_6 (source firewall.address6.name firewall.addrgrp6.name system.external-resource.name)"
dstaddr_negate: "enable"
intf: "<your_own_value> (source system.zone.name system.interface.name)"
+ intf_dict:
+ -
+ name: "default_name_10 (source system.zone.name system.interface.name)"
policyid: "<you_own_value>"
schedule: "<your_own_value> (source firewall.schedule.onetime.name firewall.schedule.recurring.name firewall.schedule.group.name)"
service:
-
- name: "default_name_12 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_14 (source firewall.service.custom.name firewall.service.group.name)"
service_negate: "enable"
srcaddr:
-
- name: "default_name_15 (source firewall.address6.name firewall.addrgrp6.name system.external-resource.name)"
+ name: "default_name_17 (source firewall.address6.name firewall.addrgrp6.name system.external-resource.name)"
srcaddr_negate: "enable"
status: "enable"
uuid: "<your_own_value>"
@@ -313,6 +327,7 @@ def filter_firewall_local_in_policy6_data(json):
"dstaddr",
"dstaddr_negate",
"intf",
+ "intf_dict",
"policyid",
"schedule",
"service",
@@ -347,15 +362,41 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"intf-dict": "intf"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def firewall_local_in_policy6(data, fos, check_mode=False):
vdom = data["vdom"]
state = data["state"]
firewall_local_in_policy6_data = data["firewall_local_in_policy6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_local_in_policy6_data(firewall_local_in_policy6_data)
+ filtered_data = filter_firewall_local_in_policy6_data(
+ firewall_local_in_policy6_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
# check_mode starts from here
if check_mode:
@@ -419,7 +460,7 @@ def firewall_local_in_policy6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "local-in-policy6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "local-in-policy6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -466,7 +507,18 @@ versioned_schema = {
"children": {
"policyid": {"v_range": [["v6.0.0", ""]], "type": "integer", "required": True},
"uuid": {"v_range": [["v6.4.0", ""]], "type": "string"},
- "intf": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "intf_dict": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"srcaddr": {
"type": "list",
"elements": "dict",
@@ -535,6 +587,7 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"comments": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "intf": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_mms_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_mms_profile.py
index a69ad1e3e..3ef9d6377 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_mms_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_mms_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1230,12 +1230,11 @@ def firewall_mms_profile(data, fos):
firewall_mms_profile_data = data["firewall_mms_profile"]
firewall_mms_profile_data = flatten_multilists_attributes(firewall_mms_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_firewall_mms_profile_data(firewall_mms_profile_data)
- )
+ filtered_data = filter_firewall_mms_profile_data(firewall_mms_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("firewall", "mms-profile", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "mms-profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address.py
index a001b0e73..41d9b45df 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -316,9 +316,10 @@ def firewall_multicast_address(data, fos, check_mode=False):
state = data["state"]
firewall_multicast_address_data = data["firewall_multicast_address"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_multicast_address_data(firewall_multicast_address_data)
+ filtered_data = filter_firewall_multicast_address_data(
+ firewall_multicast_address_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -382,7 +383,7 @@ def firewall_multicast_address(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "multicast-address", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "multicast-address", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address6.py
index 4c57af20c..ef3a925b2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_address6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -281,9 +281,10 @@ def firewall_multicast_address6(data, fos, check_mode=False):
state = data["state"]
firewall_multicast_address6_data = data["firewall_multicast_address6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_multicast_address6_data(firewall_multicast_address6_data)
+ filtered_data = filter_firewall_multicast_address6_data(
+ firewall_multicast_address6_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -347,7 +348,7 @@ def firewall_multicast_address6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "multicast-address6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "multicast-address6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy.py
index 2d4fade7c..7c3e4efaf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -136,13 +136,19 @@ options:
- Policy ID ((0 - 4294967294). see <a href='#notes'>Notes</a>.
required: true
type: int
+ ips_sensor:
+ description:
+ - Name of an existing IPS sensor. Source ips.sensor.name.
+ type: str
logtraffic:
description:
- - Enable/disable logging traffic accepted by this policy.
+ - Enable or disable logging. Log all sessions or security profile sessions.
type: str
choices:
- - 'enable'
+ - 'all'
+ - 'utm'
- 'disable'
+ - 'enable'
name:
description:
- Policy name.
@@ -192,6 +198,13 @@ options:
description:
- Traffic shaper to apply to traffic forwarded by the multicast policy. Source firewall.shaper.traffic-shaper.name.
type: str
+ utm_status:
+ description:
+ - Enable to add an IPS security profile to the policy.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
uuid:
description:
- Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
@@ -215,18 +228,20 @@ EXAMPLES = """
dstintf: "<your_own_value> (source system.interface.name system.zone.name)"
end_port: "65535"
id: "11"
- logtraffic: "enable"
- name: "default_name_13"
+ ips_sensor: "<your_own_value> (source ips.sensor.name)"
+ logtraffic: "all"
+ name: "default_name_14"
protocol: "0"
snat: "enable"
snat_ip: "<your_own_value>"
srcaddr:
-
- name: "default_name_18 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_19 (source firewall.address.name firewall.addrgrp.name)"
srcintf: "<your_own_value> (source system.interface.name system.zone.name)"
start_port: "1"
status: "enable"
traffic_shaper: "<your_own_value> (source firewall.shaper.traffic-shaper.name)"
+ utm_status: "enable"
uuid: "<your_own_value>"
"""
@@ -328,6 +343,7 @@ def filter_firewall_multicast_policy_data(json):
"dstintf",
"end_port",
"id",
+ "ips_sensor",
"logtraffic",
"name",
"protocol",
@@ -338,6 +354,7 @@ def filter_firewall_multicast_policy_data(json):
"start_port",
"status",
"traffic_shaper",
+ "utm_status",
"uuid",
]
@@ -370,9 +387,10 @@ def firewall_multicast_policy(data, fos, check_mode=False):
state = data["state"]
firewall_multicast_policy_data = data["firewall_multicast_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_multicast_policy_data(firewall_multicast_policy_data)
+ filtered_data = filter_firewall_multicast_policy_data(
+ firewall_multicast_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -436,7 +454,7 @@ def firewall_multicast_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "multicast-policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "multicast-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -490,11 +508,6 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "logtraffic": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
"srcintf": {"v_range": [["v6.0.0", ""]], "type": "string"},
"dstintf": {"v_range": [["v6.0.0", ""]], "type": "string"},
"srcaddr": {
@@ -536,6 +549,22 @@ versioned_schema = {
"protocol": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"start_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"end_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "utm_status": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "ips_sensor": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "logtraffic": {
+ "v_range": [["v6.0.0", ""]],
+ "type": "string",
+ "options": [
+ {"value": "all", "v_range": [["v7.4.2", ""]]},
+ {"value": "utm", "v_range": [["v7.4.2", ""]]},
+ {"value": "disable"},
+ {"value": "enable", "v_range": [["v6.0.0", "v7.4.1"]]},
+ ],
+ },
"auto_asic_offload": {
"v_range": [["v6.0.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy6.py
index a1479f852..ed36a9f2a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_multicast_policy6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -132,13 +132,19 @@ options:
- Policy ID (0 - 4294967294). see <a href='#notes'>Notes</a>.
required: true
type: int
+ ips_sensor:
+ description:
+ - Name of an existing IPS sensor. Source ips.sensor.name.
+ type: str
logtraffic:
description:
- - Enable/disable logging traffic accepted by this policy.
+ - Enable or disable logging. Log all sessions or security profile sessions.
type: str
choices:
- - 'enable'
+ - 'all'
+ - 'utm'
- 'disable'
+ - 'enable'
name:
description:
- Policy name.
@@ -173,6 +179,13 @@ options:
choices:
- 'enable'
- 'disable'
+ utm_status:
+ description:
+ - Enable to add an IPS security profile to the policy.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
uuid:
description:
- Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
@@ -195,15 +208,17 @@ EXAMPLES = """
dstintf: "<your_own_value> (source system.interface.name system.zone.name)"
end_port: "65535"
id: "10"
- logtraffic: "enable"
- name: "default_name_12"
+ ips_sensor: "<your_own_value> (source ips.sensor.name)"
+ logtraffic: "all"
+ name: "default_name_13"
protocol: "0"
srcaddr:
-
- name: "default_name_15 (source firewall.address6.name firewall.addrgrp6.name)"
+ name: "default_name_16 (source firewall.address6.name firewall.addrgrp6.name)"
srcintf: "<your_own_value> (source system.interface.name system.zone.name)"
start_port: "1"
status: "enable"
+ utm_status: "enable"
uuid: "<your_own_value>"
"""
@@ -304,6 +319,7 @@ def filter_firewall_multicast_policy6_data(json):
"dstintf",
"end_port",
"id",
+ "ips_sensor",
"logtraffic",
"name",
"protocol",
@@ -311,6 +327,7 @@ def filter_firewall_multicast_policy6_data(json):
"srcintf",
"start_port",
"status",
+ "utm_status",
"uuid",
]
@@ -343,9 +360,10 @@ def firewall_multicast_policy6(data, fos, check_mode=False):
state = data["state"]
firewall_multicast_policy6_data = data["firewall_multicast_policy6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_multicast_policy6_data(firewall_multicast_policy6_data)
+ filtered_data = filter_firewall_multicast_policy6_data(
+ firewall_multicast_policy6_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -409,7 +427,7 @@ def firewall_multicast_policy6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "multicast-policy6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "multicast-policy6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -462,11 +480,6 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"name": {"v_range": [["v6.4.0", "v6.4.0"], ["v6.4.4", ""]], "type": "string"},
- "logtraffic": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
"srcintf": {"v_range": [["v6.0.0", ""]], "type": "string"},
"dstintf": {"v_range": [["v6.0.0", ""]], "type": "string"},
"srcaddr": {
@@ -501,6 +514,22 @@ versioned_schema = {
"protocol": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"start_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"end_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "utm_status": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "ips_sensor": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "logtraffic": {
+ "v_range": [["v6.0.0", ""]],
+ "type": "string",
+ "options": [
+ {"value": "all", "v_range": [["v7.4.2", ""]]},
+ {"value": "utm", "v_range": [["v7.4.2", ""]]},
+ {"value": "disable"},
+ {"value": "enable", "v_range": [["v6.0.0", "v7.4.1"]]},
+ ],
+ },
"auto_asic_offload": {
"v_range": [["v6.0.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_network_service_dynamic.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_network_service_dynamic.py
index 57157cf69..1ed2b19ed 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_network_service_dynamic.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_network_service_dynamic.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -231,15 +231,14 @@ def firewall_network_service_dynamic(data, fos):
state = data["state"]
firewall_network_service_dynamic_data = data["firewall_network_service_dynamic"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_network_service_dynamic_data(
- firewall_network_service_dynamic_data
- )
+ filtered_data = filter_firewall_network_service_dynamic_data(
+ firewall_network_service_dynamic_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "firewall", "network-service-dynamic", data=filtered_data, vdom=vdom
+ "firewall", "network-service-dynamic", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_pfcp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_pfcp.py
index f8f14258f..a7dc22a02 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_pfcp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_pfcp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -303,10 +303,11 @@ def firewall_pfcp(data, fos):
state = data["state"]
firewall_pfcp_data = data["firewall_pfcp"]
- filtered_data = underscore_to_hyphen(filter_firewall_pfcp_data(firewall_pfcp_data))
+ filtered_data = filter_firewall_pfcp_data(firewall_pfcp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("firewall", "pfcp", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "pfcp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "pfcp", mkey=filtered_data["name"], vdom=vdom)
@@ -347,62 +348,62 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"min_message_length": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"max_message_length": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"monitor_mode": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}, {"value": "vdom"}],
},
"message_filter": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"pfcp_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"unknown_version": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"invalid_reserved_field": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"forwarded_log": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"denied_log": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"traffic_count_log": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"log_freq": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
},
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy.py
index 422220b53..3799f92cf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy.py
@@ -42,7 +42,7 @@ notes:
- Only one of [after, before] must be specified when action is moving an object.
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,6 +254,10 @@ options:
- Device or group name. Source user.device.alias user.device-group.name user.device-category.name.
required: true
type: str
+ diameter_filter_profile:
+ description:
+ - Name of an existing Diameter filter profile. Source diameter-filter.profile.name.
+ type: str
diffserv_copy:
description:
- Enable to copy packet"s DiffServ values from session"s original direction to its reply direction.
@@ -1548,6 +1552,7 @@ EXAMPLES = """
devices:
-
name: "default_name_28 (source user.device.alias user.device-group.name user.device-category.name)"
+ diameter_filter_profile: "<your_own_value> (source diameter-filter.profile.name)"
diffserv_copy: "enable"
diffserv_forward: "enable"
diffserv_reverse: "enable"
@@ -1563,17 +1568,17 @@ EXAMPLES = """
dsri: "enable"
dstaddr:
-
- name: "default_name_43 (source firewall.address.name firewall.addrgrp.name firewall.vip.name firewall.vipgrp.name system.external-resource
+ name: "default_name_44 (source firewall.address.name firewall.addrgrp.name firewall.vip.name firewall.vipgrp.name system.external-resource
.name)"
dstaddr_negate: "enable"
dstaddr6:
-
- name: "default_name_46 (source firewall.address6.name firewall.vipgrp6.name firewall.vip6.name system.external-resource.name firewall
+ name: "default_name_47 (source firewall.address6.name firewall.vipgrp6.name firewall.vip6.name system.external-resource.name firewall
.addrgrp6.name)"
dstaddr6_negate: "enable"
dstintf:
-
- name: "default_name_49 (source system.interface.name system.zone.name system.sdwan.zone.name)"
+ name: "default_name_50 (source system.interface.name system.zone.name system.sdwan.zone.name)"
dynamic_shaping: "enable"
email_collect: "enable"
emailfilter_profile: "<your_own_value> (source emailfilter.profile.name)"
@@ -1585,13 +1590,13 @@ EXAMPLES = """
fsso_agent_for_ntlm: "<your_own_value> (source user.fsso.name)"
fsso_groups:
-
- name: "default_name_60 (source user.adgrp.name)"
+ name: "default_name_61 (source user.adgrp.name)"
geoip_anycast: "enable"
geoip_match: "physical-location"
global_label: "<your_own_value>"
groups:
-
- name: "default_name_65 (source user.group.name)"
+ name: "default_name_66 (source user.group.name)"
gtp_profile: "<your_own_value> (source firewall.gtp.name)"
http_policy_redirect: "enable"
icap_profile: "<your_own_value> (source icap.profile.name)"
@@ -1601,64 +1606,64 @@ EXAMPLES = """
internet_service: "enable"
internet_service_custom:
-
- name: "default_name_74 (source firewall.internet-service-custom.name)"
+ name: "default_name_75 (source firewall.internet-service-custom.name)"
internet_service_custom_group:
-
- name: "default_name_76 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_77 (source firewall.internet-service-custom-group.name)"
internet_service_group:
-
- name: "default_name_78 (source firewall.internet-service-group.name)"
+ name: "default_name_79 (source firewall.internet-service-group.name)"
internet_service_id:
-
- id: "80 (source firewall.internet-service.id)"
+ id: "81 (source firewall.internet-service.id)"
internet_service_name:
-
- name: "default_name_82 (source firewall.internet-service-name.name)"
+ name: "default_name_83 (source firewall.internet-service-name.name)"
internet_service_negate: "enable"
internet_service_src: "enable"
internet_service_src_custom:
-
- name: "default_name_86 (source firewall.internet-service-custom.name)"
+ name: "default_name_87 (source firewall.internet-service-custom.name)"
internet_service_src_custom_group:
-
- name: "default_name_88 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_89 (source firewall.internet-service-custom-group.name)"
internet_service_src_group:
-
- name: "default_name_90 (source firewall.internet-service-group.name)"
+ name: "default_name_91 (source firewall.internet-service-group.name)"
internet_service_src_id:
-
- id: "92 (source firewall.internet-service.id)"
+ id: "93 (source firewall.internet-service.id)"
internet_service_src_name:
-
- name: "default_name_94 (source firewall.internet-service-name.name)"
+ name: "default_name_95 (source firewall.internet-service-name.name)"
internet_service_src_negate: "enable"
internet_service6: "enable"
internet_service6_custom:
-
- name: "default_name_98 (source firewall.internet-service-custom.name)"
+ name: "default_name_99 (source firewall.internet-service-custom.name)"
internet_service6_custom_group:
-
- name: "default_name_100 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_101 (source firewall.internet-service-custom-group.name)"
internet_service6_group:
-
- name: "default_name_102 (source firewall.internet-service-group.name)"
+ name: "default_name_103 (source firewall.internet-service-group.name)"
internet_service6_name:
-
- name: "default_name_104 (source firewall.internet-service-name.name)"
+ name: "default_name_105 (source firewall.internet-service-name.name)"
internet_service6_negate: "enable"
internet_service6_src: "enable"
internet_service6_src_custom:
-
- name: "default_name_108 (source firewall.internet-service-custom.name)"
+ name: "default_name_109 (source firewall.internet-service-custom.name)"
internet_service6_src_custom_group:
-
- name: "default_name_110 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_111 (source firewall.internet-service-custom-group.name)"
internet_service6_src_group:
-
- name: "default_name_112 (source firewall.internet-service-group.name)"
+ name: "default_name_113 (source firewall.internet-service-group.name)"
internet_service6_src_name:
-
- name: "default_name_114 (source firewall.internet-service-name.name)"
+ name: "default_name_115 (source firewall.internet-service-name.name)"
internet_service6_src_negate: "enable"
ippool: "enable"
ips_sensor: "<your_own_value> (source ips.sensor.name)"
@@ -1670,7 +1675,7 @@ EXAMPLES = """
match_vip: "enable"
match_vip_only: "enable"
mms_profile: "<your_own_value> (source firewall.mms-profile.name)"
- name: "default_name_126"
+ name: "default_name_127"
nat: "enable"
nat46: "enable"
nat64: "enable"
@@ -1679,10 +1684,10 @@ EXAMPLES = """
natoutbound: "enable"
network_service_dynamic:
-
- name: "default_name_134 (source firewall.network-service-dynamic.name)"
+ name: "default_name_135 (source firewall.network-service-dynamic.name)"
network_service_src_dynamic:
-
- name: "default_name_136 (source firewall.network-service-dynamic.name)"
+ name: "default_name_137 (source firewall.network-service-dynamic.name)"
np_acceleration: "enable"
ntlm: "enable"
ntlm_enabled_browsers:
@@ -1695,7 +1700,7 @@ EXAMPLES = """
pcp_outbound: "enable"
pcp_poolname:
-
- name: "default_name_147 (source system.pcp-server.pools.name)"
+ name: "default_name_148 (source system.pcp-server.pools.name)"
per_ip_shaper: "<your_own_value> (source firewall.shaper.per-ip-shaper.name)"
permit_any_host: "enable"
permit_stun_host: "enable"
@@ -1706,10 +1711,10 @@ EXAMPLES = """
policyid: "<you_own_value>"
poolname:
-
- name: "default_name_157 (source firewall.ippool.name)"
+ name: "default_name_158 (source firewall.ippool.name)"
poolname6:
-
- name: "default_name_159 (source firewall.ippool6.name)"
+ name: "default_name_160 (source firewall.ippool6.name)"
profile_group: "<your_own_value> (source firewall.profile-group.name)"
profile_protocol_options: "<your_own_value> (source firewall.profile-protocol-options.name)"
profile_type: "single"
@@ -1723,7 +1728,7 @@ EXAMPLES = """
rsso: "enable"
rtp_addr:
-
- name: "default_name_172 (source firewall.internet-service-custom-group.name firewall.addrgrp.name)"
+ name: "default_name_173 (source firewall.internet-service-custom-group.name firewall.addrgrp.name)"
rtp_nat: "disable"
scan_botnet_connections: "disable"
schedule: "<your_own_value> (source firewall.schedule.onetime.name firewall.schedule.recurring.name firewall.schedule.group.name)"
@@ -1732,34 +1737,34 @@ EXAMPLES = """
send_deny_packet: "disable"
service:
-
- name: "default_name_180 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_181 (source firewall.service.custom.name firewall.service.group.name)"
service_negate: "enable"
session_ttl: "<your_own_value>"
sgt:
-
- id: "184"
+ id: "185"
sgt_check: "enable"
spamfilter_profile: "<your_own_value> (source spamfilter.profile.name)"
src_vendor_mac:
-
- id: "188 (source firewall.vendor-mac.id)"
+ id: "189 (source firewall.vendor-mac.id)"
srcaddr:
-
- name: "default_name_190 (source firewall.address.name firewall.addrgrp.name system.external-resource.name)"
+ name: "default_name_191 (source firewall.address.name firewall.addrgrp.name system.external-resource.name)"
srcaddr_negate: "enable"
srcaddr6:
-
- name: "default_name_193 (source firewall.address6.name system.external-resource.name firewall.addrgrp6.name)"
+ name: "default_name_194 (source firewall.address6.name system.external-resource.name firewall.addrgrp6.name)"
srcaddr6_negate: "enable"
srcintf:
-
- name: "default_name_196 (source system.interface.name system.zone.name system.sdwan.zone.name)"
+ name: "default_name_197 (source system.interface.name system.zone.name system.sdwan.zone.name)"
ssh_filter_profile: "<your_own_value> (source ssh-filter.profile.name)"
ssh_policy_redirect: "enable"
ssl_mirror: "enable"
ssl_mirror_intf:
-
- name: "default_name_201 (source system.interface.name system.zone.name)"
+ name: "default_name_202 (source system.interface.name system.zone.name)"
ssl_ssh_profile: "<your_own_value> (source firewall.ssl-ssh-profile.name)"
status: "enable"
tcp_mss_receiver: "0"
@@ -1773,10 +1778,10 @@ EXAMPLES = """
traffic_shaper_reverse: "<your_own_value> (source firewall.shaper.traffic-shaper.name)"
url_category:
-
- id: "214"
+ id: "215"
users:
-
- name: "default_name_216 (source user.local.name user.certificate.name)"
+ name: "default_name_217 (source user.local.name user.certificate.name)"
utm_status: "enable"
uuid: "<your_own_value>"
videofilter_profile: "<your_own_value> (source videofilter.profile.name)"
@@ -1802,13 +1807,13 @@ EXAMPLES = """
ztna_device_ownership: "enable"
ztna_ems_tag:
-
- name: "default_name_241 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_242 (source firewall.address.name firewall.addrgrp.name)"
ztna_ems_tag_secondary:
-
- name: "default_name_243 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_244 (source firewall.address.name firewall.addrgrp.name)"
ztna_geo_tag:
-
- name: "default_name_245 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_246 (source firewall.address.name firewall.addrgrp.name)"
ztna_policy_redirect: "enable"
ztna_status: "enable"
ztna_tags_match_logic: "or"
@@ -1925,6 +1930,7 @@ def filter_firewall_policy_data(json):
"decrypted_traffic_mirror",
"delay_tcp_npu_session",
"devices",
+ "diameter_filter_profile",
"diffserv_copy",
"diffserv_forward",
"diffserv_reverse",
@@ -2134,9 +2140,8 @@ def firewall_policy(data, fos, check_mode=False):
state = data["state"]
firewall_policy_data = data["firewall_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_policy_data(firewall_policy_data)
- )
+ filtered_data = filter_firewall_policy_data(firewall_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -2200,7 +2205,7 @@ def firewall_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -2804,6 +2809,7 @@ versioned_schema = {
"voip_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"ips_voip_filter": {"v_range": [["v7.4.0", ""]], "type": "string"},
"sctp_filter_profile": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "diameter_filter_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
"virtual_patch_profile": {"v_range": [["v7.4.1", ""]], "type": "string"},
"icap_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"cifs_profile": {"v_range": [["v6.2.0", ""]], "type": "string"},
@@ -2822,9 +2828,12 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"capture_packet": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"auto_asic_offload": {
"v_range": [["v6.0.0", ""]],
@@ -2832,35 +2841,54 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"wanopt": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"wanopt_detection": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "active"}, {"value": "passive"}, {"value": "off"}],
+ "options": [
+ {"value": "active", "v_range": [["v6.0.0", ""]]},
+ {"value": "passive", "v_range": [["v6.0.0", ""]]},
+ {"value": "off", "v_range": [["v6.0.0", ""]]},
+ ],
},
"wanopt_passive_opt": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
- {"value": "default"},
- {"value": "transparent"},
- {"value": "non-transparent"},
+ {"value": "default", "v_range": [["v6.0.0", ""]]},
+ {"value": "transparent", "v_range": [["v6.0.0", ""]]},
+ {"value": "non-transparent", "v_range": [["v6.0.0", ""]]},
],
},
- "wanopt_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "wanopt_peer": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "wanopt_profile": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "string",
+ },
+ "wanopt_peer": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "string",
+ },
"webcache": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"webcache_https": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
+ "options": [
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"webproxy_forward_server": {"v_range": [["v6.2.0", ""]], "type": "string"},
"traffic_shaper": {"v_range": [["v6.0.0", ""]], "type": "string"},
@@ -3189,11 +3217,11 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"gtp_profile": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"pfcp_profile": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
"dlp_sensor": {"v_range": [["v6.0.0", "v7.0.12"]], "type": "string"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy46.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy46.py
index 04f22584b..ffaf31461 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy46.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy46.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -418,9 +418,8 @@ def firewall_policy46(data, fos, check_mode=False):
state = data["state"]
firewall_policy46_data = data["firewall_policy46"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_policy46_data(firewall_policy46_data)
- )
+ filtered_data = filter_firewall_policy46_data(firewall_policy46_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -484,7 +483,7 @@ def firewall_policy46(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "policy46", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "policy46", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy6.py
index 08ae67bd0..ac4953429 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1044,9 +1044,8 @@ def firewall_policy6(data, fos, check_mode=False):
state = data["state"]
firewall_policy6_data = data["firewall_policy6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_policy6_data(firewall_policy6_data)
- )
+ filtered_data = filter_firewall_policy6_data(firewall_policy6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1110,7 +1109,7 @@ def firewall_policy6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "policy6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "policy6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy64.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy64.py
index e69dd28ab..f68b1986a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy64.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_policy64.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -418,9 +418,8 @@ def firewall_policy64(data, fos, check_mode=False):
state = data["state"]
firewall_policy64_data = data["firewall_policy64"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_policy64_data(firewall_policy64_data)
- )
+ filtered_data = filter_firewall_policy64_data(firewall_policy64_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -484,7 +483,7 @@ def firewall_policy64(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "policy64", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "policy64", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_group.py
index b6c77b5d5..c7c954e1b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -104,6 +104,10 @@ options:
description:
- Name of an existing CIFS profile. Source cifs.profile.name.
type: str
+ diameter_filter_profile:
+ description:
+ - Name of an existing Diameter filter profile. Source diameter-filter.profile.name.
+ type: str
dlp_profile:
description:
- Name of an existing DLP profile. Source dlp.profile.name.
@@ -198,6 +202,7 @@ EXAMPLES = """
av_profile: "<your_own_value> (source antivirus.profile.name)"
casb_profile: "<your_own_value> (source casb.profile.name)"
cifs_profile: "<your_own_value> (source cifs.profile.name)"
+ diameter_filter_profile: "<your_own_value> (source diameter-filter.profile.name)"
dlp_profile: "<your_own_value> (source dlp.profile.name)"
dlp_sensor: "<your_own_value> (source dlp.sensor.name)"
dnsfilter_profile: "<your_own_value> (source dnsfilter.profile.name)"
@@ -207,7 +212,7 @@ EXAMPLES = """
ips_sensor: "<your_own_value> (source ips.sensor.name)"
ips_voip_filter: "<your_own_value> (source voip.profile.name)"
mms_profile: "<your_own_value> (source firewall.mms-profile.name)"
- name: "default_name_16"
+ name: "default_name_17"
profile_protocol_options: "<your_own_value> (source firewall.profile-protocol-options.name)"
sctp_filter_profile: "<your_own_value> (source sctp-filter.profile.name)"
spamfilter_profile: "<your_own_value> (source spamfilter.profile.name)"
@@ -314,6 +319,7 @@ def filter_firewall_profile_group_data(json):
"av_profile",
"casb_profile",
"cifs_profile",
+ "diameter_filter_profile",
"dlp_profile",
"dlp_sensor",
"dnsfilter_profile",
@@ -365,9 +371,8 @@ def firewall_profile_group(data, fos, check_mode=False):
state = data["state"]
firewall_profile_group_data = data["firewall_profile_group"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_profile_group_data(firewall_profile_group_data)
- )
+ filtered_data = filter_firewall_profile_group_data(firewall_profile_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -431,7 +436,7 @@ def firewall_profile_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "profile-group", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "profile-group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -488,6 +493,7 @@ versioned_schema = {
"voip_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"ips_voip_filter": {"v_range": [["v7.4.0", ""]], "type": "string"},
"sctp_filter_profile": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "diameter_filter_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
"virtual_patch_profile": {"v_range": [["v7.4.1", ""]], "type": "string"},
"icap_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"cifs_profile": {"v_range": [["v6.2.0", ""]], "type": "string"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_protocol_options.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_protocol_options.py
index d6651d190..cd903dcda 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_protocol_options.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_profile_protocol_options.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -177,7 +177,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
comment:
description:
@@ -300,7 +300,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
http:
description:
@@ -504,7 +504,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
unknown_content_encoding:
description:
@@ -592,7 +592,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
mail_signature:
description:
@@ -652,7 +652,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
name:
description:
@@ -715,7 +715,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
oversize_log:
description:
@@ -787,7 +787,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
replacemsg_group:
description:
@@ -871,7 +871,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
ssh:
description:
@@ -945,7 +945,7 @@ options:
type: int
uncompressed_oversize_limit:
description:
- - Maximum in-memory uncompressed file size that can be scanned.
+ - Maximum in-memory uncompressed file size that can be scanned (MB).
type: int
switching_protocols_log:
description:
@@ -1301,11 +1301,10 @@ def firewall_profile_protocol_options(data, fos, check_mode=False):
firewall_profile_protocol_options_data = flatten_multilists_attributes(
firewall_profile_protocol_options_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_profile_protocol_options_data(
- firewall_profile_protocol_options_data
- )
+ filtered_data = filter_firewall_profile_protocol_options_data(
+ firewall_profile_protocol_options_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1374,7 +1373,7 @@ def firewall_profile_protocol_options(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall", "profile-protocol-options", data=filtered_data, vdom=vdom
+ "firewall", "profile-protocol-options", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proute.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proute.py
index caabf449d..2a832191b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proute.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proute.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<policy route id>": "policy_route_id"}
+ speciallist = {"<policy route id>": "policy_route_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def firewall_proute(data, fos):
vdom = data["vdom"]
firewall_proute_data = data["firewall_proute"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_proute_data(firewall_proute_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_firewall_proute_data(firewall_proute_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("firewall", "proute", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_address.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_address.py
index 2d7c7b4b9..060705e0b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_address.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_address.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -499,9 +499,8 @@ def firewall_proxy_address(data, fos, check_mode=False):
firewall_proxy_address_data = flatten_multilists_attributes(
firewall_proxy_address_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_proxy_address_data(firewall_proxy_address_data)
- )
+ filtered_data = filter_firewall_proxy_address_data(firewall_proxy_address_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -565,7 +564,7 @@ def firewall_proxy_address(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "proxy-address", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "proxy-address", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_addrgrp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_addrgrp.py
index debc54045..6a6210b58 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_addrgrp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_addrgrp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -312,9 +312,8 @@ def firewall_proxy_addrgrp(data, fos, check_mode=False):
state = data["state"]
firewall_proxy_addrgrp_data = data["firewall_proxy_addrgrp"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_proxy_addrgrp_data(firewall_proxy_addrgrp_data)
- )
+ filtered_data = filter_firewall_proxy_addrgrp_data(firewall_proxy_addrgrp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -378,7 +377,7 @@ def firewall_proxy_addrgrp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "proxy-addrgrp", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "proxy-addrgrp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_policy.py
index 8c01a42be..9ec85ca81 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_proxy_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -165,6 +165,10 @@ options:
choices:
- 'enable'
- 'disable'
+ diameter_filter_profile:
+ description:
+ - Name of an existing Diameter filter profile. Source diameter-filter.profile.name.
+ type: str
disclaimer:
description:
- 'Web proxy disclaimer setting: by domain, policy, or user.'
@@ -690,59 +694,60 @@ EXAMPLES = """
decrypted_traffic_mirror: "<your_own_value> (source firewall.decrypted-traffic-mirror.name)"
detect_https_in_http_request: "enable"
device_ownership: "enable"
+ diameter_filter_profile: "<your_own_value> (source diameter-filter.profile.name)"
disclaimer: "disable"
dlp_profile: "<your_own_value> (source dlp.profile.name)"
dlp_sensor: "<your_own_value> (source dlp.sensor.name)"
dstaddr:
-
- name: "default_name_21 (source firewall.address.name firewall.addrgrp.name firewall.proxy-address.name firewall.proxy-addrgrp.name firewall
+ name: "default_name_22 (source firewall.address.name firewall.addrgrp.name firewall.proxy-address.name firewall.proxy-addrgrp.name firewall
.vip.name firewall.vipgrp.name system.external-resource.name)"
dstaddr_negate: "enable"
dstaddr6:
-
- name: "default_name_24 (source firewall.address6.name firewall.addrgrp6.name firewall.vip6.name firewall.vipgrp6.name system
+ name: "default_name_25 (source firewall.address6.name firewall.addrgrp6.name firewall.vip6.name firewall.vipgrp6.name system
.external-resource.name)"
dstintf:
-
- name: "default_name_26 (source system.interface.name system.zone.name system.sdwan.zone.name)"
+ name: "default_name_27 (source system.interface.name system.zone.name system.sdwan.zone.name)"
emailfilter_profile: "<your_own_value> (source emailfilter.profile.name)"
file_filter_profile: "<your_own_value> (source file-filter.profile.name)"
global_label: "<your_own_value>"
groups:
-
- name: "default_name_31 (source user.group.name)"
+ name: "default_name_32 (source user.group.name)"
http_tunnel_auth: "enable"
icap_profile: "<your_own_value> (source icap.profile.name)"
internet_service: "enable"
internet_service_custom:
-
- name: "default_name_36 (source firewall.internet-service-custom.name)"
+ name: "default_name_37 (source firewall.internet-service-custom.name)"
internet_service_custom_group:
-
- name: "default_name_38 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_39 (source firewall.internet-service-custom-group.name)"
internet_service_group:
-
- name: "default_name_40 (source firewall.internet-service-group.name)"
+ name: "default_name_41 (source firewall.internet-service-group.name)"
internet_service_id:
-
- id: "42 (source firewall.internet-service.id)"
+ id: "43 (source firewall.internet-service.id)"
internet_service_name:
-
- name: "default_name_44 (source firewall.internet-service-name.name)"
+ name: "default_name_45 (source firewall.internet-service-name.name)"
internet_service_negate: "enable"
internet_service6: "enable"
internet_service6_custom:
-
- name: "default_name_48 (source firewall.internet-service-custom.name)"
+ name: "default_name_49 (source firewall.internet-service-custom.name)"
internet_service6_custom_group:
-
- name: "default_name_50 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_51 (source firewall.internet-service-custom-group.name)"
internet_service6_group:
-
- name: "default_name_52 (source firewall.internet-service-group.name)"
+ name: "default_name_53 (source firewall.internet-service-group.name)"
internet_service6_name:
-
- name: "default_name_54 (source firewall.internet-service-name.name)"
+ name: "default_name_55 (source firewall.internet-service-name.name)"
internet_service6_negate: "enable"
ips_sensor: "<your_own_value> (source ips.sensor.name)"
ips_voip_filter: "<your_own_value> (source voip.profile.name)"
@@ -750,11 +755,11 @@ EXAMPLES = """
logtraffic: "all"
logtraffic_start: "enable"
mms_profile: "<your_own_value> (source firewall.mms-profile.name)"
- name: "default_name_62"
+ name: "default_name_63"
policyid: "<you_own_value>"
poolname:
-
- name: "default_name_65 (source firewall.ippool.name)"
+ name: "default_name_66 (source firewall.ippool.name)"
profile_group: "<your_own_value> (source firewall.profile-group.name)"
profile_protocol_options: "<your_own_value> (source firewall.profile-protocol-options.name)"
profile_type: "single"
@@ -766,21 +771,21 @@ EXAMPLES = """
sctp_filter_profile: "<your_own_value> (source sctp-filter.profile.name)"
service:
-
- name: "default_name_76 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_77 (source firewall.service.custom.name firewall.service.group.name)"
service_negate: "enable"
session_ttl: "0"
spamfilter_profile: "<your_own_value> (source spamfilter.profile.name)"
srcaddr:
-
- name: "default_name_81 (source firewall.address.name firewall.addrgrp.name firewall.proxy-address.name firewall.proxy-addrgrp.name system
+ name: "default_name_82 (source firewall.address.name firewall.addrgrp.name firewall.proxy-address.name firewall.proxy-addrgrp.name system
.external-resource.name)"
srcaddr_negate: "enable"
srcaddr6:
-
- name: "default_name_84 (source firewall.address6.name firewall.addrgrp6.name system.external-resource.name)"
+ name: "default_name_85 (source firewall.address6.name firewall.addrgrp6.name system.external-resource.name)"
srcintf:
-
- name: "default_name_86 (source system.interface.name system.zone.name system.sdwan.zone.name)"
+ name: "default_name_87 (source system.interface.name system.zone.name system.sdwan.zone.name)"
ssh_filter_profile: "<your_own_value> (source ssh-filter.profile.name)"
ssh_policy_redirect: "enable"
ssl_ssh_profile: "<your_own_value> (source firewall.ssl-ssh-profile.name)"
@@ -788,7 +793,7 @@ EXAMPLES = """
transparent: "enable"
users:
-
- name: "default_name_93 (source user.local.name user.certificate.name)"
+ name: "default_name_94 (source user.local.name user.certificate.name)"
utm_status: "enable"
uuid: "<your_own_value>"
videofilter_profile: "<your_own_value> (source videofilter.profile.name)"
@@ -802,7 +807,7 @@ EXAMPLES = """
webproxy_profile: "<your_own_value> (source web-proxy.profile.name)"
ztna_ems_tag:
-
- name: "default_name_106 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_107 (source firewall.address.name firewall.addrgrp.name)"
ztna_tags_match_logic: "or"
"""
@@ -908,6 +913,7 @@ def filter_firewall_proxy_policy_data(json):
"decrypted_traffic_mirror",
"detect_https_in_http_request",
"device_ownership",
+ "diameter_filter_profile",
"disclaimer",
"dlp_profile",
"dlp_sensor",
@@ -1010,9 +1016,8 @@ def firewall_proxy_policy(data, fos, check_mode=False):
state = data["state"]
firewall_proxy_policy_data = data["firewall_proxy_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_proxy_policy_data(firewall_proxy_policy_data)
- )
+ filtered_data = filter_firewall_proxy_policy_data(firewall_proxy_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1076,7 +1081,7 @@ def firewall_proxy_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "proxy-policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "proxy-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -1132,7 +1137,7 @@ versioned_schema = {
{"value": "ssh"},
{"value": "ssh-tunnel"},
{"value": "access-proxy", "v_range": [["v7.0.0", ""]]},
- {"value": "wanopt"},
+ {"value": "wanopt", "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]]},
],
},
"access_proxy": {
@@ -1467,14 +1472,20 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"webcache": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"webcache_https": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
+ "options": [
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"disclaimer": {
"v_range": [["v6.0.0", ""]],
@@ -1508,7 +1519,7 @@ versioned_schema = {
"application_list": {"v_range": [["v6.0.0", ""]], "type": "string"},
"ips_voip_filter": {"v_range": [["v7.4.0", ""]], "type": "string"},
"sctp_filter_profile": {"v_range": [["v7.0.1", ""]], "type": "string"},
- "virtual_patch_profile": {"v_range": [["v7.4.1", ""]], "type": "string"},
+ "diameter_filter_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
"icap_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"cifs_profile": {"v_range": [["v6.2.0", ""]], "type": "string"},
"videofilter_profile": {"v_range": [["v7.0.0", ""]], "type": "string"},
@@ -1534,6 +1545,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "virtual_patch_profile": {"v_range": [["v7.4.1", "v7.4.1"]], "type": "string"},
"voip_profile": {"v_range": [["v7.0.0", "v7.2.4"]], "type": "string"},
"dlp_sensor": {"v_range": [["v6.0.0", "v7.0.12"]], "type": "string"},
"internet_service_id": {
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_region.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_region.py
index 03d0734dd..2e0c156d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_region.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_region.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,9 +246,8 @@ def firewall_region(data, fos, check_mode=False):
state = data["state"]
firewall_region_data = data["firewall_region"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_region_data(firewall_region_data)
- )
+ filtered_data = filter_firewall_region_data(firewall_region_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -312,7 +311,7 @@ def firewall_region(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "region", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "region", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "region", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_group.py
index 4163edfac..ab75607c3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -252,9 +252,8 @@ def firewall_schedule_group(data, fos, check_mode=False):
state = data["state"]
firewall_schedule_group_data = data["firewall_schedule_group"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_schedule_group_data(firewall_schedule_group_data)
- )
+ filtered_data = filter_firewall_schedule_group_data(firewall_schedule_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -318,7 +317,7 @@ def firewall_schedule_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.schedule", "group", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.schedule", "group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_onetime.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_onetime.py
index c67a03428..394948e8b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_onetime.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_onetime.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -272,9 +272,10 @@ def firewall_schedule_onetime(data, fos, check_mode=False):
state = data["state"]
firewall_schedule_onetime_data = data["firewall_schedule_onetime"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_schedule_onetime_data(firewall_schedule_onetime_data)
+ filtered_data = filter_firewall_schedule_onetime_data(
+ firewall_schedule_onetime_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -338,7 +339,7 @@ def firewall_schedule_onetime(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.schedule", "onetime", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.schedule", "onetime", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_recurring.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_recurring.py
index 309dc8766..90ac35d95 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_recurring.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_schedule_recurring.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -295,9 +295,10 @@ def firewall_schedule_recurring(data, fos, check_mode=False):
firewall_schedule_recurring_data = flatten_multilists_attributes(
firewall_schedule_recurring_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_schedule_recurring_data(firewall_schedule_recurring_data)
+ filtered_data = filter_firewall_schedule_recurring_data(
+ firewall_schedule_recurring_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -361,7 +362,7 @@ def firewall_schedule_recurring(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.schedule", "recurring", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.schedule", "recurring", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_security_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_security_policy.py
index acf6d793c..86a5af244 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_security_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_security_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -150,6 +150,10 @@ options:
description:
- Comment.
type: str
+ diameter_filter_profile:
+ description:
+ - Name of an existing Diameter filter profile. Source diameter-filter.profile.name.
+ type: str
dlp_profile:
description:
- Name of an existing DLP profile. Source dlp.profile.name.
@@ -772,97 +776,98 @@ EXAMPLES = """
casb_profile: "<your_own_value> (source casb.profile.name)"
cifs_profile: "<your_own_value> (source cifs.profile.name)"
comments: "<your_own_value>"
+ diameter_filter_profile: "<your_own_value> (source diameter-filter.profile.name)"
dlp_profile: "<your_own_value> (source dlp.profile.name)"
dlp_sensor: "<your_own_value> (source dlp.sensor.name)"
dnsfilter_profile: "<your_own_value> (source dnsfilter.profile.name)"
dstaddr:
-
- name: "default_name_19 (source firewall.address.name firewall.addrgrp.name firewall.vip.name firewall.vipgrp.name system.external-resource
+ name: "default_name_20 (source firewall.address.name firewall.addrgrp.name firewall.vip.name firewall.vipgrp.name system.external-resource
.name)"
dstaddr_negate: "enable"
dstaddr4:
-
- name: "default_name_22 (source firewall.address.name firewall.addrgrp.name firewall.vip.name firewall.vipgrp.name)"
+ name: "default_name_23 (source firewall.address.name firewall.addrgrp.name firewall.vip.name firewall.vipgrp.name)"
dstaddr6:
-
- name: "default_name_24 (source firewall.address6.name firewall.addrgrp6.name firewall.vip6.name firewall.vipgrp6.name system
+ name: "default_name_25 (source firewall.address6.name firewall.addrgrp6.name firewall.vip6.name firewall.vipgrp6.name system
.external-resource.name)"
dstaddr6_negate: "enable"
dstintf:
-
- name: "default_name_27 (source system.interface.name system.zone.name system.sdwan.zone.name)"
+ name: "default_name_28 (source system.interface.name system.zone.name system.sdwan.zone.name)"
emailfilter_profile: "<your_own_value> (source emailfilter.profile.name)"
enforce_default_app_port: "enable"
file_filter_profile: "<your_own_value> (source file-filter.profile.name)"
fsso_groups:
-
- name: "default_name_32 (source user.adgrp.name)"
+ name: "default_name_33 (source user.adgrp.name)"
global_label: "<your_own_value>"
groups:
-
- name: "default_name_35 (source user.group.name)"
+ name: "default_name_36 (source user.group.name)"
icap_profile: "<your_own_value> (source icap.profile.name)"
internet_service: "enable"
internet_service_custom:
-
- name: "default_name_39 (source firewall.internet-service-custom.name)"
+ name: "default_name_40 (source firewall.internet-service-custom.name)"
internet_service_custom_group:
-
- name: "default_name_41 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_42 (source firewall.internet-service-custom-group.name)"
internet_service_group:
-
- name: "default_name_43 (source firewall.internet-service-group.name)"
+ name: "default_name_44 (source firewall.internet-service-group.name)"
internet_service_id:
-
- id: "45 (source firewall.internet-service.id)"
+ id: "46 (source firewall.internet-service.id)"
internet_service_name:
-
- name: "default_name_47 (source firewall.internet-service-name.name)"
+ name: "default_name_48 (source firewall.internet-service-name.name)"
internet_service_negate: "enable"
internet_service_src: "enable"
internet_service_src_custom:
-
- name: "default_name_51 (source firewall.internet-service-custom.name)"
+ name: "default_name_52 (source firewall.internet-service-custom.name)"
internet_service_src_custom_group:
-
- name: "default_name_53 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_54 (source firewall.internet-service-custom-group.name)"
internet_service_src_group:
-
- name: "default_name_55 (source firewall.internet-service-group.name)"
+ name: "default_name_56 (source firewall.internet-service-group.name)"
internet_service_src_id:
-
- id: "57 (source firewall.internet-service.id)"
+ id: "58 (source firewall.internet-service.id)"
internet_service_src_name:
-
- name: "default_name_59 (source firewall.internet-service-name.name)"
+ name: "default_name_60 (source firewall.internet-service-name.name)"
internet_service_src_negate: "enable"
internet_service6: "enable"
internet_service6_custom:
-
- name: "default_name_63 (source firewall.internet-service-custom.name)"
+ name: "default_name_64 (source firewall.internet-service-custom.name)"
internet_service6_custom_group:
-
- name: "default_name_65 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_66 (source firewall.internet-service-custom-group.name)"
internet_service6_group:
-
- name: "default_name_67 (source firewall.internet-service-group.name)"
+ name: "default_name_68 (source firewall.internet-service-group.name)"
internet_service6_name:
-
- name: "default_name_69 (source firewall.internet-service-name.name)"
+ name: "default_name_70 (source firewall.internet-service-name.name)"
internet_service6_negate: "enable"
internet_service6_src: "enable"
internet_service6_src_custom:
-
- name: "default_name_73 (source firewall.internet-service-custom.name)"
+ name: "default_name_74 (source firewall.internet-service-custom.name)"
internet_service6_src_custom_group:
-
- name: "default_name_75 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_76 (source firewall.internet-service-custom-group.name)"
internet_service6_src_group:
-
- name: "default_name_77 (source firewall.internet-service-group.name)"
+ name: "default_name_78 (source firewall.internet-service-group.name)"
internet_service6_src_name:
-
- name: "default_name_79 (source firewall.internet-service-name.name)"
+ name: "default_name_80 (source firewall.internet-service-name.name)"
internet_service6_src_negate: "enable"
ips_sensor: "<your_own_value> (source ips.sensor.name)"
ips_voip_filter: "<your_own_value> (source voip.profile.name)"
@@ -870,7 +875,7 @@ EXAMPLES = """
logtraffic: "all"
logtraffic_start: "enable"
mms_profile: "<your_own_value> (source firewall.mms-profile.name)"
- name: "default_name_87"
+ name: "default_name_88"
nat46: "enable"
nat64: "enable"
policyid: "<you_own_value>"
@@ -882,29 +887,29 @@ EXAMPLES = """
send_deny_packet: "disable"
service:
-
- name: "default_name_98 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_99 (source firewall.service.custom.name firewall.service.group.name)"
service_negate: "enable"
srcaddr:
-
- name: "default_name_101 (source firewall.address.name firewall.addrgrp.name system.external-resource.name)"
+ name: "default_name_102 (source firewall.address.name firewall.addrgrp.name system.external-resource.name)"
srcaddr_negate: "enable"
srcaddr4:
-
- name: "default_name_104 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_105 (source firewall.address.name firewall.addrgrp.name)"
srcaddr6:
-
- name: "default_name_106 (source firewall.address6.name firewall.addrgrp6.name system.external-resource.name)"
+ name: "default_name_107 (source firewall.address6.name firewall.addrgrp6.name system.external-resource.name)"
srcaddr6_negate: "enable"
srcintf:
-
- name: "default_name_109 (source system.interface.name system.zone.name system.sdwan.zone.name)"
+ name: "default_name_110 (source system.interface.name system.zone.name system.sdwan.zone.name)"
ssh_filter_profile: "<your_own_value> (source ssh-filter.profile.name)"
ssl_ssh_profile: "<your_own_value> (source firewall.ssl-ssh-profile.name)"
status: "enable"
url_category: "<your_own_value>"
users:
-
- name: "default_name_115 (source user.local.name)"
+ name: "default_name_116 (source user.local.name)"
utm_status: "enable"
uuid: "<your_own_value>"
uuid_idx: "2147483647"
@@ -1013,6 +1018,7 @@ def filter_firewall_security_policy_data(json):
"casb_profile",
"cifs_profile",
"comments",
+ "diameter_filter_profile",
"dlp_profile",
"dlp_sensor",
"dnsfilter_profile",
@@ -1154,9 +1160,8 @@ def firewall_security_policy(data, fos, check_mode=False):
firewall_security_policy_data = flatten_multilists_attributes(
firewall_security_policy_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_security_policy_data(firewall_security_policy_data)
- )
+ filtered_data = filter_firewall_security_policy_data(firewall_security_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1220,7 +1225,7 @@ def firewall_security_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "security-policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "security-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -1670,6 +1675,7 @@ versioned_schema = {
"voip_profile": {"v_range": [["v6.2.0", ""]], "type": "string"},
"ips_voip_filter": {"v_range": [["v7.4.0", ""]], "type": "string"},
"sctp_filter_profile": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "diameter_filter_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
"virtual_patch_profile": {"v_range": [["v7.4.1", ""]], "type": "string"},
"icap_profile": {"v_range": [["v6.2.0", ""]], "type": "string"},
"cifs_profile": {"v_range": [["v6.2.0", ""]], "type": "string"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_category.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_category.py
index c2ca20285..ed37ecd67 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_category.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_category.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -238,9 +238,10 @@ def firewall_service_category(data, fos, check_mode=False):
state = data["state"]
firewall_service_category_data = data["firewall_service_category"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_service_category_data(firewall_service_category_data)
+ filtered_data = filter_firewall_service_category_data(
+ firewall_service_category_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -304,7 +305,7 @@ def firewall_service_category(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.service", "category", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.service", "category", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_custom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_custom.py
index a68aed381..42d7c54d4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_custom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_custom.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,6 +254,10 @@ options:
description:
- Multiple UDP port ranges.
type: str
+ uuid:
+ description:
+ - Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
+ type: str
visibility:
description:
- Enable/disable the visibility of the service on the GUI.
@@ -300,6 +304,7 @@ EXAMPLES = """
tcp_timewait_timer: "0"
udp_idle_timer: "0"
udp_portrange: "<your_own_value>"
+ uuid: "<your_own_value>"
visibility: "enable"
"""
@@ -419,6 +424,7 @@ def filter_firewall_service_custom_data(json):
"tcp_timewait_timer",
"udp_idle_timer",
"udp_portrange",
+ "uuid",
"visibility",
]
@@ -451,9 +457,8 @@ def firewall_service_custom(data, fos, check_mode=False):
state = data["state"]
firewall_service_custom_data = data["firewall_service_custom"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_service_custom_data(firewall_service_custom_data)
- )
+ filtered_data = filter_firewall_service_custom_data(firewall_service_custom_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -517,7 +522,7 @@ def firewall_service_custom(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.service", "custom", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.service", "custom", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -561,6 +566,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {"v_range": [["v6.0.0", ""]], "type": "string", "required": True},
+ "uuid": {"v_range": [["v7.4.2", ""]], "type": "string"},
"proxy": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -606,19 +612,35 @@ versioned_schema = {
{"value": "mgcp"},
{
"value": "gtp-c",
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "gtp-u",
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "gtp-b",
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "pfcp",
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v7.0.1", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_group.py
index b952b84d8..34bca3348 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_service_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -126,6 +126,10 @@ options:
choices:
- 'enable'
- 'disable'
+ uuid:
+ description:
+ - Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
+ type: str
"""
EXAMPLES = """
@@ -143,6 +147,7 @@ EXAMPLES = """
name: "default_name_7 (source firewall.service.custom.name firewall.service.group.name)"
name: "default_name_8"
proxy: "enable"
+ uuid: "<your_own_value>"
"""
RETURN = """
@@ -234,7 +239,15 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.compariso
def filter_firewall_service_group_data(json):
- option_list = ["color", "comment", "fabric_object", "member", "name", "proxy"]
+ option_list = [
+ "color",
+ "comment",
+ "fabric_object",
+ "member",
+ "name",
+ "proxy",
+ "uuid",
+ ]
json = remove_invalid_fields(json)
dictionary = {}
@@ -265,9 +278,8 @@ def firewall_service_group(data, fos, check_mode=False):
state = data["state"]
firewall_service_group_data = data["firewall_service_group"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_service_group_data(firewall_service_group_data)
- )
+ filtered_data = filter_firewall_service_group_data(firewall_service_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -331,7 +343,7 @@ def firewall_service_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.service", "group", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.service", "group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -375,6 +387,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {"v_range": [["v6.0.0", ""]], "type": "string", "required": True},
+ "uuid": {"v_range": [["v7.4.2", ""]], "type": "string"},
"proxy": {
"v_range": [["v6.0.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_per_ip_shaper.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_per_ip_shaper.py
index c74879d90..c4bca8e19 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_per_ip_shaper.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_per_ip_shaper.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -291,9 +291,10 @@ def firewall_shaper_per_ip_shaper(data, fos, check_mode=False):
state = data["state"]
firewall_shaper_per_ip_shaper_data = data["firewall_shaper_per_ip_shaper"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_shaper_per_ip_shaper_data(firewall_shaper_per_ip_shaper_data)
+ filtered_data = filter_firewall_shaper_per_ip_shaper_data(
+ firewall_shaper_per_ip_shaper_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -360,7 +361,7 @@ def firewall_shaper_per_ip_shaper(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall.shaper", "per-ip-shaper", data=filtered_data, vdom=vdom
+ "firewall.shaper", "per-ip-shaper", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_traffic_shaper.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_traffic_shaper.py
index 95478eea6..838f4c075 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_traffic_shaper.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaper_traffic_shaper.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -359,9 +359,10 @@ def firewall_shaper_traffic_shaper(data, fos, check_mode=False):
state = data["state"]
firewall_shaper_traffic_shaper_data = data["firewall_shaper_traffic_shaper"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_shaper_traffic_shaper_data(firewall_shaper_traffic_shaper_data)
+ filtered_data = filter_firewall_shaper_traffic_shaper_data(
+ firewall_shaper_traffic_shaper_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -430,7 +431,7 @@ def firewall_shaper_traffic_shaper(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall.shaper", "traffic-shaper", data=filtered_data, vdom=vdom
+ "firewall.shaper", "traffic-shaper", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_policy.py
index 76fde19ce..d3279654f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_policy.py
@@ -42,7 +42,7 @@ notes:
- Only one of [after, before] must be specified when action is moving an object.
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -751,9 +751,8 @@ def firewall_shaping_policy(data, fos, check_mode=False):
state = data["state"]
firewall_shaping_policy_data = data["firewall_shaping_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_shaping_policy_data(firewall_shaping_policy_data)
- )
+ filtered_data = filter_firewall_shaping_policy_data(firewall_shaping_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -817,7 +816,7 @@ def firewall_shaping_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "shaping-policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "shaping-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_profile.py
index ef1951557..acd7ad754 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_shaping_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -319,9 +319,8 @@ def firewall_shaping_profile(data, fos, check_mode=False):
state = data["state"]
firewall_shaping_profile_data = data["firewall_shaping_profile"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_shaping_profile_data(firewall_shaping_profile_data)
- )
+ filtered_data = filter_firewall_shaping_profile_data(firewall_shaping_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -385,7 +384,7 @@ def firewall_shaping_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "shaping-profile", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "shaping-profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_sniffer.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_sniffer.py
index 1faa6bebd..2a645f373 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_sniffer.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_sniffer.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -141,6 +141,92 @@ options:
choices:
- 'disable'
- 'enable'
+ synproxy_tcp_mss:
+ description:
+ - Determine TCP maximum segment size (MSS) value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '0'
+ - '256'
+ - '512'
+ - '1024'
+ - '1300'
+ - '1360'
+ - '1460'
+ - '1500'
+ synproxy_tcp_sack:
+ description:
+ - enable/disable TCP selective acknowledage (SACK) for packets replied by syn proxy module.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ synproxy_tcp_timestamp:
+ description:
+ - enable/disable TCP timestamp option for packets replied by syn proxy module.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ synproxy_tcp_window:
+ description:
+ - Determine TCP Window size for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '4096'
+ - '8192'
+ - '16384'
+ - '32768'
+ synproxy_tcp_windowscale:
+ description:
+ - Determine TCP window scale option value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '0'
+ - '1'
+ - '2'
+ - '3'
+ - '4'
+ - '5'
+ - '6'
+ - '7'
+ - '8'
+ - '9'
+ - '10'
+ - '11'
+ - '12'
+ - '13'
+ - '14'
+ synproxy_tos:
+ description:
+ - Determine TCP differentiated services code point value (type of service).
+ type: str
+ choices:
+ - '0'
+ - '10'
+ - '12'
+ - '14'
+ - '18'
+ - '20'
+ - '22'
+ - '26'
+ - '28'
+ - '30'
+ - '34'
+ - '36'
+ - '38'
+ - '40'
+ - '46'
+ - '255'
+ synproxy_ttl:
+ description:
+ - Determine Time to live (TTL) value for packets replied by syn proxy module.
+ type: str
+ choices:
+ - '32'
+ - '64'
+ - '128'
+ - '255'
threshold:
description:
- Anomaly threshold. Number of detected instances (packets per second or concurrent session number) that triggers the anomaly
@@ -344,6 +430,10 @@ options:
choices:
- 'enable'
- 'disable'
+ uuid:
+ description:
+ - Universally Unique Identifier (UUID; automatically assigned but can be manually reset).
+ type: str
vlan:
description:
- List of VLANs to sniff.
@@ -377,6 +467,13 @@ EXAMPLES = """
quarantine_expiry: "<your_own_value>"
quarantine_log: "disable"
status: "disable"
+ synproxy_tcp_mss: "0"
+ synproxy_tcp_sack: "enable"
+ synproxy_tcp_timestamp: "enable"
+ synproxy_tcp_window: "4096"
+ synproxy_tcp_windowscale: "0"
+ synproxy_tos: "0"
+ synproxy_ttl: "32"
threshold: "0"
threshold_default: "0"
application_list: "<your_own_value> (source application.list.name)"
@@ -395,11 +492,11 @@ EXAMPLES = """
file_filter_profile: "<your_own_value> (source file-filter.profile.name)"
file_filter_profile_status: "enable"
host: "myhostname"
- id: "29"
+ id: "36"
interface: "<your_own_value> (source system.interface.name)"
ip_threatfeed:
-
- name: "default_name_32 (source system.external-resource.name)"
+ name: "default_name_39 (source system.external-resource.name)"
ip_threatfeed_status: "enable"
ips_dos_status: "enable"
ips_sensor: "<your_own_value> (source ips.sensor.name)"
@@ -414,6 +511,7 @@ EXAMPLES = """
spamfilter_profile: "<your_own_value> (source spamfilter.profile.name)"
spamfilter_profile_status: "enable"
status: "enable"
+ uuid: "<your_own_value>"
vlan: "<your_own_value>"
webfilter_profile: "<your_own_value> (source webfilter.profile.name)"
webfilter_profile_status: "enable"
@@ -543,6 +641,7 @@ def filter_firewall_sniffer_data(json):
"spamfilter_profile",
"spamfilter_profile_status",
"status",
+ "uuid",
"vlan",
"webfilter_profile",
"webfilter_profile_status",
@@ -572,9 +671,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"threshold(default)": "threshold_default"}
+ speciallist = {"threshold(default)": "threshold_default"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -583,8 +682,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -600,10 +702,8 @@ def firewall_sniffer(data, fos, check_mode=False):
state = data["state"]
firewall_sniffer_data = data["firewall_sniffer"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_sniffer_data(firewall_sniffer_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_firewall_sniffer_data(firewall_sniffer_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
@@ -709,6 +809,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {"v_range": [["v6.0.0", ""]], "type": "integer", "required": True},
+ "uuid": {"v_range": [["v7.4.2", ""]], "type": "string"},
"status": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -760,12 +861,6 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"av_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "casb_profile_status": {
- "v_range": [["v7.4.1", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
- "casb_profile": {"v_range": [["v7.4.1", ""]], "type": "string"},
"webfilter_profile_status": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -852,6 +947,93 @@ versioned_schema = {
"options": [{"value": "disable"}, {"value": "enable"}],
},
"threshold": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "synproxy_ttl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "32"},
+ {"value": "64"},
+ {"value": "128"},
+ {"value": "255"},
+ ],
+ },
+ "synproxy_tos": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "10"},
+ {"value": "12"},
+ {"value": "14"},
+ {"value": "18"},
+ {"value": "20"},
+ {"value": "22"},
+ {"value": "26"},
+ {"value": "28"},
+ {"value": "30"},
+ {"value": "34"},
+ {"value": "36"},
+ {"value": "38"},
+ {"value": "40"},
+ {"value": "46"},
+ {"value": "255"},
+ ],
+ },
+ "synproxy_tcp_mss": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "256"},
+ {"value": "512"},
+ {"value": "1024"},
+ {"value": "1300"},
+ {"value": "1360"},
+ {"value": "1460"},
+ {"value": "1500"},
+ ],
+ },
+ "synproxy_tcp_sack": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "synproxy_tcp_timestamp": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "synproxy_tcp_window": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "4096"},
+ {"value": "8192"},
+ {"value": "16384"},
+ {"value": "32768"},
+ ],
+ },
+ "synproxy_tcp_windowscale": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "0"},
+ {"value": "1"},
+ {"value": "2"},
+ {"value": "3"},
+ {"value": "4"},
+ {"value": "5"},
+ {"value": "6"},
+ {"value": "7"},
+ {"value": "8"},
+ {"value": "9"},
+ {"value": "10"},
+ {"value": "11"},
+ {"value": "12"},
+ {"value": "13"},
+ {"value": "14"},
+ ],
+ },
"threshold_default": {
"v_range": [["v6.0.0", "v7.0.5"], ["v7.2.0", "v7.2.0"]],
"type": "integer",
@@ -859,6 +1041,12 @@ versioned_schema = {
},
"v_range": [["v6.0.0", ""]],
},
+ "casb_profile_status": {
+ "v_range": [["v7.4.1", "v7.4.1"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "casb_profile": {"v_range": [["v7.4.1", "v7.4.1"]], "type": "string"},
"dlp_sensor_status": {
"v_range": [["v6.0.0", "v7.0.12"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_host_key.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_host_key.py
index 73b601ccf..53b66adbd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_host_key.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_host_key.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -294,9 +294,8 @@ def firewall_ssh_host_key(data, fos, check_mode=False):
state = data["state"]
firewall_ssh_host_key_data = data["firewall_ssh_host_key"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ssh_host_key_data(firewall_ssh_host_key_data)
- )
+ filtered_data = filter_firewall_ssh_host_key_data(firewall_ssh_host_key_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -360,7 +359,7 @@ def firewall_ssh_host_key(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.ssh", "host-key", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.ssh", "host-key", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_ca.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_ca.py
index cd4e55c89..63a7da52f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_ca.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_ca.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -248,9 +248,8 @@ def firewall_ssh_local_ca(data, fos, check_mode=False):
state = data["state"]
firewall_ssh_local_ca_data = data["firewall_ssh_local_ca"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ssh_local_ca_data(firewall_ssh_local_ca_data)
- )
+ filtered_data = filter_firewall_ssh_local_ca_data(firewall_ssh_local_ca_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -314,7 +313,7 @@ def firewall_ssh_local_ca(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.ssh", "local-ca", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.ssh", "local-ca", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_key.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_key.py
index fd3d483de..fb6ef65d7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_key.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_local_key.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -248,9 +248,8 @@ def firewall_ssh_local_key(data, fos, check_mode=False):
state = data["state"]
firewall_ssh_local_key_data = data["firewall_ssh_local_key"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ssh_local_key_data(firewall_ssh_local_key_data)
- )
+ filtered_data = filter_firewall_ssh_local_key_data(firewall_ssh_local_key_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -314,7 +313,7 @@ def firewall_ssh_local_key(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.ssh", "local-key", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.ssh", "local-key", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_setting.py
index ac50dc13d..55092662e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssh_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -255,11 +255,10 @@ def underscore_to_hyphen(data):
def firewall_ssh_setting(data, fos):
vdom = data["vdom"]
firewall_ssh_setting_data = data["firewall_ssh_setting"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ssh_setting_data(firewall_ssh_setting_data)
- )
+ filtered_data = filter_firewall_ssh_setting_data(firewall_ssh_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("firewall.ssh", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.ssh", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_server.py
index c98d4f1c2..fa3f6b118 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -124,6 +124,18 @@ options:
description:
- Name of certificate for SSL connections to this server . Source vpn.certificate.local.name.
type: str
+ ssl_cert_dict:
+ description:
+ - List of certificate names to use for SSL connections to this server. . Use the parameter ssl_cert if the fortiOS firmware version <= 7.4
+ .1
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Certificate list. Source vpn.certificate.local.name.
+ required: true
+ type: str
ssl_client_renegotiation:
description:
- Allow or block client renegotiation by server.
@@ -196,6 +208,9 @@ EXAMPLES = """
port: "443"
ssl_algorithm: "high"
ssl_cert: "<your_own_value> (source vpn.certificate.local.name)"
+ ssl_cert_dict:
+ -
+ name: "default_name_11 (source vpn.certificate.local.name)"
ssl_client_renegotiation: "allow"
ssl_dh_bits: "768"
ssl_max_version: "tls-1.0"
@@ -302,6 +317,7 @@ def filter_firewall_ssl_server_data(json):
"port",
"ssl_algorithm",
"ssl_cert",
+ "ssl_cert_dict",
"ssl_client_renegotiation",
"ssl_dh_bits",
"ssl_max_version",
@@ -334,15 +350,39 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"ssl-cert-dict": "ssl-cert"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def firewall_ssl_server(data, fos, check_mode=False):
vdom = data["vdom"]
state = data["state"]
firewall_ssl_server_data = data["firewall_ssl_server"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ssl_server_data(firewall_ssl_server_data)
- )
+ filtered_data = filter_firewall_ssl_server_data(firewall_ssl_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
# check_mode starts from here
if check_mode:
@@ -406,7 +446,7 @@ def firewall_ssl_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "ssl-server", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ssl-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -463,7 +503,18 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"mapped_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "ssl_cert": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "ssl_cert_dict": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"ssl_dh_bits": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -514,6 +565,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "ssl_cert": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_setting.py
index 86b3d92cf..c2388376d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,11 +278,10 @@ def underscore_to_hyphen(data):
def firewall_ssl_setting(data, fos):
vdom = data["vdom"]
firewall_ssl_setting_data = data["firewall_ssl_setting"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ssl_setting_data(firewall_ssl_setting_data)
- )
+ filtered_data = filter_firewall_ssl_setting_data(firewall_ssl_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("firewall.ssl", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("firewall.ssl", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_ssh_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_ssh_profile.py
index fac1f496e..3b14ef1ad 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_ssh_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ssl_ssh_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -163,9 +163,12 @@ options:
- 'disable'
quic:
description:
- - Enable/disable QUIC inspection .
+ - QUIC inspection status .
type: str
choices:
+ - 'inspect'
+ - 'bypass'
+ - 'block'
- 'disable'
- 'enable'
revoked_server_cert:
@@ -454,9 +457,12 @@ options:
- 'disable'
quic:
description:
- - Enable/disable QUIC inspection .
+ - QUIC inspection status .
type: str
choices:
+ - 'inspect'
+ - 'bypass'
+ - 'block'
- 'disable'
- 'enable'
revoked_server_cert:
@@ -1446,7 +1452,7 @@ EXAMPLES = """
client_certificate: "bypass"
expired_server_cert: "allow"
proxy_after_tcp_handshake: "enable"
- quic: "disable"
+ quic: "inspect"
revoked_server_cert: "allow"
sni_server_cert_check: "enable"
status: "disable"
@@ -1485,7 +1491,7 @@ EXAMPLES = """
min_allowed_ssl_version: "ssl-3.0"
ports: "<your_own_value>"
proxy_after_tcp_handshake: "enable"
- quic: "disable"
+ quic: "inspect"
revoked_server_cert: "allow"
sni_server_cert_check: "enable"
status: "disable"
@@ -1816,9 +1822,8 @@ def firewall_ssl_ssh_profile(data, fos, check_mode=False):
firewall_ssl_ssh_profile_data = flatten_multilists_attributes(
firewall_ssl_ssh_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_firewall_ssl_ssh_profile_data(firewall_ssl_ssh_profile_data)
- )
+ filtered_data = filter_firewall_ssl_ssh_profile_data(firewall_ssl_ssh_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1882,7 +1887,7 @@ def firewall_ssl_ssh_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "ssl-ssh-profile", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ssl-ssh-profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -2101,7 +2106,13 @@ versioned_schema = {
"quic": {
"v_range": [["v7.4.1", ""]],
"type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
+ "options": [
+ {"value": "inspect", "v_range": [["v7.4.2", ""]]},
+ {"value": "bypass", "v_range": [["v7.4.2", ""]]},
+ {"value": "block", "v_range": [["v7.4.2", ""]]},
+ {"value": "disable", "v_range": [["v7.4.1", "v7.4.1"]]},
+ {"value": "enable", "v_range": [["v7.4.1", "v7.4.1"]]},
+ ],
},
"proxy_after_tcp_handshake": {
"v_range": [["v6.4.0", ""]],
@@ -2874,7 +2885,13 @@ versioned_schema = {
"quic": {
"v_range": [["v7.4.1", ""]],
"type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
+ "options": [
+ {"value": "inspect", "v_range": [["v7.4.2", ""]]},
+ {"value": "bypass", "v_range": [["v7.4.2", ""]]},
+ {"value": "block", "v_range": [["v7.4.2", ""]]},
+ {"value": "disable", "v_range": [["v7.4.1", "v7.4.1"]]},
+ {"value": "enable", "v_range": [["v7.4.1", "v7.4.1"]]},
+ ],
},
"proxy_after_tcp_handshake": {
"v_range": [["v7.0.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_traffic_class.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_traffic_class.py
index 3e70b17ac..536d42d8a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_traffic_class.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_traffic_class.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,9 +232,8 @@ def firewall_traffic_class(data, fos, check_mode=False):
state = data["state"]
firewall_traffic_class_data = data["firewall_traffic_class"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_traffic_class_data(firewall_traffic_class_data)
- )
+ filtered_data = filter_firewall_traffic_class_data(firewall_traffic_class_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -298,7 +297,7 @@ def firewall_traffic_class(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "traffic-class", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "traffic-class", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ttl_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ttl_policy.py
index 3922cbf4e..dcb174070 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ttl_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_ttl_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -296,9 +296,8 @@ def firewall_ttl_policy(data, fos, check_mode=False):
state = data["state"]
firewall_ttl_policy_data = data["firewall_ttl_policy"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_ttl_policy_data(firewall_ttl_policy_data)
- )
+ filtered_data = filter_firewall_ttl_policy_data(firewall_ttl_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -362,7 +361,7 @@ def firewall_ttl_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "ttl-policy", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "ttl-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "ttl-policy", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vendor_mac.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vendor_mac.py
index 6dc0b3d14..d21b53aa3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vendor_mac.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vendor_mac.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,9 +242,8 @@ def firewall_vendor_mac(data, fos, check_mode=False):
state = data["state"]
firewall_vendor_mac_data = data["firewall_vendor_mac"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_vendor_mac_data(firewall_vendor_mac_data)
- )
+ filtered_data = filter_firewall_vendor_mac_data(firewall_vendor_mac_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -308,7 +307,7 @@ def firewall_vendor_mac(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vendor-mac", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vendor-mac", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vendor-mac", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip.py
index a26b5db44..43d2a811c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -142,6 +142,29 @@ options:
description:
- Enable to have the VIP send gratuitous ARPs. 0=disabled. Set from 5 up to 8640000 seconds to enable.
type: int
+ gslb_domain_name:
+ description:
+ - Domain to use when integrating with FortiGSLB.
+ type: str
+ gslb_hostname:
+ description:
+ - Hostname to use within the configured FortiGSLB domain.
+ type: str
+ gslb_public_ips:
+ description:
+ - Publicly accessible IP addresses for the FortiGSLB service.
+ type: list
+ elements: dict
+ suboptions:
+ index:
+ description:
+ - Index of this public IP setting. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ ip:
+ description:
+ - The publicly accessible IP address.
+ type: str
h2_support:
description:
- Enable/disable HTTP2 support .
@@ -323,6 +346,13 @@ options:
choices:
- 'disable'
- 'enable'
+ one_click_gslb_server:
+ description:
+ - Enable/disable one click GSLB server integration with FortiGSLB.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
outlook_web_access:
description:
- Enable to add the Front-End-Https header for Microsoft Outlook Web Access.
@@ -557,6 +587,17 @@ options:
description:
- The name of the certificate to use for SSL handshake. Source vpn.certificate.local.name.
type: str
+ ssl_certificate_dict:
+ description:
+ - Name of the certificate to use for SSL handshake. Use the parameter ssl-certificate instead if the fortiOS firmwear <= 7.4.1
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Certificate list. Source vpn.certificate.local.name.
+ required: true
+ type: str
ssl_cipher_suites:
description:
- SSL/TLS cipher suites acceptable from a client, ordered by priority.
@@ -1020,6 +1061,12 @@ EXAMPLES = """
extip: "<your_own_value>"
extport: "<your_own_value>"
gratuitous_arp_interval: "0"
+ gslb_domain_name: "<your_own_value>"
+ gslb_hostname: "myhostname"
+ gslb_public_ips:
+ -
+ index: "<you_own_value>"
+ ip: "<your_own_value>"
h2_support: "enable"
h3_support: "enable"
http_cookie_age: "60"
@@ -1037,7 +1084,7 @@ EXAMPLES = """
http_redirect: "enable"
http_supported_max_version: "http1"
https_cookie_secure: "disable"
- id: "31"
+ id: "36"
ipv6_mappedip: "<your_own_value>"
ipv6_mappedport: "<your_own_value>"
ldb_method: "static"
@@ -1049,11 +1096,12 @@ EXAMPLES = """
max_embryonic_connections: "1000"
monitor:
-
- name: "default_name_41 (source firewall.ldb-monitor.name)"
- name: "default_name_42"
+ name: "default_name_46 (source firewall.ldb-monitor.name)"
+ name: "default_name_47"
nat_source_vip: "disable"
nat44: "disable"
nat46: "disable"
+ one_click_gslb_server: "disable"
outlook_web_access: "disable"
persistence: "none"
portforward: "disable"
@@ -1075,12 +1123,12 @@ EXAMPLES = """
healthcheck: "disable"
holddown_interval: "300"
http_host: "myhostname"
- id: "66"
+ id: "72"
ip: "<your_own_value>"
max_connections: "0"
monitor:
-
- name: "default_name_70 (source firewall.ldb-monitor.name)"
+ name: "default_name_76 (source firewall.ldb-monitor.name)"
port: "0"
status: "active"
translate_host: "enable"
@@ -1089,7 +1137,7 @@ EXAMPLES = """
server_type: "http"
service:
-
- name: "default_name_78 (source firewall.service.custom.name firewall.service.group.name)"
+ name: "default_name_84 (source firewall.service.custom.name firewall.service.group.name)"
src_filter:
-
range: "<your_own_value>"
@@ -1099,6 +1147,9 @@ EXAMPLES = """
ssl_accept_ffdhe_groups: "enable"
ssl_algorithm: "high"
ssl_certificate: "<your_own_value> (source vpn.certificate.local.name)"
+ ssl_certificate_dict:
+ -
+ name: "default_name_93 (source vpn.certificate.local.name)"
ssl_cipher_suites:
-
cipher: "TLS-AES-128-GCM-SHA256"
@@ -1246,6 +1297,9 @@ def filter_firewall_vip_data(json):
"extip",
"extport",
"gratuitous_arp_interval",
+ "gslb_domain_name",
+ "gslb_hostname",
+ "gslb_public_ips",
"h2_support",
"h3_support",
"http_cookie_age",
@@ -1276,6 +1330,7 @@ def filter_firewall_vip_data(json):
"nat_source_vip",
"nat44",
"nat46",
+ "one_click_gslb_server",
"outlook_web_access",
"persistence",
"portforward",
@@ -1290,6 +1345,7 @@ def filter_firewall_vip_data(json):
"ssl_accept_ffdhe_groups",
"ssl_algorithm",
"ssl_certificate",
+ "ssl_certificate_dict",
"ssl_cipher_suites",
"ssl_client_fallback",
"ssl_client_rekey_count",
@@ -1382,6 +1438,30 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"ssl-certificate-dict": "ssl-certificate"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def firewall_vip(data, fos, check_mode=False):
vdom = data["vdom"]
@@ -1389,7 +1469,9 @@ def firewall_vip(data, fos, check_mode=False):
firewall_vip_data = data["firewall_vip"]
firewall_vip_data = flatten_multilists_attributes(firewall_vip_data)
- filtered_data = underscore_to_hyphen(filter_firewall_vip_data(firewall_vip_data))
+ filtered_data = filter_firewall_vip_data(firewall_vip_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
# check_mode starts from here
if check_mode:
@@ -1453,7 +1535,7 @@ def firewall_vip(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vip", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vip", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vip", mkey=filtered_data["name"], vdom=vdom)
@@ -1827,7 +1909,18 @@ versioned_schema = {
"type": "string",
"options": [{"value": "half"}, {"value": "full"}],
},
- "ssl_certificate": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "ssl_certificate_dict": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"ssl_dh_bits": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -2257,6 +2350,27 @@ versioned_schema = {
"color": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"ipv6_mappedip": {"v_range": [["v7.0.1", ""]], "type": "string"},
"ipv6_mappedport": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "one_click_gslb_server": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "gslb_hostname": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "gslb_domain_name": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "gslb_public_ips": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "index": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ "required": True,
+ },
+ "ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "ssl_certificate": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
"http_supported_max_version": {
"v_range": [["v7.2.4", "v7.4.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip46.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip46.py
index 6eedf95d5..5abeb7d2a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip46.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip46.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -457,9 +457,8 @@ def firewall_vip46(data, fos, check_mode=False):
state = data["state"]
firewall_vip46_data = data["firewall_vip46"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_vip46_data(firewall_vip46_data)
- )
+ filtered_data = filter_firewall_vip46_data(firewall_vip46_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -523,7 +522,7 @@ def firewall_vip46(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vip46", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vip46", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vip46", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip6.py
index 916d93599..dc3343463 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -125,6 +125,20 @@ options:
description:
- Incoming port number range that you want to map to a port number range on the destination network.
type: str
+ h2_support:
+ description:
+ - Enable/disable HTTP2 support .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ h3_support:
+ description:
+ - Enable/disable HTTP3/QUIC support .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
http_cookie_age:
description:
- Time in minutes that client web browsers should keep a cookie. Default is 60 minutes. 0 = no time limit.
@@ -299,6 +313,49 @@ options:
- 'tcp'
- 'udp'
- 'sctp'
+ quic:
+ description:
+ - QUIC setting.
+ type: dict
+ suboptions:
+ ack_delay_exponent:
+ description:
+ - ACK delay exponent (1 - 20).
+ type: int
+ active_connection_id_limit:
+ description:
+ - Active connection ID limit (1 - 8).
+ type: int
+ active_migration:
+ description:
+ - Enable/disable active migration .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ grease_quic_bit:
+ description:
+ - Enable/disable grease QUIC bit .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ max_ack_delay:
+ description:
+ - Maximum ACK delay in milliseconds (1 - 16383).
+ type: int
+ max_datagram_frame_size:
+ description:
+ - Maximum datagram frame size in bytes (1 - 1500).
+ type: int
+ max_idle_timeout:
+ description:
+ - Maximum idle timeout milliseconds (1 - 60000).
+ type: int
+ max_udp_payload_size:
+ description:
+ - Maximum UDP payload size in bytes (1200 - 1500).
+ type: int
realservers:
description:
- Select the real servers that this server load balancing VIP will distribute traffic to.
@@ -418,6 +475,17 @@ options:
description:
- The name of the certificate to use for SSL handshake. Source vpn.certificate.local.name.
type: str
+ ssl_certificate_dict:
+ description:
+ - Name of the certificate to use for SSL handshake. Use the parameter ssl-certificate instead if the fortiOS firmwear <= 7.4.1
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Certificate list. Source vpn.certificate.local.name.
+ required: true
+ type: str
ssl_cipher_suites:
description:
- SSL/TLS cipher suites acceptable from a client, ordered by priority.
@@ -866,6 +934,8 @@ EXAMPLES = """
embedded_ipv4_address: "disable"
extip: "<your_own_value>"
extport: "<your_own_value>"
+ h2_support: "enable"
+ h3_support: "enable"
http_cookie_age: "60"
http_cookie_domain: "<your_own_value>"
http_cookie_domain_from_host: "disable"
@@ -877,7 +947,7 @@ EXAMPLES = """
http_multiplex: "enable"
http_redirect: "enable"
https_cookie_secure: "disable"
- id: "21"
+ id: "23"
ipv4_mappedip: "<your_own_value>"
ipv4_mappedport: "<your_own_value>"
ldb_method: "static"
@@ -886,8 +956,8 @@ EXAMPLES = """
max_embryonic_connections: "1000"
monitor:
-
- name: "default_name_29 (source firewall.ldb-monitor.name)"
- name: "default_name_30"
+ name: "default_name_31 (source firewall.ldb-monitor.name)"
+ name: "default_name_32"
nat_source_vip: "disable"
nat64: "disable"
nat66: "disable"
@@ -896,18 +966,27 @@ EXAMPLES = """
persistence: "none"
portforward: "disable"
protocol: "tcp"
+ quic:
+ ack_delay_exponent: "3"
+ active_connection_id_limit: "2"
+ active_migration: "enable"
+ grease_quic_bit: "enable"
+ max_ack_delay: "25"
+ max_datagram_frame_size: "1500"
+ max_idle_timeout: "30000"
+ max_udp_payload_size: "1500"
realservers:
-
client_ip: "<your_own_value>"
healthcheck: "disable"
holddown_interval: "300"
http_host: "myhostname"
- id: "44"
+ id: "55"
ip: "<your_own_value>"
max_connections: "0"
monitor:
-
- name: "default_name_48 (source firewall.ldb-monitor.name)"
+ name: "default_name_59 (source firewall.ldb-monitor.name)"
port: "0"
status: "active"
translate_host: "enable"
@@ -919,6 +998,9 @@ EXAMPLES = """
ssl_accept_ffdhe_groups: "enable"
ssl_algorithm: "high"
ssl_certificate: "<your_own_value> (source vpn.certificate.local.name)"
+ ssl_certificate_dict:
+ -
+ name: "default_name_71 (source vpn.certificate.local.name)"
ssl_cipher_suites:
-
cipher: "TLS-AES-128-GCM-SHA256"
@@ -1062,6 +1144,8 @@ def filter_firewall_vip6_data(json):
"embedded_ipv4_address",
"extip",
"extport",
+ "h2_support",
+ "h3_support",
"http_cookie_age",
"http_cookie_domain",
"http_cookie_domain_from_host",
@@ -1090,12 +1174,14 @@ def filter_firewall_vip6_data(json):
"persistence",
"portforward",
"protocol",
+ "quic",
"realservers",
"server_type",
"src_filter",
"ssl_accept_ffdhe_groups",
"ssl_algorithm",
"ssl_certificate",
+ "ssl_certificate_dict",
"ssl_cipher_suites",
"ssl_client_fallback",
"ssl_client_rekey_count",
@@ -1187,6 +1273,30 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"ssl-certificate-dict": "ssl-certificate"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def firewall_vip6(data, fos, check_mode=False):
vdom = data["vdom"]
@@ -1194,7 +1304,9 @@ def firewall_vip6(data, fos, check_mode=False):
firewall_vip6_data = data["firewall_vip6"]
firewall_vip6_data = flatten_multilists_attributes(firewall_vip6_data)
- filtered_data = underscore_to_hyphen(filter_firewall_vip6_data(firewall_vip6_data))
+ filtered_data = filter_firewall_vip6_data(firewall_vip6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
# check_mode starts from here
if check_mode:
@@ -1258,7 +1370,7 @@ def firewall_vip6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vip6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vip6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vip6", mkey=filtered_data["name"], vdom=vdom)
@@ -1391,6 +1503,47 @@ versioned_schema = {
{"value": "ssl-session-id"},
],
},
+ "h2_support": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "h3_support": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "quic": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "dict",
+ "children": {
+ "max_idle_timeout": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "max_udp_payload_size": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
+ "active_connection_id_limit": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
+ "ack_delay_exponent": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "max_ack_delay": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "max_datagram_frame_size": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
+ "active_migration": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "grease_quic_bit": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ },
+ },
"nat66": {
"v_range": [["v7.0.1", ""]],
"type": "string",
@@ -1510,7 +1663,18 @@ versioned_schema = {
"type": "string",
"options": [{"value": "half"}, {"value": "full"}],
},
- "ssl_certificate": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "ssl_certificate_dict": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"ssl_dh_bits": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -1944,6 +2108,7 @@ versioned_schema = {
},
"ipv4_mappedip": {"v_range": [["v7.0.1", ""]], "type": "string"},
"ipv4_mappedport": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "ssl_certificate": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
"arp_reply": {
"v_range": [["v6.0.0", "v7.0.7"], ["v7.2.0", "v7.2.2"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip64.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip64.py
index d184b9d33..2beb57f86 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip64.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vip64.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -442,9 +442,8 @@ def firewall_vip64(data, fos, check_mode=False):
state = data["state"]
firewall_vip64_data = data["firewall_vip64"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_vip64_data(firewall_vip64_data)
- )
+ filtered_data = filter_firewall_vip64_data(firewall_vip64_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -508,7 +507,7 @@ def firewall_vip64(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vip64", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vip64", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vip64", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp.py
index 3ab54edf5..3ac304e64 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -259,9 +259,8 @@ def firewall_vipgrp(data, fos, check_mode=False):
state = data["state"]
firewall_vipgrp_data = data["firewall_vipgrp"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_vipgrp_data(firewall_vipgrp_data)
- )
+ filtered_data = filter_firewall_vipgrp_data(firewall_vipgrp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -325,7 +324,7 @@ def firewall_vipgrp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vipgrp", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vipgrp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vipgrp", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp46.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp46.py
index 82b5d673f..09f81363c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp46.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp46.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,9 +254,8 @@ def firewall_vipgrp46(data, fos, check_mode=False):
state = data["state"]
firewall_vipgrp46_data = data["firewall_vipgrp46"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_vipgrp46_data(firewall_vipgrp46_data)
- )
+ filtered_data = filter_firewall_vipgrp46_data(firewall_vipgrp46_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -320,7 +319,7 @@ def firewall_vipgrp46(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vipgrp46", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vipgrp46", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vipgrp46", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp6.py
index d68662679..b3da61e19 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,9 +254,8 @@ def firewall_vipgrp6(data, fos, check_mode=False):
state = data["state"]
firewall_vipgrp6_data = data["firewall_vipgrp6"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_vipgrp6_data(firewall_vipgrp6_data)
- )
+ filtered_data = filter_firewall_vipgrp6_data(firewall_vipgrp6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -320,7 +319,7 @@ def firewall_vipgrp6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vipgrp6", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vipgrp6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vipgrp6", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp64.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp64.py
index f7057cd4f..315d3a6d5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp64.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_vipgrp64.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,9 +254,8 @@ def firewall_vipgrp64(data, fos, check_mode=False):
state = data["state"]
firewall_vipgrp64_data = data["firewall_vipgrp64"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_vipgrp64_data(firewall_vipgrp64_data)
- )
+ filtered_data = filter_firewall_vipgrp64_data(firewall_vipgrp64_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -320,7 +319,7 @@ def firewall_vipgrp64(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall", "vipgrp64", data=filtered_data, vdom=vdom)
+ return fos.set("firewall", "vipgrp64", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("firewall", "vipgrp64", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_custom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_custom.py
index a32fa7dcd..e4f609018 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_custom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_custom.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -253,9 +253,10 @@ def firewall_wildcard_fqdn_custom(data, fos, check_mode=False):
state = data["state"]
firewall_wildcard_fqdn_custom_data = data["firewall_wildcard_fqdn_custom"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_wildcard_fqdn_custom_data(firewall_wildcard_fqdn_custom_data)
+ filtered_data = filter_firewall_wildcard_fqdn_custom_data(
+ firewall_wildcard_fqdn_custom_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -322,7 +323,7 @@ def firewall_wildcard_fqdn_custom(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "firewall.wildcard-fqdn", "custom", data=filtered_data, vdom=vdom
+ "firewall.wildcard-fqdn", "custom", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_group.py
index 18bc8141d..a7f211883 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_firewall_wildcard_fqdn_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -262,9 +262,10 @@ def firewall_wildcard_fqdn_group(data, fos, check_mode=False):
state = data["state"]
firewall_wildcard_fqdn_group_data = data["firewall_wildcard_fqdn_group"]
- filtered_data = underscore_to_hyphen(
- filter_firewall_wildcard_fqdn_group_data(firewall_wildcard_fqdn_group_data)
+ filtered_data = filter_firewall_wildcard_fqdn_group_data(
+ firewall_wildcard_fqdn_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -328,7 +329,9 @@ def firewall_wildcard_fqdn_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("firewall.wildcard-fqdn", "group", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "firewall.wildcard-fqdn", "group", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ftp_proxy_explicit.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ftp_proxy_explicit.py
index 6cd4860de..8d11fb777 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ftp_proxy_explicit.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ftp_proxy_explicit.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -126,6 +126,17 @@ options:
description:
- Name of certificate for SSL connections to this server . Source certificate.local.name.
type: str
+ ssl_cert_dict:
+ description:
+ - List of certificate names to use for SSL connections to this server. Use the parameter ssl-cert if the fortiOS firmware version <= 7.4.1
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Certificate list. Source vpn.certificate.local.name.
+ required: true
+ type: str
ssl_dh_bits:
description:
- Bit-size of Diffie-Hellman (DH) prime used in DHE-RSA negotiation .
@@ -157,6 +168,9 @@ EXAMPLES = """
ssl: "enable"
ssl_algorithm: "high"
ssl_cert: "<your_own_value> (source certificate.local.name)"
+ ssl_cert_dict:
+ -
+ name: "default_name_12 (source vpn.certificate.local.name)"
ssl_dh_bits: "768"
status: "enable"
"""
@@ -250,6 +264,7 @@ def filter_ftp_proxy_explicit_data(json):
"ssl",
"ssl_algorithm",
"ssl_cert",
+ "ssl_cert_dict",
"ssl_dh_bits",
"status",
]
@@ -306,15 +321,39 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"ssl-cert-dict": "ssl-cert"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def ftp_proxy_explicit(data, fos):
vdom = data["vdom"]
ftp_proxy_explicit_data = data["ftp_proxy_explicit"]
ftp_proxy_explicit_data = flatten_multilists_attributes(ftp_proxy_explicit_data)
- filtered_data = underscore_to_hyphen(
- filter_ftp_proxy_explicit_data(ftp_proxy_explicit_data)
- )
+ filtered_data = filter_ftp_proxy_explicit_data(ftp_proxy_explicit_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
- return fos.set("ftp-proxy", "explicit", data=filtered_data, vdom=vdom)
+ return fos.set("ftp-proxy", "explicit", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -377,7 +416,18 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "ssl_cert": {"v_range": [["v6.2.0", ""]], "type": "string"},
+ "ssl_cert_dict": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"ssl_dh_bits": {
"v_range": [["v6.2.0", ""]],
"type": "string",
@@ -393,6 +443,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "high"}, {"value": "medium"}, {"value": "low"}],
},
+ "ssl_cert": {"v_range": [["v6.2.0", "v7.4.1"]], "type": "string"},
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn.py
index e307af936..b055c52ad 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -230,7 +230,8 @@ def gtp_apn(data, fos, check_mode=False):
state = data["state"]
gtp_apn_data = data["gtp_apn"]
- filtered_data = underscore_to_hyphen(filter_gtp_apn_data(gtp_apn_data))
+ filtered_data = filter_gtp_apn_data(gtp_apn_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -294,7 +295,7 @@ def gtp_apn(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("gtp", "apn", data=filtered_data, vdom=vdom)
+ return fos.set("gtp", "apn", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("gtp", "apn", mkey=filtered_data["name"], vdom=vdom)
@@ -336,16 +337,16 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"apn": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn_shaper.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn_shaper.py
index 2bac6ddd7..9cbc9ddea 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn_shaper.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apn_shaper.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -259,9 +259,8 @@ def gtp_apn_shaper(data, fos, check_mode=False):
state = data["state"]
gtp_apn_shaper_data = data["gtp_apn_shaper"]
- filtered_data = underscore_to_hyphen(
- filter_gtp_apn_shaper_data(gtp_apn_shaper_data)
- )
+ filtered_data = filter_gtp_apn_shaper_data(gtp_apn_shaper_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -325,7 +324,7 @@ def gtp_apn_shaper(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("gtp", "apn-shaper", data=filtered_data, vdom=vdom)
+ return fos.set("gtp", "apn-shaper", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("gtp", "apn-shaper", mkey=filtered_data["id"], vdom=vdom)
@@ -367,7 +366,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
"required": True,
},
@@ -376,28 +375,32 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.2.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"required": True,
}
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"rate_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"action": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "drop"}, {"value": "reject"}],
},
"back_off_time": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apngrp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apngrp.py
index 91980c3d2..9750d1506 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apngrp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_apngrp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -239,7 +239,8 @@ def gtp_apngrp(data, fos, check_mode=False):
state = data["state"]
gtp_apngrp_data = data["gtp_apngrp"]
- filtered_data = underscore_to_hyphen(filter_gtp_apngrp_data(gtp_apngrp_data))
+ filtered_data = filter_gtp_apngrp_data(gtp_apngrp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -303,7 +304,7 @@ def gtp_apngrp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("gtp", "apngrp", data=filtered_data, vdom=vdom)
+ return fos.set("gtp", "apngrp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("gtp", "apngrp", mkey=filtered_data["name"], vdom=vdom)
@@ -345,7 +346,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
@@ -354,15 +355,19 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"required": True,
}
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_allow_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_allow_list.py
index fbcc7cccb..86c552a00 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_allow_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_allow_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,9 +235,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -246,8 +246,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -263,10 +266,8 @@ def gtp_ie_allow_list(data, fos):
state = data["state"]
gtp_ie_allow_list_data = data["gtp_ie_allow_list"]
- filtered_data = underscore_to_hyphen(
- filter_gtp_ie_allow_list_data(gtp_ie_allow_list_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_gtp_ie_allow_list_data(gtp_ie_allow_list_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
if state == "present" or state is True:
return fos.set("gtp", "ie-allow-list", data=converted_data, vdom=vdom)
@@ -310,7 +311,7 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
@@ -319,23 +320,35 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v7.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
},
"ie": {
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v7.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"fos_message": {
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v7.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
},
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
},
- "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_white_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_white_list.py
index 91f819d3f..57c47d986 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_white_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_ie_white_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -244,9 +244,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -255,8 +255,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -272,10 +275,8 @@ def gtp_ie_white_list(data, fos, check_mode=False):
state = data["state"]
gtp_ie_white_list_data = data["gtp_ie_white_list"]
- filtered_data = underscore_to_hyphen(
- filter_gtp_ie_white_list_data(gtp_ie_white_list_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_gtp_ie_white_list_data(gtp_ie_white_list_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v0v1.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v0v1.py
index be87b955d..02373cde9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v0v1.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v0v1.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -566,9 +566,8 @@ def gtp_message_filter_v0v1(data, fos, check_mode=False):
state = data["state"]
gtp_message_filter_v0v1_data = data["gtp_message_filter_v0v1"]
- filtered_data = underscore_to_hyphen(
- filter_gtp_message_filter_v0v1_data(gtp_message_filter_v0v1_data)
- )
+ filtered_data = filter_gtp_message_filter_v0v1_data(gtp_message_filter_v0v1_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -632,7 +631,7 @@ def gtp_message_filter_v0v1(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("gtp", "message-filter-v0v1", data=filtered_data, vdom=vdom)
+ return fos.set("gtp", "message-filter-v0v1", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -676,12 +675,12 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"unknown_message": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
@@ -690,190 +689,194 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
}
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"echo": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"version_not_support": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"node_alive": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"redirection": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"create_pdp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"update_pdp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_pdp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"v0_create_aa_pdp__v1_init_pdp_ctx": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_aa_pdp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"error_indication": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"pdu_notification": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"support_extension": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"send_route": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"failure_report": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"note_ms_present": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"identification": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"sgsn_context": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"fwd_relocation": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"relocation_cancel": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"fwd_srns_context": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"ue_registration_query": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"ran_info": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_notification": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"create_mbms": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"update_mbms": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_mbms": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_registration": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_de_registration": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_session_start": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_session_stop": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_session_update": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"ms_info_change_notif": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"data_record": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"end_marker": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"gtp_pdu": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v2.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v2.py
index db35de0e6..26ef6d2d8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v2.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_message_filter_v2.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -665,9 +665,8 @@ def gtp_message_filter_v2(data, fos, check_mode=False):
state = data["state"]
gtp_message_filter_v2_data = data["gtp_message_filter_v2"]
- filtered_data = underscore_to_hyphen(
- filter_gtp_message_filter_v2_data(gtp_message_filter_v2_data)
- )
+ filtered_data = filter_gtp_message_filter_v2_data(gtp_message_filter_v2_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -731,7 +730,7 @@ def gtp_message_filter_v2(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("gtp", "message-filter-v2", data=filtered_data, vdom=vdom)
+ return fos.set("gtp", "message-filter-v2", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -775,12 +774,12 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"unknown_message": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
@@ -789,245 +788,249 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
}
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"echo": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"version_not_support": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"create_session": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"modify_bearer_req_resp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_session": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"change_notification": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"remote_ue_report_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"modify_bearer_cmd_fail": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_bearer_cmd_fail": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"bearer_resource_cmd_fail": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"dlink_notif_failure": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"trace_session": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"stop_paging_indication": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"create_bearer": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"update_bearer": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_bearer_req_resp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_pdn_connection_set": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"pgw_dlink_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"identification_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"context_req_res_ack": {
- "v_range": [["v7.0.2", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.2", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"forward_relocation_req_res": {
- "v_range": [["v7.0.2", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.2", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"forward_relocation_cmp_notif_ack": {
- "v_range": [["v7.0.2", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.2", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"forward_access_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"relocation_cancel_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"configuration_transfer_tunnel": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"detach_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"cs_paging": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"ran_info_relay": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"alert_mme_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"ue_activity_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"isr_status": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"ue_registration_query_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"create_forwarding_tunnel_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"suspend": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"resume": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"create_indirect_forwarding_tunnel_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"delete_indirect_forwarding_tunnel_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"release_access_bearer_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"dlink_data_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"reserved_for_earlier_version": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"pgw_restart_notif_ack": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"update_pdn_connection_set": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"modify_access_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_session_start_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_session_update_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"mbms_session_stop_req_resp": {
- "v_range": [["v7.2.1", "v7.2.4"]],
+ "v_range": [["v7.2.1", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_rat_timeout_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_rat_timeout_profile.py
index cba847d32..9167141ed 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_rat_timeout_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_rat_timeout_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,12 +278,11 @@ def gtp_rat_timeout_profile(data, fos):
state = data["state"]
gtp_rat_timeout_profile_data = data["gtp_rat_timeout_profile"]
- filtered_data = underscore_to_hyphen(
- filter_gtp_rat_timeout_profile_data(gtp_rat_timeout_profile_data)
- )
+ filtered_data = filter_gtp_rat_timeout_profile_data(gtp_rat_timeout_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("gtp", "rat-timeout-profile", data=filtered_data, vdom=vdom)
+ return fos.set("gtp", "rat-timeout-profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -326,52 +325,52 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"utran_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"geran_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"wlan_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"gan_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"hspa_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"eutran_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"virtual_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"nbiot_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"ltem_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"nr_timeout": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
},
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_tunnel_limit.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_tunnel_limit.py
index 9e675ba64..16184b978 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_tunnel_limit.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_gtp_tunnel_limit.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -230,9 +230,8 @@ def gtp_tunnel_limit(data, fos, check_mode=False):
state = data["state"]
gtp_tunnel_limit_data = data["gtp_tunnel_limit"]
- filtered_data = underscore_to_hyphen(
- filter_gtp_tunnel_limit_data(gtp_tunnel_limit_data)
- )
+ filtered_data = filter_gtp_tunnel_limit_data(gtp_tunnel_limit_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -296,7 +295,7 @@ def gtp_tunnel_limit(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("gtp", "tunnel-limit", data=filtered_data, vdom=vdom)
+ return fos.set("gtp", "tunnel-limit", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("gtp", "tunnel-limit", mkey=filtered_data["name"], vdom=vdom)
@@ -338,16 +337,16 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"tunnel_limit": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
},
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_nic.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_nic.py
index 4e56d4591..07dbc3ab9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_nic.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_nic.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<nic>": "nic"}
+ speciallist = {"<nic>": "nic"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,8 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def hardware_nic(data, fos):
vdom = data["vdom"]
hardware_nic_data = data["hardware_nic"]
- filtered_data = underscore_to_hyphen(filter_hardware_nic_data(hardware_nic_data))
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_hardware_nic_data(hardware_nic_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("hardware", "nic", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_dce.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_dce.py
index 10e399dfe..4e7a16b40 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_dce.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_dce.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<dev_id>": "dev_id"}
+ speciallist = {"<dev_id>": "dev_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def hardware_npu_np6_dce(data, fos):
vdom = data["vdom"]
hardware_npu_np6_dce_data = data["hardware_npu_np6_dce"]
- filtered_data = underscore_to_hyphen(
- filter_hardware_npu_np6_dce_data(hardware_npu_np6_dce_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_hardware_npu_np6_dce_data(hardware_npu_np6_dce_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("hardware.npu.np6", "dce", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_session_stats.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_session_stats.py
index 04b3cf2d8..45d049ca4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_session_stats.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_session_stats.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<dev_id>": "dev_id"}
+ speciallist = {"<dev_id>": "dev_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def hardware_npu_np6_session_stats(data, fos):
vdom = data["vdom"]
hardware_npu_np6_session_stats_data = data["hardware_npu_np6_session_stats"]
- filtered_data = underscore_to_hyphen(
- filter_hardware_npu_np6_session_stats_data(hardware_npu_np6_session_stats_data)
+ filtered_data = filter_hardware_npu_np6_session_stats_data(
+ hardware_npu_np6_session_stats_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("hardware.npu.np6", "session-stats", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_sse_stats.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_sse_stats.py
index 77da4fe6a..19bbd4c26 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_sse_stats.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_hardware_npu_np6_sse_stats.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<dev_id>": "dev_id"}
+ speciallist = {"<dev_id>": "dev_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def hardware_npu_np6_sse_stats(data, fos):
vdom = data["vdom"]
hardware_npu_np6_sse_stats_data = data["hardware_npu_np6_sse_stats"]
- filtered_data = underscore_to_hyphen(
- filter_hardware_npu_np6_sse_stats_data(hardware_npu_np6_sse_stats_data)
+ filtered_data = filter_hardware_npu_np6_sse_stats_data(
+ hardware_npu_np6_sse_stats_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("hardware.npu.np6", "sse-stats", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_profile.py
index 1d08a301a..ea1cbeb93 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -576,9 +576,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"204_response": "response_204", "204_size_limit": "size_limit_204"}
+ speciallist = {"204_response": "response_204", "204_size_limit": "size_limit_204"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -587,8 +587,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -605,8 +608,8 @@ def icap_profile(data, fos, check_mode=False):
icap_profile_data = data["icap_profile"]
icap_profile_data = flatten_multilists_attributes(icap_profile_data)
- filtered_data = underscore_to_hyphen(filter_icap_profile_data(icap_profile_data))
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_icap_profile_data(icap_profile_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server.py
index 905bd3464..4ed1fe1fa 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -307,7 +307,8 @@ def icap_server(data, fos, check_mode=False):
state = data["state"]
icap_server_data = data["icap_server"]
- filtered_data = underscore_to_hyphen(filter_icap_server_data(icap_server_data))
+ filtered_data = filter_icap_server_data(icap_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -371,7 +372,7 @@ def icap_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("icap", "server", data=filtered_data, vdom=vdom)
+ return fos.set("icap", "server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("icap", "server", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server_group.py
index 4d55bacf1..d18165ea5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_icap_server_group.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -245,12 +245,11 @@ def icap_server_group(data, fos):
state = data["state"]
icap_server_group_data = data["icap_server_group"]
- filtered_data = underscore_to_hyphen(
- filter_icap_server_group_data(icap_server_group_data)
- )
+ filtered_data = filter_icap_server_group_data(icap_server_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("icap", "server-group", data=filtered_data, vdom=vdom)
+ return fos.set("icap", "server-group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("icap", "server-group", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_custom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_custom.py
index 85dea7158..980e4ccbb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_custom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_custom.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -352,7 +352,8 @@ def ips_custom(data, fos, check_mode=False):
ips_custom_data = data["ips_custom"]
ips_custom_data = flatten_multilists_attributes(ips_custom_data)
- filtered_data = underscore_to_hyphen(filter_ips_custom_data(ips_custom_data))
+ filtered_data = filter_ips_custom_data(ips_custom_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -416,7 +417,7 @@ def ips_custom(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("ips", "custom", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "custom", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("ips", "custom", mkey=filtered_data["tag"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_decoder.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_decoder.py
index 07ff2219b..7b135f6d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_decoder.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_decoder.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -244,7 +244,8 @@ def ips_decoder(data, fos, check_mode=False):
state = data["state"]
ips_decoder_data = data["ips_decoder"]
- filtered_data = underscore_to_hyphen(filter_ips_decoder_data(ips_decoder_data))
+ filtered_data = filter_ips_decoder_data(ips_decoder_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -308,7 +309,7 @@ def ips_decoder(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("ips", "decoder", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "decoder", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("ips", "decoder", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_global.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_global.py
index dfb46e8db..d8d8c9464 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_global.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_global.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -87,6 +87,11 @@ options:
choices:
- 'periodical'
- 'continuous'
+ av_mem_limit:
+ description:
+ - Maximum percentage of system memory allowed for use on AV scanning (10 - 50). To disable set to zero. When disabled, there is no limit
+ on the AV memory usage.
+ type: int
cp_accel_mode:
description:
- IPS Pattern matching acceleration/offloading to CPx processors.
@@ -227,6 +232,7 @@ EXAMPLES = """
vdom: "{{ vdom }}"
ips_global:
anomaly_mode: "periodical"
+ av_mem_limit: "0"
cp_accel_mode: "none"
database: "regular"
deep_app_insp_db_limit: "0"
@@ -334,6 +340,7 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post
def filter_ips_global_data(json):
option_list = [
"anomaly_mode",
+ "av_mem_limit",
"cp_accel_mode",
"database",
"deep_app_insp_db_limit",
@@ -380,9 +387,10 @@ def underscore_to_hyphen(data):
def ips_global(data, fos):
vdom = data["vdom"]
ips_global_data = data["ips_global"]
- filtered_data = underscore_to_hyphen(filter_ips_global_data(ips_global_data))
+ filtered_data = filter_ips_global_data(ips_global_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("ips", "global", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "global", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -462,6 +470,7 @@ versioned_schema = {
},
"packet_log_queue_depth": {"v_range": [["v6.2.7", ""]], "type": "integer"},
"ngfw_max_scan_range": {"v_range": [["v6.4.4", ""]], "type": "integer"},
+ "av_mem_limit": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"tls_active_probe": {
"v_range": [["v6.2.7", "v6.2.7"], ["v6.4.4", ""]],
"type": "dict",
@@ -499,7 +508,7 @@ versioned_schema = {
"options": [{"value": "none"}, {"value": "basic"}],
},
"ips_reserve_cpu": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule.py
index dba44c177..5f4c8e953 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -373,7 +373,8 @@ def ips_rule(data, fos, check_mode=False):
ips_rule_data = data["ips_rule"]
ips_rule_data = flatten_multilists_attributes(ips_rule_data)
- filtered_data = underscore_to_hyphen(filter_ips_rule_data(ips_rule_data))
+ filtered_data = filter_ips_rule_data(ips_rule_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -437,7 +438,7 @@ def ips_rule(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("ips", "rule", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "rule", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("ips", "rule", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule_settings.py
index 833997f50..741cb84fb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_rule_settings.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -227,9 +227,8 @@ def ips_rule_settings(data, fos, check_mode=False):
state = data["state"]
ips_rule_settings_data = data["ips_rule_settings"]
- filtered_data = underscore_to_hyphen(
- filter_ips_rule_settings_data(ips_rule_settings_data)
- )
+ filtered_data = filter_ips_rule_settings_data(ips_rule_settings_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -293,7 +292,7 @@ def ips_rule_settings(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("ips", "rule-settings", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "rule-settings", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("ips", "rule-settings", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_sensor.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_sensor.py
index 6327156b8..216a0c57e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_sensor.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_sensor.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -718,7 +718,8 @@ def ips_sensor(data, fos, check_mode=False):
ips_sensor_data = data["ips_sensor"]
ips_sensor_data = flatten_multilists_attributes(ips_sensor_data)
- filtered_data = underscore_to_hyphen(filter_ips_sensor_data(ips_sensor_data))
+ filtered_data = filter_ips_sensor_data(ips_sensor_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -782,7 +783,7 @@ def ips_sensor(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("ips", "sensor", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "sensor", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("ips", "sensor", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_settings.py
index ee1f86b2f..47fca1bfe 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -96,6 +96,13 @@ options:
description:
- Number of packets to log after the IPS signature is detected (0 - 255).
type: int
+ proxy_inline_ips:
+ description:
+ - Enable/disable proxy-mode policy inline IPS support.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
"""
EXAMPLES = """
@@ -107,6 +114,7 @@ EXAMPLES = """
packet_log_history: "1"
packet_log_memory: "256"
packet_log_post_attack: "0"
+ proxy_inline_ips: "disable"
"""
RETURN = """
@@ -194,6 +202,7 @@ def filter_ips_settings_data(json):
"packet_log_history",
"packet_log_memory",
"packet_log_post_attack",
+ "proxy_inline_ips",
]
json = remove_invalid_fields(json)
@@ -222,9 +231,10 @@ def underscore_to_hyphen(data):
def ips_settings(data, fos):
vdom = data["vdom"]
ips_settings_data = data["ips_settings"]
- filtered_data = underscore_to_hyphen(filter_ips_settings_data(ips_settings_data))
+ filtered_data = filter_ips_settings_data(ips_settings_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("ips", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -263,6 +273,11 @@ versioned_schema = {
"packet_log_post_attack": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"packet_log_memory": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"ips_packet_quota": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "proxy_inline_ips": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_view_map.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_view_map.py
index dd1460ee9..72980ef6d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_view_map.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ips_view_map.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -255,7 +255,8 @@ def ips_view_map(data, fos, check_mode=False):
state = data["state"]
ips_view_map_data = data["ips_view_map"]
- filtered_data = underscore_to_hyphen(filter_ips_view_map_data(ips_view_map_data))
+ filtered_data = filter_ips_view_map_data(ips_view_map_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -319,7 +320,7 @@ def ips_view_map(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("ips", "view-map", data=filtered_data, vdom=vdom)
+ return fos.set("ips", "view-map", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("ips", "view-map", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_custom_field.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_custom_field.py
index f0c480c6c..45f6a35df 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_custom_field.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_custom_field.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,9 +235,8 @@ def log_custom_field(data, fos, check_mode=False):
state = data["state"]
log_custom_field_data = data["log_custom_field"]
- filtered_data = underscore_to_hyphen(
- filter_log_custom_field_data(log_custom_field_data)
- )
+ filtered_data = filter_log_custom_field_data(log_custom_field_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -301,7 +300,7 @@ def log_custom_field(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("log", "custom-field", data=filtered_data, vdom=vdom)
+ return fos.set("log", "custom-field", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("log", "custom-field", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_filter.py
index 8dd65297b..854cce9f8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_filter.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -148,6 +148,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -386,13 +393,14 @@ EXAMPLES = """
event: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "18"
+ id: "19"
gtp: "enable"
ha: "enable"
ipsec: "enable"
@@ -510,6 +518,7 @@ def filter_log_disk_filter_data(json):
"event",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -564,11 +573,10 @@ def underscore_to_hyphen(data):
def log_disk_filter(data, fos):
vdom = data["vdom"]
log_disk_filter_data = data["log_disk_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_disk_filter_data(log_disk_filter_data)
- )
+ filtered_data = filter_log_disk_filter_data(log_disk_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.disk", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.disk", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -653,15 +661,23 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"dlp_archive": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"gtp": {
"v_range": [["v6.0.0", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_setting.py
index e23fba23e..20e43407e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_disk_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -475,11 +475,10 @@ def log_disk_setting(data, fos):
vdom = data["vdom"]
log_disk_setting_data = data["log_disk_setting"]
log_disk_setting_data = flatten_multilists_attributes(log_disk_setting_data)
- filtered_data = underscore_to_hyphen(
- filter_log_disk_setting_data(log_disk_setting_data)
- )
+ filtered_data = filter_log_disk_setting_data(log_disk_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.disk", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.disk", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -557,7 +556,10 @@ versioned_schema = {
},
"log_quota": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"dlp_archive_quota": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "report_quota": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "report_quota": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
"maximum_log_age": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"upload": {
"v_range": [["v6.0.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_eventfilter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_eventfilter.py
index 5327dfac0..a11c29418 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_eventfilter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_eventfilter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -360,11 +360,10 @@ def underscore_to_hyphen(data):
def log_eventfilter(data, fos):
vdom = data["vdom"]
log_eventfilter_data = data["log_eventfilter"]
- filtered_data = underscore_to_hyphen(
- filter_log_eventfilter_data(log_eventfilter_data)
- )
+ filtered_data = filter_log_eventfilter_data(log_eventfilter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log", "eventfilter", data=filtered_data, vdom=vdom)
+ return fos.set("log", "eventfilter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_filter.py
index 2a1e904fc..3e3b44ba8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortianalyzer2_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -392,11 +401,12 @@ def underscore_to_hyphen(data):
def log_fortianalyzer2_filter(data, fos):
vdom = data["vdom"]
log_fortianalyzer2_filter_data = data["log_fortianalyzer2_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer2_filter_data(log_fortianalyzer2_filter_data)
+ filtered_data = filter_log_fortianalyzer2_filter_data(
+ log_fortianalyzer2_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer2", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer2", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -492,6 +502,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_filter.py
index fd0afd893..8b78e11b1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -224,13 +231,14 @@ EXAMPLES = """
dlp_archive: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -325,6 +333,7 @@ def filter_log_fortianalyzer2_override_filter_data(json):
"dlp_archive",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -362,14 +371,13 @@ def underscore_to_hyphen(data):
def log_fortianalyzer2_override_filter(data, fos):
vdom = data["vdom"]
log_fortianalyzer2_override_filter_data = data["log_fortianalyzer2_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer2_override_filter_data(
- log_fortianalyzer2_override_filter_data
- )
+ filtered_data = filter_log_fortianalyzer2_override_filter_data(
+ log_fortianalyzer2_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer2", "override-filter", data=filtered_data, vdom=vdom
+ "log.fortianalyzer2", "override-filter", data=converted_data, vdom=vdom
)
@@ -466,6 +474,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_setting.py
index fa57164d2..88290a61b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -211,6 +211,10 @@ options:
description:
- The remote FortiAnalyzer.
type: str
+ server_cert_ca:
+ description:
+ - Mandatory CA on FortiGate in certificate chain of server. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
source_ip:
description:
- Source IPv4 or IPv6 address used to communicate with FortiAnalyzer.
@@ -297,6 +301,7 @@ EXAMPLES = """
-
name: "default_name_25"
server: "192.168.100.40"
+ server_cert_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
source_ip: "84.230.14.43"
ssl_min_proto_version: "default"
status: "enable"
@@ -411,6 +416,7 @@ def filter_log_fortianalyzer2_override_setting_data(json):
"reliable",
"serial",
"server",
+ "server_cert_ca",
"source_ip",
"ssl_min_proto_version",
"status",
@@ -449,14 +455,13 @@ def log_fortianalyzer2_override_setting(data, fos):
log_fortianalyzer2_override_setting_data = data[
"log_fortianalyzer2_override_setting"
]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer2_override_setting_data(
- log_fortianalyzer2_override_setting_data
- )
+ filtered_data = filter_log_fortianalyzer2_override_setting_data(
+ log_fortianalyzer2_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer2", "override-setting", data=filtered_data, vdom=vdom
+ "log.fortianalyzer2", "override-setting", data=converted_data, vdom=vdom
)
@@ -533,6 +538,7 @@ versioned_schema = {
},
"v_range": [["v6.2.0", ""]],
},
+ "server_cert_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"preshared_key": {"v_range": [["v7.0.0", ""]], "type": "string"},
"access_config": {
"v_range": [["v6.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_setting.py
index 49a856256..60b247eb8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer2_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -204,6 +204,10 @@ options:
description:
- The remote FortiAnalyzer.
type: str
+ server_cert_ca:
+ description:
+ - Mandatory CA on FortiGate in certificate chain of server. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
source_ip:
description:
- Source IPv4 or IPv6 address used to communicate with FortiAnalyzer.
@@ -282,6 +286,7 @@ EXAMPLES = """
-
name: "default_name_24"
server: "192.168.100.40"
+ server_cert_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
source_ip: "84.230.14.43"
ssl_min_proto_version: "default"
status: "enable"
@@ -394,6 +399,7 @@ def filter_log_fortianalyzer2_setting_data(json):
"reliable",
"serial",
"server",
+ "server_cert_ca",
"source_ip",
"ssl_min_proto_version",
"status",
@@ -429,11 +435,12 @@ def underscore_to_hyphen(data):
def log_fortianalyzer2_setting(data, fos):
vdom = data["vdom"]
log_fortianalyzer2_setting_data = data["log_fortianalyzer2_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer2_setting_data(log_fortianalyzer2_setting_data)
+ filtered_data = filter_log_fortianalyzer2_setting_data(
+ log_fortianalyzer2_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer2", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer2", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -504,6 +511,7 @@ versioned_schema = {
},
"v_range": [["v6.2.0", ""]],
},
+ "server_cert_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"preshared_key": {"v_range": [["v7.0.0", ""]], "type": "string"},
"access_config": {
"v_range": [["v6.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_filter.py
index c57dd5685..f900cfec0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortianalyzer3_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -392,11 +401,12 @@ def underscore_to_hyphen(data):
def log_fortianalyzer3_filter(data, fos):
vdom = data["vdom"]
log_fortianalyzer3_filter_data = data["log_fortianalyzer3_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer3_filter_data(log_fortianalyzer3_filter_data)
+ filtered_data = filter_log_fortianalyzer3_filter_data(
+ log_fortianalyzer3_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer3", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer3", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -492,6 +502,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_filter.py
index 35edeeee7..9cf151b62 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -224,13 +231,14 @@ EXAMPLES = """
dlp_archive: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -325,6 +333,7 @@ def filter_log_fortianalyzer3_override_filter_data(json):
"dlp_archive",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -362,14 +371,13 @@ def underscore_to_hyphen(data):
def log_fortianalyzer3_override_filter(data, fos):
vdom = data["vdom"]
log_fortianalyzer3_override_filter_data = data["log_fortianalyzer3_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer3_override_filter_data(
- log_fortianalyzer3_override_filter_data
- )
+ filtered_data = filter_log_fortianalyzer3_override_filter_data(
+ log_fortianalyzer3_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer3", "override-filter", data=filtered_data, vdom=vdom
+ "log.fortianalyzer3", "override-filter", data=converted_data, vdom=vdom
)
@@ -466,6 +474,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_setting.py
index d02478afd..10ff41c88 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -211,6 +211,10 @@ options:
description:
- The remote FortiAnalyzer.
type: str
+ server_cert_ca:
+ description:
+ - Mandatory CA on FortiGate in certificate chain of server. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
source_ip:
description:
- Source IPv4 or IPv6 address used to communicate with FortiAnalyzer.
@@ -297,6 +301,7 @@ EXAMPLES = """
-
name: "default_name_25"
server: "192.168.100.40"
+ server_cert_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
source_ip: "84.230.14.43"
ssl_min_proto_version: "default"
status: "enable"
@@ -411,6 +416,7 @@ def filter_log_fortianalyzer3_override_setting_data(json):
"reliable",
"serial",
"server",
+ "server_cert_ca",
"source_ip",
"ssl_min_proto_version",
"status",
@@ -449,14 +455,13 @@ def log_fortianalyzer3_override_setting(data, fos):
log_fortianalyzer3_override_setting_data = data[
"log_fortianalyzer3_override_setting"
]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer3_override_setting_data(
- log_fortianalyzer3_override_setting_data
- )
+ filtered_data = filter_log_fortianalyzer3_override_setting_data(
+ log_fortianalyzer3_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer3", "override-setting", data=filtered_data, vdom=vdom
+ "log.fortianalyzer3", "override-setting", data=converted_data, vdom=vdom
)
@@ -533,6 +538,7 @@ versioned_schema = {
},
"v_range": [["v6.2.0", ""]],
},
+ "server_cert_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"preshared_key": {"v_range": [["v7.0.0", ""]], "type": "string"},
"access_config": {
"v_range": [["v6.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_setting.py
index 9ad3075c8..8bf654806 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer3_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -204,6 +204,10 @@ options:
description:
- The remote FortiAnalyzer.
type: str
+ server_cert_ca:
+ description:
+ - Mandatory CA on FortiGate in certificate chain of server. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
source_ip:
description:
- Source IPv4 or IPv6 address used to communicate with FortiAnalyzer.
@@ -282,6 +286,7 @@ EXAMPLES = """
-
name: "default_name_24"
server: "192.168.100.40"
+ server_cert_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
source_ip: "84.230.14.43"
ssl_min_proto_version: "default"
status: "enable"
@@ -394,6 +399,7 @@ def filter_log_fortianalyzer3_setting_data(json):
"reliable",
"serial",
"server",
+ "server_cert_ca",
"source_ip",
"ssl_min_proto_version",
"status",
@@ -429,11 +435,12 @@ def underscore_to_hyphen(data):
def log_fortianalyzer3_setting(data, fos):
vdom = data["vdom"]
log_fortianalyzer3_setting_data = data["log_fortianalyzer3_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer3_setting_data(log_fortianalyzer3_setting_data)
+ filtered_data = filter_log_fortianalyzer3_setting_data(
+ log_fortianalyzer3_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer3", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer3", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -504,6 +511,7 @@ versioned_schema = {
},
"v_range": [["v6.2.0", ""]],
},
+ "server_cert_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"preshared_key": {"v_range": [["v7.0.0", ""]], "type": "string"},
"access_config": {
"v_range": [["v6.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_filter.py
index 51e23edca..b5757076c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortianalyzer_cloud_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -392,11 +401,12 @@ def underscore_to_hyphen(data):
def log_fortianalyzer_cloud_filter(data, fos):
vdom = data["vdom"]
log_fortianalyzer_cloud_filter_data = data["log_fortianalyzer_cloud_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_cloud_filter_data(log_fortianalyzer_cloud_filter_data)
+ filtered_data = filter_log_fortianalyzer_cloud_filter_data(
+ log_fortianalyzer_cloud_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer-cloud", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer-cloud", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -492,6 +502,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_filter.py
index 6e14e276f..8104a7893 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortianalyzer_cloud_override_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -394,14 +403,13 @@ def log_fortianalyzer_cloud_override_filter(data, fos):
log_fortianalyzer_cloud_override_filter_data = data[
"log_fortianalyzer_cloud_override_filter"
]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_cloud_override_filter_data(
- log_fortianalyzer_cloud_override_filter_data
- )
+ filtered_data = filter_log_fortianalyzer_cloud_override_filter_data(
+ log_fortianalyzer_cloud_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer-cloud", "override-filter", data=filtered_data, vdom=vdom
+ "log.fortianalyzer-cloud", "override-filter", data=converted_data, vdom=vdom
)
@@ -498,6 +506,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_setting.py
index 3f0d0bf4f..1c2d8ecfb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -220,14 +220,13 @@ def log_fortianalyzer_cloud_override_setting(data, fos):
log_fortianalyzer_cloud_override_setting_data = data[
"log_fortianalyzer_cloud_override_setting"
]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_cloud_override_setting_data(
- log_fortianalyzer_cloud_override_setting_data
- )
+ filtered_data = filter_log_fortianalyzer_cloud_override_setting_data(
+ log_fortianalyzer_cloud_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer-cloud", "override-setting", data=filtered_data, vdom=vdom
+ "log.fortianalyzer-cloud", "override-setting", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_setting.py
index 097126848..26eaef91e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_cloud_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -399,13 +399,12 @@ def underscore_to_hyphen(data):
def log_fortianalyzer_cloud_setting(data, fos):
vdom = data["vdom"]
log_fortianalyzer_cloud_setting_data = data["log_fortianalyzer_cloud_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_cloud_setting_data(
- log_fortianalyzer_cloud_setting_data
- )
+ filtered_data = filter_log_fortianalyzer_cloud_setting_data(
+ log_fortianalyzer_cloud_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer-cloud", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer-cloud", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_filter.py
index f1c145d44..6194d0ccf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortianalyzer_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -392,11 +401,10 @@ def underscore_to_hyphen(data):
def log_fortianalyzer_filter(data, fos):
vdom = data["vdom"]
log_fortianalyzer_filter_data = data["log_fortianalyzer_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_filter_data(log_fortianalyzer_filter_data)
- )
+ filtered_data = filter_log_fortianalyzer_filter_data(log_fortianalyzer_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -492,6 +500,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_filter.py
index ebdb97d76..34b68a7b9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortianalyzer_override_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -392,14 +401,13 @@ def underscore_to_hyphen(data):
def log_fortianalyzer_override_filter(data, fos):
vdom = data["vdom"]
log_fortianalyzer_override_filter_data = data["log_fortianalyzer_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_override_filter_data(
- log_fortianalyzer_override_filter_data
- )
+ filtered_data = filter_log_fortianalyzer_override_filter_data(
+ log_fortianalyzer_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer", "override-filter", data=filtered_data, vdom=vdom
+ "log.fortianalyzer", "override-filter", data=converted_data, vdom=vdom
)
@@ -496,6 +504,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_setting.py
index 2dd019c73..04dae34a7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -211,6 +211,10 @@ options:
description:
- The remote FortiAnalyzer.
type: str
+ server_cert_ca:
+ description:
+ - Mandatory CA on FortiGate in certificate chain of server. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
source_ip:
description:
- Source IPv4 or IPv6 address used to communicate with FortiAnalyzer.
@@ -297,6 +301,7 @@ EXAMPLES = """
-
name: "default_name_25"
server: "192.168.100.40"
+ server_cert_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
source_ip: "84.230.14.43"
ssl_min_proto_version: "default"
status: "enable"
@@ -411,6 +416,7 @@ def filter_log_fortianalyzer_override_setting_data(json):
"reliable",
"serial",
"server",
+ "server_cert_ca",
"source_ip",
"ssl_min_proto_version",
"status",
@@ -447,14 +453,13 @@ def underscore_to_hyphen(data):
def log_fortianalyzer_override_setting(data, fos):
vdom = data["vdom"]
log_fortianalyzer_override_setting_data = data["log_fortianalyzer_override_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_override_setting_data(
- log_fortianalyzer_override_setting_data
- )
+ filtered_data = filter_log_fortianalyzer_override_setting_data(
+ log_fortianalyzer_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "log.fortianalyzer", "override-setting", data=filtered_data, vdom=vdom
+ "log.fortianalyzer", "override-setting", data=converted_data, vdom=vdom
)
@@ -531,6 +536,7 @@ versioned_schema = {
},
"v_range": [["v6.2.0", ""]],
},
+ "server_cert_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"preshared_key": {"v_range": [["v7.0.0", ""]], "type": "string"},
"access_config": {
"v_range": [["v6.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_setting.py
index 13157b88e..f0d68a886 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortianalyzer_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -204,6 +204,10 @@ options:
description:
- The remote FortiAnalyzer.
type: str
+ server_cert_ca:
+ description:
+ - Mandatory CA on FortiGate in certificate chain of server. Source certificate.ca.name vpn.certificate.ca.name.
+ type: str
source_ip:
description:
- Source IPv4 or IPv6 address used to communicate with FortiAnalyzer.
@@ -282,6 +286,7 @@ EXAMPLES = """
-
name: "default_name_24"
server: "192.168.100.40"
+ server_cert_ca: "<your_own_value> (source certificate.ca.name vpn.certificate.ca.name)"
source_ip: "84.230.14.43"
ssl_min_proto_version: "default"
status: "enable"
@@ -394,6 +399,7 @@ def filter_log_fortianalyzer_setting_data(json):
"reliable",
"serial",
"server",
+ "server_cert_ca",
"source_ip",
"ssl_min_proto_version",
"status",
@@ -429,11 +435,12 @@ def underscore_to_hyphen(data):
def log_fortianalyzer_setting(data, fos):
vdom = data["vdom"]
log_fortianalyzer_setting_data = data["log_fortianalyzer_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortianalyzer_setting_data(log_fortianalyzer_setting_data)
+ filtered_data = filter_log_fortianalyzer_setting_data(
+ log_fortianalyzer_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortianalyzer", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortianalyzer", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -504,6 +511,7 @@ versioned_schema = {
},
"v_range": [["v6.2.0", ""]],
},
+ "server_cert_ca": {"v_range": [["v7.4.2", ""]], "type": "string"},
"preshared_key": {"v_range": [["v7.0.0", ""]], "type": "string"},
"access_config": {
"v_range": [["v6.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_filter.py
index 21092bd9c..109e81b23 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortiguard_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -392,11 +401,10 @@ def underscore_to_hyphen(data):
def log_fortiguard_filter(data, fos):
vdom = data["vdom"]
log_fortiguard_filter_data = data["log_fortiguard_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortiguard_filter_data(log_fortiguard_filter_data)
- )
+ filtered_data = filter_log_fortiguard_filter_data(log_fortiguard_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortiguard", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortiguard", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -485,6 +493,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_filter.py
index deb63cca4..3ba5893c3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -112,6 +112,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -247,13 +254,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "13"
+ id: "14"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -352,6 +360,7 @@ def filter_log_fortiguard_override_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -392,11 +401,12 @@ def underscore_to_hyphen(data):
def log_fortiguard_override_filter(data, fos):
vdom = data["vdom"]
log_fortiguard_override_filter_data = data["log_fortiguard_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortiguard_override_filter_data(log_fortiguard_override_filter_data)
+ filtered_data = filter_log_fortiguard_override_filter_data(
+ log_fortiguard_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortiguard", "override-filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortiguard", "override-filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -487,6 +497,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_setting.py
index d4d447670..d5906376b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -273,13 +273,12 @@ def underscore_to_hyphen(data):
def log_fortiguard_override_setting(data, fos):
vdom = data["vdom"]
log_fortiguard_override_setting_data = data["log_fortiguard_override_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortiguard_override_setting_data(
- log_fortiguard_override_setting_data
- )
+ filtered_data = filter_log_fortiguard_override_setting_data(
+ log_fortiguard_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortiguard", "override-setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortiguard", "override-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_setting.py
index f62c1197c..0e5d8845c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_fortiguard_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -315,11 +315,10 @@ def underscore_to_hyphen(data):
def log_fortiguard_setting(data, fos):
vdom = data["vdom"]
log_fortiguard_setting_data = data["log_fortiguard_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_fortiguard_setting_data(log_fortiguard_setting_data)
- )
+ filtered_data = filter_log_fortiguard_setting_data(log_fortiguard_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.fortiguard", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.fortiguard", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_gui_display.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_gui_display.py
index 20f49acd3..4cf4fc15d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_gui_display.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_gui_display.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -221,11 +221,10 @@ def underscore_to_hyphen(data):
def log_gui_display(data, fos):
vdom = data["vdom"]
log_gui_display_data = data["log_gui_display"]
- filtered_data = underscore_to_hyphen(
- filter_log_gui_display_data(log_gui_display_data)
- )
+ filtered_data = filter_log_gui_display_data(log_gui_display_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log", "gui-display", data=filtered_data, vdom=vdom)
+ return fos.set("log", "gui-display", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_filter.py
index 203016b16..7f834c9e3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -140,6 +140,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -377,13 +384,14 @@ EXAMPLES = """
event: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "17"
+ id: "18"
gtp: "enable"
ha: "enable"
ipsec: "enable"
@@ -500,6 +508,7 @@ def filter_log_memory_filter_data(json):
"event",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -554,11 +563,10 @@ def underscore_to_hyphen(data):
def log_memory_filter(data, fos):
vdom = data["vdom"]
log_memory_filter_data = data["log_memory_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_memory_filter_data(log_memory_filter_data)
- )
+ filtered_data = filter_log_memory_filter_data(log_memory_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.memory", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.memory", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -647,6 +655,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_global_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_global_setting.py
index 10f0ac468..439b828fa 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_global_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_global_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -106,7 +106,7 @@ EXAMPLES = """
full_final_warning_threshold: "95"
full_first_warning_threshold: "75"
full_second_warning_threshold: "90"
- max_size: "20921835"
+ max_size: "20911636"
"""
RETURN = """
@@ -222,11 +222,12 @@ def underscore_to_hyphen(data):
def log_memory_global_setting(data, fos):
vdom = data["vdom"]
log_memory_global_setting_data = data["log_memory_global_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_memory_global_setting_data(log_memory_global_setting_data)
+ filtered_data = filter_log_memory_global_setting_data(
+ log_memory_global_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.memory", "global-setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.memory", "global-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_setting.py
index ebdfc9c6c..90d2f5ef3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_memory_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -212,11 +212,10 @@ def underscore_to_hyphen(data):
def log_memory_setting(data, fos):
vdom = data["vdom"]
log_memory_setting_data = data["log_memory_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_memory_setting_data(log_memory_setting_data)
- )
+ filtered_data = filter_log_memory_setting_data(log_memory_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.memory", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.memory", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_filter.py
index f8f78e799..a397e4130 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -239,13 +246,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -343,6 +351,7 @@ def filter_log_null_device_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -383,11 +392,10 @@ def underscore_to_hyphen(data):
def log_null_device_filter(data, fos):
vdom = data["vdom"]
log_null_device_filter_data = data["log_null_device_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_null_device_filter_data(log_null_device_filter_data)
- )
+ filtered_data = filter_log_null_device_filter_data(log_null_device_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.null-device", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.null-device", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -476,6 +484,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_setting.py
index bf43353b7..1ffc2141f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_null_device_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -205,11 +205,10 @@ def underscore_to_hyphen(data):
def log_null_device_setting(data, fos):
vdom = data["vdom"]
log_null_device_setting_data = data["log_null_device_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_null_device_setting_data(log_null_device_setting_data)
- )
+ filtered_data = filter_log_null_device_setting_data(log_null_device_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.null-device", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.null-device", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_setting.py
index 6885a8beb..77e6aefd6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -214,6 +214,13 @@ options:
choices:
- 'enable'
- 'disable'
+ long_live_session_stat:
+ description:
+ - Enable/disable long-live-session statistics logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
neighbor_event:
description:
- Enable/disable neighbor event logging.
@@ -291,6 +298,7 @@ EXAMPLES = """
log_policy_comment: "enable"
log_policy_name: "enable"
log_user_in_upper: "enable"
+ long_live_session_stat: "enable"
neighbor_event: "enable"
resolve_ip: "enable"
resolve_port: "enable"
@@ -400,6 +408,7 @@ def filter_log_setting_data(json):
"log_policy_comment",
"log_policy_name",
"log_user_in_upper",
+ "long_live_session_stat",
"neighbor_event",
"resolve_ip",
"resolve_port",
@@ -435,9 +444,10 @@ def underscore_to_hyphen(data):
def log_setting(data, fos):
vdom = data["vdom"]
log_setting_data = data["log_setting"]
- filtered_data = underscore_to_hyphen(filter_log_setting_data(log_setting_data))
+ filtered_data = filter_log_setting_data(log_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -577,6 +587,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "long_live_session_stat": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"custom_log_fields": {
"type": "list",
"elements": "dict",
@@ -591,7 +606,7 @@ versioned_schema = {
},
"anonymization_hash": {"v_range": [["v7.0.2", ""]], "type": "string"},
"fortiview_weekly_data": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_filter.py
index 5dff5fad3..776f609ce 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -239,13 +246,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -343,6 +351,7 @@ def filter_log_syslogd2_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -383,11 +392,10 @@ def underscore_to_hyphen(data):
def log_syslogd2_filter(data, fos):
vdom = data["vdom"]
log_syslogd2_filter_data = data["log_syslogd2_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd2_filter_data(log_syslogd2_filter_data)
- )
+ filtered_data = filter_log_syslogd2_filter_data(log_syslogd2_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd2", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd2", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -476,6 +484,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_filter.py
index 5816ea817..a4f72f647 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -98,6 +98,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -216,13 +223,14 @@ EXAMPLES = """
anomaly: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "11"
+ id: "12"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -316,6 +324,7 @@ def filter_log_syslogd2_override_filter_data(json):
"anomaly",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -353,11 +362,12 @@ def underscore_to_hyphen(data):
def log_syslogd2_override_filter(data, fos):
vdom = data["vdom"]
log_syslogd2_override_filter_data = data["log_syslogd2_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd2_override_filter_data(log_syslogd2_override_filter_data)
+ filtered_data = filter_log_syslogd2_override_filter_data(
+ log_syslogd2_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd2", "override-filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd2", "override-filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -448,6 +458,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_setting.py
index bb29919f9..a08e3dc2f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -379,11 +379,12 @@ def underscore_to_hyphen(data):
def log_syslogd2_override_setting(data, fos):
vdom = data["vdom"]
log_syslogd2_override_setting_data = data["log_syslogd2_override_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd2_override_setting_data(log_syslogd2_override_setting_data)
+ filtered_data = filter_log_syslogd2_override_setting_data(
+ log_syslogd2_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd2", "override-setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd2", "override-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_setting.py
index 5c6eb00ed..2528eec72 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd2_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -370,11 +370,10 @@ def underscore_to_hyphen(data):
def log_syslogd2_setting(data, fos):
vdom = data["vdom"]
log_syslogd2_setting_data = data["log_syslogd2_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd2_setting_data(log_syslogd2_setting_data)
- )
+ filtered_data = filter_log_syslogd2_setting_data(log_syslogd2_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd2", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd2", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_filter.py
index 672989379..6786e8ad7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -239,13 +246,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -343,6 +351,7 @@ def filter_log_syslogd3_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -383,11 +392,10 @@ def underscore_to_hyphen(data):
def log_syslogd3_filter(data, fos):
vdom = data["vdom"]
log_syslogd3_filter_data = data["log_syslogd3_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd3_filter_data(log_syslogd3_filter_data)
- )
+ filtered_data = filter_log_syslogd3_filter_data(log_syslogd3_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd3", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd3", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -476,6 +484,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_filter.py
index bbf63872c..8c0c72f7a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -98,6 +98,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -216,13 +223,14 @@ EXAMPLES = """
anomaly: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "11"
+ id: "12"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -316,6 +324,7 @@ def filter_log_syslogd3_override_filter_data(json):
"anomaly",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -353,11 +362,12 @@ def underscore_to_hyphen(data):
def log_syslogd3_override_filter(data, fos):
vdom = data["vdom"]
log_syslogd3_override_filter_data = data["log_syslogd3_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd3_override_filter_data(log_syslogd3_override_filter_data)
+ filtered_data = filter_log_syslogd3_override_filter_data(
+ log_syslogd3_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd3", "override-filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd3", "override-filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -448,6 +458,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_setting.py
index 05e37ea42..cf012828d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -379,11 +379,12 @@ def underscore_to_hyphen(data):
def log_syslogd3_override_setting(data, fos):
vdom = data["vdom"]
log_syslogd3_override_setting_data = data["log_syslogd3_override_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd3_override_setting_data(log_syslogd3_override_setting_data)
+ filtered_data = filter_log_syslogd3_override_setting_data(
+ log_syslogd3_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd3", "override-setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd3", "override-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_setting.py
index 487a9a652..2434f3152 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd3_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -370,11 +370,10 @@ def underscore_to_hyphen(data):
def log_syslogd3_setting(data, fos):
vdom = data["vdom"]
log_syslogd3_setting_data = data["log_syslogd3_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd3_setting_data(log_syslogd3_setting_data)
- )
+ filtered_data = filter_log_syslogd3_setting_data(log_syslogd3_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd3", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd3", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_filter.py
index ffc3f4e73..351c3dd29 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -239,13 +246,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -343,6 +351,7 @@ def filter_log_syslogd4_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -383,11 +392,10 @@ def underscore_to_hyphen(data):
def log_syslogd4_filter(data, fos):
vdom = data["vdom"]
log_syslogd4_filter_data = data["log_syslogd4_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd4_filter_data(log_syslogd4_filter_data)
- )
+ filtered_data = filter_log_syslogd4_filter_data(log_syslogd4_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd4", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd4", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -476,6 +484,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_filter.py
index f591fc7a0..5e1c6d63c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -98,6 +98,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -216,13 +223,14 @@ EXAMPLES = """
anomaly: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "11"
+ id: "12"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -316,6 +324,7 @@ def filter_log_syslogd4_override_filter_data(json):
"anomaly",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -353,11 +362,12 @@ def underscore_to_hyphen(data):
def log_syslogd4_override_filter(data, fos):
vdom = data["vdom"]
log_syslogd4_override_filter_data = data["log_syslogd4_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd4_override_filter_data(log_syslogd4_override_filter_data)
+ filtered_data = filter_log_syslogd4_override_filter_data(
+ log_syslogd4_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd4", "override-filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd4", "override-filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -448,6 +458,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_setting.py
index a0dd1f913..affb928ee 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -379,11 +379,12 @@ def underscore_to_hyphen(data):
def log_syslogd4_override_setting(data, fos):
vdom = data["vdom"]
log_syslogd4_override_setting_data = data["log_syslogd4_override_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd4_override_setting_data(log_syslogd4_override_setting_data)
+ filtered_data = filter_log_syslogd4_override_setting_data(
+ log_syslogd4_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd4", "override-setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd4", "override-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_setting.py
index 8c15e5dc2..d46c003ee 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd4_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -370,11 +370,10 @@ def underscore_to_hyphen(data):
def log_syslogd4_setting(data, fos):
vdom = data["vdom"]
log_syslogd4_setting_data = data["log_syslogd4_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd4_setting_data(log_syslogd4_setting_data)
- )
+ filtered_data = filter_log_syslogd4_setting_data(log_syslogd4_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd4", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd4", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_filter.py
index 46ca283a4..7d04775eb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -239,13 +246,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -343,6 +351,7 @@ def filter_log_syslogd_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -383,11 +392,10 @@ def underscore_to_hyphen(data):
def log_syslogd_filter(data, fos):
vdom = data["vdom"]
log_syslogd_filter_data = data["log_syslogd_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd_filter_data(log_syslogd_filter_data)
- )
+ filtered_data = filter_log_syslogd_filter_data(log_syslogd_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -476,6 +484,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_filter.py
index 6a6ef1760..0a5b129bd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -239,13 +246,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -343,6 +351,7 @@ def filter_log_syslogd_override_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -383,11 +392,12 @@ def underscore_to_hyphen(data):
def log_syslogd_override_filter(data, fos):
vdom = data["vdom"]
log_syslogd_override_filter_data = data["log_syslogd_override_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd_override_filter_data(log_syslogd_override_filter_data)
+ filtered_data = filter_log_syslogd_override_filter_data(
+ log_syslogd_override_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd", "override-filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd", "override-filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -478,6 +488,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_setting.py
index a80972c85..69cd42104 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_override_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -379,11 +379,12 @@ def underscore_to_hyphen(data):
def log_syslogd_override_setting(data, fos):
vdom = data["vdom"]
log_syslogd_override_setting_data = data["log_syslogd_override_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd_override_setting_data(log_syslogd_override_setting_data)
+ filtered_data = filter_log_syslogd_override_setting_data(
+ log_syslogd_override_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd", "override-setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd", "override-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_setting.py
index 41420e4d0..7c266a211 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_syslogd_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -370,11 +370,10 @@ def underscore_to_hyphen(data):
def log_syslogd_setting(data, fos):
vdom = data["vdom"]
log_syslogd_setting_data = data["log_syslogd_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_syslogd_setting_data(log_syslogd_setting_data)
- )
+ filtered_data = filter_log_syslogd_setting_data(log_syslogd_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.syslogd", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.syslogd", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_filter.py
index 28c9bc889..6a9e92838 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -221,13 +221,12 @@ def underscore_to_hyphen(data):
def log_tacacsplusaccounting2_filter(data, fos):
vdom = data["vdom"]
log_tacacsplusaccounting2_filter_data = data["log_tacacsplusaccounting2_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_tacacsplusaccounting2_filter_data(
- log_tacacsplusaccounting2_filter_data
- )
+ filtered_data = filter_log_tacacsplusaccounting2_filter_data(
+ log_tacacsplusaccounting2_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.tacacs+accounting2", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.tacacs+accounting2", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_setting.py
index 9c51d1975..ce498e1a2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting2_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -241,13 +241,12 @@ def underscore_to_hyphen(data):
def log_tacacsplusaccounting2_setting(data, fos):
vdom = data["vdom"]
log_tacacsplusaccounting2_setting_data = data["log_tacacsplusaccounting2_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_tacacsplusaccounting2_setting_data(
- log_tacacsplusaccounting2_setting_data
- )
+ filtered_data = filter_log_tacacsplusaccounting2_setting_data(
+ log_tacacsplusaccounting2_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.tacacs+accounting2", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.tacacs+accounting2", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_filter.py
index 82502c45f..e76c3d6d3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -221,13 +221,12 @@ def underscore_to_hyphen(data):
def log_tacacsplusaccounting3_filter(data, fos):
vdom = data["vdom"]
log_tacacsplusaccounting3_filter_data = data["log_tacacsplusaccounting3_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_tacacsplusaccounting3_filter_data(
- log_tacacsplusaccounting3_filter_data
- )
+ filtered_data = filter_log_tacacsplusaccounting3_filter_data(
+ log_tacacsplusaccounting3_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.tacacs+accounting3", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.tacacs+accounting3", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_setting.py
index c490d4a66..b41aa066e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting3_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -241,13 +241,12 @@ def underscore_to_hyphen(data):
def log_tacacsplusaccounting3_setting(data, fos):
vdom = data["vdom"]
log_tacacsplusaccounting3_setting_data = data["log_tacacsplusaccounting3_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_tacacsplusaccounting3_setting_data(
- log_tacacsplusaccounting3_setting_data
- )
+ filtered_data = filter_log_tacacsplusaccounting3_setting_data(
+ log_tacacsplusaccounting3_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.tacacs+accounting3", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.tacacs+accounting3", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_filter.py
index 3163541e1..89199ac32 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -221,13 +221,12 @@ def underscore_to_hyphen(data):
def log_tacacsplusaccounting_filter(data, fos):
vdom = data["vdom"]
log_tacacsplusaccounting_filter_data = data["log_tacacsplusaccounting_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_tacacsplusaccounting_filter_data(
- log_tacacsplusaccounting_filter_data
- )
+ filtered_data = filter_log_tacacsplusaccounting_filter_data(
+ log_tacacsplusaccounting_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.tacacs+accounting", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.tacacs+accounting", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_setting.py
index 9ae2bc591..92cf58399 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_tacacsplusaccounting_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -241,13 +241,12 @@ def underscore_to_hyphen(data):
def log_tacacsplusaccounting_setting(data, fos):
vdom = data["vdom"]
log_tacacsplusaccounting_setting_data = data["log_tacacsplusaccounting_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_tacacsplusaccounting_setting_data(
- log_tacacsplusaccounting_setting_data
- )
+ filtered_data = filter_log_tacacsplusaccounting_setting_data(
+ log_tacacsplusaccounting_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.tacacs+accounting", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.tacacs+accounting", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_threat_weight.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_threat_weight.py
index 5ecdc883f..3c0560bc1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_threat_weight.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_threat_weight.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -675,11 +675,10 @@ def underscore_to_hyphen(data):
def log_threat_weight(data, fos):
vdom = data["vdom"]
log_threat_weight_data = data["log_threat_weight"]
- filtered_data = underscore_to_hyphen(
- filter_log_threat_weight_data(log_threat_weight_data)
- )
+ filtered_data = filter_log_threat_weight_data(log_threat_weight_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log", "threat-weight", data=filtered_data, vdom=vdom)
+ return fos.set("log", "threat-weight", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_filter.py
index 854a17583..d5560cf03 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,6 +105,13 @@ options:
choices:
- 'include'
- 'exclude'
+ forti_switch:
+ description:
+ - Enable/disable Forti-Switch logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
forward_traffic:
description:
- Enable/disable forward traffic logging.
@@ -239,13 +246,14 @@ EXAMPLES = """
dns: "enable"
filter: "<your_own_value>"
filter_type: "include"
+ forti_switch: "enable"
forward_traffic: "enable"
free_style:
-
category: "traffic"
filter: "<your_own_value>"
filter_type: "include"
- id: "12"
+ id: "13"
gtp: "enable"
local_traffic: "enable"
multicast_traffic: "enable"
@@ -343,6 +351,7 @@ def filter_log_webtrends_filter_data(json):
"dns",
"filter",
"filter_type",
+ "forti_switch",
"forward_traffic",
"free_style",
"gtp",
@@ -383,11 +392,10 @@ def underscore_to_hyphen(data):
def log_webtrends_filter(data, fos):
vdom = data["vdom"]
log_webtrends_filter_data = data["log_webtrends_filter"]
- filtered_data = underscore_to_hyphen(
- filter_log_webtrends_filter_data(log_webtrends_filter_data)
- )
+ filtered_data = filter_log_webtrends_filter_data(log_webtrends_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.webtrends", "filter", data=filtered_data, vdom=vdom)
+ return fos.set("log.webtrends", "filter", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -476,6 +484,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "forti_switch": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"free_style": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_setting.py
index e421898d4..09734b95f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_log_webtrends_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -210,11 +210,10 @@ def underscore_to_hyphen(data):
def log_webtrends_setting(data, fos):
vdom = data["vdom"]
log_webtrends_setting_data = data["log_webtrends_setting"]
- filtered_data = underscore_to_hyphen(
- filter_log_webtrends_setting_data(log_webtrends_setting_data)
- )
+ filtered_data = filter_log_webtrends_setting_data(log_webtrends_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("log.webtrends", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("log.webtrends", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor.py
index 70a93ee4c..02eeaea57 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor.py
@@ -571,7 +571,7 @@ module_selectors_defs = {
"params": {
"id": {"type": "int", "required": "False"},
"method": {"type": "string", "required": "False"},
- "admins": {"type": "array", "required": "False"},
+ "admins": {"type": "array", "required": "True"},
},
},
"set.system.time": {
@@ -1633,7 +1633,7 @@ module_selectors_defs = {
"update-global-label.firewall.policy": {
"url": "firewall/policy/update-global-label",
"params": {
- "policyid": {"type": "int", "required": "True"},
+ "policyid": {"type": "string", "required": "True"},
"current-label": {"type": "string", "required": "False"},
"new-label": {"type": "string", "required": "False"},
},
@@ -1641,7 +1641,7 @@ module_selectors_defs = {
"update-global-label.firewall.security-policy": {
"url": "firewall/security-policy/update-global-label",
"params": {
- "policyid": {"type": "int", "required": "True"},
+ "policyid": {"type": "string", "required": "True"},
"current-label": {"type": "string", "required": "False"},
"new-label": {"type": "string", "required": "False"},
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor_fact.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor_fact.py
index 25e11cd21..b23a2df6b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor_fact.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitor_fact.py
@@ -445,6 +445,13 @@ options:
- 'extension-controller_lan-extension-vdom-status'
- 'user_proxy'
- 'user_proxy_count'
+ - 'firewall_check-addrgrp-exclude-mac-member'
+ - 'firewall_saas-application'
+ - 'router_sdwan_routes'
+ - 'router_sdwan_routes6'
+ - 'router_sdwan_routes-statistics'
+ - 'extender-controller_extender_modem-firmware'
+ - 'user_radius_get-test-connect'
selector:
description:
@@ -770,6 +777,13 @@ options:
- 'extension-controller_lan-extension-vdom-status'
- 'user_proxy'
- 'user_proxy_count'
+ - 'firewall_check-addrgrp-exclude-mac-member'
+ - 'firewall_saas-application'
+ - 'router_sdwan_routes'
+ - 'router_sdwan_routes6'
+ - 'router_sdwan_routes-statistics'
+ - 'extender-controller_extender_modem-firmware'
+ - 'user_radius_get-test-connect'
params:
description:
@@ -1830,6 +1844,7 @@ module_selectors_defs = {
"timestamp_to": {"type": "int", "required": "False"},
"filters": {"type": "array", "required": "False"},
"query_type": {"type": "string", "required": "False"},
+ "view_type": {"type": "string", "required": "False"},
"query_id": {"type": "int", "required": "False"},
"cache_query": {"type": "boolean", "required": "False"},
"key_only": {"type": "boolean", "required": "False"},
@@ -1926,6 +1941,7 @@ module_selectors_defs = {
"scope": {"type": "string", "required": "False"},
"search_tables": {"type": "array", "required": "False"},
"skip_tables": {"type": "array", "required": "False"},
+ "exact": {"type": "boolean", "required": "False"},
},
},
"switch-controller_managed-switch_status": {
@@ -2320,6 +2336,36 @@ module_selectors_defs = {
},
"user_proxy": {"url": "user/proxy", "params": {}},
"user_proxy_count": {"url": "user/proxy/count", "params": {}},
+ "firewall_check-addrgrp-exclude-mac-member": {
+ "url": "firewall/check-addrgrp-exclude-mac-member",
+ "params": {
+ "mkey": {"type": "string", "required": "True"},
+ "ip_version": {"type": "string", "required": "False"},
+ },
+ },
+ "firewall_saas-application": {"url": "firewall/saas-application", "params": {}},
+ "router_sdwan_routes": {"url": "router/sdwan/routes", "params": {}},
+ "router_sdwan_routes6": {"url": "router/sdwan/routes6", "params": {}},
+ "router_sdwan_routes-statistics": {
+ "url": "router/sdwan/routes-statistics",
+ "params": {"ip_version": {"type": "string", "required": "False"}},
+ },
+ "extender-controller_extender_modem-firmware": {
+ "url": "extender-controller/extender/modem-firmware",
+ "params": {"serial": {"type": "string", "required": "True"}},
+ },
+ "user_radius_get-test-connect": {
+ "url": "user/radius/get-test-connect",
+ "params": {
+ "mkey": {"type": "string", "required": "False"},
+ "ordinal": {"type": "string", "required": "False"},
+ "server": {"type": "string", "required": "False"},
+ "secret": {"type": "string", "required": "False"},
+ "auth_type": {"type": "string", "required": "False"},
+ "user": {"type": "string", "required": "False"},
+ "password": {"type": "string", "required": "False"},
+ },
+ },
}
@@ -2751,6 +2797,13 @@ def main():
"extension-controller_lan-extension-vdom-status",
"user_proxy",
"user_proxy_count",
+ "firewall_check-addrgrp-exclude-mac-member",
+ "firewall_saas-application",
+ "router_sdwan_routes",
+ "router_sdwan_routes6",
+ "router_sdwan_routes-statistics",
+ "extender-controller_extender_modem-firmware",
+ "user_radius_get-test-connect",
],
},
"selectors": {
@@ -3084,6 +3137,13 @@ def main():
"extension-controller_lan-extension-vdom-status",
"user_proxy",
"user_proxy_count",
+ "firewall_check-addrgrp-exclude-mac-member",
+ "firewall_saas-application",
+ "router_sdwan_routes",
+ "router_sdwan_routes6",
+ "router_sdwan_routes-statistics",
+ "extender-controller_extender_modem-firmware",
+ "user_radius_get-test-connect",
],
},
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_np6_ipsec_engine.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_np6_ipsec_engine.py
index 98588718f..4715f3399 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_np6_ipsec_engine.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_np6_ipsec_engine.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,11 +249,12 @@ def monitoring_np6_ipsec_engine(data, fos):
monitoring_np6_ipsec_engine_data = flatten_multilists_attributes(
monitoring_np6_ipsec_engine_data
)
- filtered_data = underscore_to_hyphen(
- filter_monitoring_np6_ipsec_engine_data(monitoring_np6_ipsec_engine_data)
+ filtered_data = filter_monitoring_np6_ipsec_engine_data(
+ monitoring_np6_ipsec_engine_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("monitoring", "np6-ipsec-engine", data=filtered_data, vdom=vdom)
+ return fos.set("monitoring", "np6-ipsec-engine", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -287,17 +288,20 @@ def fortios_monitoring(data, fos):
versioned_schema = {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"status": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "interval": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
"threshold": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "list",
"multiple_values": True,
"elements": "str",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_npu_hpe.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_npu_hpe.py
index 57e11fe09..965de21c6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_npu_hpe.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_monitoring_npu_hpe.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,11 +246,10 @@ def monitoring_npu_hpe(data, fos):
vdom = data["vdom"]
monitoring_npu_hpe_data = data["monitoring_npu_hpe"]
monitoring_npu_hpe_data = flatten_multilists_attributes(monitoring_npu_hpe_data)
- filtered_data = underscore_to_hyphen(
- filter_monitoring_npu_hpe_data(monitoring_npu_hpe_data)
- )
+ filtered_data = filter_monitoring_npu_hpe_data(monitoring_npu_hpe_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("monitoring", "npu-hpe", data=filtered_data, vdom=vdom)
+ return fos.set("monitoring", "npu-hpe", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_service_chain.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_service_chain.py
index 4524adb33..4c448352c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_service_chain.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_service_chain.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -252,12 +252,11 @@ def nsxt_service_chain(data, fos):
state = data["state"]
nsxt_service_chain_data = data["nsxt_service_chain"]
- filtered_data = underscore_to_hyphen(
- filter_nsxt_service_chain_data(nsxt_service_chain_data)
- )
+ filtered_data = filter_nsxt_service_chain_data(nsxt_service_chain_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("nsxt", "service-chain", data=filtered_data, vdom=vdom)
+ return fos.set("nsxt", "service-chain", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("nsxt", "service-chain", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_setting.py
index 72ba3d5e6..f40e1baae 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_nsxt_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -210,9 +210,10 @@ def underscore_to_hyphen(data):
def nsxt_setting(data, fos):
vdom = data["vdom"]
nsxt_setting_data = data["nsxt_setting"]
- filtered_data = underscore_to_hyphen(filter_nsxt_setting_data(nsxt_setting_data))
+ filtered_data = filter_nsxt_setting_data(nsxt_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("nsxt", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("nsxt", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_pfcp_message_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_pfcp_message_filter.py
index afccb153c..a55f0a35a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_pfcp_message_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_pfcp_message_filter.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -350,12 +350,11 @@ def pfcp_message_filter(data, fos):
state = data["state"]
pfcp_message_filter_data = data["pfcp_message_filter"]
- filtered_data = underscore_to_hyphen(
- filter_pfcp_message_filter_data(pfcp_message_filter_data)
- )
+ filtered_data = filter_pfcp_message_filter_data(pfcp_message_filter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("pfcp", "message-filter", data=filtered_data, vdom=vdom)
+ return fos.set("pfcp", "message-filter", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -398,12 +397,12 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"required": True,
},
"unknown_message": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
@@ -412,75 +411,79 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v7.0.1", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
"required": True,
}
},
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
},
"heartbeat": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"pfd_management": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"version_not_support": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"session_establish": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"session_modification": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"session_deletion": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"session_report": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"association_setup": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"association_update": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"association_release": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"node_report": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
"session_set_deletion": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "allow"}, {"value": "deny"}],
},
},
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_chart.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_chart.py
index 8fc46de5c..0f9b254ff 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_chart.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_chart.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -660,7 +660,8 @@ def report_chart(data, fos, check_mode=False):
state = data["state"]
report_chart_data = data["report_chart"]
- filtered_data = underscore_to_hyphen(filter_report_chart_data(report_chart_data))
+ filtered_data = filter_report_chart_data(report_chart_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -724,7 +725,7 @@ def report_chart(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("report", "chart", data=filtered_data, vdom=vdom)
+ return fos.set("report", "chart", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("report", "chart", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_dataset.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_dataset.py
index 4954b253e..d8b08c468 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_dataset.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_dataset.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -303,9 +303,8 @@ def report_dataset(data, fos, check_mode=False):
state = data["state"]
report_dataset_data = data["report_dataset"]
- filtered_data = underscore_to_hyphen(
- filter_report_dataset_data(report_dataset_data)
- )
+ filtered_data = filter_report_dataset_data(report_dataset_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -369,7 +368,7 @@ def report_dataset(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("report", "dataset", data=filtered_data, vdom=vdom)
+ return fos.set("report", "dataset", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("report", "dataset", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_layout.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_layout.py
index 660616566..312914cda 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_layout.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_layout.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -713,7 +713,8 @@ def report_layout(data, fos, check_mode=False):
report_layout_data = data["report_layout"]
report_layout_data = flatten_multilists_attributes(report_layout_data)
- filtered_data = underscore_to_hyphen(filter_report_layout_data(report_layout_data))
+ filtered_data = filter_report_layout_data(report_layout_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -777,7 +778,7 @@ def report_layout(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("report", "layout", data=filtered_data, vdom=vdom)
+ return fos.set("report", "layout", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("report", "layout", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_setting.py
index 9a4660d31..83f49d2c7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -269,11 +269,10 @@ def report_setting(data, fos):
vdom = data["vdom"]
report_setting_data = data["report_setting"]
report_setting_data = flatten_multilists_attributes(report_setting_data)
- filtered_data = underscore_to_hyphen(
- filter_report_setting_data(report_setting_data)
- )
+ filtered_data = filter_report_setting_data(report_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("report", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("report", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_style.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_style.py
index bf97b0094..65a08e158 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_style.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_style.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -438,7 +438,8 @@ def report_style(data, fos, check_mode=False):
report_style_data = data["report_style"]
report_style_data = flatten_multilists_attributes(report_style_data)
- filtered_data = underscore_to_hyphen(filter_report_style_data(report_style_data))
+ filtered_data = filter_report_style_data(report_style_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -502,7 +503,7 @@ def report_style(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("report", "style", data=filtered_data, vdom=vdom)
+ return fos.set("report", "style", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("report", "style", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_theme.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_theme.py
index b8a925de9..2766f3dbd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_theme.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_report_theme.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -408,7 +408,8 @@ def report_theme(data, fos, check_mode=False):
state = data["state"]
report_theme_data = data["report_theme"]
- filtered_data = underscore_to_hyphen(filter_report_theme_data(report_theme_data))
+ filtered_data = filter_report_theme_data(report_theme_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -472,7 +473,7 @@ def report_theme(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("report", "theme", data=filtered_data, vdom=vdom)
+ return fos.set("report", "theme", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("report", "theme", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list.py
index 16f6e6aae..52dee3961 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -275,9 +275,8 @@ def router_access_list(data, fos, check_mode=False):
state = data["state"]
router_access_list_data = data["router_access_list"]
- filtered_data = underscore_to_hyphen(
- filter_router_access_list_data(router_access_list_data)
- )
+ filtered_data = filter_router_access_list_data(router_access_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -341,7 +340,7 @@ def router_access_list(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "access-list", data=filtered_data, vdom=vdom)
+ return fos.set("router", "access-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list6.py
index b359464e5..449c1e75e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_access_list6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -270,9 +270,8 @@ def router_access_list6(data, fos, check_mode=False):
state = data["state"]
router_access_list6_data = data["router_access_list6"]
- filtered_data = underscore_to_hyphen(
- filter_router_access_list6_data(router_access_list6_data)
- )
+ filtered_data = filter_router_access_list6_data(router_access_list6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -336,7 +335,7 @@ def router_access_list6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "access-list6", data=filtered_data, vdom=vdom)
+ return fos.set("router", "access-list6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_aspath_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_aspath_list.py
index 12b2036b1..09dba421c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_aspath_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_aspath_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -252,9 +252,8 @@ def router_aspath_list(data, fos, check_mode=False):
state = data["state"]
router_aspath_list_data = data["router_aspath_list"]
- filtered_data = underscore_to_hyphen(
- filter_router_aspath_list_data(router_aspath_list_data)
- )
+ filtered_data = filter_router_aspath_list_data(router_aspath_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -318,7 +317,7 @@ def router_aspath_list(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "aspath-list", data=filtered_data, vdom=vdom)
+ return fos.set("router", "aspath-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_auth_path.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_auth_path.py
index 388b31072..6eb1b3a6d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_auth_path.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_auth_path.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,9 +235,8 @@ def router_auth_path(data, fos, check_mode=False):
state = data["state"]
router_auth_path_data = data["router_auth_path"]
- filtered_data = underscore_to_hyphen(
- filter_router_auth_path_data(router_auth_path_data)
- )
+ filtered_data = filter_router_auth_path_data(router_auth_path_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -301,7 +300,7 @@ def router_auth_path(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "auth-path", data=filtered_data, vdom=vdom)
+ return fos.set("router", "auth-path", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("router", "auth-path", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd.py
index 1fa0d6a93..3f0f2792f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -268,9 +268,10 @@ def underscore_to_hyphen(data):
def router_bfd(data, fos):
vdom = data["vdom"]
router_bfd_data = data["router_bfd"]
- filtered_data = underscore_to_hyphen(filter_router_bfd_data(router_bfd_data))
+ filtered_data = filter_router_bfd_data(router_bfd_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "bfd", data=filtered_data, vdom=vdom)
+ return fos.set("router", "bfd", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd6.py
index d14e6c2db..4d0035eb1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bfd6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -268,9 +268,10 @@ def underscore_to_hyphen(data):
def router_bfd6(data, fos):
vdom = data["vdom"]
router_bfd6_data = data["router_bfd6"]
- filtered_data = underscore_to_hyphen(filter_router_bfd6_data(router_bfd6_data))
+ filtered_data = filter_router_bfd6_data(router_bfd6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "bfd6", data=filtered_data, vdom=vdom)
+ return fos.set("router", "bfd6", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bgp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bgp.py
index 2eccab8e0..a653b57aa 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bgp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_bgp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -95,6 +95,10 @@ options:
description:
- Number of additional paths to be selected for each VPNv4 NLRI.
type: int
+ additional_path_select_vpnv6:
+ description:
+ - Number of additional paths to be selected for each VPNv6 NLRI.
+ type: int
additional_path_select6:
description:
- Number of additional paths to be selected for each IPv6 NLRI.
@@ -106,6 +110,13 @@ options:
choices:
- 'enable'
- 'disable'
+ additional_path_vpnv6:
+ description:
+ - Enable/disable selection of BGP VPNv6 additional paths.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
additional_path6:
description:
- Enable/disable selection of BGP IPv6 additional paths.
@@ -437,6 +448,13 @@ options:
choices:
- 'enable'
- 'disable'
+ activate_vpnv6:
+ description:
+ - Enable/disable address family VPNv6 for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
activate6:
description:
- Enable/disable address family IPv6 for this neighbor.
@@ -462,6 +480,15 @@ options:
- 'receive'
- 'both'
- 'disable'
+ additional_path_vpnv6:
+ description:
+ - Enable/disable VPNv6 additional-path capability.
+ type: str
+ choices:
+ - 'send'
+ - 'receive'
+ - 'both'
+ - 'disable'
additional_path6:
description:
- Enable/disable IPv6 additional-path capability.
@@ -479,6 +506,10 @@ options:
description:
- Number of VPNv4 additional paths that can be advertised to this neighbor.
type: int
+ adv_additional_path_vpnv6:
+ description:
+ - Number of VPNv6 additional paths that can be advertised to this neighbor.
+ type: int
adv_additional_path6:
description:
- Number of IPv6 additional paths that can be advertised to this neighbor.
@@ -512,6 +543,13 @@ options:
choices:
- 'enable'
- 'disable'
+ allowas_in_enable_vpnv6:
+ description:
+ - Enable/disable use of my AS in AS path for VPNv6 route.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
allowas_in_enable6:
description:
- Enable/disable IPv6 Enable to allow my AS in AS path.
@@ -527,6 +565,10 @@ options:
description:
- The maximum number of occurrence of my AS number allowed for VPNv4 route.
type: int
+ allowas_in_vpnv6:
+ description:
+ - The maximum number of occurrence of my AS number allowed for VPNv6 route.
+ type: int
allowas_in6:
description:
- IPv6 The maximum number of occurrence of my AS number allowed.
@@ -563,6 +605,15 @@ options:
- 'as-path'
- 'med'
- 'next-hop'
+ attribute_unchanged_vpnv6:
+ description:
+ - List of attributes that should not be changed for VPNv6 route.
+ type: list
+ elements: str
+ choices:
+ - 'as-path'
+ - 'med'
+ - 'next-hop'
attribute_unchanged6:
description:
- IPv6 List of attributes that should be unchanged.
@@ -572,6 +623,10 @@ options:
- 'as-path'
- 'med'
- 'next-hop'
+ auth_options:
+ description:
+ - Key-chain name for TCP authentication options. Source router.key-chain.name.
+ type: str
bfd:
description:
- Enable/disable BFD for this neighbor.
@@ -621,6 +676,13 @@ options:
choices:
- 'enable'
- 'disable'
+ capability_graceful_restart_vpnv6:
+ description:
+ - Enable/disable advertisement of VPNv6 graceful restart capability to this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
capability_graceful_restart6:
description:
- Enable/disable advertise IPv6 graceful restart capability to this neighbor.
@@ -735,6 +797,10 @@ options:
description:
- Filter for VPNv4 updates from this neighbor. Source router.access-list.name.
type: str
+ distribute_list_in_vpnv6:
+ description:
+ - Filter for VPNv6 updates from this neighbor. Source router.access-list6.name.
+ type: str
distribute_list_in6:
description:
- Filter for IPv6 updates from this neighbor. Source router.access-list6.name.
@@ -747,6 +813,10 @@ options:
description:
- Filter for VPNv4 updates to this neighbor. Source router.access-list.name.
type: str
+ distribute_list_out_vpnv6:
+ description:
+ - Filter for VPNv6 updates to this neighbor. Source router.access-list6.name.
+ type: str
distribute_list_out6:
description:
- Filter for IPv6 updates to this neighbor. Source router.access-list6.name.
@@ -777,6 +847,10 @@ options:
description:
- BGP filter for VPNv4 inbound routes. Source router.aspath-list.name.
type: str
+ filter_list_in_vpnv6:
+ description:
+ - BGP filter for VPNv6 inbound routes. Source router.aspath-list.name.
+ type: str
filter_list_in6:
description:
- BGP filter for IPv6 inbound routes. Source router.aspath-list.name.
@@ -789,6 +863,10 @@ options:
description:
- BGP filter for VPNv4 outbound routes. Source router.aspath-list.name.
type: str
+ filter_list_out_vpnv6:
+ description:
+ - BGP filter for VPNv6 outbound routes. Source router.aspath-list.name.
+ type: str
filter_list_out6:
description:
- BGP filter for IPv6 outbound routes. Source router.aspath-list.name.
@@ -856,6 +934,10 @@ options:
description:
- Maximum VPNv4 prefix threshold value (1 - 100 percent).
type: int
+ maximum_prefix_threshold_vpnv6:
+ description:
+ - Maximum VPNv6 prefix threshold value (1 - 100 percent).
+ type: int
maximum_prefix_threshold6:
description:
- Maximum IPv6 prefix threshold value (1 - 100 percent).
@@ -864,6 +946,10 @@ options:
description:
- Maximum number of VPNv4 prefixes to accept from this peer.
type: int
+ maximum_prefix_vpnv6:
+ description:
+ - Maximum number of VPNv6 prefixes to accept from this peer.
+ type: int
maximum_prefix_warning_only:
description:
- Enable/disable IPv4 Only give warning message when limit is exceeded.
@@ -885,6 +971,13 @@ options:
choices:
- 'enable'
- 'disable'
+ maximum_prefix_warning_only_vpnv6:
+ description:
+ - Enable/disable warning message when limit is exceeded for VPNv6 routes.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
maximum_prefix_warning_only6:
description:
- Enable/disable IPv6 Only give warning message when limit is exceeded.
@@ -924,6 +1017,13 @@ options:
choices:
- 'enable'
- 'disable'
+ next_hop_self_vpnv6:
+ description:
+ - Enable/disable use of outgoing interface"s IP address as VPNv6 next-hop for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
next_hop_self6:
description:
- Enable/disable IPv6 next-hop calculation for this neighbor.
@@ -957,6 +1057,10 @@ options:
description:
- Inbound filter for VPNv4 updates from this neighbor. Source router.prefix-list.name.
type: str
+ prefix_list_in_vpnv6:
+ description:
+ - Inbound filter for VPNv6 updates from this neighbor. Source router.prefix-list6.name.
+ type: str
prefix_list_in6:
description:
- IPv6 Inbound filter for updates from this neighbor. Source router.prefix-list6.name.
@@ -969,6 +1073,10 @@ options:
description:
- Outbound filter for VPNv4 updates to this neighbor. Source router.prefix-list.name.
type: str
+ prefix_list_out_vpnv6:
+ description:
+ - Outbound filter for VPNv6 updates to this neighbor. Source router.prefix-list6.name.
+ type: str
prefix_list_out6:
description:
- IPv6 Outbound filter for updates to this neighbor. Source router.prefix-list6.name.
@@ -998,6 +1106,13 @@ options:
choices:
- 'enable'
- 'disable'
+ remove_private_as_vpnv6:
+ description:
+ - Enable/disable to remove private AS number from VPNv6 outbound updates.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
remove_private_as6:
description:
- Enable/disable remove private AS number from IPv6 outbound updates.
@@ -1025,6 +1140,10 @@ options:
description:
- VPNv4 inbound route map filter. Source router.route-map.name.
type: str
+ route_map_in_vpnv6:
+ description:
+ - VPNv6 inbound route map filter. Source router.route-map.name.
+ type: str
route_map_in6:
description:
- IPv6 Inbound route map filter. Source router.route-map.name.
@@ -1049,6 +1168,14 @@ options:
description:
- VPNv4 outbound route map filter if the peer is preferred. Source router.route-map.name.
type: str
+ route_map_out_vpnv6:
+ description:
+ - VPNv6 outbound route map filter. Source router.route-map.name.
+ type: str
+ route_map_out_vpnv6_preferable:
+ description:
+ - VPNv6 outbound route map filter if this neighbor is preferred. Source router.route-map.name.
+ type: str
route_map_out6:
description:
- IPv6 Outbound route map filter. Source router.route-map.name.
@@ -1078,6 +1205,13 @@ options:
choices:
- 'enable'
- 'disable'
+ route_reflector_client_vpnv6:
+ description:
+ - Enable/disable VPNv6 AS route reflector client for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
route_reflector_client6:
description:
- Enable/disable IPv6 AS route reflector client.
@@ -1106,6 +1240,13 @@ options:
choices:
- 'enable'
- 'disable'
+ route_server_client_vpnv6:
+ description:
+ - Enable/disable VPNv6 AS route server client for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
route_server_client6:
description:
- Enable/disable IPv6 AS route server client.
@@ -1140,6 +1281,15 @@ options:
- 'extended'
- 'both'
- 'disable'
+ send_community_vpnv6:
+ description:
+ - Enable/disable sending community attribute to this neighbor for VPNv6 address family.
+ type: str
+ choices:
+ - 'standard'
+ - 'extended'
+ - 'both'
+ - 'disable'
send_community6:
description:
- IPv6 Send community attribute to neighbor.
@@ -1177,6 +1327,13 @@ options:
choices:
- 'enable'
- 'disable'
+ soft_reconfiguration_vpnv6:
+ description:
+ - Enable/disable VPNv6 inbound soft reconfiguration.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
soft_reconfiguration6:
description:
- Enable/disable allow IPv6 inbound soft reconfiguration.
@@ -1241,6 +1398,13 @@ options:
choices:
- 'enable'
- 'disable'
+ activate_vpnv6:
+ description:
+ - Enable/disable address family VPNv6 for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
activate6:
description:
- Enable/disable address family IPv6 for this neighbor.
@@ -1266,6 +1430,15 @@ options:
- 'receive'
- 'both'
- 'disable'
+ additional_path_vpnv6:
+ description:
+ - Enable/disable VPNv6 additional-path capability.
+ type: str
+ choices:
+ - 'send'
+ - 'receive'
+ - 'both'
+ - 'disable'
additional_path6:
description:
- Enable/disable IPv6 additional-path capability.
@@ -1283,6 +1456,10 @@ options:
description:
- Number of VPNv4 additional paths that can be advertised to this neighbor.
type: int
+ adv_additional_path_vpnv6:
+ description:
+ - Number of VPNv6 additional paths that can be advertised to this neighbor.
+ type: int
adv_additional_path6:
description:
- Number of IPv6 additional paths that can be advertised to this neighbor.
@@ -1316,6 +1493,13 @@ options:
choices:
- 'enable'
- 'disable'
+ allowas_in_enable_vpnv6:
+ description:
+ - Enable/disable use of my AS in AS path for VPNv6 route.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
allowas_in_enable6:
description:
- Enable/disable IPv6 Enable to allow my AS in AS path.
@@ -1331,6 +1515,10 @@ options:
description:
- The maximum number of occurrence of my AS number allowed for VPNv4 route.
type: int
+ allowas_in_vpnv6:
+ description:
+ - The maximum number of occurrence of my AS number allowed for VPNv6 route.
+ type: int
allowas_in6:
description:
- IPv6 The maximum number of occurrence of my AS number allowed.
@@ -1367,6 +1555,15 @@ options:
- 'as-path'
- 'med'
- 'next-hop'
+ attribute_unchanged_vpnv6:
+ description:
+ - List of attributes that should not be changed for VPNv6 route.
+ type: list
+ elements: str
+ choices:
+ - 'as-path'
+ - 'med'
+ - 'next-hop'
attribute_unchanged6:
description:
- IPv6 List of attributes that should be unchanged.
@@ -1376,6 +1573,10 @@ options:
- 'as-path'
- 'med'
- 'next-hop'
+ auth_options:
+ description:
+ - Key-chain name for TCP authentication options. Source router.key-chain.name.
+ type: str
bfd:
description:
- Enable/disable BFD for this neighbor.
@@ -1425,6 +1626,13 @@ options:
choices:
- 'enable'
- 'disable'
+ capability_graceful_restart_vpnv6:
+ description:
+ - Enable/disable advertisement of VPNv6 graceful restart capability to this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
capability_graceful_restart6:
description:
- Enable/disable advertise IPv6 graceful restart capability to this neighbor.
@@ -1481,6 +1689,10 @@ options:
description:
- Filter for VPNv4 updates from this neighbor. Source router.access-list.name.
type: str
+ distribute_list_in_vpnv6:
+ description:
+ - Filter for VPNv6 updates from this neighbor. Source router.access-list6.name.
+ type: str
distribute_list_in6:
description:
- Filter for IPv6 updates from this neighbor. Source router.access-list6.name.
@@ -1493,6 +1705,10 @@ options:
description:
- Filter for VPNv4 updates to this neighbor. Source router.access-list.name.
type: str
+ distribute_list_out_vpnv6:
+ description:
+ - Filter for VPNv6 updates to this neighbor. Source router.access-list6.name.
+ type: str
distribute_list_out6:
description:
- Filter for IPv6 updates to this neighbor. Source router.access-list6.name.
@@ -1523,6 +1739,10 @@ options:
description:
- BGP filter for VPNv4 inbound routes. Source router.aspath-list.name.
type: str
+ filter_list_in_vpnv6:
+ description:
+ - BGP filter for VPNv6 inbound routes. Source router.aspath-list.name.
+ type: str
filter_list_in6:
description:
- BGP filter for IPv6 inbound routes. Source router.aspath-list.name.
@@ -1535,6 +1755,10 @@ options:
description:
- BGP filter for VPNv4 outbound routes. Source router.aspath-list.name.
type: str
+ filter_list_out_vpnv6:
+ description:
+ - BGP filter for VPNv6 outbound routes. Source router.aspath-list.name.
+ type: str
filter_list_out6:
description:
- BGP filter for IPv6 outbound routes. Source router.aspath-list.name.
@@ -1597,6 +1821,10 @@ options:
description:
- Maximum VPNv4 prefix threshold value (1 - 100 percent).
type: int
+ maximum_prefix_threshold_vpnv6:
+ description:
+ - Maximum VPNv6 prefix threshold value (1 - 100 percent).
+ type: int
maximum_prefix_threshold6:
description:
- Maximum IPv6 prefix threshold value (1 - 100 percent).
@@ -1605,6 +1833,10 @@ options:
description:
- Maximum number of VPNv4 prefixes to accept from this peer.
type: int
+ maximum_prefix_vpnv6:
+ description:
+ - Maximum number of VPNv6 prefixes to accept from this peer.
+ type: int
maximum_prefix_warning_only:
description:
- Enable/disable IPv4 Only give warning message when limit is exceeded.
@@ -1626,6 +1858,13 @@ options:
choices:
- 'enable'
- 'disable'
+ maximum_prefix_warning_only_vpnv6:
+ description:
+ - Enable/disable warning message when limit is exceeded for VPNv6 routes.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
maximum_prefix_warning_only6:
description:
- Enable/disable IPv6 Only give warning message when limit is exceeded.
@@ -1670,6 +1909,13 @@ options:
choices:
- 'enable'
- 'disable'
+ next_hop_self_vpnv6:
+ description:
+ - Enable/disable use of outgoing interface"s IP address as VPNv6 next-hop for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
next_hop_self6:
description:
- Enable/disable IPv6 next-hop calculation for this neighbor.
@@ -1703,6 +1949,10 @@ options:
description:
- Inbound filter for VPNv4 updates from this neighbor. Source router.prefix-list.name.
type: str
+ prefix_list_in_vpnv6:
+ description:
+ - Inbound filter for VPNv6 updates from this neighbor. Source router.prefix-list6.name.
+ type: str
prefix_list_in6:
description:
- IPv6 Inbound filter for updates from this neighbor. Source router.prefix-list6.name.
@@ -1715,6 +1965,10 @@ options:
description:
- Outbound filter for VPNv4 updates to this neighbor. Source router.prefix-list.name.
type: str
+ prefix_list_out_vpnv6:
+ description:
+ - Outbound filter for VPNv6 updates to this neighbor. Source router.prefix-list6.name.
+ type: str
prefix_list_out6:
description:
- IPv6 Outbound filter for updates to this neighbor. Source router.prefix-list6.name.
@@ -1744,6 +1998,13 @@ options:
choices:
- 'enable'
- 'disable'
+ remove_private_as_vpnv6:
+ description:
+ - Enable/disable to remove private AS number from VPNv6 outbound updates.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
remove_private_as6:
description:
- Enable/disable remove private AS number from IPv6 outbound updates.
@@ -1771,6 +2032,10 @@ options:
description:
- VPNv4 inbound route map filter. Source router.route-map.name.
type: str
+ route_map_in_vpnv6:
+ description:
+ - VPNv6 inbound route map filter. Source router.route-map.name.
+ type: str
route_map_in6:
description:
- IPv6 Inbound route map filter. Source router.route-map.name.
@@ -1795,6 +2060,14 @@ options:
description:
- VPNv4 outbound route map filter if the peer is preferred. Source router.route-map.name.
type: str
+ route_map_out_vpnv6:
+ description:
+ - VPNv6 outbound route map filter. Source router.route-map.name.
+ type: str
+ route_map_out_vpnv6_preferable:
+ description:
+ - VPNv6 outbound route map filter if this neighbor is preferred. Source router.route-map.name.
+ type: str
route_map_out6:
description:
- IPv6 Outbound route map filter. Source router.route-map.name.
@@ -1824,6 +2097,13 @@ options:
choices:
- 'enable'
- 'disable'
+ route_reflector_client_vpnv6:
+ description:
+ - Enable/disable VPNv6 AS route reflector client for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
route_reflector_client6:
description:
- Enable/disable IPv6 AS route reflector client.
@@ -1852,6 +2132,13 @@ options:
choices:
- 'enable'
- 'disable'
+ route_server_client_vpnv6:
+ description:
+ - Enable/disable VPNv6 AS route server client for this neighbor.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
route_server_client6:
description:
- Enable/disable IPv6 AS route server client.
@@ -1886,6 +2173,15 @@ options:
- 'extended'
- 'both'
- 'disable'
+ send_community_vpnv6:
+ description:
+ - Enable/disable sending community attribute to this neighbor for VPNv6 address family.
+ type: str
+ choices:
+ - 'standard'
+ - 'extended'
+ - 'both'
+ - 'disable'
send_community6:
description:
- IPv6 Send community attribute to neighbor.
@@ -1923,6 +2219,13 @@ options:
choices:
- 'enable'
- 'disable'
+ soft_reconfiguration_vpnv6:
+ description:
+ - Enable/disable VPNv6 inbound soft reconfiguration.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
soft_reconfiguration6:
description:
- Enable/disable allow IPv6 inbound soft reconfiguration.
@@ -2296,6 +2599,32 @@ options:
type: list
elements: dict
suboptions:
+ export_rt:
+ description:
+ - List of export route target.
+ type: list
+ elements: dict
+ suboptions:
+ route_target:
+ description:
+ - 'Attribute: AA:NN|A.B.C.D:NN.'
+ required: true
+ type: str
+ import_route_map:
+ description:
+ - Import route map. Source router.route-map.name.
+ type: str
+ import_rt:
+ description:
+ - List of import route target.
+ type: list
+ elements: dict
+ suboptions:
+ route_target:
+ description:
+ - 'Attribute: AA:NN|A.B.C.D:NN'
+ required: true
+ type: str
leak_target:
description:
- Target VRF table.
@@ -2315,6 +2644,18 @@ options:
- Target VRF ID (0 - 251).
required: true
type: str
+ rd:
+ description:
+ - 'Route Distinguisher: AA:NN|A.B.C.D:NN.'
+ type: str
+ role:
+ description:
+ - VRF role.
+ type: str
+ choices:
+ - 'standalone'
+ - 'ce'
+ - 'pe'
vrf:
description:
- Origin VRF ID (0 - 251).
@@ -2330,25 +2671,27 @@ EXAMPLES = """
additional_path: "enable"
additional_path_select: "2"
additional_path_select_vpnv4: "2"
+ additional_path_select_vpnv6: "2"
additional_path_select6: "2"
additional_path_vpnv4: "enable"
+ additional_path_vpnv6: "enable"
additional_path6: "enable"
admin_distance:
-
distance: "0"
- id: "11"
+ id: "13"
neighbour_prefix: "<your_own_value>"
route_list: "<your_own_value> (source router.access-list.name)"
aggregate_address:
-
as_set: "enable"
- id: "16"
+ id: "18"
prefix: "<your_own_value>"
summary_only: "enable"
aggregate_address6:
-
as_set: "enable"
- id: "21"
+ id: "23"
prefix6: "<your_own_value>"
summary_only: "enable"
always_compare_med: "enable"
@@ -2396,27 +2739,34 @@ EXAMPLES = """
activate: "enable"
activate_evpn: "enable"
activate_vpnv4: "enable"
+ activate_vpnv6: "enable"
activate6: "enable"
additional_path: "send"
additional_path_vpnv4: "send"
+ additional_path_vpnv6: "send"
additional_path6: "send"
adv_additional_path: "2"
adv_additional_path_vpnv4: "2"
+ adv_additional_path_vpnv6: "2"
adv_additional_path6: "2"
advertisement_interval: "30"
allowas_in: "3"
allowas_in_enable: "enable"
allowas_in_enable_evpn: "enable"
allowas_in_enable_vpnv4: "enable"
+ allowas_in_enable_vpnv6: "enable"
allowas_in_enable6: "enable"
allowas_in_evpn: "3"
allowas_in_vpnv4: "3"
+ allowas_in_vpnv6: "3"
allowas_in6: "3"
as_override: "enable"
as_override6: "enable"
attribute_unchanged: "as-path"
attribute_unchanged_vpnv4: "as-path"
+ attribute_unchanged_vpnv6: "as-path"
attribute_unchanged6: "as-path"
+ auth_options: "<your_own_value> (source router.key-chain.name)"
bfd: "enable"
capability_default_originate: "enable"
capability_default_originate6: "enable"
@@ -2424,6 +2774,7 @@ EXAMPLES = """
capability_graceful_restart: "enable"
capability_graceful_restart_evpn: "enable"
capability_graceful_restart_vpnv4: "enable"
+ capability_graceful_restart_vpnv6: "enable"
capability_graceful_restart6: "enable"
capability_orf: "none"
capability_orf6: "none"
@@ -2433,14 +2784,14 @@ EXAMPLES = """
advertise_routemap: "<your_own_value> (source router.route-map.name)"
condition_routemap:
-
- name: "default_name_102 (source router.route-map.name)"
+ name: "default_name_112 (source router.route-map.name)"
condition_type: "exist"
conditional_advertise6:
-
advertise_routemap: "<your_own_value> (source router.route-map.name)"
condition_routemap:
-
- name: "default_name_107 (source router.route-map.name)"
+ name: "default_name_117 (source router.route-map.name)"
condition_type: "exist"
connect_timer: "4294967295"
default_originate_routemap: "<your_own_value> (source router.route-map.name)"
@@ -2448,18 +2799,22 @@ EXAMPLES = """
description: "<your_own_value>"
distribute_list_in: "<your_own_value> (source router.access-list.name)"
distribute_list_in_vpnv4: "<your_own_value> (source router.access-list.name)"
+ distribute_list_in_vpnv6: "<your_own_value> (source router.access-list6.name)"
distribute_list_in6: "<your_own_value> (source router.access-list6.name)"
distribute_list_out: "<your_own_value> (source router.access-list.name)"
distribute_list_out_vpnv4: "<your_own_value> (source router.access-list.name)"
+ distribute_list_out_vpnv6: "<your_own_value> (source router.access-list6.name)"
distribute_list_out6: "<your_own_value> (source router.access-list6.name)"
dont_capability_negotiate: "enable"
ebgp_enforce_multihop: "enable"
ebgp_multihop_ttl: "255"
filter_list_in: "<your_own_value> (source router.aspath-list.name)"
filter_list_in_vpnv4: "<your_own_value> (source router.aspath-list.name)"
+ filter_list_in_vpnv6: "<your_own_value> (source router.aspath-list.name)"
filter_list_in6: "<your_own_value> (source router.aspath-list.name)"
filter_list_out: "<your_own_value> (source router.aspath-list.name)"
filter_list_out_vpnv4: "<your_own_value> (source router.aspath-list.name)"
+ filter_list_out_vpnv6: "<your_own_value> (source router.aspath-list.name)"
filter_list_out6: "<your_own_value> (source router.aspath-list.name)"
holdtime_timer: "4294967295"
interface: "<your_own_value> (source system.interface.name)"
@@ -2474,61 +2829,75 @@ EXAMPLES = """
maximum_prefix_threshold: "75"
maximum_prefix_threshold_evpn: "75"
maximum_prefix_threshold_vpnv4: "75"
+ maximum_prefix_threshold_vpnv6: "75"
maximum_prefix_threshold6: "75"
maximum_prefix_vpnv4: "0"
+ maximum_prefix_vpnv6: "0"
maximum_prefix_warning_only: "enable"
maximum_prefix_warning_only_evpn: "enable"
maximum_prefix_warning_only_vpnv4: "enable"
+ maximum_prefix_warning_only_vpnv6: "enable"
maximum_prefix_warning_only6: "enable"
maximum_prefix6: "0"
next_hop_self: "enable"
next_hop_self_rr: "enable"
next_hop_self_rr6: "enable"
next_hop_self_vpnv4: "enable"
+ next_hop_self_vpnv6: "enable"
next_hop_self6: "enable"
override_capability: "enable"
passive: "enable"
password: "<your_own_value>"
prefix_list_in: "<your_own_value> (source router.prefix-list.name)"
prefix_list_in_vpnv4: "<your_own_value> (source router.prefix-list.name)"
+ prefix_list_in_vpnv6: "<your_own_value> (source router.prefix-list6.name)"
prefix_list_in6: "<your_own_value> (source router.prefix-list6.name)"
prefix_list_out: "<your_own_value> (source router.prefix-list.name)"
prefix_list_out_vpnv4: "<your_own_value> (source router.prefix-list.name)"
+ prefix_list_out_vpnv6: "<your_own_value> (source router.prefix-list6.name)"
prefix_list_out6: "<your_own_value> (source router.prefix-list6.name)"
remote_as: "<your_own_value>"
remove_private_as: "enable"
remove_private_as_evpn: "enable"
remove_private_as_vpnv4: "enable"
+ remove_private_as_vpnv6: "enable"
remove_private_as6: "enable"
restart_time: "0"
retain_stale_time: "0"
route_map_in: "<your_own_value> (source router.route-map.name)"
route_map_in_evpn: "<your_own_value> (source router.route-map.name)"
route_map_in_vpnv4: "<your_own_value> (source router.route-map.name)"
+ route_map_in_vpnv6: "<your_own_value> (source router.route-map.name)"
route_map_in6: "<your_own_value> (source router.route-map.name)"
route_map_out: "<your_own_value> (source router.route-map.name)"
route_map_out_evpn: "<your_own_value> (source router.route-map.name)"
route_map_out_preferable: "<your_own_value> (source router.route-map.name)"
route_map_out_vpnv4: "<your_own_value> (source router.route-map.name)"
route_map_out_vpnv4_preferable: "<your_own_value> (source router.route-map.name)"
+ route_map_out_vpnv6: "<your_own_value> (source router.route-map.name)"
+ route_map_out_vpnv6_preferable: "<your_own_value> (source router.route-map.name)"
route_map_out6: "<your_own_value> (source router.route-map.name)"
route_map_out6_preferable: "<your_own_value> (source router.route-map.name)"
route_reflector_client: "enable"
route_reflector_client_evpn: "enable"
route_reflector_client_vpnv4: "enable"
+ route_reflector_client_vpnv6: "enable"
route_reflector_client6: "enable"
route_server_client: "enable"
route_server_client_evpn: "enable"
route_server_client_vpnv4: "enable"
+ route_server_client_vpnv6: "enable"
route_server_client6: "enable"
send_community: "standard"
send_community_evpn: "standard"
send_community_vpnv4: "standard"
+ send_community_vpnv6: "standard"
send_community6: "standard"
shutdown: "enable"
soft_reconfiguration: "enable"
soft_reconfiguration_evpn: "enable"
soft_reconfiguration_vpnv4: "enable"
+ soft_reconfiguration_vpnv6: "enable"
soft_reconfiguration6: "enable"
stale_route: "enable"
strict_capability_match: "enable"
@@ -2541,27 +2910,34 @@ EXAMPLES = """
activate: "enable"
activate_evpn: "enable"
activate_vpnv4: "enable"
+ activate_vpnv6: "enable"
activate6: "enable"
additional_path: "send"
additional_path_vpnv4: "send"
+ additional_path_vpnv6: "send"
additional_path6: "send"
adv_additional_path: "2"
adv_additional_path_vpnv4: "2"
+ adv_additional_path_vpnv6: "2"
adv_additional_path6: "2"
advertisement_interval: "30"
allowas_in: "3"
allowas_in_enable: "enable"
allowas_in_enable_evpn: "enable"
allowas_in_enable_vpnv4: "enable"
+ allowas_in_enable_vpnv6: "enable"
allowas_in_enable6: "enable"
allowas_in_evpn: "3"
allowas_in_vpnv4: "3"
+ allowas_in_vpnv6: "3"
allowas_in6: "3"
as_override: "enable"
as_override6: "enable"
attribute_unchanged: "as-path"
attribute_unchanged_vpnv4: "as-path"
+ attribute_unchanged_vpnv6: "as-path"
attribute_unchanged6: "as-path"
+ auth_options: "<your_own_value> (source router.key-chain.name)"
bfd: "enable"
capability_default_originate: "enable"
capability_default_originate6: "enable"
@@ -2569,6 +2945,7 @@ EXAMPLES = """
capability_graceful_restart: "enable"
capability_graceful_restart_evpn: "enable"
capability_graceful_restart_vpnv4: "enable"
+ capability_graceful_restart_vpnv6: "enable"
capability_graceful_restart6: "enable"
capability_orf: "none"
capability_orf6: "none"
@@ -2579,18 +2956,22 @@ EXAMPLES = """
description: "<your_own_value>"
distribute_list_in: "<your_own_value> (source router.access-list.name)"
distribute_list_in_vpnv4: "<your_own_value> (source router.access-list.name)"
+ distribute_list_in_vpnv6: "<your_own_value> (source router.access-list6.name)"
distribute_list_in6: "<your_own_value> (source router.access-list6.name)"
distribute_list_out: "<your_own_value> (source router.access-list.name)"
distribute_list_out_vpnv4: "<your_own_value> (source router.access-list.name)"
+ distribute_list_out_vpnv6: "<your_own_value> (source router.access-list6.name)"
distribute_list_out6: "<your_own_value> (source router.access-list6.name)"
dont_capability_negotiate: "enable"
ebgp_enforce_multihop: "enable"
ebgp_multihop_ttl: "255"
filter_list_in: "<your_own_value> (source router.aspath-list.name)"
filter_list_in_vpnv4: "<your_own_value> (source router.aspath-list.name)"
+ filter_list_in_vpnv6: "<your_own_value> (source router.aspath-list.name)"
filter_list_in6: "<your_own_value> (source router.aspath-list.name)"
filter_list_out: "<your_own_value> (source router.aspath-list.name)"
filter_list_out_vpnv4: "<your_own_value> (source router.aspath-list.name)"
+ filter_list_out_vpnv6: "<your_own_value> (source router.aspath-list.name)"
filter_list_out6: "<your_own_value> (source router.aspath-list.name)"
holdtime_timer: "4294967295"
interface: "<your_own_value> (source system.interface.name)"
@@ -2604,62 +2985,76 @@ EXAMPLES = """
maximum_prefix_threshold: "75"
maximum_prefix_threshold_evpn: "75"
maximum_prefix_threshold_vpnv4: "75"
+ maximum_prefix_threshold_vpnv6: "75"
maximum_prefix_threshold6: "75"
maximum_prefix_vpnv4: "0"
+ maximum_prefix_vpnv6: "0"
maximum_prefix_warning_only: "enable"
maximum_prefix_warning_only_evpn: "enable"
maximum_prefix_warning_only_vpnv4: "enable"
+ maximum_prefix_warning_only_vpnv6: "enable"
maximum_prefix_warning_only6: "enable"
maximum_prefix6: "0"
- name: "default_name_277"
+ name: "default_name_320"
next_hop_self: "enable"
next_hop_self_rr: "enable"
next_hop_self_rr6: "enable"
next_hop_self_vpnv4: "enable"
+ next_hop_self_vpnv6: "enable"
next_hop_self6: "enable"
override_capability: "enable"
passive: "enable"
password: "<your_own_value>"
prefix_list_in: "<your_own_value> (source router.prefix-list.name)"
prefix_list_in_vpnv4: "<your_own_value> (source router.prefix-list.name)"
+ prefix_list_in_vpnv6: "<your_own_value> (source router.prefix-list6.name)"
prefix_list_in6: "<your_own_value> (source router.prefix-list6.name)"
prefix_list_out: "<your_own_value> (source router.prefix-list.name)"
prefix_list_out_vpnv4: "<your_own_value> (source router.prefix-list.name)"
+ prefix_list_out_vpnv6: "<your_own_value> (source router.prefix-list6.name)"
prefix_list_out6: "<your_own_value> (source router.prefix-list6.name)"
remote_as: "<your_own_value>"
remove_private_as: "enable"
remove_private_as_evpn: "enable"
remove_private_as_vpnv4: "enable"
+ remove_private_as_vpnv6: "enable"
remove_private_as6: "enable"
restart_time: "0"
retain_stale_time: "0"
route_map_in: "<your_own_value> (source router.route-map.name)"
route_map_in_evpn: "<your_own_value> (source router.route-map.name)"
route_map_in_vpnv4: "<your_own_value> (source router.route-map.name)"
+ route_map_in_vpnv6: "<your_own_value> (source router.route-map.name)"
route_map_in6: "<your_own_value> (source router.route-map.name)"
route_map_out: "<your_own_value> (source router.route-map.name)"
route_map_out_evpn: "<your_own_value> (source router.route-map.name)"
route_map_out_preferable: "<your_own_value> (source router.route-map.name)"
route_map_out_vpnv4: "<your_own_value> (source router.route-map.name)"
route_map_out_vpnv4_preferable: "<your_own_value> (source router.route-map.name)"
+ route_map_out_vpnv6: "<your_own_value> (source router.route-map.name)"
+ route_map_out_vpnv6_preferable: "<your_own_value> (source router.route-map.name)"
route_map_out6: "<your_own_value> (source router.route-map.name)"
route_map_out6_preferable: "<your_own_value> (source router.route-map.name)"
route_reflector_client: "enable"
route_reflector_client_evpn: "enable"
route_reflector_client_vpnv4: "enable"
+ route_reflector_client_vpnv6: "enable"
route_reflector_client6: "enable"
route_server_client: "enable"
route_server_client_evpn: "enable"
route_server_client_vpnv4: "enable"
+ route_server_client_vpnv6: "enable"
route_server_client6: "enable"
send_community: "standard"
send_community_evpn: "standard"
send_community_vpnv4: "standard"
+ send_community_vpnv6: "standard"
send_community6: "standard"
shutdown: "enable"
soft_reconfiguration: "enable"
soft_reconfiguration_evpn: "enable"
soft_reconfiguration_vpnv4: "enable"
+ soft_reconfiguration_vpnv6: "enable"
soft_reconfiguration6: "enable"
stale_route: "enable"
strict_capability_match: "enable"
@@ -2669,20 +3064,20 @@ EXAMPLES = """
weight: "4294967295"
neighbor_range:
-
- id: "334"
+ id: "388"
max_neighbor_num: "0"
neighbor_group: "<your_own_value> (source router.bgp.neighbor-group.name)"
prefix: "<your_own_value>"
neighbor_range6:
-
- id: "339"
+ id: "393"
max_neighbor_num: "0"
neighbor_group: "<your_own_value> (source router.bgp.neighbor-group.name)"
prefix6: "<your_own_value>"
network:
-
backdoor: "enable"
- id: "345"
+ id: "399"
network_import_check: "global"
prefix: "<your_own_value>"
route_map: "<your_own_value> (source router.route-map.name)"
@@ -2690,7 +3085,7 @@ EXAMPLES = """
network6:
-
backdoor: "enable"
- id: "352"
+ id: "406"
network_import_check: "global"
prefix6: "<your_own_value>"
route_map: "<your_own_value> (source router.route-map.name)"
@@ -2698,12 +3093,12 @@ EXAMPLES = """
recursive_next_hop: "enable"
redistribute:
-
- name: "default_name_359"
+ name: "default_name_413"
route_map: "<your_own_value> (source router.route-map.name)"
status: "enable"
redistribute6:
-
- name: "default_name_363"
+ name: "default_name_417"
route_map: "<your_own_value> (source router.route-map.name)"
status: "enable"
router_id: "<your_own_value>"
@@ -2745,11 +3140,20 @@ EXAMPLES = """
vrf: "<your_own_value>"
vrf6:
-
+ export_rt:
+ -
+ route_target: "<your_own_value>"
+ import_route_map: "<your_own_value> (source router.route-map.name)"
+ import_rt:
+ -
+ route_target: "<your_own_value>"
leak_target:
-
interface: "<your_own_value> (source system.interface.name)"
route_map: "<your_own_value> (source router.route-map.name)"
vrf: "<your_own_value>"
+ rd: "<your_own_value>"
+ role: "standalone"
vrf: "<your_own_value>"
"""
@@ -2837,8 +3241,10 @@ def filter_router_bgp_data(json):
"additional_path",
"additional_path_select",
"additional_path_select_vpnv4",
+ "additional_path_select_vpnv6",
"additional_path_select6",
"additional_path_vpnv4",
+ "additional_path_vpnv6",
"additional_path6",
"admin_distance",
"aggregate_address",
@@ -2935,9 +3341,11 @@ def flatten_multilists_attributes(data):
["neighbor", "attribute_unchanged"],
["neighbor", "attribute_unchanged6"],
["neighbor", "attribute_unchanged_vpnv4"],
+ ["neighbor", "attribute_unchanged_vpnv6"],
["neighbor_group", "attribute_unchanged"],
["neighbor_group", "attribute_unchanged6"],
["neighbor_group", "attribute_unchanged_vpnv4"],
+ ["neighbor_group", "attribute_unchanged_vpnv6"],
]
for attr in multilist_attrs:
@@ -2963,9 +3371,10 @@ def router_bgp(data, fos):
vdom = data["vdom"]
router_bgp_data = data["router_bgp"]
router_bgp_data = flatten_multilists_attributes(router_bgp_data)
- filtered_data = underscore_to_hyphen(filter_router_bgp_data(router_bgp_data))
+ filtered_data = filter_router_bgp_data(router_bgp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "bgp", data=filtered_data, vdom=vdom)
+ return fos.set("router", "bgp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -3099,6 +3508,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "additional_path_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"multipath_recursive_distance": {
"v_range": [["v6.4.0", "v6.4.0"], ["v6.4.4", ""]],
"type": "string",
@@ -3178,6 +3592,10 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "integer",
},
+ "additional_path_select_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"cross_family_conditional_adv": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3253,6 +3671,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "allowas_in_enable_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"allowas_in_enable_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3261,6 +3684,7 @@ versioned_schema = {
"allowas_in": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"allowas_in6": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"allowas_in_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "integer"},
+ "allowas_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"allowas_in_evpn": {"v_range": [["v7.4.0", ""]], "type": "integer"},
"attribute_unchanged": {
"v_range": [["v6.0.0", ""]],
@@ -3295,6 +3719,17 @@ versioned_schema = {
"multiple_values": True,
"elements": "str",
},
+ "attribute_unchanged_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "list",
+ "options": [
+ {"value": "as-path"},
+ {"value": "med"},
+ {"value": "next-hop"},
+ ],
+ "multiple_values": True,
+ "elements": "str",
+ },
"activate": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -3310,6 +3745,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "activate_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"activate_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3360,6 +3800,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "capability_graceful_restart_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"capability_graceful_restart_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3425,6 +3870,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "next_hop_self_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"override_capability": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -3450,6 +3900,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "remove_private_as_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"remove_private_as_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3470,6 +3925,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "route_reflector_client_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"route_reflector_client_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3490,6 +3950,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "route_server_client_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"route_server_client_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3515,6 +3980,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "soft_reconfiguration_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"soft_reconfiguration_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3550,22 +4020,35 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "distribute_list_in_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"distribute_list_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"distribute_list_out6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"distribute_list_out_vpnv4": {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "distribute_list_out_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"ebgp_multihop_ttl": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"filter_list_in": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_in6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_in_vpnv4": {"v_range": [["v7.4.1", ""]], "type": "string"},
+ "filter_list_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"filter_list_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_out6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_out_vpnv4": {
"v_range": [["v7.4.1", ""]],
"type": "string",
},
+ "filter_list_out_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"interface": {"v_range": [["v6.0.0", ""]], "type": "string"},
"maximum_prefix": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"maximum_prefix6": {"v_range": [["v6.0.0", ""]], "type": "integer"},
@@ -3573,6 +4056,10 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "integer",
},
+ "maximum_prefix_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"maximum_prefix_evpn": {"v_range": [["v7.4.0", ""]], "type": "integer"},
"maximum_prefix_threshold": {
"v_range": [["v6.0.0", ""]],
@@ -3586,6 +4073,10 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "integer",
},
+ "maximum_prefix_threshold_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"maximum_prefix_threshold_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "integer",
@@ -3605,6 +4096,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "maximum_prefix_warning_only_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"maximum_prefix_warning_only_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3613,12 +4109,17 @@ versioned_schema = {
"prefix_list_in": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_in6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_in_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "string"},
+ "prefix_list_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"prefix_list_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_out6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_out_vpnv4": {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "prefix_list_out_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"remote_as": {"v_range": [["v6.0.0", ""]], "type": "string"},
"local_as": {"v_range": [["v6.0.0", ""]], "type": "string"},
"local_as_no_prepend": {
@@ -3635,6 +4136,7 @@ versioned_schema = {
"route_map_in": {"v_range": [["v6.0.0", ""]], "type": "string"},
"route_map_in6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"route_map_in_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "string"},
+ "route_map_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"route_map_in_evpn": {"v_range": [["v7.4.0", ""]], "type": "string"},
"route_map_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"route_map_out_preferable": {
@@ -3647,10 +4149,15 @@ versioned_schema = {
"type": "string",
},
"route_map_out_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "string"},
+ "route_map_out_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"route_map_out_vpnv4_preferable": {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "route_map_out_vpnv6_preferable": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"route_map_out_evpn": {"v_range": [["v7.4.0", ""]], "type": "string"},
"send_community": {
"v_range": [["v6.0.0", ""]],
@@ -3682,6 +4189,16 @@ versioned_schema = {
{"value": "disable"},
],
},
+ "send_community_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "standard"},
+ {"value": "extended"},
+ {"value": "both"},
+ {"value": "disable"},
+ ],
+ },
"send_community_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3730,6 +4247,16 @@ versioned_schema = {
{"value": "disable"},
],
},
+ "additional_path_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "send"},
+ {"value": "receive"},
+ {"value": "both"},
+ {"value": "disable"},
+ ],
+ },
"adv_additional_path": {"v_range": [["v6.2.0", ""]], "type": "integer"},
"adv_additional_path6": {
"v_range": [["v6.2.0", ""]],
@@ -3739,7 +4266,12 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "integer",
},
+ "adv_additional_path_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"password": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "auth_options": {"v_range": [["v7.4.2", ""]], "type": "string"},
"conditional_advertise": {
"type": "list",
"elements": "dict",
@@ -3829,6 +4361,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "allowas_in_enable_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"allowas_in_enable_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3837,6 +4374,7 @@ versioned_schema = {
"allowas_in": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"allowas_in6": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"allowas_in_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "integer"},
+ "allowas_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"allowas_in_evpn": {"v_range": [["v7.4.0", ""]], "type": "integer"},
"attribute_unchanged": {
"v_range": [["v6.0.0", ""]],
@@ -3871,6 +4409,17 @@ versioned_schema = {
"multiple_values": True,
"elements": "str",
},
+ "attribute_unchanged_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "list",
+ "options": [
+ {"value": "as-path"},
+ {"value": "med"},
+ {"value": "next-hop"},
+ ],
+ "multiple_values": True,
+ "elements": "str",
+ },
"activate": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -3886,6 +4435,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "activate_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"activate_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -3936,6 +4490,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "capability_graceful_restart_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"capability_graceful_restart_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -4001,6 +4560,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "next_hop_self_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"override_capability": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -4026,6 +4590,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "remove_private_as_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"remove_private_as_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -4046,6 +4615,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "route_reflector_client_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"route_reflector_client_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -4066,6 +4640,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "route_server_client_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"route_server_client_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -4091,6 +4670,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "soft_reconfiguration_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"soft_reconfiguration_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -4126,22 +4710,35 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "distribute_list_in_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"distribute_list_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"distribute_list_out6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"distribute_list_out_vpnv4": {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "distribute_list_out_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"ebgp_multihop_ttl": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"filter_list_in": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_in6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_in_vpnv4": {"v_range": [["v7.4.1", ""]], "type": "string"},
+ "filter_list_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"filter_list_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_out6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"filter_list_out_vpnv4": {
"v_range": [["v7.4.1", ""]],
"type": "string",
},
+ "filter_list_out_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"interface": {"v_range": [["v6.0.0", ""]], "type": "string"},
"maximum_prefix": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"maximum_prefix6": {"v_range": [["v6.0.0", ""]], "type": "integer"},
@@ -4149,6 +4746,10 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "integer",
},
+ "maximum_prefix_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"maximum_prefix_evpn": {"v_range": [["v7.4.0", ""]], "type": "integer"},
"maximum_prefix_threshold": {
"v_range": [["v6.0.0", ""]],
@@ -4162,6 +4763,10 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "integer",
},
+ "maximum_prefix_threshold_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"maximum_prefix_threshold_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "integer",
@@ -4181,6 +4786,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "maximum_prefix_warning_only_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"maximum_prefix_warning_only_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -4189,12 +4799,17 @@ versioned_schema = {
"prefix_list_in": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_in6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_in_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "string"},
+ "prefix_list_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"prefix_list_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_out6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"prefix_list_out_vpnv4": {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "prefix_list_out_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"remote_as": {"v_range": [["v6.0.0", ""]], "type": "string"},
"local_as": {"v_range": [["v6.0.0", ""]], "type": "string"},
"local_as_no_prepend": {
@@ -4211,6 +4826,7 @@ versioned_schema = {
"route_map_in": {"v_range": [["v6.0.0", ""]], "type": "string"},
"route_map_in6": {"v_range": [["v6.0.0", ""]], "type": "string"},
"route_map_in_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "string"},
+ "route_map_in_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"route_map_in_evpn": {"v_range": [["v7.4.0", ""]], "type": "string"},
"route_map_out": {"v_range": [["v6.0.0", ""]], "type": "string"},
"route_map_out_preferable": {
@@ -4223,10 +4839,15 @@ versioned_schema = {
"type": "string",
},
"route_map_out_vpnv4": {"v_range": [["v7.2.0", ""]], "type": "string"},
+ "route_map_out_vpnv6": {"v_range": [["v7.4.2", ""]], "type": "string"},
"route_map_out_vpnv4_preferable": {
"v_range": [["v7.2.0", ""]],
"type": "string",
},
+ "route_map_out_vpnv6_preferable": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"route_map_out_evpn": {"v_range": [["v7.4.0", ""]], "type": "string"},
"send_community": {
"v_range": [["v6.0.0", ""]],
@@ -4258,6 +4879,16 @@ versioned_schema = {
{"value": "disable"},
],
},
+ "send_community_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "standard"},
+ {"value": "extended"},
+ {"value": "both"},
+ {"value": "disable"},
+ ],
+ },
"send_community_evpn": {
"v_range": [["v7.4.0", ""]],
"type": "string",
@@ -4306,6 +4937,16 @@ versioned_schema = {
{"value": "disable"},
],
},
+ "additional_path_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "send"},
+ {"value": "receive"},
+ {"value": "both"},
+ {"value": "disable"},
+ ],
+ },
"adv_additional_path": {"v_range": [["v6.2.0", ""]], "type": "integer"},
"adv_additional_path6": {
"v_range": [["v6.2.0", ""]],
@@ -4315,7 +4956,12 @@ versioned_schema = {
"v_range": [["v7.2.0", ""]],
"type": "integer",
},
+ "adv_additional_path_vpnv6": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"password": {"v_range": [["v7.2.4", ""]], "type": "string"},
+ "auth_options": {"v_range": [["v7.4.2", ""]], "type": "string"},
},
"v_range": [["v6.0.0", ""]],
},
@@ -4490,6 +5136,41 @@ versioned_schema = {
"type": "string",
"required": True,
},
+ "role": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "standalone"},
+ {"value": "ce"},
+ {"value": "pe"},
+ ],
+ },
+ "rd": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "export_rt": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "route_target": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "import_rt": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "route_target": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "import_route_map": {"v_range": [["v7.4.2", ""]], "type": "string"},
"leak_target": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_community_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_community_list.py
index b3845c220..c3d6de5af 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_community_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_community_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -265,9 +265,8 @@ def router_community_list(data, fos, check_mode=False):
state = data["state"]
router_community_list_data = data["router_community_list"]
- filtered_data = underscore_to_hyphen(
- filter_router_community_list_data(router_community_list_data)
- )
+ filtered_data = filter_router_community_list_data(router_community_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -331,7 +330,7 @@ def router_community_list(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "community-list", data=filtered_data, vdom=vdom)
+ return fos.set("router", "community-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_extcommunity_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_extcommunity_list.py
index 025bd7f12..7180a58c6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_extcommunity_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_extcommunity_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -264,12 +264,11 @@ def router_extcommunity_list(data, fos):
state = data["state"]
router_extcommunity_list_data = data["router_extcommunity_list"]
- filtered_data = underscore_to_hyphen(
- filter_router_extcommunity_list_data(router_extcommunity_list_data)
- )
+ filtered_data = filter_router_extcommunity_list_data(router_extcommunity_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("router", "extcommunity-list", data=filtered_data, vdom=vdom)
+ return fos.set("router", "extcommunity-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_isis.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_isis.py
index 7d1743993..5d92a78d1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_isis.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_isis.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -881,9 +881,10 @@ def router_isis(data, fos):
vdom = data["vdom"]
router_isis_data = data["router_isis"]
router_isis_data = flatten_multilists_attributes(router_isis_data)
- filtered_data = underscore_to_hyphen(filter_router_isis_data(router_isis_data))
+ filtered_data = filter_router_isis_data(router_isis_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "isis", data=filtered_data, vdom=vdom)
+ return fos.set("router", "isis", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_key_chain.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_key_chain.py
index 0622d5bd5..a15ab8834 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_key_chain.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_key_chain.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -108,6 +108,7 @@ options:
- 'hmac-sha256'
- 'hmac-sha384'
- 'hmac-sha512'
+ - 'cmac-aes128'
id:
description:
- Key ID (0 - 2147483647).
@@ -265,9 +266,8 @@ def router_key_chain(data, fos, check_mode=False):
state = data["state"]
router_key_chain_data = data["router_key_chain"]
- filtered_data = underscore_to_hyphen(
- filter_router_key_chain_data(router_key_chain_data)
- )
+ filtered_data = filter_router_key_chain_data(router_key_chain_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -331,7 +331,7 @@ def router_key_chain(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "key-chain", data=filtered_data, vdom=vdom)
+ return fos.set("router", "key-chain", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("router", "key-chain", mkey=filtered_data["name"], vdom=vdom)
@@ -390,6 +390,7 @@ versioned_schema = {
{"value": "hmac-sha256"},
{"value": "hmac-sha384"},
{"value": "hmac-sha512"},
+ {"value": "cmac-aes128", "v_range": [["v7.4.2", ""]]},
],
},
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast.py
index acb75a009..b9c61dc3a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -430,7 +430,7 @@ EXAMPLES = """
bfd: "enable"
cisco_exclude_genid: "enable"
dr_priority: "1"
- hello_holdtime: ""
+ hello_holdtime: "105"
hello_interval: "30"
igmp:
access_group: "<your_own_value> (source router.access-list.name)"
@@ -611,11 +611,10 @@ def underscore_to_hyphen(data):
def router_multicast(data, fos):
vdom = data["vdom"]
router_multicast_data = data["router_multicast"]
- filtered_data = underscore_to_hyphen(
- filter_router_multicast_data(router_multicast_data)
- )
+ filtered_data = filter_router_multicast_data(router_multicast_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "multicast", data=filtered_data, vdom=vdom)
+ return fos.set("router", "multicast", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast6.py
index f6f490dde..c408a01f5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -267,11 +267,10 @@ def underscore_to_hyphen(data):
def router_multicast6(data, fos):
vdom = data["vdom"]
router_multicast6_data = data["router_multicast6"]
- filtered_data = underscore_to_hyphen(
- filter_router_multicast6_data(router_multicast6_data)
- )
+ filtered_data = filter_router_multicast6_data(router_multicast6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "multicast6", data=filtered_data, vdom=vdom)
+ return fos.set("router", "multicast6", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast_flow.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast_flow.py
index df238ec09..0e2f8cf72 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast_flow.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_multicast_flow.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,9 +254,8 @@ def router_multicast_flow(data, fos, check_mode=False):
state = data["state"]
router_multicast_flow_data = data["router_multicast_flow"]
- filtered_data = underscore_to_hyphen(
- filter_router_multicast_flow_data(router_multicast_flow_data)
- )
+ filtered_data = filter_router_multicast_flow_data(router_multicast_flow_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -320,7 +319,7 @@ def router_multicast_flow(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "multicast-flow", data=filtered_data, vdom=vdom)
+ return fos.set("router", "multicast-flow", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf.py
index 3d896d83b..107453eea 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -989,9 +989,10 @@ def underscore_to_hyphen(data):
def router_ospf(data, fos):
vdom = data["vdom"]
router_ospf_data = data["router_ospf"]
- filtered_data = underscore_to_hyphen(filter_router_ospf_data(router_ospf_data))
+ filtered_data = filter_router_ospf_data(router_ospf_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "ospf", data=filtered_data, vdom=vdom)
+ return fos.set("router", "ospf", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf6.py
index e61090a42..825fdb518 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ospf6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -845,9 +845,10 @@ def underscore_to_hyphen(data):
def router_ospf6(data, fos):
vdom = data["vdom"]
router_ospf6_data = data["router_ospf6"]
- filtered_data = underscore_to_hyphen(filter_router_ospf6_data(router_ospf6_data))
+ filtered_data = filter_router_ospf6_data(router_ospf6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "ospf6", data=filtered_data, vdom=vdom)
+ return fos.set("router", "ospf6", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy.py
index 0531df11b..162d681d3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -439,7 +439,8 @@ def router_policy(data, fos, check_mode=False):
state = data["state"]
router_policy_data = data["router_policy"]
- filtered_data = underscore_to_hyphen(filter_router_policy_data(router_policy_data))
+ filtered_data = filter_router_policy_data(router_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -503,7 +504,7 @@ def router_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "policy", data=filtered_data, vdom=vdom)
+ return fos.set("router", "policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("router", "policy", mkey=filtered_data["seq-num"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy6.py
index 5fe015159..80ca57612 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_policy6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -439,9 +439,8 @@ def router_policy6(data, fos, check_mode=False):
state = data["state"]
router_policy6_data = data["router_policy6"]
- filtered_data = underscore_to_hyphen(
- filter_router_policy6_data(router_policy6_data)
- )
+ filtered_data = filter_router_policy6_data(router_policy6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -505,7 +504,7 @@ def router_policy6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "policy6", data=filtered_data, vdom=vdom)
+ return fos.set("router", "policy6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("router", "policy6", mkey=filtered_data["seq-num"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list.py
index 58a0d9e2a..d32afdad8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -272,9 +272,8 @@ def router_prefix_list(data, fos, check_mode=False):
state = data["state"]
router_prefix_list_data = data["router_prefix_list"]
- filtered_data = underscore_to_hyphen(
- filter_router_prefix_list_data(router_prefix_list_data)
- )
+ filtered_data = filter_router_prefix_list_data(router_prefix_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -338,7 +337,7 @@ def router_prefix_list(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "prefix-list", data=filtered_data, vdom=vdom)
+ return fos.set("router", "prefix-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list6.py
index 5943ff3ba..214fab158 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_prefix_list6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -272,9 +272,8 @@ def router_prefix_list6(data, fos, check_mode=False):
state = data["state"]
router_prefix_list6_data = data["router_prefix_list6"]
- filtered_data = underscore_to_hyphen(
- filter_router_prefix_list6_data(router_prefix_list6_data)
- )
+ filtered_data = filter_router_prefix_list6_data(router_prefix_list6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -338,7 +337,7 @@ def router_prefix_list6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "prefix-list6", data=filtered_data, vdom=vdom)
+ return fos.set("router", "prefix-list6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_rip.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_rip.py
index 416cbc629..040caf889 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_rip.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_rip.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -569,9 +569,10 @@ def router_rip(data, fos):
vdom = data["vdom"]
router_rip_data = data["router_rip"]
router_rip_data = flatten_multilists_attributes(router_rip_data)
- filtered_data = underscore_to_hyphen(filter_router_rip_data(router_rip_data))
+ filtered_data = filter_router_rip_data(router_rip_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "rip", data=filtered_data, vdom=vdom)
+ return fos.set("router", "rip", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ripng.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ripng.py
index 4fcc98607..9b90d4778 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ripng.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_ripng.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -503,9 +503,10 @@ def underscore_to_hyphen(data):
def router_ripng(data, fos):
vdom = data["vdom"]
router_ripng_data = data["router_ripng"]
- filtered_data = underscore_to_hyphen(filter_router_ripng_data(router_ripng_data))
+ filtered_data = filter_router_ripng_data(router_ripng_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "ripng", data=filtered_data, vdom=vdom)
+ return fos.set("router", "ripng", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_route_map.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_route_map.py
index 71e4f7e28..f2782ab4e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_route_map.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_route_map.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -360,6 +360,14 @@ options:
description:
- IP address of VPNv4 next-hop.
type: str
+ set_vpnv6_nexthop:
+ description:
+ - IPv6 global address of VPNv6 next-hop.
+ type: str
+ set_vpnv6_nexthop_local:
+ description:
+ - IPv6 link-local address of VPNv6 next-hop.
+ type: str
set_weight:
description:
- BGP weight for routing table.
@@ -432,6 +440,8 @@ EXAMPLES = """
set_route_tag: ""
set_tag: ""
set_vpnv4_nexthop: "<your_own_value>"
+ set_vpnv6_nexthop: "<your_own_value>"
+ set_vpnv6_nexthop_local: "<your_own_value>"
set_weight: ""
"""
@@ -555,9 +565,8 @@ def router_route_map(data, fos, check_mode=False):
state = data["state"]
router_route_map_data = data["router_route_map"]
- filtered_data = underscore_to_hyphen(
- filter_router_route_map_data(router_route_map_data)
- )
+ filtered_data = filter_router_route_map_data(router_route_map_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -621,7 +630,7 @@ def router_route_map(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "route-map", data=filtered_data, vdom=vdom)
+ return fos.set("router", "route-map", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("router", "route-map", mkey=filtered_data["name"], vdom=vdom)
@@ -811,6 +820,11 @@ versioned_schema = {
"v_range": [["v6.0.0", ""]],
"type": "string",
},
+ "set_vpnv6_nexthop": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "set_vpnv6_nexthop_local": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"set_local_preference": {
"v_range": [["v6.0.0", ""]],
"type": "integer",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_setting.py
index 72153d238..52d56bd52 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -354,11 +354,10 @@ def underscore_to_hyphen(data):
def router_setting(data, fos):
vdom = data["vdom"]
router_setting_data = data["router_setting"]
- filtered_data = underscore_to_hyphen(
- filter_router_setting_data(router_setting_data)
- )
+ filtered_data = filter_router_setting_data(router_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("router", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("router", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static.py
index 1f8f121ef..7b02d3473 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -391,7 +391,8 @@ def router_static(data, fos, check_mode=False):
state = data["state"]
router_static_data = data["router_static"]
- filtered_data = underscore_to_hyphen(filter_router_static_data(router_static_data))
+ filtered_data = filter_router_static_data(router_static_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -455,7 +456,7 @@ def router_static(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "static", data=filtered_data, vdom=vdom)
+ return fos.set("router", "static", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("router", "static", mkey=filtered_data["seq-num"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static6.py
index 12f9514e6..11e54085f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_router_static6.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -367,9 +367,8 @@ def router_static6(data, fos, check_mode=False):
state = data["state"]
router_static6_data = data["router_static6"]
- filtered_data = underscore_to_hyphen(
- filter_router_static6_data(router_static6_data)
- )
+ filtered_data = filter_router_static6_data(router_static6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -433,7 +432,7 @@ def router_static6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("router", "static6", data=filtered_data, vdom=vdom)
+ return fos.set("router", "static6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("router", "static6", mkey=filtered_data["seq-num"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_sctp_filter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_sctp_filter_profile.py
index 842bfaafc..40d10e821 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_sctp_filter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_sctp_filter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,12 +254,11 @@ def sctp_filter_profile(data, fos):
state = data["state"]
sctp_filter_profile_data = data["sctp_filter_profile"]
- filtered_data = underscore_to_hyphen(
- filter_sctp_filter_profile_data(sctp_filter_profile_data)
- )
+ filtered_data = filter_sctp_filter_profile_data(sctp_filter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("sctp-filter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("sctp-filter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bwl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bwl.py
index 1bb9aa9d1..76d96c6b1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bwl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bwl.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -307,9 +307,8 @@ def spamfilter_bwl(data, fos, check_mode=False):
state = data["state"]
spamfilter_bwl_data = data["spamfilter_bwl"]
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_bwl_data(spamfilter_bwl_data)
- )
+ filtered_data = filter_spamfilter_bwl_data(spamfilter_bwl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -373,7 +372,7 @@ def spamfilter_bwl(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("spamfilter", "bwl", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "bwl", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("spamfilter", "bwl", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bword.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bword.py
index 470f9c4d0..9aa1f5776 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bword.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_bword.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -308,9 +308,8 @@ def spamfilter_bword(data, fos, check_mode=False):
state = data["state"]
spamfilter_bword_data = data["spamfilter_bword"]
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_bword_data(spamfilter_bword_data)
- )
+ filtered_data = filter_spamfilter_bword_data(spamfilter_bword_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -374,7 +373,7 @@ def spamfilter_bword(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("spamfilter", "bword", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "bword", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("spamfilter", "bword", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_dnsbl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_dnsbl.py
index eda06eb82..c7d3587d9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_dnsbl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_dnsbl.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -272,9 +272,8 @@ def spamfilter_dnsbl(data, fos, check_mode=False):
state = data["state"]
spamfilter_dnsbl_data = data["spamfilter_dnsbl"]
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_dnsbl_data(spamfilter_dnsbl_data)
- )
+ filtered_data = filter_spamfilter_dnsbl_data(spamfilter_dnsbl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -338,7 +337,7 @@ def spamfilter_dnsbl(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("spamfilter", "dnsbl", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "dnsbl", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("spamfilter", "dnsbl", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_fortishield.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_fortishield.py
index 4ffbc6364..e3378a853 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_fortishield.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_fortishield.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -218,11 +218,10 @@ def underscore_to_hyphen(data):
def spamfilter_fortishield(data, fos):
vdom = data["vdom"]
spamfilter_fortishield_data = data["spamfilter_fortishield"]
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_fortishield_data(spamfilter_fortishield_data)
- )
+ filtered_data = filter_spamfilter_fortishield_data(spamfilter_fortishield_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("spamfilter", "fortishield", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "fortishield", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_iptrust.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_iptrust.py
index 4667c9b44..154bd3fd2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_iptrust.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_iptrust.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -277,9 +277,8 @@ def spamfilter_iptrust(data, fos, check_mode=False):
state = data["state"]
spamfilter_iptrust_data = data["spamfilter_iptrust"]
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_iptrust_data(spamfilter_iptrust_data)
- )
+ filtered_data = filter_spamfilter_iptrust_data(spamfilter_iptrust_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -343,7 +342,7 @@ def spamfilter_iptrust(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("spamfilter", "iptrust", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "iptrust", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("spamfilter", "iptrust", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_mheader.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_mheader.py
index d7e57b847..a0f27482e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_mheader.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_mheader.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -285,9 +285,8 @@ def spamfilter_mheader(data, fos, check_mode=False):
state = data["state"]
spamfilter_mheader_data = data["spamfilter_mheader"]
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_mheader_data(spamfilter_mheader_data)
- )
+ filtered_data = filter_spamfilter_mheader_data(spamfilter_mheader_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -351,7 +350,7 @@ def spamfilter_mheader(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("spamfilter", "mheader", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "mheader", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("spamfilter", "mheader", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_options.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_options.py
index 8d286d03c..93c7f38dd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_options.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_options.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -202,11 +202,10 @@ def underscore_to_hyphen(data):
def spamfilter_options(data, fos):
vdom = data["vdom"]
spamfilter_options_data = data["spamfilter_options"]
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_options_data(spamfilter_options_data)
- )
+ filtered_data = filter_spamfilter_options_data(spamfilter_options_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("spamfilter", "options", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "options", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_profile.py
index ecb7ecb08..c64149b32 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_spamfilter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -571,9 +571,8 @@ def spamfilter_profile(data, fos, check_mode=False):
spamfilter_profile_data = data["spamfilter_profile"]
spamfilter_profile_data = flatten_multilists_attributes(spamfilter_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_spamfilter_profile_data(spamfilter_profile_data)
- )
+ filtered_data = filter_spamfilter_profile_data(spamfilter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -637,7 +636,7 @@ def spamfilter_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("spamfilter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("spamfilter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ssh_filter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ssh_filter_profile.py
index a30e505aa..8f2c36a86 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_ssh_filter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_ssh_filter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -459,9 +459,8 @@ def ssh_filter_profile(data, fos, check_mode=False):
ssh_filter_profile_data = data["ssh_filter_profile"]
ssh_filter_profile_data = flatten_multilists_attributes(ssh_filter_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_ssh_filter_profile_data(ssh_filter_profile_data)
- )
+ filtered_data = filter_ssh_filter_profile_data(ssh_filter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -525,7 +524,7 @@ def ssh_filter_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("ssh-filter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("ssh-filter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_802_1x_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_802_1x_settings.py
index f4b2ef197..3effb7a26 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_802_1x_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_802_1x_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -94,6 +94,49 @@ options:
choices:
- 'disable'
- 'enable'
+ mac_called_station_delimiter:
+ description:
+ - MAC called station delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
+ mac_calling_station_delimiter:
+ description:
+ - MAC calling station delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
+ mac_case:
+ description:
+ - MAC case .
+ type: str
+ choices:
+ - 'lowercase'
+ - 'uppercase'
+ mac_password_delimiter:
+ description:
+ - MAC authentication password delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
+ mac_username_delimiter:
+ description:
+ - MAC authentication username delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
max_reauth_attempt:
description:
- Maximum number of authentication attempts (0 - 15).
@@ -115,6 +158,11 @@ EXAMPLES = """
switch_controller_802_1x_settings:
link_down_auth: "set-unauth"
mab_reauth: "disable"
+ mac_called_station_delimiter: "colon"
+ mac_calling_station_delimiter: "colon"
+ mac_case: "lowercase"
+ mac_password_delimiter: "colon"
+ mac_username_delimiter: "colon"
max_reauth_attempt: "3"
reauth_period: "60"
tx_period: "30"
@@ -203,6 +251,11 @@ def filter_switch_controller_802_1x_settings_data(json):
option_list = [
"link_down_auth",
"mab_reauth",
+ "mac_called_station_delimiter",
+ "mac_calling_station_delimiter",
+ "mac_case",
+ "mac_password_delimiter",
+ "mac_username_delimiter",
"max_reauth_attempt",
"reauth_period",
"tx_period",
@@ -234,14 +287,13 @@ def underscore_to_hyphen(data):
def switch_controller_802_1x_settings(data, fos):
vdom = data["vdom"]
switch_controller_802_1x_settings_data = data["switch_controller_802_1x_settings"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_802_1x_settings_data(
- switch_controller_802_1x_settings_data
- )
+ filtered_data = filter_switch_controller_802_1x_settings_data(
+ switch_controller_802_1x_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "switch-controller", "802-1X-settings", data=filtered_data, vdom=vdom
+ "switch-controller", "802-1X-settings", data=converted_data, vdom=vdom
)
@@ -292,6 +344,51 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
+ "mac_username_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_password_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_calling_station_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_called_station_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_case": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "lowercase"}, {"value": "uppercase"}],
+ },
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_group.py
index 3e473bc4f..1a54d87d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -230,12 +230,13 @@ def switch_controller_acl_group(data, fos):
state = data["state"]
switch_controller_acl_group_data = data["switch_controller_acl_group"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_acl_group_data(switch_controller_acl_group_data)
+ filtered_data = filter_switch_controller_acl_group_data(
+ switch_controller_acl_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("switch-controller.acl", "group", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller.acl", "group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_ingress.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_ingress.py
index 5b6798d08..9b637cce1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_ingress.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_acl_ingress.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -276,13 +276,14 @@ def switch_controller_acl_ingress(data, fos):
state = data["state"]
switch_controller_acl_ingress_data = data["switch_controller_acl_ingress"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_acl_ingress_data(switch_controller_acl_ingress_data)
+ filtered_data = filter_switch_controller_acl_ingress_data(
+ switch_controller_acl_ingress_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "switch-controller.acl", "ingress", data=filtered_data, vdom=vdom
+ "switch-controller.acl", "ingress", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_custom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_custom.py
index b469bd463..54eeeb1a5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_custom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_custom.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,11 +246,10 @@ def switch_controller_auto_config_custom(data, fos, check_mode=False):
switch_controller_auto_config_custom_data = data[
"switch_controller_auto_config_custom"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_auto_config_custom_data(
- switch_controller_auto_config_custom_data
- )
+ filtered_data = filter_switch_controller_auto_config_custom_data(
+ switch_controller_auto_config_custom_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -319,7 +318,7 @@ def switch_controller_auto_config_custom(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller.auto-config", "custom", data=filtered_data, vdom=vdom
+ "switch-controller.auto-config", "custom", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_default.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_default.py
index 5075f7804..cb4d85161 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_default.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_default.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -214,14 +214,13 @@ def switch_controller_auto_config_default(data, fos):
switch_controller_auto_config_default_data = data[
"switch_controller_auto_config_default"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_auto_config_default_data(
- switch_controller_auto_config_default_data
- )
+ filtered_data = filter_switch_controller_auto_config_default_data(
+ switch_controller_auto_config_default_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "switch-controller.auto-config", "default", data=filtered_data, vdom=vdom
+ "switch-controller.auto-config", "default", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_policy.py
index 5f1575ea4..1dd8e0a8c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_auto_config_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -268,11 +268,10 @@ def switch_controller_auto_config_policy(data, fos, check_mode=False):
switch_controller_auto_config_policy_data = data[
"switch_controller_auto_config_policy"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_auto_config_policy_data(
- switch_controller_auto_config_policy_data
- )
+ filtered_data = filter_switch_controller_auto_config_policy_data(
+ switch_controller_auto_config_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -341,7 +340,7 @@ def switch_controller_auto_config_policy(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller.auto-config", "policy", data=filtered_data, vdom=vdom
+ "switch-controller.auto-config", "policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_custom_command.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_custom_command.py
index a85aea787..aadd930de 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_custom_command.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_custom_command.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -236,11 +236,10 @@ def switch_controller_custom_command(data, fos, check_mode=False):
state = data["state"]
switch_controller_custom_command_data = data["switch_controller_custom_command"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_custom_command_data(
- switch_controller_custom_command_data
- )
+ filtered_data = filter_switch_controller_custom_command_data(
+ switch_controller_custom_command_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -309,7 +308,7 @@ def switch_controller_custom_command(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "custom-command", data=filtered_data, vdom=vdom
+ "switch-controller", "custom-command", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_dynamic_port_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_dynamic_port_policy.py
index 00c8c6a36..be4da2842 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_dynamic_port_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_dynamic_port_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -325,9 +325,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"802_1x": "set_802_1x"}
+ speciallist = {"802_1x": "set_802_1x"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -336,8 +336,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -355,12 +358,10 @@ def switch_controller_dynamic_port_policy(data, fos):
switch_controller_dynamic_port_policy_data = data[
"switch_controller_dynamic_port_policy"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_dynamic_port_policy_data(
- switch_controller_dynamic_port_policy_data
- )
+ filtered_data = filter_switch_controller_dynamic_port_policy_data(
+ switch_controller_dynamic_port_policy_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
if state == "present" or state is True:
return fos.set(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_flow_tracking.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_flow_tracking.py
index 8701a1206..a8bd09f3d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_flow_tracking.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_flow_tracking.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -367,13 +367,12 @@ def underscore_to_hyphen(data):
def switch_controller_flow_tracking(data, fos):
vdom = data["vdom"]
switch_controller_flow_tracking_data = data["switch_controller_flow_tracking"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_flow_tracking_data(
- switch_controller_flow_tracking_data
- )
+ filtered_data = filter_switch_controller_flow_tracking_data(
+ switch_controller_flow_tracking_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "flow-tracking", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "flow-tracking", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_fortilink_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_fortilink_settings.py
index a9b8df6ce..2d869b919 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_fortilink_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_fortilink_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -309,15 +309,14 @@ def switch_controller_fortilink_settings(data, fos):
switch_controller_fortilink_settings_data = data[
"switch_controller_fortilink_settings"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_fortilink_settings_data(
- switch_controller_fortilink_settings_data
- )
+ filtered_data = filter_switch_controller_fortilink_settings_data(
+ switch_controller_fortilink_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "switch-controller", "fortilink-settings", data=filtered_data, vdom=vdom
+ "switch-controller", "fortilink-settings", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_global.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_global.py
index d5e837e5a..f811bbeac 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_global.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_global.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -476,11 +476,10 @@ def switch_controller_global(data, fos):
switch_controller_global_data = flatten_multilists_attributes(
switch_controller_global_data
)
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_global_data(switch_controller_global_data)
- )
+ filtered_data = filter_switch_controller_global_data(switch_controller_global_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "global", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "global", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_igmp_snooping.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_igmp_snooping.py
index ac5ef6436..13539177c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_igmp_snooping.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_igmp_snooping.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -215,13 +215,12 @@ def underscore_to_hyphen(data):
def switch_controller_igmp_snooping(data, fos):
vdom = data["vdom"]
switch_controller_igmp_snooping_data = data["switch_controller_igmp_snooping"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_igmp_snooping_data(
- switch_controller_igmp_snooping_data
- )
+ filtered_data = filter_switch_controller_igmp_snooping_data(
+ switch_controller_igmp_snooping_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "igmp-snooping", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "igmp-snooping", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_template.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_template.py
index 10a586a4b..c2ab1a58e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_template.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_template.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -303,11 +303,10 @@ def switch_controller_initial_config_template(data, fos, check_mode=False):
switch_controller_initial_config_template_data = flatten_multilists_attributes(
switch_controller_initial_config_template_data
)
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_initial_config_template_data(
- switch_controller_initial_config_template_data
- )
+ filtered_data = filter_switch_controller_initial_config_template_data(
+ switch_controller_initial_config_template_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -378,7 +377,7 @@ def switch_controller_initial_config_template(data, fos, check_mode=False):
return fos.set(
"switch-controller.initial-config",
"template",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_vlans.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_vlans.py
index ef91f4419..81992eee9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_vlans.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_initial_config_vlans.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,14 +242,13 @@ def switch_controller_initial_config_vlans(data, fos):
switch_controller_initial_config_vlans_data = data[
"switch_controller_initial_config_vlans"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_initial_config_vlans_data(
- switch_controller_initial_config_vlans_data
- )
+ filtered_data = filter_switch_controller_initial_config_vlans_data(
+ switch_controller_initial_config_vlans_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "switch-controller.initial-config", "vlans", data=filtered_data, vdom=vdom
+ "switch-controller.initial-config", "vlans", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_profile.py
index 6ddfed159..e2700b2db 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -474,9 +474,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"802.1_tlvs": "tlvs_802dot1", "802.3_tlvs": "tlvs_802dot3"}
+ speciallist = {"802.1_tlvs": "tlvs_802dot1", "802.3_tlvs": "tlvs_802dot3"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -485,8 +485,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -505,10 +508,10 @@ def switch_controller_lldp_profile(data, fos, check_mode=False):
switch_controller_lldp_profile_data = flatten_multilists_attributes(
switch_controller_lldp_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_lldp_profile_data(switch_controller_lldp_profile_data)
+ filtered_data = filter_switch_controller_lldp_profile_data(
+ switch_controller_lldp_profile_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_settings.py
index 87e592664..2d4de2a5d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_lldp_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -243,13 +243,12 @@ def underscore_to_hyphen(data):
def switch_controller_lldp_settings(data, fos):
vdom = data["vdom"]
switch_controller_lldp_settings_data = data["switch_controller_lldp_settings"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_lldp_settings_data(
- switch_controller_lldp_settings_data
- )
+ filtered_data = filter_switch_controller_lldp_settings_data(
+ switch_controller_lldp_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "lldp-settings", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "lldp-settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_location.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_location.py
index 29911a7ab..3e7359ad5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_location.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_location.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -460,9 +460,10 @@ def switch_controller_location(data, fos, check_mode=False):
state = data["state"]
switch_controller_location_data = data["switch_controller_location"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_location_data(switch_controller_location_data)
+ filtered_data = filter_switch_controller_location_data(
+ switch_controller_location_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -526,7 +527,7 @@ def switch_controller_location(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("switch-controller", "location", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "location", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_policy.py
index a54d3465f..c1e658d35 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,9 +278,10 @@ def switch_controller_mac_policy(data, fos, check_mode=False):
state = data["state"]
switch_controller_mac_policy_data = data["switch_controller_mac_policy"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_mac_policy_data(switch_controller_mac_policy_data)
+ filtered_data = filter_switch_controller_mac_policy_data(
+ switch_controller_mac_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -344,7 +345,9 @@ def switch_controller_mac_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("switch-controller", "mac-policy", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "switch-controller", "mac-policy", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_sync_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_sync_settings.py
index 4a5109d1e..2f0a33073 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_sync_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_mac_sync_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -204,14 +204,13 @@ def switch_controller_mac_sync_settings(data, fos):
switch_controller_mac_sync_settings_data = data[
"switch_controller_mac_sync_settings"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_mac_sync_settings_data(
- switch_controller_mac_sync_settings_data
- )
+ filtered_data = filter_switch_controller_mac_sync_settings_data(
+ switch_controller_mac_sync_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "switch-controller", "mac-sync-settings", data=filtered_data, vdom=vdom
+ "switch-controller", "mac-sync-settings", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_managed_switch.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_managed_switch.py
index 371802cc2..de1c3567c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_managed_switch.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_managed_switch.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -114,6 +114,49 @@ options:
choices:
- 'disable'
- 'enable'
+ mac_called_station_delimiter:
+ description:
+ - MAC called station delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
+ mac_calling_station_delimiter:
+ description:
+ - MAC calling station delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
+ mac_case:
+ description:
+ - MAC case .
+ type: str
+ choices:
+ - 'lowercase'
+ - 'uppercase'
+ mac_password_delimiter:
+ description:
+ - MAC authentication password delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
+ mac_username_delimiter:
+ description:
+ - MAC authentication username delimiter .
+ type: str
+ choices:
+ - 'colon'
+ - 'hyphen'
+ - 'none'
+ - 'single-hyphen'
max_reauth_attempt:
description:
- Maximum number of authentication attempts (0 - 15).
@@ -355,6 +398,10 @@ options:
choices:
- 'enable'
- 'disable'
+ mgmt_mode:
+ description:
+ - FortiLink management mode.
+ type: int
mirror:
description:
- Configuration method to edit FortiSwitch packet mirror.
@@ -612,6 +659,7 @@ options:
- 'disabled'
- 'cl74'
- 'cl91'
+ - 'detect-by-module'
fgt_peer_device_name:
description:
- FGT peer device name.
@@ -1133,6 +1181,20 @@ options:
choices:
- 'disable'
- 'enable'
+ purdue_level:
+ description:
+ - Purdue Level of this FortiSwitch.
+ type: str
+ choices:
+ - '1'
+ - '1.5'
+ - '2'
+ - '2.5'
+ - '3'
+ - '3.5'
+ - '4'
+ - '5'
+ - '5.5'
qos_drop_policy:
description:
- Set QoS drop-policy.
@@ -1144,6 +1206,17 @@ options:
description:
- Set QoS RED/WRED drop probability.
type: int
+ radius_nas_ip:
+ description:
+ - NAS-IP address.
+ type: str
+ radius_nas_ip_override:
+ description:
+ - Use locally defined NAS-IP.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
remote_log:
description:
- Configure logging by FortiSwitch device to a remote syslog server.
@@ -1689,6 +1762,21 @@ options:
description:
- FortiSwitch version.
type: int
+ vlan:
+ description:
+ - Configure VLAN assignment priority.
+ type: list
+ elements: dict
+ suboptions:
+ assignment_priority:
+ description:
+ - 802.1x Radius (Tunnel-Private-Group-Id) VLANID assign-by-name priority. A smaller value has a higher priority.
+ type: int
+ vlan_name:
+ description:
+ - VLAN name. Source system.interface.name.
+ required: true
+ type: str
"""
EXAMPLES = """
@@ -1702,6 +1790,11 @@ EXAMPLES = """
link_down_auth: "set-unauth"
local_override: "enable"
mab_reauth: "disable"
+ mac_called_station_delimiter: "colon"
+ mac_calling_station_delimiter: "colon"
+ mac_case: "lowercase"
+ mac_password_delimiter: "colon"
+ mac_username_delimiter: "colon"
max_reauth_attempt: "3"
reauth_period: "60"
tx_period: "30"
@@ -1717,7 +1810,7 @@ EXAMPLES = """
-
ip: "<your_own_value>"
mac: "<your_own_value>"
- name: "default_name_20"
+ name: "default_name_25"
port: "<your_own_value>"
vlan: "<your_own_value> (source system.interface.name)"
directly_connected: "0"
@@ -1754,19 +1847,20 @@ EXAMPLES = """
l3_discovered: "0"
max_allowed_trunk_members: "0"
mclag_igmp_snooping_aware: "enable"
+ mgmt_mode: "0"
mirror:
-
dst: "<your_own_value>"
- name: "default_name_56"
+ name: "default_name_62"
src_egress:
-
- name: "default_name_58"
+ name: "default_name_64"
src_ingress:
-
- name: "default_name_60"
+ name: "default_name_66"
status: "active"
switching_packet: "enable"
- name: "default_name_63"
+ name: "default_name_69"
override_snmp_community: "enable"
override_snmp_sysinfo: "disable"
override_snmp_trap_threshold: "enable"
@@ -1780,7 +1874,7 @@ EXAMPLES = """
access_mode: "dynamic"
acl_group:
-
- name: "default_name_75 (source switch-controller.acl.group.name)"
+ name: "default_name_81 (source switch-controller.acl.group.name)"
aggregator_mode: "bandwidth"
allowed_vlans:
-
@@ -1818,7 +1912,7 @@ EXAMPLES = """
fortilink_port: "0"
fortiswitch_acls:
-
- id: "109"
+ id: "115"
igmp_snooping: "enable"
igmp_snooping_flood_reports: "enable"
igmps_flood_reports: "enable"
@@ -1899,13 +1993,16 @@ EXAMPLES = """
pre_provisioned: "0"
ptp_profile: "<your_own_value> (source switch-controller.ptp.profile.name)"
ptp_status: "disable"
+ purdue_level: "1"
qos_drop_policy: "taildrop"
qos_red_probability: "12"
+ radius_nas_ip: "<your_own_value>"
+ radius_nas_ip_override: "disable"
remote_log:
-
csv: "enable"
facility: "kernel"
- name: "default_name_192"
+ name: "default_name_201"
port: "514"
server: "192.168.100.40"
severity: "emergency"
@@ -1922,10 +2019,10 @@ EXAMPLES = """
events: "cpu-high"
hosts:
-
- id: "206"
+ id: "215"
ip: "<your_own_value>"
- id: "208"
- name: "default_name_209"
+ id: "217"
+ name: "default_name_218"
query_v1_port: "161"
query_v1_status: "disable"
query_v2c_port: "161"
@@ -1951,7 +2048,7 @@ EXAMPLES = """
-
auth_proto: "md5"
auth_pwd: "<your_own_value>"
- name: "default_name_234"
+ name: "default_name_243"
priv_proto: "aes128"
priv_pwd: "<your_own_value>"
queries: "disable"
@@ -1961,7 +2058,7 @@ EXAMPLES = """
static_mac:
-
description: "<your_own_value>"
- id: "243"
+ id: "252"
interface: "<your_own_value>"
mac: "<your_own_value>"
type: "static"
@@ -1974,7 +2071,7 @@ EXAMPLES = """
unknown_unicast: "enable"
stp_instance:
-
- id: "255"
+ id: "264"
priority: "0"
stp_settings:
forward_time: "15"
@@ -1982,7 +2079,7 @@ EXAMPLES = """
local_override: "enable"
max_age: "20"
max_hops: "20"
- name: "default_name_263"
+ name: "default_name_272"
pending_timer: "4"
revision: "0"
status: "enable"
@@ -1999,6 +2096,10 @@ EXAMPLES = """
tdr_supported: "<your_own_value>"
type: "virtual"
version: "0"
+ vlan:
+ -
+ assignment_priority: "128"
+ vlan_name: "<your_own_value> (source system.interface.name)"
"""
RETURN = """
@@ -2114,6 +2215,7 @@ def filter_switch_controller_managed_switch_data(json):
"l3_discovered",
"max_allowed_trunk_members",
"mclag_igmp_snooping_aware",
+ "mgmt_mode",
"mirror",
"name",
"override_snmp_community",
@@ -2128,8 +2230,11 @@ def filter_switch_controller_managed_switch_data(json):
"pre_provisioned",
"ptp_profile",
"ptp_status",
+ "purdue_level",
"qos_drop_policy",
"qos_red_probability",
+ "radius_nas_ip",
+ "radius_nas_ip_override",
"remote_log",
"route_offload",
"route_offload_mclag",
@@ -2153,6 +2258,7 @@ def filter_switch_controller_managed_switch_data(json):
"tdr_supported",
"type",
"version",
+ "vlan",
]
json = remove_invalid_fields(json)
@@ -2208,9 +2314,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"802_1X_settings": "settings_802_1X"}
+ speciallist = {"802_1X_settings": "settings_802_1X"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -2219,8 +2325,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -2239,12 +2348,10 @@ def switch_controller_managed_switch(data, fos, check_mode=False):
switch_controller_managed_switch_data = flatten_multilists_attributes(
switch_controller_managed_switch_data
)
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_managed_switch_data(
- switch_controller_managed_switch_data
- )
+ filtered_data = filter_switch_controller_managed_switch_data(
+ switch_controller_managed_switch_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
@@ -2367,6 +2474,21 @@ versioned_schema = {
"description": {"v_range": [["v6.0.0", ""]], "type": "string"},
"switch_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"access_profile": {"v_range": [["v6.2.0", ""]], "type": "string"},
+ "purdue_level": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "1"},
+ {"value": "1.5"},
+ {"value": "2"},
+ {"value": "2.5"},
+ {"value": "3"},
+ {"value": "3.5"},
+ {"value": "4"},
+ {"value": "5"},
+ {"value": "5.5"},
+ ],
+ },
"fsw_wan1_peer": {"v_range": [["v6.0.0", ""]], "type": "string"},
"fsw_wan1_admin": {
"v_range": [["v6.0.0", ""]],
@@ -2399,6 +2521,7 @@ versioned_schema = {
"type": "integer",
},
"pre_provisioned": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "mgmt_mode": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"dynamic_capability": {"v_range": [["v6.0.0", ""]], "type": "string"},
"switch_device_tag": {"v_range": [["v6.0.0", ""]], "type": "string"},
"switch_dhcp_opt43_key": {"v_range": [["v6.4.0", ""]], "type": "string"},
@@ -2413,6 +2536,12 @@ versioned_schema = {
"options": [{"value": "disable"}, {"value": "enable"}],
},
"ptp_profile": {"v_range": [["v7.4.1", ""]], "type": "string"},
+ "radius_nas_ip_override": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "radius_nas_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
"route_offload": {
"v_range": [["v7.4.1", ""]],
"type": "string",
@@ -2436,6 +2565,19 @@ versioned_schema = {
},
"v_range": [["v7.4.1", ""]],
},
+ "vlan": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "vlan_name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ },
+ "assignment_priority": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"type": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -2831,6 +2973,7 @@ versioned_schema = {
{"value": "disabled"},
{"value": "cl74"},
{"value": "cl91"},
+ {"value": "detect-by-module", "v_range": [["v7.4.2", ""]]},
],
},
"flow_control": {
@@ -3665,6 +3808,51 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
+ "mac_username_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_password_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_calling_station_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_called_station_delimiter": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "colon"},
+ {"value": "hyphen"},
+ {"value": "none"},
+ {"value": "single-hyphen"},
+ ],
+ },
+ "mac_case": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "lowercase"}, {"value": "uppercase"}],
+ },
},
},
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_device.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_device.py
index e713a3b8a..15f2234d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_device.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_device.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -277,12 +277,15 @@ def switch_controller_nac_device(data, fos):
state = data["state"]
switch_controller_nac_device_data = data["switch_controller_nac_device"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_nac_device_data(switch_controller_nac_device_data)
+ filtered_data = filter_switch_controller_nac_device_data(
+ switch_controller_nac_device_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("switch-controller", "nac-device", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "switch-controller", "nac-device", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_settings.py
index 8712ab0e3..516efed77 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_nac_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -277,9 +277,10 @@ def switch_controller_nac_settings(data, fos, check_mode=False):
state = data["state"]
switch_controller_nac_settings_data = data["switch_controller_nac_settings"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_nac_settings_data(switch_controller_nac_settings_data)
+ filtered_data = filter_switch_controller_nac_settings_data(
+ switch_controller_nac_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -348,7 +349,7 @@ def switch_controller_nac_settings(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "nac-settings", data=filtered_data, vdom=vdom
+ "switch-controller", "nac-settings", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_network_monitor_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_network_monitor_settings.py
index f44991fd4..b2b21590a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_network_monitor_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_network_monitor_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -207,14 +207,13 @@ def switch_controller_network_monitor_settings(data, fos):
switch_controller_network_monitor_settings_data = data[
"switch_controller_network_monitor_settings"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_network_monitor_settings_data(
- switch_controller_network_monitor_settings_data
- )
+ filtered_data = filter_switch_controller_network_monitor_settings_data(
+ switch_controller_network_monitor_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "switch-controller", "network-monitor-settings", data=filtered_data, vdom=vdom
+ "switch-controller", "network-monitor-settings", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_poe.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_poe.py
index 2ae26feca..e6be7670b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_poe.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_poe.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<fortiswitch_id>": "fortiswitch_id"}
+ speciallist = {"<fortiswitch_id>": "fortiswitch_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def switch_controller_poe(data, fos):
vdom = data["vdom"]
switch_controller_poe_data = data["switch_controller_poe"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_poe_data(switch_controller_poe_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_switch_controller_poe_data(switch_controller_poe_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("switch-controller", "poe", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_port_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_port_policy.py
index f29345bd9..cf2d69a75 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_port_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_port_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -269,9 +269,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"802_1x": "set_802_1x"}
+ speciallist = {"802_1x": "set_802_1x"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -280,8 +280,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -297,10 +300,10 @@ def switch_controller_port_policy(data, fos, check_mode=False):
state = data["state"]
switch_controller_port_policy_data = data["switch_controller_port_policy"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_port_policy_data(switch_controller_port_policy_data)
+ filtered_data = filter_switch_controller_port_policy_data(
+ switch_controller_port_policy_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_interface_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_interface_policy.py
index 7dca2d320..eedeeb8f7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_interface_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_interface_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -233,15 +233,14 @@ def switch_controller_ptp_interface_policy(data, fos):
switch_controller_ptp_interface_policy_data = data[
"switch_controller_ptp_interface_policy"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_ptp_interface_policy_data(
- switch_controller_ptp_interface_policy_data
- )
+ filtered_data = filter_switch_controller_ptp_interface_policy_data(
+ switch_controller_ptp_interface_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "switch-controller.ptp", "interface-policy", data=filtered_data, vdom=vdom
+ "switch-controller.ptp", "interface-policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_policy.py
index 826ae004d..4de4f7785 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -233,9 +233,10 @@ def switch_controller_ptp_policy(data, fos, check_mode=False):
state = data["state"]
switch_controller_ptp_policy_data = data["switch_controller_ptp_policy"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_ptp_policy_data(switch_controller_ptp_policy_data)
+ filtered_data = filter_switch_controller_ptp_policy_data(
+ switch_controller_ptp_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -299,7 +300,9 @@ def switch_controller_ptp_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("switch-controller.ptp", "policy", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "switch-controller.ptp", "policy", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_profile.py
index f8ac99a13..d006fd741 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -268,13 +268,14 @@ def switch_controller_ptp_profile(data, fos):
state = data["state"]
switch_controller_ptp_profile_data = data["switch_controller_ptp_profile"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_ptp_profile_data(switch_controller_ptp_profile_data)
+ filtered_data = filter_switch_controller_ptp_profile_data(
+ switch_controller_ptp_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "switch-controller.ptp", "profile", data=filtered_data, vdom=vdom
+ "switch-controller.ptp", "profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_settings.py
index 4629bb179..521a8a023 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_ptp_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -206,11 +206,12 @@ def underscore_to_hyphen(data):
def switch_controller_ptp_settings(data, fos):
vdom = data["vdom"]
switch_controller_ptp_settings_data = data["switch_controller_ptp_settings"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_ptp_settings_data(switch_controller_ptp_settings_data)
+ filtered_data = filter_switch_controller_ptp_settings_data(
+ switch_controller_ptp_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller.ptp", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller.ptp", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_dot1p_map.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_dot1p_map.py
index 843855b76..c8e2978a5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_dot1p_map.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_dot1p_map.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -362,11 +362,10 @@ def switch_controller_qos_dot1p_map(data, fos, check_mode=False):
state = data["state"]
switch_controller_qos_dot1p_map_data = data["switch_controller_qos_dot1p_map"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_qos_dot1p_map_data(
- switch_controller_qos_dot1p_map_data
- )
+ filtered_data = filter_switch_controller_qos_dot1p_map_data(
+ switch_controller_qos_dot1p_map_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -435,7 +434,7 @@ def switch_controller_qos_dot1p_map(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller.qos", "dot1p-map", data=filtered_data, vdom=vdom
+ "switch-controller.qos", "dot1p-map", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_ip_dscp_map.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_ip_dscp_map.py
index 0824b7a1c..678ccc078 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_ip_dscp_map.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_ip_dscp_map.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -330,11 +330,10 @@ def switch_controller_qos_ip_dscp_map(data, fos, check_mode=False):
switch_controller_qos_ip_dscp_map_data = flatten_multilists_attributes(
switch_controller_qos_ip_dscp_map_data
)
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_qos_ip_dscp_map_data(
- switch_controller_qos_ip_dscp_map_data
- )
+ filtered_data = filter_switch_controller_qos_ip_dscp_map_data(
+ switch_controller_qos_ip_dscp_map_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -403,7 +402,7 @@ def switch_controller_qos_ip_dscp_map(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller.qos", "ip-dscp-map", data=filtered_data, vdom=vdom
+ "switch-controller.qos", "ip-dscp-map", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_qos_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_qos_policy.py
index 43c79f344..439e00e4a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_qos_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_qos_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -251,11 +251,10 @@ def switch_controller_qos_qos_policy(data, fos, check_mode=False):
state = data["state"]
switch_controller_qos_qos_policy_data = data["switch_controller_qos_qos_policy"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_qos_qos_policy_data(
- switch_controller_qos_qos_policy_data
- )
+ filtered_data = filter_switch_controller_qos_qos_policy_data(
+ switch_controller_qos_qos_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -324,7 +323,7 @@ def switch_controller_qos_qos_policy(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller.qos", "qos-policy", data=filtered_data, vdom=vdom
+ "switch-controller.qos", "qos-policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_queue_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_queue_policy.py
index 36812dace..e24b31d59 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_queue_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_qos_queue_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -302,11 +302,10 @@ def switch_controller_qos_queue_policy(data, fos, check_mode=False):
state = data["state"]
switch_controller_qos_queue_policy_data = data["switch_controller_qos_queue_policy"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_qos_queue_policy_data(
- switch_controller_qos_queue_policy_data
- )
+ filtered_data = filter_switch_controller_qos_queue_policy_data(
+ switch_controller_qos_queue_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -375,7 +374,7 @@ def switch_controller_qos_queue_policy(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller.qos", "queue-policy", data=filtered_data, vdom=vdom
+ "switch-controller.qos", "queue-policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_quarantine.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_quarantine.py
index 912ca70cc..1ba572005 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_quarantine.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_quarantine.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -243,11 +243,12 @@ def underscore_to_hyphen(data):
def switch_controller_quarantine(data, fos):
vdom = data["vdom"]
switch_controller_quarantine_data = data["switch_controller_quarantine"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_quarantine_data(switch_controller_quarantine_data)
+ filtered_data = filter_switch_controller_quarantine_data(
+ switch_controller_quarantine_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "quarantine", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "quarantine", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_remote_log.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_remote_log.py
index 1299aaab0..764215e6e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_remote_log.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_remote_log.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -295,9 +295,10 @@ def switch_controller_remote_log(data, fos, check_mode=False):
state = data["state"]
switch_controller_remote_log_data = data["switch_controller_remote_log"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_remote_log_data(switch_controller_remote_log_data)
+ filtered_data = filter_switch_controller_remote_log_data(
+ switch_controller_remote_log_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -361,7 +362,9 @@ def switch_controller_remote_log(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("switch-controller", "remote-log", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "switch-controller", "remote-log", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_802_1x.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_802_1x.py
index a118f082f..5d339252b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_802_1x.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_802_1x.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -384,11 +384,10 @@ def switch_controller_security_policy_802_1x(data, fos, check_mode=False):
switch_controller_security_policy_802_1x_data = data[
"switch_controller_security_policy_802_1x"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_security_policy_802_1x_data(
- switch_controller_security_policy_802_1x_data
- )
+ filtered_data = filter_switch_controller_security_policy_802_1x_data(
+ switch_controller_security_policy_802_1x_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -457,7 +456,10 @@ def switch_controller_security_policy_802_1x(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller.security-policy", "802-1X", data=filtered_data, vdom=vdom
+ "switch-controller.security-policy",
+ "802-1X",
+ data=converted_data,
+ vdom=vdom,
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_captive_portal.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_captive_portal.py
index 06ddb93e7..c990132f4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_captive_portal.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_captive_portal.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -239,11 +239,10 @@ def switch_controller_security_policy_captive_portal(data, fos, check_mode=False
switch_controller_security_policy_captive_portal_data = data[
"switch_controller_security_policy_captive_portal"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_security_policy_captive_portal_data(
- switch_controller_security_policy_captive_portal_data
- )
+ filtered_data = filter_switch_controller_security_policy_captive_portal_data(
+ switch_controller_security_policy_captive_portal_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -317,7 +316,7 @@ def switch_controller_security_policy_captive_portal(data, fos, check_mode=False
return fos.set(
"switch-controller.security-policy",
"captive-portal",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_local_access.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_local_access.py
index d589a81e8..f66658474 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_local_access.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_security_policy_local_access.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -288,11 +288,10 @@ def switch_controller_security_policy_local_access(data, fos, check_mode=False):
switch_controller_security_policy_local_access_data = flatten_multilists_attributes(
switch_controller_security_policy_local_access_data
)
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_security_policy_local_access_data(
- switch_controller_security_policy_local_access_data
- )
+ filtered_data = filter_switch_controller_security_policy_local_access_data(
+ switch_controller_security_policy_local_access_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -366,7 +365,7 @@ def switch_controller_security_policy_local_access(data, fos, check_mode=False):
return fos.set(
"switch-controller.security-policy",
"local-access",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_sflow.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_sflow.py
index 8c2d6a975..ce5ab5fbb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_sflow.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_sflow.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -207,11 +207,10 @@ def underscore_to_hyphen(data):
def switch_controller_sflow(data, fos):
vdom = data["vdom"]
switch_controller_sflow_data = data["switch_controller_sflow"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_sflow_data(switch_controller_sflow_data)
- )
+ filtered_data = filter_switch_controller_sflow_data(switch_controller_sflow_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "sflow", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "sflow", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_community.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_community.py
index 19ff03854..a0e466d90 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_community.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_community.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -381,11 +381,10 @@ def switch_controller_snmp_community(data, fos, check_mode=False):
switch_controller_snmp_community_data = flatten_multilists_attributes(
switch_controller_snmp_community_data
)
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_snmp_community_data(
- switch_controller_snmp_community_data
- )
+ filtered_data = filter_switch_controller_snmp_community_data(
+ switch_controller_snmp_community_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -454,7 +453,7 @@ def switch_controller_snmp_community(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "snmp-community", data=filtered_data, vdom=vdom
+ "switch-controller", "snmp-community", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_sysinfo.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_sysinfo.py
index 6bdbd18f5..1b0618324 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_sysinfo.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_sysinfo.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -225,11 +225,12 @@ def underscore_to_hyphen(data):
def switch_controller_snmp_sysinfo(data, fos):
vdom = data["vdom"]
switch_controller_snmp_sysinfo_data = data["switch_controller_snmp_sysinfo"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_snmp_sysinfo_data(switch_controller_snmp_sysinfo_data)
+ filtered_data = filter_switch_controller_snmp_sysinfo_data(
+ switch_controller_snmp_sysinfo_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "snmp-sysinfo", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "snmp-sysinfo", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_trap_threshold.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_trap_threshold.py
index 6131cc366..4b130261d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_trap_threshold.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_trap_threshold.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -218,14 +218,13 @@ def switch_controller_snmp_trap_threshold(data, fos):
switch_controller_snmp_trap_threshold_data = data[
"switch_controller_snmp_trap_threshold"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_snmp_trap_threshold_data(
- switch_controller_snmp_trap_threshold_data
- )
+ filtered_data = filter_switch_controller_snmp_trap_threshold_data(
+ switch_controller_snmp_trap_threshold_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "switch-controller", "snmp-trap-threshold", data=filtered_data, vdom=vdom
+ "switch-controller", "snmp-trap-threshold", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_user.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_user.py
index b87c9e5de..b6d6892eb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_user.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_snmp_user.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -292,9 +292,10 @@ def switch_controller_snmp_user(data, fos, check_mode=False):
state = data["state"]
switch_controller_snmp_user_data = data["switch_controller_snmp_user"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_snmp_user_data(switch_controller_snmp_user_data)
+ filtered_data = filter_switch_controller_snmp_user_data(
+ switch_controller_snmp_user_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -358,7 +359,7 @@ def switch_controller_snmp_user(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("switch-controller", "snmp-user", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "snmp-user", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control.py
index 9c3e92953..9d62eaf06 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -226,13 +226,12 @@ def underscore_to_hyphen(data):
def switch_controller_storm_control(data, fos):
vdom = data["vdom"]
switch_controller_storm_control_data = data["switch_controller_storm_control"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_storm_control_data(
- switch_controller_storm_control_data
- )
+ filtered_data = filter_switch_controller_storm_control_data(
+ switch_controller_storm_control_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "storm-control", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "storm-control", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control_policy.py
index 7f8ab0592..b836bbd50 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_storm_control_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,11 +278,10 @@ def switch_controller_storm_control_policy(data, fos, check_mode=False):
switch_controller_storm_control_policy_data = data[
"switch_controller_storm_control_policy"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_storm_control_policy_data(
- switch_controller_storm_control_policy_data
- )
+ filtered_data = filter_switch_controller_storm_control_policy_data(
+ switch_controller_storm_control_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -351,7 +350,7 @@ def switch_controller_storm_control_policy(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "storm-control-policy", data=filtered_data, vdom=vdom
+ "switch-controller", "storm-control-policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_instance.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_instance.py
index 2b9af5201..cbdccc05c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_instance.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_instance.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -239,9 +239,10 @@ def switch_controller_stp_instance(data, fos, check_mode=False):
state = data["state"]
switch_controller_stp_instance_data = data["switch_controller_stp_instance"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_stp_instance_data(switch_controller_stp_instance_data)
+ filtered_data = filter_switch_controller_stp_instance_data(
+ switch_controller_stp_instance_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -310,7 +311,7 @@ def switch_controller_stp_instance(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "stp-instance", data=filtered_data, vdom=vdom
+ "switch-controller", "stp-instance", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_settings.py
index b81753ff2..3e7c4e41b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_stp_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,11 +249,12 @@ def underscore_to_hyphen(data):
def switch_controller_stp_settings(data, fos):
vdom = data["vdom"]
switch_controller_stp_settings_data = data["switch_controller_stp_settings"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_stp_settings_data(switch_controller_stp_settings_data)
+ filtered_data = filter_switch_controller_stp_settings_data(
+ switch_controller_stp_settings_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "stp-settings", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "stp-settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_group.py
index b2f2657b7..3f8b86ddb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,9 +254,10 @@ def switch_controller_switch_group(data, fos, check_mode=False):
state = data["state"]
switch_controller_switch_group_data = data["switch_controller_switch_group"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_switch_group_data(switch_controller_switch_group_data)
+ filtered_data = filter_switch_controller_switch_group_data(
+ switch_controller_switch_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -325,7 +326,7 @@ def switch_controller_switch_group(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "switch-group", data=filtered_data, vdom=vdom
+ "switch-controller", "switch-group", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_interface_tag.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_interface_tag.py
index 6bc14b534..543999a6c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_interface_tag.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_interface_tag.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -227,11 +227,10 @@ def switch_controller_switch_interface_tag(data, fos, check_mode=False):
switch_controller_switch_interface_tag_data = data[
"switch_controller_switch_interface_tag"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_switch_interface_tag_data(
- switch_controller_switch_interface_tag_data
- )
+ filtered_data = filter_switch_controller_switch_interface_tag_data(
+ switch_controller_switch_interface_tag_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -300,7 +299,7 @@ def switch_controller_switch_interface_tag(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "switch-interface-tag", data=filtered_data, vdom=vdom
+ "switch-controller", "switch-interface-tag", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_log.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_log.py
index 64ae1f08b..c2495d60e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_log.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_log.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -219,11 +219,12 @@ def underscore_to_hyphen(data):
def switch_controller_switch_log(data, fos):
vdom = data["vdom"]
switch_controller_switch_log_data = data["switch_controller_switch_log"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_switch_log_data(switch_controller_switch_log_data)
+ filtered_data = filter_switch_controller_switch_log_data(
+ switch_controller_switch_log_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "switch-log", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "switch-log", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_profile.py
index ce6ed48e6..a73419154 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_switch_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -270,11 +270,10 @@ def switch_controller_switch_profile(data, fos, check_mode=False):
state = data["state"]
switch_controller_switch_profile_data = data["switch_controller_switch_profile"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_switch_profile_data(
- switch_controller_switch_profile_data
- )
+ filtered_data = filter_switch_controller_switch_profile_data(
+ switch_controller_switch_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -343,7 +342,7 @@ def switch_controller_switch_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "switch-profile", data=filtered_data, vdom=vdom
+ "switch-controller", "switch-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_system.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_system.py
index fe364887f..380693c8d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_system.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_system.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -133,6 +133,7 @@ options:
type: str
choices:
- 'compatible'
+ - 'moderate'
- 'strict'
"""
@@ -276,11 +277,10 @@ def underscore_to_hyphen(data):
def switch_controller_system(data, fos):
vdom = data["vdom"]
switch_controller_system_data = data["switch_controller_system"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_system_data(switch_controller_system_data)
- )
+ filtered_data = filter_switch_controller_system_data(switch_controller_system_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("switch-controller", "system", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "system", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -333,7 +333,11 @@ versioned_schema = {
"tunnel_mode": {
"v_range": [["v7.0.0", ""]],
"type": "string",
- "options": [{"value": "compatible"}, {"value": "strict"}],
+ "options": [
+ {"value": "compatible"},
+ {"value": "moderate", "v_range": [["v7.4.2", ""]]},
+ {"value": "strict"},
+ ],
},
"caputp_echo_interval": {"v_range": [["v7.4.0", ""]], "type": "integer"},
"caputp_max_retransmit": {"v_range": [["v7.4.0", ""]], "type": "integer"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_policy.py
index 5a77f22b4..3cd250349 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -281,11 +281,10 @@ def switch_controller_traffic_policy(data, fos, check_mode=False):
state = data["state"]
switch_controller_traffic_policy_data = data["switch_controller_traffic_policy"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_traffic_policy_data(
- switch_controller_traffic_policy_data
- )
+ filtered_data = filter_switch_controller_traffic_policy_data(
+ switch_controller_traffic_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -354,7 +353,7 @@ def switch_controller_traffic_policy(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "traffic-policy", data=filtered_data, vdom=vdom
+ "switch-controller", "traffic-policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_sniffer.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_sniffer.py
index 18661d727..65d74c38b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_sniffer.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_traffic_sniffer.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -316,14 +316,13 @@ def underscore_to_hyphen(data):
def switch_controller_traffic_sniffer(data, fos):
vdom = data["vdom"]
switch_controller_traffic_sniffer_data = data["switch_controller_traffic_sniffer"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_traffic_sniffer_data(
- switch_controller_traffic_sniffer_data
- )
+ filtered_data = filter_switch_controller_traffic_sniffer_data(
+ switch_controller_traffic_sniffer_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "switch-controller", "traffic-sniffer", data=filtered_data, vdom=vdom
+ "switch-controller", "traffic-sniffer", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_virtual_port_pool.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_virtual_port_pool.py
index 0080d51b0..db220aa1b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_virtual_port_pool.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_virtual_port_pool.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,11 +232,10 @@ def switch_controller_virtual_port_pool(data, fos, check_mode=False):
switch_controller_virtual_port_pool_data = data[
"switch_controller_virtual_port_pool"
]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_virtual_port_pool_data(
- switch_controller_virtual_port_pool_data
- )
+ filtered_data = filter_switch_controller_virtual_port_pool_data(
+ switch_controller_virtual_port_pool_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -305,7 +304,7 @@ def switch_controller_virtual_port_pool(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "virtual-port-pool", data=filtered_data, vdom=vdom
+ "switch-controller", "virtual-port-pool", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan.py
index 059f692f2..12f64fee3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -330,9 +330,8 @@ def switch_controller_vlan(data, fos, check_mode=False):
state = data["state"]
switch_controller_vlan_data = data["switch_controller_vlan"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_vlan_data(switch_controller_vlan_data)
- )
+ filtered_data = filter_switch_controller_vlan_data(switch_controller_vlan_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -396,7 +395,7 @@ def switch_controller_vlan(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("switch-controller", "vlan", data=filtered_data, vdom=vdom)
+ return fos.set("switch-controller", "vlan", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan_policy.py
index 211974fba..bdaa8d63e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_switch_controller_vlan_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -294,9 +294,10 @@ def switch_controller_vlan_policy(data, fos, check_mode=False):
state = data["state"]
switch_controller_vlan_policy_data = data["switch_controller_vlan_policy"]
- filtered_data = underscore_to_hyphen(
- filter_switch_controller_vlan_policy_data(switch_controller_vlan_policy_data)
+ filtered_data = filter_switch_controller_vlan_policy_data(
+ switch_controller_vlan_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -363,7 +364,7 @@ def switch_controller_vlan_policy(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "switch-controller", "vlan-policy", data=filtered_data, vdom=vdom
+ "switch-controller", "vlan-policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_3g_modem_custom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_3g_modem_custom.py
index 1545f0c8a..0f70b7a51 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_3g_modem_custom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_3g_modem_custom.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -271,9 +271,8 @@ def system_3g_modem_custom(data, fos, check_mode=False):
state = data["state"]
system_3g_modem_custom_data = data["system_3g_modem_custom"]
- filtered_data = underscore_to_hyphen(
- filter_system_3g_modem_custom_data(system_3g_modem_custom_data)
- )
+ filtered_data = filter_system_3g_modem_custom_data(system_3g_modem_custom_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -337,7 +336,7 @@ def system_3g_modem_custom(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.3g-modem", "custom", data=filtered_data, vdom=vdom)
+ return fos.set("system.3g-modem", "custom", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_accprofile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_accprofile.py
index 9d34cf510..114e3c03f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_accprofile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_accprofile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -107,6 +107,41 @@ options:
- 'none'
- 'read'
- 'read-write'
+ cli_config:
+ description:
+ - Enable/disable permission to run config commands.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ cli_diagnose:
+ description:
+ - Enable/disable permission to run diagnostic commands.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ cli_exec:
+ description:
+ - Enable/disable permission to run execute commands.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ cli_get:
+ description:
+ - Enable/disable permission to run get commands.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ cli_show:
+ description:
+ - Enable/disable permission to run show commands.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
comments:
description:
- Comment.
@@ -538,6 +573,11 @@ EXAMPLES = """
admintimeout: "10"
admintimeout_override: "enable"
authgrp: "none"
+ cli_config: "enable"
+ cli_diagnose: "enable"
+ cli_exec: "enable"
+ cli_get: "enable"
+ cli_show: "enable"
comments: "<your_own_value>"
ftviewgrp: "none"
fwgrp: "none"
@@ -553,7 +593,7 @@ EXAMPLES = """
data_access: "none"
report_access: "none"
threat_weight: "none"
- name: "default_name_21"
+ name: "default_name_26"
netgrp: "none"
netgrp_permission:
cfg: "none"
@@ -688,6 +728,11 @@ def filter_system_accprofile_data(json):
"admintimeout",
"admintimeout_override",
"authgrp",
+ "cli_config",
+ "cli_diagnose",
+ "cli_exec",
+ "cli_get",
+ "cli_show",
"comments",
"ftviewgrp",
"fwgrp",
@@ -740,9 +785,8 @@ def system_accprofile(data, fos, check_mode=False):
state = data["state"]
system_accprofile_data = data["system_accprofile"]
- filtered_data = underscore_to_hyphen(
- filter_system_accprofile_data(system_accprofile_data)
- )
+ filtered_data = filter_system_accprofile_data(system_accprofile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -806,7 +850,7 @@ def system_accprofile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "accprofile", data=filtered_data, vdom=vdom)
+ return fos.set("system", "accprofile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "accprofile", mkey=filtered_data["name"], vdom=vdom)
@@ -925,9 +969,13 @@ versioned_schema = {
],
},
"wanoptgrp": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "none"}, {"value": "read"}, {"value": "read-write"}],
+ "options": [
+ {"value": "none", "v_range": [["v6.0.0", ""]]},
+ {"value": "read", "v_range": [["v6.0.0", ""]]},
+ {"value": "read-write", "v_range": [["v6.0.0", ""]]},
+ ],
},
"wifi": {
"v_range": [["v6.0.0", ""]],
@@ -1242,7 +1290,11 @@ versioned_schema = {
],
},
"mmsgtp": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [
{"value": "none"},
@@ -1276,8 +1328,28 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"admintimeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "system_diagnostics": {
- "v_range": [["v6.4.0", ""]],
+ "cli_diagnose": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "cli_get": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "cli_show": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "cli_exec": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "cli_config": {
+ "v_range": [["v7.4.2", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
@@ -1291,6 +1363,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "system_diagnostics": {
+ "v_range": [["v6.4.0", "v7.4.1"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_acme.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_acme.py
index 880b838f8..8f7cd0dc2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_acme.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_acme.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -268,9 +268,10 @@ def underscore_to_hyphen(data):
def system_acme(data, fos):
vdom = data["vdom"]
system_acme_data = data["system_acme"]
- filtered_data = underscore_to_hyphen(filter_system_acme_data(system_acme_data))
+ filtered_data = filter_system_acme_data(system_acme_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "acme", data=filtered_data, vdom=vdom)
+ return fos.set("system", "acme", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_admin.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_admin.py
index ac992d2ee..3e15ce662 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_admin.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_admin.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -904,7 +904,8 @@ def system_admin(data, fos, check_mode=False):
state = data["state"]
system_admin_data = data["system_admin"]
- filtered_data = underscore_to_hyphen(filter_system_admin_data(system_admin_data))
+ filtered_data = filter_system_admin_data(system_admin_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -968,7 +969,7 @@ def system_admin(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "admin", data=filtered_data, vdom=vdom)
+ return fos.set("system", "admin", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "admin", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_interrupt.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_interrupt.py
index 8513a3a40..ca038d049 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_interrupt.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_interrupt.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -228,12 +228,13 @@ def system_affinity_interrupt(data, fos):
state = data["state"]
system_affinity_interrupt_data = data["system_affinity_interrupt"]
- filtered_data = underscore_to_hyphen(
- filter_system_affinity_interrupt_data(system_affinity_interrupt_data)
+ filtered_data = filter_system_affinity_interrupt_data(
+ system_affinity_interrupt_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system", "affinity-interrupt", data=filtered_data, vdom=vdom)
+ return fos.set("system", "affinity-interrupt", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_packet_redistribution.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_packet_redistribution.py
index 449b38e3e..180d81671 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_packet_redistribution.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_affinity_packet_redistribution.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -243,15 +243,14 @@ def system_affinity_packet_redistribution(data, fos):
system_affinity_packet_redistribution_data = data[
"system_affinity_packet_redistribution"
]
- filtered_data = underscore_to_hyphen(
- filter_system_affinity_packet_redistribution_data(
- system_affinity_packet_redistribution_data
- )
+ filtered_data = filter_system_affinity_packet_redistribution_data(
+ system_affinity_packet_redistribution_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "system", "affinity-packet-redistribution", data=filtered_data, vdom=vdom
+ "system", "affinity-packet-redistribution", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alarm.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alarm.py
index 95dec2dcb..f590dfbd2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alarm.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alarm.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -326,9 +326,10 @@ def underscore_to_hyphen(data):
def system_alarm(data, fos):
vdom = data["vdom"]
system_alarm_data = data["system_alarm"]
- filtered_data = underscore_to_hyphen(filter_system_alarm_data(system_alarm_data))
+ filtered_data = filter_system_alarm_data(system_alarm_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "alarm", data=filtered_data, vdom=vdom)
+ return fos.set("system", "alarm", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alias.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alias.py
index 1c9625ea3..0ba2c2a51 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alias.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_alias.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -230,7 +230,8 @@ def system_alias(data, fos, check_mode=False):
state = data["state"]
system_alias_data = data["system_alias"]
- filtered_data = underscore_to_hyphen(filter_system_alias_data(system_alias_data))
+ filtered_data = filter_system_alias_data(system_alias_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -294,7 +295,7 @@ def system_alias(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "alias", data=filtered_data, vdom=vdom)
+ return fos.set("system", "alias", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "alias", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_api_user.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_api_user.py
index 35ed7120d..aaec1f1ec 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_api_user.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_api_user.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -320,9 +320,8 @@ def system_api_user(data, fos, check_mode=False):
state = data["state"]
system_api_user_data = data["system_api_user"]
- filtered_data = underscore_to_hyphen(
- filter_system_api_user_data(system_api_user_data)
- )
+ filtered_data = filter_system_api_user_data(system_api_user_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -386,7 +385,7 @@ def system_api_user(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "api-user", data=filtered_data, vdom=vdom)
+ return fos.set("system", "api-user", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "api-user", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_arp_table.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_arp_table.py
index 6bea2102d..e65543ca1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_arp_table.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_arp_table.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,9 +242,8 @@ def system_arp_table(data, fos, check_mode=False):
state = data["state"]
system_arp_table_data = data["system_arp_table"]
- filtered_data = underscore_to_hyphen(
- filter_system_arp_table_data(system_arp_table_data)
- )
+ filtered_data = filter_system_arp_table_data(system_arp_table_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -308,7 +307,7 @@ def system_arp_table(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "arp-table", data=filtered_data, vdom=vdom)
+ return fos.set("system", "arp-table", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "arp-table", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_install.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_install.py
index 47a086983..1f0ef0325 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_install.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_install.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -228,11 +228,10 @@ def underscore_to_hyphen(data):
def system_auto_install(data, fos):
vdom = data["vdom"]
system_auto_install_data = data["system_auto_install"]
- filtered_data = underscore_to_hyphen(
- filter_system_auto_install_data(system_auto_install_data)
- )
+ filtered_data = filter_system_auto_install_data(system_auto_install_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "auto-install", data=filtered_data, vdom=vdom)
+ return fos.set("system", "auto-install", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_script.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_script.py
index cca20c843..38a30f09d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_script.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_auto_script.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -266,9 +266,8 @@ def system_auto_script(data, fos, check_mode=False):
state = data["state"]
system_auto_script_data = data["system_auto_script"]
- filtered_data = underscore_to_hyphen(
- filter_system_auto_script_data(system_auto_script_data)
- )
+ filtered_data = filter_system_auto_script_data(system_auto_script_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -332,7 +331,7 @@ def system_auto_script(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "auto-script", data=filtered_data, vdom=vdom)
+ return fos.set("system", "auto-script", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_action.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_action.py
index 6f1e61dd4..c0b2b5411 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_action.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_action.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -656,9 +656,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -667,8 +667,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -684,10 +687,8 @@ def system_automation_action(data, fos, check_mode=False):
state = data["state"]
system_automation_action_data = data["system_automation_action"]
- filtered_data = underscore_to_hyphen(
- filter_system_automation_action_data(system_automation_action_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_system_automation_action_data(system_automation_action_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_destination.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_destination.py
index 5520e0609..b6dbe36fc 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_destination.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_destination.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -252,9 +252,10 @@ def system_automation_destination(data, fos, check_mode=False):
state = data["state"]
system_automation_destination_data = data["system_automation_destination"]
- filtered_data = underscore_to_hyphen(
- filter_system_automation_destination_data(system_automation_destination_data)
+ filtered_data = filter_system_automation_destination_data(
+ system_automation_destination_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -321,7 +322,7 @@ def system_automation_destination(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "system", "automation-destination", data=filtered_data, vdom=vdom
+ "system", "automation-destination", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_stitch.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_stitch.py
index 60f1f7f89..f3691e362 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_stitch.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_stitch.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -311,9 +311,8 @@ def system_automation_stitch(data, fos, check_mode=False):
state = data["state"]
system_automation_stitch_data = data["system_automation_stitch"]
- filtered_data = underscore_to_hyphen(
- filter_system_automation_stitch_data(system_automation_stitch_data)
- )
+ filtered_data = filter_system_automation_stitch_data(system_automation_stitch_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -377,7 +376,7 @@ def system_automation_stitch(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "automation-stitch", data=filtered_data, vdom=vdom)
+ return fos.set("system", "automation-stitch", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_trigger.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_trigger.py
index 123cca8cf..114426715 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_trigger.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_automation_trigger.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -448,9 +448,10 @@ def system_automation_trigger(data, fos, check_mode=False):
state = data["state"]
system_automation_trigger_data = data["system_automation_trigger"]
- filtered_data = underscore_to_hyphen(
- filter_system_automation_trigger_data(system_automation_trigger_data)
+ filtered_data = filter_system_automation_trigger_data(
+ system_automation_trigger_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -514,7 +515,7 @@ def system_automation_trigger(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "automation-trigger", data=filtered_data, vdom=vdom)
+ return fos.set("system", "automation-trigger", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_push_update.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_push_update.py
index 5f83d51da..9ffb401f8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_push_update.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_push_update.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -223,11 +223,12 @@ def underscore_to_hyphen(data):
def system_autoupdate_push_update(data, fos):
vdom = data["vdom"]
system_autoupdate_push_update_data = data["system_autoupdate_push_update"]
- filtered_data = underscore_to_hyphen(
- filter_system_autoupdate_push_update_data(system_autoupdate_push_update_data)
+ filtered_data = filter_system_autoupdate_push_update_data(
+ system_autoupdate_push_update_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system.autoupdate", "push-update", data=filtered_data, vdom=vdom)
+ return fos.set("system.autoupdate", "push-update", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_schedule.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_schedule.py
index f6a5b3d76..fad0ce4a0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_schedule.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_schedule.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -233,11 +233,12 @@ def underscore_to_hyphen(data):
def system_autoupdate_schedule(data, fos):
vdom = data["vdom"]
system_autoupdate_schedule_data = data["system_autoupdate_schedule"]
- filtered_data = underscore_to_hyphen(
- filter_system_autoupdate_schedule_data(system_autoupdate_schedule_data)
+ filtered_data = filter_system_autoupdate_schedule_data(
+ system_autoupdate_schedule_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system.autoupdate", "schedule", data=filtered_data, vdom=vdom)
+ return fos.set("system.autoupdate", "schedule", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_tunneling.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_tunneling.py
index fcfa5218b..b88821f43 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_tunneling.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_autoupdate_tunneling.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -225,11 +225,12 @@ def underscore_to_hyphen(data):
def system_autoupdate_tunneling(data, fos):
vdom = data["vdom"]
system_autoupdate_tunneling_data = data["system_autoupdate_tunneling"]
- filtered_data = underscore_to_hyphen(
- filter_system_autoupdate_tunneling_data(system_autoupdate_tunneling_data)
+ filtered_data = filter_system_autoupdate_tunneling_data(
+ system_autoupdate_tunneling_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system.autoupdate", "tunneling", data=filtered_data, vdom=vdom)
+ return fos.set("system.autoupdate", "tunneling", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_central_management.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_central_management.py
index 4ee9a808f..e062c650d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_central_management.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_central_management.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -446,11 +446,12 @@ def system_central_management(data, fos):
system_central_management_data = flatten_multilists_attributes(
system_central_management_data
)
- filtered_data = underscore_to_hyphen(
- filter_system_central_management_data(system_central_management_data)
+ filtered_data = filter_system_central_management_data(
+ system_central_management_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "central-management", data=filtered_data, vdom=vdom)
+ return fos.set("system", "central-management", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_cluster_sync.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_cluster_sync.py
index e07446961..751fee999 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_cluster_sync.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_cluster_sync.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -400,9 +400,8 @@ def system_cluster_sync(data, fos, check_mode=False):
state = data["state"]
system_cluster_sync_data = data["system_cluster_sync"]
- filtered_data = underscore_to_hyphen(
- filter_system_cluster_sync_data(system_cluster_sync_data)
- )
+ filtered_data = filter_system_cluster_sync_data(system_cluster_sync_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -466,7 +465,7 @@ def system_cluster_sync(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "cluster-sync", data=filtered_data, vdom=vdom)
+ return fos.set("system", "cluster-sync", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_console.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_console.py
index d6024d795..924d59a69 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_console.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_console.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -240,11 +240,10 @@ def underscore_to_hyphen(data):
def system_console(data, fos):
vdom = data["vdom"]
system_console_data = data["system_console"]
- filtered_data = underscore_to_hyphen(
- filter_system_console_data(system_console_data)
- )
+ filtered_data = filter_system_console_data(system_console_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "console", data=filtered_data, vdom=vdom)
+ return fos.set("system", "console", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -279,17 +278,6 @@ versioned_schema = {
"v_range": [["v6.0.0", ""]],
"type": "dict",
"children": {
- "baudrate": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [
- {"value": "9600"},
- {"value": "19200"},
- {"value": "38400"},
- {"value": "57600"},
- {"value": "115200"},
- ],
- },
"output": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -305,6 +293,17 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "baudrate": {
+ "v_range": [["v6.0.0", "v7.4.1"]],
+ "type": "string",
+ "options": [
+ {"value": "9600"},
+ {"value": "19200"},
+ {"value": "38400"},
+ {"value": "57600"},
+ {"value": "115200"},
+ ],
+ },
"mode": {
"v_range": [["v6.0.0", "v7.4.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_csf.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_csf.py
index 5fabacb2c..b45a7662e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_csf.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_csf.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -310,6 +310,10 @@ options:
description:
- Serial.
type: str
+ uid:
+ description:
+ - Unique ID of the current CSF node
+ type: str
upstream:
description:
- IP/FQDN of the FortiGate upstream from this FortiGate in the Security Fabric.
@@ -376,6 +380,7 @@ EXAMPLES = """
index: "0"
name: "default_name_44"
serial: "<your_own_value>"
+ uid: "<your_own_value>"
upstream: "<your_own_value>"
upstream_ip: "<your_own_value>"
upstream_port: "8013"
@@ -485,6 +490,7 @@ def filter_system_csf_data(json):
"saml_configuration_sync",
"status",
"trusted_list",
+ "uid",
"upstream",
"upstream_ip",
"upstream_port",
@@ -546,9 +552,10 @@ def system_csf(data, fos):
vdom = data["vdom"]
system_csf_data = data["system_csf"]
system_csf_data = flatten_multilists_attributes(system_csf_data)
- filtered_data = underscore_to_hyphen(filter_system_csf_data(system_csf_data))
+ filtered_data = filter_system_csf_data(system_csf_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "csf", data=filtered_data, vdom=vdom)
+ return fos.set("system", "csf", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -588,6 +595,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "uid": {"v_range": [["v7.4.2", ""]], "type": "string"},
"upstream": {"v_range": [["v7.0.2", ""]], "type": "string"},
"upstream_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"group_name": {"v_range": [["v6.0.0", ""]], "type": "string"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_custom_language.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_custom_language.py
index 07c26ba1f..a9e3c7595 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_custom_language.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_custom_language.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,9 +235,8 @@ def system_custom_language(data, fos, check_mode=False):
state = data["state"]
system_custom_language_data = data["system_custom_language"]
- filtered_data = underscore_to_hyphen(
- filter_system_custom_language_data(system_custom_language_data)
- )
+ filtered_data = filter_system_custom_language_data(system_custom_language_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -301,7 +300,7 @@ def system_custom_language(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "custom-language", data=filtered_data, vdom=vdom)
+ return fos.set("system", "custom-language", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ddns.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ddns.py
index c9b288a75..addc1ccee 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ddns.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ddns.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -394,7 +394,8 @@ def system_ddns(data, fos, check_mode=False):
state = data["state"]
system_ddns_data = data["system_ddns"]
- filtered_data = underscore_to_hyphen(filter_system_ddns_data(system_ddns_data))
+ filtered_data = filter_system_ddns_data(system_ddns_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -458,7 +459,7 @@ def system_ddns(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "ddns", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ddns", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "ddns", mkey=filtered_data["ddnsid"], vdom=vdom)
@@ -517,6 +518,11 @@ versioned_schema = {
{"value": "noip.com"},
],
},
+ "addr_type": {
+ "v_range": [["v7.0.0", ""]],
+ "type": "string",
+ "options": [{"value": "ipv4"}, {"value": "ipv6"}],
+ },
"server_type": {
"v_range": [["v7.0.0", ""]],
"type": "string",
@@ -552,11 +558,6 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
- "addr_type": {
- "v_range": [["v7.0.0", ""]],
- "type": "string",
- "options": [{"value": "ipv4"}, {"value": "ipv6"}],
- },
"update_interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"clear_text": {
"v_range": [["v6.0.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dedicated_mgmt.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dedicated_mgmt.py
index 9ccd23b3b..738ad0bd8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dedicated_mgmt.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dedicated_mgmt.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,11 +246,10 @@ def underscore_to_hyphen(data):
def system_dedicated_mgmt(data, fos):
vdom = data["vdom"]
system_dedicated_mgmt_data = data["system_dedicated_mgmt"]
- filtered_data = underscore_to_hyphen(
- filter_system_dedicated_mgmt_data(system_dedicated_mgmt_data)
- )
+ filtered_data = filter_system_dedicated_mgmt_data(system_dedicated_mgmt_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "dedicated-mgmt", data=filtered_data, vdom=vdom)
+ return fos.set("system", "dedicated-mgmt", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_device_upgrade.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_device_upgrade.py
index 091908c9a..8caa221e4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_device_upgrade.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_device_upgrade.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -93,6 +93,7 @@ options:
- Fortinet device type.
type: str
choices:
+ - 'fortigate'
- 'fortiswitch'
- 'fortiap'
- 'fortiextender'
@@ -117,6 +118,21 @@ options:
- 'config-error-log-nonempty'
- 'csf-tree-not-supported'
- 'node-failed'
+ ha_reboot_controller:
+ description:
+ - Serial number of the FortiGate unit that will control the reboot process for the federated upgrade of the HA cluster.
+ type: str
+ known_ha_members:
+ description:
+ - Known members of the HA cluster. If a member is missing at upgrade time, the upgrade will be cancelled.
+ type: list
+ elements: dict
+ suboptions:
+ serial:
+ description:
+ - Serial number of HA member
+ required: true
+ type: str
maximum_minutes:
description:
- Maximum number of minutes to allow for immediate upgrade preparation.
@@ -172,8 +188,12 @@ EXAMPLES = """
state: "present"
access_token: "<your_own_value>"
system_device_upgrade:
- device_type: "fortiswitch"
+ device_type: "fortigate"
failure_reason: "none"
+ ha_reboot_controller: "<your_own_value>"
+ known_ha_members:
+ -
+ serial: "<your_own_value>"
maximum_minutes: "15"
serial: "<your_own_value>"
setup_time: "<your_own_value>"
@@ -266,6 +286,8 @@ def filter_system_device_upgrade_data(json):
option_list = [
"device_type",
"failure_reason",
+ "ha_reboot_controller",
+ "known_ha_members",
"maximum_minutes",
"serial",
"setup_time",
@@ -304,12 +326,11 @@ def system_device_upgrade(data, fos):
state = data["state"]
system_device_upgrade_data = data["system_device_upgrade"]
- filtered_data = underscore_to_hyphen(
- filter_system_device_upgrade_data(system_device_upgrade_data)
- )
+ filtered_data = filter_system_device_upgrade_data(system_device_upgrade_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system", "device-upgrade", data=filtered_data, vdom=vdom)
+ return fos.set("system", "device-upgrade", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -365,6 +386,7 @@ versioned_schema = {
"v_range": [["v7.2.4", ""]],
"type": "string",
"options": [
+ {"value": "fortigate", "v_range": [["v7.4.2", ""]]},
{"value": "fortiswitch"},
{"value": "fortiap"},
{"value": "fortiextender"},
@@ -411,6 +433,19 @@ versioned_schema = {
{"value": "node-failed"},
],
},
+ "ha_reboot_controller": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "known_ha_members": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "serial": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
},
"v_range": [["v7.2.4", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp6_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp6_server.py
index b1d64e836..f49f7edb4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp6_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp6_server.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -417,9 +417,8 @@ def system_dhcp6_server(data, fos, check_mode=False):
state = data["state"]
system_dhcp6_server_data = data["system_dhcp6_server"]
- filtered_data = underscore_to_hyphen(
- filter_system_dhcp6_server_data(system_dhcp6_server_data)
- )
+ filtered_data = filter_system_dhcp6_server_data(system_dhcp6_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -483,7 +482,7 @@ def system_dhcp6_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.dhcp6", "server", data=filtered_data, vdom=vdom)
+ return fos.set("system.dhcp6", "server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system.dhcp6", "server", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp_server.py
index ef55a21b3..38d5f8a4f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dhcp_server.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -549,7 +549,7 @@ options:
type: str
timezone:
description:
- - Select the time zone to be assigned to DHCP clients.
+ - Select the time zone to be assigned to DHCP clients. Source system.timezone.name.
type: str
choices:
- '01'
@@ -1014,9 +1014,8 @@ def system_dhcp_server(data, fos, check_mode=False):
system_dhcp_server_data = data["system_dhcp_server"]
system_dhcp_server_data = flatten_multilists_attributes(system_dhcp_server_data)
- filtered_data = underscore_to_hyphen(
- filter_system_dhcp_server_data(system_dhcp_server_data)
- )
+ filtered_data = filter_system_dhcp_server_data(system_dhcp_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1080,7 +1079,7 @@ def system_dhcp_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.dhcp", "server", data=filtered_data, vdom=vdom)
+ return fos.set("system.dhcp", "server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system.dhcp", "server", mkey=filtered_data["id"], vdom=vdom)
@@ -1232,94 +1231,94 @@ versioned_schema = {
"v_range": [["v6.0.0", ""]],
"type": "string",
"options": [
- {"value": "01"},
- {"value": "02"},
- {"value": "03"},
- {"value": "04"},
- {"value": "05"},
- {"value": "81"},
- {"value": "06"},
- {"value": "07"},
- {"value": "08"},
- {"value": "09"},
- {"value": "10"},
- {"value": "11"},
- {"value": "12"},
- {"value": "13"},
- {"value": "74"},
- {"value": "14"},
- {"value": "77"},
- {"value": "15"},
- {"value": "87"},
- {"value": "16"},
- {"value": "17"},
- {"value": "18"},
- {"value": "19"},
- {"value": "20"},
- {"value": "75"},
- {"value": "21"},
- {"value": "22"},
- {"value": "23"},
- {"value": "24"},
- {"value": "80"},
- {"value": "79"},
- {"value": "25"},
- {"value": "26"},
- {"value": "27"},
- {"value": "28"},
- {"value": "78"},
- {"value": "29"},
- {"value": "30"},
- {"value": "31"},
- {"value": "32"},
- {"value": "33"},
- {"value": "34"},
- {"value": "35"},
- {"value": "36"},
- {"value": "37"},
- {"value": "38"},
- {"value": "83"},
- {"value": "84"},
- {"value": "40"},
- {"value": "85"},
- {"value": "39"},
- {"value": "41"},
- {"value": "42"},
- {"value": "43"},
- {"value": "44"},
- {"value": "45"},
- {"value": "46"},
- {"value": "47"},
- {"value": "51"},
- {"value": "48"},
- {"value": "49"},
- {"value": "50"},
- {"value": "52"},
- {"value": "53"},
- {"value": "54"},
- {"value": "55"},
- {"value": "56"},
- {"value": "57"},
- {"value": "58"},
- {"value": "59"},
- {"value": "60"},
- {"value": "61"},
- {"value": "62"},
- {"value": "63"},
- {"value": "64"},
- {"value": "65"},
- {"value": "66"},
- {"value": "67"},
- {"value": "68"},
- {"value": "69"},
- {"value": "70"},
- {"value": "71"},
- {"value": "72"},
- {"value": "00"},
- {"value": "82"},
- {"value": "73"},
- {"value": "86"},
- {"value": "76"},
+ {"value": "01", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "02", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "03", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "04", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "05", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "81", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "06", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "07", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "08", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "09", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "10", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "11", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "12", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "13", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "74", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "14", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "77", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "15", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "87", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "16", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "17", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "18", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "19", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "20", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "75", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "21", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "22", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "23", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "24", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "80", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "79", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "25", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "26", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "27", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "28", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "78", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "29", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "30", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "31", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "32", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "33", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "34", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "35", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "36", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "37", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "38", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "83", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "84", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "40", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "85", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "39", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "41", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "42", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "43", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "44", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "45", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "46", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "47", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "51", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "48", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "49", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "50", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "52", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "53", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "54", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "55", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "56", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "57", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "58", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "59", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "60", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "61", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "62", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "63", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "64", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "65", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "66", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "67", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "68", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "69", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "70", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "71", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "72", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "00", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "82", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "73", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "86", "v_range": [["v6.0.0", "v7.4.1"]]},
+ {"value": "76", "v_range": [["v6.0.0", "v7.4.1"]]},
],
},
"tftp_server": {
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns.py
index 4a6bbcb4f..1c8400943 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -413,9 +413,10 @@ def system_dns(data, fos):
vdom = data["vdom"]
system_dns_data = data["system_dns"]
system_dns_data = flatten_multilists_attributes(system_dns_data)
- filtered_data = underscore_to_hyphen(filter_system_dns_data(system_dns_data))
+ filtered_data = filter_system_dns_data(system_dns_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "dns", data=filtered_data, vdom=vdom)
+ return fos.set("system", "dns", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns64.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns64.py
index eac6ad65a..79bfb9cc8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns64.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns64.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -218,9 +218,10 @@ def underscore_to_hyphen(data):
def system_dns64(data, fos):
vdom = data["vdom"]
system_dns64_data = data["system_dns64"]
- filtered_data = underscore_to_hyphen(filter_system_dns64_data(system_dns64_data))
+ filtered_data = filter_system_dns64_data(system_dns64_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "dns64", data=filtered_data, vdom=vdom)
+ return fos.set("system", "dns64", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_database.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_database.py
index 5bf067739..1a6aa161a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_database.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_database.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -439,9 +439,8 @@ def system_dns_database(data, fos, check_mode=False):
system_dns_database_data = data["system_dns_database"]
system_dns_database_data = flatten_multilists_attributes(system_dns_database_data)
- filtered_data = underscore_to_hyphen(
- filter_system_dns_database_data(system_dns_database_data)
- )
+ filtered_data = filter_system_dns_database_data(system_dns_database_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -505,7 +504,7 @@ def system_dns_database(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "dns-database", data=filtered_data, vdom=vdom)
+ return fos.set("system", "dns-database", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_server.py
index d12995beb..e9b5cfec5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dns_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -263,9 +263,8 @@ def system_dns_server(data, fos, check_mode=False):
state = data["state"]
system_dns_server_data = data["system_dns_server"]
- filtered_data = underscore_to_hyphen(
- filter_system_dns_server_data(system_dns_server_data)
- )
+ filtered_data = filter_system_dns_server_data(system_dns_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -329,7 +328,7 @@ def system_dns_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "dns-server", data=filtered_data, vdom=vdom)
+ return fos.set("system", "dns-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "dns-server", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dscp_based_priority.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dscp_based_priority.py
index 3a68444fb..890e40df0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dscp_based_priority.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_dscp_based_priority.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -241,9 +241,10 @@ def system_dscp_based_priority(data, fos, check_mode=False):
state = data["state"]
system_dscp_based_priority_data = data["system_dscp_based_priority"]
- filtered_data = underscore_to_hyphen(
- filter_system_dscp_based_priority_data(system_dscp_based_priority_data)
+ filtered_data = filter_system_dscp_based_priority_data(
+ system_dscp_based_priority_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -307,7 +308,7 @@ def system_dscp_based_priority(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "dscp-based-priority", data=filtered_data, vdom=vdom)
+ return fos.set("system", "dscp-based-priority", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_email_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_email_server.py
index f01c8c544..4d55d8518 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_email_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_email_server.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -308,11 +308,10 @@ def underscore_to_hyphen(data):
def system_email_server(data, fos):
vdom = data["vdom"]
system_email_server_data = data["system_email_server"]
- filtered_data = underscore_to_hyphen(
- filter_system_email_server_data(system_email_server_data)
- )
+ filtered_data = filter_system_email_server_data(system_email_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "email-server", data=filtered_data, vdom=vdom)
+ return fos.set("system", "email-server", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_evpn.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_evpn.py
index fef5bdb27..543d27c8b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_evpn.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_evpn.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -274,10 +274,11 @@ def system_evpn(data, fos):
state = data["state"]
system_evpn_data = data["system_evpn"]
- filtered_data = underscore_to_hyphen(filter_system_evpn_data(system_evpn_data))
+ filtered_data = filter_system_evpn_data(system_evpn_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system", "evpn", data=filtered_data, vdom=vdom)
+ return fos.set("system", "evpn", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "evpn", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_external_resource.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_external_resource.py
index 1fb156cfc..ca231074f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_external_resource.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_external_resource.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -154,6 +154,7 @@ options:
- 'domain'
- 'malware'
- 'mac-address'
+ - 'data'
update_method:
description:
- External resource update method.
@@ -337,9 +338,8 @@ def system_external_resource(data, fos, check_mode=False):
state = data["state"]
system_external_resource_data = data["system_external_resource"]
- filtered_data = underscore_to_hyphen(
- filter_system_external_resource_data(system_external_resource_data)
- )
+ filtered_data = filter_system_external_resource_data(system_external_resource_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -403,7 +403,7 @@ def system_external_resource(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "external-resource", data=filtered_data, vdom=vdom)
+ return fos.set("system", "external-resource", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -464,6 +464,7 @@ versioned_schema = {
{"value": "domain"},
{"value": "malware", "v_range": [["v6.2.0", ""]]},
{"value": "mac-address", "v_range": [["v7.4.0", ""]]},
+ {"value": "data", "v_range": [["v7.4.2", ""]]},
],
},
"update_method": {
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fabric_vpn.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fabric_vpn.py
index e82f3643f..e0b62afa9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fabric_vpn.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fabric_vpn.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -429,11 +429,10 @@ def system_fabric_vpn(data, fos):
vdom = data["vdom"]
system_fabric_vpn_data = data["system_fabric_vpn"]
system_fabric_vpn_data = flatten_multilists_attributes(system_fabric_vpn_data)
- filtered_data = underscore_to_hyphen(
- filter_system_fabric_vpn_data(system_fabric_vpn_data)
- )
+ filtered_data = filter_system_fabric_vpn_data(system_fabric_vpn_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fabric-vpn", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fabric-vpn", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_federated_upgrade.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_federated_upgrade.py
index 0c683b26c..73dd6ba40 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_federated_upgrade.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_federated_upgrade.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -109,6 +109,17 @@ options:
description:
- Serial number of the FortiGate unit that will control the reboot process for the federated upgrade of the HA cluster.
type: str
+ known_ha_members:
+ description:
+ - Known members of the HA cluster. If a member is missing at upgrade time, the upgrade will be cancelled.
+ type: list
+ elements: dict
+ suboptions:
+ serial:
+ description:
+ - Serial number of HA member
+ required: true
+ type: str
next_path_index:
description:
- The index of the next image to upgrade to.
@@ -193,6 +204,9 @@ EXAMPLES = """
failure_device: "<your_own_value>"
failure_reason: "none"
ha_reboot_controller: "<your_own_value>"
+ known_ha_members:
+ -
+ serial: "<your_own_value>"
next_path_index: "0"
node_list:
-
@@ -292,6 +306,7 @@ def filter_system_federated_upgrade_data(json):
"failure_device",
"failure_reason",
"ha_reboot_controller",
+ "known_ha_members",
"next_path_index",
"node_list",
"status",
@@ -324,11 +339,10 @@ def underscore_to_hyphen(data):
def system_federated_upgrade(data, fos):
vdom = data["vdom"]
system_federated_upgrade_data = data["system_federated_upgrade"]
- filtered_data = underscore_to_hyphen(
- filter_system_federated_upgrade_data(system_federated_upgrade_data)
- )
+ filtered_data = filter_system_federated_upgrade_data(system_federated_upgrade_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "federated-upgrade", data=filtered_data, vdom=vdom)
+ return fos.set("system", "federated-upgrade", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -411,6 +425,18 @@ versioned_schema = {
"upgrade_id": {"v_range": [["v7.0.0", ""]], "type": "integer"},
"next_path_index": {"v_range": [["v7.0.4", ""]], "type": "integer"},
"ha_reboot_controller": {"v_range": [["v7.4.0", ""]], "type": "string"},
+ "known_ha_members": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "serial": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
"node_list": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fips_cc.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fips_cc.py
index 3feeec573..7f200f90d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fips_cc.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fips_cc.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,11 +232,10 @@ def underscore_to_hyphen(data):
def system_fips_cc(data, fos):
vdom = data["vdom"]
system_fips_cc_data = data["system_fips_cc"]
- filtered_data = underscore_to_hyphen(
- filter_system_fips_cc_data(system_fips_cc_data)
- )
+ filtered_data = filter_system_fips_cc_data(system_fips_cc_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fips-cc", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fips-cc", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fm.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fm.py
index 26d875516..3175a942b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fm.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fm.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -252,9 +252,10 @@ def underscore_to_hyphen(data):
def system_fm(data, fos):
vdom = data["vdom"]
system_fm_data = data["system_fm"]
- filtered_data = underscore_to_hyphen(filter_system_fm_data(system_fm_data))
+ filtered_data = filter_system_fm_data(system_fm_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fm", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fm", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiai.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiai.py
index b06398f9f..0202b83fa 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiai.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiai.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -224,11 +224,10 @@ def underscore_to_hyphen(data):
def system_fortiai(data, fos):
vdom = data["vdom"]
system_fortiai_data = data["system_fortiai"]
- filtered_data = underscore_to_hyphen(
- filter_system_fortiai_data(system_fortiai_data)
- )
+ filtered_data = filter_system_fortiai_data(system_fortiai_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fortiai", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fortiai", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiguard.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiguard.py
index 1faf14d6c..8ac457935 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiguard.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortiguard.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -698,11 +698,10 @@ def system_fortiguard(data, fos):
vdom = data["vdom"]
system_fortiguard_data = data["system_fortiguard"]
system_fortiguard_data = flatten_multilists_attributes(system_fortiguard_data)
- filtered_data = underscore_to_hyphen(
- filter_system_fortiguard_data(system_fortiguard_data)
- )
+ filtered_data = filter_system_fortiguard_data(system_fortiguard_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fortiguard", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fortiguard", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortimanager.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortimanager.py
index 2bdfae1c6..4391dbb92 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortimanager.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortimanager.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -255,11 +255,10 @@ def underscore_to_hyphen(data):
def system_fortimanager(data, fos):
vdom = data["vdom"]
system_fortimanager_data = data["system_fortimanager"]
- filtered_data = underscore_to_hyphen(
- filter_system_fortimanager_data(system_fortimanager_data)
- )
+ filtered_data = filter_system_fortimanager_data(system_fortimanager_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fortimanager", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fortimanager", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortindr.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortindr.py
index e460aa910..666617a8e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortindr.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortindr.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -224,11 +224,10 @@ def underscore_to_hyphen(data):
def system_fortindr(data, fos):
vdom = data["vdom"]
system_fortindr_data = data["system_fortindr"]
- filtered_data = underscore_to_hyphen(
- filter_system_fortindr_data(system_fortindr_data)
- )
+ filtered_data = filter_system_fortindr_data(system_fortindr_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fortindr", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fortindr", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortisandbox.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortisandbox.py
index f3e2e86a6..bcd31fadb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortisandbox.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fortisandbox.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -282,11 +282,10 @@ def underscore_to_hyphen(data):
def system_fortisandbox(data, fos):
vdom = data["vdom"]
system_fortisandbox_data = data["system_fortisandbox"]
- filtered_data = underscore_to_hyphen(
- filter_system_fortisandbox_data(system_fortisandbox_data)
- )
+ filtered_data = filter_system_fortisandbox_data(system_fortisandbox_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fortisandbox", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fortisandbox", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fsso_polling.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fsso_polling.py
index 25e6dc747..e36bb55aa 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fsso_polling.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_fsso_polling.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -223,11 +223,10 @@ def underscore_to_hyphen(data):
def system_fsso_polling(data, fos):
vdom = data["vdom"]
system_fsso_polling_data = data["system_fsso_polling"]
- filtered_data = underscore_to_hyphen(
- filter_system_fsso_polling_data(system_fsso_polling_data)
- )
+ filtered_data = filter_system_fsso_polling_data(system_fsso_polling_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "fsso-polling", data=filtered_data, vdom=vdom)
+ return fos.set("system", "fsso-polling", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ftm_push.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ftm_push.py
index ee1a109db..1b739163e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ftm_push.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ftm_push.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -240,11 +240,10 @@ def underscore_to_hyphen(data):
def system_ftm_push(data, fos):
vdom = data["vdom"]
system_ftm_push_data = data["system_ftm_push"]
- filtered_data = underscore_to_hyphen(
- filter_system_ftm_push_data(system_ftm_push_data)
- )
+ filtered_data = filter_system_ftm_push_data(system_ftm_push_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ftm-push", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ftm-push", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geneve.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geneve.py
index f265df516..29fe00424 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geneve.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geneve.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -275,7 +275,8 @@ def system_geneve(data, fos, check_mode=False):
state = data["state"]
system_geneve_data = data["system_geneve"]
- filtered_data = underscore_to_hyphen(filter_system_geneve_data(system_geneve_data))
+ filtered_data = filter_system_geneve_data(system_geneve_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -339,7 +340,7 @@ def system_geneve(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "geneve", data=filtered_data, vdom=vdom)
+ return fos.set("system", "geneve", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "geneve", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_country.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_country.py
index 94f57bf81..36f459774 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_country.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_country.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -230,9 +230,8 @@ def system_geoip_country(data, fos, check_mode=False):
state = data["state"]
system_geoip_country_data = data["system_geoip_country"]
- filtered_data = underscore_to_hyphen(
- filter_system_geoip_country_data(system_geoip_country_data)
- )
+ filtered_data = filter_system_geoip_country_data(system_geoip_country_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -296,7 +295,7 @@ def system_geoip_country(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "geoip-country", data=filtered_data, vdom=vdom)
+ return fos.set("system", "geoip-country", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_override.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_override.py
index 67169ad4d..15a47d604 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_override.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_geoip_override.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -283,9 +283,8 @@ def system_geoip_override(data, fos, check_mode=False):
state = data["state"]
system_geoip_override_data = data["system_geoip_override"]
- filtered_data = underscore_to_hyphen(
- filter_system_geoip_override_data(system_geoip_override_data)
- )
+ filtered_data = filter_system_geoip_override_data(system_geoip_override_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -349,7 +348,7 @@ def system_geoip_override(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "geoip-override", data=filtered_data, vdom=vdom)
+ return fos.set("system", "geoip-override", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gi_gk.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gi_gk.py
index 0a6ea42b3..870d4ce7c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gi_gk.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gi_gk.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -207,9 +207,10 @@ def underscore_to_hyphen(data):
def system_gi_gk(data, fos):
vdom = data["vdom"]
system_gi_gk_data = data["system_gi_gk"]
- filtered_data = underscore_to_hyphen(filter_system_gi_gk_data(system_gi_gk_data))
+ filtered_data = filter_system_gi_gk_data(system_gi_gk_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "gi-gk", data=filtered_data, vdom=vdom)
+ return fos.set("system", "gi-gk", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -241,15 +242,15 @@ def fortios_system(data, fos):
versioned_schema = {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"context": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
"port": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "integer",
},
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_global.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_global.py
index d7ec79eb3..419429593 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_global.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_global.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -204,7 +204,7 @@ options:
- 'disable'
admin_scp:
description:
- - Enable/disable using SCP to download the system configuration. You can use SCP as an alternative method for backing up the configuration.
+ - Enable/disable SCP support for system configuration backup, restore, and firmware file upload.
type: str
choices:
- 'enable'
@@ -355,6 +355,10 @@ options:
choices:
- 'enable'
- 'disable'
+ bfd_affinity:
+ description:
+ - Affinity setting for BFD daemon (hexadecimal value up to 256 bits in the format of xxxxxxxxxxxxxxxx).
+ type: str
block_session_timer:
description:
- Duration in seconds for blocked sessions (1 - 300 sec (5 minutes)).
@@ -603,6 +607,13 @@ options:
choices:
- 'enable'
- 'disable'
+ fortigslb_integration:
+ description:
+ - Enable/disable integration with the FortiGSLB cloud service.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
fortiipam_integration:
description:
- Enable/disable integration with the FortiIPAM cloud service.
@@ -1233,6 +1244,20 @@ options:
description:
- Proxy worker count.
type: int
+ purdue_level:
+ description:
+ - Purdue Level of this FortiGate.
+ type: str
+ choices:
+ - '1'
+ - '1.5'
+ - '2'
+ - '2.5'
+ - '3'
+ - '3.5'
+ - '4'
+ - '5'
+ - '5.5'
quic_ack_thresold:
description:
- Maximum number of unacknowledged packets before sending ACK (2 - 5).
@@ -1364,11 +1389,43 @@ options:
choices:
- 'enable'
- 'disable'
+ speedtestd_ctrl_port:
+ description:
+ - Speedtest server controller port number.
+ type: int
+ speedtestd_server_port:
+ description:
+ - Speedtest server port number.
+ type: int
split_port:
description:
- Split port(s) to multiple 10Gbps ports.
type: list
elements: str
+ split_port_mode:
+ description:
+ - Configure split port mode of ports.
+ type: list
+ elements: dict
+ suboptions:
+ interface:
+ description:
+ - Split port interface.
+ required: true
+ type: str
+ split_mode:
+ description:
+ - The configuration mode for the split port interface.
+ type: str
+ choices:
+ - 'disable'
+ - '4x10G'
+ - '4x25G'
+ - '4x50G'
+ - '8x25G'
+ - '8x50G'
+ - '4x100G'
+ - '2x200G'
ssd_trim_date:
description:
- Date within a month to run ssd trim.
@@ -1439,6 +1496,10 @@ options:
choices:
- 'enable'
- 'disable'
+ ssh_hostkey:
+ description:
+ - Config SSH host key.
+ type: str
ssh_hostkey_algo:
description:
- Select one or more SSH hostkey algorithms.
@@ -1447,9 +1508,22 @@ options:
choices:
- 'ssh-rsa'
- 'ecdsa-sha2-nistp521'
+ - 'ecdsa-sha2-nistp384'
+ - 'ecdsa-sha2-nistp256'
- 'rsa-sha2-256'
- 'rsa-sha2-512'
- 'ssh-ed25519'
+ ssh_hostkey_override:
+ description:
+ - Enable/disable SSH host key override in SSH daemon.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+ ssh_hostkey_password:
+ description:
+ - Password for ssh-hostkey.
+ type: str
ssh_kex_algo:
description:
- Select one or more SSH kex algorithms.
@@ -1630,98 +1704,8 @@ options:
- 'disable'
timezone:
description:
- - Number corresponding to your time zone from 00 to 86. Enter set timezone ? to view the list of time zones and the numbers that represent
- them.
- type: str
- choices:
- - '01'
- - '02'
- - '03'
- - '04'
- - '05'
- - '81'
- - '06'
- - '07'
- - '08'
- - '09'
- - '10'
- - '11'
- - '12'
- - '13'
- - '74'
- - '14'
- - '77'
- - '15'
- - '87'
- - '16'
- - '17'
- - '18'
- - '19'
- - '20'
- - '75'
- - '21'
- - '22'
- - '23'
- - '24'
- - '80'
- - '79'
- - '25'
- - '26'
- - '27'
- - '28'
- - '78'
- - '29'
- - '30'
- - '31'
- - '32'
- - '33'
- - '34'
- - '35'
- - '36'
- - '37'
- - '38'
- - '83'
- - '84'
- - '40'
- - '85'
- - '39'
- - '41'
- - '42'
- - '43'
- - '44'
- - '45'
- - '46'
- - '47'
- - '51'
- - '48'
- - '49'
- - '50'
- - '52'
- - '53'
- - '54'
- - '55'
- - '56'
- - '57'
- - '58'
- - '59'
- - '60'
- - '61'
- - '62'
- - '63'
- - '64'
- - '65'
- - '66'
- - '67'
- - '68'
- - '69'
- - '70'
- - '71'
- - '72'
- - '00'
- - '82'
- - '73'
- - '86'
- - '76'
+ - Timezone database name. Enter ? to view the list of timezone. Source system.timezone.name.
+ type: str
tp_mc_skip_policy:
description:
- Enable/disable skip policy check and allow multicast through.
@@ -1825,6 +1809,13 @@ options:
choices:
- 'disable'
- 'enable'
+ virtual_switch_vlan:
+ description:
+ - Enable/disable virtual switch VLAN.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
vpn_ems_sn_check:
description:
- Enable/disable verification of EMS serial number in SSL-VPN and IPsec VPN connection.
@@ -1954,6 +1945,7 @@ EXAMPLES = """
av_failopen: "pass"
av_failopen_session: "enable"
batch_cmdb: "enable"
+ bfd_affinity: "<your_own_value>"
block_session_timer: "30"
br_fdb_max_entry: "8192"
cert_chain_max: "8"
@@ -1995,6 +1987,7 @@ EXAMPLES = """
fortiextender_discovery_lockdown: "disable"
fortiextender_provision_on_authorization: "enable"
fortiextender_vlan_mode: "enable"
+ fortigslb_integration: "disable"
fortiipam_integration: "enable"
fortiservice_port: "8013"
fortitoken_cloud: "enable"
@@ -2034,7 +2027,7 @@ EXAMPLES = """
internet_service_database: "mini"
internet_service_download_list:
-
- id: "126 (source firewall.internet-service.id)"
+ id: "128 (source firewall.internet-service.id)"
interval: "5"
ip_fragment_mem_thresholds: "32"
ip_src_port_range: "<your_own_value>"
@@ -2065,7 +2058,7 @@ EXAMPLES = """
management_port: "443"
management_port_use_admin_sport: "enable"
management_vdom: "<your_own_value> (source system.vdom.name)"
- max_dlpstat_memory: "157"
+ max_dlpstat_memory: "159"
max_route_cache_size: "0"
mc_ttl_notchange: "enable"
memory_use_threshold_extreme: "95"
@@ -2095,6 +2088,7 @@ EXAMPLES = """
proxy_re_authentication_time: "30"
proxy_resource_mode: "enable"
proxy_worker_count: "0"
+ purdue_level: "1"
quic_ack_thresold: "3"
quic_congestion_control_algo: "cubic"
quic_max_datagram_size: "1500"
@@ -2117,7 +2111,13 @@ EXAMPLES = """
snat_route_change: "enable"
special_file_23_support: "disable"
speedtest_server: "enable"
+ speedtestd_ctrl_port: "5200"
+ speedtestd_server_port: "5201"
split_port: "<your_own_value>"
+ split_port_mode:
+ -
+ interface: "<your_own_value>"
+ split_mode: "disable"
ssd_trim_date: "1"
ssd_trim_freq: "never"
ssd_trim_hour: "1"
@@ -2126,7 +2126,10 @@ EXAMPLES = """
ssh_cbc_cipher: "enable"
ssh_enc_algo: "chacha20-poly1305@openssh.com"
ssh_hmac_md5: "enable"
+ ssh_hostkey: "myhostname"
ssh_hostkey_algo: "ssh-rsa"
+ ssh_hostkey_override: "disable"
+ ssh_hostkey_password: "myhostname"
ssh_kex_algo: "diffie-hellman-group1-sha1"
ssh_kex_sha1: "enable"
ssh_mac_algo: "hmac-md5"
@@ -2151,7 +2154,7 @@ EXAMPLES = """
tcp_rst_timer: "5"
tcp_timewait_timer: "1"
tftp: "enable"
- timezone: "01"
+ timezone: "<your_own_value> (source system.timezone.name)"
tp_mc_skip_policy: "enable"
traffic_priority: "tos"
traffic_priority_level: "low"
@@ -2163,15 +2166,16 @@ EXAMPLES = """
udp_idle_timer: "180"
url_filter_affinity: "<your_own_value>"
url_filter_count: "1"
- user_device_store_max_devices: "20921"
- user_device_store_max_unified_mem: "104609177"
- user_device_store_max_users: "20921"
+ user_device_store_max_devices: "20911"
+ user_device_store_max_unified_mem: "104558182"
+ user_device_store_max_users: "20911"
user_server_cert: "<your_own_value> (source certificate.local.name)"
vdom_admin: "enable"
vdom_mode: "no-vdom"
vip_arp_range: "unlimited"
virtual_server_count: "20"
virtual_server_hardware_acceleration: "disable"
+ virtual_switch_vlan: "enable"
vpn_ems_sn_check: "enable"
wad_affinity: "<your_own_value>"
wad_csvc_cs_count: "1"
@@ -2314,6 +2318,7 @@ def filter_system_global_data(json):
"av_failopen",
"av_failopen_session",
"batch_cmdb",
+ "bfd_affinity",
"block_session_timer",
"br_fdb_max_entry",
"cert_chain_max",
@@ -2355,6 +2360,7 @@ def filter_system_global_data(json):
"fortiextender_discovery_lockdown",
"fortiextender_provision_on_authorization",
"fortiextender_vlan_mode",
+ "fortigslb_integration",
"fortiipam_integration",
"fortiservice_port",
"fortitoken_cloud",
@@ -2453,6 +2459,7 @@ def filter_system_global_data(json):
"proxy_re_authentication_time",
"proxy_resource_mode",
"proxy_worker_count",
+ "purdue_level",
"quic_ack_thresold",
"quic_congestion_control_algo",
"quic_max_datagram_size",
@@ -2475,7 +2482,10 @@ def filter_system_global_data(json):
"snat_route_change",
"special_file_23_support",
"speedtest_server",
+ "speedtestd_ctrl_port",
+ "speedtestd_server_port",
"split_port",
+ "split_port_mode",
"ssd_trim_date",
"ssd_trim_freq",
"ssd_trim_hour",
@@ -2484,7 +2494,10 @@ def filter_system_global_data(json):
"ssh_cbc_cipher",
"ssh_enc_algo",
"ssh_hmac_md5",
+ "ssh_hostkey",
"ssh_hostkey_algo",
+ "ssh_hostkey_override",
+ "ssh_hostkey_password",
"ssh_kex_algo",
"ssh_kex_sha1",
"ssh_mac_algo",
@@ -2530,6 +2543,7 @@ def filter_system_global_data(json):
"vip_arp_range",
"virtual_server_count",
"virtual_server_hardware_acceleration",
+ "virtual_switch_vlan",
"vpn_ems_sn_check",
"wad_affinity",
"wad_csvc_cs_count",
@@ -2611,9 +2625,10 @@ def system_global(data, fos):
vdom = data["vdom"]
system_global_data = data["system_global"]
system_global_data = flatten_multilists_attributes(system_global_data)
- filtered_data = underscore_to_hyphen(filter_system_global_data(system_global_data))
+ filtered_data = filter_system_global_data(system_global_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "global", data=filtered_data, vdom=vdom)
+ return fos.set("system", "global", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -2789,32 +2804,41 @@ versioned_schema = {
"admintimeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"admin_console_timeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"ssd_trim_freq": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
- {"value": "never"},
- {"value": "hourly"},
- {"value": "daily"},
- {"value": "weekly"},
- {"value": "monthly"},
+ {"value": "never", "v_range": [["v6.0.0", ""]]},
+ {"value": "hourly", "v_range": [["v6.0.0", ""]]},
+ {"value": "daily", "v_range": [["v6.0.0", ""]]},
+ {"value": "weekly", "v_range": [["v6.0.0", ""]]},
+ {"value": "monthly", "v_range": [["v6.0.0", ""]]},
],
},
- "ssd_trim_hour": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "ssd_trim_min": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "ssd_trim_hour": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "ssd_trim_min": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
"ssd_trim_weekday": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
- {"value": "sunday"},
- {"value": "monday"},
- {"value": "tuesday"},
- {"value": "wednesday"},
- {"value": "thursday"},
- {"value": "friday"},
- {"value": "saturday"},
+ {"value": "sunday", "v_range": [["v6.0.0", ""]]},
+ {"value": "monday", "v_range": [["v6.0.0", ""]]},
+ {"value": "tuesday", "v_range": [["v6.0.0", ""]]},
+ {"value": "wednesday", "v_range": [["v6.0.0", ""]]},
+ {"value": "thursday", "v_range": [["v6.0.0", ""]]},
+ {"value": "friday", "v_range": [["v6.0.0", ""]]},
+ {"value": "saturday", "v_range": [["v6.0.0", ""]]},
],
},
- "ssd_trim_date": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "ssd_trim_date": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
"admin_concurrent": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -2825,6 +2849,21 @@ versioned_schema = {
"refresh": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"failtime": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "purdue_level": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "1"},
+ {"value": "1.5"},
+ {"value": "2"},
+ {"value": "2.5"},
+ {"value": "3"},
+ {"value": "3.5"},
+ {"value": "4"},
+ {"value": "5"},
+ {"value": "5.5"},
+ ],
+ },
"daily_restart": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -2839,6 +2878,8 @@ versioned_schema = {
"wad_restart_start_time": {"v_range": [["v7.2.4", ""]], "type": "string"},
"wad_restart_end_time": {"v_range": [["v7.2.4", ""]], "type": "string"},
"radius_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "speedtestd_server_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "speedtestd_ctrl_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"admin_login_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"remoteauthtimeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"ldapconntimeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
@@ -2868,100 +2909,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "timezone": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [
- {"value": "01"},
- {"value": "02"},
- {"value": "03"},
- {"value": "04"},
- {"value": "05"},
- {"value": "81"},
- {"value": "06"},
- {"value": "07"},
- {"value": "08"},
- {"value": "09"},
- {"value": "10"},
- {"value": "11"},
- {"value": "12"},
- {"value": "13"},
- {"value": "74"},
- {"value": "14"},
- {"value": "77"},
- {"value": "15"},
- {"value": "87"},
- {"value": "16"},
- {"value": "17"},
- {"value": "18"},
- {"value": "19"},
- {"value": "20"},
- {"value": "75"},
- {"value": "21"},
- {"value": "22"},
- {"value": "23"},
- {"value": "24"},
- {"value": "80"},
- {"value": "79"},
- {"value": "25"},
- {"value": "26"},
- {"value": "27"},
- {"value": "28"},
- {"value": "78"},
- {"value": "29"},
- {"value": "30"},
- {"value": "31"},
- {"value": "32"},
- {"value": "33"},
- {"value": "34"},
- {"value": "35"},
- {"value": "36"},
- {"value": "37"},
- {"value": "38"},
- {"value": "83"},
- {"value": "84"},
- {"value": "40"},
- {"value": "85"},
- {"value": "39"},
- {"value": "41"},
- {"value": "42"},
- {"value": "43"},
- {"value": "44"},
- {"value": "45"},
- {"value": "46"},
- {"value": "47"},
- {"value": "51"},
- {"value": "48"},
- {"value": "49"},
- {"value": "50"},
- {"value": "52"},
- {"value": "53"},
- {"value": "54"},
- {"value": "55"},
- {"value": "56"},
- {"value": "57"},
- {"value": "58"},
- {"value": "59"},
- {"value": "60"},
- {"value": "61"},
- {"value": "62"},
- {"value": "63"},
- {"value": "64"},
- {"value": "65"},
- {"value": "66"},
- {"value": "67"},
- {"value": "68"},
- {"value": "69"},
- {"value": "70"},
- {"value": "71"},
- {"value": "72"},
- {"value": "00"},
- {"value": "82"},
- {"value": "73"},
- {"value": "86"},
- {"value": "76"},
- ],
- },
+ "timezone": {"v_range": [["v6.0.0", ""]], "type": "string"},
"traffic_priority": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -3112,6 +3060,8 @@ versioned_schema = {
"options": [
{"value": "ssh-rsa"},
{"value": "ecdsa-sha2-nistp521"},
+ {"value": "ecdsa-sha2-nistp384", "v_range": [["v7.4.2", ""]]},
+ {"value": "ecdsa-sha2-nistp256", "v_range": [["v7.4.2", ""]]},
{"value": "rsa-sha2-256"},
{"value": "rsa-sha2-512"},
{"value": "ssh-ed25519"},
@@ -3119,6 +3069,13 @@ versioned_schema = {
"multiple_values": True,
"elements": "str",
},
+ "ssh_hostkey_override": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "ssh_hostkey_password": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "ssh_hostkey": {"v_range": [["v7.4.2", ""]], "type": "string"},
"snat_route_change": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -3536,10 +3493,14 @@ versioned_schema = {
},
"arp_max_entry": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"ha_affinity": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "bfd_affinity": {"v_range": [["v7.4.2", ""]], "type": "string"},
"cmdbsvr_affinity": {"v_range": [["v7.0.1", ""]], "type": "string"},
"av_affinity": {"v_range": [["v6.0.0", ""]], "type": "string"},
"wad_affinity": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "ips_affinity": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "ips_affinity": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "string",
+ },
"miglog_affinity": {"v_range": [["v6.0.0", ""]], "type": "string"},
"syslog_affinity": {"v_range": [["v7.2.4", ""]], "type": "string"},
"url_filter_affinity": {"v_range": [["v6.2.0", ""]], "type": "string"},
@@ -3568,11 +3529,6 @@ versioned_schema = {
},
],
},
- "ipsec_soft_dec_async": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
"device_idle_timeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"user_device_store_max_devices": {
"v_range": [["v6.4.4", ""]],
@@ -3705,8 +3661,13 @@ versioned_schema = {
"options": [{"value": "disable"}, {"value": "enable"}],
},
"sflowd_max_children_num": {"v_range": [["v7.2.4", ""]], "type": "integer"},
+ "fortigslb_integration": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
"split_port": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "list",
"multiple_values": True,
"elements": "str",
@@ -3745,6 +3706,42 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "virtual_switch_vlan": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "split_port_mode": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "interface": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ },
+ "split_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "disable"},
+ {"value": "4x10G"},
+ {"value": "4x25G"},
+ {"value": "4x50G"},
+ {"value": "8x25G"},
+ {"value": "8x50G"},
+ {"value": "4x100G"},
+ {"value": "2x200G"},
+ ],
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "ipsec_soft_dec_async": {
+ "v_range": [["v6.0.0", "v7.4.1"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"gui_allow_default_hostname": {
"v_range": [["v6.2.0", "v7.4.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gre_tunnel.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gre_tunnel.py
index a1bdf2013..3cdee19e7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gre_tunnel.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_gre_tunnel.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -88,6 +88,13 @@ options:
default: null
type: dict
suboptions:
+ auto_asic_offload:
+ description:
+ - Enable/disable automatic ASIC offloading.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
checksum_reception:
description:
- Enable/disable validating checksums in received GRE packets.
@@ -191,6 +198,7 @@ EXAMPLES = """
state: "present"
access_token: "<your_own_value>"
system_gre_tunnel:
+ auto_asic_offload: "enable"
checksum_reception: "disable"
checksum_transmission: "disable"
diffservcode: "<your_own_value>"
@@ -203,7 +211,7 @@ EXAMPLES = """
key_outbound: "0"
local_gw: "<your_own_value>"
local_gw6: "<your_own_value>"
- name: "default_name_15"
+ name: "default_name_16"
remote_gw: "<your_own_value>"
remote_gw6: "<your_own_value>"
sequence_number_reception: "disable"
@@ -301,6 +309,7 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.compariso
def filter_system_gre_tunnel_data(json):
option_list = [
+ "auto_asic_offload",
"checksum_reception",
"checksum_transmission",
"diffservcode",
@@ -350,9 +359,8 @@ def system_gre_tunnel(data, fos, check_mode=False):
state = data["state"]
system_gre_tunnel_data = data["system_gre_tunnel"]
- filtered_data = underscore_to_hyphen(
- filter_system_gre_tunnel_data(system_gre_tunnel_data)
- )
+ filtered_data = filter_system_gre_tunnel_data(system_gre_tunnel_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -416,7 +424,7 @@ def system_gre_tunnel(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "gre-tunnel", data=filtered_data, vdom=vdom)
+ return fos.set("system", "gre-tunnel", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "gre-tunnel", mkey=filtered_data["name"], vdom=vdom)
@@ -577,6 +585,11 @@ versioned_schema = {
"diffservcode": {"v_range": [["v6.2.0", ""]], "type": "string"},
"keepalive_interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"keepalive_failtimes": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "auto_asic_offload": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha.py
index af4bb8263..adf6f5586 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -225,6 +225,27 @@ options:
choices:
- 'enable'
- 'disable'
+ ipsec_phase2_proposal:
+ description:
+ - IPsec phase2 proposal.
+ type: list
+ elements: str
+ choices:
+ - 'aes128-sha1'
+ - 'aes128-sha256'
+ - 'aes128-sha384'
+ - 'aes128-sha512'
+ - 'aes192-sha1'
+ - 'aes192-sha256'
+ - 'aes192-sha384'
+ - 'aes192-sha512'
+ - 'aes256-sha1'
+ - 'aes256-sha256'
+ - 'aes256-sha384'
+ - 'aes256-sha512'
+ - 'aes128gcm'
+ - 'aes256gcm'
+ - 'chacha20poly1305'
key:
description:
- Key.
@@ -607,6 +628,10 @@ options:
description:
- Remote IP monitoring failover threshold (0 - 50).
type: int
+ pingserver_flip_timeout:
+ description:
+ - Time to wait in minutes before renegotiating after a remote IP monitoring failover.
+ type: int
pingserver_monitor_interface:
description:
- Interfaces to check for remote IP monitoring. Source system.interface.name.
@@ -710,6 +735,7 @@ EXAMPLES = """
http_proxy_threshold: "<your_own_value>"
imap_proxy_threshold: "<your_own_value>"
inter_cluster_session_sync: "enable"
+ ipsec_phase2_proposal: "aes128-sha1"
key: "<your_own_value>"
l2ep_eth_type: "<your_own_value>"
link_failed_signal: "enable"
@@ -769,7 +795,7 @@ EXAMPLES = """
unicast_hb_peerip: "<your_own_value>"
unicast_peers:
-
- id: "91"
+ id: "92"
peer_ip: "<your_own_value>"
unicast_status: "enable"
uninterruptible_primary_wait: "30"
@@ -781,6 +807,7 @@ EXAMPLES = """
override: "enable"
override_wait_time: "0"
pingserver_failover_threshold: "0"
+ pingserver_flip_timeout: "60"
pingserver_monitor_interface: "<your_own_value> (source system.interface.name)"
pingserver_secondary_force_reset: "enable"
pingserver_slave_force_reset: "enable"
@@ -788,7 +815,7 @@ EXAMPLES = """
vcluster_id: "<you_own_value>"
vdom:
-
- name: "default_name_108 (source system.vdom.name)"
+ name: "default_name_110 (source system.vdom.name)"
vcluster_id: "0"
vcluster_status: "enable"
vcluster2: "enable"
@@ -902,6 +929,7 @@ def filter_system_ha_data(json):
"http_proxy_threshold",
"imap_proxy_threshold",
"inter_cluster_session_sync",
+ "ipsec_phase2_proposal",
"key",
"l2ep_eth_type",
"link_failed_signal",
@@ -998,6 +1026,7 @@ def flatten_multilists_attributes(data):
["pingserver_monitor_interface"],
["vcluster", "monitor"],
["vcluster", "pingserver_monitor_interface"],
+ ["ipsec_phase2_proposal"],
["secondary_vcluster", "monitor"],
["secondary_vcluster", "pingserver_monitor_interface"],
]
@@ -1025,9 +1054,10 @@ def system_ha(data, fos):
vdom = data["vdom"]
system_ha_data = data["system_ha"]
system_ha_data = flatten_multilists_attributes(system_ha_data)
- filtered_data = underscore_to_hyphen(filter_system_ha_data(system_ha_data))
+ filtered_data = filter_system_ha_data(system_ha_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ha", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ha", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -1377,6 +1407,10 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "pingserver_flip_timeout": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
"vdom": {
"type": "list",
"elements": "dict",
@@ -1403,9 +1437,12 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"ssd_failover": {
- "v_range": [["v6.2.0", ""]],
+ "v_range": [["v6.2.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable", "v_range": [["v6.2.0", ""]]},
+ {"value": "disable", "v_range": [["v6.2.0", ""]]},
+ ],
},
"memory_compatible_mode": {
"v_range": [["v6.0.0", ""]],
@@ -1428,6 +1465,29 @@ versioned_schema = {
"type": "integer",
},
"failover_hold_time": {"v_range": [["v7.0.0", ""]], "type": "integer"},
+ "ipsec_phase2_proposal": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "list",
+ "options": [
+ {"value": "aes128-sha1"},
+ {"value": "aes128-sha256"},
+ {"value": "aes128-sha384"},
+ {"value": "aes128-sha512"},
+ {"value": "aes192-sha1"},
+ {"value": "aes192-sha256"},
+ {"value": "aes192-sha384"},
+ {"value": "aes192-sha512"},
+ {"value": "aes256-sha1"},
+ {"value": "aes256-sha256"},
+ {"value": "aes256-sha384"},
+ {"value": "aes256-sha512"},
+ {"value": "aes128gcm"},
+ {"value": "aes256gcm"},
+ {"value": "chacha20poly1305"},
+ ],
+ "multiple_values": True,
+ "elements": "str",
+ },
"uninterruptible_upgrade": {
"v_range": [["v6.0.0", "v7.4.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha_monitor.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha_monitor.py
index e3f8b92f2..0acadf59c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha_monitor.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ha_monitor.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -215,11 +215,10 @@ def underscore_to_hyphen(data):
def system_ha_monitor(data, fos):
vdom = data["vdom"]
system_ha_monitor_data = data["system_ha_monitor"]
- filtered_data = underscore_to_hyphen(
- filter_system_ha_monitor_data(system_ha_monitor_data)
- )
+ filtered_data = filter_system_ha_monitor_data(system_ha_monitor_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ha-monitor", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ha-monitor", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ike.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ike.py
index b7ceac35e..69b42f962 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ike.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ike.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -745,9 +745,10 @@ def underscore_to_hyphen(data):
def system_ike(data, fos):
vdom = data["vdom"]
system_ike_data = data["system_ike"]
- filtered_data = underscore_to_hyphen(filter_system_ike_data(system_ike_data))
+ filtered_data = filter_system_ike_data(system_ike_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ike", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ike", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_interface.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_interface.py
index a1ee1706b..ae4f0e1d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_interface.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_interface.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -690,6 +690,16 @@ options:
description:
- Transparent mode forward domain.
type: int
+ forward_error_correction:
+ description:
+ - Configure forward error correction (FEC).
+ type: str
+ choices:
+ - 'none'
+ - 'disable'
+ - 'cl91-rs-fec'
+ - 'cl74-fc-fec'
+ - 'auto'
gi_gk:
description:
- Enable/disable Gi Gatekeeper.
@@ -763,6 +773,14 @@ options:
description:
- Ingress Spillover threshold (0 - 16776000 kbps), 0 means unlimited.
type: int
+ interconnect_profile:
+ description:
+ - Set interconnect profile.
+ type: str
+ choices:
+ - 'default'
+ - 'profile1'
+ - 'profile2'
interface:
description:
- Interface name. Source system.interface.name.
@@ -1201,6 +1219,13 @@ options:
description:
- Advertisement interval (1 - 255 seconds).
type: int
+ ignore_default_route:
+ description:
+ - Enable/disable ignoring of default route when checking destination.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
preempt:
description:
- Enable/disable preempt mode.
@@ -1358,6 +1383,21 @@ options:
- Select SFP media interface type
type: str
choices:
+ - 'none'
+ - 'gmii'
+ - 'sgmii'
+ - 'sr'
+ - 'lr'
+ - 'cr'
+ - 'sr2'
+ - 'lr2'
+ - 'cr2'
+ - 'sr4'
+ - 'lr4'
+ - 'cr4'
+ - 'sr8'
+ - 'lr8'
+ - 'cr8'
- 'cfp2-sr10'
- 'cfp2-lr4'
member:
@@ -1382,6 +1422,43 @@ options:
choices:
- 'operational'
- 'administrative'
+ mirroring_direction:
+ description:
+ - Port mirroring direction.
+ type: str
+ choices:
+ - 'rx'
+ - 'tx'
+ - 'both'
+ mirroring_filter:
+ description:
+ - Mirroring filter.
+ type: dict
+ suboptions:
+ filter_dport:
+ description:
+ - Destinatin port of mirroring filter.
+ type: int
+ filter_dstip:
+ description:
+ - Destinatin IP and mask of mirroring filter.
+ type: str
+ filter_protocol:
+ description:
+ - Protocol of mirroring filter.
+ type: int
+ filter_sport:
+ description:
+ - Source port of mirroring filter.
+ type: int
+ filter_srcip:
+ description:
+ - Source IP and mask of mirroring filter.
+ type: str
+ mirroring_port:
+ description:
+ - Mirroring port. Source system.interface.name.
+ type: str
mode:
description:
- Addressing mode (static, DHCP, PPPoE).
@@ -1436,6 +1513,10 @@ options:
- 'tx'
- 'rx'
- 'both'
+ np_qos_profile:
+ description:
+ - NP QoS profile ID.
+ type: int
outbandwidth:
description:
- Bandwidth limit for outgoing traffic (0 - 80000000 kbps).
@@ -1456,6 +1537,13 @@ options:
description:
- sFlow polling interval in seconds (1 - 255).
type: int
+ port_mirroring:
+ description:
+ - Enable/disable NP port mirroring.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
pppoe_unnumbered_negotiate:
description:
- Enable/disable PPPoE unnumbered negotiation.
@@ -1648,6 +1736,30 @@ options:
- DHCP relay IP address.
type: list
elements: str
+ security_8021x_dynamic_vlan_id:
+ description:
+ - VLAN ID for virtual switch.
+ type: int
+ security_8021x_master:
+ description:
+ - 802.1X master virtual-switch.
+ type: str
+ security_8021x_member_mode:
+ description:
+ - 802.1X member mode.
+ type: str
+ choices:
+ - 'switch'
+ - 'disable'
+ security_8021x_mode:
+ description:
+ - 802.1X mode.
+ type: str
+ choices:
+ - 'default'
+ - 'dynamic-vlan'
+ - 'fallback'
+ - 'slave'
security_exempt_list:
description:
- Name of security-exempt-list.
@@ -1722,7 +1834,19 @@ options:
- '10000auto'
- '40000full'
- '40000auto'
+ - '100auto'
+ - '2500auto'
+ - '5000auto'
+ - '25000full'
+ - '25000auto'
+ - '50000full'
+ - '50000auto'
- '100Gfull'
+ - '100Gauto'
+ - '200Gfull'
+ - '200Gauto'
+ - '400Gfull'
+ - '400Gauto'
- '1000half'
spillover_threshold:
description:
@@ -1749,6 +1873,13 @@ options:
choices:
- 'disable'
- 'enable'
+ stp_edge:
+ description:
+ - Enable/disable as STP edge port.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
stp_ha_secondary:
description:
- Control STP behavior on HA secondary.
@@ -1987,6 +2118,13 @@ options:
description:
- TCP maximum segment size. 0 means do not change segment size.
type: int
+ trunk:
+ description:
+ - Enable/disable VLAN trunk.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
trust_ip_1:
description:
- Trusted host for dedicated management traffic (0.0.0.0/24 for all hosts).
@@ -2295,6 +2433,7 @@ EXAMPLES = """
fortilink_split_interface: "enable"
fortilink_stacking: "enable"
forward_domain: "0"
+ forward_error_correction: "none"
gi_gk: "enable"
gwdetect: "enable"
ha_priority: "1"
@@ -2307,6 +2446,7 @@ EXAMPLES = """
ingress_cos: "disable"
ingress_shaping_profile: "<your_own_value> (source firewall.shaping-profile.profile-name)"
ingress_spillover_threshold: "0"
+ interconnect_profile: "default"
interface: "<your_own_value> (source system.interface.name)"
internal: "0"
ip: "<your_own_value>"
@@ -2336,7 +2476,7 @@ EXAMPLES = """
dhcp6_relay_source_ip: "<your_own_value>"
dhcp6_relay_type: "regular"
icmp6_send_redirect: "enable"
- interface_identifier: "myId_145"
+ interface_identifier: "myId_147"
ip6_address: "<your_own_value>"
ip6_allowaccess: "ping"
ip6_default_life: "1800"
@@ -2393,6 +2533,7 @@ EXAMPLES = """
-
accept_mode: "enable"
adv_interval: "1"
+ ignore_default_route: "enable"
preempt: "enable"
priority: "100"
start_time: "3"
@@ -2415,30 +2556,40 @@ EXAMPLES = """
macaddr: "<your_own_value>"
managed_device:
-
- name: "default_name_218"
+ name: "default_name_221"
managed_subnetwork_size: "32"
management_ip: "<your_own_value>"
measured_downstream_bandwidth: "0"
measured_upstream_bandwidth: "0"
- mediatype: "cfp2-sr10"
+ mediatype: "none"
member:
-
interface_name: "<your_own_value> (source system.interface.name)"
min_links: "1"
min_links_down: "operational"
+ mirroring_direction: "rx"
+ mirroring_filter:
+ filter_dport: "0"
+ filter_dstip: "<your_own_value>"
+ filter_protocol: "0"
+ filter_sport: "0"
+ filter_srcip: "<your_own_value>"
+ mirroring_port: "<your_own_value> (source system.interface.name)"
mode: "static"
monitor_bandwidth: "enable"
mtu: "1500"
mtu_override: "enable"
- name: "default_name_232"
+ name: "default_name_243"
ndiscforward: "enable"
netbios_forward: "disable"
netflow_sampler: "disable"
+ np_qos_profile: "0"
outbandwidth: "0"
padt_retry_timeout: "1"
password: "<your_own_value>"
ping_serv_status: "0"
polling_interval: "20"
+ port_mirroring: "disable"
pppoe_unnumbered_negotiate: "enable"
pptp_auth_type: "auto"
pptp_client: "enable"
@@ -2468,16 +2619,20 @@ EXAMPLES = """
detectserver: "<your_own_value>"
gwdetect: "enable"
ha_priority: "1"
- id: "269"
+ id: "282"
ip: "<your_own_value>"
ping_serv_status: "0"
secip_relay_ip: "<your_own_value>"
+ security_8021x_dynamic_vlan_id: "0"
+ security_8021x_master: "<your_own_value>"
+ security_8021x_member_mode: "switch"
+ security_8021x_mode: "default"
security_exempt_list: "<your_own_value>"
security_external_logout: "<your_own_value>"
security_external_web: "<your_own_value>"
security_groups:
-
- name: "default_name_277 (source user.group.name)"
+ name: "default_name_294 (source user.group.name)"
security_mac_auth_bypass: "mac-auth-only"
security_mode: "none"
security_redirect_url: "<your_own_value>"
@@ -2489,6 +2644,7 @@ EXAMPLES = """
src_check: "enable"
status: "up"
stp: "disable"
+ stp_edge: "disable"
stp_ha_secondary: "disable"
stp_ha_slave: "disable"
stpforward: "enable"
@@ -2525,11 +2681,12 @@ EXAMPLES = """
tagging:
-
category: "<your_own_value> (source system.object-tagging.category)"
- name: "default_name_324"
+ name: "default_name_342"
tags:
-
- name: "default_name_326 (source system.object-tagging.tags.name)"
+ name: "default_name_344 (source system.object-tagging.tags.name)"
tcp_mss: "0"
+ trunk: "enable"
trust_ip_1: "<your_own_value>"
trust_ip_2: "<your_own_value>"
trust_ip_3: "<your_own_value>"
@@ -2553,7 +2710,7 @@ EXAMPLES = """
priority: "100"
proxy_arp:
-
- id: "349"
+ id: "368"
ip: "<your_own_value>"
start_time: "3"
status: "enable"
@@ -2745,6 +2902,7 @@ def filter_system_interface_data(json):
"fortilink_split_interface",
"fortilink_stacking",
"forward_domain",
+ "forward_error_correction",
"gi_gk",
"gwdetect",
"ha_priority",
@@ -2757,6 +2915,7 @@ def filter_system_interface_data(json):
"ingress_cos",
"ingress_shaping_profile",
"ingress_spillover_threshold",
+ "interconnect_profile",
"interface",
"internal",
"ip",
@@ -2786,6 +2945,9 @@ def filter_system_interface_data(json):
"member",
"min_links",
"min_links_down",
+ "mirroring_direction",
+ "mirroring_filter",
+ "mirroring_port",
"mode",
"monitor_bandwidth",
"mtu",
@@ -2794,11 +2956,13 @@ def filter_system_interface_data(json):
"ndiscforward",
"netbios_forward",
"netflow_sampler",
+ "np_qos_profile",
"outbandwidth",
"padt_retry_timeout",
"password",
"ping_serv_status",
"polling_interval",
+ "port_mirroring",
"pppoe_unnumbered_negotiate",
"pptp_auth_type",
"pptp_client",
@@ -2822,6 +2986,10 @@ def filter_system_interface_data(json):
"scan_botnet_connections",
"secondary_IP",
"secondaryip",
+ "security_8021x_dynamic_vlan_id",
+ "security_8021x_master",
+ "security_8021x_member_mode",
+ "security_8021x_mode",
"security_exempt_list",
"security_external_logout",
"security_external_web",
@@ -2837,6 +3005,7 @@ def filter_system_interface_data(json):
"src_check",
"status",
"stp",
+ "stp_edge",
"stp_ha_secondary",
"stp_ha_slave",
"stpforward",
@@ -2872,6 +3041,7 @@ def filter_system_interface_data(json):
"system_id_type",
"tagging",
"tcp_mss",
+ "trunk",
"trust_ip_1",
"trust_ip_2",
"trust_ip_3",
@@ -2967,9 +3137,8 @@ def system_interface(data, fos, check_mode=False):
system_interface_data = data["system_interface"]
system_interface_data = flatten_multilists_attributes(system_interface_data)
- filtered_data = underscore_to_hyphen(
- filter_system_interface_data(system_interface_data)
- )
+ filtered_data = filter_system_interface_data(system_interface_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -3033,7 +3202,7 @@ def system_interface(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "interface", data=filtered_data, vdom=vdom)
+ return fos.set("system", "interface", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "interface", mkey=filtered_data["name"], vdom=vdom)
@@ -3416,14 +3585,27 @@ versioned_schema = {
{"value": "10000auto"},
{"value": "40000full"},
{"value": "40000auto", "v_range": [["v7.4.0", ""]]},
+ {"value": "100auto", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "2500auto", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "5000auto", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "25000full", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "25000auto", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "50000full", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "50000auto", "v_range": [["v7.4.2", "v7.4.2"]]},
{
"value": "100Gfull",
"v_range": [
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
},
+ {"value": "100Gauto", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "200Gfull", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "200Gauto", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "400Gfull", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "400Gauto", "v_range": [["v7.4.2", "v7.4.2"]]},
{"value": "1000half", "v_range": [["v6.0.0", "v7.0.3"]]},
],
},
@@ -3466,6 +3648,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
},
],
@@ -4375,6 +4558,11 @@ versioned_schema = {
"multiple_values": True,
"elements": "str",
},
+ "ignore_default_route": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"status": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -4412,20 +4600,31 @@ versioned_schema = {
},
},
},
+ "gi_gk": {
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"sw_algorithm": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "l2"}, {"value": "l3"}, {"value": "eh"}],
},
"egress_queues": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "dict",
"children": {
"cos0": {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -4433,7 +4632,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -4441,7 +4641,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -4449,7 +4650,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -4457,7 +4659,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -4465,7 +4668,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -4473,7 +4677,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -4481,14 +4686,20 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
},
},
"ingress_cos": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [
{"value": "disable"},
@@ -4503,7 +4714,12 @@ versioned_schema = {
],
},
"egress_cos": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [
{"value": "disable"},
@@ -4517,32 +4733,89 @@ versioned_schema = {
{"value": "cos7"},
],
},
- "disconnect_threshold": {"v_range": [["v6.0.0", "v7.4.0"]], "type": "integer"},
"mediatype": {
"v_range": [
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
- "options": [{"value": "cfp2-sr10"}, {"value": "cfp2-lr4"}],
+ "options": [
+ {"value": "none", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "gmii", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "sgmii", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "sr", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "lr", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "cr", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "sr2", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "lr2", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "cr2", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "sr4", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "lr4", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "cr4", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "sr8", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "lr8", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {"value": "cr8", "v_range": [["v7.4.2", "v7.4.2"]]},
+ {
+ "value": "cfp2-sr10",
+ "v_range": [
+ ["v6.0.0", "v6.2.7"],
+ ["v6.4.1", "v7.0.12"],
+ ["v7.2.1", "v7.2.4"],
+ ],
+ },
+ {
+ "value": "cfp2-lr4",
+ "v_range": [
+ ["v6.0.0", "v6.2.7"],
+ ["v6.4.1", "v7.0.12"],
+ ["v7.2.1", "v7.2.4"],
+ ],
+ },
+ ],
},
- "gi_gk": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "trunk": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "security_8021x_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "default"},
+ {"value": "dynamic-vlan"},
+ {"value": "fallback"},
+ {"value": "slave"},
+ ],
+ },
+ "security_8021x_master": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "security_8021x_dynamic_vlan_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "security_8021x_member_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "switch"}, {"value": "disable"}],
+ },
"stp": {
"v_range": [
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
"stp_ha_secondary": {
- "v_range": [["v7.0.0", "v7.0.12"], ["v7.2.1", "v7.2.4"]],
+ "v_range": [
+ ["v7.0.0", "v7.0.12"],
+ ["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
+ ],
"type": "string",
"options": [
{"value": "disable"},
@@ -4550,6 +4823,58 @@ versioned_schema = {
{"value": "priority-adjust"},
],
},
+ "stp_edge": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "forward_error_correction": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "none"},
+ {"value": "disable"},
+ {"value": "cl91-rs-fec"},
+ {"value": "cl74-fc-fec"},
+ {"value": "auto"},
+ ],
+ },
+ "interconnect_profile": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "default"},
+ {"value": "profile1"},
+ {"value": "profile2"},
+ ],
+ },
+ "np_qos_profile": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "port_mirroring": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "mirroring_direction": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "rx"}, {"value": "tx"}, {"value": "both"}],
+ },
+ "mirroring_port": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "mirroring_filter": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "filter_srcip": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "filter_dstip": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "filter_sport": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "filter_dport": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "filter_protocol": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ },
+ "disconnect_threshold": {"v_range": [["v6.0.0", "v7.4.0"]], "type": "integer"},
"cli_conn_status": {
"v_range": [["v6.0.0", "v7.0.5"], ["v7.2.0", "v7.2.0"]],
"type": "integer",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipam.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipam.py
index 007b3caf7..d0eea2c46 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipam.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipam.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -131,6 +131,13 @@ options:
description:
- Configure IPAM pool subnet, Class A - Class B subnet.
type: str
+ require_subnet_size_match:
+ description:
+ - Enable/disable reassignment of subnets to make requested and actual sizes match.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
rules:
description:
- Configure IPAM allocation rules.
@@ -227,20 +234,21 @@ EXAMPLES = """
description: "<your_own_value>"
name: "default_name_10"
subnet: "<your_own_value>"
+ require_subnet_size_match: "disable"
rules:
-
description: "<your_own_value>"
device:
-
- name: "default_name_15"
+ name: "default_name_16"
dhcp: "enable"
interface:
-
- name: "default_name_18"
- name: "default_name_19"
+ name: "default_name_19"
+ name: "default_name_20"
pool:
-
- name: "default_name_21 (source system.ipam.pools.name)"
+ name: "default_name_22 (source system.ipam.pools.name)"
role: "any"
server_type: "fabric-root"
status: "enable"
@@ -333,6 +341,7 @@ def filter_system_ipam_data(json):
"manage_ssid_addresses",
"pool_subnet",
"pools",
+ "require_subnet_size_match",
"rules",
"server_type",
"status",
@@ -364,9 +373,10 @@ def underscore_to_hyphen(data):
def system_ipam(data, fos):
vdom = data["vdom"]
system_ipam_data = data["system_ipam"]
- filtered_data = underscore_to_hyphen(filter_system_ipam_data(system_ipam_data))
+ filtered_data = filter_system_ipam_data(system_ipam_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ipam", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ipam", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -419,6 +429,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
+ "require_subnet_size_match": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
"manage_lan_addresses": {
"v_range": [["v7.4.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipip_tunnel.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipip_tunnel.py
index 97ce80dae..20af2cc33 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipip_tunnel.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipip_tunnel.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -263,9 +263,8 @@ def system_ipip_tunnel(data, fos, check_mode=False):
state = data["state"]
system_ipip_tunnel_data = data["system_ipip_tunnel"]
- filtered_data = underscore_to_hyphen(
- filter_system_ipip_tunnel_data(system_ipip_tunnel_data)
- )
+ filtered_data = filter_system_ipip_tunnel_data(system_ipip_tunnel_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -329,7 +328,7 @@ def system_ipip_tunnel(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "ipip-tunnel", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ipip-tunnel", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips.py
index 448dff5cd..4130aead1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -210,9 +210,10 @@ def underscore_to_hyphen(data):
def system_ips(data, fos):
vdom = data["vdom"]
system_ips_data = data["system_ips"]
- filtered_data = underscore_to_hyphen(filter_system_ips_data(system_ips_data))
+ filtered_data = filter_system_ips_data(system_ips_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ips", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ips", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns.py
index cb2cde784..96f786cbb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -241,9 +241,8 @@ def system_ips_urlfilter_dns(data, fos, check_mode=False):
state = data["state"]
system_ips_urlfilter_dns_data = data["system_ips_urlfilter_dns"]
- filtered_data = underscore_to_hyphen(
- filter_system_ips_urlfilter_dns_data(system_ips_urlfilter_dns_data)
- )
+ filtered_data = filter_system_ips_urlfilter_dns_data(system_ips_urlfilter_dns_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -307,7 +306,7 @@ def system_ips_urlfilter_dns(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "ips-urlfilter-dns", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ips-urlfilter-dns", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns6.py
index 93e162334..277886834 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ips_urlfilter_dns6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -233,9 +233,10 @@ def system_ips_urlfilter_dns6(data, fos, check_mode=False):
state = data["state"]
system_ips_urlfilter_dns6_data = data["system_ips_urlfilter_dns6"]
- filtered_data = underscore_to_hyphen(
- filter_system_ips_urlfilter_dns6_data(system_ips_urlfilter_dns6_data)
+ filtered_data = filter_system_ips_urlfilter_dns6_data(
+ system_ips_urlfilter_dns6_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -299,7 +300,7 @@ def system_ips_urlfilter_dns6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "ips-urlfilter-dns6", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ips-urlfilter-dns6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipsec_aggregate.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipsec_aggregate.py
index 136ac5927..0a14183e6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipsec_aggregate.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipsec_aggregate.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -250,9 +250,8 @@ def system_ipsec_aggregate(data, fos, check_mode=False):
state = data["state"]
system_ipsec_aggregate_data = data["system_ipsec_aggregate"]
- filtered_data = underscore_to_hyphen(
- filter_system_ipsec_aggregate_data(system_ipsec_aggregate_data)
- )
+ filtered_data = filter_system_ipsec_aggregate_data(system_ipsec_aggregate_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -316,7 +315,7 @@ def system_ipsec_aggregate(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "ipsec-aggregate", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ipsec-aggregate", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_neighbor_cache.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_neighbor_cache.py
index 40614d64b..56737ccb9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_neighbor_cache.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_neighbor_cache.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,9 +242,10 @@ def system_ipv6_neighbor_cache(data, fos, check_mode=False):
state = data["state"]
system_ipv6_neighbor_cache_data = data["system_ipv6_neighbor_cache"]
- filtered_data = underscore_to_hyphen(
- filter_system_ipv6_neighbor_cache_data(system_ipv6_neighbor_cache_data)
+ filtered_data = filter_system_ipv6_neighbor_cache_data(
+ system_ipv6_neighbor_cache_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -308,7 +309,7 @@ def system_ipv6_neighbor_cache(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "ipv6-neighbor-cache", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ipv6-neighbor-cache", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_tunnel.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_tunnel.py
index dc33a6c30..1f294db35 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_tunnel.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ipv6_tunnel.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -263,9 +263,8 @@ def system_ipv6_tunnel(data, fos, check_mode=False):
state = data["state"]
system_ipv6_tunnel_data = data["system_ipv6_tunnel"]
- filtered_data = underscore_to_hyphen(
- filter_system_ipv6_tunnel_data(system_ipv6_tunnel_data)
- )
+ filtered_data = filter_system_ipv6_tunnel_data(system_ipv6_tunnel_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -329,7 +328,7 @@ def system_ipv6_tunnel(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "ipv6-tunnel", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ipv6-tunnel", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_isf_queue_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_isf_queue_profile.py
index 129f0e3f5..b4f1c00d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_isf_queue_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_isf_queue_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -287,9 +287,8 @@ def system_isf_queue_profile(data, fos, check_mode=False):
state = data["state"]
system_isf_queue_profile_data = data["system_isf_queue_profile"]
- filtered_data = underscore_to_hyphen(
- filter_system_isf_queue_profile_data(system_isf_queue_profile_data)
- )
+ filtered_data = filter_system_isf_queue_profile_data(system_isf_queue_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -353,7 +352,7 @@ def system_isf_queue_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "isf-queue-profile", data=filtered_data, vdom=vdom)
+ return fos.set("system", "isf-queue-profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -399,25 +398,45 @@ versioned_schema = {
"elements": "dict",
"children": {
"name": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"required": True,
},
"guaranteed_bandwidth": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"maximum_bandwidth": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"bandwidth_unit": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "kbps"}, {"value": "pps"}],
},
"burst_bps_granularity": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "disable"},
@@ -431,7 +450,7 @@ versioned_schema = {
],
},
"burst_pps_granularity": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "disable"},
@@ -450,7 +469,12 @@ versioned_schema = {
"options": [{"value": "disable"}, {"value": "enable"}],
},
},
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_link_monitor.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_link_monitor.py
index 57f3b9d94..101445feb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_link_monitor.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_link_monitor.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -547,9 +547,8 @@ def system_link_monitor(data, fos, check_mode=False):
system_link_monitor_data = data["system_link_monitor"]
system_link_monitor_data = flatten_multilists_attributes(system_link_monitor_data)
- filtered_data = underscore_to_hyphen(
- filter_system_link_monitor_data(system_link_monitor_data)
- )
+ filtered_data = filter_system_link_monitor_data(system_link_monitor_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -613,7 +612,7 @@ def system_link_monitor(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "link-monitor", data=filtered_data, vdom=vdom)
+ return fos.set("system", "link-monitor", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lldp_network_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lldp_network_policy.py
index f70e735bd..f752a5a07 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lldp_network_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lldp_network_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -545,9 +545,10 @@ def system_lldp_network_policy(data, fos, check_mode=False):
state = data["state"]
system_lldp_network_policy_data = data["system_lldp_network_policy"]
- filtered_data = underscore_to_hyphen(
- filter_system_lldp_network_policy_data(system_lldp_network_policy_data)
+ filtered_data = filter_system_lldp_network_policy_data(
+ system_lldp_network_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -611,7 +612,7 @@ def system_lldp_network_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.lldp", "network-policy", data=filtered_data, vdom=vdom)
+ return fos.set("system.lldp", "network-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lte_modem.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lte_modem.py
index 2e7db2145..1b8559912 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lte_modem.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_lte_modem.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -276,11 +276,10 @@ def underscore_to_hyphen(data):
def system_lte_modem(data, fos):
vdom = data["vdom"]
system_lte_modem_data = data["system_lte_modem"]
- filtered_data = underscore_to_hyphen(
- filter_system_lte_modem_data(system_lte_modem_data)
- )
+ filtered_data = filter_system_lte_modem_data(system_lte_modem_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "lte-modem", data=filtered_data, vdom=vdom)
+ return fos.set("system", "lte-modem", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mac_address_table.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mac_address_table.py
index 63855474f..8f0af4ba9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mac_address_table.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mac_address_table.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,9 +235,8 @@ def system_mac_address_table(data, fos, check_mode=False):
state = data["state"]
system_mac_address_table_data = data["system_mac_address_table"]
- filtered_data = underscore_to_hyphen(
- filter_system_mac_address_table_data(system_mac_address_table_data)
- )
+ filtered_data = filter_system_mac_address_table_data(system_mac_address_table_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -301,7 +300,7 @@ def system_mac_address_table(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "mac-address-table", data=filtered_data, vdom=vdom)
+ return fos.set("system", "mac-address-table", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_management_tunnel.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_management_tunnel.py
index 4be0173f5..ccaccda4e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_management_tunnel.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_management_tunnel.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -258,11 +258,10 @@ def underscore_to_hyphen(data):
def system_management_tunnel(data, fos):
vdom = data["vdom"]
system_management_tunnel_data = data["system_management_tunnel"]
- filtered_data = underscore_to_hyphen(
- filter_system_management_tunnel_data(system_management_tunnel_data)
- )
+ filtered_data = filter_system_management_tunnel_data(system_management_tunnel_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "management-tunnel", data=filtered_data, vdom=vdom)
+ return fos.set("system", "management-tunnel", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mem_mgr.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mem_mgr.py
index 9a7ca1724..b0e904424 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mem_mgr.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mem_mgr.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -202,11 +202,10 @@ def underscore_to_hyphen(data):
def system_mem_mgr(data, fos):
vdom = data["vdom"]
system_mem_mgr_data = data["system_mem_mgr"]
- filtered_data = underscore_to_hyphen(
- filter_system_mem_mgr_data(system_mem_mgr_data)
- )
+ filtered_data = filter_system_mem_mgr_data(system_mem_mgr_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "mem-mgr", data=filtered_data, vdom=vdom)
+ return fos.set("system", "mem-mgr", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mobile_tunnel.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mobile_tunnel.py
index c9427d43f..77fdba7bf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mobile_tunnel.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_mobile_tunnel.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -341,9 +341,8 @@ def system_mobile_tunnel(data, fos, check_mode=False):
state = data["state"]
system_mobile_tunnel_data = data["system_mobile_tunnel"]
- filtered_data = underscore_to_hyphen(
- filter_system_mobile_tunnel_data(system_mobile_tunnel_data)
- )
+ filtered_data = filter_system_mobile_tunnel_data(system_mobile_tunnel_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -407,7 +406,7 @@ def system_mobile_tunnel(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "mobile-tunnel", data=filtered_data, vdom=vdom)
+ return fos.set("system", "mobile-tunnel", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_modem.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_modem.py
index a2b3b6c88..4d67234e1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_modem.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_modem.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -588,9 +588,10 @@ def system_modem(data, fos):
vdom = data["vdom"]
system_modem_data = data["system_modem"]
system_modem_data = flatten_multilists_attributes(system_modem_data)
- filtered_data = underscore_to_hyphen(filter_system_modem_data(system_modem_data))
+ filtered_data = filter_system_modem_data(system_modem_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "modem", data=filtered_data, vdom=vdom)
+ return fos.set("system", "modem", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nat64.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nat64.py
index ce83f7469..d42390e4e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nat64.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nat64.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -269,9 +269,10 @@ def underscore_to_hyphen(data):
def system_nat64(data, fos):
vdom = data["vdom"]
system_nat64_data = data["system_nat64"]
- filtered_data = underscore_to_hyphen(filter_system_nat64_data(system_nat64_data))
+ filtered_data = filter_system_nat64_data(system_nat64_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "nat64", data=filtered_data, vdom=vdom)
+ return fos.set("system", "nat64", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nd_proxy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nd_proxy.py
index 2aa0107ed..2a7408443 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nd_proxy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_nd_proxy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -219,11 +219,10 @@ def underscore_to_hyphen(data):
def system_nd_proxy(data, fos):
vdom = data["vdom"]
system_nd_proxy_data = data["system_nd_proxy"]
- filtered_data = underscore_to_hyphen(
- filter_system_nd_proxy_data(system_nd_proxy_data)
- )
+ filtered_data = filter_system_nd_proxy_data(system_nd_proxy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "nd-proxy", data=filtered_data, vdom=vdom)
+ return fos.set("system", "nd-proxy", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_netflow.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_netflow.py
index 3b1ea6d5d..c24156dc5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_netflow.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_netflow.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -92,6 +92,41 @@ options:
description:
- NetFlow collector port number.
type: int
+ collectors:
+ description:
+ - Netflow collectors.
+ type: list
+ elements: dict
+ suboptions:
+ collector_ip:
+ description:
+ - Collector IP.
+ type: str
+ collector_port:
+ description:
+ - NetFlow collector port number.
+ type: int
+ id:
+ description:
+ - ID. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ interface:
+ description:
+ - Specify outgoing interface to reach server. Source system.interface.name.
+ type: str
+ interface_select_method:
+ description:
+ - Specify how to select outgoing interface to reach server.
+ type: str
+ choices:
+ - 'auto'
+ - 'sdwan'
+ - 'specify'
+ source_ip:
+ description:
+ - Source IP address for communication with the NetFlow agent.
+ type: str
inactive_flow_timeout:
description:
- Timeout for periodic report of finished flows (10 - 600 sec).
@@ -130,6 +165,14 @@ EXAMPLES = """
active_flow_timeout: "1800"
collector_ip: "<your_own_value>"
collector_port: "2055"
+ collectors:
+ -
+ collector_ip: "<your_own_value>"
+ collector_port: "2055"
+ id: "9"
+ interface: "<your_own_value> (source system.interface.name)"
+ interface_select_method: "auto"
+ source_ip: "84.230.14.43"
inactive_flow_timeout: "15"
interface: "<your_own_value> (source system.interface.name)"
interface_select_method: "auto"
@@ -222,6 +265,7 @@ def filter_system_netflow_data(json):
"active_flow_timeout",
"collector_ip",
"collector_port",
+ "collectors",
"inactive_flow_timeout",
"interface",
"interface_select_method",
@@ -256,11 +300,10 @@ def underscore_to_hyphen(data):
def system_netflow(data, fos):
vdom = data["vdom"]
system_netflow_data = data["system_netflow"]
- filtered_data = underscore_to_hyphen(
- filter_system_netflow_data(system_netflow_data)
- )
+ filtered_data = filter_system_netflow_data(system_netflow_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "netflow", data=filtered_data, vdom=vdom)
+ return fos.set("system", "netflow", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -295,19 +338,44 @@ versioned_schema = {
"v_range": [["v6.0.0", ""]],
"type": "dict",
"children": {
- "collector_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "collector_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "source_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
"active_flow_timeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"inactive_flow_timeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"template_tx_timeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"template_tx_counter": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "collectors": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "id": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ "required": True,
+ },
+ "collector_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "collector_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "source_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "interface_select_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "auto"},
+ {"value": "sdwan"},
+ {"value": "specify"},
+ ],
+ },
+ "interface": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "collector_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
+ "collector_port": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "integer"},
+ "source_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
"interface_select_method": {
- "v_range": [["v7.0.1", ""]],
+ "v_range": [["v7.0.1", "v7.4.1"]],
"type": "string",
"options": [{"value": "auto"}, {"value": "sdwan"}, {"value": "specify"}],
},
- "interface": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "interface": {"v_range": [["v7.0.1", "v7.4.1"]], "type": "string"},
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_network_visibility.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_network_visibility.py
index 338c2224c..bb395eb64 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_network_visibility.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_network_visibility.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,11 +246,12 @@ def underscore_to_hyphen(data):
def system_network_visibility(data, fos):
vdom = data["vdom"]
system_network_visibility_data = data["system_network_visibility"]
- filtered_data = underscore_to_hyphen(
- filter_system_network_visibility_data(system_network_visibility_data)
+ filtered_data = filter_system_network_visibility_data(
+ system_network_visibility_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "network-visibility", data=filtered_data, vdom=vdom)
+ return fos.set("system", "network-visibility", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_np6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_np6.py
index c6b435c5d..4ad316367 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_np6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_np6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -708,7 +708,8 @@ def system_np6(data, fos, check_mode=False):
state = data["state"]
system_np6_data = data["system_np6"]
- filtered_data = underscore_to_hyphen(filter_system_np6_data(system_np6_data))
+ filtered_data = filter_system_np6_data(system_np6_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -772,7 +773,7 @@ def system_np6(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "np6", data=filtered_data, vdom=vdom)
+ return fos.set("system", "np6", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "np6", mkey=filtered_data["name"], vdom=vdom)
@@ -813,19 +814,23 @@ versioned_schema = {
"type": "list",
"elements": "dict",
"children": {
- "name": {"v_range": [["v6.0.0", ""]], "type": "string", "required": True},
+ "name": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "string",
+ "required": True,
+ },
"fastpath": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
"low_latency_mode": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
"per_session_accounting": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "disable"},
@@ -834,54 +839,100 @@ versioned_schema = {
],
},
"garbage_session_collector": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
- "session_collector_interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "session_timeout_interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "session_collector_interval": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "session_timeout_interval": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
"session_timeout_random_range": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "integer",
},
"session_timeout_fixed": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
"hpe": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "dict",
"children": {
- "tcpsyn_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "tcpsyn_ack_max": {"v_range": [["v7.0.0", ""]], "type": "integer"},
- "tcpfin_rst_max": {"v_range": [["v7.0.0", ""]], "type": "integer"},
- "tcp_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "udp_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "icmp_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "sctp_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "esp_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "ip_frag_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "ip_others_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "arp_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "l2_others_max": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "tcpsyn_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "tcpsyn_ack_max": {
+ "v_range": [["v7.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "tcpfin_rst_max": {
+ "v_range": [["v7.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "tcp_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "udp_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "icmp_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "sctp_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "esp_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "ip_frag_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "ip_others_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "arp_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
+ "l2_others_max": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "integer",
+ },
"pri_type_max": {
- "v_range": [["v6.0.0", "v6.0.0"], ["v6.0.11", ""]],
+ "v_range": [
+ ["v6.0.0", "v6.0.0"],
+ ["v6.0.11", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
"enable_shaper": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
},
},
"fp_anomaly": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"tcp_syn_fin": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -890,7 +941,7 @@ versioned_schema = {
],
},
"tcp_fin_noack": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -899,7 +950,7 @@ versioned_schema = {
],
},
"tcp_fin_only": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -908,7 +959,7 @@ versioned_schema = {
],
},
"tcp_no_flag": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -917,7 +968,7 @@ versioned_schema = {
],
},
"tcp_syn_data": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -926,7 +977,7 @@ versioned_schema = {
],
},
"tcp_winnuke": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -935,7 +986,7 @@ versioned_schema = {
],
},
"tcp_land": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -944,7 +995,7 @@ versioned_schema = {
],
},
"udp_land": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -953,7 +1004,7 @@ versioned_schema = {
],
},
"icmp_land": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -962,7 +1013,7 @@ versioned_schema = {
],
},
"icmp_frag": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -971,7 +1022,7 @@ versioned_schema = {
],
},
"ipv4_land": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -980,7 +1031,7 @@ versioned_schema = {
],
},
"ipv4_proto_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -989,7 +1040,7 @@ versioned_schema = {
],
},
"ipv4_unknopt": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -998,7 +1049,7 @@ versioned_schema = {
],
},
"ipv4_optrr": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1007,7 +1058,7 @@ versioned_schema = {
],
},
"ipv4_optssrr": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1016,7 +1067,7 @@ versioned_schema = {
],
},
"ipv4_optlsrr": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1025,7 +1076,7 @@ versioned_schema = {
],
},
"ipv4_optstream": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1034,7 +1085,7 @@ versioned_schema = {
],
},
"ipv4_optsecurity": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1043,7 +1094,7 @@ versioned_schema = {
],
},
"ipv4_opttimestamp": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1052,27 +1103,27 @@ versioned_schema = {
],
},
"ipv4_csum_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "drop"}, {"value": "trap-to-host"}],
},
"tcp_csum_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "drop"}, {"value": "trap-to-host"}],
},
"udp_csum_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "drop"}, {"value": "trap-to-host"}],
},
"icmp_csum_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "drop"}, {"value": "trap-to-host"}],
},
"ipv6_land": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1081,7 +1132,7 @@ versioned_schema = {
],
},
"ipv6_proto_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1090,7 +1141,7 @@ versioned_schema = {
],
},
"ipv6_unknopt": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1099,7 +1150,7 @@ versioned_schema = {
],
},
"ipv6_saddr_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1108,7 +1159,7 @@ versioned_schema = {
],
},
"ipv6_daddr_err": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1117,7 +1168,7 @@ versioned_schema = {
],
},
"ipv6_optralert": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1126,7 +1177,7 @@ versioned_schema = {
],
},
"ipv6_optjumbo": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1135,7 +1186,7 @@ versioned_schema = {
],
},
"ipv6_opttunnel": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1144,7 +1195,7 @@ versioned_schema = {
],
},
"ipv6_opthomeaddr": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1153,7 +1204,7 @@ versioned_schema = {
],
},
"ipv6_optnsap": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1162,7 +1213,7 @@ versioned_schema = {
],
},
"ipv6_optendpid": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1171,7 +1222,7 @@ versioned_schema = {
],
},
"ipv6_optinvld": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "allow"},
@@ -1200,7 +1251,7 @@ versioned_schema = {
"options": [{"value": "global-hash"}, {"value": "round-robin-global"}],
},
},
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu.py
index f63ed6a29..e00da6cf8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -98,6 +98,163 @@ options:
choices:
- 'enable'
- 'disable'
+ default_qos_type:
+ description:
+ - Set default QoS type.
+ type: str
+ choices:
+ - 'policing'
+ - 'shaping'
+ - 'policing-enhanced'
+ dos_options:
+ description:
+ - NPU DoS configurations.
+ type: dict
+ suboptions:
+ npu_dos_meter_mode:
+ description:
+ - Set DoS meter NPU offloading mode.
+ type: str
+ choices:
+ - 'global'
+ - 'local'
+ npu_dos_tpe_mode:
+ description:
+ - Enable/disable insertion of DoS meter ID to session table.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ double_level_mcast_offload:
+ description:
+ - Enable double level mcast offload.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ dsw_dts_profile:
+ description:
+ - Configure NPU DSW DTS profile.
+ type: list
+ elements: dict
+ suboptions:
+ action:
+ description:
+ - Set NPU DSW DTS profile action.
+ type: str
+ choices:
+ - 'wait'
+ - 'drop'
+ - 'drop_tmr_0'
+ - 'drop_tmr_1'
+ - 'enque'
+ - 'enque_0'
+ - 'enque_1'
+ min_limit:
+ description:
+ - Set NPU DSW DTS profile min-limt.
+ type: int
+ profile_id:
+ description:
+ - Set NPU DSW DTS profile profile id. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ step:
+ description:
+ - Set NPU DSW DTS profile step.
+ type: int
+ dsw_queue_dts_profile:
+ description:
+ - Configure NPU DSW Queue DTS profile.
+ type: list
+ elements: dict
+ suboptions:
+ iport:
+ description:
+ - Set NPU DSW DTS in port.
+ type: str
+ choices:
+ - 'eif0'
+ - 'eif1'
+ - 'eif2'
+ - 'eif3'
+ - 'eif4'
+ - 'eif5'
+ - 'eif6'
+ - 'eif7'
+ - 'htx0'
+ - 'htx1'
+ - 'sse0'
+ - 'sse1'
+ - 'sse2'
+ - 'sse3'
+ - 'rlt'
+ - 'dfr'
+ - 'ipseci'
+ - 'ipseco'
+ - 'ipti'
+ - 'ipto'
+ - 'vep0'
+ - 'vep2'
+ - 'vep4'
+ - 'vep6'
+ - 'ivs'
+ - 'l2ti1'
+ - 'l2to'
+ - 'l2ti0'
+ - 'ple'
+ - 'spath'
+ - 'qtm'
+ name:
+ description:
+ - Name.
+ required: true
+ type: str
+ oport:
+ description:
+ - Set NPU DSW DTS out port.
+ type: str
+ choices:
+ - 'eif0'
+ - 'eif1'
+ - 'eif2'
+ - 'eif3'
+ - 'eif4'
+ - 'eif5'
+ - 'eif6'
+ - 'eif7'
+ - 'hrx'
+ - 'sse0'
+ - 'sse1'
+ - 'sse2'
+ - 'sse3'
+ - 'rlt'
+ - 'dfr'
+ - 'ipseci'
+ - 'ipseco'
+ - 'ipti'
+ - 'ipto'
+ - 'vep0'
+ - 'vep2'
+ - 'vep4'
+ - 'vep6'
+ - 'ivs'
+ - 'l2ti1'
+ - 'l2to'
+ - 'l2ti0'
+ - 'ple'
+ - 'sync'
+ - 'nss'
+ - 'tsk'
+ - 'qtm'
+ profile_id:
+ description:
+ - Set NPU DSW DTS profile ID.
+ type: int
+ queue_select:
+ description:
+ - Set NPU DSW DTS queue ID select (0 - reset to default).
+ type: int
fastpath:
description:
- Enable/disable NP6 offloading (also called fast path).
@@ -105,6 +262,287 @@ options:
choices:
- 'disable'
- 'enable'
+ fp_anomaly:
+ description:
+ - IPv4/IPv6 anomaly protection.
+ type: dict
+ suboptions:
+ icmp_csum_err:
+ description:
+ - Invalid IPv4 ICMP checksum anomalies.
+ type: str
+ choices:
+ - 'drop'
+ - 'trap-to-host'
+ icmp_frag:
+ description:
+ - Layer 3 fragmented packets that could be part of layer 4 ICMP anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ icmp_land:
+ description:
+ - ICMP land anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_csum_err:
+ description:
+ - Invalid IPv4 IP checksum anomalies.
+ type: str
+ choices:
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_land:
+ description:
+ - Land anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_optlsrr:
+ description:
+ - Loose source record route option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_optrr:
+ description:
+ - Record route option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_optsecurity:
+ description:
+ - Security option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_optssrr:
+ description:
+ - Strict source record route option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_optstream:
+ description:
+ - Stream option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_opttimestamp:
+ description:
+ - Timestamp option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_proto_err:
+ description:
+ - Invalid layer 4 protocol anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv4_unknopt:
+ description:
+ - Unknown option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_daddr_err:
+ description:
+ - Destination address as unspecified or loopback address anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_land:
+ description:
+ - Land anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_optendpid:
+ description:
+ - End point identification anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_opthomeaddr:
+ description:
+ - Home address option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_optinvld:
+ description:
+ - Invalid option anomalies.Invalid option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_optjumbo:
+ description:
+ - Jumbo options anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_optnsap:
+ description:
+ - Network service access point address option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_optralert:
+ description:
+ - Router alert option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_opttunnel:
+ description:
+ - Tunnel encapsulation limit option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_proto_err:
+ description:
+ - Layer 4 invalid protocol anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_saddr_err:
+ description:
+ - Source address as multicast anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ ipv6_unknopt:
+ description:
+ - Unknown option anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ tcp_csum_err:
+ description:
+ - Invalid IPv4 TCP checksum anomalies.
+ type: str
+ choices:
+ - 'drop'
+ - 'trap-to-host'
+ tcp_fin_noack:
+ description:
+ - TCP SYN flood with FIN flag set without ACK setting anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ tcp_fin_only:
+ description:
+ - TCP SYN flood with only FIN flag set anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ tcp_land:
+ description:
+ - TCP land anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ tcp_no_flag:
+ description:
+ - TCP SYN flood with no flag set anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ tcp_syn_data:
+ description:
+ - TCP SYN flood packets with data anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ tcp_syn_fin:
+ description:
+ - TCP SYN flood SYN/FIN flag set anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ tcp_winnuke:
+ description:
+ - TCP WinNuke anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
+ udp_csum_err:
+ description:
+ - Invalid IPv4 UDP checksum anomalies.
+ type: str
+ choices:
+ - 'drop'
+ - 'trap-to-host'
+ udp_land:
+ description:
+ - UDP land anomalies.
+ type: str
+ choices:
+ - 'allow'
+ - 'drop'
+ - 'trap-to-host'
gtp_enhanced_cpu_range:
description:
- GTP enhanced CPU range option.
@@ -120,6 +558,118 @@ options:
choices:
- 'enable'
- 'disable'
+ gtp_support:
+ description:
+ - Enable/Disable NP7 GTP support
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ hash_tbl_spread:
+ description:
+ - Enable/disable hash table entry spread .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ hpe:
+ description:
+ - Host protection engine configuration.
+ type: dict
+ suboptions:
+ all_protocol:
+ description:
+ - Maximum packet rate of each host queue except high priority traffic(1K - 32M pps), set 0 to disable.
+ type: int
+ arp_max:
+ description:
+ - Maximum ARP packet rate (1K - 32M pps). Entry is valid when ARP is removed from high-priority traffic.
+ type: int
+ enable_shaper:
+ description:
+ - Enable/Disable NPU Host Protection Engine (HPE) for packet type shaper.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+ esp_max:
+ description:
+ - Maximum ESP packet rate (1K - 32M pps).
+ type: int
+ high_priority:
+ description:
+ - Maximum packet rate for high priority traffic packets (1K - 32M pps).
+ type: int
+ icmp_max:
+ description:
+ - Maximum ICMP packet rate (1K - 32M pps).
+ type: int
+ ip_frag_max:
+ description:
+ - Maximum fragmented IP packet rate (1K - 32M pps).
+ type: int
+ ip_others_max:
+ description:
+ - Maximum IP packet rate for other packets (packet types that cannot be set with other options) (1K - 32G pps).
+ type: int
+ l2_others_max:
+ description:
+ - Maximum L2 packet rate for L2 packets that are not ARP packets (1K - 32M pps).
+ type: int
+ sctp_max:
+ description:
+ - Maximum SCTP packet rate (1K - 32M pps).
+ type: int
+ tcp_max:
+ description:
+ - Maximum TCP packet rate (1K - 32M pps).
+ type: int
+ tcpfin_rst_max:
+ description:
+ - Maximum TCP carries FIN or RST flags packet rate (1K - 32M pps).
+ type: int
+ tcpsyn_ack_max:
+ description:
+ - Maximum TCP carries SYN and ACK flags packet rate (1K - 32M pps).
+ type: int
+ tcpsyn_max:
+ description:
+ - Maximum TCP SYN packet rate (1K - 40M pps).
+ type: int
+ udp_max:
+ description:
+ - Maximum UDP packet rate (1K - 32M pps).
+ type: int
+ htab_dedi_queue_nr:
+ description:
+ - Set the number of dedicate queue for hash table messages.
+ type: int
+ htab_msg_queue:
+ description:
+ - Set hash table message queue mode.
+ type: str
+ choices:
+ - 'data'
+ - 'idle'
+ - 'dedicated'
+ htx_icmp_csum_chk:
+ description:
+ - Set HTX icmp csum checking mode.
+ type: str
+ choices:
+ - 'drop'
+ - 'pass'
+ inbound_dscp_copy_port:
+ description:
+ - Physical interfaces that support inbound-dscp-copy.
+ type: list
+ elements: dict
+ suboptions:
+ interface:
+ description:
+ - Physical interface name.
+ required: true
+ type: str
intf_shaping_offload:
description:
- Enable/disable NPU offload when doing interface-based traffic shaping according to the egress-shaping-profile.
@@ -127,6 +677,33 @@ options:
choices:
- 'enable'
- 'disable'
+ ip_fragment_offload:
+ description:
+ - Enable/disable NP7 NPU IP fragment offload.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+ ip_reassembly:
+ description:
+ - IP reassebmly engine configuration.
+ type: dict
+ suboptions:
+ max_timeout:
+ description:
+ - Maximum timeout value for IP reassembly (5 us - 600,000,000 us).
+ type: int
+ min_timeout:
+ description:
+ - Minimum timeout value for IP reassembly (5 us - 600,000,000 us).
+ type: int
+ status:
+ description:
+ - Set IP reassembly processing status.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
ipsec_dec_subengine_mask:
description:
- IPsec decryption subengine mask (0x1 - 0xff).
@@ -149,6 +726,14 @@ options:
choices:
- 'disable'
- 'enable'
+ ipsec_ob_np_sel:
+ description:
+ - IPsec NP selection for OB SA offloading.
+ type: str
+ choices:
+ - 'rr'
+ - 'Packet'
+ - 'Hash'
ipsec_over_vlink:
description:
- Enable/disable IPsec over vlink.
@@ -200,6 +785,14 @@ options:
choices:
- 'disable'
- 'enable'
+ max_receive_unit:
+ description:
+ - Set the maximum packet size for receive, larger packets will be silently dropped.
+ type: int
+ max_session_timeout:
+ description:
+ - Maximum time interval for refreshing NPU-offloaded sessions (10 - 1000 sec).
+ type: int
mcast_session_accounting:
description:
- Enable/disable traffic accounting for each multicast session through TAE counter.
@@ -208,6 +801,2224 @@ options:
- 'tpe-based'
- 'session-based'
- 'disable'
+ napi_break_interval:
+ description:
+ - NAPI break interval .
+ type: int
+ np_queues:
+ description:
+ - Configure queue assignment on NP7.
+ type: dict
+ suboptions:
+ ethernet_type:
+ description:
+ - Configure a NP7 QoS Ethernet Type.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Ethernet Type Name.
+ required: true
+ type: str
+ queue:
+ description:
+ - Queue Number.
+ type: int
+ type:
+ description:
+ - Ethernet Type.
+ type: str
+ weight:
+ description:
+ - Class Weight.
+ type: int
+ ip_protocol:
+ description:
+ - Configure a NP7 QoS IP Protocol.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - IP Protocol Name.
+ required: true
+ type: str
+ protocol:
+ description:
+ - IP Protocol.
+ type: int
+ queue:
+ description:
+ - Queue Number.
+ type: int
+ weight:
+ description:
+ - Class Weight.
+ type: int
+ ip_service:
+ description:
+ - Configure a NP7 QoS IP Service.
+ type: list
+ elements: dict
+ suboptions:
+ dport:
+ description:
+ - Destination port.
+ type: int
+ name:
+ description:
+ - IP service name.
+ required: true
+ type: str
+ protocol:
+ description:
+ - IP protocol.
+ type: int
+ queue:
+ description:
+ - Queue number.
+ type: int
+ sport:
+ description:
+ - Source port.
+ type: int
+ weight:
+ description:
+ - Class weight.
+ type: int
+ profile:
+ description:
+ - Configure a NP7 class profile.
+ type: list
+ elements: dict
+ suboptions:
+ cos0:
+ description:
+ - Queue number of CoS 0.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ cos1:
+ description:
+ - Queue number of CoS 1.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ cos2:
+ description:
+ - Queue number of CoS 2.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ cos3:
+ description:
+ - Queue number of CoS 3.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ cos4:
+ description:
+ - Queue number of CoS 4.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ cos5:
+ description:
+ - Queue number of CoS 5.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ cos6:
+ description:
+ - Queue number of CoS 6.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ cos7:
+ description:
+ - Queue number of CoS 7.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp0:
+ description:
+ - Queue number of DSCP 0.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp1:
+ description:
+ - Queue number of DSCP 1.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp10:
+ description:
+ - Queue number of DSCP 10.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp11:
+ description:
+ - Queue number of DSCP 11.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp12:
+ description:
+ - Queue number of DSCP 12.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp13:
+ description:
+ - Queue number of DSCP 13.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp14:
+ description:
+ - Queue number of DSCP 14.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp15:
+ description:
+ - Queue number of DSCP 15.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp16:
+ description:
+ - Queue number of DSCP 16.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp17:
+ description:
+ - Queue number of DSCP 17.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp18:
+ description:
+ - Queue number of DSCP 18.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp19:
+ description:
+ - Queue number of DSCP 19.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp2:
+ description:
+ - Queue number of DSCP 2.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp20:
+ description:
+ - Queue number of DSCP 20.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp21:
+ description:
+ - Queue number of DSCP 21.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp22:
+ description:
+ - Queue number of DSCP 22.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp23:
+ description:
+ - Queue number of DSCP 23.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp24:
+ description:
+ - Queue number of DSCP 24.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp25:
+ description:
+ - Queue number of DSCP 25.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp26:
+ description:
+ - Queue number of DSCP 26.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp27:
+ description:
+ - Queue number of DSCP 27.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp28:
+ description:
+ - Queue number of DSCP 28.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp29:
+ description:
+ - Queue number of DSCP 29.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp3:
+ description:
+ - Queue number of DSCP 3.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp30:
+ description:
+ - Queue number of DSCP 30.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp31:
+ description:
+ - Queue number of DSCP 31.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp32:
+ description:
+ - Queue number of DSCP 32.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp33:
+ description:
+ - Queue number of DSCP 33.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp34:
+ description:
+ - Queue number of DSCP 34.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp35:
+ description:
+ - Queue number of DSCP 35.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp36:
+ description:
+ - Queue number of DSCP 36.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp37:
+ description:
+ - Queue number of DSCP 37.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp38:
+ description:
+ - Queue number of DSCP 38.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp39:
+ description:
+ - Queue number of DSCP 39.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp4:
+ description:
+ - Queue number of DSCP 4.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp40:
+ description:
+ - Queue number of DSCP 40.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp41:
+ description:
+ - Queue number of DSCP 41.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp42:
+ description:
+ - Queue number of DSCP 42.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp43:
+ description:
+ - Queue number of DSCP 43.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp44:
+ description:
+ - Queue number of DSCP 44.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp45:
+ description:
+ - Queue number of DSCP 45.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp46:
+ description:
+ - Queue number of DSCP 46.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp47:
+ description:
+ - Queue number of DSCP 47.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp48:
+ description:
+ - Queue number of DSCP 48.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp49:
+ description:
+ - Queue number of DSCP 49.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp5:
+ description:
+ - Queue number of DSCP 5.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp50:
+ description:
+ - Queue number of DSCP 50.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp51:
+ description:
+ - Queue number of DSCP 51.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp52:
+ description:
+ - Queue number of DSCP 52.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp53:
+ description:
+ - Queue number of DSCP 53.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp54:
+ description:
+ - Queue number of DSCP 54.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp55:
+ description:
+ - Queue number of DSCP 55.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp56:
+ description:
+ - Queue number of DSCP 56.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp57:
+ description:
+ - Queue number of DSCP 57.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp58:
+ description:
+ - Queue number of DSCP 58.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp59:
+ description:
+ - Queue number of DSCP 59.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp6:
+ description:
+ - Queue number of DSCP 6.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp60:
+ description:
+ - Queue number of DSCP 60.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp61:
+ description:
+ - Queue number of DSCP 61.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp62:
+ description:
+ - Queue number of DSCP 62.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp63:
+ description:
+ - Queue number of DSCP 63.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp7:
+ description:
+ - Queue number of DSCP 7.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp8:
+ description:
+ - Queue number of DSCP 8.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ dscp9:
+ description:
+ - Queue number of DSCP 9.
+ type: str
+ choices:
+ - 'queue0'
+ - 'queue1'
+ - 'queue2'
+ - 'queue3'
+ - 'queue4'
+ - 'queue5'
+ - 'queue6'
+ - 'queue7'
+ id:
+ description:
+ - Profile ID. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ type:
+ description:
+ - Profile type.
+ type: str
+ choices:
+ - 'cos'
+ - 'dscp'
+ weight:
+ description:
+ - Class weight.
+ type: int
+ scheduler:
+ description:
+ - Configure a NP7 QoS Scheduler.
+ type: list
+ elements: dict
+ suboptions:
+ mode:
+ description:
+ - Scheduler mode.
+ type: str
+ choices:
+ - 'none'
+ - 'priority'
+ - 'round-robin'
+ name:
+ description:
+ - Scheduler name.
+ required: true
+ type: str
+ npu_group_effective_scope:
+ description:
+ - npu-group-effective-scope defines under which npu-group cmds such as list/purge will be excecuted. Default scope is for all four HS-ok
+ groups. (0-3).
+ type: int
+ npu_tcam:
+ description:
+ - Configure NPU TCAM policies.
+ type: list
+ elements: dict
+ suboptions:
+ data:
+ description:
+ - Data fields of TCAM.
+ type: dict
+ suboptions:
+ df:
+ description:
+ - tcam data ip flag df.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ dstip:
+ description:
+ - tcam data dst ipv4 address.
+ type: str
+ dstipv6:
+ description:
+ - tcam data dst ipv6 address.
+ type: str
+ dstmac:
+ description:
+ - tcam data dst macaddr.
+ type: str
+ dstport:
+ description:
+ - tcam data L4 dst port.
+ type: int
+ ethertype:
+ description:
+ - tcam data ethertype.
+ type: str
+ ext_tag:
+ description:
+ - tcam data extension tag.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ frag_off:
+ description:
+ - tcam data ip flag fragment offset.
+ type: int
+ gen_buf_cnt:
+ description:
+ - tcam data gen info buffer count.
+ type: int
+ gen_iv:
+ description:
+ - tcam data gen info iv.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ gen_l3_flags:
+ description:
+ - tcam data gen info L3 flags.
+ type: int
+ gen_l4_flags:
+ description:
+ - tcam data gen info L4 flags.
+ type: int
+ gen_pkt_ctrl:
+ description:
+ - tcam data gen info packet control.
+ type: int
+ gen_pri:
+ description:
+ - tcam data gen info priority.
+ type: int
+ gen_pri_v:
+ description:
+ - tcam data gen info priority valid.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ gen_tv:
+ description:
+ - tcam data gen info tv.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ ihl:
+ description:
+ - tcam data ipv4 IHL.
+ type: int
+ ip4_id:
+ description:
+ - tcam data ipv4 id.
+ type: int
+ ip6_fl:
+ description:
+ - tcam data ipv6 flow label.
+ type: int
+ ipver:
+ description:
+ - tcam data ip header version.
+ type: int
+ l4_wd10:
+ description:
+ - tcam data L4 word10.
+ type: int
+ l4_wd11:
+ description:
+ - tcam data L4 word11.
+ type: int
+ l4_wd8:
+ description:
+ - tcam data L4 word8.
+ type: int
+ l4_wd9:
+ description:
+ - tcam data L4 word9.
+ type: int
+ mf:
+ description:
+ - tcam data ip flag mf.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ protocol:
+ description:
+ - tcam data ip protocol.
+ type: int
+ slink:
+ description:
+ - tcam data sublink.
+ type: int
+ smac_change:
+ description:
+ - tcam data source MAC change.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ sp:
+ description:
+ - tcam data source port.
+ type: int
+ src_cfi:
+ description:
+ - tcam data source cfi.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ src_prio:
+ description:
+ - tcam data source priority.
+ type: int
+ src_updt:
+ description:
+ - tcam data source update.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ srcip:
+ description:
+ - tcam data src ipv4 address.
+ type: str
+ srcipv6:
+ description:
+ - tcam data src ipv6 address.
+ type: str
+ srcmac:
+ description:
+ - tcam data src macaddr.
+ type: str
+ srcport:
+ description:
+ - tcam data L4 src port.
+ type: int
+ svid:
+ description:
+ - tcam data source vid.
+ type: int
+ tcp_ack:
+ description:
+ - tcam data tcp flag ack.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_cwr:
+ description:
+ - tcam data tcp flag cwr.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_ece:
+ description:
+ - tcam data tcp flag ece.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_fin:
+ description:
+ - tcam data tcp flag fin.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_push:
+ description:
+ - tcam data tcp flag push.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_rst:
+ description:
+ - tcam data tcp flag rst.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_syn:
+ description:
+ - tcam data tcp flag syn.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_urg:
+ description:
+ - tcam data tcp flag urg.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tgt_cfi:
+ description:
+ - tcam data target cfi.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tgt_prio:
+ description:
+ - tcam data target priority.
+ type: int
+ tgt_updt:
+ description:
+ - tcam data target port update.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tgt_v:
+ description:
+ - tcam data target valid.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ tos:
+ description:
+ - tcam data ip tos.
+ type: int
+ tp:
+ description:
+ - tcam data target port.
+ type: int
+ ttl:
+ description:
+ - tcam data ip ttl.
+ type: int
+ tvid:
+ description:
+ - tcam data target vid.
+ type: int
+ vdid:
+ description:
+ - tcam data vdom id.
+ type: int
+ mask:
+ description:
+ - Mask fields of TCAM.
+ type: dict
+ suboptions:
+ df:
+ description:
+ - tcam mask ip flag df.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ dstip:
+ description:
+ - tcam mask dst ipv4 address.
+ type: str
+ dstipv6:
+ description:
+ - tcam mask dst ipv6 address.
+ type: str
+ dstmac:
+ description:
+ - tcam mask dst macaddr.
+ type: str
+ dstport:
+ description:
+ - tcam mask L4 dst port.
+ type: int
+ ethertype:
+ description:
+ - tcam mask ethertype.
+ type: str
+ ext_tag:
+ description:
+ - tcam mask extension tag.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ frag_off:
+ description:
+ - tcam data ip flag fragment offset.
+ type: int
+ gen_buf_cnt:
+ description:
+ - tcam mask gen info buffer count.
+ type: int
+ gen_iv:
+ description:
+ - tcam mask gen info iv.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ gen_l3_flags:
+ description:
+ - tcam mask gen info L3 flags.
+ type: int
+ gen_l4_flags:
+ description:
+ - tcam mask gen info L4 flags.
+ type: int
+ gen_pkt_ctrl:
+ description:
+ - tcam mask gen info packet control.
+ type: int
+ gen_pri:
+ description:
+ - tcam mask gen info priority.
+ type: int
+ gen_pri_v:
+ description:
+ - tcam mask gen info priority valid.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ gen_tv:
+ description:
+ - tcam mask gen info tv.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ ihl:
+ description:
+ - tcam mask ipv4 IHL.
+ type: int
+ ip4_id:
+ description:
+ - tcam mask ipv4 id.
+ type: int
+ ip6_fl:
+ description:
+ - tcam mask ipv6 flow label.
+ type: int
+ ipver:
+ description:
+ - tcam mask ip header version.
+ type: int
+ l4_wd10:
+ description:
+ - tcam mask L4 word10.
+ type: int
+ l4_wd11:
+ description:
+ - tcam mask L4 word11.
+ type: int
+ l4_wd8:
+ description:
+ - tcam mask L4 word8.
+ type: int
+ l4_wd9:
+ description:
+ - tcam mask L4 word9.
+ type: int
+ mf:
+ description:
+ - tcam mask ip flag mf.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ protocol:
+ description:
+ - tcam mask ip protocol.
+ type: int
+ slink:
+ description:
+ - tcam mask sublink.
+ type: int
+ smac_change:
+ description:
+ - tcam mask source MAC change.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ sp:
+ description:
+ - tcam mask source port.
+ type: int
+ src_cfi:
+ description:
+ - tcam mask source cfi.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ src_prio:
+ description:
+ - tcam mask source priority.
+ type: int
+ src_updt:
+ description:
+ - tcam mask source update.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ srcip:
+ description:
+ - tcam mask src ipv4 address.
+ type: str
+ srcipv6:
+ description:
+ - tcam mask src ipv6 address.
+ type: str
+ srcmac:
+ description:
+ - tcam mask src macaddr.
+ type: str
+ srcport:
+ description:
+ - tcam mask L4 src port.
+ type: int
+ svid:
+ description:
+ - tcam mask source vid.
+ type: int
+ tcp_ack:
+ description:
+ - tcam mask tcp flag ack.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_cwr:
+ description:
+ - tcam mask tcp flag cwr.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_ece:
+ description:
+ - tcam mask tcp flag ece.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_fin:
+ description:
+ - tcam mask tcp flag fin.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_push:
+ description:
+ - tcam mask tcp flag push.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_rst:
+ description:
+ - tcam mask tcp flag rst.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_syn:
+ description:
+ - tcam mask tcp flag syn.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tcp_urg:
+ description:
+ - tcam mask tcp flag urg.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tgt_cfi:
+ description:
+ - tcam mask target cfi.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tgt_prio:
+ description:
+ - tcam mask target priority.
+ type: int
+ tgt_updt:
+ description:
+ - tcam mask target port update.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tgt_v:
+ description:
+ - tcam mask target valid.
+ type: str
+ choices:
+ - 'valid'
+ - 'invalid'
+ tos:
+ description:
+ - tcam mask ip tos.
+ type: int
+ tp:
+ description:
+ - tcam mask target port.
+ type: int
+ ttl:
+ description:
+ - tcam mask ip ttl.
+ type: int
+ tvid:
+ description:
+ - tcam mask target vid.
+ type: int
+ vdid:
+ description:
+ - tcam mask vdom id.
+ type: int
+ mir_act:
+ description:
+ - Mirror action of TCAM.
+ type: dict
+ suboptions:
+ vlif:
+ description:
+ - tcam mirror action vlif.
+ type: int
+ name:
+ description:
+ - NPU TCAM policies name.
+ required: true
+ type: str
+ oid:
+ description:
+ - NPU TCAM OID.
+ type: int
+ pri_act:
+ description:
+ - Priority action of TCAM.
+ type: dict
+ suboptions:
+ priority:
+ description:
+ - tcam priority action priority.
+ type: int
+ weight:
+ description:
+ - tcam priority action weight.
+ type: int
+ sact:
+ description:
+ - Source action of TCAM.
+ type: dict
+ suboptions:
+ act:
+ description:
+ - tcam sact act.
+ type: int
+ act_v:
+ description:
+ - Enable to set sact act.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ bmproc:
+ description:
+ - tcam sact bmproc.
+ type: int
+ bmproc_v:
+ description:
+ - Enable to set sact bmproc.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ df_lif:
+ description:
+ - tcam sact df-lif.
+ type: int
+ df_lif_v:
+ description:
+ - Enable to set sact df-lif.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ dfr:
+ description:
+ - tcam sact dfr.
+ type: int
+ dfr_v:
+ description:
+ - Enable to set sact dfr.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ dmac_skip:
+ description:
+ - tcam sact dmac-skip.
+ type: int
+ dmac_skip_v:
+ description:
+ - Enable to set sact dmac-skip.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ dosen:
+ description:
+ - tcam sact dosen.
+ type: int
+ dosen_v:
+ description:
+ - Enable to set sact dosen.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ espff_proc:
+ description:
+ - tcam sact espff-proc.
+ type: int
+ espff_proc_v:
+ description:
+ - Enable to set sact espff-proc.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ etype_pid:
+ description:
+ - tcam sact etype-pid.
+ type: int
+ etype_pid_v:
+ description:
+ - Enable to set sact etype-pid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ frag_proc:
+ description:
+ - tcam sact frag-proc.
+ type: int
+ frag_proc_v:
+ description:
+ - Enable to set sact frag-proc.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ fwd:
+ description:
+ - tcam sact fwd.
+ type: int
+ fwd_lif:
+ description:
+ - tcam sact fwd-lif.
+ type: int
+ fwd_lif_v:
+ description:
+ - Enable to set sact fwd-lif.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ fwd_tvid:
+ description:
+ - tcam sact fwd-tvid.
+ type: int
+ fwd_tvid_v:
+ description:
+ - Enable to set sact fwd-vid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ fwd_v:
+ description:
+ - Enable to set sact fwd.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ icpen:
+ description:
+ - tcam sact icpen.
+ type: int
+ icpen_v:
+ description:
+ - Enable to set sact icpen.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ igmp_mld_snp:
+ description:
+ - tcam sact igmp-mld-snp.
+ type: int
+ igmp_mld_snp_v:
+ description:
+ - Enable to set sact igmp-mld-snp.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ learn:
+ description:
+ - tcam sact learn.
+ type: int
+ learn_v:
+ description:
+ - Enable to set sact learn.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ m_srh_ctrl:
+ description:
+ - tcam sact m-srh-ctrl.
+ type: int
+ m_srh_ctrl_v:
+ description:
+ - Enable to set sact m-srh-ctrl.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ mac_id:
+ description:
+ - tcam sact mac-id.
+ type: int
+ mac_id_v:
+ description:
+ - Enable to set sact mac-id.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ mss:
+ description:
+ - tcam sact mss.
+ type: int
+ mss_v:
+ description:
+ - Enable to set sact mss.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ pleen:
+ description:
+ - tcam sact pleen.
+ type: int
+ pleen_v:
+ description:
+ - Enable to set sact pleen.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ prio_pid:
+ description:
+ - tcam sact prio-pid.
+ type: int
+ prio_pid_v:
+ description:
+ - Enable to set sact prio-pid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ promis:
+ description:
+ - tcam sact promis.
+ type: int
+ promis_v:
+ description:
+ - Enable to set sact promis.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ rfsh:
+ description:
+ - tcam sact rfsh.
+ type: int
+ rfsh_v:
+ description:
+ - Enable to set sact rfsh.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ smac_skip:
+ description:
+ - tcam sact smac-skip.
+ type: int
+ smac_skip_v:
+ description:
+ - Enable to set sact smac-skip.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tp_smchk:
+ description:
+ - tcam sact tp mode.
+ type: int
+ tp_smchk_v:
+ description:
+ - Enable to set sact tp mode.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tpe_id:
+ description:
+ - tcam sact tpe-id.
+ type: int
+ tpe_id_v:
+ description:
+ - Enable to set sact tpe-id.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ vdm:
+ description:
+ - tcam sact vdm.
+ type: int
+ vdm_v:
+ description:
+ - Enable to set sact vdm.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ vdom_id:
+ description:
+ - tcam sact vdom-id.
+ type: int
+ vdom_id_v:
+ description:
+ - Enable to set sact vdom-id.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ x_mode:
+ description:
+ - tcam sact x-mode.
+ type: int
+ x_mode_v:
+ description:
+ - Enable to set sact x-mode.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tact:
+ description:
+ - Target action of TCAM.
+ type: dict
+ suboptions:
+ act:
+ description:
+ - tcam tact act.
+ type: int
+ act_v:
+ description:
+ - Enable to set tact act.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ fmtuv4_s:
+ description:
+ - tcam tact fmtuv4-s.
+ type: int
+ fmtuv4_s_v:
+ description:
+ - Enable to set tact fmtuv4-s.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ fmtuv6_s:
+ description:
+ - tcam tact fmtuv6-s.
+ type: int
+ fmtuv6_s_v:
+ description:
+ - Enable to set tact fmtuv6-s.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ lnkid:
+ description:
+ - tcam tact lnkid.
+ type: int
+ lnkid_v:
+ description:
+ - Enable to set tact lnkid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ mac_id:
+ description:
+ - tcam tact mac-id.
+ type: int
+ mac_id_v:
+ description:
+ - Enable to set tact mac-id.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ mss_t:
+ description:
+ - tcam tact mss.
+ type: int
+ mss_t_v:
+ description:
+ - Enable to set tact mss.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ mtuv4:
+ description:
+ - tcam tact mtuv4.
+ type: int
+ mtuv4_v:
+ description:
+ - Enable to set tact mtuv4.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ mtuv6:
+ description:
+ - tcam tact mtuv6.
+ type: int
+ mtuv6_v:
+ description:
+ - Enable to set tact mtuv6.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ slif_act:
+ description:
+ - tcam tact slif-act.
+ type: int
+ slif_act_v:
+ description:
+ - Enable to set tact slif-act.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ sublnkid:
+ description:
+ - tcam tact sublnkid.
+ type: int
+ sublnkid_v:
+ description:
+ - Enable to set tact sublnkid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tgtv_act:
+ description:
+ - tcam tact tgtv-act.
+ type: int
+ tgtv_act_v:
+ description:
+ - Enable to set tact tgtv-act.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tlif_act:
+ description:
+ - tcam tact tlif-act.
+ type: int
+ tlif_act_v:
+ description:
+ - Enable to set tact tlif-act.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ tpeid:
+ description:
+ - tcam tact tpeid.
+ type: int
+ tpeid_v:
+ description:
+ - Enable to set tact tpeid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ v6fe:
+ description:
+ - tcam tact v6fe.
+ type: int
+ v6fe_v:
+ description:
+ - Enable to set tact v6fe.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ vep_en:
+ description:
+ - tcam tact vep_en.
+ type: int
+ vep_en_v:
+ description:
+ - Enable to set tact vep-en.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ vep_slid:
+ description:
+ - tcam tact vep_slid.
+ type: int
+ vep_slid_v:
+ description:
+ - Enable to set tact vep-slid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ xlt_lif:
+ description:
+ - tcam tact xlt-lif.
+ type: int
+ xlt_lif_v:
+ description:
+ - Enable to set tact xlt-lif.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ xlt_vid:
+ description:
+ - tcam tact xlt-vid.
+ type: int
+ xlt_vid_v:
+ description:
+ - Enable to set tact xlt-vid.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ type:
+ description:
+ - TCAM policy type.
+ type: str
+ choices:
+ - 'L2_src_tc'
+ - 'L2_tgt_tc'
+ - 'L2_src_mir'
+ - 'L2_tgt_mir'
+ - 'L2_src_act'
+ - 'L2_tgt_act'
+ - 'IPv4_src_tc'
+ - 'IPv4_tgt_tc'
+ - 'IPv4_src_mir'
+ - 'IPv4_tgt_mir'
+ - 'IPv4_src_act'
+ - 'IPv4_tgt_act'
+ - 'IPv6_src_tc'
+ - 'IPv6_tgt_tc'
+ - 'IPv6_src_mir'
+ - 'IPv6_tgt_mir'
+ - 'IPv6_src_act'
+ - 'IPv6_tgt_act'
+ vid:
+ description:
+ - NPU TCAM VID.
+ type: int
+ per_session_accounting:
+ description:
+ - Set per-session accounting.
+ type: str
+ choices:
+ - 'traffic-log-only'
+ - 'disable'
+ - 'enable'
port_cpu_map:
description:
- Configure NPU interface to CPU core mapping.
@@ -238,6 +3049,22 @@ options:
description:
- Mapping NPU group index.
type: int
+ port_path_option:
+ description:
+ - Configure port using NPU or Intel-NIC.
+ type: dict
+ suboptions:
+ ports_using_npu:
+ description:
+ - Set ha/aux ports to handle traffic with NPU (otherwise traffic goes to Intel-NIC and then CPU).
+ type: list
+ elements: dict
+ suboptions:
+ interface_name:
+ description:
+ - Available interfaces for NPU path.
+ required: true
+ type: str
priority_protocol:
description:
- Configure NPU priority protocol.
@@ -272,6 +3099,13 @@ options:
- 'disable'
- 'priority'
- 'round-robin'
+ qtm_buf_mode:
+ description:
+ - QTM channel configuration for packet buffer.
+ type: str
+ choices:
+ - '6ch'
+ - '4ch'
rdp_offload:
description:
- Enable/disable RDP offload.
@@ -279,6 +3113,10 @@ options:
choices:
- 'enable'
- 'disable'
+ session_acct_interval:
+ description:
+ - Session accounting update interval (1 - 10 sec).
+ type: int
session_denied_offload:
description:
- Enable/disable offloading of denied sessions. Requires ses-denied-traffic to be set.
@@ -286,6 +3124,13 @@ options:
choices:
- 'disable'
- 'enable'
+ shaping_stats:
+ description:
+ - Enable/disable NP7 traffic shaping statistics .
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
sse_backpressure:
description:
- Enable/disable SSE backpressure.
@@ -413,6 +3258,20 @@ options:
choices:
- 'enable'
- 'disable'
+ ull_port_mode:
+ description:
+ - Set ULL port"s speed to 10G/25G .
+ type: str
+ choices:
+ - '10G'
+ - '25G'
+ vlan_lookup_cache:
+ description:
+ - Enable/disable vlan lookup cache .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
"""
EXAMPLES = """
@@ -423,14 +3282,98 @@ EXAMPLES = """
capwap_offload: "enable"
dedicated_management_affinity: "<your_own_value>"
dedicated_management_cpu: "enable"
+ default_qos_type: "policing"
+ dos_options:
+ npu_dos_meter_mode: "global"
+ npu_dos_tpe_mode: "enable"
+ double_level_mcast_offload: "enable"
+ dsw_dts_profile:
+ -
+ action: "wait"
+ min_limit: "0"
+ profile_id: "<you_own_value>"
+ step: "0"
+ dsw_queue_dts_profile:
+ -
+ iport: "eif0"
+ name: "default_name_18"
+ oport: "eif0"
+ profile_id: "0"
+ queue_select: "0"
fastpath: "disable"
+ fp_anomaly:
+ icmp_csum_err: "drop"
+ icmp_frag: "allow"
+ icmp_land: "allow"
+ ipv4_csum_err: "drop"
+ ipv4_land: "allow"
+ ipv4_optlsrr: "allow"
+ ipv4_optrr: "allow"
+ ipv4_optsecurity: "allow"
+ ipv4_optssrr: "allow"
+ ipv4_optstream: "allow"
+ ipv4_opttimestamp: "allow"
+ ipv4_proto_err: "allow"
+ ipv4_unknopt: "allow"
+ ipv6_daddr_err: "allow"
+ ipv6_land: "allow"
+ ipv6_optendpid: "allow"
+ ipv6_opthomeaddr: "allow"
+ ipv6_optinvld: "allow"
+ ipv6_optjumbo: "allow"
+ ipv6_optnsap: "allow"
+ ipv6_optralert: "allow"
+ ipv6_opttunnel: "allow"
+ ipv6_proto_err: "allow"
+ ipv6_saddr_err: "allow"
+ ipv6_unknopt: "allow"
+ tcp_csum_err: "drop"
+ tcp_fin_noack: "allow"
+ tcp_fin_only: "allow"
+ tcp_land: "allow"
+ tcp_no_flag: "allow"
+ tcp_syn_data: "allow"
+ tcp_syn_fin: "allow"
+ tcp_winnuke: "allow"
+ udp_csum_err: "drop"
+ udp_land: "allow"
gtp_enhanced_cpu_range: "0"
gtp_enhanced_mode: "enable"
+ gtp_support: "enable"
+ hash_tbl_spread: "enable"
+ hpe:
+ all_protocol: "400000"
+ arp_max: "5000"
+ enable_shaper: "disable"
+ esp_max: "5000"
+ high_priority: "400000"
+ icmp_max: "5000"
+ ip_frag_max: "5000"
+ ip_others_max: "5000"
+ l2_others_max: "5000"
+ sctp_max: "5000"
+ tcp_max: "40000"
+ tcpfin_rst_max: "40000"
+ tcpsyn_ack_max: "40000"
+ tcpsyn_max: "40000"
+ udp_max: "40000"
+ htab_dedi_queue_nr: "4"
+ htab_msg_queue: "data"
+ htx_icmp_csum_chk: "drop"
+ inbound_dscp_copy_port:
+ -
+ interface: "<your_own_value>"
intf_shaping_offload: "enable"
+ ip_fragment_offload: "disable"
+ ip_reassembly:
+ max_timeout: "200000"
+ min_timeout: "64"
+ status: "disable"
ipsec_dec_subengine_mask: "<your_own_value>"
ipsec_enc_subengine_mask: "<your_own_value>"
ipsec_inbound_cache: "enable"
ipsec_mtu_override: "disable"
+ ipsec_ob_np_sel: "rr"
ipsec_over_vlink: "enable"
isf_np_queues:
cos0: "<your_own_value> (source system.isf-queue-profile.name)"
@@ -442,7 +3385,329 @@ EXAMPLES = """
cos6: "<your_own_value> (source system.isf-queue-profile.name)"
cos7: "<your_own_value> (source system.isf-queue-profile.name)"
lag_out_port_select: "disable"
+ max_receive_unit: "0"
+ max_session_timeout: "40"
mcast_session_accounting: "tpe-based"
+ napi_break_interval: "0"
+ np_queues:
+ ethernet_type:
+ -
+ name: "default_name_112"
+ queue: "0"
+ type: "<your_own_value>"
+ weight: "15"
+ ip_protocol:
+ -
+ name: "default_name_117"
+ protocol: "0"
+ queue: "0"
+ weight: "14"
+ ip_service:
+ -
+ dport: "0"
+ name: "default_name_123"
+ protocol: "0"
+ queue: "0"
+ sport: "0"
+ weight: "13"
+ profile:
+ -
+ cos0: "queue0"
+ cos1: "queue0"
+ cos2: "queue0"
+ cos3: "queue0"
+ cos4: "queue0"
+ cos5: "queue0"
+ cos6: "queue0"
+ cos7: "queue0"
+ dscp0: "queue0"
+ dscp1: "queue0"
+ dscp10: "queue0"
+ dscp11: "queue0"
+ dscp12: "queue0"
+ dscp13: "queue0"
+ dscp14: "queue0"
+ dscp15: "queue0"
+ dscp16: "queue0"
+ dscp17: "queue0"
+ dscp18: "queue0"
+ dscp19: "queue0"
+ dscp2: "queue0"
+ dscp20: "queue0"
+ dscp21: "queue0"
+ dscp22: "queue0"
+ dscp23: "queue0"
+ dscp24: "queue0"
+ dscp25: "queue0"
+ dscp26: "queue0"
+ dscp27: "queue0"
+ dscp28: "queue0"
+ dscp29: "queue0"
+ dscp3: "queue0"
+ dscp30: "queue0"
+ dscp31: "queue0"
+ dscp32: "queue0"
+ dscp33: "queue0"
+ dscp34: "queue0"
+ dscp35: "queue0"
+ dscp36: "queue0"
+ dscp37: "queue0"
+ dscp38: "queue0"
+ dscp39: "queue0"
+ dscp4: "queue0"
+ dscp40: "queue0"
+ dscp41: "queue0"
+ dscp42: "queue0"
+ dscp43: "queue0"
+ dscp44: "queue0"
+ dscp45: "queue0"
+ dscp46: "queue0"
+ dscp47: "queue0"
+ dscp48: "queue0"
+ dscp49: "queue0"
+ dscp5: "queue0"
+ dscp50: "queue0"
+ dscp51: "queue0"
+ dscp52: "queue0"
+ dscp53: "queue0"
+ dscp54: "queue0"
+ dscp55: "queue0"
+ dscp56: "queue0"
+ dscp57: "queue0"
+ dscp58: "queue0"
+ dscp59: "queue0"
+ dscp6: "queue0"
+ dscp60: "queue0"
+ dscp61: "queue0"
+ dscp62: "queue0"
+ dscp63: "queue0"
+ dscp7: "queue0"
+ dscp8: "queue0"
+ dscp9: "queue0"
+ id: "201"
+ type: "cos"
+ weight: "6"
+ scheduler:
+ -
+ mode: "none"
+ name: "default_name_206"
+ npu_group_effective_scope: "255"
+ npu_tcam:
+ -
+ data:
+ df: "enable"
+ dstip: "<your_own_value>"
+ dstipv6: "<your_own_value>"
+ dstmac: "<your_own_value>"
+ dstport: "0"
+ ethertype: "<your_own_value>"
+ ext_tag: "enable"
+ frag_off: "0"
+ gen_buf_cnt: "0"
+ gen_iv: "valid"
+ gen_l3_flags: "0"
+ gen_l4_flags: "0"
+ gen_pkt_ctrl: "0"
+ gen_pri: "0"
+ gen_pri_v: "valid"
+ gen_tv: "valid"
+ ihl: "0"
+ ip4_id: "0"
+ ip6_fl: "0"
+ ipver: "0"
+ l4_wd10: "0"
+ l4_wd11: "0"
+ l4_wd8: "0"
+ l4_wd9: "0"
+ mf: "enable"
+ protocol: "0"
+ slink: "0"
+ smac_change: "enable"
+ sp: "0"
+ src_cfi: "enable"
+ src_prio: "0"
+ src_updt: "enable"
+ srcip: "<your_own_value>"
+ srcipv6: "<your_own_value>"
+ srcmac: "<your_own_value>"
+ srcport: "0"
+ svid: "0"
+ tcp_ack: "enable"
+ tcp_cwr: "enable"
+ tcp_ece: "enable"
+ tcp_fin: "enable"
+ tcp_push: "enable"
+ tcp_rst: "enable"
+ tcp_syn: "enable"
+ tcp_urg: "enable"
+ tgt_cfi: "enable"
+ tgt_prio: "0"
+ tgt_updt: "enable"
+ tgt_v: "valid"
+ tos: "0"
+ tp: "0"
+ ttl: "0"
+ tvid: "0"
+ vdid: "0"
+ mask:
+ df: "enable"
+ dstip: "<your_own_value>"
+ dstipv6: "<your_own_value>"
+ dstmac: "<your_own_value>"
+ dstport: "0"
+ ethertype: "<your_own_value>"
+ ext_tag: "enable"
+ frag_off: "0"
+ gen_buf_cnt: "0"
+ gen_iv: "valid"
+ gen_l3_flags: "0"
+ gen_l4_flags: "0"
+ gen_pkt_ctrl: "0"
+ gen_pri: "0"
+ gen_pri_v: "valid"
+ gen_tv: "valid"
+ ihl: "0"
+ ip4_id: "0"
+ ip6_fl: "0"
+ ipver: "0"
+ l4_wd10: "0"
+ l4_wd11: "0"
+ l4_wd8: "0"
+ l4_wd9: "0"
+ mf: "enable"
+ protocol: "0"
+ slink: "0"
+ smac_change: "enable"
+ sp: "0"
+ src_cfi: "enable"
+ src_prio: "0"
+ src_updt: "enable"
+ srcip: "<your_own_value>"
+ srcipv6: "<your_own_value>"
+ srcmac: "<your_own_value>"
+ srcport: "0"
+ svid: "0"
+ tcp_ack: "enable"
+ tcp_cwr: "enable"
+ tcp_ece: "enable"
+ tcp_fin: "enable"
+ tcp_push: "enable"
+ tcp_rst: "enable"
+ tcp_syn: "enable"
+ tcp_urg: "enable"
+ tgt_cfi: "enable"
+ tgt_prio: "0"
+ tgt_updt: "enable"
+ tgt_v: "valid"
+ tos: "0"
+ tp: "0"
+ ttl: "0"
+ tvid: "0"
+ vdid: "0"
+ mir_act:
+ vlif: "0"
+ name: "default_name_321"
+ oid: "0"
+ pri_act:
+ priority: "0"
+ weight: "0"
+ sact:
+ act: "0"
+ act_v: "enable"
+ bmproc: "0"
+ bmproc_v: "enable"
+ df_lif: "0"
+ df_lif_v: "enable"
+ dfr: "0"
+ dfr_v: "enable"
+ dmac_skip: "0"
+ dmac_skip_v: "enable"
+ dosen: "0"
+ dosen_v: "enable"
+ espff_proc: "0"
+ espff_proc_v: "enable"
+ etype_pid: "0"
+ etype_pid_v: "enable"
+ frag_proc: "0"
+ frag_proc_v: "enable"
+ fwd: "0"
+ fwd_lif: "0"
+ fwd_lif_v: "enable"
+ fwd_tvid: "0"
+ fwd_tvid_v: "enable"
+ fwd_v: "enable"
+ icpen: "0"
+ icpen_v: "enable"
+ igmp_mld_snp: "0"
+ igmp_mld_snp_v: "enable"
+ learn: "0"
+ learn_v: "enable"
+ m_srh_ctrl: "0"
+ m_srh_ctrl_v: "enable"
+ mac_id: "0"
+ mac_id_v: "enable"
+ mss: "0"
+ mss_v: "enable"
+ pleen: "0"
+ pleen_v: "enable"
+ prio_pid: "0"
+ prio_pid_v: "enable"
+ promis: "0"
+ promis_v: "enable"
+ rfsh: "0"
+ rfsh_v: "enable"
+ smac_skip: "0"
+ smac_skip_v: "enable"
+ tp_smchk: "0"
+ tp_smchk_v: "enable"
+ tpe_id: "0"
+ tpe_id_v: "enable"
+ vdm: "0"
+ vdm_v: "enable"
+ vdom_id: "0"
+ vdom_id_v: "enable"
+ x_mode: "0"
+ x_mode_v: "enable"
+ tact:
+ act: "0"
+ act_v: "enable"
+ fmtuv4_s: "0"
+ fmtuv4_s_v: "enable"
+ fmtuv6_s: "0"
+ fmtuv6_s_v: "enable"
+ lnkid: "0"
+ lnkid_v: "enable"
+ mac_id: "0"
+ mac_id_v: "enable"
+ mss_t: "0"
+ mss_t_v: "enable"
+ mtuv4: "0"
+ mtuv4_v: "enable"
+ mtuv6: "0"
+ mtuv6_v: "enable"
+ slif_act: "0"
+ slif_act_v: "enable"
+ sublnkid: "0"
+ sublnkid_v: "enable"
+ tgtv_act: "0"
+ tgtv_act_v: "enable"
+ tlif_act: "0"
+ tlif_act_v: "enable"
+ tpeid: "0"
+ tpeid_v: "enable"
+ v6fe: "0"
+ v6fe_v: "enable"
+ vep_en: "0"
+ vep_en_v: "enable"
+ vep_slid: "0"
+ vep_slid_v: "enable"
+ xlt_lif: "0"
+ xlt_lif_v: "enable"
+ xlt_vid: "0"
+ xlt_vid_v: "enable"
+ type: "L2_src_tc"
+ vid: "0"
+ per_session_accounting: "traffic-log-only"
port_cpu_map:
-
cpu_core: "<your_own_value>"
@@ -451,13 +3716,20 @@ EXAMPLES = """
-
interface: "<your_own_value>"
npu_group_index: "0"
+ port_path_option:
+ ports_using_npu:
+ -
+ interface_name: "<your_own_value>"
priority_protocol:
bfd: "enable"
bgp: "enable"
slbc: "enable"
qos_mode: "disable"
+ qtm_buf_mode: "6ch"
rdp_offload: "enable"
+ session_acct_interval: "5"
session_denied_offload: "disable"
+ shaping_stats: "disable"
sse_backpressure: "enable"
strip_clear_text_padding: "enable"
strip_esp_padding: "enable"
@@ -476,6 +3748,8 @@ EXAMPLES = """
draco15: "enable"
tcp_udp_port: "include"
uesp_offload: "enable"
+ ull_port_mode: "10G"
+ vlan_lookup_cache: "enable"
"""
RETURN = """
@@ -562,24 +3836,51 @@ def filter_system_npu_data(json):
"capwap_offload",
"dedicated_management_affinity",
"dedicated_management_cpu",
+ "default_qos_type",
+ "dos_options",
+ "double_level_mcast_offload",
+ "dsw_dts_profile",
+ "dsw_queue_dts_profile",
"fastpath",
+ "fp_anomaly",
"gtp_enhanced_cpu_range",
"gtp_enhanced_mode",
+ "gtp_support",
+ "hash_tbl_spread",
+ "hpe",
+ "htab_dedi_queue_nr",
+ "htab_msg_queue",
+ "htx_icmp_csum_chk",
+ "inbound_dscp_copy_port",
"intf_shaping_offload",
+ "ip_fragment_offload",
+ "ip_reassembly",
"ipsec_dec_subengine_mask",
"ipsec_enc_subengine_mask",
"ipsec_inbound_cache",
"ipsec_mtu_override",
+ "ipsec_ob_np_sel",
"ipsec_over_vlink",
"isf_np_queues",
"lag_out_port_select",
+ "max_receive_unit",
+ "max_session_timeout",
"mcast_session_accounting",
+ "napi_break_interval",
+ "np_queues",
+ "npu_group_effective_scope",
+ "npu_tcam",
+ "per_session_accounting",
"port_cpu_map",
"port_npu_map",
+ "port_path_option",
"priority_protocol",
"qos_mode",
+ "qtm_buf_mode",
"rdp_offload",
+ "session_acct_interval",
"session_denied_offload",
+ "shaping_stats",
"sse_backpressure",
"strip_clear_text_padding",
"strip_esp_padding",
@@ -587,6 +3888,8 @@ def filter_system_npu_data(json):
"sw_np_bandwidth",
"sw_tr_hash",
"uesp_offload",
+ "ull_port_mode",
+ "vlan_lookup_cache",
]
json = remove_invalid_fields(json)
@@ -615,9 +3918,10 @@ def underscore_to_hyphen(data):
def system_npu(data, fos):
vdom = data["vdom"]
system_npu_data = data["system_npu"]
- filtered_data = underscore_to_hyphen(filter_system_npu_data(system_npu_data))
+ filtered_data = filter_system_npu_data(system_npu_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "npu", data=filtered_data, vdom=vdom)
+ return fos.set("system", "npu", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -669,7 +3973,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
"required": True,
@@ -678,15 +3983,21 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
},
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
},
"fastpath": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
@@ -695,10 +4006,16 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "ipsec_enc_subengine_mask": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "ipsec_dec_subengine_mask": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "ipsec_enc_subengine_mask": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "string",
+ },
+ "ipsec_dec_subengine_mask": {
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
+ "type": "string",
+ },
"sw_np_bandwidth": {
- "v_range": [["v6.2.0", ""]],
+ "v_range": [["v6.2.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [
{"value": "0G"},
@@ -706,9 +4023,9 @@ versioned_schema = {
{"value": "4G"},
{"value": "5G"},
{"value": "6G"},
- {"value": "7G", "v_range": [["v7.4.0", ""]]},
- {"value": "8G", "v_range": [["v7.4.0", ""]]},
- {"value": "9G", "v_range": [["v7.4.0", ""]]},
+ {"value": "7G", "v_range": [["v7.4.0", "v7.4.1"], ["v7.4.3", ""]]},
+ {"value": "8G", "v_range": [["v7.4.0", "v7.4.1"], ["v7.4.3", ""]]},
+ {"value": "9G", "v_range": [["v7.4.0", "v7.4.1"], ["v7.4.3", ""]]},
],
},
"gtp_enhanced_mode": {
@@ -717,52 +4034,57 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"gtp_enhanced_cpu_range": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "0"}, {"value": "1"}, {"value": "2"}],
},
"intf_shaping_offload": {
- "v_range": [["v6.4.0", ""]],
+ "v_range": [["v6.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"strip_esp_padding": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"strip_clear_text_padding": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"ipsec_inbound_cache": {
- "v_range": [["v6.2.0", ""]],
+ "v_range": [["v6.2.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"sse_backpressure": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"rdp_offload": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"ipsec_over_vlink": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"uesp_offload": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"qos_mode": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [
{"value": "disable"},
@@ -771,14 +4093,20 @@ versioned_schema = {
],
},
"isf_np_queues": {
- "v_range": [["v6.4.0", "v6.4.0"], ["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v6.4.0", "v6.4.0"],
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "dict",
"children": {
"cos0": {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -786,7 +4114,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -794,7 +4123,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -802,7 +4132,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -810,7 +4141,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -818,7 +4150,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -826,7 +4159,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -834,7 +4168,8 @@ versioned_schema = {
"v_range": [
["v6.4.0", "v6.4.0"],
["v7.2.0", "v7.2.0"],
- ["v7.4.0", ""],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
},
@@ -845,7 +4180,8 @@ versioned_schema = {
["v6.0.0", "v6.0.0"],
["v6.0.11", "v6.2.0"],
["v6.2.5", "v6.2.7"],
- ["v6.4.4", ""],
+ ["v6.4.4", "v7.4.1"],
+ ["v7.4.3", ""],
],
"type": "string",
"options": [
@@ -855,21 +4191,30 @@ versioned_schema = {
],
},
"ipsec_mtu_override": {
- "v_range": [["v6.2.0", "v6.2.0"], ["v6.2.7", "v6.2.7"], ["v6.4.4", ""]],
+ "v_range": [
+ ["v6.2.0", "v6.2.0"],
+ ["v6.2.7", "v6.2.7"],
+ ["v6.4.4", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
"lag_out_port_select": {
- "v_range": [["v6.2.0", "v6.2.7"], ["v6.4.1", ""]],
+ "v_range": [["v6.2.0", "v6.2.7"], ["v6.4.1", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
"sw_eh_hash": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"computation": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [
{"value": "xor16"},
@@ -879,88 +4224,150 @@ versioned_schema = {
],
},
"ip_protocol": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
"source_ip_upper_16": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
"source_ip_lower_16": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
"destination_ip_upper_16": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
"destination_ip_lower_16": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
"source_port": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
"destination_port": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
"netmask_length": {
- "v_range": [["v7.2.0", "v7.2.0"], ["v7.4.0", ""]],
+ "v_range": [
+ ["v7.2.0", "v7.2.0"],
+ ["v7.4.0", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "integer",
},
},
},
"sw_tr_hash": {
- "v_range": [["v7.4.0", ""]],
+ "v_range": [["v7.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"draco15": {
- "v_range": [["v7.4.0", ""]],
+ "v_range": [["v7.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"tcp_udp_port": {
- "v_range": [["v7.4.0", ""]],
+ "v_range": [["v7.4.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "include"}, {"value": "exclude"}],
},
},
},
"session_denied_offload": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
"priority_protocol": {
- "v_range": [["v6.0.0", "v6.0.0"], ["v6.0.11", ""]],
+ "v_range": [["v6.0.0", "v6.0.0"], ["v6.0.11", "v7.4.1"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"bgp": {
- "v_range": [["v6.0.0", "v6.0.0"], ["v6.0.11", ""]],
+ "v_range": [
+ ["v6.0.0", "v6.0.0"],
+ ["v6.0.11", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"slbc": {
- "v_range": [["v6.0.0", "v6.0.0"], ["v6.0.11", ""]],
+ "v_range": [
+ ["v6.0.0", "v6.0.0"],
+ ["v6.0.11", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"bfd": {
- "v_range": [["v6.0.0", "v6.0.0"], ["v6.0.11", ""]],
+ "v_range": [
+ ["v6.0.0", "v6.0.0"],
+ ["v6.0.11", "v7.4.1"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
},
},
+ "port_path_option": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "ports_using_npu": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "interface_name": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ }
+ },
+ },
"port_npu_map": {
"type": "list",
"elements": "dict",
@@ -970,6 +4377,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
"required": True,
@@ -979,6 +4387,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "integer",
},
@@ -987,8 +4396,2536 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
+ ],
+ },
+ "ipsec_ob_np_sel": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "rr"}, {"value": "Packet"}, {"value": "Hash"}],
+ },
+ "npu_group_effective_scope": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "dos_options": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "npu_dos_meter_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "global"}, {"value": "local"}],
+ },
+ "npu_dos_tpe_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ },
+ },
+ "napi_break_interval": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "hpe": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "all_protocol": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tcpsyn_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tcpsyn_ack_max": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tcpfin_rst_max": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tcp_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "udp_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "icmp_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "sctp_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "esp_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "ip_frag_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "ip_others_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "arp_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "l2_others_max": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "high_priority": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "enable_shaper": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ },
+ },
+ "default_qos_type": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "policing"},
+ {"value": "shaping"},
+ {"value": "policing-enhanced"},
+ ],
+ },
+ "shaping_stats": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "gtp_support": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "per_session_accounting": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "traffic-log-only"},
+ {"value": "disable"},
+ {"value": "enable"},
],
},
+ "session_acct_interval": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "max_session_timeout": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "fp_anomaly": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "tcp_syn_fin": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "tcp_fin_noack": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "tcp_fin_only": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "tcp_no_flag": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "tcp_syn_data": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "tcp_winnuke": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "tcp_land": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "udp_land": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "icmp_land": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "icmp_frag": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_land": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_proto_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_unknopt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_optrr": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_optssrr": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_optlsrr": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_optstream": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_optsecurity": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_opttimestamp": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv4_csum_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "drop"}, {"value": "trap-to-host"}],
+ },
+ "tcp_csum_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "drop"}, {"value": "trap-to-host"}],
+ },
+ "udp_csum_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "drop"}, {"value": "trap-to-host"}],
+ },
+ "icmp_csum_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "drop"}, {"value": "trap-to-host"}],
+ },
+ "ipv6_land": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_proto_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_unknopt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_saddr_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_daddr_err": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_optralert": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_optjumbo": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_opttunnel": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_opthomeaddr": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_optnsap": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_optendpid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ "ipv6_optinvld": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "drop"},
+ {"value": "trap-to-host"},
+ ],
+ },
+ },
+ },
+ "ip_reassembly": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "min_timeout": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "max_timeout": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "status": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ },
+ },
+ "hash_tbl_spread": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "vlan_lookup_cache": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "ip_fragment_offload": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "htx_icmp_csum_chk": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "drop"}, {"value": "pass"}],
+ },
+ "htab_msg_queue": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "data"}, {"value": "idle"}, {"value": "dedicated"}],
+ },
+ "htab_dedi_queue_nr": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "dsw_dts_profile": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "profile_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ "required": True,
+ },
+ "min_limit": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "step": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "action": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "wait"},
+ {"value": "drop"},
+ {"value": "drop_tmr_0"},
+ {"value": "drop_tmr_1"},
+ {"value": "enque"},
+ {"value": "enque_0"},
+ {"value": "enque_1"},
+ ],
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "dsw_queue_dts_profile": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ },
+ "iport": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "eif0"},
+ {"value": "eif1"},
+ {"value": "eif2"},
+ {"value": "eif3"},
+ {"value": "eif4"},
+ {"value": "eif5"},
+ {"value": "eif6"},
+ {"value": "eif7"},
+ {"value": "htx0"},
+ {"value": "htx1"},
+ {"value": "sse0"},
+ {"value": "sse1"},
+ {"value": "sse2"},
+ {"value": "sse3"},
+ {"value": "rlt"},
+ {"value": "dfr"},
+ {"value": "ipseci"},
+ {"value": "ipseco"},
+ {"value": "ipti"},
+ {"value": "ipto"},
+ {"value": "vep0"},
+ {"value": "vep2"},
+ {"value": "vep4"},
+ {"value": "vep6"},
+ {"value": "ivs"},
+ {"value": "l2ti1"},
+ {"value": "l2to"},
+ {"value": "l2ti0"},
+ {"value": "ple"},
+ {"value": "spath"},
+ {"value": "qtm"},
+ ],
+ },
+ "oport": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "eif0"},
+ {"value": "eif1"},
+ {"value": "eif2"},
+ {"value": "eif3"},
+ {"value": "eif4"},
+ {"value": "eif5"},
+ {"value": "eif6"},
+ {"value": "eif7"},
+ {"value": "hrx"},
+ {"value": "sse0"},
+ {"value": "sse1"},
+ {"value": "sse2"},
+ {"value": "sse3"},
+ {"value": "rlt"},
+ {"value": "dfr"},
+ {"value": "ipseci"},
+ {"value": "ipseco"},
+ {"value": "ipti"},
+ {"value": "ipto"},
+ {"value": "vep0"},
+ {"value": "vep2"},
+ {"value": "vep4"},
+ {"value": "vep6"},
+ {"value": "ivs"},
+ {"value": "l2ti1"},
+ {"value": "l2to"},
+ {"value": "l2ti0"},
+ {"value": "ple"},
+ {"value": "sync"},
+ {"value": "nss"},
+ {"value": "tsk"},
+ {"value": "qtm"},
+ ],
+ },
+ "profile_id": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "queue_select": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "npu_tcam": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ },
+ "type": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "L2_src_tc"},
+ {"value": "L2_tgt_tc"},
+ {"value": "L2_src_mir"},
+ {"value": "L2_tgt_mir"},
+ {"value": "L2_src_act"},
+ {"value": "L2_tgt_act"},
+ {"value": "IPv4_src_tc"},
+ {"value": "IPv4_tgt_tc"},
+ {"value": "IPv4_src_mir"},
+ {"value": "IPv4_tgt_mir"},
+ {"value": "IPv4_src_act"},
+ {"value": "IPv4_tgt_act"},
+ {"value": "IPv6_src_tc"},
+ {"value": "IPv6_tgt_tc"},
+ {"value": "IPv6_src_mir"},
+ {"value": "IPv6_tgt_mir"},
+ {"value": "IPv6_src_act"},
+ {"value": "IPv6_tgt_act"},
+ ],
+ },
+ "oid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "vid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "data": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "gen_buf_cnt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_pri": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_pri_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "gen_iv": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "gen_tv": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "gen_pkt_ctrl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_l3_flags": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_l4_flags": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "vdid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tp": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tgt_updt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "smac_change": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "ext_tag": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tgt_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "tvid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tgt_cfi": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tgt_prio": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "sp": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "src_updt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "slink": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "svid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "src_cfi": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "src_prio": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "srcmac": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "dstmac": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "ethertype": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ },
+ "ipver": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "ihl": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "ip4_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "srcip": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "dstip": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "ip6_fl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "srcipv6": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ },
+ "dstipv6": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ },
+ "ttl": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "protocol": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tos": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "frag_off": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "mf": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "df": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "srcport": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "dstport": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tcp_fin": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_syn": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_rst": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_push": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_ack": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_urg": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_ece": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_cwr": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "l4_wd8": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "l4_wd9": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "l4_wd10": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "l4_wd11": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ },
+ "mask": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "gen_buf_cnt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_pri": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_pri_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "gen_iv": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "gen_tv": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "gen_pkt_ctrl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_l3_flags": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "gen_l4_flags": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "vdid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tp": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tgt_updt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "smac_change": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "ext_tag": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tgt_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "valid"}, {"value": "invalid"}],
+ },
+ "tvid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tgt_cfi": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tgt_prio": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "sp": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "src_updt": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "slink": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "svid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "src_cfi": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "src_prio": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "srcmac": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "dstmac": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "ethertype": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ },
+ "ipver": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "ihl": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "ip4_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "srcip": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "dstip": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "ip6_fl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "srcipv6": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ },
+ "dstipv6": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ },
+ "ttl": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "protocol": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tos": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "frag_off": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "mf": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "df": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "srcport": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "dstport": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tcp_fin": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_syn": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_rst": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_push": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_ack": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_urg": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_ece": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tcp_cwr": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "l4_wd8": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "l4_wd9": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "l4_wd10": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "l4_wd11": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ },
+ "mir_act": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "vlif": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"}
+ },
+ },
+ "pri_act": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "priority": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "weight": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ },
+ "sact": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "fwd_lif_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "fwd_lif": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "fwd_tvid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "fwd_tvid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "df_lif_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "df_lif": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "act_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "act": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "pleen_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "pleen": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "icpen_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "icpen": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "vdm_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "vdm": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "learn_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "learn": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "rfsh_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "rfsh": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "fwd_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "fwd": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "x_mode_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "x_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "promis_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "promis": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "bmproc_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "bmproc": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "mac_id_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "mac_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "dosen_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "dosen": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "dfr_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "dfr": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "m_srh_ctrl_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "m_srh_ctrl": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tpe_id_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tpe_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "vdom_id_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "vdom_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "mss_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "mss": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "tp_smchk_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tp_smchk": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "etype_pid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "etype_pid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "frag_proc_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "frag_proc": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "espff_proc_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "espff_proc": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "prio_pid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "prio_pid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "igmp_mld_snp_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "igmp_mld_snp": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "smac_skip_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "smac_skip": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "dmac_skip_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "dmac_skip": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ },
+ "tact": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "act_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "act": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "mtuv4_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "mtuv4": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "mtuv6_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "mtuv6": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "mac_id_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "mac_id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "slif_act_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "slif_act": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tlif_act_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tlif_act": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tgtv_act_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tgtv_act": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "tpeid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "tpeid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "v6fe_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "v6fe": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "xlt_vid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "xlt_vid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "xlt_lif_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "xlt_lif": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "mss_t_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "mss_t": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "lnkid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "lnkid": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "sublnkid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "sublnkid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "fmtuv4_s_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "fmtuv4_s": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "fmtuv6_s_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "fmtuv6_s": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "vep_en_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "vep_en": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "vep_slid_v": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "vep_slid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "np_queues": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "dict",
+ "children": {
+ "profile": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "id": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ "required": True,
+ },
+ "type": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "cos"}, {"value": "dscp"}],
+ },
+ "weight": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "cos0": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "cos1": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "cos2": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "cos3": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "cos4": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "cos5": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "cos6": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "cos7": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp0": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp1": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp2": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp3": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp4": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp5": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp6": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp7": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp8": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp9": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp10": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp11": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp12": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp13": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp14": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp15": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp16": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp17": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp18": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp19": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp20": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp21": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp22": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp23": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp24": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp25": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp26": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp27": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp28": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp29": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp30": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp31": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp32": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp33": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp34": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp35": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp36": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp37": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp38": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp39": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp40": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp41": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp42": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp43": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp44": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp45": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp46": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp47": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp48": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp49": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp50": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp51": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp52": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp53": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp54": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp55": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp56": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp57": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp58": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp59": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp60": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp61": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp62": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ "dscp63": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "queue0"},
+ {"value": "queue1"},
+ {"value": "queue2"},
+ {"value": "queue3"},
+ {"value": "queue4"},
+ {"value": "queue5"},
+ {"value": "queue6"},
+ {"value": "queue7"},
+ ],
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "ethernet_type": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ },
+ "type": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string"},
+ "queue": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "weight": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "ip_protocol": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ },
+ "protocol": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "queue": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "weight": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "ip_service": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ },
+ "protocol": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "sport": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "dport": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "queue": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
+ "weight": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "scheduler": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ },
+ "mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [
+ {"value": "none"},
+ {"value": "priority"},
+ {"value": "round-robin"},
+ ],
+ },
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ },
+ },
+ "inbound_dscp_copy_port": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "interface": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
+ "double_level_mcast_offload": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "qtm_buf_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "6ch"}, {"value": "4ch"}],
+ },
+ "ull_port_mode": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ "options": [{"value": "10G"}, {"value": "25G"}],
+ },
+ "max_receive_unit": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu_vlink.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu_vlink.py
new file mode 100644
index 000000000..fe1f2505a
--- /dev/null
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_npu_vlink.py
@@ -0,0 +1,352 @@
+#!/usr/bin/python
+from __future__ import absolute_import, division, print_function
+
+# Copyright: (c) 2022 Fortinet
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+# 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.
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "status": ["preview"],
+ "supported_by": "community",
+ "metadata_version": "1.1",
+}
+
+DOCUMENTATION = """
+---
+module: fortios_system_npu_vlink
+short_description: Configure NPU VDOM link in Fortinet's FortiOS and FortiGate.
+description:
+ - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the
+ user to set and modify system feature and npu_vlink category.
+ Examples include all parameters and values need to be adjusted to datasources before usage.
+ Tested with FOS v6.0.0
+version_added: "2.0.0"
+author:
+ - Link Zheng (@chillancezen)
+ - Jie Xue (@JieX19)
+ - Hongbin Lu (@fgtdev-hblu)
+ - Frank Shen (@frankshen01)
+ - Miguel Angel Munoz (@mamunozgonzalez)
+ - Nicolas Thomas (@thomnico)
+notes:
+ - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
+
+requirements:
+ - ansible>=2.15
+options:
+ access_token:
+ description:
+ - Token-based authentication.
+ Generated from GUI of Fortigate.
+ type: str
+ required: false
+ enable_log:
+ description:
+ - Enable/Disable logging for task.
+ type: bool
+ required: false
+ default: false
+ vdom:
+ description:
+ - Virtual domain, among those defined previously. A vdom is a
+ virtual instance of the FortiGate that can be configured and
+ used as a different unit.
+ type: str
+ default: root
+ member_path:
+ type: str
+ description:
+ - Member attribute path to operate on.
+ - Delimited by a slash character if there are more than one attribute.
+ - Parameter marked with member_path is legitimate for doing member operation.
+ member_state:
+ type: str
+ description:
+ - Add or delete a member under specified attribute path.
+ - When member_state is specified, the state option is ignored.
+ choices:
+ - 'present'
+ - 'absent'
+
+ state:
+ description:
+ - Indicates whether to create or remove the object.
+ type: str
+ required: true
+ choices:
+ - 'present'
+ - 'absent'
+ system_npu_vlink:
+ description:
+ - Configure NPU VDOM link.
+ default: null
+ type: dict
+ suboptions:
+ name:
+ description:
+ - NPU VDOM link name in format npuX_vlink.X means x-th pair of npu-vlink.Maximum 14 characters.
+ required: true
+ type: str
+"""
+
+EXAMPLES = """
+- name: Configure NPU VDOM link.
+ fortinet.fortios.fortios_system_npu_vlink:
+ vdom: "{{ vdom }}"
+ state: "present"
+ access_token: "<your_own_value>"
+ system_npu_vlink:
+ name: "default_name_3"
+"""
+
+RETURN = """
+build:
+ description: Build number of the fortigate image
+ returned: always
+ type: str
+ sample: '1547'
+http_method:
+ description: Last method used to provision the content into FortiGate
+ returned: always
+ type: str
+ sample: 'PUT'
+http_status:
+ description: Last result given by FortiGate on last operation applied
+ returned: always
+ type: str
+ sample: "200"
+mkey:
+ description: Master key (id) used in the last call to FortiGate
+ returned: success
+ type: str
+ sample: "id"
+name:
+ description: Name of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "urlfilter"
+path:
+ description: Path of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "webfilter"
+revision:
+ description: Internal revision number
+ returned: always
+ type: str
+ sample: "17.0.2.10658"
+serial:
+ description: Serial number of the unit
+ returned: always
+ type: str
+ sample: "FGVMEVYYQT3AB5352"
+status:
+ description: Indication of the operation's result
+ returned: always
+ type: str
+ sample: "success"
+vdom:
+ description: Virtual domain used
+ returned: always
+ type: str
+ sample: "root"
+version:
+ description: Version of the FortiGate
+ returned: always
+ type: str
+ sample: "v5.6.3"
+"""
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.connection import Connection
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ FortiOSHandler,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_legacy_fortiosapi,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ schema_to_module_spec,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_schema_versioning,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import (
+ FAIL_SOCKET_MSG,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post_processor import (
+ remove_invalid_fields,
+)
+
+
+def filter_system_npu_vlink_data(json):
+ option_list = ["name"]
+
+ json = remove_invalid_fields(json)
+ dictionary = {}
+
+ for attribute in option_list:
+ if attribute in json and json[attribute] is not None:
+ dictionary[attribute] = json[attribute]
+
+ return dictionary
+
+
+def underscore_to_hyphen(data):
+ if isinstance(data, list):
+ for i, elem in enumerate(data):
+ data[i] = underscore_to_hyphen(elem)
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[k.replace("_", "-")] = underscore_to_hyphen(v)
+ data = new_data
+
+ return data
+
+
+def system_npu_vlink(data, fos):
+ vdom = data["vdom"]
+
+ state = data["state"]
+
+ system_npu_vlink_data = data["system_npu_vlink"]
+ filtered_data = filter_system_npu_vlink_data(system_npu_vlink_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+
+ if state == "present" or state is True:
+ return fos.set("system", "npu-vlink", data=converted_data, vdom=vdom)
+
+ elif state == "absent":
+ return fos.delete("system", "npu-vlink", mkey=filtered_data["name"], vdom=vdom)
+ else:
+ fos._module.fail_json(msg="state must be present or absent!")
+
+
+def is_successful_status(resp):
+ return (
+ "status" in resp
+ and resp["status"] == "success"
+ or "http_status" in resp
+ and resp["http_status"] == 200
+ or "http_method" in resp
+ and resp["http_method"] == "DELETE"
+ and resp["http_status"] == 404
+ )
+
+
+def fortios_system(data, fos):
+ fos.do_member_operation("system", "npu-vlink")
+ if data["system_npu_vlink"]:
+ resp = system_npu_vlink(data, fos)
+ else:
+ fos._module.fail_json(msg="missing task body: %s" % ("system_npu_vlink"))
+
+ return (
+ not is_successful_status(resp),
+ is_successful_status(resp)
+ and (resp["revision_changed"] if "revision_changed" in resp else True),
+ resp,
+ {},
+ )
+
+
+versioned_schema = {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "string", "required": True}
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+}
+
+
+def main():
+ module_spec = schema_to_module_spec(versioned_schema)
+ mkeyname = "name"
+ fields = {
+ "access_token": {"required": False, "type": "str", "no_log": True},
+ "enable_log": {"required": False, "type": "bool", "default": False},
+ "vdom": {"required": False, "type": "str", "default": "root"},
+ "member_path": {"required": False, "type": "str"},
+ "member_state": {
+ "type": "str",
+ "required": False,
+ "choices": ["present", "absent"],
+ },
+ "state": {"required": True, "type": "str", "choices": ["present", "absent"]},
+ "system_npu_vlink": {
+ "required": False,
+ "type": "dict",
+ "default": None,
+ "options": {},
+ },
+ }
+ for attribute_name in module_spec["options"]:
+ fields["system_npu_vlink"]["options"][attribute_name] = module_spec["options"][
+ attribute_name
+ ]
+ if mkeyname and mkeyname == attribute_name:
+ fields["system_npu_vlink"]["options"][attribute_name]["required"] = True
+
+ module = AnsibleModule(argument_spec=fields, supports_check_mode=False)
+ check_legacy_fortiosapi(module)
+
+ is_error = False
+ has_changed = False
+ result = None
+ diff = None
+
+ versions_check_result = None
+ if module._socket_path:
+ connection = Connection(module._socket_path)
+ if "access_token" in module.params:
+ connection.set_option("access_token", module.params["access_token"])
+
+ if "enable_log" in module.params:
+ connection.set_option("enable_log", module.params["enable_log"])
+ else:
+ connection.set_option("enable_log", False)
+ fos = FortiOSHandler(connection, module, mkeyname)
+ versions_check_result = check_schema_versioning(
+ fos, versioned_schema, "system_npu_vlink"
+ )
+
+ is_error, has_changed, result, diff = fortios_system(module.params, fos)
+
+ else:
+ module.fail_json(**FAIL_SOCKET_MSG)
+
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.warn(
+ "Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv"
+ )
+
+ if not is_error:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.exit_json(
+ changed=has_changed,
+ version_check_warning=versions_check_result,
+ meta=result,
+ diff=diff,
+ )
+ else:
+ module.exit_json(changed=has_changed, meta=result, diff=diff)
+ else:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.fail_json(
+ msg="Error in repo",
+ version_check_warning=versions_check_result,
+ meta=result,
+ )
+ else:
+ module.fail_json(msg="Error in repo", meta=result)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ntp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ntp.py
index 26877a2b7..cc4ba6591 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ntp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ntp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -143,6 +143,14 @@ options:
- 'auto'
- 'sdwan'
- 'specify'
+ ip_type:
+ description:
+ - Choose to connect to IPv4 or/and IPv6 NTP server.
+ type: str
+ choices:
+ - 'IPv6'
+ - 'IPv4'
+ - 'Both'
key:
description:
- Key for MD5(NTPv3)/SHA1(NTPv4) authentication.
@@ -216,6 +224,7 @@ EXAMPLES = """
id: "11"
interface: "<your_own_value> (source system.interface.name)"
interface_select_method: "auto"
+ ip_type: "IPv6"
key: "<your_own_value>"
key_id: "0"
ntpv3: "enable"
@@ -349,9 +358,10 @@ def underscore_to_hyphen(data):
def system_ntp(data, fos):
vdom = data["vdom"]
system_ntp_data = data["system_ntp"]
- filtered_data = underscore_to_hyphen(filter_system_ntp_data(system_ntp_data))
+ filtered_data = filter_system_ntp_data(system_ntp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ntp", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ntp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -419,6 +429,15 @@ versioned_schema = {
},
"key": {"v_range": [["v6.0.0", ""]], "type": "string"},
"key_id": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "ip_type": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "IPv6"},
+ {"value": "IPv4"},
+ {"value": "Both"},
+ ],
+ },
"interface_select_method": {
"v_range": [
["v6.2.0", "v6.2.0"],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_object_tagging.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_object_tagging.py
index 0a041c077..e3e3f424a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_object_tagging.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_object_tagging.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -287,9 +287,8 @@ def system_object_tagging(data, fos, check_mode=False):
state = data["state"]
system_object_tagging_data = data["system_object_tagging"]
- filtered_data = underscore_to_hyphen(
- filter_system_object_tagging_data(system_object_tagging_data)
- )
+ filtered_data = filter_system_object_tagging_data(system_object_tagging_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -353,7 +352,7 @@ def system_object_tagging(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "object-tagging", data=filtered_data, vdom=vdom)
+ return fos.set("system", "object-tagging", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy.py
index 06156b261..3e9d7598f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -318,11 +318,10 @@ def system_password_policy(data, fos):
system_password_policy_data = flatten_multilists_attributes(
system_password_policy_data
)
- filtered_data = underscore_to_hyphen(
- filter_system_password_policy_data(system_password_policy_data)
- )
+ filtered_data = filter_system_password_policy_data(system_password_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "password-policy", data=filtered_data, vdom=vdom)
+ return fos.set("system", "password-policy", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy_guest_admin.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy_guest_admin.py
index 0c4b9954d..219d563bb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy_guest_admin.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_password_policy_guest_admin.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -317,14 +317,13 @@ def system_password_policy_guest_admin(data, fos):
system_password_policy_guest_admin_data = flatten_multilists_attributes(
system_password_policy_guest_admin_data
)
- filtered_data = underscore_to_hyphen(
- filter_system_password_policy_guest_admin_data(
- system_password_policy_guest_admin_data
- )
+ filtered_data = filter_system_password_policy_guest_admin_data(
+ system_password_policy_guest_admin_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "system", "password-policy-guest-admin", data=filtered_data, vdom=vdom
+ "system", "password-policy-guest-admin", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pcp_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pcp_server.py
index 2f422f193..e2704af97 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pcp_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pcp_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -380,11 +380,10 @@ def system_pcp_server(data, fos):
vdom = data["vdom"]
system_pcp_server_data = data["system_pcp_server"]
system_pcp_server_data = flatten_multilists_attributes(system_pcp_server_data)
- filtered_data = underscore_to_hyphen(
- filter_system_pcp_server_data(system_pcp_server_data)
- )
+ filtered_data = filter_system_pcp_server_data(system_pcp_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "pcp-server", data=filtered_data, vdom=vdom)
+ return fos.set("system", "pcp-server", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_performance_top.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_performance_top.py
index 5088314dd..4ea9f8622 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_performance_top.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_performance_top.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<delay>": "delay"}
+ speciallist = {"<delay>": "delay"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def system_performance_top(data, fos):
vdom = data["vdom"]
system_performance_top_data = data["system_performance_top"]
- filtered_data = underscore_to_hyphen(
- filter_system_performance_top_data(system_performance_top_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_system_performance_top_data(system_performance_top_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("system.performance", "top", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_physical_switch.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_physical_switch.py
index c4f6ae74d..c7edc61ef 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_physical_switch.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_physical_switch.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,9 +278,8 @@ def system_physical_switch(data, fos, check_mode=False):
state = data["state"]
system_physical_switch_data = data["system_physical_switch"]
- filtered_data = underscore_to_hyphen(
- filter_system_physical_switch_data(system_physical_switch_data)
- )
+ filtered_data = filter_system_physical_switch_data(system_physical_switch_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -344,7 +343,7 @@ def system_physical_switch(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "physical-switch", data=filtered_data, vdom=vdom)
+ return fos.set("system", "physical-switch", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -392,6 +391,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
"required": True,
@@ -401,6 +401,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
@@ -410,6 +411,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "integer",
},
@@ -449,7 +451,12 @@ versioned_schema = {
"v_range": [["v6.0.0", "v6.0.11"], ["v6.2.3", "v6.2.3"]],
},
},
- "v_range": [["v6.0.0", "v6.2.7"], ["v6.4.1", "v7.0.12"], ["v7.2.1", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v6.2.7"],
+ ["v6.4.1", "v7.0.12"],
+ ["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
+ ],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pppoe_interface.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pppoe_interface.py
index 51237bd3f..546a90913 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pppoe_interface.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_pppoe_interface.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -332,9 +332,8 @@ def system_pppoe_interface(data, fos, check_mode=False):
state = data["state"]
system_pppoe_interface_data = data["system_pppoe_interface"]
- filtered_data = underscore_to_hyphen(
- filter_system_pppoe_interface_data(system_pppoe_interface_data)
- )
+ filtered_data = filter_system_pppoe_interface_data(system_pppoe_interface_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -398,7 +397,7 @@ def system_pppoe_interface(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "pppoe-interface", data=filtered_data, vdom=vdom)
+ return fos.set("system", "pppoe-interface", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_probe_response.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_probe_response.py
index 73b553fd3..b5a986ce7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_probe_response.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_probe_response.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -251,11 +251,10 @@ def underscore_to_hyphen(data):
def system_probe_response(data, fos):
vdom = data["vdom"]
system_probe_response_data = data["system_probe_response"]
- filtered_data = underscore_to_hyphen(
- filter_system_probe_response_data(system_probe_response_data)
- )
+ filtered_data = filter_system_probe_response_data(system_probe_response_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "probe-response", data=filtered_data, vdom=vdom)
+ return fos.set("system", "probe-response", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_proxy_arp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_proxy_arp.py
index 2cb1ac668..6f1e106b6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_proxy_arp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_proxy_arp.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,9 +242,8 @@ def system_proxy_arp(data, fos, check_mode=False):
state = data["state"]
system_proxy_arp_data = data["system_proxy_arp"]
- filtered_data = underscore_to_hyphen(
- filter_system_proxy_arp_data(system_proxy_arp_data)
- )
+ filtered_data = filter_system_proxy_arp_data(system_proxy_arp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -308,7 +307,7 @@ def system_proxy_arp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "proxy-arp", data=filtered_data, vdom=vdom)
+ return fos.set("system", "proxy-arp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "proxy-arp", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ptp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ptp.py
index 0f764d262..25a0c00fc 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ptp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_ptp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -274,9 +274,10 @@ def underscore_to_hyphen(data):
def system_ptp(data, fos):
vdom = data["vdom"]
system_ptp_data = data["system_ptp"]
- filtered_data = underscore_to_hyphen(filter_system_ptp_data(system_ptp_data))
+ filtered_data = filter_system_ptp_data(system_ptp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "ptp", data=filtered_data, vdom=vdom)
+ return fos.set("system", "ptp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_admin.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_admin.py
index 7ebe725d9..b5a6f1979 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_admin.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_admin.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_admin(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_admin_data = data["system_replacemsg_admin"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_admin_data(system_replacemsg_admin_data)
- )
+ filtered_data = filter_system_replacemsg_admin_data(system_replacemsg_admin_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_admin(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "admin", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "admin", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_alertmail.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_alertmail.py
index cf7379d15..8ea9d9fee 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_alertmail.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_alertmail.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,10 @@ def system_replacemsg_alertmail(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_alertmail_data = data["system_replacemsg_alertmail"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_alertmail_data(system_replacemsg_alertmail_data)
+ filtered_data = filter_system_replacemsg_alertmail_data(
+ system_replacemsg_alertmail_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +316,7 @@ def system_replacemsg_alertmail(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "alertmail", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "alertmail", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_auth.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_auth.py
index b716d009a..8243b9d02 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_auth.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_auth.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_auth(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_auth_data = data["system_replacemsg_auth"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_auth_data(system_replacemsg_auth_data)
- )
+ filtered_data = filter_system_replacemsg_auth_data(system_replacemsg_auth_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_auth(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "auth", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "auth", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_automation.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_automation.py
index 233402668..ba4be2228 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_automation.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_automation.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -239,12 +239,15 @@ def system_replacemsg_automation(data, fos):
state = data["state"]
system_replacemsg_automation_data = data["system_replacemsg_automation"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_automation_data(system_replacemsg_automation_data)
+ filtered_data = filter_system_replacemsg_automation_data(
+ system_replacemsg_automation_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system.replacemsg", "automation", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "system.replacemsg", "automation", data=converted_data, vdom=vdom
+ )
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_device_detection_portal.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_device_detection_portal.py
index fe30989c4..71088517a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_device_detection_portal.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_device_detection_portal.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -251,11 +251,10 @@ def system_replacemsg_device_detection_portal(data, fos, check_mode=False):
system_replacemsg_device_detection_portal_data = data[
"system_replacemsg_device_detection_portal"
]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_device_detection_portal_data(
- system_replacemsg_device_detection_portal_data
- )
+ filtered_data = filter_system_replacemsg_device_detection_portal_data(
+ system_replacemsg_device_detection_portal_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -326,7 +325,7 @@ def system_replacemsg_device_detection_portal(data, fos, check_mode=False):
return fos.set(
"system.replacemsg",
"device-detection-portal",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ec.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ec.py
index 2e3eda80a..5e2bcbf5e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ec.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ec.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_ec(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_ec_data = data["system_replacemsg_ec"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_ec_data(system_replacemsg_ec_data)
- )
+ filtered_data = filter_system_replacemsg_ec_data(system_replacemsg_ec_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_ec(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "ec", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "ec", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_fortiguard_wf.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_fortiguard_wf.py
index 2b1a419fb..b4d4fddc4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_fortiguard_wf.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_fortiguard_wf.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,11 +249,10 @@ def system_replacemsg_fortiguard_wf(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_fortiguard_wf_data = data["system_replacemsg_fortiguard_wf"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_fortiguard_wf_data(
- system_replacemsg_fortiguard_wf_data
- )
+ filtered_data = filter_system_replacemsg_fortiguard_wf_data(
+ system_replacemsg_fortiguard_wf_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -322,7 +321,7 @@ def system_replacemsg_fortiguard_wf(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "system.replacemsg", "fortiguard-wf", data=filtered_data, vdom=vdom
+ "system.replacemsg", "fortiguard-wf", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ftp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ftp.py
index 019e35771..fe80c53b9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ftp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_ftp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_ftp(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_ftp_data = data["system_replacemsg_ftp"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_ftp_data(system_replacemsg_ftp_data)
- )
+ filtered_data = filter_system_replacemsg_ftp_data(system_replacemsg_ftp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_ftp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "ftp", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "ftp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_group.py
index c2f121522..a36f96fee 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1533,9 +1533,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -1544,8 +1544,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -1561,10 +1564,8 @@ def system_replacemsg_group(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_group_data = data["system_replacemsg_group"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_group_data(system_replacemsg_group_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_system_replacemsg_group_data(system_replacemsg_group_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_http.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_http.py
index 9fff71bff..733966db5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_http.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_http.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_http(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_http_data = data["system_replacemsg_http"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_http_data(system_replacemsg_http_data)
- )
+ filtered_data = filter_system_replacemsg_http_data(system_replacemsg_http_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_http(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "http", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "http", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_icap.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_icap.py
index 9fb06286d..a36b2bc4a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_icap.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_icap.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_icap(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_icap_data = data["system_replacemsg_icap"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_icap_data(system_replacemsg_icap_data)
- )
+ filtered_data = filter_system_replacemsg_icap_data(system_replacemsg_icap_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_icap(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "icap", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "icap", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_image.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_image.py
index e52d78d50..30d9c0d3b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_image.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_image.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -240,9 +240,8 @@ def system_replacemsg_image(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_image_data = data["system_replacemsg_image"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_image_data(system_replacemsg_image_data)
- )
+ filtered_data = filter_system_replacemsg_image_data(system_replacemsg_image_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -306,7 +305,7 @@ def system_replacemsg_image(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "replacemsg-image", data=filtered_data, vdom=vdom)
+ return fos.set("system", "replacemsg-image", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mail.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mail.py
index 0ebb05358..b7ef1f049 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mail.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mail.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_mail(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_mail_data = data["system_replacemsg_mail"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_mail_data(system_replacemsg_mail_data)
- )
+ filtered_data = filter_system_replacemsg_mail_data(system_replacemsg_mail_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_mail(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "mail", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "mail", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm1.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm1.py
index 40c02eaea..5771727f6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm1.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm1.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -355,9 +355,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -366,8 +366,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -383,10 +386,8 @@ def system_replacemsg_mm1(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_mm1_data = data["system_replacemsg_mm1"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_mm1_data(system_replacemsg_mm1_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_system_replacemsg_mm1_data(system_replacemsg_mm1_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm3.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm3.py
index 2916f154b..09ac497b9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm3.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm3.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -311,9 +311,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -322,8 +322,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -339,10 +342,8 @@ def system_replacemsg_mm3(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_mm3_data = data["system_replacemsg_mm3"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_mm3_data(system_replacemsg_mm3_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_system_replacemsg_mm3_data(system_replacemsg_mm3_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm4.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm4.py
index 3136cca64..5591be073 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm4.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm4.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -344,9 +344,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -355,8 +355,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -372,10 +375,8 @@ def system_replacemsg_mm4(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_mm4_data = data["system_replacemsg_mm4"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_mm4_data(system_replacemsg_mm4_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_system_replacemsg_mm4_data(system_replacemsg_mm4_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm7.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm7.py
index c92d2e810..541c84e75 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm7.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mm7.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -375,9 +375,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"message": "fos_message"}
+ speciallist = {"message": "fos_message"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -386,8 +386,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -403,10 +406,8 @@ def system_replacemsg_mm7(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_mm7_data = data["system_replacemsg_mm7"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_mm7_data(system_replacemsg_mm7_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_system_replacemsg_mm7_data(system_replacemsg_mm7_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mms.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mms.py
index 2236241af..214d78a1b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mms.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_mms.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -262,9 +262,8 @@ def system_replacemsg_mms(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_mms_data = data["system_replacemsg_mms"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_mms_data(system_replacemsg_mms_data)
- )
+ filtered_data = filter_system_replacemsg_mms_data(system_replacemsg_mms_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -328,7 +327,7 @@ def system_replacemsg_mms(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "mms", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "mms", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nac_quar.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nac_quar.py
index 132e0dd09..19715be29 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nac_quar.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nac_quar.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,10 @@ def system_replacemsg_nac_quar(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_nac_quar_data = data["system_replacemsg_nac_quar"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_nac_quar_data(system_replacemsg_nac_quar_data)
+ filtered_data = filter_system_replacemsg_nac_quar_data(
+ system_replacemsg_nac_quar_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +316,7 @@ def system_replacemsg_nac_quar(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "nac-quar", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "nac-quar", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nntp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nntp.py
index 3055f0077..2cd8cac7f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nntp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_nntp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_nntp(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_nntp_data = data["system_replacemsg_nntp"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_nntp_data(system_replacemsg_nntp_data)
- )
+ filtered_data = filter_system_replacemsg_nntp_data(system_replacemsg_nntp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_nntp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "nntp", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "nntp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_spam.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_spam.py
index 5d7098915..b2f3c062f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_spam.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_spam.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_spam(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_spam_data = data["system_replacemsg_spam"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_spam_data(system_replacemsg_spam_data)
- )
+ filtered_data = filter_system_replacemsg_spam_data(system_replacemsg_spam_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_spam(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "spam", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "spam", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_sslvpn.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_sslvpn.py
index 1756335d8..8f6afda5f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_sslvpn.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_sslvpn.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_sslvpn(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_sslvpn_data = data["system_replacemsg_sslvpn"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_sslvpn_data(system_replacemsg_sslvpn_data)
- )
+ filtered_data = filter_system_replacemsg_sslvpn_data(system_replacemsg_sslvpn_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_sslvpn(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "sslvpn", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "sslvpn", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_traffic_quota.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_traffic_quota.py
index d95ed70ab..62dbdb987 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_traffic_quota.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_traffic_quota.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,11 +249,10 @@ def system_replacemsg_traffic_quota(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_traffic_quota_data = data["system_replacemsg_traffic_quota"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_traffic_quota_data(
- system_replacemsg_traffic_quota_data
- )
+ filtered_data = filter_system_replacemsg_traffic_quota_data(
+ system_replacemsg_traffic_quota_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -322,7 +321,7 @@ def system_replacemsg_traffic_quota(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "system.replacemsg", "traffic-quota", data=filtered_data, vdom=vdom
+ "system.replacemsg", "traffic-quota", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_utm.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_utm.py
index 91e57efb3..a2786d20a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_utm.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_utm.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,8 @@ def system_replacemsg_utm(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_utm_data = data["system_replacemsg_utm"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_utm_data(system_replacemsg_utm_data)
- )
+ filtered_data = filter_system_replacemsg_utm_data(system_replacemsg_utm_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +314,7 @@ def system_replacemsg_utm(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "utm", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "utm", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_webproxy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_webproxy.py
index 8dadb56b8..08e2070f6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_webproxy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_replacemsg_webproxy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -249,9 +249,10 @@ def system_replacemsg_webproxy(data, fos, check_mode=False):
state = data["state"]
system_replacemsg_webproxy_data = data["system_replacemsg_webproxy"]
- filtered_data = underscore_to_hyphen(
- filter_system_replacemsg_webproxy_data(system_replacemsg_webproxy_data)
+ filtered_data = filter_system_replacemsg_webproxy_data(
+ system_replacemsg_webproxy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +316,7 @@ def system_replacemsg_webproxy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.replacemsg", "webproxy", data=filtered_data, vdom=vdom)
+ return fos.set("system.replacemsg", "webproxy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_resource_limits.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_resource_limits.py
index 060903c80..5e588c45b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_resource_limits.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_resource_limits.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -306,11 +306,10 @@ def underscore_to_hyphen(data):
def system_resource_limits(data, fos):
vdom = data["vdom"]
system_resource_limits_data = data["system_resource_limits"]
- filtered_data = underscore_to_hyphen(
- filter_system_resource_limits_data(system_resource_limits_data)
- )
+ filtered_data = filter_system_resource_limits_data(system_resource_limits_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "resource-limits", data=filtered_data, vdom=vdom)
+ return fos.set("system", "resource-limits", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_saml.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_saml.py
index f0c5ff251..ef3f8b1d9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_saml.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_saml.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -425,9 +425,10 @@ def underscore_to_hyphen(data):
def system_saml(data, fos):
vdom = data["vdom"]
system_saml_data = data["system_saml"]
- filtered_data = underscore_to_hyphen(filter_system_saml_data(system_saml_data))
+ filtered_data = filter_system_saml_data(system_saml_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "saml", data=filtered_data, vdom=vdom)
+ return fos.set("system", "saml", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_connector.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_connector.py
index 3e2ac5581..e4bb7c036 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_connector.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_connector.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -824,9 +824,8 @@ def system_sdn_connector(data, fos, check_mode=False):
state = data["state"]
system_sdn_connector_data = data["system_sdn_connector"]
- filtered_data = underscore_to_hyphen(
- filter_system_sdn_connector_data(system_sdn_connector_data)
- )
+ filtered_data = filter_system_sdn_connector_data(system_sdn_connector_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -890,7 +889,7 @@ def system_sdn_connector(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "sdn-connector", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sdn-connector", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_proxy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_proxy.py
index 3734410c7..87beb3877 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_proxy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdn_proxy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -244,12 +244,11 @@ def system_sdn_proxy(data, fos):
state = data["state"]
system_sdn_proxy_data = data["system_sdn_proxy"]
- filtered_data = underscore_to_hyphen(
- filter_system_sdn_proxy_data(system_sdn_proxy_data)
- )
+ filtered_data = filter_system_sdn_proxy_data(system_sdn_proxy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system", "sdn-proxy", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sdn-proxy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "sdn-proxy", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdwan.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdwan.py
index 1ae661d37..d21332733 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdwan.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sdwan.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -595,6 +595,10 @@ options:
choices:
- 'disable'
- 'enable'
+ transport_group:
+ description:
+ - Measured transport group (0 - 255).
+ type: int
volume_ratio:
description:
- Measured volume ratio (this value / sum of all values = percentage of link volume, 1 - 255).
@@ -1036,6 +1040,14 @@ options:
choices:
- 'enable'
- 'disable'
+ shortcut_priority:
+ description:
+ - High priority of ADVPN shortcut for this service.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ - 'auto'
shortcut_stickiness:
description:
- Enable/disable shortcut-stickiness of ADVPN.
@@ -1185,6 +1197,17 @@ options:
type: list
elements: dict
suboptions:
+ advpn_health_check:
+ description:
+ - Health check for ADVPN local overlay link quality. Source system.sdwan.health-check.name.
+ type: str
+ advpn_select:
+ description:
+ - Enable/disable selection of ADVPN based on SDWAN information.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
minimum_sla_meet_members:
description:
- Minimum number of members which meet SLA when the neighbor is preferred.
@@ -1321,6 +1344,7 @@ EXAMPLES = """
source6: "<your_own_value>"
spillover_threshold: "0"
status: "disable"
+ transport_group: "0"
volume_ratio: "1"
weight: "1"
zone: "<your_own_value> (source system.sdwan.zone.name)"
@@ -1351,52 +1375,52 @@ EXAMPLES = """
dscp_reverse_tag: "<your_own_value>"
dst:
-
- name: "default_name_127 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_128 (source firewall.address.name firewall.addrgrp.name)"
dst_negate: "enable"
dst6:
-
- name: "default_name_130 (source firewall.address6.name firewall.addrgrp6.name)"
+ name: "default_name_131 (source firewall.address6.name firewall.addrgrp6.name)"
end_port: "65535"
end_src_port: "65535"
gateway: "enable"
groups:
-
- name: "default_name_135 (source user.group.name)"
+ name: "default_name_136 (source user.group.name)"
hash_mode: "round-robin"
health_check:
-
- name: "default_name_138 (source system.sdwan.health-check.name)"
+ name: "default_name_139 (source system.sdwan.health-check.name)"
hold_down_time: "0"
- id: "140"
+ id: "141"
input_device:
-
- name: "default_name_142 (source system.interface.name)"
+ name: "default_name_143 (source system.interface.name)"
input_device_negate: "enable"
input_zone:
-
- name: "default_name_145 (source system.sdwan.zone.name)"
+ name: "default_name_146 (source system.sdwan.zone.name)"
internet_service: "enable"
internet_service_app_ctrl:
-
- id: "148"
+ id: "149"
internet_service_app_ctrl_category:
-
- id: "150"
+ id: "151"
internet_service_app_ctrl_group:
-
- name: "default_name_152 (source application.group.name)"
+ name: "default_name_153 (source application.group.name)"
internet_service_custom:
-
- name: "default_name_154 (source firewall.internet-service-custom.name)"
+ name: "default_name_155 (source firewall.internet-service-custom.name)"
internet_service_custom_group:
-
- name: "default_name_156 (source firewall.internet-service-custom-group.name)"
+ name: "default_name_157 (source firewall.internet-service-custom-group.name)"
internet_service_group:
-
- name: "default_name_158 (source firewall.internet-service-group.name)"
+ name: "default_name_159 (source firewall.internet-service-group.name)"
internet_service_name:
-
- name: "default_name_160 (source firewall.internet-service-name.name)"
+ name: "default_name_161 (source firewall.internet-service-name.name)"
jitter_weight: "0"
latency_weight: "0"
link_cost_factor: "latency"
@@ -1404,7 +1428,7 @@ EXAMPLES = """
load_balance: "enable"
minimum_sla_meet_members: "0"
mode: "auto"
- name: "default_name_168"
+ name: "default_name_169"
packet_loss_weight: "0"
passive_measurement: "enable"
priority_members:
@@ -1412,26 +1436,27 @@ EXAMPLES = """
seq_num: "<you_own_value>"
priority_zone:
-
- name: "default_name_174 (source system.sdwan.zone.name)"
+ name: "default_name_175 (source system.sdwan.zone.name)"
protocol: "0"
quality_link: "0"
role: "standalone"
route_tag: "0"
shortcut: "enable"
+ shortcut_priority: "enable"
shortcut_stickiness: "enable"
sla:
-
health_check: "<your_own_value> (source system.sdwan.health-check.name)"
- id: "183"
+ id: "185"
sla_compare_method: "order"
sla_stickiness: "enable"
src:
-
- name: "default_name_187 (source firewall.address.name firewall.addrgrp.name)"
+ name: "default_name_189 (source firewall.address.name firewall.addrgrp.name)"
src_negate: "enable"
src6:
-
- name: "default_name_190 (source firewall.address6.name firewall.addrgrp6.name)"
+ name: "default_name_192 (source firewall.address6.name firewall.addrgrp6.name)"
standalone_action: "enable"
start_port: "1"
start_src_port: "1"
@@ -1442,14 +1467,16 @@ EXAMPLES = """
use_shortcut_sla: "enable"
users:
-
- name: "default_name_200 (source user.local.name)"
+ name: "default_name_202 (source user.local.name)"
zone_mode: "enable"
speedtest_bypass_routing: "disable"
status: "disable"
zone:
-
+ advpn_health_check: "<your_own_value> (source system.sdwan.health-check.name)"
+ advpn_select: "enable"
minimum_sla_meet_members: "1"
- name: "default_name_206"
+ name: "default_name_210"
service_sla_tie_break: "cfg-order"
"""
@@ -1609,9 +1636,10 @@ def system_sdwan(data, fos):
vdom = data["vdom"]
system_sdwan_data = data["system_sdwan"]
system_sdwan_data = flatten_multilists_attributes(system_sdwan_data)
- filtered_data = underscore_to_hyphen(filter_system_sdwan_data(system_sdwan_data))
+ filtered_data = filter_system_sdwan_data(system_sdwan_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "sdwan", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sdwan", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -1705,6 +1733,12 @@ versioned_schema = {
"type": "string",
"required": True,
},
+ "advpn_select": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "advpn_health_check": {"v_range": [["v7.4.2", ""]], "type": "string"},
"service_sla_tie_break": {
"v_range": [["v6.4.4", ""]],
"type": "string",
@@ -1752,6 +1786,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
+ "transport_group": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"comment": {"v_range": [["v6.4.0", ""]], "type": "string"},
},
"v_range": [["v6.4.0", ""]],
@@ -2059,6 +2094,15 @@ versioned_schema = {
{"value": "bibandwidth"},
],
},
+ "shortcut_priority": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "enable"},
+ {"value": "disable"},
+ {"value": "auto"},
+ ],
+ },
"role": {
"v_range": [["v6.4.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_helper.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_helper.py
index 3d935af75..c4f1ad9da 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_helper.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_helper.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -262,9 +262,8 @@ def system_session_helper(data, fos, check_mode=False):
state = data["state"]
system_session_helper_data = data["system_session_helper"]
- filtered_data = underscore_to_hyphen(
- filter_system_session_helper_data(system_session_helper_data)
- )
+ filtered_data = filter_system_session_helper_data(system_session_helper_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -328,7 +327,7 @@ def system_session_helper(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "session-helper", data=filtered_data, vdom=vdom)
+ return fos.set("system", "session-helper", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -393,19 +392,35 @@ versioned_schema = {
{"value": "mgcp"},
{
"value": "gtp-c",
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "gtp-u",
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "gtp-b",
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
{
"value": "pfcp",
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v7.0.1", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
},
],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_ttl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_ttl.py
index dbd110448..5ba1bb780 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_ttl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_session_ttl.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -105,7 +105,7 @@ options:
type: int
refresh_direction:
description:
- - 'Refresh direction: Both, outgoing, incoming'
+ - Configure refresh direction.
type: str
choices:
- 'both'
@@ -245,11 +245,10 @@ def underscore_to_hyphen(data):
def system_session_ttl(data, fos):
vdom = data["vdom"]
system_session_ttl_data = data["system_session_ttl"]
- filtered_data = underscore_to_hyphen(
- filter_system_session_ttl_data(system_session_ttl_data)
- )
+ filtered_data = filter_system_session_ttl_data(system_session_ttl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "session-ttl", data=filtered_data, vdom=vdom)
+ return fos.set("system", "session-ttl", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_settings.py
index a84108d63..f8c0e0214 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -831,6 +831,10 @@ options:
choices:
- 'enable'
- 'disable'
+ ike_tcp_port:
+ description:
+ - TCP port for IKE/IPsec traffic .
+ type: int
implicit_allow_dns:
description:
- Enable/disable implicitly allowing DNS traffic.
@@ -966,6 +970,13 @@ options:
choices:
- 'enable'
- 'disable'
+ policy_offload_level:
+ description:
+ - Configure firewall policy offload level.
+ type: str
+ choices:
+ - 'disable'
+ - 'dos-offload'
prp_trailer_action:
description:
- Enable/disable action to take on PRP trailer.
@@ -1225,6 +1236,7 @@ EXAMPLES = """
ike_port: "500"
ike_quick_crash_detect: "enable"
ike_session_resume: "enable"
+ ike_tcp_port: "4500"
implicit_allow_dns: "enable"
inspection_mode: "proxy"
internet_service_database_cache: "disable"
@@ -1247,6 +1259,7 @@ EXAMPLES = """
ngfw_mode: "profile-based"
opmode: "nat"
pfcp_monitor_mode: "enable"
+ policy_offload_level: "disable"
prp_trailer_action: "enable"
sccp_port: "2000"
sctp_session_without_init: "enable"
@@ -1463,6 +1476,7 @@ def filter_system_settings_data(json):
"ike_port",
"ike_quick_crash_detect",
"ike_session_resume",
+ "ike_tcp_port",
"implicit_allow_dns",
"inspection_mode",
"internet_service_database_cache",
@@ -1485,6 +1499,7 @@ def filter_system_settings_data(json):
"ngfw_mode",
"opmode",
"pfcp_monitor_mode",
+ "policy_offload_level",
"prp_trailer_action",
"sccp_port",
"sctp_session_without_init",
@@ -1568,11 +1583,10 @@ def system_settings(data, fos):
vdom = data["vdom"]
system_settings_data = data["system_settings"]
system_settings_data = flatten_multilists_attributes(system_settings_data)
- filtered_data = underscore_to_hyphen(
- filter_system_settings_data(system_settings_data)
- )
+ filtered_data = filter_system_settings_data(system_settings_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("system", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -1979,9 +1993,12 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"gui_wanopt_cache": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable", "v_range": [["v6.0.0", ""]]},
+ {"value": "disable", "v_range": [["v6.0.0", ""]]},
+ ],
},
"gui_explicit_proxy": {
"v_range": [["v6.0.0", ""]],
@@ -2185,6 +2202,7 @@ versioned_schema = {
"options": [{"value": "with-space"}, {"value": "no-space"}],
},
"ike_port": {"v_range": [["v7.0.0", ""]], "type": "integer"},
+ "ike_tcp_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"ike_policy_route": {
"v_range": [["v7.0.2", ""]],
"type": "string",
@@ -2235,28 +2253,33 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
- "gui_endpoint_control": {
- "v_range": [["v6.0.0", "v7.2.4"]],
+ "gtp_asym_fgsp": {
+ "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "gtp_monitor_mode": {
+ "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "gui_endpoint_control_advanced": {
- "v_range": [["v6.0.0", "v7.2.4"]],
+ "pfcp_monitor_mode": {
+ "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "gtp_asym_fgsp": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "policy_offload_level": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
"type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
+ "options": [{"value": "disable"}, {"value": "dos-offload"}],
},
- "gtp_monitor_mode": {
- "v_range": [["v6.2.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "gui_endpoint_control": {
+ "v_range": [["v6.0.0", "v7.2.4"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "pfcp_monitor_mode": {
- "v_range": [["v7.0.1", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "gui_endpoint_control_advanced": {
+ "v_range": [["v6.0.0", "v7.2.4"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sflow.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sflow.py
index d44010cf0..5a13d0c5f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sflow.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sflow.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -89,6 +89,42 @@ options:
- UDP port number used for sending sFlow datagrams (configure only if required by your sFlow collector or your network configuration) (0 -
65535).
type: int
+ collectors:
+ description:
+ - sFlow collectors.
+ type: list
+ elements: dict
+ suboptions:
+ collector_ip:
+ description:
+ - IP addresses of the sFlow collectors that sFlow agents added to interfaces in this VDOM send sFlow datagrams to.
+ type: str
+ collector_port:
+ description:
+ - UDP port number used for sending sFlow datagrams (configure only if required by your sFlow collector or your network
+ configuration) (0 - 65535).
+ type: int
+ id:
+ description:
+ - ID. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ interface:
+ description:
+ - Specify outgoing interface to reach server. Source system.interface.name.
+ type: str
+ interface_select_method:
+ description:
+ - Specify how to select outgoing interface to reach server.
+ type: str
+ choices:
+ - 'auto'
+ - 'sdwan'
+ - 'specify'
+ source_ip:
+ description:
+ - Source IP address for sFlow agent.
+ type: str
interface:
description:
- Specify outgoing interface to reach server. Source system.interface.name.
@@ -114,6 +150,14 @@ EXAMPLES = """
system_sflow:
collector_ip: "<your_own_value>"
collector_port: "6343"
+ collectors:
+ -
+ collector_ip: "<your_own_value>"
+ collector_port: "6343"
+ id: "8"
+ interface: "<your_own_value> (source system.interface.name)"
+ interface_select_method: "auto"
+ source_ip: "84.230.14.43"
interface: "<your_own_value> (source system.interface.name)"
interface_select_method: "auto"
source_ip: "84.230.14.43"
@@ -202,6 +246,7 @@ def filter_system_sflow_data(json):
option_list = [
"collector_ip",
"collector_port",
+ "collectors",
"interface",
"interface_select_method",
"source_ip",
@@ -233,9 +278,10 @@ def underscore_to_hyphen(data):
def system_sflow(data, fos):
vdom = data["vdom"]
system_sflow_data = data["system_sflow"]
- filtered_data = underscore_to_hyphen(filter_system_sflow_data(system_sflow_data))
+ filtered_data = filter_system_sflow_data(system_sflow_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "sflow", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sflow", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -270,15 +316,40 @@ versioned_schema = {
"v_range": [["v6.0.0", ""]],
"type": "dict",
"children": {
- "collector_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "collector_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "source_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "collectors": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "id": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ "required": True,
+ },
+ "collector_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "collector_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "source_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "interface_select_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "auto"},
+ {"value": "sdwan"},
+ {"value": "specify"},
+ ],
+ },
+ "interface": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "collector_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
+ "collector_port": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "integer"},
+ "source_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
"interface_select_method": {
- "v_range": [["v7.0.1", ""]],
+ "v_range": [["v7.0.1", "v7.4.1"]],
"type": "string",
"options": [{"value": "auto"}, {"value": "sdwan"}, {"value": "specify"}],
},
- "interface": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "interface": {"v_range": [["v7.0.1", "v7.4.1"]], "type": "string"},
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sit_tunnel.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sit_tunnel.py
index ce3bc8c7e..ed12b4bb3 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sit_tunnel.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sit_tunnel.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -269,9 +269,8 @@ def system_sit_tunnel(data, fos, check_mode=False):
state = data["state"]
system_sit_tunnel_data = data["system_sit_tunnel"]
- filtered_data = underscore_to_hyphen(
- filter_system_sit_tunnel_data(system_sit_tunnel_data)
- )
+ filtered_data = filter_system_sit_tunnel_data(system_sit_tunnel_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -335,7 +334,7 @@ def system_sit_tunnel(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "sit-tunnel", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sit-tunnel", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "sit-tunnel", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_smc_ntp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_smc_ntp.py
index c75ed598b..040149504 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_smc_ntp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_smc_ntp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -117,13 +117,13 @@ EXAMPLES = """
fortinet.fortios.fortios_system_smc_ntp:
vdom: "{{ vdom }}"
system_smc_ntp:
- channel: "32767"
+ channel: "5"
ntpserver:
-
id: "5"
server: "192.168.100.40"
ntpsync: "enable"
- syncinterval: "32767"
+ syncinterval: "60"
"""
RETURN = """
@@ -234,11 +234,10 @@ def underscore_to_hyphen(data):
def system_smc_ntp(data, fos):
vdom = data["vdom"]
system_smc_ntp_data = data["system_smc_ntp"]
- filtered_data = underscore_to_hyphen(
- filter_system_smc_ntp_data(system_smc_ntp_data)
- )
+ filtered_data = filter_system_smc_ntp_data(system_smc_ntp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "smc-ntp", data=filtered_data, vdom=vdom)
+ return fos.set("system", "smc-ntp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -270,28 +269,37 @@ def fortios_system(data, fos):
versioned_schema = {
- "v_range": [["v6.2.3", "v6.2.3"]],
+ "v_range": [["v6.2.3", "v6.2.3"], ["v7.4.2", "v7.4.2"]],
"type": "dict",
"children": {
"ntpsync": {
- "v_range": [["v6.2.3", "v6.2.3"]],
+ "v_range": [["v6.2.3", "v6.2.3"], ["v7.4.2", "v7.4.2"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "syncinterval": {"v_range": [["v6.2.3", "v6.2.3"]], "type": "integer"},
- "channel": {"v_range": [["v6.2.3", "v6.2.3"]], "type": "integer"},
+ "syncinterval": {
+ "v_range": [["v6.2.3", "v6.2.3"], ["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
+ "channel": {
+ "v_range": [["v6.2.3", "v6.2.3"], ["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ },
"ntpserver": {
"type": "list",
"elements": "dict",
"children": {
"id": {
- "v_range": [["v6.2.3", "v6.2.3"]],
+ "v_range": [["v6.2.3", "v6.2.3"], ["v7.4.2", "v7.4.2"]],
"type": "integer",
"required": True,
},
- "server": {"v_range": [["v6.2.3", "v6.2.3"]], "type": "string"},
+ "server": {
+ "v_range": [["v6.2.3", "v6.2.3"], ["v7.4.2", "v7.4.2"]],
+ "type": "string",
+ },
},
- "v_range": [["v6.2.3", "v6.2.3"]],
+ "v_range": [["v6.2.3", "v6.2.3"], ["v7.4.2", "v7.4.2"]],
},
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sms_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sms_server.py
index 536c27fc1..aa46716b4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sms_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sms_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -230,9 +230,8 @@ def system_sms_server(data, fos, check_mode=False):
state = data["state"]
system_sms_server_data = data["system_sms_server"]
- filtered_data = underscore_to_hyphen(
- filter_system_sms_server_data(system_sms_server_data)
- )
+ filtered_data = filter_system_sms_server_data(system_sms_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -296,7 +295,7 @@ def system_sms_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "sms-server", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sms-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "sms-server", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_community.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_community.py
index 8bfafbf15..f9065e08f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_community.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_community.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -138,8 +138,9 @@ options:
- 'ospf-virtnbr-state-change'
- 'temperature-high'
- 'voltage-alert'
- - 'power-supply-failure'
+ - 'power-supply'
- 'fan-failure'
+ - 'power-supply-failure'
hosts:
description:
- Configure IPv4 SNMP managers (hosts).
@@ -505,9 +506,8 @@ def system_snmp_community(data, fos, check_mode=False):
system_snmp_community_data = flatten_multilists_attributes(
system_snmp_community_data
)
- filtered_data = underscore_to_hyphen(
- filter_system_snmp_community_data(system_snmp_community_data)
- )
+ filtered_data = filter_system_snmp_community_data(system_snmp_community_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -571,7 +571,7 @@ def system_snmp_community(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.snmp", "community", data=filtered_data, vdom=vdom)
+ return fos.set("system.snmp", "community", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -752,8 +752,9 @@ versioned_schema = {
{"value": "ospf-virtnbr-state-change", "v_range": [["v7.0.0", ""]]},
{"value": "temperature-high"},
{"value": "voltage-alert"},
- {"value": "power-supply-failure"},
+ {"value": "power-supply", "v_range": [["v7.4.2", ""]]},
{"value": "fan-failure"},
+ {"value": "power-supply-failure", "v_range": [["v6.0.0", "v7.4.1"]]},
],
"multiple_values": True,
"elements": "str",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_mib_view.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_mib_view.py
index 91e65b63a..90f8c0838 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_mib_view.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_mib_view.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -259,12 +259,11 @@ def system_snmp_mib_view(data, fos):
system_snmp_mib_view_data = data["system_snmp_mib_view"]
system_snmp_mib_view_data = flatten_multilists_attributes(system_snmp_mib_view_data)
- filtered_data = underscore_to_hyphen(
- filter_system_snmp_mib_view_data(system_snmp_mib_view_data)
- )
+ filtered_data = filter_system_snmp_mib_view_data(system_snmp_mib_view_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system.snmp", "mib-view", data=filtered_data, vdom=vdom)
+ return fos.set("system.snmp", "mib-view", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_sysinfo.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_sysinfo.py
index 62ad47407..e3c9c7518 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_sysinfo.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_sysinfo.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -111,6 +111,14 @@ options:
choices:
- 'enable'
- 'disable'
+ trap_free_memory_threshold:
+ description:
+ - Free memory usage when trap is sent.
+ type: int
+ trap_freeable_memory_threshold:
+ description:
+ - Freeable memory usage when trap is sent.
+ type: int
trap_high_cpu_threshold:
description:
- CPU usage when trap is sent.
@@ -136,6 +144,8 @@ EXAMPLES = """
engine_id_type: "text"
location: "<your_own_value>"
status: "enable"
+ trap_free_memory_threshold: "5"
+ trap_freeable_memory_threshold: "60"
trap_high_cpu_threshold: "80"
trap_log_full_threshold: "90"
trap_low_memory_threshold: "80"
@@ -228,6 +238,8 @@ def filter_system_snmp_sysinfo_data(json):
"engine_id_type",
"location",
"status",
+ "trap_free_memory_threshold",
+ "trap_freeable_memory_threshold",
"trap_high_cpu_threshold",
"trap_log_full_threshold",
"trap_low_memory_threshold",
@@ -259,11 +271,10 @@ def underscore_to_hyphen(data):
def system_snmp_sysinfo(data, fos):
vdom = data["vdom"]
system_snmp_sysinfo_data = data["system_snmp_sysinfo"]
- filtered_data = underscore_to_hyphen(
- filter_system_snmp_sysinfo_data(system_snmp_sysinfo_data)
- )
+ filtered_data = filter_system_snmp_sysinfo_data(system_snmp_sysinfo_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system.snmp", "sysinfo", data=filtered_data, vdom=vdom)
+ return fos.set("system.snmp", "sysinfo", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -315,6 +326,11 @@ versioned_schema = {
"trap_high_cpu_threshold": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"trap_low_memory_threshold": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"trap_log_full_threshold": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "trap_free_memory_threshold": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "trap_freeable_memory_threshold": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ },
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_user.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_user.py
index cdc82996f..2d81f9d0f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_user.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_snmp_user.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -151,8 +151,9 @@ options:
- 'ospf-virtnbr-state-change'
- 'temperature-high'
- 'voltage-alert'
- - 'power-supply-failure'
+ - 'power-supply'
- 'fan-failure'
+ - 'power-supply-failure'
ha_direct:
description:
- Enable/disable direct management of HA cluster members.
@@ -458,9 +459,8 @@ def system_snmp_user(data, fos, check_mode=False):
system_snmp_user_data = data["system_snmp_user"]
system_snmp_user_data = flatten_multilists_attributes(system_snmp_user_data)
- filtered_data = underscore_to_hyphen(
- filter_system_snmp_user_data(system_snmp_user_data)
- )
+ filtered_data = filter_system_snmp_user_data(system_snmp_user_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -524,7 +524,7 @@ def system_snmp_user(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system.snmp", "user", data=filtered_data, vdom=vdom)
+ return fos.set("system.snmp", "user", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system.snmp", "user", mkey=filtered_data["name"], vdom=vdom)
@@ -652,8 +652,9 @@ versioned_schema = {
{"value": "ospf-virtnbr-state-change", "v_range": [["v7.0.0", ""]]},
{"value": "temperature-high"},
{"value": "voltage-alert"},
- {"value": "power-supply-failure"},
+ {"value": "power-supply", "v_range": [["v7.4.2", ""]]},
{"value": "fan-failure"},
+ {"value": "power-supply-failure", "v_range": [["v6.0.0", "v7.4.1"]]},
],
"multiple_values": True,
"elements": "str",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_schedule.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_schedule.py
index abb2c73ed..b59f55e7c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_schedule.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_schedule.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -88,6 +88,10 @@ options:
default: null
type: dict
suboptions:
+ ctrl_port:
+ description:
+ - Port of the controller to get access token.
+ type: int
diffserv:
description:
- DSCP used for speed test.
@@ -127,6 +131,10 @@ options:
description:
- Speed test server name.
type: str
+ server_port:
+ description:
+ - Port of the server to run speed test.
+ type: int
status:
description:
- Enable/disable scheduled speed test.
@@ -164,6 +172,15 @@ options:
description:
- Minimum uploading bandwidth (kbps) to be considered effective.
type: int
+ update_shaper:
+ description:
+ - Set egress shaper based on the test result.
+ type: str
+ choices:
+ - 'disable'
+ - 'local'
+ - 'remote'
+ - 'both'
"""
EXAMPLES = """
@@ -173,14 +190,16 @@ EXAMPLES = """
state: "present"
access_token: "<your_own_value>"
system_speed_test_schedule:
+ ctrl_port: "5200"
diffserv: "<your_own_value>"
dynamic_server: "disable"
interface: "<your_own_value> (source system.interface.name)"
mode: "UDP"
schedules:
-
- name: "default_name_8 (source firewall.schedule.recurring.name)"
+ name: "default_name_9 (source firewall.schedule.recurring.name)"
server_name: "<your_own_value>"
+ server_port: "5201"
status: "disable"
update_inbandwidth: "disable"
update_inbandwidth_maximum: "0"
@@ -188,6 +207,7 @@ EXAMPLES = """
update_outbandwidth: "disable"
update_outbandwidth_maximum: "0"
update_outbandwidth_minimum: "0"
+ update_shaper: "disable"
"""
RETURN = """
@@ -271,12 +291,14 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post
def filter_system_speed_test_schedule_data(json):
option_list = [
+ "ctrl_port",
"diffserv",
"dynamic_server",
"interface",
"mode",
"schedules",
"server_name",
+ "server_port",
"status",
"update_inbandwidth",
"update_inbandwidth_maximum",
@@ -284,6 +306,7 @@ def filter_system_speed_test_schedule_data(json):
"update_outbandwidth",
"update_outbandwidth_maximum",
"update_outbandwidth_minimum",
+ "update_shaper",
]
json = remove_invalid_fields(json)
@@ -315,12 +338,13 @@ def system_speed_test_schedule(data, fos):
state = data["state"]
system_speed_test_schedule_data = data["system_speed_test_schedule"]
- filtered_data = underscore_to_hyphen(
- filter_system_speed_test_schedule_data(system_speed_test_schedule_data)
+ filtered_data = filter_system_speed_test_schedule_data(
+ system_speed_test_schedule_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system", "speed-test-schedule", data=filtered_data, vdom=vdom)
+ return fos.set("system", "speed-test-schedule", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -394,6 +418,18 @@ versioned_schema = {
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
+ "ctrl_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "server_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "update_shaper": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "disable"},
+ {"value": "local"},
+ {"value": "remote"},
+ {"value": "both"},
+ ],
+ },
"update_inbandwidth": {
"v_range": [["v7.0.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_server.py
index 64cfa6c54..f14ca9a4d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -279,9 +279,8 @@ def system_speed_test_server(data, fos, check_mode=False):
state = data["state"]
system_speed_test_server_data = data["system_speed_test_server"]
- filtered_data = underscore_to_hyphen(
- filter_system_speed_test_server_data(system_speed_test_server_data)
- )
+ filtered_data = filter_system_speed_test_server_data(system_speed_test_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -345,7 +344,7 @@ def system_speed_test_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "speed-test-server", data=filtered_data, vdom=vdom)
+ return fos.set("system", "speed-test-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_setting.py
index a5536c3a6..c8f999b63 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_speed_test_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -208,11 +208,12 @@ def underscore_to_hyphen(data):
def system_speed_test_setting(data, fos):
vdom = data["vdom"]
system_speed_test_setting_data = data["system_speed_test_setting"]
- filtered_data = underscore_to_hyphen(
- filter_system_speed_test_setting_data(system_speed_test_setting_data)
+ filtered_data = filter_system_speed_test_setting_data(
+ system_speed_test_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "speed-test-setting", data=filtered_data, vdom=vdom)
+ return fos.set("system", "speed-test-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_admin.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_admin.py
index 392ea09b6..5f9292784 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_admin.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_admin.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -497,9 +497,8 @@ def system_sso_admin(data, fos, check_mode=False):
state = data["state"]
system_sso_admin_data = data["system_sso_admin"]
- filtered_data = underscore_to_hyphen(
- filter_system_sso_admin_data(system_sso_admin_data)
- )
+ filtered_data = filter_system_sso_admin_data(system_sso_admin_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -563,7 +562,7 @@ def system_sso_admin(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "sso-admin", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sso-admin", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "sso-admin", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_forticloud_admin.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_forticloud_admin.py
index 4f23eb793..2650b8265 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_forticloud_admin.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_forticloud_admin.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,12 +235,13 @@ def system_sso_forticloud_admin(data, fos):
state = data["state"]
system_sso_forticloud_admin_data = data["system_sso_forticloud_admin"]
- filtered_data = underscore_to_hyphen(
- filter_system_sso_forticloud_admin_data(system_sso_forticloud_admin_data)
+ filtered_data = filter_system_sso_forticloud_admin_data(
+ system_sso_forticloud_admin_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("system", "sso-forticloud-admin", data=filtered_data, vdom=vdom)
+ return fos.set("system", "sso-forticloud-admin", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_fortigate_cloud_admin.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_fortigate_cloud_admin.py
index 5dfcaa18e..8d9f3fd5d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_fortigate_cloud_admin.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_sso_fortigate_cloud_admin.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,15 +235,14 @@ def system_sso_fortigate_cloud_admin(data, fos):
state = data["state"]
system_sso_fortigate_cloud_admin_data = data["system_sso_fortigate_cloud_admin"]
- filtered_data = underscore_to_hyphen(
- filter_system_sso_fortigate_cloud_admin_data(
- system_sso_fortigate_cloud_admin_data
- )
+ filtered_data = filter_system_sso_fortigate_cloud_admin_data(
+ system_sso_fortigate_cloud_admin_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "system", "sso-fortigate-cloud-admin", data=filtered_data, vdom=vdom
+ "system", "sso-fortigate-cloud-admin", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_standalone_cluster.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_standalone_cluster.py
index 7245b6e94..b7eae9e61 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_standalone_cluster.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_standalone_cluster.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -80,6 +80,13 @@ options:
default: null
type: dict
suboptions:
+ asymmetric_traffic_control:
+ description:
+ - Asymmetric traffic control mode.
+ type: str
+ choices:
+ - 'cps-preferred'
+ - 'strict-anti-replay'
cluster_peer:
description:
- Configure FortiGate Session Life Support Protocol (FGSP) session synchronization.
@@ -232,11 +239,12 @@ EXAMPLES = """
fortinet.fortios.fortios_system_standalone_cluster:
vdom: "{{ vdom }}"
system_standalone_cluster:
+ asymmetric_traffic_control: "cps-preferred"
cluster_peer:
-
down_intfs_before_sess_sync:
-
- name: "default_name_5 (source system.interface.name)"
+ name: "default_name_6 (source system.interface.name)"
hb_interval: "2"
hb_lost_threshold: "10"
ipsec_tunnel_sync: "enable"
@@ -247,7 +255,7 @@ EXAMPLES = """
custom_service:
-
dst_port_range: "<your_own_value>"
- id: "15"
+ id: "16"
src_port_range: "<your_own_value>"
dstaddr: "<your_own_value>"
dstaddr6: "<your_own_value>"
@@ -258,7 +266,7 @@ EXAMPLES = """
sync_id: "<you_own_value>"
syncvd:
-
- name: "default_name_25 (source system.vdom.name)"
+ name: "default_name_26 (source system.vdom.name)"
encryption: "enable"
group_member_id: "0"
layer2_connection: "available"
@@ -348,6 +356,7 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post
def filter_system_standalone_cluster_data(json):
option_list = [
+ "asymmetric_traffic_control",
"cluster_peer",
"encryption",
"group_member_id",
@@ -415,11 +424,12 @@ def system_standalone_cluster(data, fos):
system_standalone_cluster_data = flatten_multilists_attributes(
system_standalone_cluster_data
)
- filtered_data = underscore_to_hyphen(
- filter_system_standalone_cluster_data(system_standalone_cluster_data)
+ filtered_data = filter_system_standalone_cluster_data(
+ system_standalone_cluster_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "standalone-cluster", data=filtered_data, vdom=vdom)
+ return fos.set("system", "standalone-cluster", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -475,6 +485,11 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"psksecret": {"v_range": [["v6.4.0", ""]], "type": "string"},
+ "asymmetric_traffic_control": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "cps-preferred"}, {"value": "strict-anti-replay"}],
+ },
"cluster_peer": {
"type": "list",
"elements": "dict",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_storage.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_storage.py
index ae79460dc..2bb2aec92 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_storage.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_storage.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -289,9 +289,8 @@ def system_storage(data, fos, check_mode=False):
state = data["state"]
system_storage_data = data["system_storage"]
- filtered_data = underscore_to_hyphen(
- filter_system_storage_data(system_storage_data)
- )
+ filtered_data = filter_system_storage_data(system_storage_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -355,7 +354,7 @@ def system_storage(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "storage", data=filtered_data, vdom=vdom)
+ return fos.set("system", "storage", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "storage", mkey=filtered_data["name"], vdom=vdom)
@@ -414,12 +413,19 @@ versioned_schema = {
"usage": {
"v_range": [["v6.0.0", ""]],
"type": "string",
- "options": [{"value": "log"}, {"value": "wanopt"}],
+ "options": [
+ {"value": "log"},
+ {"value": "wanopt", "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]]},
+ ],
},
"wanopt_mode": {
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v6.0.0", "v7.4.1"], ["v7.4.3", ""]],
"type": "string",
- "options": [{"value": "mix"}, {"value": "wanopt"}, {"value": "webcache"}],
+ "options": [
+ {"value": "mix", "v_range": [["v6.0.0", ""]]},
+ {"value": "wanopt", "v_range": [["v6.0.0", ""]]},
+ {"value": "webcache", "v_range": [["v6.0.0", ""]]},
+ ],
},
},
"v_range": [["v6.0.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_stp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_stp.py
index 46de753d0..105fa95bd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_stp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_stp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -263,9 +263,10 @@ def underscore_to_hyphen(data):
def system_stp(data, fos):
vdom = data["vdom"]
system_stp_data = data["system_stp"]
- filtered_data = underscore_to_hyphen(filter_system_stp_data(system_stp_data))
+ filtered_data = filter_system_stp_data(system_stp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "stp", data=filtered_data, vdom=vdom)
+ return fos.set("system", "stp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -297,7 +298,12 @@ def fortios_system(data, fos):
versioned_schema = {
- "v_range": [["v6.0.0", "v6.2.7"], ["v6.4.1", "v7.0.12"], ["v7.2.1", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v6.2.7"],
+ ["v6.4.1", "v7.0.12"],
+ ["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
+ ],
"type": "dict",
"children": {
"switch_priority": {
@@ -305,6 +311,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
"options": [
@@ -330,6 +337,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "integer",
},
@@ -338,6 +346,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "integer",
},
@@ -346,6 +355,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "integer",
},
@@ -354,6 +364,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "integer",
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_switch_interface.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_switch_interface.py
index 0ff1278c3..f235c3843 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_switch_interface.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_switch_interface.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -312,9 +312,8 @@ def system_switch_interface(data, fos, check_mode=False):
state = data["state"]
system_switch_interface_data = data["system_switch_interface"]
- filtered_data = underscore_to_hyphen(
- filter_system_switch_interface_data(system_switch_interface_data)
- )
+ filtered_data = filter_system_switch_interface_data(system_switch_interface_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -378,7 +377,7 @@ def system_switch_interface(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "switch-interface", data=filtered_data, vdom=vdom)
+ return fos.set("system", "switch-interface", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_tos_based_priority.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_tos_based_priority.py
index 33368a318..ccef8852a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_tos_based_priority.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_tos_based_priority.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,9 +242,10 @@ def system_tos_based_priority(data, fos, check_mode=False):
state = data["state"]
system_tos_based_priority_data = data["system_tos_based_priority"]
- filtered_data = underscore_to_hyphen(
- filter_system_tos_based_priority_data(system_tos_based_priority_data)
+ filtered_data = filter_system_tos_based_priority_data(
+ system_tos_based_priority_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -308,7 +309,7 @@ def system_tos_based_priority(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "tos-based-priority", data=filtered_data, vdom=vdom)
+ return fos.set("system", "tos-based-priority", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom.py
index b7a9df6f2..b16f4428c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -245,7 +245,8 @@ def system_vdom(data, fos, check_mode=False):
state = data["state"]
system_vdom_data = data["system_vdom"]
- filtered_data = underscore_to_hyphen(filter_system_vdom_data(system_vdom_data))
+ filtered_data = filter_system_vdom_data(system_vdom_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -309,7 +310,7 @@ def system_vdom(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "vdom", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "vdom", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_dns.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_dns.py
index 0013e2c28..d23815d0a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_dns.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_dns.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -346,11 +346,10 @@ def system_vdom_dns(data, fos):
vdom = data["vdom"]
system_vdom_dns_data = data["system_vdom_dns"]
system_vdom_dns_data = flatten_multilists_attributes(system_vdom_dns_data)
- filtered_data = underscore_to_hyphen(
- filter_system_vdom_dns_data(system_vdom_dns_data)
- )
+ filtered_data = filter_system_vdom_dns_data(system_vdom_dns_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "vdom-dns", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom-dns", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_exception.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_exception.py
index e87f4a0d6..39659b0dd 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_exception.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_exception.py
@@ -41,7 +41,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -139,6 +139,7 @@ options:
- 'router.policy6'
- 'log.syslogd.setting'
- 'log.syslogd.override-setting'
+ - 'firewall.address'
- 'firewall.vip46'
- 'firewall.vip64'
oid:
@@ -302,9 +303,8 @@ def system_vdom_exception(data, fos, check_mode=False):
state = data["state"]
system_vdom_exception_data = data["system_vdom_exception"]
- filtered_data = underscore_to_hyphen(
- filter_system_vdom_exception_data(system_vdom_exception_data)
- )
+ filtered_data = filter_system_vdom_exception_data(system_vdom_exception_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -368,7 +368,7 @@ def system_vdom_exception(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "vdom-exception", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom-exception", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -479,8 +479,9 @@ versioned_schema = {
{"value": "system.saml", "v_range": []},
{"value": "router.policy", "v_range": []},
{"value": "router.policy6", "v_range": []},
- {"value": "log.syslogd.setting", "v_range": [["v7.4.1", ""]]},
- {"value": "log.syslogd.override-setting", "v_range": [["v7.4.1", ""]]},
+ {"value": "log.syslogd.setting", "v_range": [["v7.4.3", ""]]},
+ {"value": "log.syslogd.override-setting", "v_range": [["v7.4.3", ""]]},
+ {"value": "firewall.address", "v_range": [["v7.4.2", ""]]},
{"value": "firewall.vip46", "v_range": []},
{"value": "firewall.vip64", "v_range": []},
],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_link.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_link.py
index ac2be3ffc..0df38d5f7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_link.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_link.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,9 +242,8 @@ def system_vdom_link(data, fos, check_mode=False):
state = data["state"]
system_vdom_link_data = data["system_vdom_link"]
- filtered_data = underscore_to_hyphen(
- filter_system_vdom_link_data(system_vdom_link_data)
- )
+ filtered_data = filter_system_vdom_link_data(system_vdom_link_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -308,7 +307,7 @@ def system_vdom_link(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "vdom-link", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom-link", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "vdom-link", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_netflow.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_netflow.py
index c684f4179..c09c51e30 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_netflow.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_netflow.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -88,6 +88,41 @@ options:
description:
- NetFlow collector port number.
type: int
+ collectors:
+ description:
+ - Netflow collectors.
+ type: list
+ elements: dict
+ suboptions:
+ collector_ip:
+ description:
+ - Collector IP.
+ type: str
+ collector_port:
+ description:
+ - NetFlow collector port number.
+ type: int
+ id:
+ description:
+ - ID. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ interface:
+ description:
+ - Specify outgoing interface to reach server. Source system.interface.name.
+ type: str
+ interface_select_method:
+ description:
+ - Specify how to select outgoing interface to reach server.
+ type: str
+ choices:
+ - 'auto'
+ - 'sdwan'
+ - 'specify'
+ source_ip:
+ description:
+ - Source IP address for communication with the NetFlow agent.
+ type: str
interface:
description:
- Specify outgoing interface to reach server. Source system.interface.name.
@@ -120,6 +155,14 @@ EXAMPLES = """
system_vdom_netflow:
collector_ip: "<your_own_value>"
collector_port: "2055"
+ collectors:
+ -
+ collector_ip: "<your_own_value>"
+ collector_port: "2055"
+ id: "8"
+ interface: "<your_own_value> (source system.interface.name)"
+ interface_select_method: "auto"
+ source_ip: "84.230.14.43"
interface: "<your_own_value> (source system.interface.name)"
interface_select_method: "auto"
source_ip: "84.230.14.43"
@@ -209,6 +252,7 @@ def filter_system_vdom_netflow_data(json):
option_list = [
"collector_ip",
"collector_port",
+ "collectors",
"interface",
"interface_select_method",
"source_ip",
@@ -241,11 +285,10 @@ def underscore_to_hyphen(data):
def system_vdom_netflow(data, fos):
vdom = data["vdom"]
system_vdom_netflow_data = data["system_vdom_netflow"]
- filtered_data = underscore_to_hyphen(
- filter_system_vdom_netflow_data(system_vdom_netflow_data)
- )
+ filtered_data = filter_system_vdom_netflow_data(system_vdom_netflow_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "vdom-netflow", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom-netflow", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -285,15 +328,40 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "collector_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "collector_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "source_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "collectors": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "id": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ "required": True,
+ },
+ "collector_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "collector_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "source_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "interface_select_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "auto"},
+ {"value": "sdwan"},
+ {"value": "specify"},
+ ],
+ },
+ "interface": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "collector_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
+ "collector_port": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "integer"},
+ "source_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
"interface_select_method": {
- "v_range": [["v7.0.1", ""]],
+ "v_range": [["v7.0.1", "v7.4.1"]],
"type": "string",
"options": [{"value": "auto"}, {"value": "sdwan"}, {"value": "specify"}],
},
- "interface": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "interface": {"v_range": [["v7.0.1", "v7.4.1"]], "type": "string"},
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_property.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_property.py
index 39fe22b9e..0c68e0c27 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_property.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_property.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -412,9 +412,8 @@ def system_vdom_property(data, fos, check_mode=False):
system_vdom_property_data = data["system_vdom_property"]
system_vdom_property_data = flatten_multilists_attributes(system_vdom_property_data)
- filtered_data = underscore_to_hyphen(
- filter_system_vdom_property_data(system_vdom_property_data)
- )
+ filtered_data = filter_system_vdom_property_data(system_vdom_property_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -478,7 +477,7 @@ def system_vdom_property(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "vdom-property", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom-property", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_radius_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_radius_server.py
index 9ac2b7ebc..47e83b712 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_radius_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_radius_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -238,9 +238,10 @@ def system_vdom_radius_server(data, fos, check_mode=False):
state = data["state"]
system_vdom_radius_server_data = data["system_vdom_radius_server"]
- filtered_data = underscore_to_hyphen(
- filter_system_vdom_radius_server_data(system_vdom_radius_server_data)
+ filtered_data = filter_system_vdom_radius_server_data(
+ system_vdom_radius_server_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -304,7 +305,7 @@ def system_vdom_radius_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "vdom-radius-server", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom-radius-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_sflow.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_sflow.py
index dc7fcca9f..f9b29a43e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_sflow.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vdom_sflow.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -91,6 +91,42 @@ options:
- UDP port number used for sending sFlow datagrams (configure only if required by your sFlow collector or your network configuration) (0 -
65535).
type: int
+ collectors:
+ description:
+ - sFlow collectors.
+ type: list
+ elements: dict
+ suboptions:
+ collector_ip:
+ description:
+ - IP addresses of the sFlow collectors that sFlow agents added to interfaces in this VDOM send sFlow datagrams to.
+ type: str
+ collector_port:
+ description:
+ - UDP port number used for sending sFlow datagrams (configure only if required by your sFlow collector or your network
+ configuration) (0 - 65535).
+ type: int
+ id:
+ description:
+ - ID. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ interface:
+ description:
+ - Specify outgoing interface to reach server. Source system.interface.name.
+ type: str
+ interface_select_method:
+ description:
+ - Specify how to select outgoing interface to reach server.
+ type: str
+ choices:
+ - 'auto'
+ - 'sdwan'
+ - 'specify'
+ source_ip:
+ description:
+ - Source IP address for sFlow agent.
+ type: str
interface:
description:
- Specify outgoing interface to reach server. Source system.interface.name.
@@ -124,6 +160,14 @@ EXAMPLES = """
system_vdom_sflow:
collector_ip: "<your_own_value>"
collector_port: "6343"
+ collectors:
+ -
+ collector_ip: "<your_own_value>"
+ collector_port: "6343"
+ id: "8"
+ interface: "<your_own_value> (source system.interface.name)"
+ interface_select_method: "auto"
+ source_ip: "84.230.14.43"
interface: "<your_own_value> (source system.interface.name)"
interface_select_method: "auto"
source_ip: "84.230.14.43"
@@ -213,6 +257,7 @@ def filter_system_vdom_sflow_data(json):
option_list = [
"collector_ip",
"collector_port",
+ "collectors",
"interface",
"interface_select_method",
"source_ip",
@@ -245,11 +290,10 @@ def underscore_to_hyphen(data):
def system_vdom_sflow(data, fos):
vdom = data["vdom"]
system_vdom_sflow_data = data["system_vdom_sflow"]
- filtered_data = underscore_to_hyphen(
- filter_system_vdom_sflow_data(system_vdom_sflow_data)
- )
+ filtered_data = filter_system_vdom_sflow_data(system_vdom_sflow_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "vdom-sflow", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vdom-sflow", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -289,15 +333,40 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "collector_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "collector_port": {"v_range": [["v6.0.0", ""]], "type": "integer"},
- "source_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "collectors": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "id": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ "required": True,
+ },
+ "collector_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "collector_port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "source_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "interface_select_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "auto"},
+ {"value": "sdwan"},
+ {"value": "specify"},
+ ],
+ },
+ "interface": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "collector_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
+ "collector_port": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "integer"},
+ "source_ip": {"v_range": [["v6.0.0", "v7.4.1"]], "type": "string"},
"interface_select_method": {
- "v_range": [["v7.0.1", ""]],
+ "v_range": [["v7.0.1", "v7.4.1"]],
"type": "string",
"options": [{"value": "auto"}, {"value": "sdwan"}, {"value": "specify"}],
},
- "interface": {"v_range": [["v7.0.1", ""]], "type": "string"},
+ "interface": {"v_range": [["v7.0.1", "v7.4.1"]], "type": "string"},
},
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_switch.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_switch.py
index 4a10e969e..acb26336d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_switch.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_switch.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -166,6 +166,10 @@ options:
description:
- SPAN source port.
type: str
+ vlan:
+ description:
+ - VLAN.
+ type: int
"""
EXAMPLES = """
@@ -188,6 +192,7 @@ EXAMPLES = """
span_dest_port: "<your_own_value>"
span_direction: "rx"
span_source_port: "<your_own_value>"
+ vlan: "0"
"""
RETURN = """
@@ -287,6 +292,7 @@ def filter_system_virtual_switch_data(json):
"span_dest_port",
"span_direction",
"span_source_port",
+ "vlan",
]
json = remove_invalid_fields(json)
@@ -318,9 +324,8 @@ def system_virtual_switch(data, fos, check_mode=False):
state = data["state"]
system_virtual_switch_data = data["system_virtual_switch"]
- filtered_data = underscore_to_hyphen(
- filter_system_virtual_switch_data(system_virtual_switch_data)
- )
+ filtered_data = filter_system_virtual_switch_data(system_virtual_switch_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -384,7 +389,7 @@ def system_virtual_switch(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "virtual-switch", data=filtered_data, vdom=vdom)
+ return fos.set("system", "virtual-switch", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -432,6 +437,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
"required": True,
@@ -441,9 +447,11 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
},
+ "vlan": {"v_range": [["v7.4.2", "v7.4.2"]], "type": "integer"},
"port": {
"type": "list",
"elements": "dict",
@@ -453,6 +461,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
"required": True,
@@ -462,6 +471,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
"type": "string",
},
@@ -498,6 +508,7 @@ versioned_schema = {
["v6.0.0", "v6.2.7"],
["v6.4.1", "v7.0.12"],
["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
],
},
"span": {
@@ -535,7 +546,12 @@ versioned_schema = {
"options": [{"value": "rx"}, {"value": "tx"}, {"value": "both"}],
},
},
- "v_range": [["v6.0.0", "v6.2.7"], ["v6.4.1", "v7.0.12"], ["v7.2.1", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v6.2.7"],
+ ["v6.4.1", "v7.0.12"],
+ ["v7.2.1", "v7.2.4"],
+ ["v7.4.2", "v7.4.2"],
+ ],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wan_link.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wan_link.py
index a9a19d396..cfa1b9512 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wan_link.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wan_link.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1139,11 +1139,10 @@ def system_virtual_wan_link(data, fos):
system_virtual_wan_link_data = flatten_multilists_attributes(
system_virtual_wan_link_data
)
- filtered_data = underscore_to_hyphen(
- filter_system_virtual_wan_link_data(system_virtual_wan_link_data)
- )
+ filtered_data = filter_system_virtual_wan_link_data(system_virtual_wan_link_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "virtual-wan-link", data=filtered_data, vdom=vdom)
+ return fos.set("system", "virtual-wan-link", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wire_pair.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wire_pair.py
index 5a9ca9e87..a3a791270 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wire_pair.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_virtual_wire_pair.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -104,6 +104,17 @@ options:
- Virtual-wire-pair name. Must be a unique interface name.
required: true
type: str
+ outer_vlan_id:
+ description:
+ - Outer VLAN ID.
+ type: list
+ elements: dict
+ suboptions:
+ vlanid:
+ description:
+ - VLAN ID (1 - 4094). see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
vlan_filter:
description:
- VLAN ranges to allow
@@ -128,6 +139,9 @@ EXAMPLES = """
-
interface_name: "<your_own_value> (source system.interface.name)"
name: "default_name_5"
+ outer_vlan_id:
+ -
+ vlanid: "<you_own_value>"
vlan_filter: "<your_own_value>"
wildcard_vlan: "enable"
"""
@@ -221,7 +235,7 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.compariso
def filter_system_virtual_wire_pair_data(json):
- option_list = ["member", "name", "vlan_filter", "wildcard_vlan"]
+ option_list = ["member", "name", "outer_vlan_id", "vlan_filter", "wildcard_vlan"]
json = remove_invalid_fields(json)
dictionary = {}
@@ -252,9 +266,8 @@ def system_virtual_wire_pair(data, fos, check_mode=False):
state = data["state"]
system_virtual_wire_pair_data = data["system_virtual_wire_pair"]
- filtered_data = underscore_to_hyphen(
- filter_system_virtual_wire_pair_data(system_virtual_wire_pair_data)
- )
+ filtered_data = filter_system_virtual_wire_pair_data(system_virtual_wire_pair_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -318,7 +331,7 @@ def system_virtual_wire_pair(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "virtual-wire-pair", data=filtered_data, vdom=vdom)
+ return fos.set("system", "virtual-wire-pair", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -382,6 +395,18 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"vlan_filter": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "outer_vlan_id": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "vlanid": {
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ "type": "integer",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", "v7.4.2"]],
+ },
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vne_tunnel.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vne_tunnel.py
index 700a54d68..cb9330daf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vne_tunnel.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vne_tunnel.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -274,11 +274,10 @@ def underscore_to_hyphen(data):
def system_vne_tunnel(data, fos):
vdom = data["vdom"]
system_vne_tunnel_data = data["system_vne_tunnel"]
- filtered_data = underscore_to_hyphen(
- filter_system_vne_tunnel_data(system_vne_tunnel_data)
- )
+ filtered_data = filter_system_vne_tunnel_data(system_vne_tunnel_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("system", "vne-tunnel", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vne-tunnel", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vxlan.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vxlan.py
index 059a20d85..2c4dad558 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vxlan.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_vxlan.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -307,7 +307,8 @@ def system_vxlan(data, fos, check_mode=False):
state = data["state"]
system_vxlan_data = data["system_vxlan"]
- filtered_data = underscore_to_hyphen(filter_system_vxlan_data(system_vxlan_data))
+ filtered_data = filter_system_vxlan_data(system_vxlan_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -371,7 +372,7 @@ def system_vxlan(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "vxlan", data=filtered_data, vdom=vdom)
+ return fos.set("system", "vxlan", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "vxlan", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_wccp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_wccp.py
index f1ca85b99..2891303f7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_wccp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_wccp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -432,7 +432,8 @@ def system_wccp(data, fos, check_mode=False):
system_wccp_data = data["system_wccp"]
system_wccp_data = flatten_multilists_attributes(system_wccp_data)
- filtered_data = underscore_to_hyphen(filter_system_wccp_data(system_wccp_data))
+ filtered_data = filter_system_wccp_data(system_wccp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -496,7 +497,7 @@ def system_wccp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "wccp", data=filtered_data, vdom=vdom)
+ return fos.set("system", "wccp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "wccp", mkey=filtered_data["service-id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_zone.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_zone.py
index f8bd26ce1..9a2669a2f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_zone.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_system_zone.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -288,7 +288,8 @@ def system_zone(data, fos, check_mode=False):
state = data["state"]
system_zone_data = data["system_zone"]
- filtered_data = underscore_to_hyphen(filter_system_zone_data(system_zone_data))
+ filtered_data = filter_system_zone_data(system_zone_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -352,7 +353,7 @@ def system_zone(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("system", "zone", data=filtered_data, vdom=vdom)
+ return fos.set("system", "zone", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("system", "zone", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_adgrp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_adgrp.py
index d2a2ad61b..a2afdb626 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_adgrp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_adgrp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -240,7 +240,8 @@ def user_adgrp(data, fos, check_mode=False):
state = data["state"]
user_adgrp_data = data["user_adgrp"]
- filtered_data = underscore_to_hyphen(filter_user_adgrp_data(user_adgrp_data))
+ filtered_data = filter_user_adgrp_data(user_adgrp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -304,7 +305,7 @@ def user_adgrp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "adgrp", data=filtered_data, vdom=vdom)
+ return fos.set("user", "adgrp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "adgrp", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_certificate.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_certificate.py
index 3b0b72944..2c5625bfb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_certificate.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_certificate.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -247,12 +247,11 @@ def user_certificate(data, fos):
state = data["state"]
user_certificate_data = data["user_certificate"]
- filtered_data = underscore_to_hyphen(
- filter_user_certificate_data(user_certificate_data)
- )
+ filtered_data = filter_user_certificate_data(user_certificate_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("user", "certificate", data=filtered_data, vdom=vdom)
+ return fos.set("user", "certificate", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "certificate", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device.py
index 934b9d290..d94391298 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -333,7 +333,8 @@ def user_device(data, fos, check_mode=False):
state = data["state"]
user_device_data = data["user_device"]
- filtered_data = underscore_to_hyphen(filter_user_device_data(user_device_data))
+ filtered_data = filter_user_device_data(user_device_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -397,7 +398,7 @@ def user_device(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "device", data=filtered_data, vdom=vdom)
+ return fos.set("user", "device", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "device", mkey=filtered_data["alias"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_access_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_access_list.py
index efcd7b71d..a7ba0684c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_access_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_access_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -260,9 +260,8 @@ def user_device_access_list(data, fos, check_mode=False):
state = data["state"]
user_device_access_list_data = data["user_device_access_list"]
- filtered_data = underscore_to_hyphen(
- filter_user_device_access_list_data(user_device_access_list_data)
- )
+ filtered_data = filter_user_device_access_list_data(user_device_access_list_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -326,7 +325,7 @@ def user_device_access_list(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "device-access-list", data=filtered_data, vdom=vdom)
+ return fos.set("user", "device-access-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_category.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_category.py
index 2feb3a050..08567b209 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_category.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_category.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -235,9 +235,8 @@ def user_device_category(data, fos, check_mode=False):
state = data["state"]
user_device_category_data = data["user_device_category"]
- filtered_data = underscore_to_hyphen(
- filter_user_device_category_data(user_device_category_data)
- )
+ filtered_data = filter_user_device_category_data(user_device_category_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -301,7 +300,7 @@ def user_device_category(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "device-category", data=filtered_data, vdom=vdom)
+ return fos.set("user", "device-category", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_group.py
index 30500817d..e0dcdc8bf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_device_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -277,9 +277,8 @@ def user_device_group(data, fos, check_mode=False):
state = data["state"]
user_device_group_data = data["user_device_group"]
- filtered_data = underscore_to_hyphen(
- filter_user_device_group_data(user_device_group_data)
- )
+ filtered_data = filter_user_device_group_data(user_device_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -343,7 +342,7 @@ def user_device_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "device-group", data=filtered_data, vdom=vdom)
+ return fos.set("user", "device-group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "device-group", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_domain_controller.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_domain_controller.py
index c5be70514..b7ba0ed0a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_domain_controller.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_domain_controller.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -417,9 +417,8 @@ def user_domain_controller(data, fos, check_mode=False):
state = data["state"]
user_domain_controller_data = data["user_domain_controller"]
- filtered_data = underscore_to_hyphen(
- filter_user_domain_controller_data(user_domain_controller_data)
- )
+ filtered_data = filter_user_domain_controller_data(user_domain_controller_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -483,7 +482,7 @@ def user_domain_controller(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "domain-controller", data=filtered_data, vdom=vdom)
+ return fos.set("user", "domain-controller", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_exchange.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_exchange.py
index 444f643fb..863370d6b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_exchange.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_exchange.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -335,7 +335,8 @@ def user_exchange(data, fos, check_mode=False):
state = data["state"]
user_exchange_data = data["user_exchange"]
- filtered_data = underscore_to_hyphen(filter_user_exchange_data(user_exchange_data))
+ filtered_data = filter_user_exchange_data(user_exchange_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -399,7 +400,7 @@ def user_exchange(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "exchange", data=filtered_data, vdom=vdom)
+ return fos.set("user", "exchange", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "exchange", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_external_identity_provider.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_external_identity_provider.py
new file mode 100644
index 000000000..05a0f2482
--- /dev/null
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_external_identity_provider.py
@@ -0,0 +1,462 @@
+#!/usr/bin/python
+from __future__ import absolute_import, division, print_function
+
+# Copyright: (c) 2022 Fortinet
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+# 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.
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "status": ["preview"],
+ "supported_by": "community",
+ "metadata_version": "1.1",
+}
+
+DOCUMENTATION = """
+---
+module: fortios_user_external_identity_provider
+short_description: Configure external identity provider in Fortinet's FortiOS and FortiGate.
+description:
+ - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the
+ user to set and modify user feature and external_identity_provider category.
+ Examples include all parameters and values need to be adjusted to datasources before usage.
+ Tested with FOS v6.0.0
+version_added: "2.0.0"
+author:
+ - Link Zheng (@chillancezen)
+ - Jie Xue (@JieX19)
+ - Hongbin Lu (@fgtdev-hblu)
+ - Frank Shen (@frankshen01)
+ - Miguel Angel Munoz (@mamunozgonzalez)
+ - Nicolas Thomas (@thomnico)
+notes:
+ - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
+
+requirements:
+ - ansible>=2.15
+options:
+ access_token:
+ description:
+ - Token-based authentication.
+ Generated from GUI of Fortigate.
+ type: str
+ required: false
+ enable_log:
+ description:
+ - Enable/Disable logging for task.
+ type: bool
+ required: false
+ default: false
+ vdom:
+ description:
+ - Virtual domain, among those defined previously. A vdom is a
+ virtual instance of the FortiGate that can be configured and
+ used as a different unit.
+ type: str
+ default: root
+ member_path:
+ type: str
+ description:
+ - Member attribute path to operate on.
+ - Delimited by a slash character if there are more than one attribute.
+ - Parameter marked with member_path is legitimate for doing member operation.
+ member_state:
+ type: str
+ description:
+ - Add or delete a member under specified attribute path.
+ - When member_state is specified, the state option is ignored.
+ choices:
+ - 'present'
+ - 'absent'
+
+ state:
+ description:
+ - Indicates whether to create or remove the object.
+ type: str
+ required: true
+ choices:
+ - 'present'
+ - 'absent'
+ user_external_identity_provider:
+ description:
+ - Configure external identity provider.
+ default: null
+ type: dict
+ suboptions:
+ group_attr_name:
+ description:
+ - Group attribute name in authentication query.
+ type: str
+ interface:
+ description:
+ - Specify outgoing interface to reach server. Source system.interface.name.
+ type: str
+ interface_select_method:
+ description:
+ - Specify how to select outgoing interface to reach server.
+ type: str
+ choices:
+ - 'auto'
+ - 'sdwan'
+ - 'specify'
+ name:
+ description:
+ - External identity provider name.
+ required: true
+ type: str
+ port:
+ description:
+ - External identity provider service port number (0 to use default).
+ type: int
+ server_identity_check:
+ description:
+ - Enable/disable server"s identity check against its certificate and subject alternative name(s).
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+ source_ip:
+ description:
+ - Use this IPv4/v6 address to connect to the external identity provider.
+ type: str
+ timeout:
+ description:
+ - Connection timeout value in seconds .
+ type: int
+ type:
+ description:
+ - External identity provider type.
+ type: str
+ choices:
+ - 'ms-graph'
+ user_attr_name:
+ description:
+ - User attribute name in authentication query.
+ type: str
+ version:
+ description:
+ - External identity API version.
+ type: str
+ choices:
+ - 'v1.0'
+ - 'beta'
+"""
+
+EXAMPLES = """
+- name: Configure external identity provider.
+ fortinet.fortios.fortios_user_external_identity_provider:
+ vdom: "{{ vdom }}"
+ state: "present"
+ access_token: "<your_own_value>"
+ user_external_identity_provider:
+ group_attr_name: "<your_own_value>"
+ interface: "<your_own_value> (source system.interface.name)"
+ interface_select_method: "auto"
+ name: "default_name_6"
+ port: "0"
+ server_identity_check: "disable"
+ source_ip: "84.230.14.43"
+ timeout: "5"
+ type: "ms-graph"
+ user_attr_name: "<your_own_value>"
+ version: "v1.0"
+"""
+
+RETURN = """
+build:
+ description: Build number of the fortigate image
+ returned: always
+ type: str
+ sample: '1547'
+http_method:
+ description: Last method used to provision the content into FortiGate
+ returned: always
+ type: str
+ sample: 'PUT'
+http_status:
+ description: Last result given by FortiGate on last operation applied
+ returned: always
+ type: str
+ sample: "200"
+mkey:
+ description: Master key (id) used in the last call to FortiGate
+ returned: success
+ type: str
+ sample: "id"
+name:
+ description: Name of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "urlfilter"
+path:
+ description: Path of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "webfilter"
+revision:
+ description: Internal revision number
+ returned: always
+ type: str
+ sample: "17.0.2.10658"
+serial:
+ description: Serial number of the unit
+ returned: always
+ type: str
+ sample: "FGVMEVYYQT3AB5352"
+status:
+ description: Indication of the operation's result
+ returned: always
+ type: str
+ sample: "success"
+vdom:
+ description: Virtual domain used
+ returned: always
+ type: str
+ sample: "root"
+version:
+ description: Version of the FortiGate
+ returned: always
+ type: str
+ sample: "v5.6.3"
+"""
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.connection import Connection
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ FortiOSHandler,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_legacy_fortiosapi,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ schema_to_module_spec,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_schema_versioning,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import (
+ FAIL_SOCKET_MSG,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post_processor import (
+ remove_invalid_fields,
+)
+
+
+def filter_user_external_identity_provider_data(json):
+ option_list = [
+ "group_attr_name",
+ "interface",
+ "interface_select_method",
+ "name",
+ "port",
+ "server_identity_check",
+ "source_ip",
+ "timeout",
+ "type",
+ "user_attr_name",
+ "version",
+ ]
+
+ json = remove_invalid_fields(json)
+ dictionary = {}
+
+ for attribute in option_list:
+ if attribute in json and json[attribute] is not None:
+ dictionary[attribute] = json[attribute]
+
+ return dictionary
+
+
+def underscore_to_hyphen(data):
+ if isinstance(data, list):
+ for i, elem in enumerate(data):
+ data[i] = underscore_to_hyphen(elem)
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[k.replace("_", "-")] = underscore_to_hyphen(v)
+ data = new_data
+
+ return data
+
+
+def user_external_identity_provider(data, fos):
+ vdom = data["vdom"]
+
+ state = data["state"]
+
+ user_external_identity_provider_data = data["user_external_identity_provider"]
+ filtered_data = filter_user_external_identity_provider_data(
+ user_external_identity_provider_data
+ )
+ converted_data = underscore_to_hyphen(filtered_data)
+
+ if state == "present" or state is True:
+ return fos.set(
+ "user", "external-identity-provider", data=converted_data, vdom=vdom
+ )
+
+ elif state == "absent":
+ return fos.delete(
+ "user", "external-identity-provider", mkey=filtered_data["name"], vdom=vdom
+ )
+ else:
+ fos._module.fail_json(msg="state must be present or absent!")
+
+
+def is_successful_status(resp):
+ return (
+ "status" in resp
+ and resp["status"] == "success"
+ or "http_status" in resp
+ and resp["http_status"] == 200
+ or "http_method" in resp
+ and resp["http_method"] == "DELETE"
+ and resp["http_status"] == 404
+ )
+
+
+def fortios_user(data, fos):
+ fos.do_member_operation("user", "external-identity-provider")
+ if data["user_external_identity_provider"]:
+ resp = user_external_identity_provider(data, fos)
+ else:
+ fos._module.fail_json(
+ msg="missing task body: %s" % ("user_external_identity_provider")
+ )
+
+ return (
+ not is_successful_status(resp),
+ is_successful_status(resp)
+ and (resp["revision_changed"] if "revision_changed" in resp else True),
+ resp,
+ {},
+ )
+
+
+versioned_schema = {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {"v_range": [["v7.4.2", ""]], "type": "string", "required": True},
+ "type": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "ms-graph"}],
+ },
+ "version": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "v1.0"}, {"value": "beta"}],
+ },
+ "user_attr_name": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "group_attr_name": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "source_ip": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "interface_select_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "auto"}, {"value": "sdwan"}, {"value": "specify"}],
+ },
+ "interface": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "server_identity_check": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "timeout": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ },
+ "v_range": [["v7.4.2", ""]],
+}
+
+
+def main():
+ module_spec = schema_to_module_spec(versioned_schema)
+ mkeyname = "name"
+ fields = {
+ "access_token": {"required": False, "type": "str", "no_log": True},
+ "enable_log": {"required": False, "type": "bool", "default": False},
+ "vdom": {"required": False, "type": "str", "default": "root"},
+ "member_path": {"required": False, "type": "str"},
+ "member_state": {
+ "type": "str",
+ "required": False,
+ "choices": ["present", "absent"],
+ },
+ "state": {"required": True, "type": "str", "choices": ["present", "absent"]},
+ "user_external_identity_provider": {
+ "required": False,
+ "type": "dict",
+ "default": None,
+ "options": {},
+ },
+ }
+ for attribute_name in module_spec["options"]:
+ fields["user_external_identity_provider"]["options"][
+ attribute_name
+ ] = module_spec["options"][attribute_name]
+ if mkeyname and mkeyname == attribute_name:
+ fields["user_external_identity_provider"]["options"][attribute_name][
+ "required"
+ ] = True
+
+ module = AnsibleModule(argument_spec=fields, supports_check_mode=False)
+ check_legacy_fortiosapi(module)
+
+ is_error = False
+ has_changed = False
+ result = None
+ diff = None
+
+ versions_check_result = None
+ if module._socket_path:
+ connection = Connection(module._socket_path)
+ if "access_token" in module.params:
+ connection.set_option("access_token", module.params["access_token"])
+
+ if "enable_log" in module.params:
+ connection.set_option("enable_log", module.params["enable_log"])
+ else:
+ connection.set_option("enable_log", False)
+ fos = FortiOSHandler(connection, module, mkeyname)
+ versions_check_result = check_schema_versioning(
+ fos, versioned_schema, "user_external_identity_provider"
+ )
+
+ is_error, has_changed, result, diff = fortios_user(module.params, fos)
+
+ else:
+ module.fail_json(**FAIL_SOCKET_MSG)
+
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.warn(
+ "Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv"
+ )
+
+ if not is_error:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.exit_json(
+ changed=has_changed,
+ version_check_warning=versions_check_result,
+ meta=result,
+ diff=diff,
+ )
+ else:
+ module.exit_json(changed=has_changed, meta=result, diff=diff)
+ else:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.fail_json(
+ msg="Error in repo",
+ version_check_warning=versions_check_result,
+ meta=result,
+ )
+ else:
+ module.fail_json(msg="Error in repo", meta=result)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fortitoken.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fortitoken.py
index 663db1fc2..cf38ef38a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fortitoken.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fortitoken.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,9 +278,8 @@ def user_fortitoken(data, fos, check_mode=False):
state = data["state"]
user_fortitoken_data = data["user_fortitoken"]
- filtered_data = underscore_to_hyphen(
- filter_user_fortitoken_data(user_fortitoken_data)
- )
+ filtered_data = filter_user_fortitoken_data(user_fortitoken_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -344,7 +343,7 @@ def user_fortitoken(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "fortitoken", data=filtered_data, vdom=vdom)
+ return fos.set("user", "fortitoken", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso.py
index 34dfe8ba8..0306eede8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -431,7 +431,8 @@ def user_fsso(data, fos, check_mode=False):
state = data["state"]
user_fsso_data = data["user_fsso"]
- filtered_data = underscore_to_hyphen(filter_user_fsso_data(user_fsso_data))
+ filtered_data = filter_user_fsso_data(user_fsso_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -495,7 +496,7 @@ def user_fsso(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "fsso", data=filtered_data, vdom=vdom)
+ return fos.set("user", "fsso", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "fsso", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso_polling.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso_polling.py
index ea0e1d3b3..78b8137d5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso_polling.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_fsso_polling.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -319,9 +319,8 @@ def user_fsso_polling(data, fos, check_mode=False):
state = data["state"]
user_fsso_polling_data = data["user_fsso_polling"]
- filtered_data = underscore_to_hyphen(
- filter_user_fsso_polling_data(user_fsso_polling_data)
- )
+ filtered_data = filter_user_fsso_polling_data(user_fsso_polling_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -385,7 +384,7 @@ def user_fsso_polling(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "fsso-polling", data=filtered_data, vdom=vdom)
+ return fos.set("user", "fsso-polling", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "fsso-polling", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_group.py
index 6d57d22e6..fac234854 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -210,7 +210,8 @@ options:
type: int
server_name:
description:
- - Name of remote auth server. Source user.radius.name user.ldap.name user.tacacs+.name user.saml.name.
+ - Name of remote auth server. Source user.radius.name user.ldap.name user.tacacs+.name user.saml.name user
+ .external-identity-provider.name.
type: str
max_accounts:
description:
@@ -218,14 +219,14 @@ options:
type: int
member:
description:
- - Names of users, peers, LDAP severs, or RADIUS servers to add to the user group.
+ - Names of users, peers, LDAP severs, RADIUS servers or external idp servers to add to the user group.
type: list
elements: dict
suboptions:
name:
description:
- Group member name. Source user.peer.name user.local.name user.radius.name user.tacacs+.name user.ldap.name user.saml.name user
- .adgrp.name user.pop3.name user.certificate.name.
+ .external-identity-provider.name user.adgrp.name user.pop3.name user.certificate.name.
required: true
type: str
mobile_phone:
@@ -328,12 +329,13 @@ EXAMPLES = """
-
group_name: "<your_own_value>"
id: "26"
- server_name: "<your_own_value> (source user.radius.name user.ldap.name user.tacacs+.name user.saml.name)"
+ server_name: "<your_own_value> (source user.radius.name user.ldap.name user.tacacs+.name user.saml.name user.external-identity-provider
+ .name)"
max_accounts: "0"
member:
-
- name: "default_name_30 (source user.peer.name user.local.name user.radius.name user.tacacs+.name user.ldap.name user.saml.name user.adgrp
- .name user.pop3.name user.certificate.name)"
+ name: "default_name_30 (source user.peer.name user.local.name user.radius.name user.tacacs+.name user.ldap.name user.saml.name user
+ .external-identity-provider.name user.adgrp.name user.pop3.name user.certificate.name)"
mobile_phone: "disable"
multiple_guest_add: "disable"
name: "default_name_33"
@@ -491,7 +493,8 @@ def user_group(data, fos, check_mode=False):
state = data["state"]
user_group_data = data["user_group"]
- filtered_data = underscore_to_hyphen(filter_user_group_data(user_group_data))
+ filtered_data = filter_user_group_data(user_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -555,7 +558,7 @@ def user_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "group", data=filtered_data, vdom=vdom)
+ return fos.set("user", "group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "group", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_krb_keytab.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_krb_keytab.py
index 0f9a66445..5748a9e19 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_krb_keytab.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_krb_keytab.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -262,9 +262,8 @@ def user_krb_keytab(data, fos, check_mode=False):
state = data["state"]
user_krb_keytab_data = data["user_krb_keytab"]
- filtered_data = underscore_to_hyphen(
- filter_user_krb_keytab_data(user_krb_keytab_data)
- )
+ filtered_data = filter_user_krb_keytab_data(user_krb_keytab_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -328,7 +327,7 @@ def user_krb_keytab(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "krb-keytab", data=filtered_data, vdom=vdom)
+ return fos.set("user", "krb-keytab", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "krb-keytab", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_ldap.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_ldap.py
index bfbf68094..74cf73533 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_ldap.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_ldap.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -556,7 +556,8 @@ def user_ldap(data, fos, check_mode=False):
user_ldap_data = data["user_ldap"]
user_ldap_data = flatten_multilists_attributes(user_ldap_data)
- filtered_data = underscore_to_hyphen(filter_user_ldap_data(user_ldap_data))
+ filtered_data = filter_user_ldap_data(user_ldap_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -620,7 +621,7 @@ def user_ldap(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "ldap", data=filtered_data, vdom=vdom)
+ return fos.set("user", "ldap", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "ldap", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_local.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_local.py
index 31bea9b2a..1bb6b3512 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_local.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_local.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -144,6 +144,10 @@ options:
description:
- IKEv2 Postquantum Preshared Key (ASCII string or hexadecimal encoded with a leading 0x).
type: str
+ qkd_profile:
+ description:
+ - Quantum Key Distribution (QKD) profile. Source vpn.qkd.name.
+ type: str
radius_server:
description:
- Name of RADIUS server with which the user must authenticate. Source user.radius.name.
@@ -249,6 +253,7 @@ EXAMPLES = """
passwd_time: "<your_own_value>"
ppk_identity: "<your_own_value>"
ppk_secret: "<your_own_value>"
+ qkd_profile: "<your_own_value> (source vpn.qkd.name)"
radius_server: "<your_own_value> (source user.radius.name)"
sms_custom_server: "<your_own_value> (source system.sms-server.name)"
sms_phone: "<your_own_value>"
@@ -367,6 +372,7 @@ def filter_user_local_data(json):
"passwd_time",
"ppk_identity",
"ppk_secret",
+ "qkd_profile",
"radius_server",
"sms_custom_server",
"sms_phone",
@@ -406,9 +412,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"tacacs+_server": "tacacs_plus_server"}
+ speciallist = {"tacacs+_server": "tacacs_plus_server"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -417,8 +423,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -434,8 +443,8 @@ def user_local(data, fos, check_mode=False):
state = data["state"]
user_local_data = data["user_local"]
- filtered_data = underscore_to_hyphen(filter_user_local_data(user_local_data))
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_user_local_data(user_local_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
@@ -601,6 +610,7 @@ versioned_schema = {
"auth_concurrent_value": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"ppk_secret": {"v_range": [["v6.0.0", ""]], "type": "string"},
"ppk_identity": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "qkd_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
"username_sensitivity": {
"v_range": [["v7.0.1", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_nac_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_nac_policy.py
index 71476ba49..1aa6178e5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_nac_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_nac_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -410,9 +410,8 @@ def user_nac_policy(data, fos, check_mode=False):
state = data["state"]
user_nac_policy_data = data["user_nac_policy"]
- filtered_data = underscore_to_hyphen(
- filter_user_nac_policy_data(user_nac_policy_data)
- )
+ filtered_data = filter_user_nac_policy_data(user_nac_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -476,7 +475,7 @@ def user_nac_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "nac-policy", data=filtered_data, vdom=vdom)
+ return fos.set("user", "nac-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "nac-policy", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_password_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_password_policy.py
index f82a0cea2..aa8b21bf8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_password_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_password_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -302,9 +302,8 @@ def user_password_policy(data, fos, check_mode=False):
state = data["state"]
user_password_policy_data = data["user_password_policy"]
- filtered_data = underscore_to_hyphen(
- filter_user_password_policy_data(user_password_policy_data)
- )
+ filtered_data = filter_user_password_policy_data(user_password_policy_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -368,7 +367,7 @@ def user_password_policy(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "password-policy", data=filtered_data, vdom=vdom)
+ return fos.set("user", "password-policy", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peer.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peer.py
index 4ad2e1c6f..f7e7d18ea 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peer.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peer.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -148,7 +148,7 @@ options:
type: str
mfa_server:
description:
- - Name of a remote authenticator. Performs client access right check. Source user.ldap.name user.radius.name.
+ - Name of a remote authenticator. Performs client access right check. Source user.radius.name user.ldap.name.
type: str
mfa_username:
description:
@@ -197,7 +197,7 @@ EXAMPLES = """
mandatory_ca_verify: "enable"
mfa_mode: "none"
mfa_password: "<your_own_value>"
- mfa_server: "<your_own_value> (source user.ldap.name user.radius.name)"
+ mfa_server: "<your_own_value> (source user.radius.name user.ldap.name)"
mfa_username: "<your_own_value>"
name: "default_name_15"
ocsp_override_server: "<your_own_value> (source vpn.certificate.ocsp-server.name)"
@@ -344,7 +344,8 @@ def user_peer(data, fos, check_mode=False):
state = data["state"]
user_peer_data = data["user_peer"]
- filtered_data = underscore_to_hyphen(filter_user_peer_data(user_peer_data))
+ filtered_data = filter_user_peer_data(user_peer_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -408,7 +409,7 @@ def user_peer(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "peer", data=filtered_data, vdom=vdom)
+ return fos.set("user", "peer", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "peer", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peergrp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peergrp.py
index 86cdb6669..8d32879d0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peergrp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_peergrp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -239,7 +239,8 @@ def user_peergrp(data, fos, check_mode=False):
state = data["state"]
user_peergrp_data = data["user_peergrp"]
- filtered_data = underscore_to_hyphen(filter_user_peergrp_data(user_peergrp_data))
+ filtered_data = filter_user_peergrp_data(user_peergrp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -303,7 +304,7 @@ def user_peergrp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "peergrp", data=filtered_data, vdom=vdom)
+ return fos.set("user", "peergrp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "peergrp", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_pop3.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_pop3.py
index 13c13cc9e..d6754ae83 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_pop3.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_pop3.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -256,7 +256,8 @@ def user_pop3(data, fos, check_mode=False):
state = data["state"]
user_pop3_data = data["user_pop3"]
- filtered_data = underscore_to_hyphen(filter_user_pop3_data(user_pop3_data))
+ filtered_data = filter_user_pop3_data(user_pop3_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -320,7 +321,7 @@ def user_pop3(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "pop3", data=filtered_data, vdom=vdom)
+ return fos.set("user", "pop3", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "pop3", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_quarantine.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_quarantine.py
index 9c5fdf114..82b8edb38 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_quarantine.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_quarantine.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -271,11 +271,10 @@ def underscore_to_hyphen(data):
def user_quarantine(data, fos):
vdom = data["vdom"]
user_quarantine_data = data["user_quarantine"]
- filtered_data = underscore_to_hyphen(
- filter_user_quarantine_data(user_quarantine_data)
- )
+ filtered_data = filter_user_quarantine_data(user_quarantine_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("user", "quarantine", data=filtered_data, vdom=vdom)
+ return fos.set("user", "quarantine", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_radius.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_radius.py
index 3a71e1236..27a243025 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_radius.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_radius.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -501,6 +501,13 @@ options:
description:
- Switch controller accounting message Framed-IP detection from DHCP snooping (seconds).
type: int
+ switch_controller_nas_ip_dynamic:
+ description:
+ - Enable/Disable switch-controller nas-ip dynamic to dynamically set nas-ip.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
switch_controller_service_type:
description:
- RADIUS service type.
@@ -633,6 +640,7 @@ EXAMPLES = """
sso_attribute_value_override: "enable"
status_ttl: "300"
switch_controller_acct_fast_framedip_detect: "2"
+ switch_controller_nas_ip_dynamic: "enable"
switch_controller_service_type: "login"
tertiary_secret: "<your_own_value>"
tertiary_server: "<your_own_value>"
@@ -783,6 +791,7 @@ def filter_user_radius_data(json):
"sso_attribute_value_override",
"status_ttl",
"switch_controller_acct_fast_framedip_detect",
+ "switch_controller_nas_ip_dynamic",
"switch_controller_service_type",
"tertiary_secret",
"tertiary_server",
@@ -853,7 +862,8 @@ def user_radius(data, fos, check_mode=False):
user_radius_data = data["user_radius"]
user_radius_data = flatten_multilists_attributes(user_radius_data)
- filtered_data = underscore_to_hyphen(filter_user_radius_data(user_radius_data))
+ filtered_data = filter_user_radius_data(user_radius_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -917,7 +927,7 @@ def user_radius(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "radius", data=filtered_data, vdom=vdom)
+ return fos.set("user", "radius", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "radius", mkey=filtered_data["name"], vdom=vdom)
@@ -977,6 +987,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "switch_controller_nas_ip_dynamic": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"nas_ip": {"v_range": [["v6.0.0", ""]], "type": "string"},
"nas_id_type": {
"v_range": [["v7.2.4", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_saml.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_saml.py
index 4faaafc58..8885225b2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_saml.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_saml.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -389,7 +389,8 @@ def user_saml(data, fos, check_mode=False):
state = data["state"]
user_saml_data = data["user_saml"]
- filtered_data = underscore_to_hyphen(filter_user_saml_data(user_saml_data))
+ filtered_data = filter_user_saml_data(user_saml_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -453,7 +454,7 @@ def user_saml(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "saml", data=filtered_data, vdom=vdom)
+ return fos.set("user", "saml", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "saml", mkey=filtered_data["name"], vdom=vdom)
@@ -516,7 +517,6 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"clock_tolerance": {"v_range": [["v7.0.4", ""]], "type": "integer"},
- "auth_url": {"v_range": [["v7.2.1", ""]], "type": "string"},
"adfs_claim": {
"v_range": [["v7.0.0", ""]],
"type": "string",
@@ -579,6 +579,7 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "auth_url": {"v_range": [["v7.2.1", "v7.4.1"]], "type": "string"},
},
"v_range": [["v6.2.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_security_exempt_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_security_exempt_list.py
index eda67784f..927fa3ff5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_security_exempt_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_security_exempt_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -300,9 +300,10 @@ def user_security_exempt_list(data, fos, check_mode=False):
state = data["state"]
user_security_exempt_list_data = data["user_security_exempt_list"]
- filtered_data = underscore_to_hyphen(
- filter_user_security_exempt_list_data(user_security_exempt_list_data)
+ filtered_data = filter_user_security_exempt_list_data(
+ user_security_exempt_list_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -366,7 +367,7 @@ def user_security_exempt_list(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "security-exempt-list", data=filtered_data, vdom=vdom)
+ return fos.set("user", "security-exempt-list", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_setting.py
index ea4ade813..a74ef161f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -432,9 +432,10 @@ def user_setting(data, fos):
vdom = data["vdom"]
user_setting_data = data["user_setting"]
user_setting_data = flatten_multilists_attributes(user_setting_data)
- filtered_data = underscore_to_hyphen(filter_user_setting_data(user_setting_data))
+ filtered_data = filter_user_setting_data(user_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("user", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("user", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_tacacsplus.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_tacacsplus.py
index 6de7dc8e5..591966b9b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_tacacsplus.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_user_tacacsplus.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -312,9 +312,8 @@ def user_tacacsplus(data, fos, check_mode=False):
state = data["state"]
user_tacacsplus_data = data["user_tacacsplus"]
- filtered_data = underscore_to_hyphen(
- filter_user_tacacsplus_data(user_tacacsplus_data)
- )
+ filtered_data = filter_user_tacacsplus_data(user_tacacsplus_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -378,7 +377,7 @@ def user_tacacsplus(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("user", "tacacs+", data=filtered_data, vdom=vdom)
+ return fos.set("user", "tacacs+", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("user", "tacacs+", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_keyword.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_keyword.py
new file mode 100644
index 000000000..baf259b04
--- /dev/null
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_keyword.py
@@ -0,0 +1,438 @@
+#!/usr/bin/python
+from __future__ import absolute_import, division, print_function
+
+# Copyright: (c) 2022 Fortinet
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+# 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.
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "status": ["preview"],
+ "supported_by": "community",
+ "metadata_version": "1.1",
+}
+
+DOCUMENTATION = """
+---
+module: fortios_videofilter_keyword
+short_description: Configure video filter keywords in Fortinet's FortiOS and FortiGate.
+description:
+ - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the
+ user to set and modify videofilter feature and keyword category.
+ Examples include all parameters and values need to be adjusted to datasources before usage.
+ Tested with FOS v6.0.0
+version_added: "2.0.0"
+author:
+ - Link Zheng (@chillancezen)
+ - Jie Xue (@JieX19)
+ - Hongbin Lu (@fgtdev-hblu)
+ - Frank Shen (@frankshen01)
+ - Miguel Angel Munoz (@mamunozgonzalez)
+ - Nicolas Thomas (@thomnico)
+notes:
+ - We highly recommend using your own value as the id instead of 0, while '0' is a special placeholder that allows the backend to assign the latest
+ available number for the object, it does have limitations. Please find more details in Q&A.
+ - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
+
+requirements:
+ - ansible>=2.15
+options:
+ access_token:
+ description:
+ - Token-based authentication.
+ Generated from GUI of Fortigate.
+ type: str
+ required: false
+ enable_log:
+ description:
+ - Enable/Disable logging for task.
+ type: bool
+ required: false
+ default: false
+ vdom:
+ description:
+ - Virtual domain, among those defined previously. A vdom is a
+ virtual instance of the FortiGate that can be configured and
+ used as a different unit.
+ type: str
+ default: root
+ member_path:
+ type: str
+ description:
+ - Member attribute path to operate on.
+ - Delimited by a slash character if there are more than one attribute.
+ - Parameter marked with member_path is legitimate for doing member operation.
+ member_state:
+ type: str
+ description:
+ - Add or delete a member under specified attribute path.
+ - When member_state is specified, the state option is ignored.
+ choices:
+ - 'present'
+ - 'absent'
+
+ state:
+ description:
+ - Indicates whether to create or remove the object.
+ type: str
+ required: true
+ choices:
+ - 'present'
+ - 'absent'
+ videofilter_keyword:
+ description:
+ - Configure video filter keywords.
+ default: null
+ type: dict
+ suboptions:
+ comment:
+ description:
+ - Comment.
+ type: str
+ id:
+ description:
+ - ID. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ match:
+ description:
+ - Keyword matching logic.
+ type: str
+ choices:
+ - 'or'
+ - 'and'
+ name:
+ description:
+ - Name.
+ type: str
+ word:
+ description:
+ - List of keywords.
+ type: list
+ elements: dict
+ suboptions:
+ comment:
+ description:
+ - Comment.
+ type: str
+ name:
+ description:
+ - Name.
+ required: true
+ type: str
+ pattern_type:
+ description:
+ - Pattern type.
+ type: str
+ choices:
+ - 'wildcard'
+ - 'regex'
+ status:
+ description:
+ - Enable(consider)/disable(ignore) this keyword.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+"""
+
+EXAMPLES = """
+- name: Configure video filter keywords.
+ fortinet.fortios.fortios_videofilter_keyword:
+ vdom: "{{ vdom }}"
+ state: "present"
+ access_token: "<your_own_value>"
+ videofilter_keyword:
+ comment: "Comment."
+ id: "4"
+ match: "or"
+ name: "default_name_6"
+ word:
+ -
+ comment: "Comment."
+ name: "default_name_9"
+ pattern_type: "wildcard"
+ status: "enable"
+"""
+
+RETURN = """
+build:
+ description: Build number of the fortigate image
+ returned: always
+ type: str
+ sample: '1547'
+http_method:
+ description: Last method used to provision the content into FortiGate
+ returned: always
+ type: str
+ sample: 'PUT'
+http_status:
+ description: Last result given by FortiGate on last operation applied
+ returned: always
+ type: str
+ sample: "200"
+mkey:
+ description: Master key (id) used in the last call to FortiGate
+ returned: success
+ type: str
+ sample: "id"
+name:
+ description: Name of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "urlfilter"
+path:
+ description: Path of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "webfilter"
+revision:
+ description: Internal revision number
+ returned: always
+ type: str
+ sample: "17.0.2.10658"
+serial:
+ description: Serial number of the unit
+ returned: always
+ type: str
+ sample: "FGVMEVYYQT3AB5352"
+status:
+ description: Indication of the operation's result
+ returned: always
+ type: str
+ sample: "success"
+vdom:
+ description: Virtual domain used
+ returned: always
+ type: str
+ sample: "root"
+version:
+ description: Version of the FortiGate
+ returned: always
+ type: str
+ sample: "v5.6.3"
+"""
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.connection import Connection
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ FortiOSHandler,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_legacy_fortiosapi,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ schema_to_module_spec,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_schema_versioning,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import (
+ FAIL_SOCKET_MSG,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post_processor import (
+ remove_invalid_fields,
+)
+
+
+def filter_videofilter_keyword_data(json):
+ option_list = ["comment", "id", "match", "name", "word"]
+
+ json = remove_invalid_fields(json)
+ dictionary = {}
+
+ for attribute in option_list:
+ if attribute in json and json[attribute] is not None:
+ dictionary[attribute] = json[attribute]
+
+ return dictionary
+
+
+def underscore_to_hyphen(data):
+ if isinstance(data, list):
+ for i, elem in enumerate(data):
+ data[i] = underscore_to_hyphen(elem)
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[k.replace("_", "-")] = underscore_to_hyphen(v)
+ data = new_data
+
+ return data
+
+
+def videofilter_keyword(data, fos):
+ vdom = data["vdom"]
+
+ state = data["state"]
+
+ videofilter_keyword_data = data["videofilter_keyword"]
+ filtered_data = filter_videofilter_keyword_data(videofilter_keyword_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+
+ if state == "present" or state is True:
+ return fos.set("videofilter", "keyword", data=converted_data, vdom=vdom)
+
+ elif state == "absent":
+ return fos.delete("videofilter", "keyword", mkey=filtered_data["id"], vdom=vdom)
+ else:
+ fos._module.fail_json(msg="state must be present or absent!")
+
+
+def is_successful_status(resp):
+ return (
+ "status" in resp
+ and resp["status"] == "success"
+ or "http_status" in resp
+ and resp["http_status"] == 200
+ or "http_method" in resp
+ and resp["http_method"] == "DELETE"
+ and resp["http_status"] == 404
+ )
+
+
+def fortios_videofilter(data, fos):
+ fos.do_member_operation("videofilter", "keyword")
+ if data["videofilter_keyword"]:
+ resp = videofilter_keyword(data, fos)
+ else:
+ fos._module.fail_json(msg="missing task body: %s" % ("videofilter_keyword"))
+
+ return (
+ not is_successful_status(resp),
+ is_successful_status(resp)
+ and (resp["revision_changed"] if "revision_changed" in resp else True),
+ resp,
+ {},
+ )
+
+
+versioned_schema = {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "id": {"v_range": [["v7.4.2", ""]], "type": "integer", "required": True},
+ "name": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "comment": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "match": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "or"}, {"value": "and"}],
+ },
+ "word": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ },
+ "comment": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "pattern_type": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "wildcard"}, {"value": "regex"}],
+ },
+ "status": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ },
+ "v_range": [["v7.4.2", ""]],
+}
+
+
+def main():
+ module_spec = schema_to_module_spec(versioned_schema)
+ mkeyname = "id"
+ fields = {
+ "access_token": {"required": False, "type": "str", "no_log": True},
+ "enable_log": {"required": False, "type": "bool", "default": False},
+ "vdom": {"required": False, "type": "str", "default": "root"},
+ "member_path": {"required": False, "type": "str"},
+ "member_state": {
+ "type": "str",
+ "required": False,
+ "choices": ["present", "absent"],
+ },
+ "state": {"required": True, "type": "str", "choices": ["present", "absent"]},
+ "videofilter_keyword": {
+ "required": False,
+ "type": "dict",
+ "default": None,
+ "no_log": True,
+ "options": {},
+ },
+ }
+ for attribute_name in module_spec["options"]:
+ fields["videofilter_keyword"]["options"][attribute_name] = module_spec[
+ "options"
+ ][attribute_name]
+ if mkeyname and mkeyname == attribute_name:
+ fields["videofilter_keyword"]["options"][attribute_name]["required"] = True
+
+ module = AnsibleModule(argument_spec=fields, supports_check_mode=False)
+ check_legacy_fortiosapi(module)
+
+ is_error = False
+ has_changed = False
+ result = None
+ diff = None
+
+ versions_check_result = None
+ if module._socket_path:
+ connection = Connection(module._socket_path)
+ if "access_token" in module.params:
+ connection.set_option("access_token", module.params["access_token"])
+
+ if "enable_log" in module.params:
+ connection.set_option("enable_log", module.params["enable_log"])
+ else:
+ connection.set_option("enable_log", False)
+ fos = FortiOSHandler(connection, module, mkeyname)
+ versions_check_result = check_schema_versioning(
+ fos, versioned_schema, "videofilter_keyword"
+ )
+
+ is_error, has_changed, result, diff = fortios_videofilter(module.params, fos)
+
+ else:
+ module.fail_json(**FAIL_SOCKET_MSG)
+
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.warn(
+ "Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv"
+ )
+
+ if not is_error:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.exit_json(
+ changed=has_changed,
+ version_check_warning=versions_check_result,
+ meta=result,
+ diff=diff,
+ )
+ else:
+ module.exit_json(changed=has_changed, meta=result, diff=diff)
+ else:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.fail_json(
+ msg="Error in repo",
+ version_check_warning=versions_check_result,
+ meta=result,
+ )
+ else:
+ module.fail_json(msg="Error in repo", meta=result)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_profile.py
index 9a2045843..060192a9f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -107,6 +107,57 @@ options:
- 'allow'
- 'monitor'
- 'block'
+ filters:
+ description:
+ - YouTube filter entries.
+ type: list
+ elements: dict
+ suboptions:
+ action:
+ description:
+ - Video filter action.
+ type: str
+ choices:
+ - 'allow'
+ - 'monitor'
+ - 'block'
+ category:
+ description:
+ - FortiGuard category ID.
+ type: str
+ channel:
+ description:
+ - Channel ID.
+ type: str
+ comment:
+ description:
+ - Comment.
+ type: str
+ id:
+ description:
+ - ID. see <a href='#notes'>Notes</a>.
+ required: true
+ type: int
+ keyword:
+ description:
+ - Video filter keyword ID. Source videofilter.keyword.id.
+ type: int
+ log:
+ description:
+ - Enable/disable logging.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ type:
+ description:
+ - Filter type.
+ type: str
+ choices:
+ - 'category'
+ - 'channel'
+ - 'title'
+ - 'description'
fortiguard_category:
description:
- Configure FortiGuard categories.
@@ -201,15 +252,25 @@ EXAMPLES = """
comment: "Comment."
dailymotion: "enable"
default_action: "allow"
+ filters:
+ -
+ action: "allow"
+ category: "<your_own_value>"
+ channel: "<your_own_value>"
+ comment: "Comment."
+ id: "11"
+ keyword: "0"
+ log: "enable"
+ type: "category"
fortiguard_category:
filters:
-
action: "allow"
category_id: "0"
- id: "10"
+ id: "19"
log: "enable"
log: "enable"
- name: "default_name_13"
+ name: "default_name_22"
replacemsg_group: "<your_own_value> (source system.replacemsg-group.name)"
vimeo: "enable"
vimeo_restrict: "<your_own_value>"
@@ -302,6 +363,7 @@ def filter_videofilter_profile_data(json):
"comment",
"dailymotion",
"default_action",
+ "filters",
"fortiguard_category",
"log",
"name",
@@ -342,12 +404,11 @@ def videofilter_profile(data, fos):
state = data["state"]
videofilter_profile_data = data["videofilter_profile"]
- filtered_data = underscore_to_hyphen(
- filter_videofilter_profile_data(videofilter_profile_data)
- )
+ filtered_data = filter_videofilter_profile_data(videofilter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("videofilter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("videofilter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -391,19 +452,78 @@ versioned_schema = {
"children": {
"name": {"v_range": [["v7.0.0", ""]], "type": "string", "required": True},
"comment": {"v_range": [["v7.0.0", ""]], "type": "string"},
+ "filters": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "id": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "integer",
+ "required": True,
+ },
+ "comment": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "type": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "category"},
+ {"value": "channel"},
+ {"value": "title"},
+ {"value": "description"},
+ ],
+ },
+ "keyword": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "category": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "channel": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "action": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "allow"},
+ {"value": "monitor"},
+ {"value": "block"},
+ ],
+ },
+ "log": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "youtube": {
+ "v_range": [["v7.0.0", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "vimeo": {
+ "v_range": [["v7.0.0", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "dailymotion": {
+ "v_range": [["v7.0.0", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "replacemsg_group": {"v_range": [["v7.0.1", ""]], "type": "string"},
"default_action": {
- "v_range": [["v7.4.0", ""]],
+ "v_range": [["v7.4.0", "v7.4.1"]],
"type": "string",
"options": [{"value": "allow"}, {"value": "monitor"}, {"value": "block"}],
},
"log": {
- "v_range": [["v7.4.0", ""]],
+ "v_range": [["v7.4.0", "v7.4.1"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
- "youtube_channel_filter": {"v_range": [["v7.0.0", ""]], "type": "integer"},
+ "youtube_channel_filter": {
+ "v_range": [["v7.0.0", "v7.4.1"]],
+ "type": "integer",
+ },
"fortiguard_category": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
"type": "dict",
"children": {
"filters": {
@@ -411,47 +531,34 @@ versioned_schema = {
"elements": "dict",
"children": {
"id": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
"type": "integer",
"required": True,
},
"action": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
"type": "string",
"options": [
- {"value": "allow", "v_range": [["v7.0.1", ""]]},
+ {"value": "allow", "v_range": [["v7.0.1", "v7.4.1"]]},
{"value": "monitor"},
{"value": "block"},
{"value": "bypass", "v_range": [["v7.0.0", "v7.0.0"]]},
],
},
- "category_id": {"v_range": [["v7.0.0", ""]], "type": "integer"},
+ "category_id": {
+ "v_range": [["v7.0.0", "v7.4.1"]],
+ "type": "integer",
+ },
"log": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
},
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
}
},
},
- "youtube": {
- "v_range": [["v7.0.0", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
- "vimeo": {
- "v_range": [["v7.0.0", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
- "dailymotion": {
- "v_range": [["v7.0.0", ""]],
- "type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
- },
- "replacemsg_group": {"v_range": [["v7.0.1", ""]], "type": "string"},
"youtube_restrict": {
"v_range": [["v7.0.0", "v7.0.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_channel_filter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_channel_filter.py
index 001f30569..a5b431283 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_channel_filter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_channel_filter.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -295,15 +295,14 @@ def videofilter_youtube_channel_filter(data, fos):
state = data["state"]
videofilter_youtube_channel_filter_data = data["videofilter_youtube_channel_filter"]
- filtered_data = underscore_to_hyphen(
- filter_videofilter_youtube_channel_filter_data(
- videofilter_youtube_channel_filter_data
- )
+ filtered_data = filter_videofilter_youtube_channel_filter_data(
+ videofilter_youtube_channel_filter_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "videofilter", "youtube-channel-filter", data=filtered_data, vdom=vdom
+ "videofilter", "youtube-channel-filter", data=converted_data, vdom=vdom
)
elif state == "absent":
@@ -348,35 +347,35 @@ versioned_schema = {
"type": "list",
"elements": "dict",
"children": {
- "id": {"v_range": [["v7.0.0", ""]], "type": "integer", "required": True},
- "name": {"v_range": [["v7.0.0", ""]], "type": "string"},
- "comment": {"v_range": [["v7.0.0", ""]], "type": "string"},
+ "id": {"v_range": [["v7.0.0", "v7.4.1"]], "type": "integer", "required": True},
+ "name": {"v_range": [["v7.0.0", "v7.4.1"]], "type": "string"},
+ "comment": {"v_range": [["v7.0.0", "v7.4.1"]], "type": "string"},
"entries": {
"type": "list",
"elements": "dict",
"children": {
"id": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
"type": "integer",
"required": True,
},
- "comment": {"v_range": [["v7.0.0", ""]], "type": "string"},
+ "comment": {"v_range": [["v7.0.0", "v7.4.1"]], "type": "string"},
"action": {
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
"type": "string",
"options": [
- {"value": "allow", "v_range": [["v7.0.1", ""]]},
+ {"value": "allow", "v_range": [["v7.0.1", "v7.4.1"]]},
{"value": "monitor"},
{"value": "block"},
{"value": "bypass", "v_range": [["v7.0.0", "v7.0.0"]]},
],
},
- "channel_id": {"v_range": [["v7.0.0", ""]], "type": "string"},
+ "channel_id": {"v_range": [["v7.0.0", "v7.4.1"]], "type": "string"},
},
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
},
"log": {
- "v_range": [["v7.0.1", ""]],
+ "v_range": [["v7.0.1", "v7.4.1"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
@@ -391,7 +390,7 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
},
- "v_range": [["v7.0.0", ""]],
+ "v_range": [["v7.0.0", "v7.4.1"]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_key.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_key.py
index 7bcb5fb9b..ecca684e2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_key.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_videofilter_youtube_key.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -231,12 +231,11 @@ def videofilter_youtube_key(data, fos):
state = data["state"]
videofilter_youtube_key_data = data["videofilter_youtube_key"]
- filtered_data = underscore_to_hyphen(
- filter_videofilter_youtube_key_data(videofilter_youtube_key_data)
- )
+ filtered_data = filter_videofilter_youtube_key_data(videofilter_youtube_key_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("videofilter", "youtube-key", data=filtered_data, vdom=vdom)
+ return fos.set("videofilter", "youtube-key", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_virtual_patch_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_virtual_patch_profile.py
index e9ab742ff..906113b27 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_virtual_patch_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_virtual_patch_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -330,12 +330,11 @@ def virtual_patch_profile(data, fos):
virtual_patch_profile_data = flatten_multilists_attributes(
virtual_patch_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_virtual_patch_profile_data(virtual_patch_profile_data)
- )
+ filtered_data = filter_virtual_patch_profile_data(virtual_patch_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("virtual-patch", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("virtual-patch", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_voip_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_voip_profile.py
index 6f7518b89..033ec52d6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_voip_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_voip_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1228,7 +1228,8 @@ def voip_profile(data, fos, check_mode=False):
state = data["state"]
voip_profile_data = data["voip_profile"]
- filtered_data = underscore_to_hyphen(filter_voip_profile_data(voip_profile_data))
+ filtered_data = filter_voip_profile_data(voip_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1292,7 +1293,7 @@ def voip_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("voip", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("voip", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("voip", "profile", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ca.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ca.py
index fd238b959..62873f839 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ca.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ca.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -321,9 +321,8 @@ def vpn_certificate_ca(data, fos, check_mode=False):
state = data["state"]
vpn_certificate_ca_data = data["vpn_certificate_ca"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_certificate_ca_data(vpn_certificate_ca_data)
- )
+ filtered_data = filter_vpn_certificate_ca_data(vpn_certificate_ca_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -387,7 +386,7 @@ def vpn_certificate_ca(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.certificate", "ca", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.certificate", "ca", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_crl.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_crl.py
index b93af58a3..4d37bf73c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_crl.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_crl.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -312,9 +312,8 @@ def vpn_certificate_crl(data, fos, check_mode=False):
state = data["state"]
vpn_certificate_crl_data = data["vpn_certificate_crl"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_certificate_crl_data(vpn_certificate_crl_data)
- )
+ filtered_data = filter_vpn_certificate_crl_data(vpn_certificate_crl_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -378,7 +377,7 @@ def vpn_certificate_crl(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.certificate", "crl", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.certificate", "crl", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_local.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_local.py
index 77b07c0f6..ae1078f96 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_local.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_local.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -475,9 +475,8 @@ def vpn_certificate_local(data, fos, check_mode=False):
state = data["state"]
vpn_certificate_local_data = data["vpn_certificate_local"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_certificate_local_data(vpn_certificate_local_data)
- )
+ filtered_data = filter_vpn_certificate_local_data(vpn_certificate_local_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -541,7 +540,7 @@ def vpn_certificate_local(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.certificate", "local", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.certificate", "local", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ocsp_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ocsp_server.py
index 3a4e4aa4e..cea0f184a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ocsp_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_ocsp_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -266,9 +266,10 @@ def vpn_certificate_ocsp_server(data, fos, check_mode=False):
state = data["state"]
vpn_certificate_ocsp_server_data = data["vpn_certificate_ocsp_server"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_certificate_ocsp_server_data(vpn_certificate_ocsp_server_data)
+ filtered_data = filter_vpn_certificate_ocsp_server_data(
+ vpn_certificate_ocsp_server_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -332,7 +333,7 @@ def vpn_certificate_ocsp_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.certificate", "ocsp-server", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.certificate", "ocsp-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_remote.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_remote.py
index 7eca5151f..da8adbbda 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_remote.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_remote.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -247,9 +247,8 @@ def vpn_certificate_remote(data, fos, check_mode=False):
state = data["state"]
vpn_certificate_remote_data = data["vpn_certificate_remote"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_certificate_remote_data(vpn_certificate_remote_data)
- )
+ filtered_data = filter_vpn_certificate_remote_data(vpn_certificate_remote_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -313,7 +312,7 @@ def vpn_certificate_remote(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.certificate", "remote", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.certificate", "remote", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_setting.py
index 442ab0579..13b5828b2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_certificate_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -222,6 +222,7 @@ options:
type: str
choices:
- 'enable'
+ - 'mandatory'
- 'disable'
proxy:
description:
@@ -493,11 +494,10 @@ def underscore_to_hyphen(data):
def vpn_certificate_setting(data, fos):
vdom = data["vdom"]
vpn_certificate_setting_data = data["vpn_certificate_setting"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_certificate_setting_data(vpn_certificate_setting_data)
- )
+ filtered_data = filter_vpn_certificate_setting_data(vpn_certificate_setting_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("vpn.certificate", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.certificate", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -535,7 +535,11 @@ versioned_schema = {
"ocsp_status": {
"v_range": [["v6.0.0", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [
+ {"value": "enable"},
+ {"value": "mandatory", "v_range": [["v7.4.2", ""]]},
+ {"value": "disable"},
+ ],
},
"ocsp_option": {
"v_range": [["v6.2.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ike_gateway.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ike_gateway.py
index 46fef021d..463129618 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ike_gateway.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ike_gateway.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<name>": "name"}
+ speciallist = {"<name>": "name"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def vpn_ike_gateway(data, fos):
vdom = data["vdom"]
vpn_ike_gateway_data = data["vpn_ike_gateway"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ike_gateway_data(vpn_ike_gateway_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_vpn_ike_gateway_data(vpn_ike_gateway_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("vpn.ike", "gateway", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_concentrator.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_concentrator.py
index 7dc1806e5..a28bf6264 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_concentrator.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_concentrator.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -254,9 +254,8 @@ def vpn_ipsec_concentrator(data, fos, check_mode=False):
state = data["state"]
vpn_ipsec_concentrator_data = data["vpn_ipsec_concentrator"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_concentrator_data(vpn_ipsec_concentrator_data)
- )
+ filtered_data = filter_vpn_ipsec_concentrator_data(vpn_ipsec_concentrator_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -320,7 +319,7 @@ def vpn_ipsec_concentrator(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "concentrator", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "concentrator", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_fec.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_fec.py
index 9f5bbf963..8125559f7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_fec.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_fec.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -265,10 +265,11 @@ def vpn_ipsec_fec(data, fos):
state = data["state"]
vpn_ipsec_fec_data = data["vpn_ipsec_fec"]
- filtered_data = underscore_to_hyphen(filter_vpn_ipsec_fec_data(vpn_ipsec_fec_data))
+ filtered_data = filter_vpn_ipsec_fec_data(vpn_ipsec_fec_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "fec", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "fec", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("vpn.ipsec", "fec", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_forticlient.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_forticlient.py
index c2f48ca56..4efe25dcf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_forticlient.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_forticlient.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -244,9 +244,8 @@ def vpn_ipsec_forticlient(data, fos, check_mode=False):
state = data["state"]
vpn_ipsec_forticlient_data = data["vpn_ipsec_forticlient"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_forticlient_data(vpn_ipsec_forticlient_data)
- )
+ filtered_data = filter_vpn_ipsec_forticlient_data(vpn_ipsec_forticlient_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -310,7 +309,7 @@ def vpn_ipsec_forticlient(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "forticlient", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "forticlient", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey.py
index 07fdbaa7c..e9ab5d1f7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -308,9 +308,8 @@ def vpn_ipsec_manualkey(data, fos, check_mode=False):
state = data["state"]
vpn_ipsec_manualkey_data = data["vpn_ipsec_manualkey"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_manualkey_data(vpn_ipsec_manualkey_data)
- )
+ filtered_data = filter_vpn_ipsec_manualkey_data(vpn_ipsec_manualkey_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -374,7 +373,7 @@ def vpn_ipsec_manualkey(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "manualkey", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "manualkey", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey_interface.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey_interface.py
index 84a219127..f69b93c6a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey_interface.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_manualkey_interface.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -338,9 +338,10 @@ def vpn_ipsec_manualkey_interface(data, fos, check_mode=False):
state = data["state"]
vpn_ipsec_manualkey_interface_data = data["vpn_ipsec_manualkey_interface"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_manualkey_interface_data(vpn_ipsec_manualkey_interface_data)
+ filtered_data = filter_vpn_ipsec_manualkey_interface_data(
+ vpn_ipsec_manualkey_interface_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -407,7 +408,7 @@ def vpn_ipsec_manualkey_interface(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "vpn.ipsec", "manualkey-interface", data=filtered_data, vdom=vdom
+ "vpn.ipsec", "manualkey-interface", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1.py
index 712fbf000..248854fbb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -158,6 +158,13 @@ options:
choices:
- 'enable'
- 'disable'
+ azure_ad_autoconnect:
+ description:
+ - Enable/disable Azure AD Auto-Connect for FortiClient.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
backup_gateway:
description:
- Instruct unity clients about the backup gateway address(es).
@@ -180,6 +187,13 @@ options:
choices:
- 'enable'
- 'disable'
+ cert_trust_store:
+ description:
+ - CA certificate trust store.
+ type: str
+ choices:
+ - 'local'
+ - 'ems'
certificate:
description:
- Names of up to 4 signed personal certificates.
@@ -216,6 +230,17 @@ options:
description:
- Comment.
type: str
+ dev_id:
+ description:
+ - Device ID carried by the device ID notification.
+ type: str
+ dev_id_notification:
+ description:
+ - Enable/disable device ID notification.
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
dhcp_ra_giaddr:
description:
- Relay agent gateway IP address to use in the giaddr field of DHCP requests.
@@ -292,6 +317,13 @@ options:
choices:
- 'enable'
- 'disable'
+ eap_cert_auth:
+ description:
+ - Enable/disable peer certificate authentication in addition to EAP if peer is a FortiClient endpoint.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
eap_exclude_peergrp:
description:
- Peer group excluded from EAP authentication. Source user.peergrp.name.
@@ -303,6 +335,13 @@ options:
choices:
- 'use-id-payload'
- 'send-request'
+ ems_sn_check:
+ description:
+ - Enable/disable verification of EMS serial number.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
enforce_unique_id:
description:
- Enable/disable peer ID uniqueness check.
@@ -319,6 +358,17 @@ options:
- 'require'
- 'allow'
- 'disable'
+ exchange_fgt_device_id:
+ description:
+ - Enable/disable device identifier exchange with peer FortiGate units for use of VPN monitor data by FortiManager.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ fallback_tcp_threshold:
+ description:
+ - Timeout in seconds before falling back IKE/IPsec traffic to tcp.
+ type: int
fec_base:
description:
- Number of base Forward Error Correction packets (1 - 20).
@@ -350,7 +400,7 @@ options:
- 'disable'
fec_mapping_profile:
description:
- - Forward Error Correction (FEC) mapping profile.
+ - Forward Error Correction (FEC) mapping profile. Source vpn.ipsec.fec.name.
type: str
fec_receive_timeout:
description:
@@ -378,6 +428,13 @@ options:
choices:
- 'enable'
- 'disable'
+ fortinet_esp:
+ description:
+ - Enable/disable Fortinet ESP encapsulaton.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
fragmentation:
description:
- Enable/disable fragment IKE message on re-transmission.
@@ -584,6 +641,14 @@ options:
description:
- Time to wait in seconds before phase 1 encryption key expires.
type: int
+ kms:
+ description:
+ - Key Management Services server. Source vpn.kmip-server.name.
+ type: str
+ link_cost:
+ description:
+ - VPN tunnel underlay link cost.
+ type: int
local_gw:
description:
- Local VPN gateway.
@@ -787,6 +852,18 @@ options:
description:
- Pre-shared secret for remote side PSK authentication (ASCII string or hexadecimal encoded with a leading 0x).
type: str
+ qkd:
+ description:
+ - Enable/disable use of Quantum Key Distribution (QKD) server.
+ type: str
+ choices:
+ - 'disable'
+ - 'allow'
+ - 'require'
+ qkd_profile:
+ description:
+ - Quantum Key Distribution (QKD) server profile. Source vpn.qkd.name.
+ type: str
reauth:
description:
- Enable/disable re-authentication upon IKE SA lifetime expiration.
@@ -859,6 +936,14 @@ options:
- 'disable'
- 'suite-b-gcm-128'
- 'suite-b-gcm-256'
+ transport:
+ description:
+ - Set IKE transport protocol.
+ type: str
+ choices:
+ - 'udp'
+ - 'udp-fallback-tcp'
+ - 'tcp'
type:
description:
- Remote gateway type.
@@ -926,18 +1011,22 @@ EXAMPLES = """
authusr: "<your_own_value>"
authusrgrp: "<your_own_value> (source user.group.name)"
auto_negotiate: "enable"
+ azure_ad_autoconnect: "enable"
backup_gateway:
-
address: "<your_own_value>"
banner: "<your_own_value>"
cert_id_validation: "enable"
+ cert_trust_store: "local"
certificate:
-
- name: "default_name_19 (source vpn.certificate.local.name)"
+ name: "default_name_21 (source vpn.certificate.local.name)"
childless_ike: "enable"
client_auto_negotiate: "disable"
client_keep_alive: "disable"
comments: "<your_own_value>"
+ dev_id: "<your_own_value>"
+ dev_id_notification: "disable"
dhcp_ra_giaddr: "<your_own_value>"
dhcp6_ra_linkaddr: "<your_own_value>"
dhgrp: "1"
@@ -949,21 +1038,26 @@ EXAMPLES = """
dpd_retrycount: "3"
dpd_retryinterval: "<your_own_value>"
eap: "enable"
+ eap_cert_auth: "enable"
eap_exclude_peergrp: "<your_own_value> (source user.peergrp.name)"
eap_identity: "use-id-payload"
+ ems_sn_check: "enable"
enforce_unique_id: "disable"
esn: "require"
+ exchange_fgt_device_id: "enable"
+ fallback_tcp_threshold: "15"
fec_base: "10"
fec_codec: "rs"
fec_egress: "enable"
fec_health_check: "<your_own_value> (source system.sdwan.health-check.name)"
fec_ingress: "enable"
- fec_mapping_profile: "<your_own_value>"
+ fec_mapping_profile: "<your_own_value> (source vpn.ipsec.fec.name)"
fec_receive_timeout: "50"
fec_redundant: "1"
fec_send_timeout: "5"
fgsp_sync: "enable"
forticlient_enforcement: "enable"
+ fortinet_esp: "enable"
fragmentation: "enable"
fragmentation_mtu: "1200"
group_authentication: "enable"
@@ -986,7 +1080,7 @@ EXAMPLES = """
ipv4_exclude_range:
-
end_ip: "<your_own_value>"
- id: "70"
+ id: "79"
start_ip: "<your_own_value>"
ipv4_name: "<your_own_value> (source firewall.address.name firewall.addrgrp.name)"
ipv4_netmask: "<your_own_value>"
@@ -1002,7 +1096,7 @@ EXAMPLES = """
ipv6_exclude_range:
-
end_ip: "<your_own_value>"
- id: "85"
+ id: "94"
start_ip: "<your_own_value>"
ipv6_name: "<your_own_value> (source firewall.address6.name firewall.addrgrp6.name)"
ipv6_prefix: "128"
@@ -1011,6 +1105,8 @@ EXAMPLES = """
ipv6_start_ip: "<your_own_value>"
keepalive: "10"
keylife: "86400"
+ kms: "<your_own_value> (source vpn.kmip-server.name)"
+ link_cost: "0"
local_gw: "<your_own_value>"
localid: "<your_own_value>"
localid_type: "auto"
@@ -1019,7 +1115,7 @@ EXAMPLES = """
mode: "aggressive"
mode_cfg: "disable"
mode_cfg_allow_client_selector: "disable"
- name: "default_name_102"
+ name: "default_name_113"
nattraversal: "enable"
negotiate_timeout: "30"
network_id: "0"
@@ -1036,6 +1132,8 @@ EXAMPLES = """
proposal: "des-md5"
psksecret: "<your_own_value>"
psksecret_remote: "<your_own_value>"
+ qkd: "disable"
+ qkd_profile: "<your_own_value> (source vpn.qkd.name)"
reauth: "disable"
rekey: "enable"
remote_gw: "<your_own_value>"
@@ -1047,6 +1145,7 @@ EXAMPLES = """
signature_hash_alg: "sha1"
split_include_service: "<your_own_value> (source firewall.service.group.name firewall.service.custom.name)"
suite_b: "disable"
+ transport: "udp"
type: "static"
unity_support: "disable"
usrgrp: "<your_own_value> (source user.group.name)"
@@ -1155,14 +1254,18 @@ def filter_vpn_ipsec_phase1_data(json):
"authusr",
"authusrgrp",
"auto_negotiate",
+ "azure_ad_autoconnect",
"backup_gateway",
"banner",
"cert_id_validation",
+ "cert_trust_store",
"certificate",
"childless_ike",
"client_auto_negotiate",
"client_keep_alive",
"comments",
+ "dev_id",
+ "dev_id_notification",
"dhcp_ra_giaddr",
"dhcp6_ra_linkaddr",
"dhgrp",
@@ -1174,10 +1277,14 @@ def filter_vpn_ipsec_phase1_data(json):
"dpd_retrycount",
"dpd_retryinterval",
"eap",
+ "eap_cert_auth",
"eap_exclude_peergrp",
"eap_identity",
+ "ems_sn_check",
"enforce_unique_id",
"esn",
+ "exchange_fgt_device_id",
+ "fallback_tcp_threshold",
"fec_base",
"fec_codec",
"fec_egress",
@@ -1189,6 +1296,7 @@ def filter_vpn_ipsec_phase1_data(json):
"fec_send_timeout",
"fgsp_sync",
"forticlient_enforcement",
+ "fortinet_esp",
"fragmentation",
"fragmentation_mtu",
"group_authentication",
@@ -1226,6 +1334,8 @@ def filter_vpn_ipsec_phase1_data(json):
"ipv6_start_ip",
"keepalive",
"keylife",
+ "kms",
+ "link_cost",
"local_gw",
"localid",
"localid_type",
@@ -1251,6 +1361,8 @@ def filter_vpn_ipsec_phase1_data(json):
"proposal",
"psksecret",
"psksecret_remote",
+ "qkd",
+ "qkd_profile",
"reauth",
"rekey",
"remote_gw",
@@ -1262,6 +1374,7 @@ def filter_vpn_ipsec_phase1_data(json):
"signature_hash_alg",
"split_include_service",
"suite_b",
+ "transport",
"type",
"unity_support",
"usrgrp",
@@ -1330,9 +1443,8 @@ def vpn_ipsec_phase1(data, fos, check_mode=False):
vpn_ipsec_phase1_data = data["vpn_ipsec_phase1"]
vpn_ipsec_phase1_data = flatten_multilists_attributes(vpn_ipsec_phase1_data)
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_phase1_data(vpn_ipsec_phase1_data)
- )
+ filtered_data = filter_vpn_ipsec_phase1_data(vpn_ipsec_phase1_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1396,7 +1508,7 @@ def vpn_ipsec_phase1(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "phase1", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "phase1", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("vpn.ipsec", "phase1", mkey=filtered_data["name"], vdom=vdom)
@@ -1805,6 +1917,11 @@ versioned_schema = {
"options": [{"value": "use-id-payload"}, {"value": "send-request"}],
},
"eap_exclude_peergrp": {"v_range": [["v6.2.0", ""]], "type": "string"},
+ "eap_cert_auth": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"acct_verify": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -1906,6 +2023,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "azure_ad_autoconnect": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"rekey": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -1976,19 +2098,66 @@ versioned_schema = {
"fec_receive_timeout": {"v_range": [["v6.2.0", ""]], "type": "integer"},
"fec_health_check": {"v_range": [["v7.0.2", ""]], "type": "string"},
"fec_mapping_profile": {"v_range": [["v7.0.2", ""]], "type": "string"},
- "forticlient_enforcement": {
- "v_range": [["v6.0.0", "v7.4.0"]],
+ "network_overlay": {
+ "v_range": [["v6.2.0", "v7.0.1"], ["v7.4.2", ""]],
"type": "string",
- "options": [{"value": "enable"}, {"value": "disable"}],
+ "options": [{"value": "disable"}, {"value": "enable"}],
},
- "network_overlay": {
- "v_range": [["v6.2.0", "v7.0.1"]],
+ "network_id": {
+ "v_range": [["v6.2.0", "v7.0.1"], ["v7.4.2", ""]],
+ "type": "integer",
+ },
+ "dev_id_notification": {
+ "v_range": [["v7.4.2", ""]],
"type": "string",
"options": [{"value": "disable"}, {"value": "enable"}],
},
- "network_id": {"v_range": [["v6.2.0", "v7.0.1"]], "type": "integer"},
+ "dev_id": {"v_range": [["v7.4.2", ""]], "type": "string"},
"loopback_asymroute": {
- "v_range": [["v7.0.0", "v7.0.1"]],
+ "v_range": [["v7.0.0", "v7.0.1"], ["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "link_cost": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "kms": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "exchange_fgt_device_id": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "ems_sn_check": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "cert_trust_store": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "local"}, {"value": "ems"}],
+ },
+ "qkd": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "allow"}, {"value": "require"}],
+ },
+ "qkd_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "transport": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "udp"},
+ {"value": "udp-fallback-tcp"},
+ {"value": "tcp"},
+ ],
+ },
+ "fortinet_esp": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "fallback_tcp_threshold": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "forticlient_enforcement": {
+ "v_range": [["v6.0.0", "v7.4.0"]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1_interface.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1_interface.py
index 044529d74..3959f52d6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1_interface.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase1_interface.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -215,6 +215,13 @@ options:
choices:
- 'enable'
- 'disable'
+ azure_ad_autoconnect:
+ description:
+ - Enable/disable Azure AD Auto-Connect for FortiClient.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
backup_gateway:
description:
- Instruct unity clients about the backup gateway address(es).
@@ -237,6 +244,13 @@ options:
choices:
- 'enable'
- 'disable'
+ cert_trust_store:
+ description:
+ - CA certificate trust store.
+ type: str
+ choices:
+ - 'local'
+ - 'ems'
certificate:
description:
- The names of up to 4 signed personal certificates.
@@ -368,6 +382,13 @@ options:
choices:
- 'enable'
- 'disable'
+ eap_cert_auth:
+ description:
+ - Enable/disable peer certificate authentication in addition to EAP if peer is a FortiClient endpoint.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
eap_exclude_peergrp:
description:
- Peer group excluded from EAP authentication. Source user.peergrp.name.
@@ -457,6 +478,10 @@ options:
description:
- IPv6 address to exchange with peers.
type: str
+ fallback_tcp_threshold:
+ description:
+ - Timeout in seconds before falling back IKE/IPsec traffic to tcp.
+ type: int
fec_base:
description:
- Number of base Forward Error Correction packets (1 - 20).
@@ -516,6 +541,13 @@ options:
choices:
- 'enable'
- 'disable'
+ fortinet_esp:
+ description:
+ - Enable/disable Fortinet ESP encapsulaton.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
fragmentation:
description:
- Enable/disable fragment IKE message on re-transmission.
@@ -806,6 +838,10 @@ options:
monitor:
description:
- IPsec interface as backup for primary interface. Source vpn.ipsec.phase1-interface.name.
+ type: str
+ monitor_dict:
+ description:
+ - IPsec interface as backup for primary interface.(Use the parameter monitor instead if the fortios firmwear version <= 7.4.0.)
type: list
elements: dict
suboptions:
@@ -1017,6 +1053,18 @@ options:
description:
- Pre-shared secret for remote side PSK authentication (ASCII string or hexadecimal encoded with a leading 0x).
type: str
+ qkd:
+ description:
+ - Enable/disable use of Quantum Key Distribution (QKD) server.
+ type: str
+ choices:
+ - 'disable'
+ - 'allow'
+ - 'require'
+ qkd_profile:
+ description:
+ - Quantum Key Distribution (QKD) server profile. Source vpn.qkd.name.
+ type: str
reauth:
description:
- Enable/disable re-authentication upon IKE SA lifetime expiration.
@@ -1093,6 +1141,14 @@ options:
- 'disable'
- 'suite-b-gcm-128'
- 'suite-b-gcm-256'
+ transport:
+ description:
+ - Set IKE transport protocol.
+ type: str
+ choices:
+ - 'udp'
+ - 'udp-fallback-tcp'
+ - 'tcp'
tunnel_search:
description:
- Tunnel search method for when the interface is shared.
@@ -1180,14 +1236,16 @@ EXAMPLES = """
auto_discovery_sender: "enable"
auto_discovery_shortcuts: "independent"
auto_negotiate: "enable"
+ azure_ad_autoconnect: "enable"
backup_gateway:
-
address: "<your_own_value>"
banner: "<your_own_value>"
cert_id_validation: "enable"
+ cert_trust_store: "local"
certificate:
-
- name: "default_name_28 (source vpn.certificate.local.name)"
+ name: "default_name_30 (source vpn.certificate.local.name)"
childless_ike: "enable"
client_auto_negotiate: "disable"
client_keep_alive: "disable"
@@ -1207,6 +1265,7 @@ EXAMPLES = """
dpd_retrycount: "3"
dpd_retryinterval: "<your_own_value>"
eap: "enable"
+ eap_cert_auth: "enable"
eap_exclude_peergrp: "<your_own_value> (source user.peergrp.name)"
eap_identity: "use-id-payload"
ems_sn_check: "enable"
@@ -1222,6 +1281,7 @@ EXAMPLES = """
exchange_interface_ip: "enable"
exchange_ip_addr4: "<your_own_value>"
exchange_ip_addr6: "<your_own_value>"
+ fallback_tcp_threshold: "15"
fec_base: "10"
fec_codec: "rs"
fec_egress: "enable"
@@ -1233,6 +1293,7 @@ EXAMPLES = """
fec_send_timeout: "5"
fgsp_sync: "enable"
forticlient_enforcement: "enable"
+ fortinet_esp: "enable"
fragmentation: "enable"
fragmentation_mtu: "1200"
group_authentication: "enable"
@@ -1257,7 +1318,7 @@ EXAMPLES = """
ipv4_exclude_range:
-
end_ip: "<your_own_value>"
- id: "96"
+ id: "101"
start_ip: "<your_own_value>"
ipv4_name: "<your_own_value> (source firewall.address.name firewall.addrgrp.name)"
ipv4_netmask: "<your_own_value>"
@@ -1273,7 +1334,7 @@ EXAMPLES = """
ipv6_exclude_range:
-
end_ip: "<your_own_value>"
- id: "111"
+ id: "116"
start_ip: "<your_own_value>"
ipv6_name: "<your_own_value> (source firewall.address6.name firewall.addrgrp6.name)"
ipv6_prefix: "128"
@@ -1293,15 +1354,16 @@ EXAMPLES = """
mode: "aggressive"
mode_cfg: "disable"
mode_cfg_allow_client_selector: "disable"
- monitor:
+ monitor: "<your_own_value> (source vpn.ipsec.phase1-interface.name)"
+ monitor_dict:
-
- name: "default_name_132 (source vpn.ipsec.phase1-interface.name)"
+ name: "default_name_138 (source vpn.ipsec.phase1-interface.name)"
monitor_hold_down_delay: "0"
monitor_hold_down_time: "<your_own_value>"
monitor_hold_down_type: "immediate"
monitor_hold_down_weekday: "everyday"
monitor_min: "0"
- name: "default_name_138"
+ name: "default_name_144"
nattraversal: "enable"
negotiate_timeout: "30"
net_device: "enable"
@@ -1321,6 +1383,8 @@ EXAMPLES = """
proposal: "des-md5"
psksecret: "<your_own_value>"
psksecret_remote: "<your_own_value>"
+ qkd: "disable"
+ qkd_profile: "<your_own_value> (source vpn.qkd.name)"
reauth: "disable"
rekey: "enable"
remote_gw: "<your_own_value>"
@@ -1333,6 +1397,7 @@ EXAMPLES = """
signature_hash_alg: "sha1"
split_include_service: "<your_own_value> (source firewall.service.group.name firewall.service.custom.name)"
suite_b: "disable"
+ transport: "udp"
tunnel_search: "selectors"
type: "static"
unity_support: "disable"
@@ -1452,9 +1517,11 @@ def filter_vpn_ipsec_phase1_interface_data(json):
"auto_discovery_sender",
"auto_discovery_shortcuts",
"auto_negotiate",
+ "azure_ad_autoconnect",
"backup_gateway",
"banner",
"cert_id_validation",
+ "cert_trust_store",
"certificate",
"childless_ike",
"client_auto_negotiate",
@@ -1475,6 +1542,7 @@ def filter_vpn_ipsec_phase1_interface_data(json):
"dpd_retrycount",
"dpd_retryinterval",
"eap",
+ "eap_cert_auth",
"eap_exclude_peergrp",
"eap_identity",
"ems_sn_check",
@@ -1490,6 +1558,7 @@ def filter_vpn_ipsec_phase1_interface_data(json):
"exchange_interface_ip",
"exchange_ip_addr4",
"exchange_ip_addr6",
+ "fallback_tcp_threshold",
"fec_base",
"fec_codec",
"fec_egress",
@@ -1501,6 +1570,7 @@ def filter_vpn_ipsec_phase1_interface_data(json):
"fec_send_timeout",
"fgsp_sync",
"forticlient_enforcement",
+ "fortinet_esp",
"fragmentation",
"fragmentation_mtu",
"group_authentication",
@@ -1552,6 +1622,7 @@ def filter_vpn_ipsec_phase1_interface_data(json):
"mode_cfg",
"mode_cfg_allow_client_selector",
"monitor",
+ "monitor_dict",
"monitor_hold_down_delay",
"monitor_hold_down_time",
"monitor_hold_down_type",
@@ -1577,6 +1648,8 @@ def filter_vpn_ipsec_phase1_interface_data(json):
"proposal",
"psksecret",
"psksecret_remote",
+ "qkd",
+ "qkd_profile",
"reauth",
"rekey",
"remote_gw",
@@ -1589,6 +1662,7 @@ def filter_vpn_ipsec_phase1_interface_data(json):
"signature_hash_alg",
"split_include_service",
"suite_b",
+ "transport",
"tunnel_search",
"type",
"unity_support",
@@ -1652,6 +1726,30 @@ def underscore_to_hyphen(data):
return data
+def remap_attribute_name(data):
+ speciallist = {"monitor-dict": "monitor"}
+
+ if data in speciallist:
+ return speciallist[data]
+ return data
+
+
+def remap_attribute_names(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = remap_attribute_names(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[remap_attribute_name(k)] = remap_attribute_names(v)
+ data = new_data
+
+ return data
+
+
def vpn_ipsec_phase1_interface(data, fos, check_mode=False):
vdom = data["vdom"]
@@ -1661,9 +1759,11 @@ def vpn_ipsec_phase1_interface(data, fos, check_mode=False):
vpn_ipsec_phase1_interface_data = flatten_multilists_attributes(
vpn_ipsec_phase1_interface_data
)
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_phase1_interface_data(vpn_ipsec_phase1_interface_data)
+ filtered_data = filter_vpn_ipsec_phase1_interface_data(
+ vpn_ipsec_phase1_interface_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
+ converted_data = remap_attribute_names(converted_data)
# check_mode starts from here
if check_mode:
@@ -1727,7 +1827,7 @@ def vpn_ipsec_phase1_interface(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "phase1-interface", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "phase1-interface", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -1839,7 +1939,7 @@ versioned_schema = {
"usrgrp": {"v_range": [["v6.0.0", ""]], "type": "string"},
"peer": {"v_range": [["v6.0.0", ""]], "type": "string"},
"peergrp": {"v_range": [["v6.0.0", ""]], "type": "string"},
- "monitor": {
+ "monitor_dict": {
"type": "list",
"elements": "dict",
"children": {
@@ -1849,7 +1949,7 @@ versioned_schema = {
"required": True,
}
},
- "v_range": [["v6.0.0", ""]],
+ "v_range": [["v7.4.1", ""]],
},
"monitor_min": {"v_range": [["v7.4.1", ""]], "type": "integer"},
"monitor_hold_down_type": {
@@ -1897,7 +1997,7 @@ versioned_schema = {
},
"aggregate_weight": {"v_range": [["v6.4.0", ""]], "type": "integer"},
"packet_redistribution": {
- "v_range": [],
+ "v_range": [["v7.4.2", "v7.4.2"]],
"type": "string",
"options": [
{"value": "enable", "v_range": [["v7.2.1", "v7.2.2"], ["v7.4.0", ""]]},
@@ -2222,6 +2322,11 @@ versioned_schema = {
"options": [{"value": "use-id-payload"}, {"value": "send-request"}],
},
"eap_exclude_peergrp": {"v_range": [["v6.2.0", ""]], "type": "string"},
+ "eap_cert_auth": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"acct_verify": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -2377,6 +2482,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "azure_ad_autoconnect": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"rekey": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -2476,6 +2586,33 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "cert_trust_store": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "local"}, {"value": "ems"}],
+ },
+ "qkd": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "allow"}, {"value": "require"}],
+ },
+ "qkd_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "transport": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "udp"},
+ {"value": "udp-fallback-tcp"},
+ {"value": "tcp"},
+ ],
+ },
+ "fortinet_esp": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "fallback_tcp_threshold": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "monitor": {"v_range": [["v6.0.0", "v7.4.0"]], "type": "string"},
"forticlient_enforcement": {
"v_range": [["v6.0.0", "v7.4.0"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2.py
index 2d41db72a..eff4ad728 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -677,9 +677,8 @@ def vpn_ipsec_phase2(data, fos, check_mode=False):
vpn_ipsec_phase2_data = data["vpn_ipsec_phase2"]
vpn_ipsec_phase2_data = flatten_multilists_attributes(vpn_ipsec_phase2_data)
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_phase2_data(vpn_ipsec_phase2_data)
- )
+ filtered_data = filter_vpn_ipsec_phase2_data(vpn_ipsec_phase2_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -743,7 +742,7 @@ def vpn_ipsec_phase2(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "phase2", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "phase2", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("vpn.ipsec", "phase2", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2_interface.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2_interface.py
index b24541ccf..6373c187c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2_interface.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ipsec_phase2_interface.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -688,9 +688,10 @@ def vpn_ipsec_phase2_interface(data, fos, check_mode=False):
vpn_ipsec_phase2_interface_data = flatten_multilists_attributes(
vpn_ipsec_phase2_interface_data
)
- filtered_data = underscore_to_hyphen(
- filter_vpn_ipsec_phase2_interface_data(vpn_ipsec_phase2_interface_data)
+ filtered_data = filter_vpn_ipsec_phase2_interface_data(
+ vpn_ipsec_phase2_interface_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -754,7 +755,7 @@ def vpn_ipsec_phase2_interface(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ipsec", "phase2-interface", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ipsec", "phase2-interface", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_kmip_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_kmip_server.py
index bc041e5a7..fd580be1f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_kmip_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_kmip_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -312,12 +312,11 @@ def vpn_kmip_server(data, fos):
state = data["state"]
vpn_kmip_server_data = data["vpn_kmip_server"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_kmip_server_data(vpn_kmip_server_data)
- )
+ filtered_data = filter_vpn_kmip_server_data(vpn_kmip_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("vpn", "kmip-server", data=filtered_data, vdom=vdom)
+ return fos.set("vpn", "kmip-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("vpn", "kmip-server", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_l2tp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_l2tp.py
index 3937bf900..53f46b79c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_l2tp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_l2tp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -261,9 +261,10 @@ def underscore_to_hyphen(data):
def vpn_l2tp(data, fos):
vdom = data["vdom"]
vpn_l2tp_data = data["vpn_l2tp"]
- filtered_data = underscore_to_hyphen(filter_vpn_l2tp_data(vpn_l2tp_data))
+ filtered_data = filter_vpn_l2tp_data(vpn_l2tp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("vpn", "l2tp", data=filtered_data, vdom=vdom)
+ return fos.set("vpn", "l2tp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ocvpn.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ocvpn.py
index 58a6c4bd3..acb461c36 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ocvpn.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ocvpn.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -485,9 +485,10 @@ def underscore_to_hyphen(data):
def vpn_ocvpn(data, fos):
vdom = data["vdom"]
vpn_ocvpn_data = data["vpn_ocvpn"]
- filtered_data = underscore_to_hyphen(filter_vpn_ocvpn_data(vpn_ocvpn_data))
+ filtered_data = filter_vpn_ocvpn_data(vpn_ocvpn_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("vpn", "ocvpn", data=filtered_data, vdom=vdom)
+ return fos.set("vpn", "ocvpn", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_pptp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_pptp.py
index 906a96e45..452d516cf 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_pptp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_pptp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -233,9 +233,10 @@ def underscore_to_hyphen(data):
def vpn_pptp(data, fos):
vdom = data["vdom"]
vpn_pptp_data = data["vpn_pptp"]
- filtered_data = underscore_to_hyphen(filter_vpn_pptp_data(vpn_pptp_data))
+ filtered_data = filter_vpn_pptp_data(vpn_pptp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("vpn", "pptp", data=filtered_data, vdom=vdom)
+ return fos.set("vpn", "pptp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_qkd.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_qkd.py
new file mode 100644
index 000000000..18f7600fe
--- /dev/null
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_qkd.py
@@ -0,0 +1,403 @@
+#!/usr/bin/python
+from __future__ import absolute_import, division, print_function
+
+# Copyright: (c) 2022 Fortinet
+# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+# 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.
+
+__metaclass__ = type
+
+ANSIBLE_METADATA = {
+ "status": ["preview"],
+ "supported_by": "community",
+ "metadata_version": "1.1",
+}
+
+DOCUMENTATION = """
+---
+module: fortios_vpn_qkd
+short_description: Configure Quantum Key Distribution server in Fortinet's FortiOS and FortiGate.
+description:
+ - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the
+ user to set and modify vpn feature and qkd category.
+ Examples include all parameters and values need to be adjusted to datasources before usage.
+ Tested with FOS v6.0.0
+version_added: "2.0.0"
+author:
+ - Link Zheng (@chillancezen)
+ - Jie Xue (@JieX19)
+ - Hongbin Lu (@fgtdev-hblu)
+ - Frank Shen (@frankshen01)
+ - Miguel Angel Munoz (@mamunozgonzalez)
+ - Nicolas Thomas (@thomnico)
+notes:
+ - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
+
+requirements:
+ - ansible>=2.15
+options:
+ access_token:
+ description:
+ - Token-based authentication.
+ Generated from GUI of Fortigate.
+ type: str
+ required: false
+ enable_log:
+ description:
+ - Enable/Disable logging for task.
+ type: bool
+ required: false
+ default: false
+ vdom:
+ description:
+ - Virtual domain, among those defined previously. A vdom is a
+ virtual instance of the FortiGate that can be configured and
+ used as a different unit.
+ type: str
+ default: root
+ member_path:
+ type: str
+ description:
+ - Member attribute path to operate on.
+ - Delimited by a slash character if there are more than one attribute.
+ - Parameter marked with member_path is legitimate for doing member operation.
+ member_state:
+ type: str
+ description:
+ - Add or delete a member under specified attribute path.
+ - When member_state is specified, the state option is ignored.
+ choices:
+ - 'present'
+ - 'absent'
+
+ state:
+ description:
+ - Indicates whether to create or remove the object.
+ type: str
+ required: true
+ choices:
+ - 'present'
+ - 'absent'
+ vpn_qkd:
+ description:
+ - Configure Quantum Key Distribution servers
+ default: null
+ type: dict
+ suboptions:
+ certificate:
+ description:
+ - Names of up to 4 certificates to offer to the KME.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description:
+ - Certificate name. Source vpn.certificate.local.name.
+ required: true
+ type: str
+ comment:
+ description:
+ - Comment.
+ type: str
+ id:
+ description:
+ - Quantum Key Distribution ID assigned by the KME.
+ type: str
+ name:
+ description:
+ - Quantum Key Distribution configuration name.
+ required: true
+ type: str
+ peer:
+ description:
+ - Authenticate Quantum Key Device"s certificate with the peer/peergrp. Source user.peer.name user.peergrp.name.
+ type: str
+ port:
+ description:
+ - Port to connect to on the KME.
+ type: int
+ server:
+ description:
+ - IPv4, IPv6 or DNS address of the KME.
+ type: str
+"""
+
+EXAMPLES = """
+- name: Configure Quantum Key Distribution servers
+ fortinet.fortios.fortios_vpn_qkd:
+ vdom: "{{ vdom }}"
+ state: "present"
+ access_token: "<your_own_value>"
+ vpn_qkd:
+ certificate:
+ -
+ name: "default_name_4 (source vpn.certificate.local.name)"
+ comment: "Comment."
+ id: "6"
+ name: "default_name_7"
+ peer: "<your_own_value> (source user.peer.name user.peergrp.name)"
+ port: "0"
+ server: "192.168.100.40"
+"""
+
+RETURN = """
+build:
+ description: Build number of the fortigate image
+ returned: always
+ type: str
+ sample: '1547'
+http_method:
+ description: Last method used to provision the content into FortiGate
+ returned: always
+ type: str
+ sample: 'PUT'
+http_status:
+ description: Last result given by FortiGate on last operation applied
+ returned: always
+ type: str
+ sample: "200"
+mkey:
+ description: Master key (id) used in the last call to FortiGate
+ returned: success
+ type: str
+ sample: "id"
+name:
+ description: Name of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "urlfilter"
+path:
+ description: Path of the table used to fulfill the request
+ returned: always
+ type: str
+ sample: "webfilter"
+revision:
+ description: Internal revision number
+ returned: always
+ type: str
+ sample: "17.0.2.10658"
+serial:
+ description: Serial number of the unit
+ returned: always
+ type: str
+ sample: "FGVMEVYYQT3AB5352"
+status:
+ description: Indication of the operation's result
+ returned: always
+ type: str
+ sample: "success"
+vdom:
+ description: Virtual domain used
+ returned: always
+ type: str
+ sample: "root"
+version:
+ description: Version of the FortiGate
+ returned: always
+ type: str
+ sample: "v5.6.3"
+"""
+from ansible.module_utils.basic import AnsibleModule
+from ansible.module_utils.connection import Connection
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ FortiOSHandler,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_legacy_fortiosapi,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ schema_to_module_spec,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import (
+ check_schema_versioning,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import (
+ FAIL_SOCKET_MSG,
+)
+from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post_processor import (
+ remove_invalid_fields,
+)
+
+
+def filter_vpn_qkd_data(json):
+ option_list = ["certificate", "comment", "id", "name", "peer", "port", "server"]
+
+ json = remove_invalid_fields(json)
+ dictionary = {}
+
+ for attribute in option_list:
+ if attribute in json and json[attribute] is not None:
+ dictionary[attribute] = json[attribute]
+
+ return dictionary
+
+
+def underscore_to_hyphen(data):
+ if isinstance(data, list):
+ for i, elem in enumerate(data):
+ data[i] = underscore_to_hyphen(elem)
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[k.replace("_", "-")] = underscore_to_hyphen(v)
+ data = new_data
+
+ return data
+
+
+def vpn_qkd(data, fos):
+ vdom = data["vdom"]
+
+ state = data["state"]
+
+ vpn_qkd_data = data["vpn_qkd"]
+ filtered_data = filter_vpn_qkd_data(vpn_qkd_data)
+ converted_data = underscore_to_hyphen(filtered_data)
+
+ if state == "present" or state is True:
+ return fos.set("vpn", "qkd", data=converted_data, vdom=vdom)
+
+ elif state == "absent":
+ return fos.delete("vpn", "qkd", mkey=filtered_data["name"], vdom=vdom)
+ else:
+ fos._module.fail_json(msg="state must be present or absent!")
+
+
+def is_successful_status(resp):
+ return (
+ "status" in resp
+ and resp["status"] == "success"
+ or "http_status" in resp
+ and resp["http_status"] == 200
+ or "http_method" in resp
+ and resp["http_method"] == "DELETE"
+ and resp["http_status"] == 404
+ )
+
+
+def fortios_vpn(data, fos):
+ fos.do_member_operation("vpn", "qkd")
+ if data["vpn_qkd"]:
+ resp = vpn_qkd(data, fos)
+ else:
+ fos._module.fail_json(msg="missing task body: %s" % ("vpn_qkd"))
+
+ return (
+ not is_successful_status(resp),
+ is_successful_status(resp)
+ and (resp["revision_changed"] if "revision_changed" in resp else True),
+ resp,
+ {},
+ )
+
+
+versioned_schema = {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {"v_range": [["v7.4.2", ""]], "type": "string", "required": True},
+ "server": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "port": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "id": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "peer": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "certificate": {
+ "type": "list",
+ "elements": "dict",
+ "children": {
+ "name": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "required": True,
+ }
+ },
+ "v_range": [["v7.4.2", ""]],
+ },
+ "comment": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ },
+ "v_range": [["v7.4.2", ""]],
+}
+
+
+def main():
+ module_spec = schema_to_module_spec(versioned_schema)
+ mkeyname = "name"
+ fields = {
+ "access_token": {"required": False, "type": "str", "no_log": True},
+ "enable_log": {"required": False, "type": "bool", "default": False},
+ "vdom": {"required": False, "type": "str", "default": "root"},
+ "member_path": {"required": False, "type": "str"},
+ "member_state": {
+ "type": "str",
+ "required": False,
+ "choices": ["present", "absent"],
+ },
+ "state": {"required": True, "type": "str", "choices": ["present", "absent"]},
+ "vpn_qkd": {"required": False, "type": "dict", "default": None, "options": {}},
+ }
+ for attribute_name in module_spec["options"]:
+ fields["vpn_qkd"]["options"][attribute_name] = module_spec["options"][
+ attribute_name
+ ]
+ if mkeyname and mkeyname == attribute_name:
+ fields["vpn_qkd"]["options"][attribute_name]["required"] = True
+
+ module = AnsibleModule(argument_spec=fields, supports_check_mode=False)
+ check_legacy_fortiosapi(module)
+
+ is_error = False
+ has_changed = False
+ result = None
+ diff = None
+
+ versions_check_result = None
+ if module._socket_path:
+ connection = Connection(module._socket_path)
+ if "access_token" in module.params:
+ connection.set_option("access_token", module.params["access_token"])
+
+ if "enable_log" in module.params:
+ connection.set_option("enable_log", module.params["enable_log"])
+ else:
+ connection.set_option("enable_log", False)
+ fos = FortiOSHandler(connection, module, mkeyname)
+ versions_check_result = check_schema_versioning(
+ fos, versioned_schema, "vpn_qkd"
+ )
+
+ is_error, has_changed, result, diff = fortios_vpn(module.params, fos)
+
+ else:
+ module.fail_json(**FAIL_SOCKET_MSG)
+
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.warn(
+ "Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv"
+ )
+
+ if not is_error:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.exit_json(
+ changed=has_changed,
+ version_check_warning=versions_check_result,
+ meta=result,
+ diff=diff,
+ )
+ else:
+ module.exit_json(changed=has_changed, meta=result, diff=diff)
+ else:
+ if versions_check_result and versions_check_result["matched"] is False:
+ module.fail_json(
+ msg="Error in repo",
+ version_check_warning=versions_check_result,
+ meta=result,
+ )
+ else:
+ module.fail_json(msg="Error in repo", meta=result)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_client.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_client.py
index 3426f6311..51c831746 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_client.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_client.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -317,12 +317,11 @@ def vpn_ssl_client(data, fos):
state = data["state"]
vpn_ssl_client_data = data["vpn_ssl_client"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ssl_client_data(vpn_ssl_client_data)
- )
+ filtered_data = filter_vpn_ssl_client_data(vpn_ssl_client_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("vpn.ssl", "client", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ssl", "client", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("vpn.ssl", "client", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_settings.py
index 8d0392d0c..e8118e2f6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1030,11 +1030,10 @@ def vpn_ssl_settings(data, fos):
vdom = data["vdom"]
vpn_ssl_settings_data = data["vpn_ssl_settings"]
vpn_ssl_settings_data = flatten_multilists_attributes(vpn_ssl_settings_data)
- filtered_data = underscore_to_hyphen(
- filter_vpn_ssl_settings_data(vpn_ssl_settings_data)
- )
+ filtered_data = filter_vpn_ssl_settings_data(vpn_ssl_settings_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("vpn.ssl", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ssl", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_host_check_software.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_host_check_software.py
index 0e64e27f1..ffe3481b1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_host_check_software.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_host_check_software.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -306,11 +306,10 @@ def vpn_ssl_web_host_check_software(data, fos, check_mode=False):
state = data["state"]
vpn_ssl_web_host_check_software_data = data["vpn_ssl_web_host_check_software"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ssl_web_host_check_software_data(
- vpn_ssl_web_host_check_software_data
- )
+ filtered_data = filter_vpn_ssl_web_host_check_software_data(
+ vpn_ssl_web_host_check_software_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -379,7 +378,7 @@ def vpn_ssl_web_host_check_software(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "vpn.ssl.web", "host-check-software", data=filtered_data, vdom=vdom
+ "vpn.ssl.web", "host-check-software", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_portal.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_portal.py
index c598b33de..7038461fc 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_portal.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_portal.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -222,6 +222,7 @@ options:
- 'it'
- 'it-142'
- 'ja'
+ - 'ja-106'
- 'ko'
- 'la-am'
- 'lt'
@@ -1427,9 +1428,8 @@ def vpn_ssl_web_portal(data, fos, check_mode=False):
vpn_ssl_web_portal_data = data["vpn_ssl_web_portal"]
vpn_ssl_web_portal_data = flatten_multilists_attributes(vpn_ssl_web_portal_data)
- filtered_data = underscore_to_hyphen(
- filter_vpn_ssl_web_portal_data(vpn_ssl_web_portal_data)
- )
+ filtered_data = filter_vpn_ssl_web_portal_data(vpn_ssl_web_portal_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1493,7 +1493,7 @@ def vpn_ssl_web_portal(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ssl.web", "portal", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ssl.web", "portal", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -1823,6 +1823,7 @@ versioned_schema = {
{"value": "it"},
{"value": "it-142"},
{"value": "ja"},
+ {"value": "ja-106", "v_range": [["v7.4.2", ""]]},
{"value": "ko"},
{"value": "la-am", "v_range": [["v7.4.1", ""]]},
{"value": "lt"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_realm.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_realm.py
index 7af101373..695721111 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_realm.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_realm.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,9 +278,8 @@ def vpn_ssl_web_realm(data, fos, check_mode=False):
state = data["state"]
vpn_ssl_web_realm_data = data["vpn_ssl_web_realm"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ssl_web_realm_data(vpn_ssl_web_realm_data)
- )
+ filtered_data = filter_vpn_ssl_web_realm_data(vpn_ssl_web_realm_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -344,7 +343,7 @@ def vpn_ssl_web_realm(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ssl.web", "realm", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ssl.web", "realm", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_bookmark.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_bookmark.py
index ce5de7185..d7f795e3e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_bookmark.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_bookmark.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -192,6 +192,7 @@ options:
- 'it'
- 'it-142'
- 'ja'
+ - 'ja-106'
- 'ko'
- 'la-am'
- 'lt'
@@ -549,9 +550,10 @@ def vpn_ssl_web_user_bookmark(data, fos, check_mode=False):
state = data["state"]
vpn_ssl_web_user_bookmark_data = data["vpn_ssl_web_user_bookmark"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ssl_web_user_bookmark_data(vpn_ssl_web_user_bookmark_data)
+ filtered_data = filter_vpn_ssl_web_user_bookmark_data(
+ vpn_ssl_web_user_bookmark_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -615,7 +617,7 @@ def vpn_ssl_web_user_bookmark(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("vpn.ssl.web", "user-bookmark", data=filtered_data, vdom=vdom)
+ return fos.set("vpn.ssl.web", "user-bookmark", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -731,6 +733,7 @@ versioned_schema = {
{"value": "it"},
{"value": "it-142"},
{"value": "ja"},
+ {"value": "ja-106", "v_range": [["v7.4.2", ""]]},
{"value": "ko"},
{"value": "la-am", "v_range": [["v7.4.1", ""]]},
{"value": "lt"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_group_bookmark.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_group_bookmark.py
index 42f936293..6fdea857d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_group_bookmark.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_vpn_ssl_web_user_group_bookmark.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -192,6 +192,7 @@ options:
- 'it'
- 'it-142'
- 'ja'
+ - 'ja-106'
- 'ko'
- 'la-am'
- 'lt'
@@ -544,11 +545,10 @@ def vpn_ssl_web_user_group_bookmark(data, fos, check_mode=False):
state = data["state"]
vpn_ssl_web_user_group_bookmark_data = data["vpn_ssl_web_user_group_bookmark"]
- filtered_data = underscore_to_hyphen(
- filter_vpn_ssl_web_user_group_bookmark_data(
- vpn_ssl_web_user_group_bookmark_data
- )
+ filtered_data = filter_vpn_ssl_web_user_group_bookmark_data(
+ vpn_ssl_web_user_group_bookmark_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -617,7 +617,7 @@ def vpn_ssl_web_user_group_bookmark(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "vpn.ssl.web", "user-group-bookmark", data=filtered_data, vdom=vdom
+ "vpn.ssl.web", "user-group-bookmark", data=converted_data, vdom=vdom
)
elif state == "absent":
@@ -733,6 +733,7 @@ versioned_schema = {
{"value": "it"},
{"value": "it-142"},
{"value": "ja"},
+ {"value": "ja-106", "v_range": [["v7.4.2", ""]]},
{"value": "ko"},
{"value": "la-am", "v_range": [["v7.4.1", ""]]},
{"value": "lt"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_main_class.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_main_class.py
index 1b25b5f08..38a094bab 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_main_class.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_main_class.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,9 +232,8 @@ def waf_main_class(data, fos, check_mode=False):
state = data["state"]
waf_main_class_data = data["waf_main_class"]
- filtered_data = underscore_to_hyphen(
- filter_waf_main_class_data(waf_main_class_data)
- )
+ filtered_data = filter_waf_main_class_data(waf_main_class_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -298,7 +297,7 @@ def waf_main_class(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("waf", "main-class", data=filtered_data, vdom=vdom)
+ return fos.set("waf", "main-class", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("waf", "main-class", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_profile.py
index 017f7813f..e81a088b1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -1397,7 +1397,8 @@ def waf_profile(data, fos, check_mode=False):
waf_profile_data = data["waf_profile"]
waf_profile_data = flatten_multilists_attributes(waf_profile_data)
- filtered_data = underscore_to_hyphen(filter_waf_profile_data(waf_profile_data))
+ filtered_data = filter_waf_profile_data(waf_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1461,7 +1462,7 @@ def waf_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("waf", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("waf", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("waf", "profile", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_signature.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_signature.py
index dba4a35c2..0536d1eea 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_signature.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_signature.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,7 +232,8 @@ def waf_signature(data, fos, check_mode=False):
state = data["state"]
waf_signature_data = data["waf_signature"]
- filtered_data = underscore_to_hyphen(filter_waf_signature_data(waf_signature_data))
+ filtered_data = filter_waf_signature_data(waf_signature_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -296,7 +297,7 @@ def waf_signature(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("waf", "signature", data=filtered_data, vdom=vdom)
+ return fos.set("waf", "signature", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("waf", "signature", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_sub_class.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_sub_class.py
index 9bd9914bc..2960f2b0e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_sub_class.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_waf_sub_class.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -232,7 +232,8 @@ def waf_sub_class(data, fos, check_mode=False):
state = data["state"]
waf_sub_class_data = data["waf_sub_class"]
- filtered_data = underscore_to_hyphen(filter_waf_sub_class_data(waf_sub_class_data))
+ filtered_data = filter_waf_sub_class_data(waf_sub_class_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -296,7 +297,7 @@ def waf_sub_class(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("waf", "sub-class", data=filtered_data, vdom=vdom)
+ return fos.set("waf", "sub-class", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("waf", "sub-class", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_auth_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_auth_group.py
index 426e26877..098da9493 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_auth_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_auth_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -258,9 +258,8 @@ def wanopt_auth_group(data, fos, check_mode=False):
state = data["state"]
wanopt_auth_group_data = data["wanopt_auth_group"]
- filtered_data = underscore_to_hyphen(
- filter_wanopt_auth_group_data(wanopt_auth_group_data)
- )
+ filtered_data = filter_wanopt_auth_group_data(wanopt_auth_group_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -324,7 +323,7 @@ def wanopt_auth_group(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wanopt", "auth-group", data=filtered_data, vdom=vdom)
+ return fos.set("wanopt", "auth-group", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("wanopt", "auth-group", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_cache_service.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_cache_service.py
index aa1e195b2..ab0061975 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_cache_service.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_cache_service.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -302,11 +302,10 @@ def underscore_to_hyphen(data):
def wanopt_cache_service(data, fos):
vdom = data["vdom"]
wanopt_cache_service_data = data["wanopt_cache_service"]
- filtered_data = underscore_to_hyphen(
- filter_wanopt_cache_service_data(wanopt_cache_service_data)
- )
+ filtered_data = filter_wanopt_cache_service_data(wanopt_cache_service_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wanopt", "cache-service", data=filtered_data, vdom=vdom)
+ return fos.set("wanopt", "cache-service", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_content_delivery_network_rule.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_content_delivery_network_rule.py
index 12b73c605..a87bfc21b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_content_delivery_network_rule.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_content_delivery_network_rule.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -487,11 +487,10 @@ def wanopt_content_delivery_network_rule(data, fos, check_mode=False):
wanopt_content_delivery_network_rule_data = data[
"wanopt_content_delivery_network_rule"
]
- filtered_data = underscore_to_hyphen(
- filter_wanopt_content_delivery_network_rule_data(
- wanopt_content_delivery_network_rule_data
- )
+ filtered_data = filter_wanopt_content_delivery_network_rule_data(
+ wanopt_content_delivery_network_rule_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -560,7 +559,7 @@ def wanopt_content_delivery_network_rule(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wanopt", "content-delivery-network-rule", data=filtered_data, vdom=vdom
+ "wanopt", "content-delivery-network-rule", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_peer.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_peer.py
index 6a461992b..16c5eb211 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_peer.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_peer.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -230,7 +230,8 @@ def wanopt_peer(data, fos, check_mode=False):
state = data["state"]
wanopt_peer_data = data["wanopt_peer"]
- filtered_data = underscore_to_hyphen(filter_wanopt_peer_data(wanopt_peer_data))
+ filtered_data = filter_wanopt_peer_data(wanopt_peer_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -294,7 +295,7 @@ def wanopt_peer(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wanopt", "peer", data=filtered_data, vdom=vdom)
+ return fos.set("wanopt", "peer", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_profile.py
index 171e90aba..d986f61c0 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -632,9 +632,8 @@ def wanopt_profile(data, fos, check_mode=False):
state = data["state"]
wanopt_profile_data = data["wanopt_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wanopt_profile_data(wanopt_profile_data)
- )
+ filtered_data = filter_wanopt_profile_data(wanopt_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -698,7 +697,7 @@ def wanopt_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wanopt", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("wanopt", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("wanopt", "profile", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_remote_storage.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_remote_storage.py
index 7726b16df..511efac46 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_remote_storage.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_remote_storage.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -220,11 +220,10 @@ def underscore_to_hyphen(data):
def wanopt_remote_storage(data, fos):
vdom = data["vdom"]
wanopt_remote_storage_data = data["wanopt_remote_storage"]
- filtered_data = underscore_to_hyphen(
- filter_wanopt_remote_storage_data(wanopt_remote_storage_data)
- )
+ filtered_data = filter_wanopt_remote_storage_data(wanopt_remote_storage_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wanopt", "remote-storage", data=filtered_data, vdom=vdom)
+ return fos.set("wanopt", "remote-storage", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_settings.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_settings.py
index c1cbca575..d0fec442d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_settings.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_settings.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -233,11 +233,10 @@ def underscore_to_hyphen(data):
def wanopt_settings(data, fos):
vdom = data["vdom"]
wanopt_settings_data = data["wanopt_settings"]
- filtered_data = underscore_to_hyphen(
- filter_wanopt_settings_data(wanopt_settings_data)
- )
+ filtered_data = filter_wanopt_settings_data(wanopt_settings_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wanopt", "settings", data=filtered_data, vdom=vdom)
+ return fos.set("wanopt", "settings", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_webcache.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_webcache.py
index 3cccd7502..4de59a350 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_webcache.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wanopt_webcache.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -335,11 +335,10 @@ def underscore_to_hyphen(data):
def wanopt_webcache(data, fos):
vdom = data["vdom"]
wanopt_webcache_data = data["wanopt_webcache"]
- filtered_data = underscore_to_hyphen(
- filter_wanopt_webcache_data(wanopt_webcache_data)
- )
+ filtered_data = filter_wanopt_webcache_data(wanopt_webcache_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wanopt", "webcache", data=filtered_data, vdom=vdom)
+ return fos.set("wanopt", "webcache", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_debug_url.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_debug_url.py
index 8358b38d3..2ae941d1f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_debug_url.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_debug_url.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,9 +246,8 @@ def web_proxy_debug_url(data, fos, check_mode=False):
state = data["state"]
web_proxy_debug_url_data = data["web_proxy_debug_url"]
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_debug_url_data(web_proxy_debug_url_data)
- )
+ filtered_data = filter_web_proxy_debug_url_data(web_proxy_debug_url_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -312,7 +311,7 @@ def web_proxy_debug_url(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("web-proxy", "debug-url", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "debug-url", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_explicit.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_explicit.py
index 182e2a1e4..444fb0bcb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_explicit.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_explicit.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -563,11 +563,10 @@ def web_proxy_explicit(data, fos):
vdom = data["vdom"]
web_proxy_explicit_data = data["web_proxy_explicit"]
web_proxy_explicit_data = flatten_multilists_attributes(web_proxy_explicit_data)
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_explicit_data(web_proxy_explicit_data)
- )
+ filtered_data = filter_web_proxy_explicit_data(web_proxy_explicit_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("web-proxy", "explicit", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "explicit", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_fast_fallback.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_fast_fallback.py
index ae403a878..1ba76ac68 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_fast_fallback.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_fast_fallback.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -253,12 +253,11 @@ def web_proxy_fast_fallback(data, fos):
state = data["state"]
web_proxy_fast_fallback_data = data["web_proxy_fast_fallback"]
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_fast_fallback_data(web_proxy_fast_fallback_data)
- )
+ filtered_data = filter_web_proxy_fast_fallback_data(web_proxy_fast_fallback_data)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
- return fos.set("web-proxy", "fast-fallback", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "fast-fallback", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server.py
index 1e159ef90..658b3b24f 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -120,6 +120,13 @@ options:
description:
- Forward proxy server IPv6 address.
type: str
+ masquerade:
+ description:
+ - Enable/disable use of the of the IP address of the outgoing interface as the client IP address
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
monitor:
description:
- 'URL for forward server health check monitoring .'
@@ -164,8 +171,9 @@ EXAMPLES = """
healthcheck: "disable"
ip: "<your_own_value>"
ipv6: "<your_own_value>"
+ masquerade: "enable"
monitor: "<your_own_value>"
- name: "default_name_10"
+ name: "default_name_11"
password: "<your_own_value>"
port: "3128"
server_down_option: "block"
@@ -268,6 +276,7 @@ def filter_web_proxy_forward_server_data(json):
"healthcheck",
"ip",
"ipv6",
+ "masquerade",
"monitor",
"name",
"password",
@@ -305,9 +314,8 @@ def web_proxy_forward_server(data, fos, check_mode=False):
state = data["state"]
web_proxy_forward_server_data = data["web_proxy_forward_server"]
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_forward_server_data(web_proxy_forward_server_data)
- )
+ filtered_data = filter_web_proxy_forward_server_data(web_proxy_forward_server_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -371,7 +379,7 @@ def web_proxy_forward_server(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("web-proxy", "forward-server", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "forward-server", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -444,6 +452,11 @@ versioned_schema = {
"username": {"v_range": [["v6.4.0", ""]], "type": "string"},
"password": {"v_range": [["v6.4.0", ""]], "type": "string"},
"comment": {"v_range": [["v6.0.0", ""]], "type": "string"},
+ "masquerade": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server_group.py
index 611e6b332..02ba93fc7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_forward_server_group.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -272,9 +272,10 @@ def web_proxy_forward_server_group(data, fos, check_mode=False):
state = data["state"]
web_proxy_forward_server_group_data = data["web_proxy_forward_server_group"]
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_forward_server_group_data(web_proxy_forward_server_group_data)
+ filtered_data = filter_web_proxy_forward_server_group_data(
+ web_proxy_forward_server_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -343,7 +344,7 @@ def web_proxy_forward_server_group(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "web-proxy", "forward-server-group", data=filtered_data, vdom=vdom
+ "web-proxy", "forward-server-group", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_global.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_global.py
index 568a41b98..0c003bfae 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_global.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_global.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -143,6 +143,13 @@ options:
- Address name. Source firewall.address6.name firewall.addrgrp6.name.
required: true
type: str
+ log_app_id:
+ description:
+ - Enable/disable always log application type in traffic log.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
log_forward_server:
description:
- Enable/disable forward server name logging in forward traffic log.
@@ -150,6 +157,13 @@ options:
choices:
- 'enable'
- 'disable'
+ log_policy_pending:
+ description:
+ - Enable/disable logging sessions that are pending on policy matching.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
max_message_length:
description:
- Maximum length of HTTP message, not including body (16 - 256 Kbytes).
@@ -162,6 +176,13 @@ options:
description:
- Maximum length of HTTP messages processed by Web Application Firewall (WAF) (10 - 1024 Kbytes).
type: int
+ policy_category_deep_inspect:
+ description:
+ - Enable/disable deep inspection for application level category policy matching.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
proxy_fqdn:
description:
- Fully Qualified Domain Name (FQDN) that clients connect to to connect to the explicit web proxy.
@@ -230,10 +251,13 @@ EXAMPLES = """
learn_client_ip_srcaddr6:
-
name: "default_name_12 (source firewall.address6.name firewall.addrgrp6.name)"
+ log_app_id: "enable"
log_forward_server: "enable"
+ log_policy_pending: "enable"
max_message_length: "32"
max_request_length: "8"
max_waf_body_cache_length: "32"
+ policy_category_deep_inspect: "enable"
proxy_fqdn: "<your_own_value>"
src_affinity_exempt_addr: "<your_own_value>"
src_affinity_exempt_addr6: "<your_own_value>"
@@ -334,10 +358,13 @@ def filter_web_proxy_global_data(json):
"learn_client_ip_from_header",
"learn_client_ip_srcaddr",
"learn_client_ip_srcaddr6",
+ "log_app_id",
"log_forward_server",
+ "log_policy_pending",
"max_message_length",
"max_request_length",
"max_waf_body_cache_length",
+ "policy_category_deep_inspect",
"proxy_fqdn",
"src_affinity_exempt_addr",
"src_affinity_exempt_addr6",
@@ -407,11 +434,10 @@ def web_proxy_global(data, fos):
vdom = data["vdom"]
web_proxy_global_data = data["web_proxy_global"]
web_proxy_global_data = flatten_multilists_attributes(web_proxy_global_data)
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_global_data(web_proxy_global_data)
- )
+ filtered_data = filter_web_proxy_global_data(web_proxy_global_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("web-proxy", "global", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "global", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -529,11 +555,26 @@ versioned_schema = {
"multiple_values": True,
"elements": "str",
},
+ "policy_category_deep_inspect": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "log_policy_pending": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"log_forward_server": {
"v_range": [["v7.4.0", ""]],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "log_app_id": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"tunnel_non_http": {
"v_range": [["v6.0.0", "v6.2.7"]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_profile.py
index 219ec16b4..9a2022511 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -446,9 +446,8 @@ def web_proxy_profile(data, fos, check_mode=False):
web_proxy_profile_data = data["web_proxy_profile"]
web_proxy_profile_data = flatten_multilists_attributes(web_proxy_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_profile_data(web_proxy_profile_data)
- )
+ filtered_data = filter_web_proxy_profile_data(web_proxy_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -512,7 +511,7 @@ def web_proxy_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("web-proxy", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("web-proxy", "profile", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_url_match.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_url_match.py
index 4a2972f77..b79916161 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_url_match.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_url_match.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -269,9 +269,8 @@ def web_proxy_url_match(data, fos, check_mode=False):
state = data["state"]
web_proxy_url_match_data = data["web_proxy_url_match"]
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_url_match_data(web_proxy_url_match_data)
- )
+ filtered_data = filter_web_proxy_url_match_data(web_proxy_url_match_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -335,7 +334,7 @@ def web_proxy_url_match(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("web-proxy", "url-match", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "url-match", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_wisp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_wisp.py
index 348d07302..102818b2b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_wisp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_web_proxy_wisp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -263,9 +263,8 @@ def web_proxy_wisp(data, fos, check_mode=False):
state = data["state"]
web_proxy_wisp_data = data["web_proxy_wisp"]
- filtered_data = underscore_to_hyphen(
- filter_web_proxy_wisp_data(web_proxy_wisp_data)
- )
+ filtered_data = filter_web_proxy_wisp_data(web_proxy_wisp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -329,7 +328,7 @@ def web_proxy_wisp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("web-proxy", "wisp", data=filtered_data, vdom=vdom)
+ return fos.set("web-proxy", "wisp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("web-proxy", "wisp", mkey=filtered_data["name"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content.py
index 2e5ea2f25..0f5748d90 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -295,9 +295,8 @@ def webfilter_content(data, fos, check_mode=False):
state = data["state"]
webfilter_content_data = data["webfilter_content"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_content_data(webfilter_content_data)
- )
+ filtered_data = filter_webfilter_content_data(webfilter_content_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -361,7 +360,7 @@ def webfilter_content(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "content", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "content", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("webfilter", "content", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content_header.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content_header.py
index e1d193a9f..429e02918 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content_header.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_content_header.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -298,9 +298,8 @@ def webfilter_content_header(data, fos, check_mode=False):
webfilter_content_header_data = flatten_multilists_attributes(
webfilter_content_header_data
)
- filtered_data = underscore_to_hyphen(
- filter_webfilter_content_header_data(webfilter_content_header_data)
- )
+ filtered_data = filter_webfilter_content_header_data(webfilter_content_header_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -364,7 +363,7 @@ def webfilter_content_header(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "content-header", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "content-header", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_fortiguard.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_fortiguard.py
index c3ebc4393..661e8dbd6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_fortiguard.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_fortiguard.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -300,11 +300,10 @@ def underscore_to_hyphen(data):
def webfilter_fortiguard(data, fos):
vdom = data["vdom"]
webfilter_fortiguard_data = data["webfilter_fortiguard"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_fortiguard_data(webfilter_fortiguard_data)
- )
+ filtered_data = filter_webfilter_fortiguard_data(webfilter_fortiguard_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("webfilter", "fortiguard", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "fortiguard", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_cat.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_cat.py
index 051839c26..45f457e13 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_cat.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_cat.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -238,9 +238,8 @@ def webfilter_ftgd_local_cat(data, fos, check_mode=False):
state = data["state"]
webfilter_ftgd_local_cat_data = data["webfilter_ftgd_local_cat"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_ftgd_local_cat_data(webfilter_ftgd_local_cat_data)
- )
+ filtered_data = filter_webfilter_ftgd_local_cat_data(webfilter_ftgd_local_cat_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -304,7 +303,7 @@ def webfilter_ftgd_local_cat(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "ftgd-local-cat", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "ftgd-local-cat", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_rating.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_rating.py
index bd2bcb1ec..819f22ed8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_rating.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ftgd_local_rating.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -243,9 +243,10 @@ def webfilter_ftgd_local_rating(data, fos, check_mode=False):
state = data["state"]
webfilter_ftgd_local_rating_data = data["webfilter_ftgd_local_rating"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_ftgd_local_rating_data(webfilter_ftgd_local_rating_data)
+ filtered_data = filter_webfilter_ftgd_local_rating_data(
+ webfilter_ftgd_local_rating_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -309,7 +310,7 @@ def webfilter_ftgd_local_rating(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "ftgd-local-rating", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "ftgd-local-rating", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_cache_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_cache_setting.py
index f59a1fa1c..12dbb0c83 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_cache_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_cache_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -209,14 +209,13 @@ def webfilter_ips_urlfilter_cache_setting(data, fos):
webfilter_ips_urlfilter_cache_setting_data = data[
"webfilter_ips_urlfilter_cache_setting"
]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_ips_urlfilter_cache_setting_data(
- webfilter_ips_urlfilter_cache_setting_data
- )
+ filtered_data = filter_webfilter_ips_urlfilter_cache_setting_data(
+ webfilter_ips_urlfilter_cache_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "webfilter", "ips-urlfilter-cache-setting", data=filtered_data, vdom=vdom
+ "webfilter", "ips-urlfilter-cache-setting", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting.py
index f13f27324..dbf3b21d8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -217,13 +217,12 @@ def underscore_to_hyphen(data):
def webfilter_ips_urlfilter_setting(data, fos):
vdom = data["vdom"]
webfilter_ips_urlfilter_setting_data = data["webfilter_ips_urlfilter_setting"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_ips_urlfilter_setting_data(
- webfilter_ips_urlfilter_setting_data
- )
+ filtered_data = filter_webfilter_ips_urlfilter_setting_data(
+ webfilter_ips_urlfilter_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("webfilter", "ips-urlfilter-setting", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "ips-urlfilter-setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting6.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting6.py
index 261046752..3ba6c6cb1 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting6.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_ips_urlfilter_setting6.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -217,13 +217,14 @@ def underscore_to_hyphen(data):
def webfilter_ips_urlfilter_setting6(data, fos):
vdom = data["vdom"]
webfilter_ips_urlfilter_setting6_data = data["webfilter_ips_urlfilter_setting6"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_ips_urlfilter_setting6_data(
- webfilter_ips_urlfilter_setting6_data
- )
+ filtered_data = filter_webfilter_ips_urlfilter_setting6_data(
+ webfilter_ips_urlfilter_setting6_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("webfilter", "ips-urlfilter-setting6", data=filtered_data, vdom=vdom)
+ return fos.set(
+ "webfilter", "ips-urlfilter-setting6", data=converted_data, vdom=vdom
+ )
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_override.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_override.py
index b6ad041be..21495cf27 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_override.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_override.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -297,9 +297,8 @@ def webfilter_override(data, fos, check_mode=False):
state = data["state"]
webfilter_override_data = data["webfilter_override"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_override_data(webfilter_override_data)
- )
+ filtered_data = filter_webfilter_override_data(webfilter_override_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -363,7 +362,7 @@ def webfilter_override(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "override", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "override", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("webfilter", "override", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_profile.py
index dca59a1d3..5221eaa4b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -838,6 +838,13 @@ options:
choices:
- 'enable'
- 'disable'
+ web_flow_log_encoding:
+ description:
+ - Log encoding in flow mode.
+ type: str
+ choices:
+ - 'utf-8'
+ - 'punycode'
web_ftgd_err_log:
description:
- Enable/disable logging rating errors.
@@ -1053,6 +1060,7 @@ EXAMPLES = """
web_filter_referer_log: "enable"
web_filter_unknown_log: "enable"
web_filter_vbs_log: "enable"
+ web_flow_log_encoding: "utf-8"
web_ftgd_err_log: "enable"
web_ftgd_quota_usage: "enable"
web_invalid_domain_log: "enable"
@@ -1061,12 +1069,12 @@ EXAMPLES = """
wisp_algorithm: "primary-secondary"
wisp_servers:
-
- name: "default_name_125 (source web-proxy.wisp.name)"
+ name: "default_name_126 (source web-proxy.wisp.name)"
youtube_channel_filter:
-
channel_id: "<your_own_value>"
comment: "Comment."
- id: "129"
+ id: "130"
youtube_channel_status: "disable"
"""
@@ -1190,6 +1198,7 @@ def filter_webfilter_profile_data(json):
"web_filter_referer_log",
"web_filter_unknown_log",
"web_filter_vbs_log",
+ "web_flow_log_encoding",
"web_ftgd_err_log",
"web_ftgd_quota_usage",
"web_invalid_domain_log",
@@ -1270,9 +1279,8 @@ def webfilter_profile(data, fos, check_mode=False):
webfilter_profile_data = data["webfilter_profile"]
webfilter_profile_data = flatten_multilists_attributes(webfilter_profile_data)
- filtered_data = underscore_to_hyphen(
- filter_webfilter_profile_data(webfilter_profile_data)
- )
+ filtered_data = filter_webfilter_profile_data(webfilter_profile_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1336,7 +1344,7 @@ def webfilter_profile(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "profile", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "profile", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("webfilter", "profile", mkey=filtered_data["name"], vdom=vdom)
@@ -1411,6 +1419,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "web_flow_log_encoding": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "utf-8"}, {"value": "punycode"}],
+ },
"ovrd_perm": {
"v_range": [["v6.0.0", ""]],
"type": "list",
@@ -1960,28 +1973,48 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"url_extraction": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"], ["v7.4.3", ""]],
"type": "dict",
"children": {
"status": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
"server_fqdn": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"redirect_header": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"redirect_url": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
},
"redirect_no_content": {
- "v_range": [["v6.0.0", "v7.0.8"], ["v7.2.0", "v7.2.4"]],
+ "v_range": [
+ ["v6.0.0", "v7.0.8"],
+ ["v7.2.0", "v7.2.4"],
+ ["v7.4.3", ""],
+ ],
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_search_engine.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_search_engine.py
index 543997e90..384a49f38 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_search_engine.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_search_engine.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -276,9 +276,8 @@ def webfilter_search_engine(data, fos, check_mode=False):
state = data["state"]
webfilter_search_engine_data = data["webfilter_search_engine"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_search_engine_data(webfilter_search_engine_data)
- )
+ filtered_data = filter_webfilter_search_engine_data(webfilter_search_engine_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -342,7 +341,7 @@ def webfilter_search_engine(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "search-engine", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "search-engine", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_status.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_status.py
index f344cbe96..6764d7f4b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_status.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_status.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<refresh_rate>": "refresh_rate"}
+ speciallist = {"<refresh_rate>": "refresh_rate"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,8 @@ def valid_attr_to_invalid_attrs(data):
def webfilter_status(data, fos):
vdom = data["vdom"]
webfilter_status_data = data["webfilter_status"]
- filtered_data = underscore_to_hyphen(
- filter_webfilter_status_data(webfilter_status_data)
- )
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ filtered_data = filter_webfilter_status_data(webfilter_status_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("webfilter", "status", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_urlfilter.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_urlfilter.py
index 97149cd12..c55c1dbbc 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_urlfilter.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_webfilter_urlfilter.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -388,9 +388,8 @@ def webfilter_urlfilter(data, fos, check_mode=False):
webfilter_urlfilter_data = data["webfilter_urlfilter"]
webfilter_urlfilter_data = flatten_multilists_attributes(webfilter_urlfilter_data)
- filtered_data = underscore_to_hyphen(
- filter_webfilter_urlfilter_data(webfilter_urlfilter_data)
- )
+ filtered_data = filter_webfilter_urlfilter_data(webfilter_urlfilter_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -454,7 +453,7 @@ def webfilter_urlfilter(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("webfilter", "urlfilter", data=filtered_data, vdom=vdom)
+ return fos.set("webfilter", "urlfilter", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete("webfilter", "urlfilter", mkey=filtered_data["id"], vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_access_control_list.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_access_control_list.py
index 2975d060c..c7bb0dbe7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_access_control_list.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_access_control_list.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -336,11 +336,10 @@ def wireless_controller_access_control_list(data, fos, check_mode=False):
wireless_controller_access_control_list_data = data[
"wireless_controller_access_control_list"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_access_control_list_data(
- wireless_controller_access_control_list_data
- )
+ filtered_data = filter_wireless_controller_access_control_list_data(
+ wireless_controller_access_control_list_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -409,7 +408,7 @@ def wireless_controller_access_control_list(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "access-control-list", data=filtered_data, vdom=vdom
+ "wireless-controller", "access-control-list", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_address.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_address.py
index 8a566106a..7676941c8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_address.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_address.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -238,9 +238,10 @@ def wireless_controller_address(data, fos, check_mode=False):
state = data["state"]
wireless_controller_address_data = data["wireless_controller_address"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_address_data(wireless_controller_address_data)
+ filtered_data = filter_wireless_controller_address_data(
+ wireless_controller_address_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -304,7 +305,7 @@ def wireless_controller_address(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wireless-controller", "address", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "address", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_addrgrp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_addrgrp.py
index 306694f3e..b5f8c1509 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_addrgrp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_addrgrp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -247,9 +247,10 @@ def wireless_controller_addrgrp(data, fos, check_mode=False):
state = data["state"]
wireless_controller_addrgrp_data = data["wireless_controller_addrgrp"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_addrgrp_data(wireless_controller_addrgrp_data)
+ filtered_data = filter_wireless_controller_addrgrp_data(
+ wireless_controller_addrgrp_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -313,7 +314,7 @@ def wireless_controller_addrgrp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wireless-controller", "addrgrp", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "addrgrp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ap_status.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ap_status.py
index 286020ef9..0d4b08e44 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ap_status.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ap_status.py
@@ -40,7 +40,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -246,9 +246,10 @@ def wireless_controller_ap_status(data, fos, check_mode=False):
state = data["state"]
wireless_controller_ap_status_data = data["wireless_controller_ap_status"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_ap_status_data(wireless_controller_ap_status_data)
+ filtered_data = filter_wireless_controller_ap_status_data(
+ wireless_controller_ap_status_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -315,7 +316,7 @@ def wireless_controller_ap_status(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "ap-status", data=filtered_data, vdom=vdom
+ "wireless-controller", "ap-status", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_apcfg_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_apcfg_profile.py
index 1a57bae97..7a01059e4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_apcfg_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_apcfg_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -165,7 +165,7 @@ EXAMPLES = """
access_token: "<your_own_value>"
wireless_controller_apcfg_profile:
ac_ip: "<your_own_value>"
- ac_port: "0"
+ ac_port: "5246"
ac_timer: "10"
ac_type: "default"
ap_family: "fap"
@@ -309,11 +309,10 @@ def wireless_controller_apcfg_profile(data, fos, check_mode=False):
state = data["state"]
wireless_controller_apcfg_profile_data = data["wireless_controller_apcfg_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_apcfg_profile_data(
- wireless_controller_apcfg_profile_data
- )
+ filtered_data = filter_wireless_controller_apcfg_profile_data(
+ wireless_controller_apcfg_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -382,7 +381,7 @@ def wireless_controller_apcfg_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "apcfg-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "apcfg-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_arrp_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_arrp_profile.py
index a05842787..1ea705e85 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_arrp_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_arrp_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -376,11 +376,10 @@ def wireless_controller_arrp_profile(data, fos, check_mode=False):
state = data["state"]
wireless_controller_arrp_profile_data = data["wireless_controller_arrp_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_arrp_profile_data(
- wireless_controller_arrp_profile_data
- )
+ filtered_data = filter_wireless_controller_arrp_profile_data(
+ wireless_controller_arrp_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -449,7 +448,7 @@ def wireless_controller_arrp_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "arrp-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "arrp-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ble_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ble_profile.py
index aaa6f6584..4c7db65f4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ble_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ble_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -392,11 +392,10 @@ def wireless_controller_ble_profile(data, fos, check_mode=False):
wireless_controller_ble_profile_data = flatten_multilists_attributes(
wireless_controller_ble_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_ble_profile_data(
- wireless_controller_ble_profile_data
- )
+ filtered_data = filter_wireless_controller_ble_profile_data(
+ wireless_controller_ble_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -465,7 +464,7 @@ def wireless_controller_ble_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "ble-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "ble-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_bonjour_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_bonjour_profile.py
index 4aba492eb..25efb6e10 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_bonjour_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_bonjour_profile.py
@@ -39,7 +39,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -316,11 +316,10 @@ def wireless_controller_bonjour_profile(data, fos, check_mode=False):
wireless_controller_bonjour_profile_data = flatten_multilists_attributes(
wireless_controller_bonjour_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_bonjour_profile_data(
- wireless_controller_bonjour_profile_data
- )
+ filtered_data = filter_wireless_controller_bonjour_profile_data(
+ wireless_controller_bonjour_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -389,7 +388,7 @@ def wireless_controller_bonjour_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "bonjour-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "bonjour-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_client_info.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_client_info.py
index 4d153e3c4..25c59e38e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_client_info.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_client_info.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<vfid>": "vfid"}
+ speciallist = {"<vfid>": "vfid"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,12 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def wireless_controller_client_info(data, fos, check_mode=False):
vdom = data["vdom"]
wireless_controller_client_info_data = data["wireless_controller_client_info"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_client_info_data(
- wireless_controller_client_info_data
- )
+ filtered_data = filter_wireless_controller_client_info_data(
+ wireless_controller_client_info_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("wireless-controller", "client-info", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_global.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_global.py
index 177def4d0..819844409 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_global.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_global.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -182,6 +182,17 @@ options:
description:
- Maximum numerical difference between an AP"s Ethernet and wireless MAC values to match for rogue detection (0 - 31).
type: int
+ rolling_wtp_upgrade:
+ description:
+ - Enable/disable rolling WTP upgrade .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
+ rolling_wtp_upgrade_threshold:
+ description:
+ - Minimum signal level/threshold in dBm required for the managed WTP to be included in rolling WTP upgrade (-95 to -20).
+ type: str
tunnel_mode:
description:
- Compatible/strict tunnel mode.
@@ -226,6 +237,8 @@ EXAMPLES = """
nac_interval: "120"
name: "default_name_20"
rogue_scan_mac_adjacency: "7"
+ rolling_wtp_upgrade: "enable"
+ rolling_wtp_upgrade_threshold: "<your_own_value>"
tunnel_mode: "compatible"
wpad_process_count: "0"
wtp_share: "enable"
@@ -331,6 +344,8 @@ def filter_wireless_controller_global_data(json):
"nac_interval",
"name",
"rogue_scan_mac_adjacency",
+ "rolling_wtp_upgrade",
+ "rolling_wtp_upgrade_threshold",
"tunnel_mode",
"wpad_process_count",
"wtp_share",
@@ -394,11 +409,12 @@ def wireless_controller_global(data, fos):
wireless_controller_global_data = flatten_multilists_attributes(
wireless_controller_global_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_global_data(wireless_controller_global_data)
+ filtered_data = filter_wireless_controller_global_data(
+ wireless_controller_global_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wireless-controller", "global", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "global", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -444,6 +460,15 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "rolling_wtp_upgrade": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
+ "rolling_wtp_upgrade_threshold": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"max_retransmit": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"control_message_offload": {
"v_range": [["v6.0.0", ""]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_3gpp_cellular.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_3gpp_cellular.py
index 3053fd88d..1d16d77d8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_3gpp_cellular.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_3gpp_cellular.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -251,11 +251,10 @@ def wireless_controller_hotspot20_anqp_3gpp_cellular(data, fos, check_mode=False
wireless_controller_hotspot20_anqp_3gpp_cellular_data = data[
"wireless_controller_hotspot20_anqp_3gpp_cellular"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_anqp_3gpp_cellular_data(
- wireless_controller_hotspot20_anqp_3gpp_cellular_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_anqp_3gpp_cellular_data(
+ wireless_controller_hotspot20_anqp_3gpp_cellular_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -329,7 +328,7 @@ def wireless_controller_hotspot20_anqp_3gpp_cellular(data, fos, check_mode=False
return fos.set(
"wireless-controller.hotspot20",
"anqp-3gpp-cellular",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_ip_address_type.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_ip_address_type.py
index c40a41472..689715887 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_ip_address_type.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_ip_address_type.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -250,11 +250,10 @@ def wireless_controller_hotspot20_anqp_ip_address_type(data, fos, check_mode=Fal
wireless_controller_hotspot20_anqp_ip_address_type_data = data[
"wireless_controller_hotspot20_anqp_ip_address_type"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_anqp_ip_address_type_data(
- wireless_controller_hotspot20_anqp_ip_address_type_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_anqp_ip_address_type_data(
+ wireless_controller_hotspot20_anqp_ip_address_type_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -331,7 +330,7 @@ def wireless_controller_hotspot20_anqp_ip_address_type(data, fos, check_mode=Fal
return fos.set(
"wireless-controller.hotspot20",
"anqp-ip-address-type",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_nai_realm.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_nai_realm.py
index f2e2bc0e3..a8b99a918 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_nai_realm.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_nai_realm.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -342,11 +342,10 @@ def wireless_controller_hotspot20_anqp_nai_realm(data, fos, check_mode=False):
wireless_controller_hotspot20_anqp_nai_realm_data = data[
"wireless_controller_hotspot20_anqp_nai_realm"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_anqp_nai_realm_data(
- wireless_controller_hotspot20_anqp_nai_realm_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_anqp_nai_realm_data(
+ wireless_controller_hotspot20_anqp_nai_realm_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -417,7 +416,7 @@ def wireless_controller_hotspot20_anqp_nai_realm(data, fos, check_mode=False):
return fos.set(
"wireless-controller.hotspot20",
"anqp-nai-realm",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_network_auth_type.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_network_auth_type.py
index e599707cd..a0b949877 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_network_auth_type.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_network_auth_type.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,11 +242,10 @@ def wireless_controller_hotspot20_anqp_network_auth_type(data, fos, check_mode=F
wireless_controller_hotspot20_anqp_network_auth_type_data = data[
"wireless_controller_hotspot20_anqp_network_auth_type"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_anqp_network_auth_type_data(
- wireless_controller_hotspot20_anqp_network_auth_type_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_anqp_network_auth_type_data(
+ wireless_controller_hotspot20_anqp_network_auth_type_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -323,7 +322,7 @@ def wireless_controller_hotspot20_anqp_network_auth_type(data, fos, check_mode=F
return fos.set(
"wireless-controller.hotspot20",
"anqp-network-auth-type",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_roaming_consortium.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_roaming_consortium.py
index c6da46b98..0eadb6bf4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_roaming_consortium.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_roaming_consortium.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -251,11 +251,10 @@ def wireless_controller_hotspot20_anqp_roaming_consortium(data, fos, check_mode=
wireless_controller_hotspot20_anqp_roaming_consortium_data = data[
"wireless_controller_hotspot20_anqp_roaming_consortium"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_anqp_roaming_consortium_data(
- wireless_controller_hotspot20_anqp_roaming_consortium_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_anqp_roaming_consortium_data(
+ wireless_controller_hotspot20_anqp_roaming_consortium_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -332,7 +331,7 @@ def wireless_controller_hotspot20_anqp_roaming_consortium(data, fos, check_mode=
return fos.set(
"wireless-controller.hotspot20",
"anqp-roaming-consortium",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_name.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_name.py
index 2d70bf96a..da8894141 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_name.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_name.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -251,11 +251,10 @@ def wireless_controller_hotspot20_anqp_venue_name(data, fos, check_mode=False):
wireless_controller_hotspot20_anqp_venue_name_data = data[
"wireless_controller_hotspot20_anqp_venue_name"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_anqp_venue_name_data(
- wireless_controller_hotspot20_anqp_venue_name_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_anqp_venue_name_data(
+ wireless_controller_hotspot20_anqp_venue_name_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -326,7 +325,7 @@ def wireless_controller_hotspot20_anqp_venue_name(data, fos, check_mode=False):
return fos.set(
"wireless-controller.hotspot20",
"anqp-venue-name",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_url.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_url.py
index 03d72ed4b..1a00301b8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_url.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_anqp_venue_url.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -242,17 +242,16 @@ def wireless_controller_hotspot20_anqp_venue_url(data, fos):
wireless_controller_hotspot20_anqp_venue_url_data = data[
"wireless_controller_hotspot20_anqp_venue_url"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_anqp_venue_url_data(
- wireless_controller_hotspot20_anqp_venue_url_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_anqp_venue_url_data(
+ wireless_controller_hotspot20_anqp_venue_url_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
"wireless-controller.hotspot20",
"anqp-venue-url",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_advice_of_charge.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_advice_of_charge.py
index 4d66717a5..5f302c997 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_advice_of_charge.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_advice_of_charge.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -281,17 +281,16 @@ def wireless_controller_hotspot20_h2qp_advice_of_charge(data, fos):
wireless_controller_hotspot20_h2qp_advice_of_charge_data = data[
"wireless_controller_hotspot20_h2qp_advice_of_charge"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_h2qp_advice_of_charge_data(
- wireless_controller_hotspot20_h2qp_advice_of_charge_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_h2qp_advice_of_charge_data(
+ wireless_controller_hotspot20_h2qp_advice_of_charge_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
"wireless-controller.hotspot20",
"h2qp-advice-of-charge",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_conn_capability.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_conn_capability.py
index 62fc517a6..bd5d15947 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_conn_capability.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_conn_capability.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -339,11 +339,10 @@ def wireless_controller_hotspot20_h2qp_conn_capability(data, fos, check_mode=Fal
wireless_controller_hotspot20_h2qp_conn_capability_data = data[
"wireless_controller_hotspot20_h2qp_conn_capability"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_h2qp_conn_capability_data(
- wireless_controller_hotspot20_h2qp_conn_capability_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_h2qp_conn_capability_data(
+ wireless_controller_hotspot20_h2qp_conn_capability_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -420,7 +419,7 @@ def wireless_controller_hotspot20_h2qp_conn_capability(data, fos, check_mode=Fal
return fos.set(
"wireless-controller.hotspot20",
"h2qp-conn-capability",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_operator_name.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_operator_name.py
index 3dd744e6d..e3ed1d033 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_operator_name.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_operator_name.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -251,11 +251,10 @@ def wireless_controller_hotspot20_h2qp_operator_name(data, fos, check_mode=False
wireless_controller_hotspot20_h2qp_operator_name_data = data[
"wireless_controller_hotspot20_h2qp_operator_name"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_h2qp_operator_name_data(
- wireless_controller_hotspot20_h2qp_operator_name_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_h2qp_operator_name_data(
+ wireless_controller_hotspot20_h2qp_operator_name_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -329,7 +328,7 @@ def wireless_controller_hotspot20_h2qp_operator_name(data, fos, check_mode=False
return fos.set(
"wireless-controller.hotspot20",
"h2qp-operator-name",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider.py
index 4c8784f51..a0fcd5dd4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -342,11 +342,10 @@ def wireless_controller_hotspot20_h2qp_osu_provider(data, fos, check_mode=False)
wireless_controller_hotspot20_h2qp_osu_provider_data
)
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_h2qp_osu_provider_data(
- wireless_controller_hotspot20_h2qp_osu_provider_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_h2qp_osu_provider_data(
+ wireless_controller_hotspot20_h2qp_osu_provider_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -420,7 +419,7 @@ def wireless_controller_hotspot20_h2qp_osu_provider(data, fos, check_mode=False)
return fos.set(
"wireless-controller.hotspot20",
"h2qp-osu-provider",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider_nai.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider_nai.py
index 56d527a7d..e2b9f96a7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider_nai.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_osu_provider_nai.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -237,17 +237,16 @@ def wireless_controller_hotspot20_h2qp_osu_provider_nai(data, fos):
wireless_controller_hotspot20_h2qp_osu_provider_nai_data = data[
"wireless_controller_hotspot20_h2qp_osu_provider_nai"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_h2qp_osu_provider_nai_data(
- wireless_controller_hotspot20_h2qp_osu_provider_nai_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_h2qp_osu_provider_nai_data(
+ wireless_controller_hotspot20_h2qp_osu_provider_nai_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
"wireless-controller.hotspot20",
"h2qp-osu-provider-nai",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_terms_and_conditions.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_terms_and_conditions.py
index e914d99cd..c9da9caf8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_terms_and_conditions.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_terms_and_conditions.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -233,17 +233,16 @@ def wireless_controller_hotspot20_h2qp_terms_and_conditions(data, fos):
wireless_controller_hotspot20_h2qp_terms_and_conditions_data = data[
"wireless_controller_hotspot20_h2qp_terms_and_conditions"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_h2qp_terms_and_conditions_data(
- wireless_controller_hotspot20_h2qp_terms_and_conditions_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_h2qp_terms_and_conditions_data(
+ wireless_controller_hotspot20_h2qp_terms_and_conditions_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
"wireless-controller.hotspot20",
"h2qp-terms-and-conditions",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_wan_metric.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_wan_metric.py
index 2b5e5d16c..7bf6bd387 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_wan_metric.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_h2qp_wan_metric.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -287,11 +287,10 @@ def wireless_controller_hotspot20_h2qp_wan_metric(data, fos, check_mode=False):
wireless_controller_hotspot20_h2qp_wan_metric_data = data[
"wireless_controller_hotspot20_h2qp_wan_metric"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_h2qp_wan_metric_data(
- wireless_controller_hotspot20_h2qp_wan_metric_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_h2qp_wan_metric_data(
+ wireless_controller_hotspot20_h2qp_wan_metric_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -362,7 +361,7 @@ def wireless_controller_hotspot20_h2qp_wan_metric(data, fos, check_mode=False):
return fos.set(
"wireless-controller.hotspot20",
"h2qp-wan-metric",
- data=filtered_data,
+ data=converted_data,
vdom=vdom,
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_hs_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_hs_profile.py
index b8bd640df..705228eb7 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_hs_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_hs_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -561,9 +561,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"3gpp_plmn": "plmn_3gpp"}
+ speciallist = {"3gpp_plmn": "plmn_3gpp"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -572,8 +572,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -591,12 +594,10 @@ def wireless_controller_hotspot20_hs_profile(data, fos, check_mode=False):
wireless_controller_hotspot20_hs_profile_data = data[
"wireless_controller_hotspot20_hs_profile"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_hs_profile_data(
- wireless_controller_hotspot20_hs_profile_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_hs_profile_data(
+ wireless_controller_hotspot20_hs_profile_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_icon.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_icon.py
index 9147af4a1..609a5b52b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_icon.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_icon.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -270,11 +270,10 @@ def wireless_controller_hotspot20_icon(data, fos, check_mode=False):
state = data["state"]
wireless_controller_hotspot20_icon_data = data["wireless_controller_hotspot20_icon"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_icon_data(
- wireless_controller_hotspot20_icon_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_icon_data(
+ wireless_controller_hotspot20_icon_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -343,7 +342,7 @@ def wireless_controller_hotspot20_icon(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller.hotspot20", "icon", data=filtered_data, vdom=vdom
+ "wireless-controller.hotspot20", "icon", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_qos_map.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_qos_map.py
index 14ca2856d..4d65040e8 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_qos_map.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_hotspot20_qos_map.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -280,11 +280,10 @@ def wireless_controller_hotspot20_qos_map(data, fos, check_mode=False):
wireless_controller_hotspot20_qos_map_data = data[
"wireless_controller_hotspot20_qos_map"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_hotspot20_qos_map_data(
- wireless_controller_hotspot20_qos_map_data
- )
+ filtered_data = filter_wireless_controller_hotspot20_qos_map_data(
+ wireless_controller_hotspot20_qos_map_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -353,7 +352,7 @@ def wireless_controller_hotspot20_qos_map(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller.hotspot20", "qos-map", data=filtered_data, vdom=vdom
+ "wireless-controller.hotspot20", "qos-map", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_inter_controller.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_inter_controller.py
index 3ef90ebc0..606856c51 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_inter_controller.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_inter_controller.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -279,14 +279,13 @@ def wireless_controller_inter_controller(data, fos):
wireless_controller_inter_controller_data = data[
"wireless_controller_inter_controller"
]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_inter_controller_data(
- wireless_controller_inter_controller_data
- )
+ filtered_data = filter_wireless_controller_inter_controller_data(
+ wireless_controller_inter_controller_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
return fos.set(
- "wireless-controller", "inter-controller", data=filtered_data, vdom=vdom
+ "wireless-controller", "inter-controller", data=converted_data, vdom=vdom
)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_log.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_log.py
index bfbc71240..b67c83fa5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_log.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_log.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -372,11 +372,10 @@ def underscore_to_hyphen(data):
def wireless_controller_log(data, fos):
vdom = data["vdom"]
wireless_controller_log_data = data["wireless_controller_log"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_log_data(wireless_controller_log_data)
- )
+ filtered_data = filter_wireless_controller_log_data(wireless_controller_log_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wireless-controller", "log", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "log", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_mpsk_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_mpsk_profile.py
index 4109c8c12..5d6b3af0a 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_mpsk_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_mpsk_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -315,11 +315,10 @@ def wireless_controller_mpsk_profile(data, fos, check_mode=False):
state = data["state"]
wireless_controller_mpsk_profile_data = data["wireless_controller_mpsk_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_mpsk_profile_data(
- wireless_controller_mpsk_profile_data
- )
+ filtered_data = filter_wireless_controller_mpsk_profile_data(
+ wireless_controller_mpsk_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -388,7 +387,7 @@ def wireless_controller_mpsk_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "mpsk-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "mpsk-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_nac_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_nac_profile.py
index 02ab779cc..72fb5f27c 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_nac_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_nac_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -226,15 +226,14 @@ def wireless_controller_nac_profile(data, fos):
state = data["state"]
wireless_controller_nac_profile_data = data["wireless_controller_nac_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_nac_profile_data(
- wireless_controller_nac_profile_data
- )
+ filtered_data = filter_wireless_controller_nac_profile_data(
+ wireless_controller_nac_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "nac-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "nac-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_qos_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_qos_profile.py
index 0f87775e0..473cf6f68 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_qos_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_qos_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -416,11 +416,10 @@ def wireless_controller_qos_profile(data, fos, check_mode=False):
state = data["state"]
wireless_controller_qos_profile_data = data["wireless_controller_qos_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_qos_profile_data(
- wireless_controller_qos_profile_data
- )
+ filtered_data = filter_wireless_controller_qos_profile_data(
+ wireless_controller_qos_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -489,7 +488,7 @@ def wireless_controller_qos_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "qos-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "qos-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_region.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_region.py
index d23410a46..1af99015d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_region.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_region.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -252,9 +252,10 @@ def wireless_controller_region(data, fos, check_mode=False):
state = data["state"]
wireless_controller_region_data = data["wireless_controller_region"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_region_data(wireless_controller_region_data)
+ filtered_data = filter_wireless_controller_region_data(
+ wireless_controller_region_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -318,7 +319,7 @@ def wireless_controller_region(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wireless-controller", "region", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "region", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_rf_analysis.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_rf_analysis.py
index 3c978a2f2..791eb95f9 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_rf_analysis.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_rf_analysis.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<wtp_id>": "wtp_id"}
+ speciallist = {"<wtp_id>": "wtp_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,12 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def wireless_controller_rf_analysis(data, fos):
vdom = data["vdom"]
wireless_controller_rf_analysis_data = data["wireless_controller_rf_analysis"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_rf_analysis_data(
- wireless_controller_rf_analysis_data
- )
+ filtered_data = filter_wireless_controller_rf_analysis_data(
+ wireless_controller_rf_analysis_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("wireless-controller", "rf-analysis", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_setting.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_setting.py
index 46a3e8363..9ca4ddf23 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_setting.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_setting.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -377,6 +377,13 @@ options:
choices:
- 'enable'
- 'disable'
+ rolling_wtp_upgrade:
+ description:
+ - Enable/disable rolling WTP upgrade .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
wfa_compatibility:
description:
- Enable/disable WFA compatibility.
@@ -410,6 +417,7 @@ EXAMPLES = """
id: "17"
ssid_pattern: "<your_own_value>"
phishing_ssid_detect: "enable"
+ rolling_wtp_upgrade: "enable"
wfa_compatibility: "enable"
"""
@@ -507,6 +515,7 @@ def filter_wireless_controller_setting_data(json):
"firmware_provision_on_authorization",
"offending_ssid",
"phishing_ssid_detect",
+ "rolling_wtp_upgrade",
"wfa_compatibility",
]
@@ -569,11 +578,12 @@ def wireless_controller_setting(data, fos):
wireless_controller_setting_data = flatten_multilists_attributes(
wireless_controller_setting_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_setting_data(wireless_controller_setting_data)
+ filtered_data = filter_wireless_controller_setting_data(
+ wireless_controller_setting_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wireless-controller", "setting", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "setting", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -882,6 +892,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "rolling_wtp_upgrade": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"darrp_optimize": {"v_range": [["v6.2.0", ""]], "type": "integer"},
"darrp_optimize_schedules": {
"type": "list",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_snmp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_snmp.py
index c2aeb28fd..e0e72a8f4 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_snmp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_snmp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -415,11 +415,10 @@ def wireless_controller_snmp(data, fos):
wireless_controller_snmp_data = flatten_multilists_attributes(
wireless_controller_snmp_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_snmp_data(wireless_controller_snmp_data)
- )
+ filtered_data = filter_wireless_controller_snmp_data(wireless_controller_snmp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wireless-controller", "snmp", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "snmp", data=converted_data, vdom=vdom)
def is_successful_status(resp):
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_spectral_info.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_spectral_info.py
index 412dd2747..c1ae108eb 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_spectral_info.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_spectral_info.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"[wtp_id]": "set_wtp_id"}
+ speciallist = {"[wtp_id]": "set_wtp_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,12 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def wireless_controller_spectral_info(data, fos, check_mode=False):
vdom = data["vdom"]
wireless_controller_spectral_info_data = data["wireless_controller_spectral_info"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_spectral_info_data(
- wireless_controller_spectral_info_data
- )
+ filtered_data = filter_wireless_controller_spectral_info_data(
+ wireless_controller_spectral_info_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set(
"wireless-controller", "spectral-info", data=converted_data, vdom=vdom
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ssid_policy.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ssid_policy.py
index cbc591e35..127e5558e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ssid_policy.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_ssid_policy.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -226,15 +226,14 @@ def wireless_controller_ssid_policy(data, fos):
state = data["state"]
wireless_controller_ssid_policy_data = data["wireless_controller_ssid_policy"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_ssid_policy_data(
- wireless_controller_ssid_policy_data
- )
+ filtered_data = filter_wireless_controller_ssid_policy_data(
+ wireless_controller_ssid_policy_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "ssid-policy", data=filtered_data, vdom=vdom
+ "wireless-controller", "ssid-policy", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_status.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_status.py
index 7e0df42ac..021d06c0b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_status.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_status.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"[1|2]": "set_1_2"}
+ speciallist = {"[1|2]": "set_1_2"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def wireless_controller_status(data, fos):
vdom = data["vdom"]
wireless_controller_status_data = data["wireless_controller_status"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_status_data(wireless_controller_status_data)
+ filtered_data = filter_wireless_controller_status_data(
+ wireless_controller_status_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("wireless-controller", "status", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_syslog_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_syslog_profile.py
index b83690a6f..9b09dca68 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_syslog_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_syslog_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -275,15 +275,14 @@ def wireless_controller_syslog_profile(data, fos):
state = data["state"]
wireless_controller_syslog_profile_data = data["wireless_controller_syslog_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_syslog_profile_data(
- wireless_controller_syslog_profile_data
- )
+ filtered_data = filter_wireless_controller_syslog_profile_data(
+ wireless_controller_syslog_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "syslog-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "syslog-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_timers.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_timers.py
index 89303b171..78cf83dca 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_timers.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_timers.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -80,6 +80,20 @@ options:
default: null
type: dict
suboptions:
+ ap_reboot_wait_interval1:
+ description:
+ - Time in minutes to wait before AP reboots when there is no controller detected (5 - 65535).
+ type: int
+ ap_reboot_wait_interval2:
+ description:
+ - Time in minutes to wait before AP reboots when there is no controller detected and standalone SSIDs are pushed to the AP in the previous
+ session (5 - 65535).
+ type: int
+ ap_reboot_wait_time:
+ description:
+ - 'Time to reboot the AP when there is no controller detected and standalone SSIDs are pushed to the AP in the previous session, format hh
+ :mm.'
+ type: str
auth_timeout:
description:
- Time after which a client is considered failed in RADIUS authentication and times out (5 - 30 sec).
@@ -143,6 +157,10 @@ options:
description:
- Time period to keep IPsec VPN interfaces up after WTP sessions are disconnected (30 - 3600 sec).
type: int
+ nat_session_keep_alive:
+ description:
+ - Maximal time in seconds between control requests sent by the managed WTP, AP, or FortiAP (0 - 255 sec).
+ type: int
radio_stats_interval:
description:
- Time between running radio reports (1 - 255 sec).
@@ -178,6 +196,9 @@ EXAMPLES = """
fortinet.fortios.fortios_wireless_controller_timers:
vdom: "{{ vdom }}"
wireless_controller_timers:
+ ap_reboot_wait_interval1: "0"
+ ap_reboot_wait_interval2: "0"
+ ap_reboot_wait_time: "<your_own_value>"
auth_timeout: "5"
ble_scan_report_intv: "30"
client_idle_rehome_timeout: "20"
@@ -192,12 +213,13 @@ EXAMPLES = """
echo_interval: "30"
fake_ap_log: "1"
ipsec_intf_cleanup: "120"
+ nat_session_keep_alive: "0"
radio_stats_interval: "15"
rogue_ap_cleanup: "0"
rogue_ap_log: "0"
sta_capability_interval: "30"
sta_locate_timer: "1800"
- sta_stats_interval: "1"
+ sta_stats_interval: "10"
vap_stats_interval: "15"
"""
@@ -282,6 +304,9 @@ from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.data_post
def filter_wireless_controller_timers_data(json):
option_list = [
+ "ap_reboot_wait_interval1",
+ "ap_reboot_wait_interval2",
+ "ap_reboot_wait_time",
"auth_timeout",
"ble_scan_report_intv",
"client_idle_rehome_timeout",
@@ -294,6 +319,7 @@ def filter_wireless_controller_timers_data(json):
"echo_interval",
"fake_ap_log",
"ipsec_intf_cleanup",
+ "nat_session_keep_alive",
"radio_stats_interval",
"rogue_ap_cleanup",
"rogue_ap_log",
@@ -329,11 +355,12 @@ def underscore_to_hyphen(data):
def wireless_controller_timers(data, fos):
vdom = data["vdom"]
wireless_controller_timers_data = data["wireless_controller_timers"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_timers_data(wireless_controller_timers_data)
+ filtered_data = filter_wireless_controller_timers_data(
+ wireless_controller_timers_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
- return fos.set("wireless-controller", "timers", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "timers", data=converted_data, vdom=vdom)
def is_successful_status(resp):
@@ -371,6 +398,7 @@ versioned_schema = {
"type": "dict",
"children": {
"echo_interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "nat_session_keep_alive": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"discovery_interval": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"client_idle_timeout": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"client_idle_rehome_timeout": {"v_range": [["v7.2.0", ""]], "type": "integer"},
@@ -386,6 +414,9 @@ versioned_schema = {
"ipsec_intf_cleanup": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"ble_scan_report_intv": {"v_range": [["v6.0.0", ""]], "type": "integer"},
"drma_interval": {"v_range": [["v6.4.4", ""]], "type": "integer"},
+ "ap_reboot_wait_interval1": {"v_range": [["v7.4.2", ""]], "type": "integer"},
+ "ap_reboot_wait_time": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "ap_reboot_wait_interval2": {"v_range": [["v7.4.2", ""]], "type": "integer"},
"darrp_optimize": {"v_range": [["v6.0.0", "v6.0.11"]], "type": "integer"},
"darrp_day": {
"v_range": [["v6.0.0", "v6.0.11"]],
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_utm_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_utm_profile.py
index a630c1dbe..f1af516f2 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_utm_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_utm_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -276,11 +276,10 @@ def wireless_controller_utm_profile(data, fos, check_mode=False):
state = data["state"]
wireless_controller_utm_profile_data = data["wireless_controller_utm_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_utm_profile_data(
- wireless_controller_utm_profile_data
- )
+ filtered_data = filter_wireless_controller_utm_profile_data(
+ wireless_controller_utm_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -349,7 +348,7 @@ def wireless_controller_utm_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "utm-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "utm-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap.py
index a93e9e4d0..2ece585cc 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -954,6 +954,14 @@ options:
type: list
elements: str
choices:
+ - '1'
+ - '1-basic'
+ - '2'
+ - '2-basic'
+ - '5.5'
+ - '5.5-basic'
+ - '11'
+ - '11-basic'
- '6'
- '6-basic'
- '9'
@@ -970,14 +978,6 @@ options:
- '48-basic'
- '54'
- '54-basic'
- - '1'
- - '1-basic'
- - '2'
- - '2-basic'
- - '5.5'
- - '5.5-basic'
- - '11'
- - '11-basic'
rates_11ac_mcs_map:
description:
- Comma separated list of max supported VHT MCS for spatial streams 1 through 8.
@@ -1112,6 +1112,14 @@ options:
type: list
elements: str
choices:
+ - '1'
+ - '1-basic'
+ - '2'
+ - '2-basic'
+ - '5.5'
+ - '5.5-basic'
+ - '11'
+ - '11-basic'
- '6'
- '6-basic'
- '9'
@@ -1128,14 +1136,6 @@ options:
- '48-basic'
- '54'
- '54-basic'
- - '1'
- - '1-basic'
- - '2'
- - '2-basic'
- - '5.5'
- - '5.5-basic'
- - '11'
- - '11-basic'
rates_11n_ss12:
description:
- Allowed data rates for 802.11n with 1 or 2 spatial streams.
@@ -1180,6 +1180,13 @@ options:
- 'mcs29/4'
- 'mcs30/4'
- 'mcs31/4'
+ roaming_acct_interim_update:
+ description:
+ - Enable/disable using accounting interim update instead of accounting start/stop on roaming for WPA-Enterprise security.
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
sae_groups:
description:
- SAE-Groups.
@@ -1209,6 +1216,13 @@ options:
choices:
- 'enable'
- 'disable'
+ sae_hnp_only:
+ description:
+ - Use hunting-and-pecking-only mechanism for PWE derivation .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
sae_password:
description:
- WPA3 SAE password to be used to authenticate WiFi users.
@@ -1299,6 +1313,20 @@ options:
- User group name. Source user.group.name.
required: true
type: str
+ set_80211k:
+ description:
+ - Enable/disable 802.11k assisted roaming .
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
+ set_80211v:
+ description:
+ - Enable/disable 802.11v assisted roaming .
+ type: str
+ choices:
+ - 'disable'
+ - 'enable'
split_tunneling:
description:
- Enable/disable split tunneling .
@@ -1606,25 +1634,27 @@ EXAMPLES = """
radius_mac_mpsk_auth: "enable"
radius_mac_mpsk_timeout: "86400"
radius_server: "<your_own_value> (source user.radius.name)"
- rates_11a: "6"
+ rates_11a: "1"
rates_11ac_mcs_map: "<your_own_value>"
rates_11ac_ss12: "mcs0/1"
rates_11ac_ss34: "mcs0/3"
rates_11ax_mcs_map: "<your_own_value>"
rates_11ax_ss12: "mcs0/1"
rates_11ax_ss34: "mcs0/3"
- rates_11bg: "6"
+ rates_11bg: "1"
rates_11n_ss12: "mcs0/1"
rates_11n_ss34: "mcs16/3"
+ roaming_acct_interim_update: "enable"
sae_groups: "19"
sae_h2e_only: "enable"
+ sae_hnp_only: "enable"
sae_password: "<your_own_value>"
sae_pk: "enable"
sae_private_key: "<your_own_value>"
scan_botnet_connections: "disable"
schedule:
-
- name: "default_name_165 (source firewall.schedule.group.name firewall.schedule.recurring.name firewall.schedule.onetime.name)"
+ name: "default_name_167 (source firewall.schedule.group.name firewall.schedule.recurring.name firewall.schedule.onetime.name)"
secondary_wag_profile: "<your_own_value> (source wireless-controller.wag-profile.name)"
security: "open"
security_exempt_list: "<your_own_value> (source user.security-exempt-list.name)"
@@ -1632,7 +1662,9 @@ EXAMPLES = """
security_redirect_url: "<your_own_value>"
selected_usergroups:
-
- name: "default_name_172 (source user.group.name)"
+ name: "default_name_174 (source user.group.name)"
+ set_80211k: "disable"
+ set_80211v: "disable"
split_tunneling: "enable"
ssid: "<your_own_value>"
sticky_client_remove: "enable"
@@ -1645,7 +1677,7 @@ EXAMPLES = """
tunnel_fallback_interval: "7200"
usergroup:
-
- name: "default_name_184 (source user.group.name)"
+ name: "default_name_188 (source user.group.name)"
utm_log: "enable"
utm_profile: "<your_own_value> (source wireless-controller.utm-profile.name)"
utm_status: "enable"
@@ -1653,11 +1685,11 @@ EXAMPLES = """
vlan_auto: "enable"
vlan_name:
-
- name: "default_name_191"
+ name: "default_name_195"
vlan_id: "<your_own_value>"
vlan_pool:
-
- id: "194"
+ id: "198"
wtp_group: "<your_own_value> (source wireless-controller.wtp-group.name)"
vlan_pooling: "wtp-group"
vlanid: "0"
@@ -1896,8 +1928,10 @@ def filter_wireless_controller_vap_data(json):
"rates_11bg",
"rates_11n_ss12",
"rates_11n_ss34",
+ "roaming_acct_interim_update",
"sae_groups",
"sae_h2e_only",
+ "sae_hnp_only",
"sae_password",
"sae_pk",
"sae_private_key",
@@ -1909,6 +1943,8 @@ def filter_wireless_controller_vap_data(json):
"security_obsolete_option",
"security_redirect_url",
"selected_usergroups",
+ "set_80211k",
+ "set_80211v",
"split_tunneling",
"ssid",
"sticky_client_remove",
@@ -2000,6 +2036,32 @@ def underscore_to_hyphen(data):
return data
+def valid_attr_to_invalid_attr(data):
+ speciallist = {"80211k": "set_80211k", "80211v": "set_80211v"}
+
+ for k, v in speciallist.items():
+ if v == data:
+ return k
+
+ return data
+
+
+def valid_attr_to_invalid_attrs(data):
+ if isinstance(data, list):
+ new_data = []
+ for elem in data:
+ elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
+ elif isinstance(data, dict):
+ new_data = {}
+ for k, v in data.items():
+ new_data[valid_attr_to_invalid_attr(k)] = valid_attr_to_invalid_attrs(v)
+ data = new_data
+
+ return data
+
+
def wireless_controller_vap(data, fos, check_mode=False):
vdom = data["vdom"]
@@ -2009,9 +2071,8 @@ def wireless_controller_vap(data, fos, check_mode=False):
wireless_controller_vap_data = flatten_multilists_attributes(
wireless_controller_vap_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_vap_data(wireless_controller_vap_data)
- )
+ filtered_data = filter_wireless_controller_vap_data(wireless_controller_vap_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
@@ -2075,7 +2136,7 @@ def wireless_controller_vap(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wireless-controller", "vap", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "vap", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -2201,11 +2262,6 @@ versioned_schema = {
{"value": "prefer-use"},
],
},
- "voice_enterprise": {
- "v_range": [["v6.0.0", ""]],
- "type": "string",
- "options": [{"value": "disable"}, {"value": "enable"}],
- },
"neighbor_report_dual_band": {
"v_range": [["v7.0.0", ""]],
"type": "string",
@@ -2389,6 +2445,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "enable"}, {"value": "disable"}],
},
+ "sae_hnp_only": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"sae_pk": {
"v_range": [["v7.0.8", "v7.0.12"], ["v7.2.1", ""]],
"type": "string",
@@ -2755,6 +2816,11 @@ versioned_schema = {
"options": [{"value": "enable"}, {"value": "disable"}],
},
"eap_reauth_intv": {"v_range": [["v6.0.0", ""]], "type": "integer"},
+ "roaming_acct_interim_update": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"qos_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"hotspot20_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"access_control_list": {"v_range": [["v6.4.0", ""]], "type": "string"},
@@ -2766,6 +2832,20 @@ versioned_schema = {
"v_range": [["v6.0.0", ""]],
"type": "list",
"options": [
+ {"value": "1", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "1-basic", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "2", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "2-basic", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "5.5", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {
+ "value": "5.5-basic",
+ "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]],
+ },
+ {"value": "11", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {
+ "value": "11-basic",
+ "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]],
+ },
{"value": "6"},
{"value": "6-basic"},
{"value": "9"},
@@ -2782,14 +2862,6 @@ versioned_schema = {
{"value": "48-basic"},
{"value": "54"},
{"value": "54-basic"},
- {"value": "1", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "1-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "2", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "2-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "5.5", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "5.5-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "11", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "11-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
],
"multiple_values": True,
"elements": "str",
@@ -2798,6 +2870,20 @@ versioned_schema = {
"v_range": [["v6.0.0", ""]],
"type": "list",
"options": [
+ {"value": "1", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "1-basic", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "2", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "2-basic", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {"value": "5.5", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {
+ "value": "5.5-basic",
+ "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]],
+ },
+ {"value": "11", "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]]},
+ {
+ "value": "11-basic",
+ "v_range": [["v6.0.0", "v7.4.0"], ["v7.4.2", ""]],
+ },
{"value": "6"},
{"value": "6-basic"},
{"value": "9"},
@@ -2814,14 +2900,6 @@ versioned_schema = {
{"value": "48-basic"},
{"value": "54"},
{"value": "54-basic"},
- {"value": "1", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "1-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "2", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "2-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "5.5", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "5.5-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "11", "v_range": [["v6.0.0", "v7.4.0"]]},
- {"value": "11-basic", "v_range": [["v6.0.0", "v7.4.0"]]},
],
"multiple_values": True,
"elements": "str",
@@ -2960,6 +3038,11 @@ versioned_schema = {
"type": "string",
"options": [{"value": "direct"}, {"value": "indirect"}],
},
+ "voice_enterprise": {
+ "v_range": [["v6.0.0", "v7.4.1"]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
"mac_filter": {
"v_range": [["v6.0.0", "v7.4.0"]],
"type": "string",
@@ -3192,6 +3275,16 @@ versioned_schema = {
"type": "string",
},
"vdom": {"v_range": [["v6.0.0", "v6.0.11"]], "type": "string"},
+ "set_80211k": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
+ "set_80211v": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "disable"}, {"value": "enable"}],
+ },
},
"v_range": [["v6.0.0", ""]],
}
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_group.py
index 3840c8f0f..ed9b150f6 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -244,9 +244,10 @@ def wireless_controller_vap_group(data, fos, check_mode=False):
state = data["state"]
wireless_controller_vap_group_data = data["wireless_controller_vap_group"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_vap_group_data(wireless_controller_vap_group_data)
+ filtered_data = filter_wireless_controller_vap_group_data(
+ wireless_controller_vap_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -313,7 +314,7 @@ def wireless_controller_vap_group(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "vap-group", data=filtered_data, vdom=vdom
+ "wireless-controller", "vap-group", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_status.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_status.py
index df3598dcf..c4becd60e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_status.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_vap_status.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"[1]": "set_1"}
+ speciallist = {"[1]": "set_1"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def wireless_controller_vap_status(data, fos):
vdom = data["vdom"]
wireless_controller_vap_status_data = data["wireless_controller_vap_status"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_vap_status_data(wireless_controller_vap_status_data)
+ filtered_data = filter_wireless_controller_vap_status_data(
+ wireless_controller_vap_status_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("wireless-controller", "vap-status", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wag_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wag_profile.py
index 45859c662..3cfb8193e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wag_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wag_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -278,11 +278,10 @@ def wireless_controller_wag_profile(data, fos, check_mode=False):
state = data["state"]
wireless_controller_wag_profile_data = data["wireless_controller_wag_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_wag_profile_data(
- wireless_controller_wag_profile_data
- )
+ filtered_data = filter_wireless_controller_wag_profile_data(
+ wireless_controller_wag_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -351,7 +350,7 @@ def wireless_controller_wag_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "wag-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "wag-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wids_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wids_profile.py
index 49583d5af..815fdf52b 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wids_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wids_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -636,11 +636,10 @@ def wireless_controller_wids_profile(data, fos, check_mode=False):
state = data["state"]
wireless_controller_wids_profile_data = data["wireless_controller_wids_profile"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_wids_profile_data(
- wireless_controller_wids_profile_data
- )
+ filtered_data = filter_wireless_controller_wids_profile_data(
+ wireless_controller_wids_profile_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -709,7 +708,7 @@ def wireless_controller_wids_profile(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "wids-profile", data=filtered_data, vdom=vdom
+ "wireless-controller", "wids-profile", data=converted_data, vdom=vdom
)
elif state == "absent":
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp.py
index cfc572495..d1c0450e5 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -397,6 +397,20 @@ options:
choices:
- 'enable'
- 'disable'
+ purdue_level:
+ description:
+ - Purdue Level of this WTP.
+ type: str
+ choices:
+ - '1'
+ - '1.5'
+ - '2'
+ - '2.5'
+ - '3'
+ - '3.5'
+ - '4'
+ - '5'
+ - '5.5'
radio_1:
description:
- Configuration options for radio 1.
@@ -1161,6 +1175,7 @@ EXAMPLES = """
override_login_passwd_change: "enable"
override_split_tunnel: "enable"
override_wan_port_mode: "enable"
+ purdue_level: "1"
radio_1:
auto_power_high: "17"
auto_power_level: "enable"
@@ -1184,7 +1199,7 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_74 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_75 (source wireless-controller.vap-group.name system.interface.name)"
radio_2:
auto_power_high: "17"
auto_power_level: "enable"
@@ -1208,7 +1223,7 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_96 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_97 (source wireless-controller.vap-group.name system.interface.name)"
radio_3:
auto_power_high: "17"
auto_power_level: "enable"
@@ -1232,7 +1247,7 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_118 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_119 (source wireless-controller.vap-group.name system.interface.name)"
radio_4:
auto_power_high: "17"
auto_power_level: "enable"
@@ -1255,14 +1270,14 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_139 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_140 (source wireless-controller.vap-group.name system.interface.name)"
region: "<your_own_value> (source wireless-controller.region.name)"
region_x: "<your_own_value>"
region_y: "<your_own_value>"
split_tunneling_acl:
-
dest_ip: "<your_own_value>"
- id: "145"
+ id: "146"
split_tunneling_acl_local_ap_subnet: "enable"
split_tunneling_acl_path: "tunnel"
tun_mtu_downlink: "0"
@@ -1394,6 +1409,7 @@ def filter_wireless_controller_wtp_data(json):
"override_login_passwd_change",
"override_split_tunnel",
"override_wan_port_mode",
+ "purdue_level",
"radio_1",
"radio_2",
"radio_3",
@@ -1475,9 +1491,8 @@ def wireless_controller_wtp(data, fos, check_mode=False):
wireless_controller_wtp_data = flatten_multilists_attributes(
wireless_controller_wtp_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_wtp_data(wireless_controller_wtp_data)
- )
+ filtered_data = filter_wireless_controller_wtp_data(wireless_controller_wtp_data)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -1541,7 +1556,7 @@ def wireless_controller_wtp(data, fos, check_mode=False):
return True, False, {"reason: ": "Must provide state parameter"}, {}
if state == "present" or state is True:
- return fos.set("wireless-controller", "wtp", data=filtered_data, vdom=vdom)
+ return fos.set("wireless-controller", "wtp", data=converted_data, vdom=vdom)
elif state == "absent":
return fos.delete(
@@ -2408,6 +2423,21 @@ versioned_schema = {
{"value": "disable"},
],
},
+ "purdue_level": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [
+ {"value": "1"},
+ {"value": "1.5"},
+ {"value": "2"},
+ {"value": "2.5"},
+ {"value": "3"},
+ {"value": "3.5"},
+ {"value": "4"},
+ {"value": "5"},
+ {"value": "5.5"},
+ ],
+ },
"coordinate_latitude": {"v_range": [["v6.0.0", ""]], "type": "string"},
"coordinate_longitude": {"v_range": [["v6.0.0", ""]], "type": "string"},
"index": {
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_group.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_group.py
index 422171bef..f4d86d89e 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_group.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_group.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -127,7 +127,12 @@ options:
- '233G'
- '234G'
- '431G'
+ - '432G'
- '433G'
+ - '241K'
+ - '243K'
+ - '441K'
+ - '443K'
- 'U421E'
- 'U422EV'
- 'U423E'
@@ -327,9 +332,10 @@ def wireless_controller_wtp_group(data, fos, check_mode=False):
state = data["state"]
wireless_controller_wtp_group_data = data["wireless_controller_wtp_group"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_wtp_group_data(wireless_controller_wtp_group_data)
+ filtered_data = filter_wireless_controller_wtp_group_data(
+ wireless_controller_wtp_group_data
)
+ converted_data = underscore_to_hyphen(filtered_data)
# check_mode starts from here
if check_mode:
@@ -396,7 +402,7 @@ def wireless_controller_wtp_group(data, fos, check_mode=False):
if state == "present" or state is True:
return fos.set(
- "wireless-controller", "wtp-group", data=filtered_data, vdom=vdom
+ "wireless-controller", "wtp-group", data=converted_data, vdom=vdom
)
elif state == "absent":
@@ -500,7 +506,12 @@ versioned_schema = {
{"value": "233G", "v_range": [["v7.0.8", "v7.0.12"], ["v7.2.1", ""]]},
{"value": "234G", "v_range": [["v7.4.0", ""]]},
{"value": "431G", "v_range": [["v7.0.8", "v7.0.12"], ["v7.2.1", ""]]},
+ {"value": "432G", "v_range": [["v7.4.2", ""]]},
{"value": "433G", "v_range": [["v7.0.8", "v7.0.12"], ["v7.2.1", ""]]},
+ {"value": "241K", "v_range": [["v7.4.2", ""]]},
+ {"value": "243K", "v_range": [["v7.4.2", ""]]},
+ {"value": "441K", "v_range": [["v7.4.2", ""]]},
+ {"value": "443K", "v_range": [["v7.4.2", ""]]},
{"value": "U421E"},
{"value": "U422EV"},
{"value": "U423E"},
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_profile.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_profile.py
index cd974c556..3ef9b2755 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_profile.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_profile.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -320,6 +320,10 @@ options:
description:
- Bluetooth Low Energy profile name. Source wireless-controller.ble-profile.name.
type: str
+ bonjour_profile:
+ description:
+ - Bonjour profile name. Source wireless-controller.bonjour-profile.name.
+ type: str
comment:
description:
- Comment.
@@ -943,7 +947,12 @@ options:
- '233G'
- '234G'
- '431G'
+ - '432G'
- '433G'
+ - '241K'
+ - '243K'
+ - '441K'
+ - '443K'
- 'U421E'
- 'U422EV'
- 'U423E'
@@ -1299,6 +1308,7 @@ options:
type: str
choices:
- 'none'
+ - 'custom'
- 'FANT-04ABGN-0606-O-N'
- 'FANT-04ABGN-1414-P-N'
- 'FANT-04ABGN-8065-P-N'
@@ -1306,6 +1316,10 @@ options:
- 'FANT-04ABGN-0606-P-R'
- 'FANT-10ACAX-1213-D-N'
- 'FANT-08ABGN-1213-D-R'
+ optional_antenna_gain:
+ description:
+ - Optional antenna gain in dBi (0 to 20).
+ type: str
power_level:
description:
- Radio EIRP power level as a percentage of the maximum EIRP power (0 - 100).
@@ -1354,6 +1368,10 @@ options:
description:
- BSSID for WiFi network.
type: str
+ sam_ca_certificate:
+ description:
+ - CA certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_captive_portal:
description:
- Enable/disable Captive Portal Authentication .
@@ -1361,6 +1379,10 @@ options:
choices:
- 'enable'
- 'disable'
+ sam_client_certificate:
+ description:
+ - Client certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_cwp_failure_string:
description:
- Failure identification on the page after an incorrect login.
@@ -1385,10 +1407,26 @@ options:
description:
- Username for captive portal authentication.
type: str
+ sam_eap_method:
+ description:
+ - Select WPA2/WPA3-ENTERPRISE EAP Method .
+ type: str
+ choices:
+ - 'both'
+ - 'tls'
+ - 'peap'
sam_password:
description:
- Passphrase for WiFi network connection.
type: str
+ sam_private_key:
+ description:
+ - Private key for WPA2/WPA3-ENTERPRISE.
+ type: str
+ sam_private_key_password:
+ description:
+ - Password for private key file for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_report_intv:
description:
- SAM report interval (sec), 0 for a one-time report.
@@ -1401,6 +1439,8 @@ options:
- 'open'
- 'wpa-personal'
- 'wpa-enterprise'
+ - 'wpa3-sae'
+ - 'owe'
sam_server:
description:
- SAM test server IP address or domain name.
@@ -1793,6 +1833,7 @@ options:
type: str
choices:
- 'none'
+ - 'custom'
- 'FANT-04ABGN-0606-O-N'
- 'FANT-04ABGN-1414-P-N'
- 'FANT-04ABGN-8065-P-N'
@@ -1800,6 +1841,10 @@ options:
- 'FANT-04ABGN-0606-P-R'
- 'FANT-10ACAX-1213-D-N'
- 'FANT-08ABGN-1213-D-R'
+ optional_antenna_gain:
+ description:
+ - Optional antenna gain in dBi (0 to 20).
+ type: str
power_level:
description:
- Radio EIRP power level as a percentage of the maximum EIRP power (0 - 100).
@@ -1848,6 +1893,10 @@ options:
description:
- BSSID for WiFi network.
type: str
+ sam_ca_certificate:
+ description:
+ - CA certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_captive_portal:
description:
- Enable/disable Captive Portal Authentication .
@@ -1855,6 +1904,10 @@ options:
choices:
- 'enable'
- 'disable'
+ sam_client_certificate:
+ description:
+ - Client certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_cwp_failure_string:
description:
- Failure identification on the page after an incorrect login.
@@ -1879,10 +1932,26 @@ options:
description:
- Username for captive portal authentication.
type: str
+ sam_eap_method:
+ description:
+ - Select WPA2/WPA3-ENTERPRISE EAP Method .
+ type: str
+ choices:
+ - 'both'
+ - 'tls'
+ - 'peap'
sam_password:
description:
- Passphrase for WiFi network connection.
type: str
+ sam_private_key:
+ description:
+ - Private key for WPA2/WPA3-ENTERPRISE.
+ type: str
+ sam_private_key_password:
+ description:
+ - Password for private key file for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_report_intv:
description:
- SAM report interval (sec), 0 for a one-time report.
@@ -1895,6 +1964,8 @@ options:
- 'open'
- 'wpa-personal'
- 'wpa-enterprise'
+ - 'wpa3-sae'
+ - 'owe'
sam_server:
description:
- SAM test server IP address or domain name.
@@ -2287,6 +2358,7 @@ options:
type: str
choices:
- 'none'
+ - 'custom'
- 'FANT-04ABGN-0606-O-N'
- 'FANT-04ABGN-1414-P-N'
- 'FANT-04ABGN-8065-P-N'
@@ -2294,6 +2366,10 @@ options:
- 'FANT-04ABGN-0606-P-R'
- 'FANT-10ACAX-1213-D-N'
- 'FANT-08ABGN-1213-D-R'
+ optional_antenna_gain:
+ description:
+ - Optional antenna gain in dBi (0 to 20).
+ type: str
power_level:
description:
- Radio EIRP power level as a percentage of the maximum EIRP power (0 - 100).
@@ -2342,6 +2418,10 @@ options:
description:
- BSSID for WiFi network.
type: str
+ sam_ca_certificate:
+ description:
+ - CA certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_captive_portal:
description:
- Enable/disable Captive Portal Authentication .
@@ -2349,6 +2429,10 @@ options:
choices:
- 'enable'
- 'disable'
+ sam_client_certificate:
+ description:
+ - Client certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_cwp_failure_string:
description:
- Failure identification on the page after an incorrect login.
@@ -2373,10 +2457,26 @@ options:
description:
- Username for captive portal authentication.
type: str
+ sam_eap_method:
+ description:
+ - Select WPA2/WPA3-ENTERPRISE EAP Method .
+ type: str
+ choices:
+ - 'both'
+ - 'tls'
+ - 'peap'
sam_password:
description:
- Passphrase for WiFi network connection.
type: str
+ sam_private_key:
+ description:
+ - Private key for WPA2/WPA3-ENTERPRISE.
+ type: str
+ sam_private_key_password:
+ description:
+ - Password for private key file for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_report_intv:
description:
- SAM report interval (sec), 0 for a one-time report.
@@ -2389,6 +2489,8 @@ options:
- 'open'
- 'wpa-personal'
- 'wpa-enterprise'
+ - 'wpa3-sae'
+ - 'owe'
sam_server:
description:
- SAM test server IP address or domain name.
@@ -2590,7 +2692,7 @@ options:
type: str
band:
description:
- - WiFi band that Radio 3 operates on.
+ - WiFi band that Radio 4 operates on.
type: str
choices:
- '802.11a'
@@ -2767,7 +2869,7 @@ options:
- '8x8'
mode:
description:
- - Mode of radio 3. Radio 3 can be disabled, configured as an access point, a rogue AP monitor, a sniffer, or a station.
+ - Mode of radio 4. Radio 4 can be disabled, configured as an access point, a rogue AP monitor, a sniffer, or a station.
type: str
choices:
- 'disabled'
@@ -2781,6 +2883,7 @@ options:
type: str
choices:
- 'none'
+ - 'custom'
- 'FANT-04ABGN-0606-O-N'
- 'FANT-04ABGN-1414-P-N'
- 'FANT-04ABGN-8065-P-N'
@@ -2788,6 +2891,10 @@ options:
- 'FANT-04ABGN-0606-P-R'
- 'FANT-10ACAX-1213-D-N'
- 'FANT-08ABGN-1213-D-R'
+ optional_antenna_gain:
+ description:
+ - Optional antenna gain in dBi (0 to 20).
+ type: str
power_level:
description:
- Radio EIRP power level as a percentage of the maximum EIRP power (0 - 100).
@@ -2832,6 +2939,10 @@ options:
description:
- BSSID for WiFi network.
type: str
+ sam_ca_certificate:
+ description:
+ - CA certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_captive_portal:
description:
- Enable/disable Captive Portal Authentication .
@@ -2839,6 +2950,10 @@ options:
choices:
- 'enable'
- 'disable'
+ sam_client_certificate:
+ description:
+ - Client certificate for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_cwp_failure_string:
description:
- Failure identification on the page after an incorrect login.
@@ -2863,10 +2978,26 @@ options:
description:
- Username for captive portal authentication.
type: str
+ sam_eap_method:
+ description:
+ - Select WPA2/WPA3-ENTERPRISE EAP Method .
+ type: str
+ choices:
+ - 'both'
+ - 'tls'
+ - 'peap'
sam_password:
description:
- Passphrase for WiFi network connection.
type: str
+ sam_private_key:
+ description:
+ - Private key for WPA2/WPA3-ENTERPRISE.
+ type: str
+ sam_private_key_password:
+ description:
+ - Password for private key file for WPA2/WPA3-ENTERPRISE.
+ type: str
sam_report_intv:
description:
- SAM report interval (sec), 0 for a one-time report.
@@ -2879,6 +3010,8 @@ options:
- 'open'
- 'wpa-personal'
- 'wpa-enterprise'
+ - 'wpa3-sae'
+ - 'owe'
sam_server:
description:
- SAM test server IP address or domain name.
@@ -3034,6 +3167,13 @@ options:
choices:
- 'none'
- '802.1x'
+ wan_port_auth_macsec:
+ description:
+ - Enable/disable WAN port 802.1x supplicant MACsec policy .
+ type: str
+ choices:
+ - 'enable'
+ - 'disable'
wan_port_auth_methods:
description:
- WAN port 802.1x supplicant EAP methods .
@@ -3072,12 +3212,13 @@ EXAMPLES = """
ap_handoff: "enable"
apcfg_profile: "<your_own_value> (source wireless-controller.apcfg-profile.name)"
ble_profile: "<your_own_value> (source wireless-controller.ble-profile.name)"
+ bonjour_profile: "<your_own_value> (source wireless-controller.bonjour-profile.name)"
comment: "Comment."
console_login: "enable"
control_message_offload: "ebp-frame"
deny_mac_list:
-
- id: "12"
+ id: "13"
mac: "<your_own_value>"
dtls_in_kernel: "enable"
dtls_policy: "clear-text"
@@ -3162,13 +3303,13 @@ EXAMPLES = """
station_locate: "enable"
led_schedules:
-
- name: "default_name_96 (source firewall.schedule.group.name firewall.schedule.recurring.name firewall.schedule.onetime.name)"
+ name: "default_name_97 (source firewall.schedule.group.name firewall.schedule.recurring.name firewall.schedule.onetime.name)"
led_state: "enable"
lldp: "enable"
login_passwd: "<your_own_value>"
login_passwd_change: "yes"
max_clients: "0"
- name: "default_name_102"
+ name: "default_name_103"
platform:
ddscan: "enable"
mode: "single-5G"
@@ -3219,6 +3360,7 @@ EXAMPLES = """
mimo_mode: "default"
mode: "disabled"
optional_antenna: "none"
+ optional_antenna_gain: "<your_own_value>"
power_level: "100"
power_mode: "dBm"
power_value: "27"
@@ -3227,14 +3369,19 @@ EXAMPLES = """
radio_id: "2"
rts_threshold: "2346"
sam_bssid: "<your_own_value>"
+ sam_ca_certificate: "<your_own_value>"
sam_captive_portal: "enable"
+ sam_client_certificate: "<your_own_value>"
sam_cwp_failure_string: "<your_own_value>"
sam_cwp_match_string: "<your_own_value>"
sam_cwp_password: "<your_own_value>"
sam_cwp_success_string: "<your_own_value>"
sam_cwp_test_url: "<your_own_value>"
sam_cwp_username: "<your_own_value>"
+ sam_eap_method: "both"
sam_password: "<your_own_value>"
+ sam_private_key: "<your_own_value>"
+ sam_private_key_password: "<your_own_value>"
sam_report_intv: "0"
sam_security_type: "open"
sam_server: "<your_own_value>"
@@ -3251,7 +3398,7 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_183 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_190 (source wireless-controller.vap-group.name system.interface.name)"
wids_profile: "<your_own_value> (source wireless-controller.wids-profile.name)"
zero_wait_dfs: "enable"
radio_2:
@@ -3299,6 +3446,7 @@ EXAMPLES = """
mimo_mode: "default"
mode: "disabled"
optional_antenna: "none"
+ optional_antenna_gain: "<your_own_value>"
power_level: "100"
power_mode: "dBm"
power_value: "27"
@@ -3307,14 +3455,19 @@ EXAMPLES = """
radio_id: "2"
rts_threshold: "2346"
sam_bssid: "<your_own_value>"
+ sam_ca_certificate: "<your_own_value>"
sam_captive_portal: "enable"
+ sam_client_certificate: "<your_own_value>"
sam_cwp_failure_string: "<your_own_value>"
sam_cwp_match_string: "<your_own_value>"
sam_cwp_password: "<your_own_value>"
sam_cwp_success_string: "<your_own_value>"
sam_cwp_test_url: "<your_own_value>"
sam_cwp_username: "<your_own_value>"
+ sam_eap_method: "both"
sam_password: "<your_own_value>"
+ sam_private_key: "<your_own_value>"
+ sam_private_key_password: "<your_own_value>"
sam_report_intv: "0"
sam_security_type: "open"
sam_server: "<your_own_value>"
@@ -3331,7 +3484,7 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_261 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_274 (source wireless-controller.vap-group.name system.interface.name)"
wids_profile: "<your_own_value> (source wireless-controller.wids-profile.name)"
zero_wait_dfs: "enable"
radio_3:
@@ -3340,7 +3493,7 @@ EXAMPLES = """
ap_handoff: "enable"
ap_sniffer_addr: "<your_own_value>"
ap_sniffer_bufsize: "16"
- ap_sniffer_chan: "6"
+ ap_sniffer_chan: "37"
ap_sniffer_ctl: "enable"
ap_sniffer_data: "enable"
ap_sniffer_mgmt_beacon: "enable"
@@ -3379,6 +3532,7 @@ EXAMPLES = """
mimo_mode: "default"
mode: "disabled"
optional_antenna: "none"
+ optional_antenna_gain: "<your_own_value>"
power_level: "100"
power_mode: "dBm"
power_value: "27"
@@ -3387,14 +3541,19 @@ EXAMPLES = """
radio_id: "2"
rts_threshold: "2346"
sam_bssid: "<your_own_value>"
+ sam_ca_certificate: "<your_own_value>"
sam_captive_portal: "enable"
+ sam_client_certificate: "<your_own_value>"
sam_cwp_failure_string: "<your_own_value>"
sam_cwp_match_string: "<your_own_value>"
sam_cwp_password: "<your_own_value>"
sam_cwp_success_string: "<your_own_value>"
sam_cwp_test_url: "<your_own_value>"
sam_cwp_username: "<your_own_value>"
+ sam_eap_method: "both"
sam_password: "<your_own_value>"
+ sam_private_key: "<your_own_value>"
+ sam_private_key_password: "<your_own_value>"
sam_report_intv: "0"
sam_security_type: "open"
sam_server: "<your_own_value>"
@@ -3411,7 +3570,7 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_339 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_358 (source wireless-controller.vap-group.name system.interface.name)"
wids_profile: "<your_own_value> (source wireless-controller.wids-profile.name)"
zero_wait_dfs: "enable"
radio_4:
@@ -3459,6 +3618,7 @@ EXAMPLES = """
mimo_mode: "default"
mode: "disabled"
optional_antenna: "none"
+ optional_antenna_gain: "<your_own_value>"
power_level: "100"
power_mode: "dBm"
power_value: "27"
@@ -3466,14 +3626,19 @@ EXAMPLES = """
protection_mode: "rtscts"
rts_threshold: "2346"
sam_bssid: "<your_own_value>"
+ sam_ca_certificate: "<your_own_value>"
sam_captive_portal: "enable"
+ sam_client_certificate: "<your_own_value>"
sam_cwp_failure_string: "<your_own_value>"
sam_cwp_match_string: "<your_own_value>"
sam_cwp_password: "<your_own_value>"
sam_cwp_success_string: "<your_own_value>"
sam_cwp_test_url: "<your_own_value>"
sam_cwp_username: "<your_own_value>"
+ sam_eap_method: "both"
sam_password: "<your_own_value>"
+ sam_private_key: "<your_own_value>"
+ sam_private_key_password: "<your_own_value>"
sam_report_intv: "0"
sam_security_type: "open"
sam_server: "<your_own_value>"
@@ -3490,13 +3655,13 @@ EXAMPLES = """
vap_all: "tunnel"
vaps:
-
- name: "default_name_416 (source wireless-controller.vap-group.name system.interface.name)"
+ name: "default_name_441 (source wireless-controller.vap-group.name system.interface.name)"
wids_profile: "<your_own_value> (source wireless-controller.wids-profile.name)"
zero_wait_dfs: "enable"
split_tunneling_acl:
-
dest_ip: "<your_own_value>"
- id: "421"
+ id: "446"
split_tunneling_acl_local_ap_subnet: "enable"
split_tunneling_acl_path: "tunnel"
syslog_profile: "<your_own_value> (source wireless-controller.syslog-profile.name)"
@@ -3504,6 +3669,7 @@ EXAMPLES = """
tun_mtu_uplink: "0"
unii_4_5ghz_band: "enable"
wan_port_auth: "none"
+ wan_port_auth_macsec: "enable"
wan_port_auth_methods: "all"
wan_port_auth_password: "<your_own_value>"
wan_port_auth_usrname: "<your_own_value>"
@@ -3605,6 +3771,7 @@ def filter_wireless_controller_wtp_profile_data(json):
"ap_handoff",
"apcfg_profile",
"ble_profile",
+ "bonjour_profile",
"comment",
"console_login",
"control_message_offload",
@@ -3643,6 +3810,7 @@ def filter_wireless_controller_wtp_profile_data(json):
"tun_mtu_uplink",
"unii_4_5ghz_band",
"wan_port_auth",
+ "wan_port_auth_macsec",
"wan_port_auth_methods",
"wan_port_auth_password",
"wan_port_auth_usrname",
@@ -3713,9 +3881,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"80211d": "set_80211d"}
+ speciallist = {"80211d": "set_80211d"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -3724,8 +3892,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -3744,12 +3915,10 @@ def wireless_controller_wtp_profile(data, fos, check_mode=False):
wireless_controller_wtp_profile_data = flatten_multilists_attributes(
wireless_controller_wtp_profile_data
)
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_wtp_profile_data(
- wireless_controller_wtp_profile_data
- )
+ filtered_data = filter_wireless_controller_wtp_profile_data(
+ wireless_controller_wtp_profile_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
# check_mode starts from here
if check_mode:
@@ -3957,10 +4126,15 @@ versioned_schema = {
"value": "431G",
"v_range": [["v7.0.8", "v7.0.12"], ["v7.2.1", ""]],
},
+ {"value": "432G", "v_range": [["v7.4.2", ""]]},
{
"value": "433G",
"v_range": [["v7.0.8", "v7.0.12"], ["v7.2.1", ""]],
},
+ {"value": "241K", "v_range": [["v7.4.2", ""]]},
+ {"value": "243K", "v_range": [["v7.4.2", ""]]},
+ {"value": "441K", "v_range": [["v7.4.2", ""]]},
+ {"value": "443K", "v_range": [["v7.4.2", ""]]},
{"value": "U421E"},
{"value": "U422EV"},
{"value": "U423E"},
@@ -4049,6 +4223,7 @@ versioned_schema = {
"multiple_values": True,
"elements": "str",
},
+ "bonjour_profile": {"v_range": [["v7.4.2", ""]], "type": "string"},
"apcfg_profile": {"v_range": [["v6.4.0", ""]], "type": "string"},
"ble_profile": {"v_range": [["v6.0.0", ""]], "type": "string"},
"syslog_profile": {"v_range": [["v7.0.2", ""]], "type": "string"},
@@ -4687,6 +4862,7 @@ versioned_schema = {
"type": "string",
"options": [
{"value": "none"},
+ {"value": "custom", "v_range": [["v7.4.2", ""]]},
{"value": "FANT-04ABGN-0606-O-N"},
{"value": "FANT-04ABGN-1414-P-N"},
{"value": "FANT-04ABGN-8065-P-N"},
@@ -4696,6 +4872,10 @@ versioned_schema = {
{"value": "FANT-08ABGN-1213-D-R"},
],
},
+ "optional_antenna_gain": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"auto_power_level": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -4752,6 +4932,8 @@ versioned_schema = {
{"value": "open"},
{"value": "wpa-personal"},
{"value": "wpa-enterprise"},
+ {"value": "wpa3-sae", "v_range": [["v7.4.2", ""]]},
+ {"value": "owe", "v_range": [["v7.4.2", ""]]},
],
},
"sam_captive_portal": {
@@ -4771,6 +4953,21 @@ versioned_schema = {
"v_range": [["v7.0.1", ""]],
"type": "string",
},
+ "sam_eap_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "both"}, {"value": "tls"}, {"value": "peap"}],
+ },
+ "sam_client_certificate": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_private_key": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "sam_private_key_password": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_ca_certificate": {"v_range": [["v7.4.2", ""]], "type": "string"},
"sam_username": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_password": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_test": {
@@ -5049,6 +5246,7 @@ versioned_schema = {
"type": "string",
"options": [
{"value": "none"},
+ {"value": "custom", "v_range": [["v7.4.2", ""]]},
{"value": "FANT-04ABGN-0606-O-N"},
{"value": "FANT-04ABGN-1414-P-N"},
{"value": "FANT-04ABGN-8065-P-N"},
@@ -5058,6 +5256,10 @@ versioned_schema = {
{"value": "FANT-08ABGN-1213-D-R"},
],
},
+ "optional_antenna_gain": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"auto_power_level": {
"v_range": [["v6.0.0", ""]],
"type": "string",
@@ -5114,6 +5316,8 @@ versioned_schema = {
{"value": "open"},
{"value": "wpa-personal"},
{"value": "wpa-enterprise"},
+ {"value": "wpa3-sae", "v_range": [["v7.4.2", ""]]},
+ {"value": "owe", "v_range": [["v7.4.2", ""]]},
],
},
"sam_captive_portal": {
@@ -5133,6 +5337,21 @@ versioned_schema = {
"v_range": [["v7.0.1", ""]],
"type": "string",
},
+ "sam_eap_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "both"}, {"value": "tls"}, {"value": "peap"}],
+ },
+ "sam_client_certificate": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_private_key": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "sam_private_key_password": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_ca_certificate": {"v_range": [["v7.4.2", ""]], "type": "string"},
"sam_username": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_password": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_test": {
@@ -5411,6 +5630,7 @@ versioned_schema = {
"type": "string",
"options": [
{"value": "none"},
+ {"value": "custom", "v_range": [["v7.4.2", ""]]},
{"value": "FANT-04ABGN-0606-O-N"},
{"value": "FANT-04ABGN-1414-P-N"},
{"value": "FANT-04ABGN-8065-P-N"},
@@ -5420,6 +5640,10 @@ versioned_schema = {
{"value": "FANT-08ABGN-1213-D-R"},
],
},
+ "optional_antenna_gain": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"auto_power_level": {
"v_range": [["v6.2.0", ""]],
"type": "string",
@@ -5476,6 +5700,8 @@ versioned_schema = {
{"value": "open"},
{"value": "wpa-personal"},
{"value": "wpa-enterprise"},
+ {"value": "wpa3-sae", "v_range": [["v7.4.2", ""]]},
+ {"value": "owe", "v_range": [["v7.4.2", ""]]},
],
},
"sam_captive_portal": {
@@ -5495,6 +5721,21 @@ versioned_schema = {
"v_range": [["v7.0.1", ""]],
"type": "string",
},
+ "sam_eap_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "both"}, {"value": "tls"}, {"value": "peap"}],
+ },
+ "sam_client_certificate": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_private_key": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "sam_private_key_password": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_ca_certificate": {"v_range": [["v7.4.2", ""]], "type": "string"},
"sam_username": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_password": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_test": {
@@ -5770,6 +6011,7 @@ versioned_schema = {
"type": "string",
"options": [
{"value": "none"},
+ {"value": "custom", "v_range": [["v7.4.2", ""]]},
{"value": "FANT-04ABGN-0606-O-N"},
{"value": "FANT-04ABGN-1414-P-N"},
{"value": "FANT-04ABGN-8065-P-N"},
@@ -5779,6 +6021,10 @@ versioned_schema = {
{"value": "FANT-08ABGN-1213-D-R"},
],
},
+ "optional_antenna_gain": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
"auto_power_level": {
"v_range": [["v6.2.0", "v6.2.0"], ["v6.2.5", ""]],
"type": "string",
@@ -5865,6 +6111,8 @@ versioned_schema = {
{"value": "open"},
{"value": "wpa-personal"},
{"value": "wpa-enterprise"},
+ {"value": "wpa3-sae", "v_range": [["v7.4.2", ""]]},
+ {"value": "owe", "v_range": [["v7.4.2", ""]]},
],
},
"sam_captive_portal": {
@@ -5884,6 +6132,21 @@ versioned_schema = {
"v_range": [["v7.0.1", ""]],
"type": "string",
},
+ "sam_eap_method": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "both"}, {"value": "tls"}, {"value": "peap"}],
+ },
+ "sam_client_certificate": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_private_key": {"v_range": [["v7.4.2", ""]], "type": "string"},
+ "sam_private_key_password": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ },
+ "sam_ca_certificate": {"v_range": [["v7.4.2", ""]], "type": "string"},
"sam_username": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_password": {"v_range": [["v7.0.0", ""]], "type": "string"},
"sam_test": {
@@ -6267,6 +6530,11 @@ versioned_schema = {
{"value": "EAP-PEAP"},
],
},
+ "wan_port_auth_macsec": {
+ "v_range": [["v7.4.2", ""]],
+ "type": "string",
+ "options": [{"value": "enable"}, {"value": "disable"}],
+ },
"unii_4_5ghz_band": {
"v_range": [["v7.4.0", ""]],
"type": "string",
diff --git a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_status.py b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_status.py
index e7e3e0827..3f5b5929d 100644
--- a/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_status.py
+++ b/ansible_collections/fortinet/fortios/plugins/modules/fortios_wireless_controller_wtp_status.py
@@ -38,7 +38,7 @@ notes:
- Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks
requirements:
- - ansible>=2.14
+ - ansible>=2.15
options:
access_token:
description:
@@ -200,9 +200,9 @@ def underscore_to_hyphen(data):
def valid_attr_to_invalid_attr(data):
- specillist = {"<wtp_id>": "wtp_id"}
+ speciallist = {"<wtp_id>": "wtp_id"}
- for k, v in specillist.items():
+ for k, v in speciallist.items():
if v == data:
return k
@@ -211,8 +211,11 @@ def valid_attr_to_invalid_attr(data):
def valid_attr_to_invalid_attrs(data):
if isinstance(data, list):
+ new_data = []
for elem in data:
elem = valid_attr_to_invalid_attrs(elem)
+ new_data.append(elem)
+ data = new_data
elif isinstance(data, dict):
new_data = {}
for k, v in data.items():
@@ -225,10 +228,10 @@ def valid_attr_to_invalid_attrs(data):
def wireless_controller_wtp_status(data, fos):
vdom = data["vdom"]
wireless_controller_wtp_status_data = data["wireless_controller_wtp_status"]
- filtered_data = underscore_to_hyphen(
- filter_wireless_controller_wtp_status_data(wireless_controller_wtp_status_data)
+ filtered_data = filter_wireless_controller_wtp_status_data(
+ wireless_controller_wtp_status_data
)
- converted_data = valid_attr_to_invalid_attrs(filtered_data)
+ converted_data = underscore_to_hyphen(valid_attr_to_invalid_attrs(filtered_data))
return fos.set("wireless-controller", "wtp-status", data=converted_data, vdom=vdom)
diff --git a/ansible_collections/infinidat/infinibox/CHANGELOG.rst b/ansible_collections/infinidat/infinibox/CHANGELOG.rst
index b267befe0..afa6e61c6 100644
--- a/ansible_collections/infinidat/infinibox/CHANGELOG.rst
+++ b/ansible_collections/infinidat/infinibox/CHANGELOG.rst
@@ -3,6 +3,54 @@ Change Log
==========
-------------------
+v1.4.5 (2024-04-11)
+-------------------
+
+^^^^^^^^^^^^^^^^^^^^
+Project Enhancements
+^^^^^^^^^^^^^^^^^^^^
+* Update CHANGELOG.
+
+-------------------
+v1.4.4 (2024-04-09)
+-------------------
+
+^^^^^^^^^^^^^^^^^^^^
+Feature Enhancements
+^^^^^^^^^^^^^^^^^^^^
+* psdev-1178: Add infini_infinimetrics module. Allows adding an Infinibox to Infinimetrics.
+* psdev-1108: Extend configure_array example playbook to further demonstrate extensive customization of an Infinibox using Ansible.
+* psdev-1222: Add pool threshold alarm setting support to infini_pool.
+
+^^^^^^^^^
+Bug Fixes
+^^^^^^^^^
+* psdev-1221: Fix infini_notification_rule. Find the correct target ID when using a recipient. The ID cannot be assumed to be 3.
+
+^^^^^^^^^^^^^^^^^^^^
+Project Enhancements
+^^^^^^^^^^^^^^^^^^^^
+* psdev-1188: Refactor CICD to use Infinibox 2503.
+
+-------------------
+v1.4.3 (2024-02-13)
+-------------------
+
+^^^^^^^^^^^^^^^^^^^^
+Project Enhancements
+^^^^^^^^^^^^^^^^^^^^
+* psdev-1150: Update galaxy.yml for publication on Automation Hub.
+
+-------------------
+v1.4.2 (2024-02-12)
+-------------------
+
+^^^^^^^^^^^^^^^^^^^^
+Project Enhancements
+^^^^^^^^^^^^^^^^^^^^
+* psdev-1150: Update galaxy.yml for publication on Automation Hub.
+
+-------------------
v1.4.1 (2024-02-06)
-------------------
@@ -10,7 +58,6 @@ v1.4.1 (2024-02-06)
Feature Enhancements
^^^^^^^^^^^^^^^^^^^^
* Require Ansible >= 2.14.0
-* psdev-1178: Add infini_infinimetrics moduile. Allows add an Infinibox to Infinimetrics.
-------------------
v1.4.0 (2024-02-05)
diff --git a/ansible_collections/infinidat/infinibox/FILES.json b/ansible_collections/infinidat/infinibox/FILES.json
index e5a36d2bf..5553084b9 100644
--- a/ansible_collections/infinidat/infinibox/FILES.json
+++ b/ansible_collections/infinidat/infinibox/FILES.json
@@ -29,24 +29,24 @@
"format": 1
},
{
- "name": "ibox_vars/iboxNNNN_example.yaml",
+ "name": "ibox_vars/vibox.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "888179c43aa1427102ee53ba7d2a1439acd6e4ae3d9c05ce1f71fa373b315af8",
+ "chksum_sha256": "57b80073e4302ae0dd4f5a6f713c81c5fb6d92be5ff7431c028ad728dadef8c9",
"format": 1
},
{
- "name": "ibox_vars/iboxCICD.yaml",
+ "name": "ibox_vars/iboxNNNN_example.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "558e286155b4ecf459ded4d0187b317f69201750e6ec1e09abbb7b247e3f9ad3",
+ "chksum_sha256": "ebb6a3939ac236fcd9b0a738c7ece0f9d5f1dd0a7f78aed17f2e94f00325e596",
"format": 1
},
{
- "name": "ibox_vars/vibox.yaml",
+ "name": "ibox_vars/iboxCICD.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82cebc7345d44c418a05b7309bc09f69e3e0192da55a19b7ba87f0d7b14be5d0",
+ "chksum_sha256": "abc06a5ab98659985e610a5bc366e0a5ab526204da14292bf090d02af288c545",
"format": 1
},
{
@@ -102,7 +102,7 @@
"name": "playbooks/configure_array.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dd8225826ce2fcc0f59aeadef0136a962cd8c89fe40ac4001ffaa2d27864a01d",
+ "chksum_sha256": "379d76d103751fa5710763f43205abb4ec44fb530c6332914c09b2afc8d438cc",
"format": 1
},
{
@@ -295,6 +295,13 @@
"format": 1
},
{
+ "name": "plugins/modules/infini_infinimetrics.py",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "53f10edb20d7292a3b86dc39bdee8475ec78789349144dcccd9cbadc2d636a02",
+ "format": 1
+ },
+ {
"name": "plugins/modules/infini_fibre_channel_switch.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -372,10 +379,10 @@
"format": 1
},
{
- "name": "plugins/modules/infini_notification_rule.py",
+ "name": "plugins/modules/infini_pool.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "28ff855e3ffd038af35d92030c87461bcaff64f3e3c561a868f37800ecba9c33",
+ "chksum_sha256": "9e1aee3951197de002baab7333f96141debcca4db25a0f7f686b0c2203be24e1",
"format": 1
},
{
@@ -414,24 +421,24 @@
"format": 1
},
{
- "name": "plugins/modules/infini_pool.py",
+ "name": "plugins/modules/infini_port.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "09d81af6094917024aa51c39d9ae88367afa337f1944b12e9e0208369924833e",
+ "chksum_sha256": "09ed2ba4508b91df5c8a15d694463e8ea87615acd21e362ae1219b6e4bc1492f",
"format": 1
},
{
- "name": "plugins/modules/infini_port.py",
+ "name": "plugins/modules/infini_sso.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "09ed2ba4508b91df5c8a15d694463e8ea87615acd21e362ae1219b6e4bc1492f",
+ "chksum_sha256": "cbb5879bb0874d71dbf648f13c5a11c5767356cddd29c1239898b38141f4a3b4",
"format": 1
},
{
- "name": "plugins/modules/infini_sso.py",
+ "name": "plugins/modules/infini_notification_rule.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "cbb5879bb0874d71dbf648f13c5a11c5767356cddd29c1239898b38141f4a3b4",
+ "chksum_sha256": "db9a81d5adaf9ccae5a0454d651bf913c5ff361255922b9c22f6a17e990984fe",
"format": 1
},
{
@@ -662,7 +669,7 @@
"name": "tests/hacking/infini_notification_rule_present.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "82cebfaa87803000c85ffc84f6134fa88ec952c4fb374c33b0a9d83d9c40137f",
+ "chksum_sha256": "672faf6777e1f2e20330978ae22375d8fc2b964357d000dc628470795c0ac8d1",
"format": 1
},
{
@@ -848,6 +855,83 @@
"format": 1
},
{
+ "name": "tests/hacking/infini_pool_stat.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "8c7149260706e73ee4b57c9f3ad8f2905f94c82aa7251c4df5dd38b79ed5631b",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_pool_absent.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "f6d5b22375ad150dcfa5927c213f96f206ad0f5feee3e9da31da62a53a793750",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_sso_present_vibox.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "10cc3063ad3a502f739c645c39a6275fc4b7261ed0ee7d955abd016446ae8470",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_infinimetrics_absent.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ca6acb2d421c89b6e8adb70723c0f937e9eed9ca1f37ab64b38ba43079dc9cab",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_notification_rule_present_vibox.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "672faf6777e1f2e20330978ae22375d8fc2b964357d000dc628470795c0ac8d1",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_notification_rule_present_1521.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "c823038faf18206b0e0ba4c7d9ea60d9147497a52298b34f9d71425ab9905d96",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_infinimetrics_present.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ed4e2917ed47877b84191b4d8770047f2472a106be92b9b37fb4bb01b141bc83",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_notification_rule_absent_vibox.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "a6f1d3b769dd1e6cfc0458c9d81b2637d3b71503913f5ab9ba42fa87311f7150",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_notification_rule_absent_1521.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1625dc67e0cdb3f35aa45dde3595334c343b12fcf0e41dd9e114e9b2bc855556",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_pool_present.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "99828cc60970be8032469217543281b94b43d74690e38cecfbfdf9dd3c786589",
+ "format": 1
+ },
+ {
+ "name": "tests/hacking/infini_sso_present_1521.json",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "3ce0b66687616baa0fcbca91a53154a614165c7fb49621447246b89c6fa06d7d",
+ "format": 1
+ },
+ {
"name": "tests/config.yml",
"ftype": "file",
"chksum_type": "sha256",
@@ -911,31 +995,31 @@
"format": 1
},
{
- "name": "README.md",
+ "name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3461153b976b6891497f8142af206c6196915b37179b9b57685f9a84bec31d0",
+ "chksum_sha256": "a859e3dfe7533c580b26f093999bbcb04384f43403609273101c12c778dfeff6",
"format": 1
},
{
- "name": ".gitlab-ci.yml",
+ "name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9df779aac7597942f23788f2b7636ec3f56612ffad1f548eb4b4bbed636d3764",
+ "chksum_sha256": "e86f9831c38253c674c88cc417c44e9d5d0761da173e4fddced4fd1226c3f743",
"format": 1
},
{
- "name": ".gitignore",
+ "name": ".gitlab-ci.yml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "dc9405faf5aa7aa9af717d8a1f4dad063a9103a7857b29d48775702e5ad79f02",
+ "chksum_sha256": "9df779aac7597942f23788f2b7636ec3f56612ffad1f548eb4b4bbed636d3764",
"format": 1
},
{
- "name": "CHANGELOG.rst",
+ "name": ".gitignore",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "ddb4872a24789ff8bbfbf443dbd2c6a1802c6a8e11d49681634f1321d6ce0d6e",
+ "chksum_sha256": "dc9405faf5aa7aa9af717d8a1f4dad063a9103a7857b29d48775702e5ad79f02",
"format": 1
}
],
diff --git a/ansible_collections/infinidat/infinibox/MANIFEST.json b/ansible_collections/infinidat/infinibox/MANIFEST.json
index bfe21c7b6..22e703abc 100644
--- a/ansible_collections/infinidat/infinibox/MANIFEST.json
+++ b/ansible_collections/infinidat/infinibox/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "infinidat",
"name": "infinibox",
- "version": "1.4.3",
+ "version": "1.4.5",
"authors": [
"Infinidat <partners.infi@infinidat.com>",
"David Ohlemacher",
@@ -12,7 +12,7 @@
"tags": [
"array",
"cloud",
- "fiber",
+ "fibre",
"fibre_channel",
"fibrechannel",
"hostpowertools",
@@ -20,6 +20,8 @@
"infinibox",
"infinidat",
"infinihost",
+ "infinimetrics",
+ "infinisafe",
"infinisdk",
"iscsi",
"nas",
@@ -44,7 +46,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "e45ed8525f39595d529c89a74a32429e893f5b90ee87289e837086a630df0bbd",
+ "chksum_sha256": "72f3532f993722e91df2a6aafcf96a083a0f8bacc9ec99a580f6881162064806",
"format": 1
},
"format": 1
diff --git a/ansible_collections/infinidat/infinibox/README.md b/ansible_collections/infinidat/infinibox/README.md
index e248972ca..c375d4abf 100644
--- a/ansible_collections/infinidat/infinibox/README.md
+++ b/ansible_collections/infinidat/infinibox/README.md
@@ -12,17 +12,19 @@ All Infindat InfiniBoxes are supported.
## Prerequisites
- Ansible 2.14 or newer
- InfiniSDK 225.1.1 or newer
-- Python 3.6 or newer. This is a prerequisite of Infinidat's infinisdk Python module.
+- Python 3.6 or newer. This is a prerequisite of Infinidat's infiniSDK Python module.
## Modules
- infini_certificate: Configure a SSL certificate.
- infini_cluster: Creates, deletes or modifies host clusters.
- infini_config: Modify an Infinibox configuration.
+- infini_event: Post events.
- infini_export: Creates, deletes or modifies NFS exports.
- infini_export_client: Creates, deletes or modifys NFS client(s) for existing exports.
- infini_fibre_channel_switch: Rename a fibre channel switch.
- infini_fs: Creates, deletes or modifies filesystems.
- infini_host: Creates, deletes or modifies hosts.
+- infini_infinimetrics: Add or remove an Infinibox from an Infinimetrics.
- infini_map: Creates or deletes mappings of volumes to hosts.
- infini_metadata: Creates or deletes metadata for various Infinidat objects.
- infini_network_space: Creates or deletes network spaces.
@@ -32,7 +34,6 @@ All Infindat InfiniBoxes are supported.
- infini_port: Adds or deletes fibre channel or iSCSI ports to hosts.
- infini_sso: Configure a single-sign-on (SSO) certificate.
- infini_user: Creates, deletes or modifies an InfiniBox user.
-- infini_users_repositories: Creates, deletes, or modifies LDAP and AD Infinibox configurations.
- infini_users_repository: Configure Active directory (AD) and Lightweight Directory Access Protocol (LDAP).
- infini_vol: Creates, deletes or modifies a volume.
@@ -60,8 +61,13 @@ Example playbooks are included in the collection:
- test_remove_map_cluster.yml: Removes resouces created by its cohort.
- Playbooks for testing snapshotting:
+ - test_create_snapshots.yml: Creates snapshots.
+ - test_remove_snapshots.yml: Removes created snapshots.
-These two playbooks serve as a reference to the use of the modules. These exercise all modules demonstrating normal usage, idempotency and error conditions. Individual module documentation is available via `ansible-doc`.
+- Playbooks for Infinibox configuration:
+ - configure_array.yml: Configures many aspects of an Infinibox.
+
+The two test playbooks also serve as a reference to the use of the modules. These exercise many modules demonstrating normal usage, idempotency and error conditions. Individual module documentation is available via `ansible-doc`.
### Example Usage
Install the collection and cd into the collection's infi/ directory. Create an ibox yaml file in ibox_vars/. Use the example yaml file as a reference.
diff --git a/ansible_collections/infinidat/infinibox/ibox_vars/iboxCICD.yaml b/ansible_collections/infinidat/infinibox/ibox_vars/iboxCICD.yaml
index 91aeb192e..32b1b7d0c 100644
--- a/ansible_collections/infinidat/infinibox/ibox_vars/iboxCICD.yaml
+++ b/ansible_collections/infinidat/infinibox/ibox_vars/iboxCICD.yaml
@@ -1,11 +1,157 @@
$ANSIBLE_VAULT;1.1;AES256
-62653266666434313135323036623039316436346264346165616364343662643163343835363366
-6234343463353063643666386537613034363837323730370a396338326665333066323635383833
-34363466633839306135386336613931353335306330346330303930303132373231633362353363
-3539373931306362610a613330346535373438643763663365306631336638316234613863323234
-35343636623034646632396235393630356632386236323935613039313266653965646563613938
-37303336343431386566656331613461376533353164376430343631353365306431363034383763
-37383633343562386561306638386635313432623766306336386366666336323663313966353963
-66643931653363316130316331633137333237376331353439356131623735346561636262646332
-33316436643365336639666461633762353833386330643331633931323664643364393835396330
-6364626632306532373263333430336135336238373731646666
+63636339346561366236303937353736633636613333313835636562623362396231643334626536
+6365373633383839393232633163626165363334303932660a643436336338356236623637306535
+34646561643138616532333764336230313835616266313033366531386162396562356662373130
+6663343664623866310a303761383135393366316335363038626365633935336464363265303466
+34306238336364656166356664663233623631376432643238353434313133663362393938623563
+35313263303665393938633566333637373030623438373861376666633263383066333632336666
+62363234303262303462386139326361313038323137653662633762646339623564383665613366
+31633662663634623365333033396332613362653664303564336464333063346164626337616230
+34623938636339386266366261613238366361663639646530623866643836363134346638666662
+32666361366431633533663532353539386537356435386431663034396638633739343831653038
+33373835333132616663363237643336626234393131303330623731353030386665333336313961
+32343139616562633563636539636439373062626438653837383030313438326162653065653339
+39646531626665376131333065653431373061383165653161306132613364366531376132633236
+30383366656237386165663339653032383239653635643466366363633966303864626337356530
+35326130613532666334653332653131333762653139623932393363393932383961383364646436
+39363239346538393661613265623135326534396434643838323235366562653037366462633635
+66643238313930663038643963656131656335356566383336646366626235393834323663646531
+34363033373038353238353230656566306139366665386464636565376330616532393231393331
+63663837343535313939373264383864626530633939383230323730303433366562333230646432
+30396465643737383839613064343961343566313331663731656638653832386264613336623339
+30333237646565323966346436333764616531366530323261646339363465366335303735636534
+61393437663234663363396433306666646538353336303132333165613934666639613162393939
+32393363623564373166363762316232316463353433656139346234346361386335373432353432
+65623632383435643039663461656130636138636231663632386433373833663734396137393866
+33636339346465653964386637336363316461373030623637663535663034366134383235353239
+32373963343533623066373963373963383038316333343038636462376332316335633531353333
+38663966393438656337633931326464363139393933393438376636326432346639386361303938
+64303764663135633864316562646666343439323964356261373834353834343930383038633965
+33636637356335383837663439626439616563393632643039376339636661616234343739383636
+61313834666363663830303564323237363632333563343565366164336431366433313435383938
+35336239313731396237343037366334643238633431376666303264343962376534373761356565
+35393962623631363064653962316565666432646361373339346433303963356463393661326337
+31373864343034663564616633643066383862646137383264636561333638306661386666656135
+38656433626235303564356336303830653162613965383266303534363963376636353235663365
+61306164616464623636633663343232613236386264306334313538343536356337323137323631
+30386630376535333665353937623266393734613432663331316130643138396539326362393032
+31336438366636343431366362316336643739383131396137323438666265636130656636356565
+64663933313239623736616134303664303838643930633063653133383637316238336166336364
+32623863356363336335323063316238396363356261386362613233616565616362633433353931
+39366137343464343964616362353938346237373963636432363338386564373932623032353863
+39666265363237313938656462383164393135373932626436633038636137383762623763323764
+31366166306334633531393839616530316134393939343138366665643536656631613230376564
+34646139303761376562346363616334366138646339643331353964656539363738633365373031
+35373734323866316231316432393136363734353834333330353032326230333166326362306333
+34326233346165613164376464636333356535643433353865383264383661666236646336363036
+32653632666361396633656566636431386631313137636166336365636336373962306566653836
+36383539393035316365326236613138646532626236353065363032623833613462303861663430
+66346138376264316434313564363264616365386434396564336537653230396266346632623663
+66343538396664333164366232616430313534386264356533646233336535656263336230643532
+64343733353166363561303932373963303636376431656262376132356561376530346161643338
+61323035366463373561316264373537316133386265646132326263343137626237336537633530
+36396133303262623164393631373164313134663662643763386163323362303130656138326363
+64396362313661323065306664373130663336613835306138613235363661303962643034313034
+64386464626334393561623564653035363534333130346663623837346438373861396364303066
+63656663633536316465306561316336653233333163346563323438386637613830316537626330
+63623937303137653264363932633939663263386465346162396565633533353333333966623132
+33313164663162376138336335303032666231646238666464616162393032643436613835376235
+31656537633835646330396539316634663161386531353035333439626262613631663230336132
+35313831303766663066363136653266343939353438613563616438396135396230613437336531
+61373461346534353931376339363265353033643537393332316563353330373935353263663136
+37303735643739373338653930323638326236386463323561616566323330646165363432383963
+39336331353466373938306536356462363331373333663861313932653966383165613234396461
+63346561643863393130316635336533346630383561346231326663333531623231646338313664
+30366665643039346337333765393334376131373634633462643666643837393635303838336261
+30323737363335656363613830626439666533613362306335363063623030303232363363633236
+61316431623434326162663232306561393563306134643961626232666361326634636365613964
+37346662633839623564323661613261393532356665653265343865633837633637376131373165
+34346532646537623865383361343338353436326438666433666232316466303230663731653664
+66393836636534323833313030333531353463383435633733646464303036323865666131363433
+66396533323766383832386464363735313833633866383733636131323831363034643437303335
+30316631643333393662323465336634326564346238663236353964376432323461616632303035
+30616164626436333933326534333262356461663164313831313161333261623766333463336333
+65623733393435393232643635646163393665353131303266316636386165323437633261643939
+64656234356138643430336536646162343162303030343961313036623535316136633832626264
+36303262653139626364373634663737336633346536623534626333613033353163346461386334
+66316539313731633431336531323134373164386366386631346166396666623834663932323334
+37383430616561616662376466633137396437626437646135393063383336623261393336396563
+61316265326237363165363139323936313132626164636437613361633934396562306236353832
+62663439646366303766613462346636313838623735653564383838636439343030353435346432
+61323130333964353235383736663663653635373236393162643730623765633538383231373863
+37356535633865303061343430613438323337316565663737316432353634313632373830316331
+65663737626330313734653262323339306331346165393933303462643765356630623031353465
+33396231636436666137336261393537633734383531663962353234313366623135653061376531
+63643334376361653162366637393762373964666664383939386536396265373930386263646365
+33383863386365656538663535646336353735613061376632376238666339346138353038313531
+30633934303538343263613438623330326633663833656537386361653233623362613737363061
+36313061323561636464313938363563643633366235396262613035633261353738303964393230
+63313932303631363836643038313435366431313261656664353535386136386165393031636338
+61663331333938663533633365343466336366303864393666636461663564653831376464623830
+31363464623765353263333763613764663938336564633437386331303438326266323539336533
+61373462303934373563646131626562316262383134353765656639623964343939396330633133
+64626565323738396133326632303566633638623564643630303331613464653635663837343363
+36633938373234316337356363363663363338653836613766363934356631373464333531396630
+62333335363835343938613161323737333864653630333733356332633561343261623239343233
+34376537656532346563656134626437343561376266663063393135333330623530353164633839
+31353562616538303331616534363435616639373966643466316135643765653063356463306330
+36303132343537353963363564346531393134383264646336396330313139633930383063346366
+34643466323466363338613538323234393262613663383862303638363062396462336135353865
+31336163346330316562656336326632353366373037636665643031656639396132643466663635
+33383638383265636535306537343039363439663233346364633062353462336332636261636330
+61323661356139383333643236376463653137663838383730313833613332393633373535396563
+31346461646338376330653839373838643631666662323739373333326435363434336665626435
+63623033356239393733393162613330656539316633396362393237653937343834643864643063
+35313039613237356362616438646663316635313635363639313762323765366563366233316330
+35356438333735646238323637323137666165373332616263346331323966303561333365633064
+39623163363134646163313439663461323235633834343365383962313665393031313938363935
+34646663343539313835376433616538373433303138396338383565343932306634643361343337
+39613230313532343662316635333934663737643362303530636131313031633664383065336366
+35303834336532623463393561633631363866353736626462363134653439333161323738366232
+34636330346635303764616265353036383838613865393939333631633236363836326635323430
+34396565333935316436663236383939303666383634336333613639663164316239353562383936
+39373139316664633231353732383431326235386237666134323133363930303033646532383537
+30666163323461313661333465393230656535393664656561306135323862383634343065353339
+63386638643464653836363236613332343034343165623832636633313064643361303138353537
+61343836633231356232373138623763633531353564326462393136313664393064396338323461
+66383031613638313633623037303435383731396361616231313839323163646130643238353831
+31323839643162663862623434356663356430663166383161363062343934383833343462373835
+35333636613837323839613130373330313532366363323762366439663431633331336561386433
+62376130646538626232626431393731376633653031663730623737656139646362333030303730
+39623761353861623837323032633631336534623036393966383665383739386138326461383833
+61333361373232373930333664336637356233396164313632616662333335316532313730646163
+35366530666431623232313638306562623764313963306165333135613931343337663734373065
+30623737623935376432633835373939663964383733326234333266353362356238653465613164
+64646366346233656433653036646537303434366464393737396532303364313636363235663063
+34646634636136613239353761356465333439653236633831373032363562386231376333313161
+34373033343737383962653530356530366633613564623936353566636438653666326563646465
+30633632363230303563626465656562623466336534323163303366303839333965666238336465
+36373830636530633535323137316162306665656632323639623637326436373137653065323761
+34356163393539383266663566623631646439313135653536373838613237343832363065656332
+66633833393231356365353962396134323162303963373464363963306437326662303337373030
+32323338313333653065613930346661386136663261633639356234373431646362316361323235
+62346232643233653237353635323033343366303930366666643162353737613739316231623863
+64366239666564643830656564303236663130633434633239643461666433316262393230663737
+33316232613038363436336638616233663131333731333034313932373662336265306635656236
+34646238653835393066376636643739346634613832656138366433353631356563316130313162
+38356136646535363566383332666463343231336164663438656366353765393537353764306266
+62323665356563613435376366633637373934356531316161653464323562623132613565396132
+66333738633366613036656262353935616661313661636166626666663065633337376534393161
+36653130623334363661663132396434366434613565613865336665303130326239343165366362
+31343763643738333833343338666136386335643135663732636463356439373833386462643264
+32316136613730643035643139323630316330336563306165636161636235306233643564643164
+38336436636265663733336164326331373666323366663134663331656530363034393231303339
+35653361633034366264346537386239353236396432623635636232646332633731663537353535
+34663666393761353733626563316538346364356662313135346130393536346638393136643133
+64666235343965393038333662623365373563306234313435323639363563663232363532343838
+38323536393236383339613064383964643732643932376134333863333830633232646632363134
+62313534396538633630306164646461656462346661393333626365626435636361326164376438
+33663638326330643238646432356161306639366230306230616134323936396132653539306232
+61316132373933643166663933333339633036323663613432353163663436303561623035656436
+35656564363437626437653630306436386335626632636164653037353463326366373032663266
+39666162343438353463353763356135333636303033643764626266643932353663613233383433
+36663435396536326433383664666336306639376639656661663634373933636561356538646234
+66653763393338663134613036366464346664663966306236613539623764653932313237316330
+36303530386230636430646165646531663131396562393638316261373066616237656330383639
+32626337613231376430623832336439303933333962343339356139343264646339663461313834
+62623838336533636334
diff --git a/ansible_collections/infinidat/infinibox/ibox_vars/iboxNNNN_example.yaml b/ansible_collections/infinidat/infinibox/ibox_vars/iboxNNNN_example.yaml
index d4ef26691..9fa9eaf70 100644
--- a/ansible_collections/infinidat/infinibox/ibox_vars/iboxNNNN_example.yaml
+++ b/ansible_collections/infinidat/infinibox/ibox_vars/iboxNNNN_example.yaml
@@ -4,11 +4,66 @@
# - $ ansible-vault encrypt <file>
#
# Any value for auto_prefix may be used. auto_prefix is used in every resource created by
-# the example playbooks, making resources easy to find.
+# the example playbooks, making example resources easy to find.
auto_prefix: "PSUS_ANSIBLE_"
user: "user"
-password: "password"
+password: "redacted"
system: "iboxNNNN"
+# Variables used by infini_infinimetrics module:
+ibox_serial: 30368
+ibox_url: 172.20.68.167
+ibox_readonly_user: david-ro
+ibox_readonly_password: redacted
+ibox_readonly_email: user@infinidat.com
+imx_system: infinimetrics
+imx_user: IMX_ADMIN
+imx_password: redacted
+
+# Variables used by infini_sso module
sso_signing_certificate: "signing cert in one single line with the begin and end lines removed" # Used by configure_array playbook
+
+# Other variables
+pool_size: 10GB
+pool_vsize: 11GB
+dataset_default_provisioning: THIN
+use_base2_units: true
+table_export_limit: 3000
+admin_user_name: admin
+admin_user_password: redacted
+admin_user_email: dev.mgmt@infinidat.com
+pool_admin_user_name: Commvault
+pool_admin_user_password: redacted
+pool_admin_user_email: user@infinidat.com
+ldap_name: PSUS_ANSIBLE_ad
+setup_alerting_emails: ["user@infinidat.com"]
+prod_alerting_emails: ["user@infinidat.com"]
+alerting_event_levels: ["INFO", "WARNING", "ERROR", "CRITICAL"]
+alerting_includes: []
+alerting_excludes: ["EVENT_FLOOD", "USER_LOGIN_SUCCESS", "USER_LOGGED_OUT"]
+syslogs: # A list of syslog dictionaries
+ - target_name: syslog1_target
+ rule_name: syslog1
+ protocol: SYSLOG
+ host: 172.31.88.158
+ port: 514
+ facility: LOCAL7
+ transport: UDP
+ post_test: true # Not a real test if using UDP
+ - target_name: syslog2_target
+ rule_name: syslog2
+ protocol: SYSLOG
+ host: 172.31.88.158
+ port: 515
+ facility: LOCAL7
+ transport: UDP
+ post_test: true
+ - target_name: graylog_target
+ rule_name: graylog
+ protocol: SYSLOG
+ host: 172.31.77.214
+ port: 1514
+ facility: LOCAL7
+ transport: UDP
+ post_test: true
diff --git a/ansible_collections/infinidat/infinibox/ibox_vars/vibox.yaml b/ansible_collections/infinidat/infinibox/ibox_vars/vibox.yaml
index 76dc8b5b7..653df3efe 100644
--- a/ansible_collections/infinidat/infinibox/ibox_vars/vibox.yaml
+++ b/ansible_collections/infinidat/infinibox/ibox_vars/vibox.yaml
@@ -1,134 +1,151 @@
$ANSIBLE_VAULT;1.1;AES256
-65633535303262623839393038393634326234376132336138653530616562386437363737666238
-3561386434663132373330653534623364613330323663380a313164353936653430613832623966
-66303131373861386338336638636235326334616435626665363465323634653537343331613465
-3235656431383237650a643630613131306264313062636165393164366361616431303339623236
-64653063626333306466663637343332306634626131666634663035393066383636633563626537
-66663737616435323833653466623231646462336163633363333165646338343166616232356165
-32306166376130396264363561396639353165653664316139653366666638343761336239333235
-61303430343061396262373032666133393334326465373964613638336132623466313666623735
-65396337623963346633356462353732356237616566346132343738323532663139643661623364
-64663638666633343665623438336164643565383362323631356232346338653537663430306566
-34366635623735343439383963313261666131636239373238646261313565373731303365316534
-64316263666366326263636631376232343632346634363532643838653033626636316332346433
-37613632373439633731643531333834373433653663326534316337646361393537616262643137
-61323362316333633630663264373836306339643632393462323536386366346439383562613164
-37353534316137663938653630663639366531386633643335623065366131633730383938393565
-62343638326439663130646236373938623436383161386562346431316330613231663361353938
-38663765333239393866363338656264326164353262363839313433363339666139616537646231
-65376361646561646436306433316266356233306434613232333661386564373532333565373038
-65653463336436316338373338313365346634393437333163353936396666626139333934386137
-36306234663163376131663738643764393537303932383037623534376432376431663738333539
-64396136663964306639393162363931323661376134613739336636613734636338353334383763
-34313266353635623335363266636336663932363261333839383664303163353332656365386439
-62303233643665303730653937363338313139646535313765323961356438633739623762656166
-61376137666236333063653630633537653832333165353565393636326666326534333736393835
-65303436303161316139636366303364316431306162666432376638616464326431326365326461
-36363234396130393661313230616130643131373162396139373766303465656164386433366131
-63306536333930653535373636633137623837396163373061363635653037303435643536636563
-36353531333733333237623065326636383161613633373061323530666662646232613861343439
-66343035326434653837643665323937383636353234653864386232336530303666303363633736
-35316262663438646638383266616434303732636362616332316331386262396632623963343266
-36306563326135396138383231353861646462663265646333393665646636326362336430383736
-66343965373066346433666333366362653363626432316439623535306534653331653330353033
-66643362666433616139316430383062386364646433623432353162656337326661343336376162
-64383933393535646635363232306331613562313164393263343433646464613266343361613866
-65386164393031643537373366633566643961653366336534633831646132623236633934373731
-32656630643638393565336634663234633431303534313865333636613464373063363762373137
-31396564323562663033343664393837313665356165353531633433393266356130363264396162
-62393132383530363236336137313939333561326263386165373631633264303262616236306135
-35343636386666633337353863666566336630373736323563613466356261656630623465633465
-64333632303934383532663962653236646162303864303836666566343331626332663565353433
-34323165396535323566393036653433316337653130633364303166313035363432643965316535
-34313164653962396231646362313537623932633933396637653535393264353165646333373766
-33313466663636666330626236393632366230653533356461303834316434306536376539626463
-32343438646630396434353265643530616664353539666562626563653838323661393831343633
-64393432653233613734623466666135333135626661376362623732653134636332303837666432
-63393733313737656130366335336533323266373135306161653361633065643364623265653735
-32326339666538356361656331313761326532653037353731313331306463663866663961336239
-65323538346161386264633664663435616437326633386630383863633466363163396136353430
-31633338613664346434353339353139663863363066383937663433326536326435313332383636
-39353730376131656431393336323632373937653532663036646565303337613761353537393933
-33393735366239666638383336613632663434653630653936633937353137316466393937616366
-65333531376330346438323766303331653137663535323932336234373533306337313837303763
-38316265386132393435663364393838326631633638336430353533356238643734626239653837
-35626162383935383065343236653465623838646238353635313939363661333033623663613539
-33383665356662353834376464333532353563303465323762653538393637343236626639656133
-38346464393831373538336164333063636439623234316632353738653730613939316561303466
-66663763306432643435376636313666653139346632376663323432616565656437396362613461
-31383263303838363735333135623665343535663732626561616562383564653037326437643831
-32633335376636363034326236663438393761336630666336353365613237653861373737623436
-39656530346336626365316338633635363865383935623934363738653637396132626232616532
-31633064613532346363623537353936663664623037643737376139303961636237363562646338
-30633432626334643161313436623733656166636634323861306364616434333963323966303563
-61363632626535363963313362336632326565383039373834366236313331666437613735353135
-39323138353333666137383965646134656337393432383936626533616564343839373035616536
-30383363653730343637336562633035653335383761313430653765383637363364653331646464
-33396165326163636434356630663432386261353330663962633534666136623363623735346564
-36336635313130336539366262653864316234306337656439633061356533323839383065336639
-65616363383235343931393562313038333430343965383730646165376665663233663635343665
-66303464393963663736333062663235343164393364623539666536663738376563363166363434
-37396530326330333431626231306162663333366665646639623333313565653964666161643431
-33643166323965366532663433613436353938363133643764346337343738363031316461393636
-36333036336438356466303633646165376264303237383461323738663264613630646338353637
-38356439363030643137636235303932353535636666636139326431396330316539356464306666
-39313039663733376535616239646664393464633065333731613637356664333331353430643461
-39343431663936306463396139646133363361616237353765656533663265303963633432333330
-63646632336334643439613033346263306664383561313839356137373134313433623031366134
-64616432636337633432343236663163343732346239313833633066336334356530636438376664
-64383565636233333565373933616262663631656137663231393663666531326538616437663438
-65356465323966616365663136613232316338646462643965393364666263646537376439633637
-36656136303063303565346239623161383232383734376530383031653830643964333937373161
-66306137363666353262306162643432303736396237666136383036386530336163306131613434
-65303964313436383265636465316561306238326435663765616466376637383738613930376231
-39326436306130323665373135636164306135313238383435366563306431663664633261336438
-39613136343466383331386334636566316266396637333233363965633239363965306131333532
-31373933323736336461316163323639316163656336633938326337316364646461343565376166
-31646334373966323931393532333335316430303530373263393633326130333265393630623532
-37323836363761383538326161306539653930373038366364366239353239343666623436616265
-35303662373761353530333435383362636435623932396632383232353833663135303066353736
-62636336343163356638326236633562373834316538376435623839376333326635666331383664
-34636161623065616238613264363336346639623063643630653366373035303639656631353363
-36306162343238656536343238303431306161386465306435313137373464636162643532316462
-35353665383935613433663034323537336566656439323165633638323334313666633138363037
-65663761616263346631333937633635663735366438646631363630316565373964316564306563
-30333737326663343632666133616462373261376262643632636431366365653266306336396630
-32356239356561663863656461316166616133386165613139653463663435303266323761653834
-37373663313839366664643461653361306465653931636535363662656630396239623538633935
-36363837626534613234386431636662303866363764333630656431363063656530393738356561
-63316338366433353564646530326539643330653630636435386339613232326530363662666532
-61376165623065323964393561386335386534646232323936303962363964336233356234383030
-35386137633937336232353830643430363062643266363036333836376335626535373139356330
-66336536633365346162393938393165613264393065303234633930663534633732666339356161
-30623661643430623732636262346666303262653934663038343365323035626533613636373035
-65323539373432386664396161353061653334343638623439393531656538643661326536306561
-66303362333565343238646230306165353434376563636664646462623631626233663762636262
-62313730663634376233316237346665363561356366346534356235383935633665643461633662
-64373336663665616632616331663665373564353565353665666539326232613930623061313738
-38663038363839353464633139626265666535323764366138626362383837343133386435303565
-32643334326437663030373163303565623235383762313161313266336637306335336238303538
-62653833643235303239633730376432633366343531636564386362633534633730353563336166
-63663334643264316530323737303039626434383462343238653965333531313639313763343564
-66643035313063373732616332633635363537626534353731396661313936316431356130653231
-66373630323334376336663066623862323762666336366537666435636232323566393862346133
-65396334333031366137353833376337383466326565613763616366613161316561643433363838
-35333861363735343433343032653330653438343030373734396336643032366339633431383465
-64366431633564633234363261303135343233613436323965616437303933326138373531323239
-38396464306138656533333335303161633562353735313462383731633532626264386636333863
-62366666616530623837663739306432383361396136313230613361633932343465626338323137
-61366536373539376436623537386430636533656630666338323061316161333933643839366430
-35613838613866323239326264656361303762383265666562356231316637646638636364326636
-31373236376331653930666237346363313461636366386665323931663161336633623039373237
-33623364373162316366653462353532356633616231663735396535343336393061386432396134
-39303432396262373931303064653131343535393235323062316232343336346631613563383832
-34353162366239356336663631363030303565623261616235663061666431306234623838633134
-30646164356237393933343837316339376664316236336130393735313536376164333963653166
-35366461613930623539323335306364346439373536316434363930343263663661343166326139
-63383530353139643463356166373231323034343338383333643639396264366633613263616437
-65636466346134316530613765386466613363373865353531326164323832333736336366623166
-64373533343965626635646238386630643431386462633361346165383431646466656539323439
-36386262653735393036663330373364323563393561313739326438363965303637346137636166
-64653036313032313564343335633562353338323464383730323232666230373032643965333362
-39383736313430396338393961616438653834333237373162656532303936363039323062616330
-61396131303963353166343163353436643563336433363235616435386532373830666239323661
-36636265383862613466346335363830343931623766396132393464326464633161
+63613563633331643061333939646432623638396364633162366161666464626637633835363764
+3063306463656534626165656330376362303532613330620a363230343833623539346337393765
+39633465633834373034303032653239396162386137626530633635383039653132306238656333
+3438346535386435630a363839366537636534363039336537653166303032623764646661626238
+38346134323038623334643336396234323335323837393862333366646337333533366266363334
+30333035366334306162343631613137363966333237623664353731383462363136393335323230
+35353137306462343666653461626238653039303165616362383866663539376534343838313437
+36363338323836396561346234366435666538323465653266373932346333653738396365326262
+66653165303864393034376564336131656432323165386435346332633063393062666362623633
+62623033346638306537613663323231636433386666306265313836663162373734616233303938
+62343538636234396364646363656537613332656638356132656461666662613935323863323235
+66663364613565373830613764666538663732373864366639363464343666343439306639623263
+32323131346138626234616433633536366166386137363238653364306531363066373961663661
+66303038313763333330636662393530323462333065353337323361303233343566303366306435
+62336361343634626632333861333838613465313733303735613430393165363062613239643330
+33346231346432666331366263336431643030366538366436626334303630623462383062373863
+66636139303235303430636363663136313565393762656636313835653235343135373235626561
+30313536666164633830303734626464653139626465363862313762653734616265656533373931
+38373638613837646463616233326334326130376239313739313662313730646638383932323036
+34326566323330643035386436316165316538366364376335616531323133333532353962626135
+32613864373261653062303331316336353936356462653632363332656438623166636462343532
+30343736393861656466616131333434333661326663653361353639613162303235306434613536
+37303165663632663534313635663564306238663733396264333061343630316538623132663533
+62653836353239363832373835653164343732663134623637346265306164336139393334346631
+30646634386361643236336634343338653930616330396539626265356138653464303831303833
+33386133336163663835633065353562646231623466616162353866343937623463363363333762
+61313331353334336666366132613063663763623337663962396133366135363936396638656632
+36653730623564343633393235643536663139616261313834373161376464303731313737333661
+39363764663666366631386466653437636135343239633639653336386462636265383533313338
+61623562356231333736383230343638383661346435373037623635303635333839353731316138
+35663866313464363237393065326132663430303565663433376564323738383637656163663531
+64666361613434343832303563376630363264346437343337646663653661393663343161613064
+63316638376463386239363564653666633434353334313832303939366436366332373636313233
+32646136656131333865336666336361633039643631643238653964643839623962626639656530
+61373864363138643332626561373766313064653139666339643235633064643664353435303436
+32336463643139393663333464613633303132316636663532306638343162336233636561613766
+35623062313364303266666432306566303330616536306466383639376162393563333530343363
+65316331376433396331346261333839613334633833646462666638623931653333303261613563
+62336562616161336562336237353036376434376134326461346333303638363035326530626361
+30393436323835366465636231313133373237346133623036623637646364623062646166376561
+37353033333633663461333430623537313632643063623765653563303230653666363465626438
+37666233343634353433313565333562393863333536373665306463363734656130333130366365
+35313032346438643034633930656137326334396330346364626137333332613337656262323038
+39386133333631363862353038363136656561383139316534313138633331373533633538356434
+32663038646466303237363936353162303066313435353232353731643261623836643831333539
+38323335663637323765343365393065623336306630393766656235613738313839613937363963
+62366233393934663836333937343963326432353739306532646638393962636535313938366539
+31306632643236313463346634643763303336323464346533663966656234633164346632343231
+32396366666632626133303364373132653931396563383966336239383136373330383732613730
+37313364643061356131653763326230623362613430346364613762643465386436393435346430
+66613462346635616664373537383364633436626339396336356230376139323230346336323963
+37666439313265643131353438626262653166323437393436326135613661333537383734323164
+38646466333866343931663934623938346364353338663763653131336665623735316233353734
+64396231363666393062626363346562313961333362636361323461666463663530656462303034
+66323463363037376135373936363534386431646264393064303335376135313962356362616236
+64326531353137316539396436366638383130646633343237613065393037623339396533393766
+66653238356465626435663737646665653236653239613733623964633864656138323662306261
+62313537333863343835386236626134386565646334363362626137666465366366313130643232
+33393961393031303539346233663066626532646338646264333765663133393966343034306663
+37313736623636653436656363393930313766306564303965623564633463643539396135353932
+62393435386236323232316433643863623133633763643238613238323466366138353161353239
+36313535353864333866643238346463343065363238386633343062303034356237623133306630
+33383465346331326432336464353265356563383231323538306536636630636564346131666536
+30353436383631343637313639663137386536326334656639653339373339663966383764336637
+36333461306236396362316637356437313332396132373064316565613231343033653732343864
+34613138376361623536336163363532656435343831303933643661343565303864663537306663
+36643961353661626534656532653631363566666537373061393636363665346239643164313766
+66323536386166303035623663333332663765653834316661313430653763643639383466306239
+39323966303363333963333465366162666536653163393330336561356633356134346130383366
+34363064633064653861363664313639326139363062313461636137666438633132306366656635
+62346433323632336566653664623831376265613562373436363765363538623030306334653964
+61636239623464383966356134633935333131666239316630643339663439663631616230656562
+65636135653638393830613439613837613962343133393038346638313565306430316639353764
+64626231373937333864353231643838646363313537386235303531306565643030353038306435
+39383439396632373365333539646564313030613965393534383138613961346134633562643233
+36616564303636633230376237376638376130323463653835303233323138633235313035626230
+32323438326266336132363336326638343133383134376131623735623737336239353939396364
+61313261373664326431386665373336646661653536383334333461316239663565396662616566
+38643334633630363933333662636665356135623036353263356530356530653364356531633032
+34336137306134383332373064653538323039316230383362356230393938363036616336313663
+62353765616666326539323138653664326431616163336335666361373765376364366436616631
+38303533346364626534376333353662376563326530623037396664303964623538326432383762
+39383766323164633437613531626562366432323330306165346431373134656163656536396236
+39353136623865306331333835373133666562623838373734353465613264356334303737306233
+64383536353836626163333664633437323466313466653138313533343639336465373737336666
+65333436333831653030346664333539363261316130666563353765353462633939653939343166
+30306236313563373363363262623164623465393038353530653239633164653236316534303762
+65346662613834323065613664666230623063633563366665373430353261663764656261643763
+35373738633730323733333333313961313165343966373730353566636533316161343034646463
+66616239396263313961383038363135646637313164386539316634336563323837393466633631
+36356665656431303565323532383630393765643734326632636530666439383364633864306361
+30383461633863316335306634353437393763353838626530393162383537383935316564656564
+64303335623062323531653737373735383661353062323833373765653530343362373166396362
+31353563313534326234336662663765656261343565663433386334653939633430643134343336
+32363230373138306565336435636664353863623439633830313739663935303836303130303235
+63636338333662313237353161396539313436376331393235373332313437376134353639643464
+30636335363365336163313038373236633035633362336165616230666664323930323635383665
+65303561623433663734663566643231616333656138373666373732313364313361386530613364
+30303564373336376332303831326236663338366466626139616464363766653237633531346262
+66373130323865386165386535613030306236613464343039663433323237336165663631346335
+61643636393435623231623735313339646334303739386439346333376230633561386139383166
+62663932613234333332306636356538626534653833333661313333363533653338366632333736
+63623239396166376136656365336637626435343530656433386361356538346438653665333265
+37653436616438353739613938623839353435393731633336396462376630306233306163346339
+64633939646132386265643339623364633839653935343765666264656361313066633834643839
+34376439343561646663373966656264363662343632373734396265653364323162356638616634
+33613531333232623939363763643131633164633139336164663633643163393534653465316330
+34653530646637636539333831373032383165616365346533613437643263363531666138386637
+65393036353636386134346431396431616561656435623737343363626131386334616430663165
+36663938353332663931326239646563633839643833663138356131653135666433326563353239
+34386535323333313331643033623739323133343862613264393735353037323766633365356333
+35643731313265613333646234656331343363303939333039363834356661303833383031613365
+66656532343566656335366638636233393837323337646530326334666562646437613235313066
+64646366336337623262653665653431323665393736313634373936666362613030623564646234
+61313838663237656234646234393338623032323235613934333330383232613536653864623834
+31663339323865656663663065363563656133323061333037616163323134616562633561323533
+37313536663961393166306161356536656536323137313035353633343763643763663738343661
+34346664336366303235646634633532623261396439303933326139393161346632313435656435
+66643265333637613930666537373436626337663933346131646431316636373063363932343933
+62663830363466316664313236643438343863346265313565386630646534303735656563363561
+30343565313732626133303638366534306162376165323363336331636439626564346631313661
+34666438323664653939306635323934373432383062396633393464306131346264616533396464
+35353461633364643331326561623137313862313434366331323233376463626135396662336238
+61343835616634316139323435373066623365373334656336643961333361646536626163633837
+32613739336366336261313036613738613034666364653435373164313438306538326239326331
+33616461656334313039333931653935366532303662316533316636373739383536323435343831
+30323039613735633661316662356361616338343932386166633862333830306266373365316133
+33346330373065313064643136396566313136613330386333316363653435383530663262323265
+62363165653232336130303861383639323965636565326562313164356161343231623262333338
+62633331353333323765383430626363333236626233643038633637363039333765623839393835
+35366534393265303564613663656635616462396163383564386235386166376532666466303430
+66646565643034386533616433336436386334643633663839616539623165353136623838356335
+30383264353937343932353839313435333530613363323437353835633861376164303631323537
+31396539666365383236383661333238326535303663643639663762303563366161323762313065
+63396662323165373238313561386562643033326161376263663863616234353766623830306464
+38363931303133336162323636363038303866393665623165323634313065376435353431346231
+35373866636237363166373730353265653562383439613364626435383465393163306337613236
+66343137313663653663343637323765313030343431306262343539386361353061663937363433
+38303337373738333563373266336239646463383332303165643232336237323830323162653766
+38616538636161313862366630636634313334623364313866353135663431666264373631303339
+36656133396639313337363162346233613363623965333634373439643732313035306139356135
+62333763333935666361613038313933393237626264646464653232636133323930323366366639
+62373239616565313065653164333332346165383562353731393435626530386365343035386238
+38633635376334316136383337343832306133663539383739363862313633666237623137316137
+39643731636333316535646238363132306134363236656533316431306430326365313236636261
+35643834613337303038303838303561393166656139396139343130313937623761616431653963
+65623966666237323666313836616232353437303535306563643163613935646463613464353334
+65303930393065353164396263646231373162313039363830353663363234363030323664393865
+62333261316539383336313134663961336337616631613531613239306139363430313839633363
+6435633763313566626635613033636561613532363262336136
diff --git a/ansible_collections/infinidat/infinibox/playbooks/configure_array.yml b/ansible_collections/infinidat/infinibox/playbooks/configure_array.yml
index bee0899d1..c3ab24c20 100644
--- a/ansible_collections/infinidat/infinibox/playbooks/configure_array.yml
+++ b/ansible_collections/infinidat/infinibox/playbooks/configure_array.yml
@@ -4,47 +4,6 @@
- name: Configure an Infinibox Array
hosts: localhost
gather_facts: false
- # vars:
- # - dataset_default_provisioning: THIN
- # - use_base2_units: true
- # - table_export_limit: 3000
- # - admin_user_name: admin
- # - admin_user_password: 123456
- # - admin_user_email: dev.mgmt@infinidat.com
- # - pool_admin_user_name: Commvault
- # - pool_admin_user_password: 123456
- # - pool_admin_user_email: dohlemacher@infinidat.com
- # - ldap_name: PSUS_ANSIBLE_ad
- # - setup_alerting_emails: ["dohlemacher@infinidat.com"]
- # - prod_alerting_emails: ["dohlemacher@infinidat.com"]
- # - alerting_event_levels: ["INFO", "WARNING", "ERROR", "CRITICAL"]
- # - alerting_includes: []
- # - alerting_excludes: ["EVENT_FLOOD", "USER_LOGIN_SUCCESS", "USER_LOGGED_OUT"]
- # - syslogs: # A list of syslog dictionaries
- # - target_name: syslog1_target
- # rule_name: syslog1
- # protocol: SYSLOG
- # host: 172.31.88.158
- # port: 514
- # facility: LOCAL7
- # transport: UDP
- # post_test: true # Not a real test if using UDP
- # - target_name: syslog2_target
- # rule_name: syslog2
- # protocol: SYSLOG
- # host: 172.31.88.158
- # port: 515
- # facility: LOCAL7
- # transport: UDP
- # post_test: true
- # - target_name: graylog_target
- # rule_name: graylog
- # protocol: SYSLOG
- # host: 172.31.77.214
- # port: 1514
- # facility: LOCAL7
- # transport: UDP
- # post_test: true
tasks:
- name: Configuration
ansible.builtin.debug:
@@ -55,7 +14,7 @@
- name: Pause
ansible.builtin.pause:
- seconds: 2
+ seconds: 3
- name: Create temporary setup email notification rule setup_email for addresses {{ setup_alerting_emails }}
infinidat.infinibox.infini_notification_rule:
@@ -293,31 +252,98 @@
password: "{{ password }}"
system: "{{ system }}"
- # - name: TODO by David - Configure Infinimetrics - Add Infinibox
- # ansible.builtin.debug:
- # msg: (9) Add Infinibox to Infinimetrics
+ - name: Configure infinimetrics readonly user
+ infinidat.infinibox.infini_user:
+ user_name: "{{ ibox_readonly_user }}"
+ user_email: "{{ ibox_readonly_email }}"
+ user_password: "{{ admin_user_password }}"
+ user_role: "read_only"
+ state: "present"
+ user: "{{ user }}"
+ password: "{{ password }}"
+ system: "{{ system }}"
+
+ - name: Remove Infinibox from Infinimetrics
+ infinidat.infinibox.infini_infinimetrics:
+ ibox_serial: "{{ ibox_serial }}"
+ imx_system: "{{ imx_system }}"
+ imx_user: "{{ imx_user }}"
+ imx_password: "{{ imx_password }}"
+ state: absent
+ user: "{{ user }}"
+ password: "{{ password }}"
+ system: "{{ system }}"
+
+ - name: Remove Infinibox from Infinimetrics again to test idempotency
+ infinidat.infinibox.infini_infinimetrics:
+ ibox_serial: "{{ ibox_serial }}"
+ imx_system: "{{imx_system}}"
+ imx_user: "{{ imx_user }}"
+ imx_password: "{{ imx_password }}"
+ state: absent
+ user: "{{ user }}"
+ password: "{{ password }}"
+ system: "{{ system }}"
+
+ - name: Add Infinibox to Infinimetrics
+ infinidat.infinibox.infini_infinimetrics:
+ ibox_serial: "{{ ibox_serial }}"
+ ibox_url: "{{ ibox_url }}"
+ ibox_readonly_user: "{{ ibox_readonly_user }}"
+ ibox_readonly_password: "{{ ibox_readonly_password }}"
+ imx_system: "{{imx_system}}"
+ imx_user: "{{ imx_user }}"
+ imx_password: "{{ imx_password }}"
+ state: present
+ user: "{{ user }}"
+ password: "{{ password }}"
+ system: "{{ system }}"
+
+ - name: Pause 25 seconds to allow IMX to reflect addition of Infinibox
+ ansible.builtin.pause:
+ seconds: 25
+
+ - name: Add Infinibox to Infinimetrics again to test idempotency
+ infinidat.infinibox.infini_infinimetrics:
+ ibox_serial: "{{ ibox_serial }}"
+ ibox_url: "{{ ibox_url }}"
+ ibox_readonly_user: "{{ ibox_readonly_user }}"
+ ibox_readonly_password: "{{ ibox_readonly_password }}"
+ imx_system: "{{imx_system}}"
+ imx_user: "{{ imx_user }}"
+ imx_password: "{{ imx_password }}"
+ state: present
+ user: "{{ user }}"
+ password: "{{ password }}"
+ system: "{{ system }}"
- name: Create pools
infinidat.infinibox.infini_pool:
- name: "{{ item }}"
- size: "{{ pool_size }}"
- vsize: "{{ pool_size }}"
+ name: "{{ item.name }}"
+ size: "{{ item.size }}"
+ vsize: "{{ item.vsize }}"
+ physical_capacity_warning: "{{ item.physical_capacity_warning }}"
+ physical_capacity_critical: "{{ item.physical_capacity_critical }}"
state: present
user: "{{ user }}"
password: "{{ password }}"
system: "{{ system }}"
loop:
- - pool-a
- - pool-b
- - pool-c
-
- - name: Set up pool admin user for pool
+ - { name: 'CDRFS', size: "{{ pool_size }}", vsize: "{{ pool_vsize }}", physical_capacity_warning: '100', physical_capacity_critical: '100'}
+ - { name: 'HNS', size: "{{ pool_size }}", vsize: "{{ pool_vsize }}", physical_capacity_warning: '80', physical_capacity_critical: '90' }
+ - { name: 'PHYSICAL', size: "{{ pool_size }}", vsize: "{{ pool_vsize }}", physical_capacity_warning: '80', physical_capacity_critical: '90' }
+ - { name: 'POWER', size: "{{ pool_size }}", vsize: "{{ pool_vsize }}", physical_capacity_warning: '80', physical_capacity_critical: '90' }
+ - { name: 'RECLAIM', size: "{{ pool_size }}", vsize: "{{ pool_vsize }}", physical_capacity_warning: '80', physical_capacity_critical: '90' }
+ - { name: 'VIRTUAL', size: "{{ pool_size }}", vsize: "{{ pool_vsize }}", physical_capacity_warning: '80', physical_capacity_critical: '90' }
+ - { name: 'VIRTUAL_REP', size: "{{ pool_size }}", vsize: "{{ pool_vsize }}", physical_capacity_warning: '80', physical_capacity_critical: '90' }
+
+ - name: Set up pool admin user for CDRFS pool
infinidat.infinibox.infini_user:
user_name: "{{ pool_admin_user_name }}"
user_email: "{{ pool_admin_user_email }}"
user_password: "{{ pool_admin_user_password }}"
user_role: "pool_admin"
- user_pool: "pool-a"
+ user_pool: "CDRFS"
state: "present"
user: "{{ user }}"
password: "{{ password }}"
diff --git a/ansible_collections/infinidat/infinibox/plugins/modules/infini_infinimetrics.py b/ansible_collections/infinidat/infinibox/plugins/modules/infini_infinimetrics.py
new file mode 100644
index 000000000..4c9baac5b
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/plugins/modules/infini_infinimetrics.py
@@ -0,0 +1,358 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# pylint: disable=invalid-name,use-dict-literal,line-too-long,wrong-import-position,too-many-locals
+
+# Copyright: (c) 2024, Infinidat <info@infinidat.com>
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+"""This module creates or modifies Infinibox registrations on Infinimetrics."""
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+DOCUMENTATION = r"""
+---
+module: infini_infinimetrics
+version_added: 2.16.0
+short_description: Create (present state) or remove (absent state) an Infinibox registration on an Infinimetrics.
+description:
+ - Create (present state) or remove (absent state) an Infinibox registration on an Infinimetrics.
+author: David Ohlemacher (@ohlemacher)
+options:
+ ibox_serial:
+ description:
+ - Infinibox serial number.
+ type: str
+ required: true
+ ibox_url:
+ description: Infinibox DNS resolvable hostname or IPv4 address.
+ type: str
+ required: false
+ ibox_readonly_user:
+ description:
+ - Read only Infinibox user name.
+ type: str
+ required: false
+ ibox_readonly_password:
+ description:
+ - Read only Infinibox user password.
+ type: str
+ required: false
+ imx_system:
+ description:
+ - Infinimetrics hostname or IPv4 Address.
+ type: str
+ required: true
+ imx_user:
+ description:
+ - Infinimetrics user name.
+ type: str
+ required: true
+ imx_password:
+ description:
+ - Infinimetrics user password.
+ type: str
+ required: true
+ state:
+ description:
+ - Registers the Infinibox with Infinimetrics, when using state present.
+ - For state absent, the Infinibox is disabled on Infinimetrics and will no longer appear on the Infinimetrics UI.
+ - Existing Infinibox data is not purged from Infinimetrics.
+ - Purging may be executed using the Infinimetrics CLI tool.
+ type: str
+ required: false
+ default: present
+ choices: [ "present", "absent" ]
+extends_documentation_fragment:
+ - infinibox
+"""
+
+EXAMPLES = r"""
+- name: Register IBOX with Infinimetrics
+ infini_infinimetrics:
+ infinimetrics_system: infinimetrics
+ state: present
+ user: admin
+ password: secret
+ system: ibox001
+
+- name: Deregister IBOX from Infinimetrics
+ infini_infinimetrics:
+ infinimetrics_system: infinimetrics
+ state: absent
+ user: admin
+ password: secret
+ system: ibox001
+"""
+
+# RETURN = r''' # '''
+
+import re
+import traceback
+
+from ansible.module_utils.basic import missing_required_lib
+
+try:
+ import requests
+except ImportError:
+ HAS_REQUESTS = False
+ HAS_REQUESTS_IMPORT_ERROR = traceback.format_exc()
+else:
+ HAS_REQUESTS = True
+ HAS_REQUESTS_IMPORT_ERROR = None
+
+from ansible.module_utils.basic import AnsibleModule
+
+from ansible_collections.infinidat.infinibox.plugins.module_utils.infinibox import (
+ api_wrapper,
+ get_system,
+ infinibox_argument_spec,
+)
+
+
+def find_csrfmiddleware_token(response):
+ """Search for csrfmiddlewaretoken in the response lines. Return token or None."""
+ token = None
+ for line_bytes in response.iter_lines():
+ line = str(line_bytes)
+ # Example of line searched for:
+ # <input type="hidden" name="csrfmiddlewaretoken" value="VUe6...m5Nl7y">'
+ result = re.search(r'"csrfmiddlewaretoken" value="(\w+)"', line)
+ if result:
+ token = result.group(1)
+ break
+ return token
+
+
+@api_wrapper
+def imx_login(module, imx_session):
+ """ Log into an IMX (GET and POST) using credentials. """
+ ibox_url = module.params.get('ibox_url')
+ imx_system = module.params.get('imx_system')
+ path = f"https://{imx_system}/auth/login/"
+
+ # Use GET to get a token
+ payload = {
+ 'username': module.params.get('imx_user', None),
+ 'password': module.params.get('imx_password', None),
+ }
+ get_response = imx_session.get(path, data=payload, verify=False)
+ status_code = get_response.status_code
+ if status_code not in [200]:
+ text = get_response.text
+ msg = f"Cannot add Infinibox {ibox_url} to Infinimetrics {imx_system}. Status code: {status_code}. Text returned: {text}"
+ module.fail_json(msg=msg)
+
+ token = find_csrfmiddleware_token(get_response)
+
+ # Use POST provide token
+ data = {
+ 'csrfmiddlewaretoken': token,
+ 'password': module.params.get('imx_password', None),
+ 'username': module.params.get('imx_user', None),
+ }
+ headers = {
+ 'referer': f'https://{module.params.get("imx_system")}',
+ }
+ response = imx_session.post(path, headers=headers, data=data, verify=False)
+ if response.status_code not in [200, 201]:
+ msg = f"Cannot log into Infinimetrics {imx_system}. Status code: {response.status_code}. Text returned: {response.text}"
+ module.fail_json(msg=msg)
+
+
+@api_wrapper
+def imx_system_add(module, imx_session):
+ """ Add an Infinibox to an Infinimetrics using an imx_session """
+ imx_system = module.params.get('imx_system')
+ ibox_readonly_user = module.params.get('ibox_readonly_user')
+ ibox_readonly_password = module.params.get('ibox_readonly_password')
+ ibox_serial = module.params.get('ibox_serial')
+ ibox_url = module.params.get('ibox_url')
+ path = f"https://{imx_system}/system/add/"
+ headers = {
+ 'referer': f'https://{imx_system}/',
+ }
+
+ # Use GET to get a token
+ get_response = imx_session.get(path, headers=headers, verify=False)
+ status_code = get_response.status_code
+ if status_code not in [200]:
+ text = get_response.text
+ msg = f"Cannot add Infinibox {ibox_url} to Infinimetrics {imx_system}. Status code: {status_code}. Text returned: {text}"
+ module.fail_json(msg=msg)
+
+ get_token = find_csrfmiddleware_token(get_response)
+
+ # Use POST provide token
+ data = {
+ 'api_url': ibox_url,
+ 'api_username': ibox_readonly_user,
+ 'api_password': ibox_readonly_password,
+ 'csrfmiddlewaretoken': get_token,
+ }
+ response = imx_session.post(path, headers=headers, data=data, verify=False)
+ status_code = response.status_code
+ text = response.text
+ if status_code not in [200, 201]:
+ msg = f"Cannot add Infinibox {ibox_url} to Infinimetrics {imx_system}. Status code: {status_code}. Text returned: {text}"
+ module.fail_json(msg=msg)
+
+ # Check that the IBOX was added or was previously added.
+ # Search for one of:
+ # - 'The system is already monitored'
+ # - add_progress url
+ if ("The system is already" not in response.text or "monitored" not in response.text) \
+ and (f"/system/{ibox_serial}/add_progress" not in response.text):
+ msg = f"Cannot add Infinibox {ibox_url} to Infinimetrics {imx_system}. Status code: {status_code}. Text returned: {text}"
+ module.fail_json(msg=msg)
+
+ if "add_progress" in response.text:
+ return True # Just added now
+ return False # Previously added
+
+
+@api_wrapper
+def imx_system_delete(module, imx_session):
+ """ Remove an Infinibox from an Infinimetrics using an imx_session """
+ imx_system = module.params.get('imx_system')
+ serial = module.params.get('ibox_serial')
+ ibox_url = module.params.get('ibox_url')
+ path = f"https://{imx_system}/system/{serial}/edit/"
+ headers = {
+ 'referer': f'https://{imx_system}/',
+ }
+
+ # Use GET to get a token
+ get_response = imx_session.get(path, headers=headers, verify=False)
+ status_code = get_response.status_code
+ if status_code not in [200]:
+ text = get_response.text
+ msg = f"Cannot remove Infinibox {ibox_url} from Infinimetrics {imx_system}. Status code: {status_code}. Text returned: {text}"
+ module.fail_json(msg=msg)
+
+ get_token = find_csrfmiddleware_token(get_response)
+
+ path = f"https://{imx_system}/system/{serial}/remove/"
+ headers = {
+ 'X-CSRFToken': get_token,
+ 'referer': f'https://{imx_system}/',
+ }
+ response = imx_session.delete(path, headers=headers, verify=False)
+
+ # Check that the IBOX was removed or was previously removed
+ # In response.return_code, search for 200
+ status_code = response.status_code
+ if status_code not in [200, 201]:
+ text = response.text
+ msg = f"Cannot remove Infinibox {serial} from infinimetrics {imx_system}. Status code: {status_code}, Text returned: {text}"
+ module.fail_json(msg=msg)
+
+
+def handle_present(module):
+ """ Handle the present state parameter """
+ imx_system = module.params.get('imx_system')
+ ibox_url = module.params.get('ibox_url')
+
+ imx_session = requests.session()
+ imx_login(module, imx_session)
+ is_newly_added = imx_system_add(module, imx_session)
+
+ if is_newly_added:
+ msg = f"Infinibox {ibox_url} added to Infinimetrics {imx_system}"
+ changed = True
+ else:
+ msg = f"Infinibox {ibox_url} previously added to Infinimetrics {imx_system}"
+ changed = False
+
+ result = dict(changed=changed, msg=msg)
+ module.exit_json(**result)
+
+
+def handle_absent(module):
+ """ Handle the absent state parameter. """
+ imx_system = module.params.get('imx_system')
+ serial = module.params.get('ibox_serial')
+
+ imx_session = requests.session()
+ imx_login(module, imx_session)
+ imx_system_delete(module, imx_session)
+ result = dict(
+ changed=True,
+ msg=f"Infinibox serial {serial} has been removed from Infinimetrics {imx_system}"
+ )
+ module.exit_json(**result)
+
+
+def execute_state(module):
+ """Handle states"""
+ state = module.params["state"]
+ try:
+ if state == "present":
+ handle_present(module)
+ elif state == "absent":
+ handle_absent(module)
+ else:
+ module.fail_json(msg=f"Internal handler error. Invalid state: {state}")
+ finally:
+ system = get_system(module)
+ system.logout()
+
+
+def verify_params(module, req_params):
+ """ Verify that required params are provided """
+ missing_req_params = []
+ for req_param in req_params:
+ if not module.params[req_param]:
+ missing_req_params.append(req_param)
+ if missing_req_params:
+ state = module.params["state"]
+ msg = f"Cannot handle state {state} due to missing parameters: {missing_req_params}"
+ module.fail_json(msg=msg)
+
+
+def check_options(module): # pylint: disable=too-many-branches
+ """ Check option logic """
+ state = module.params['state']
+
+ if state == 'present':
+ req_params = ["ibox_url", "ibox_readonly_user", "ibox_readonly_password"]
+ verify_params(module, req_params)
+ elif state == 'absent':
+ pass
+ else:
+ module.fail_json(msg=f'Internal handler error. Invalid state: {state}')
+
+
+def main():
+ """ Main """
+ argument_spec = infinibox_argument_spec()
+ argument_spec.update(
+ dict(
+ ibox_serial=dict(required=True),
+ ibox_url=dict(required=False, default=None),
+ ibox_readonly_user=dict(required=False, default=None),
+ ibox_readonly_password=dict(required=False, no_log=True, default=None),
+ imx_system=dict(required=True),
+ imx_user=dict(required=True),
+ imx_password=dict(required=True, no_log=True),
+ state=dict(default="present", choices=["present", "absent"]),
+ )
+ )
+
+ module = AnsibleModule(argument_spec, supports_check_mode=True)
+
+ if not HAS_REQUESTS:
+ module.fail_json(
+ msg=missing_required_lib('requests'),
+ exception=HAS_REQUESTS_IMPORT_ERROR,
+ )
+
+ check_options(module)
+
+ execute_state(module)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ansible_collections/infinidat/infinibox/plugins/modules/infini_notification_rule.py b/ansible_collections/infinidat/infinibox/plugins/modules/infini_notification_rule.py
index 1916cdb49..c6e30af5d 100644
--- a/ansible_collections/infinidat/infinibox/plugins/modules/infini_notification_rule.py
+++ b/ansible_collections/infinidat/infinibox/plugins/modules/infini_notification_rule.py
@@ -56,6 +56,14 @@ options:
elements: str
required: false
default: []
+ recipient_target_name:
+ description:
+ - When creating a rule using recipients, a notification target is required.
+ - Usually, this target is named "customer-smtp".
+ - If this is not the case, use this variable to specifiy another name.
+ type: str
+ required: false
+ default: customer-smtp
target:
description:
- Notification target
@@ -118,6 +126,23 @@ except ModuleNotFoundError:
@api_wrapper
+def find_recipient_target_name_id(module, system):
+ """ Find the ID of the target by name """
+ target = module.params["recipient_target_name"]
+ path = f"notifications/targets?name={target}&fields=id"
+ api_result = system.api.get(
+ path=path
+ )
+ if len(api_result.get_json()['result']) > 0:
+ result = api_result.get_json()['result'][0]
+ target_id = result['id']
+ else:
+ msg = f"Cannot find an ID for recipient_target_name {target}"
+ module.fail_json(msg=msg)
+ return target_id
+
+
+@api_wrapper
def find_target_id(module, system):
""" Find the ID of the target by name """
target = module.params["target"]
@@ -190,16 +215,14 @@ def create_rule(module):
target_parameters = {
"recipients": recipients
}
- target_id = 3 # Target ID for sending to recipients
+ json_data["target_id"] = find_recipient_target_name_id(module, system) # Target ID for sending to recipients
json_data["target_parameters"] = target_parameters
elif target:
- target_id = find_target_id(module, system)
+ json_data["target_id"] = find_target_id(module, system)
else:
msg = "Neither recipients nor target parameters specified"
module.fail_json(msg=msg)
- json_data["target_id"] = target_id
-
system.api.post(path=path, data=json_data)
@@ -215,6 +238,8 @@ def update_rule(module):
exclude_events = module.params["exclude_events"]
recipients = module.params["recipients"]
target = module.params["target"]
+ rule_id = find_rule_id(module, system)
+ path = f"notifications/rules/{rule_id}"
json_data = {
"name": name,
@@ -227,17 +252,14 @@ def update_rule(module):
target_parameters = {
"recipients": recipients
}
- target_id = 3 # Target ID for sending to recipients
+ json_data["target_id"] = find_recipient_target_name_id(module, system) # Target ID for sending to recipients
json_data["target_parameters"] = target_parameters
elif target:
- target_id = find_target_id(module, system)
+ json_data["target_id"] = find_target_id(module, system)
else:
msg = "Neither recipients nor target parameters specified"
module.fail_json(msg=msg)
- json_data["target_id"] = target_id
- rule_id = find_rule_id(module, system)
- path = f"notifications/rules/{rule_id}"
system.api.put(path=path, data=json_data)
@@ -342,6 +364,7 @@ def main():
"include_events": {"required": False, "default": [], "type": "list", "elements": "str"},
"exclude_events": {"required": False, "default": [], "type": "list", "elements": "str"},
"recipients": {"required": False, "default": [], "type": "list", "elements": "str"},
+ "recipient_target_name": {"required": False, "default": "customer-smtp", "type": "str"},
"target": {"required": False, "type": "str", "default": None},
"state": {"default": "present", "choices": ["stat", "present", "absent"]},
}
diff --git a/ansible_collections/infinidat/infinibox/plugins/modules/infini_pool.py b/ansible_collections/infinidat/infinibox/plugins/modules/infini_pool.py
index 43daa71be..97366a817 100644
--- a/ansible_collections/infinidat/infinibox/plugins/modules/infini_pool.py
+++ b/ansible_collections/infinidat/infinibox/plugins/modules/infini_pool.py
@@ -1,7 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
-# pylint: disable=invalid-name,use-dict-literal,line-too-long,wrong-import-position
+# pylint: disable=invalid-name,use-dict-literal,line-too-long,wrong-import-position,too-many-branches
"""This module creates, deletes or modifies pools on Infinibox."""
@@ -59,6 +59,18 @@ options:
required: false
default: yes
type: bool
+ physical_capacity_warning:
+ description:
+ - Capacity, in percent, for a warning notification.
+ required: false
+ type: int
+ default: 80
+ physical_capacity_critical:
+ description:
+ - Capacity, in percent, for a critical notification.
+ required: false
+ type: int
+ default: 90
notes:
- Infinibox Admin level access is required for pool modifications
@@ -123,16 +135,22 @@ def create_pool(module, system):
vsize = module.params['vsize']
ssd_cache = module.params['ssd_cache']
compression = module.params['compression']
+ physical_capacity_warning = module.params['physical_capacity_warning']
+ physical_capacity_critical = module.params['physical_capacity_critical']
if not module.check_mode:
if not size and not vsize:
- pool = system.pools.create(name=name, physical_capacity=Capacity('1TB'), virtual_capacity=Capacity('1TB'))
+ pool = system.pools.create(name=name, physical_capacity=Capacity('1TB'), virtual_capacity=Capacity('1TB'),
+ physical_capacity_warning=physical_capacity_warning, physical_capacity_critical=physical_capacity_critical)
elif size and not vsize:
- pool = system.pools.create(name=name, physical_capacity=Capacity(size), virtual_capacity=Capacity(size))
+ pool = system.pools.create(name=name, physical_capacity=Capacity(size), virtual_capacity=Capacity(size),
+ physical_capacity_warning=physical_capacity_warning, physical_capacity_critical=physical_capacity_critical)
elif not size and vsize:
- pool = system.pools.create(name=name, physical_capacity=Capacity('1TB'), virtual_capacity=Capacity(vsize))
+ pool = system.pools.create(name=name, physical_capacity=Capacity('1TB'), virtual_capacity=Capacity(vsize),
+ physical_capacity_warning=physical_capacity_warning, physical_capacity_critical=physical_capacity_critical)
else:
- pool = system.pools.create(name=name, physical_capacity=Capacity(size), virtual_capacity=Capacity(vsize))
+ pool = system.pools.create(name=name, physical_capacity=Capacity(size), virtual_capacity=Capacity(vsize),
+ physical_capacity_warning=physical_capacity_warning, physical_capacity_critical=physical_capacity_critical)
# Default value of ssd_cache is True. Disable ssd caching if False
if not ssd_cache:
pool.update_ssd_enabled(ssd_cache)
@@ -150,7 +168,7 @@ def update_pool(module, pool):
size = module.params['size']
vsize = module.params['vsize']
- # ssd_cache = module.params['ssd_cache']
+ ssd_cache = module.params['ssd_cache']
compression = module.params['compression']
# Roundup the capacity to mimic Infinibox behaviour
@@ -168,15 +186,29 @@ def update_pool(module, pool):
pool.update_virtual_capacity(virtual_capacity)
changed = True
- # if pool.is_ssd_enabled() != ssd_cache:
- # if not module.check_mode:
- # pool.update_ssd_enabled(ssd_cache)
- # changed = True
+ if pool.is_ssd_enabled() != ssd_cache:
+ if not module.check_mode:
+ pool.update_ssd_enabled(ssd_cache)
+ changed = True
if pool.is_compression_enabled() != compression:
if not module.check_mode:
pool.update_compression_enabled(compression)
- changed = True
+ changed = True
+
+ physical_capacity_critical = module.params.get('physical_capacity_critical')
+ existing_physical_capacity_critical = pool.get_physical_capacity_critical()
+ if physical_capacity_critical != existing_physical_capacity_critical:
+ if not module.check_mode:
+ pool.update_physical_capacity_critical(physical_capacity_critical)
+ changed = True
+
+ physical_capacity_warning = module.params.get('physical_capacity_warning')
+ existing_physical_capacity_warning = pool.get_physical_capacity_warning()
+ if physical_capacity_warning != existing_physical_capacity_warning:
+ if not module.check_mode:
+ pool.update_physical_capacity_warning(physical_capacity_warning)
+ changed = True
if changed:
msg = 'Pool updated'
@@ -206,12 +238,22 @@ def handle_stat(module):
# print('fields: {0}'.format(fields))
free_physical_capacity = fields.get('free_physical_capacity', None)
pool_id = fields.get('id', None)
+ physical_capacity_warning = pool.get_physical_capacity_warning()
+ physical_capacity_critical = pool.get_physical_capacity_critical()
+ physical_capacity = pool.get_physical_capacity()
+ virtual_capacity = pool.get_virtual_capacity()
result = dict(
changed=False,
free_physical_capacity=str(free_physical_capacity),
+ physical_capacity_warning=physical_capacity_warning,
+ physical_capacity_critical=physical_capacity_critical,
+ physical_capacity=str(physical_capacity),
+ virtual_capacity=str(virtual_capacity),
+ ssd_cache=pool.is_ssd_enabled(),
+ compression_enabled=pool.is_compression_enabled(),
id=pool_id,
- msg='Pool stat found'
+ msg='Pool stat found',
)
module.exit_json(**result)
@@ -267,6 +309,8 @@ def main():
vsize=dict(),
ssd_cache=dict(type='bool', default=True),
compression=dict(type='bool', default=True),
+ physical_capacity_warning=dict(type='int', default=80),
+ physical_capacity_critical=dict(type='int', default=90),
)
)
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_absent.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_absent.json
new file mode 100644
index 000000000..c425191b6
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_absent.json
@@ -0,0 +1,14 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "ibox_serial": "30368",
+
+ "imx_system": "infinimetrics-vc6",
+ "imx_user": "IMX_ADMIN",
+ "imx_password": "nfinidat1",
+
+ "state": "absent",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_present.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_present.json
new file mode 100644
index 000000000..c41db9f14
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_infinimetrics_present.json
@@ -0,0 +1,17 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "ibox_serial": "30368",
+ "ibox_url": "172.20.68.167",
+ "ibox_readonly_user": "david-ro",
+ "ibox_readonly_password": "123456",
+
+ "imx_system": "infinimetrics-vc6",
+ "imx_user": "IMX_ADMIN",
+ "imx_password": "nfinidat1",
+
+ "state": "present",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_1521.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_1521.json
new file mode 100644
index 000000000..a9f2f9f77
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_1521.json
@@ -0,0 +1,9 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "name": "my-event-rule",
+ "state": "absent",
+ "system": "ibox1521",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_vibox.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_vibox.json
new file mode 100644
index 000000000..30c824009
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_absent_vibox.json
@@ -0,0 +1,9 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "name": "my-event-rule",
+ "state": "absent",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present.json
index e51182274..20fd6f2ae 100644
--- a/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present.json
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present.json
@@ -1,8 +1,10 @@
{
"ANSIBLE_MODULE_ARGS": {
"name": "my-event-rule",
- "target": "syslog1_target",
+ "recipients": ["dohlemacher@infinidat.com"],
"event_level": [ "info" ],
+ "include_events": [],
+ "exclude_events": [],
"state": "present",
"system": "172.20.68.167",
"user": "admin",
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_1521.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_1521.json
new file mode 100644
index 000000000..36043a9d1
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_1521.json
@@ -0,0 +1,13 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "name": "my-event-rule",
+ "recipients": ["dohlemacher@infinidat.com"],
+ "event_level": [ "info" ],
+ "include_events": [],
+ "exclude_events": [],
+ "state": "present",
+ "system": "ibox1521",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_vibox.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_vibox.json
new file mode 100644
index 000000000..20fd6f2ae
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_notification_rule_present_vibox.json
@@ -0,0 +1,13 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "name": "my-event-rule",
+ "recipients": ["dohlemacher@infinidat.com"],
+ "event_level": [ "info" ],
+ "include_events": [],
+ "exclude_events": [],
+ "state": "present",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_absent.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_absent.json
new file mode 100644
index 000000000..0cb9f6e08
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_absent.json
@@ -0,0 +1,9 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "name": "PSUS_ANSIBLE_pool",
+ "state": "absent",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_present.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_present.json
new file mode 100644
index 000000000..c23b8522e
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_present.json
@@ -0,0 +1,15 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "name": "PSUS_ANSIBLE_pool",
+ "size": "10GB",
+ "vsize": "11GB",
+ "ssd_cache": false,
+ "compression": true,
+ "physical_capacity_warning": 76,
+ "physical_capacity_critical": 86,
+ "state": "present",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_stat.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_stat.json
new file mode 100644
index 000000000..d2f1d5e7e
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_pool_stat.json
@@ -0,0 +1,9 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "name": "PSUS_ANSIBLE_pool",
+ "state": "stat",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_1521.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_1521.json
new file mode 100644
index 000000000..f83a7dc2f
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_1521.json
@@ -0,0 +1,15 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "issuer": "http://www.okta.com/exkra32oyyU6KCUCk2p7",
+ "name": "OKTA",
+ "sign_on_url": "https://infinidat.okta.com/app/infinidat_ibox2503_1/exkrwdi7dmXSKdC4l2p7/sso/saml",
+ "signed_assertion": false,
+ "signed_response": false,
+ "signing_certificate": "MIIDojCCAoqgAwIBAgIGAY1bQQXzMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxEjAQBgNVBAMMCWluZmluaWRhdDEcMBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTAeFw0yNDAxMzAxNjQyMjRaFw0zNDAxMzAxNjQzMjRaMIGRMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxEjAQBgNVBAMMCWluZmluaWRhdDEcMBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOJmwPjImRqI9scAXMNQbVlthi8Ogx7yGZhfNiqjd+V2ZAHitqTh3L/Bcn+hCiau8eBDFUsumR0P0RHpzulnHKoylAORohDnhuWPZw+xdlflsHXu84jC9cLWGYVHfeEpf1tosLKg/NdbJp34AuYQifythqJAsCwjz+j3cL/Xe2LPqCHgGG1NCPpbD4Gcavh0IVi3C749M3Cy+PLKHh/c/kfrbTdPHP3Y5hROBxwDCdHm5osLZA5V77gZBxU08xeo3IDy2IcqgH2uEI+dgeW9aRZWhG6tHCPYUhuIdpRX1fJhyrXNH6ZOFV0NyBqUxUDv2URRHwgXMLdkf6ujN+Cu2nECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAHJUIfV51MwZ8LfYs0BW5eN6lZCqdzmIjv1fZ6NftIYm7FTVvMo49/lOCRuIYbFvWj/y9kJytu65iM5DUNGOxs+PIaKkt1bXwhvHtG5PKoAcDQj6jhN8C4/hxqz9HAOfLdJrH7RfRxJByc2Z7tAPsTDhPu52lKZrYpF+5Hwyy+Gjoqj1DUQx8u7qCMq2Rpp/iYmuk5/r0CVFyoQS6pVAX0UZqx+Mu221jD5+KkJoaTqU8twb9V9aPE4nCGyrA2u/sjqOt5TPBAGTMKx7yTo8NmxmqEJ+FDUXUeqJLzbeh+NEn6Dy7zJCcyq2lVhqJGALvGrh6CvbSuiOlRv1LDL9N+g==",
+ "enabled": true,
+ "state": "present",
+ "system": "ibox1521",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_vibox.json b/ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_vibox.json
new file mode 100644
index 000000000..907887cb9
--- /dev/null
+++ b/ansible_collections/infinidat/infinibox/tests/hacking/infini_sso_present_vibox.json
@@ -0,0 +1,15 @@
+{
+ "ANSIBLE_MODULE_ARGS": {
+ "issuer": "http://www.okta.com/exkra32oyyU6KCUCk2p7",
+ "name": "OKTA",
+ "sign_on_url": "https://infinidat.okta.com/app/infinidat_ibox2503_1/exkrwdi7dmXSKdC4l2p7/sso/saml",
+ "signed_assertion": false,
+ "signed_response": false,
+ "signing_certificate": "MIIDojCCAoqgAwIBAgIGAY1bQQXzMA0GCSqGSIb3DQEBCwUAMIGRMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxEjAQBgNVBAMMCWluZmluaWRhdDEcMBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTAeFw0yNDAxMzAxNjQyMjRaFw0zNDAxMzAxNjQzMjRaMIGRMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxEjAQBgNVBAMMCWluZmluaWRhdDEcMBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOJmwPjImRqI9scAXMNQbVlthi8Ogx7yGZhfNiqjd+V2ZAHitqTh3L/Bcn+hCiau8eBDFUsumR0P0RHpzulnHKoylAORohDnhuWPZw+xdlflsHXu84jC9cLWGYVHfeEpf1tosLKg/NdbJp34AuYQifythqJAsCwjz+j3cL/Xe2LPqCHgGG1NCPpbD4Gcavh0IVi3C749M3Cy+PLKHh/c/kfrbTdPHP3Y5hROBxwDCdHm5osLZA5V77gZBxU08xeo3IDy2IcqgH2uEI+dgeW9aRZWhG6tHCPYUhuIdpRX1fJhyrXNH6ZOFV0NyBqUxUDv2URRHwgXMLdkf6ujN+Cu2nECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAHJUIfV51MwZ8LfYs0BW5eN6lZCqdzmIjv1fZ6NftIYm7FTVvMo49/lOCRuIYbFvWj/y9kJytu65iM5DUNGOxs+PIaKkt1bXwhvHtG5PKoAcDQj6jhN8C4/hxqz9HAOfLdJrH7RfRxJByc2Z7tAPsTDhPu52lKZrYpF+5Hwyy+Gjoqj1DUQx8u7qCMq2Rpp/iYmuk5/r0CVFyoQS6pVAX0UZqx+Mu221jD5+KkJoaTqU8twb9V9aPE4nCGyrA2u/sjqOt5TPBAGTMKx7yTo8NmxmqEJ+FDUXUeqJLzbeh+NEn6Dy7zJCcyq2lVhqJGALvGrh6CvbSuiOlRv1LDL9N+g==",
+ "enabled": true,
+ "state": "present",
+ "system": "172.20.68.167",
+ "user": "admin",
+ "password": "123456"
+ }
+}
diff --git a/ansible_collections/netapp/ontap/CHANGELOG.rst b/ansible_collections/netapp/ontap/CHANGELOG.rst
index 9a796e0ab..e4e349602 100644
--- a/ansible_collections/netapp/ontap/CHANGELOG.rst
+++ b/ansible_collections/netapp/ontap/CHANGELOG.rst
@@ -5,6 +5,24 @@ NetApp ONTAP Collection Release Notes
.. contents:: Topics
+v22.11.0
+========
+
+Minor Changes
+-------------
+
+- na_ontap_cifs - new option `offline_files` added in REST, requires ONTAP 9.10 or later.
+- na_ontap_net_ifgrp - updated documentation for parameter `name`.
+- na_ontap_vserver_audit - new options `schedule.*` added under `log.rotation`, requires ONTAP 9.6 or later.
+
+Bugfixes
+--------
+
+- na_ontap_dns - fix issue with modifying DNS servers in REST.
+- na_ontap_fpolicy_policy - fixed issue with idempotency in REST.
+- na_ontap_quotas - fixed issue with idempotency in REST.
+- na_ontap_security_config - added warning for missing `supported_cipher_suites` to maintain idempotency in REST.
+
v22.10.0
========
diff --git a/ansible_collections/netapp/ontap/FILES.json b/ansible_collections/netapp/ontap/FILES.json
index dde171372..68cea8163 100644
--- a/ansible_collections/netapp/ontap/FILES.json
+++ b/ansible_collections/netapp/ontap/FILES.json
@@ -109,7 +109,7 @@
"name": "plugins/module_utils/netapp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6daa1820439f22b17459fe302f0d4bab7d9b55abe9a16954ba75a90a242bd01e",
+ "chksum_sha256": "1229988953bb64a4dab7e097b2b31c108119192be708876a800671e49a08de0f",
"format": 1
},
{
@@ -319,7 +319,7 @@
"name": "plugins/modules/na_ontap_dns.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6ea5685b153844b586517029a15901465b587a5e8c460647e8b4672135c5fe14",
+ "chksum_sha256": "692d3d5eda544b84971dfe307a60d00e6ba89f4c015e4a8cc26af1c60010a16f",
"format": 1
},
{
@@ -333,7 +333,7 @@
"name": "plugins/modules/na_ontap_cifs.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "18c64fc05c7e46c19552e044d825704244dd07d308b0aa34cdc488436b727095",
+ "chksum_sha256": "f0914723d15590edda209350a26f41994d2b49e11d17917ec6a6d5a6e3317ac1",
"format": 1
},
{
@@ -508,7 +508,7 @@
"name": "plugins/modules/na_ontap_quotas.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "08c33094ac72558694e35b2387a302642331ed3cd5abcb22355de12ce3956ef7",
+ "chksum_sha256": "9ef5eec01b7755dc4734456055cbb4700fb3b83ba838217427d9fff4dc670250",
"format": 1
},
{
@@ -760,7 +760,7 @@
"name": "plugins/modules/na_ontap_security_config.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "8a885621b50e69e52bee2588a3c940b52a0c70a46439617790b20f3611b58b89",
+ "chksum_sha256": "ee4e03617b69b2ed5ed42849f5ccbd500c7cdca40fc2c94bf0f348e6a037ea48",
"format": 1
},
{
@@ -956,7 +956,7 @@
"name": "plugins/modules/na_ontap_fpolicy_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "49131f89a89b6b273c6c726b270ebda313c32da542a66c83728935adf3018d7a",
+ "chksum_sha256": "cb55c27cce7114898e23bf84ced59f228db94de94c41bf36770a0a487fb04d7d",
"format": 1
},
{
@@ -1152,14 +1152,14 @@
"name": "plugins/modules/na_ontap_net_ifgrp.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b1e80c8c376745d83c3b86ba490ea5138855b67924421ef1872108683c5daac1",
+ "chksum_sha256": "e6137acc309d032f4dcb9e1bc23d80cc966fb000c145130c3379b43c2653e907",
"format": 1
},
{
"name": "plugins/modules/na_ontap_vserver_audit.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "f3f265624355e196e82aa049d1c9877cd0ee522672ed2ea32adf0fa1ff131c05",
+ "chksum_sha256": "d1674f0ed96a50da31a2a5ee9b8a21cb6009c2b06326d7b627c44525305183dc",
"format": 1
},
{
@@ -1747,7 +1747,7 @@
"name": "tests/unit/plugins/modules/test_na_ontap_cifs.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "239fcf51e3ecfac1fd76009f17474b18ac9fd997c2cee8be8001015d118306bd",
+ "chksum_sha256": "1a28d8c1790e759398f7f793c02d9508c92587b30a395654599bcc5c77fa6243",
"format": 1
},
{
@@ -1884,69 +1884,6 @@
"format": 1
},
{
- "name": "tests/unit/plugins/modules/.pytest_cache",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/CACHEDIR.TAG",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "37dc88ef9a0abeddbe81053a6dd8fdfb13afb613045ea1eb4a5c815a74a3bde4",
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/README.md",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "73fd6fccdd802c419a6b2d983d6c3173b7da97558ac4b589edec2dfe443db9ad",
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/.gitignore",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "3ed731b65d06150c138e2dadb0be0697550888a6b47eb8c45ecc9adba8b8e9bd",
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/v",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/v/cache",
- "ftype": "dir",
- "chksum_type": null,
- "chksum_sha256": null,
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/v/cache/nodeids",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "3b02e3eef79464263dbecb6fba2aa5ac26a25116d9269c21332ac857bd9d26d5",
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/v/cache/lastfailed",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "ba6bcb107e0114b5becb0d3250b74c5e53a06d793b0ca532b3e97c1467ef027d",
- "format": 1
- },
- {
- "name": "tests/unit/plugins/modules/.pytest_cache/v/cache/stepwise",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945",
- "format": 1
- },
- {
"name": "tests/unit/plugins/modules/test_na_ontap_volume_efficiency.py",
"ftype": "file",
"chksum_type": "sha256",
@@ -2146,7 +2083,7 @@
"name": "tests/unit/plugins/modules/test_na_ontap_vserver_audit.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74071e0c975872d9c41060957acf337e8571db9d82f77c5a75445ee0c436b5be",
+ "chksum_sha256": "0fc83a7d3acc0931a596b737c04a6cf97a8f228ce93cda8d517631728859cba3",
"format": 1
},
{
@@ -2160,7 +2097,7 @@
"name": "tests/unit/plugins/modules/test_na_ontap_security_config.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "6f7e45b1801a4cb0850dea363c85fd8ee3d83fb3bccc8c52fc261dd33a234d29",
+ "chksum_sha256": "a9c08fdae2408e04b94c8d49879328d988ad1babdab42eb341a8672a4d05ea74",
"format": 1
},
{
@@ -2748,7 +2685,7 @@
"name": "tests/unit/plugins/modules/test_na_ontap_quotas.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2c0f7f14ab2dd8b0a4ac9ecf8689478a1132140c5b28c445ecb2da4afbc18482",
+ "chksum_sha256": "a81d2721710078f320dd1e5e03548c5824ffc6116aaece8b2087fc2fde1464b5",
"format": 1
},
{
@@ -3767,13 +3704,6 @@
"format": 1
},
{
- "name": "changelogs/.DS_Store",
- "ftype": "file",
- "chksum_type": "sha256",
- "chksum_sha256": "a92e6026ea49ee8ad153d99f377c2aca1fb94d42160045c980f4193d2f5671dc",
- "format": 1
- },
- {
"name": "changelogs/fragments",
"ftype": "dir",
"chksum_type": null,
@@ -3851,6 +3781,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/DEVOPS-6691.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "4ef395ecedb9bd76b92d5506bd2800d840bb902b0a9fc62a50865ab54706ce8f",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/DEVOPS-6015.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -4061,6 +3998,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/DEVOPS-6721.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "5dce35cec4222f0377e0472e5d2b7966e7ec15f0e9dce99ff2233d71b21d264a",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/DEVOPS-5662.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -4334,6 +4278,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/DEVOPS-6825.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "35b825df1d85b5d133f548e20051083bc7b9caf27770fd6ad4893afb4e5305b9",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/DEVOPS-4818.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -5230,6 +5181,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/DEVOPS-6356.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "ce793fb37e62663fd4dbc43ca9ff6e1032db11af1241176d3707fbd805a0b495",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/DEVOPS-5983.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -5286,6 +5244,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/DEVOPS-6747.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e80f870b0040fc3c4e72cb5c761c6c1f39986db7d5f932def957906442122b93",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/DEVOPS-3400.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -6490,6 +6455,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/DEVOPS-6715.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "7f6934cf248957f170fa56267661c76da9eb37c86222d14e576489171549e956",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/DEVOPS-2668.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -7141,6 +7113,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/DEVOPS-6807.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "22654275a3f4e7e083d276118b7ae90d05fea9a237ca3f9c99bcf52fe4c1b640",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/DEVOPS-3994.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -7284,21 +7263,21 @@
"name": "changelogs/.plugin-cache.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "7cbe9c8b5709e3f329667fa54b5c8ffa1333cc49805e51b788d3e52fca5c8b5d",
+ "chksum_sha256": "d3dde83bd44692ee5a011b3dc91ee40ff6ab12dcc0e84709c994b2598a891f21",
"format": 1
},
{
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "4c5611a9741bbfaaa7bc6fde286865b864f1c3c183327902ad3a5558b98903a0",
+ "chksum_sha256": "abeefd652684e2993ebb408a087ac7c2bc330c26e4c920816c665876562846a7",
"format": 1
},
{
"name": "README.md",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "0453a86d933c48e94a50eb91635f95a6b1b53be67f320647c7ff5e00234f6e4a",
+ "chksum_sha256": "92c524d470e7715f46d769f23370932d795a4297911ba62ef93aa4d2d974b728",
"format": 1
},
{
@@ -7368,7 +7347,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "edab2dd435af86cb61fc7a7f112d3136ae05a9a2340e4bd7bff546764beb0f2f",
+ "chksum_sha256": "b61765843acbba72ca4a817462fdf69e3ca14ab13c733c18573b6c398cdafde9",
"format": 1
}
],
diff --git a/ansible_collections/netapp/ontap/MANIFEST.json b/ansible_collections/netapp/ontap/MANIFEST.json
index c066583ca..4e6ca9302 100644
--- a/ansible_collections/netapp/ontap/MANIFEST.json
+++ b/ansible_collections/netapp/ontap/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "netapp",
"name": "ontap",
- "version": "22.10.0",
+ "version": "22.11.0",
"authors": [
"NetApp Ansible Team <ng-ansibleteam@netapp.com>"
],
@@ -25,7 +25,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "3b1ef023a88302b05998107de07d042c2efd877b22839f39bfd038585e6a7e35",
+ "chksum_sha256": "41e6e78b1fe132e7951ec88a6244008f0c9c29bfb7ede985f4c0ee3e08daefbf",
"format": 1
},
"format": 1
diff --git a/ansible_collections/netapp/ontap/README.md b/ansible_collections/netapp/ontap/README.md
index cfad4cbcf..a8e0b1c28 100644
--- a/ansible_collections/netapp/ontap/README.md
+++ b/ansible_collections/netapp/ontap/README.md
@@ -62,6 +62,19 @@ The following modules do not have REST equivalent APIs. They will stop working o
# Release Notes
+## 22.11.0
+
+### Minor Changes
+ - na_ontap_vserver_audit - new options `schedule.*` added under `log.rotation`, requires ONTAP 9.6 or later.
+ - na_ontap_cifs - new option `offline_files` added in REST, requires ONTAP 9.10 or later.
+ - na_ontap_net_ifgrp - updated documentation for parameter `name`.
+ - na_ontap_security_config - added warning for missing `supported_cipher_suites` to maintain idempotency in REST.
+
+### Bug Fixes
+ - na_ontap_fpolicy_policy - fixed issue with idempotency in REST.
+ - na_ontap_dns - fix issue with modifying DNS servers in REST.
+ - na_ontap_quotas - fixed issue with idempotency in REST.
+
## 22.10.0
### Minor Changes
@@ -76,6 +89,7 @@ The following modules do not have REST equivalent APIs. They will stop working o
- na_ontap_storage_auto_giveback - added information on modifed attributes in module output.
- na_ontap_vscan_scanner_pool - added REST support to Vscan Scanner Pools Configuration module, requires ONTAP 9.6 or later.
- na_ontap_cifs_server - new option `is_multichannel_enabled` added in REST, requires ONTAP 9.10 or later.
+ - na_ontap_vserver_audit - new options `schedule.*` added under `log.rotation`.
### Bug Fixes
- na_ontap_igroup_initiator - fixed issue with idempotency.
diff --git a/ansible_collections/netapp/ontap/changelogs/.DS_Store b/ansible_collections/netapp/ontap/changelogs/.DS_Store
deleted file mode 100644
index 316ace4f1..000000000
--- a/ansible_collections/netapp/ontap/changelogs/.DS_Store
+++ /dev/null
Binary files differ
diff --git a/ansible_collections/netapp/ontap/changelogs/.plugin-cache.yaml b/ansible_collections/netapp/ontap/changelogs/.plugin-cache.yaml
index 61e172720..9b881c490 100644
--- a/ansible_collections/netapp/ontap/changelogs/.plugin-cache.yaml
+++ b/ansible_collections/netapp/ontap/changelogs/.plugin-cache.yaml
@@ -1,9 +1,20 @@
+objects:
+ role: {}
plugins:
become: {}
cache: {}
callback: {}
cliconf: {}
connection: {}
+ filter:
+ iso8601_duration_from_seconds:
+ description: Encode seconds as a ISO 8601 duration string
+ name: iso8601_duration_from_seconds
+ version_added: 21.24.0
+ iso8601_duration_to_seconds:
+ description: Decode a ISO 8601 duration string as seconds
+ name: iso8601_duration_to_seconds
+ version_added: 21.24.0
httpapi: {}
inventory: {}
lookup: {}
@@ -11,673 +22,781 @@ plugins:
na_ontap_active_directory:
description: NetApp ONTAP configure active directory
name: na_ontap_active_directory
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.9.0
+ na_ontap_active_directory_domain_controllers:
+ description: NetApp ONTAP configure active directory preferred domain controllers
+ name: na_ontap_active_directory_domain_controllers
+ namespace: ''
+ version_added: 22.7.0
na_ontap_aggregate:
description: NetApp ONTAP manage aggregates.
name: na_ontap_aggregate
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_autosupport:
description: NetApp ONTAP autosupport
name: na_ontap_autosupport
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_autosupport_invoke:
description: NetApp ONTAP send AutoSupport message
name: na_ontap_autosupport_invoke
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.4.0
+ na_ontap_bgp_peer_group:
+ description: NetApp ONTAP module to create, modify or delete bgp peer group.
+ name: na_ontap_bgp_peer_group
+ namespace: ''
+ version_added: 22.0.0
na_ontap_broadcast_domain:
description: NetApp ONTAP manage broadcast domains.
name: na_ontap_broadcast_domain
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_broadcast_domain_ports:
description: NetApp ONTAP manage broadcast domain ports
name: na_ontap_broadcast_domain_ports
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_cg_snapshot:
description: NetApp ONTAP manage consistency group snapshot
name: na_ontap_cg_snapshot
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_cifs:
description: NetApp ONTAP Manage cifs-share
name: na_ontap_cifs
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_cifs_acl:
description: NetApp ONTAP manage cifs-share-access-control
name: na_ontap_cifs_acl
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: null
+ na_ontap_cifs_local_group:
+ description: NetApp Ontap - create, delete or modify CIFS local group.
+ name: na_ontap_cifs_local_group
+ namespace: ''
+ version_added: 22.1.0
na_ontap_cifs_local_group_member:
description: NetApp Ontap - Add or remove CIFS local group member
name: na_ontap_cifs_local_group_member
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.2.0
+ na_ontap_cifs_local_user:
+ description: NetApp ONTAP local CIFS user.
+ name: na_ontap_cifs_local_user
+ namespace: ''
+ version_added: 22.2.0
na_ontap_cifs_local_user_modify:
description: NetApp ONTAP modify local CIFS user.
name: na_ontap_cifs_local_user_modify
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.4.0
na_ontap_cifs_local_user_set_password:
description: NetApp ONTAP set local CIFS user password
name: na_ontap_cifs_local_user_set_password
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.8.0
na_ontap_cifs_server:
description: NetApp ONTAP CIFS server configuration
name: na_ontap_cifs_server
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
- version_added: 2.6.0
+ namespace: ''
+ version_added: 2.6.0
+ na_ontap_cifs_unix_symlink_mapping:
+ description: NetApp ONTAP module to manage UNIX symbolic link mapping for CIFS
+ clients.
+ name: na_ontap_cifs_unix_symlink_mapping
+ namespace: ''
+ version_added: 22.9.0
+ na_ontap_cli_timeout:
+ description: NetApp ONTAP module to set the CLI inactivity timeout value.
+ name: na_ontap_cli_timeout
+ namespace: ''
+ version_added: 22.9.0
na_ontap_cluster:
description: NetApp ONTAP cluster - create a cluster and add/remove nodes.
name: na_ontap_cluster
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_cluster_ha:
description: NetApp ONTAP Manage HA status for cluster
name: na_ontap_cluster_ha
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_cluster_peer:
description: NetApp ONTAP Manage Cluster peering
name: na_ontap_cluster_peer
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_command:
description: NetApp ONTAP Run any cli command, the username provided needs to
have console login permission.
name: na_ontap_command
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_debug:
description: NetApp ONTAP Debug netapp-lib import and connection.
name: na_ontap_debug
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.1.0
na_ontap_disk_options:
description: NetApp ONTAP modify storage disk options
name: na_ontap_disk_options
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.4.0
na_ontap_disks:
description: NetApp ONTAP Assign disks to nodes
name: na_ontap_disks
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_dns:
description: NetApp ONTAP Create, delete, modify DNS servers.
name: na_ontap_dns
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_domain_tunnel:
description: NetApp ONTAP domain tunnel
name: na_ontap_domain_tunnel
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.3.0
na_ontap_efficiency_policy:
description: NetApp ONTAP manage efficiency policies (sis policies)
name: na_ontap_efficiency_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
+ na_ontap_ems_config:
+ description: NetApp ONTAP module to modify EMS configuration.
+ name: na_ontap_ems_config
+ namespace: ''
+ version_added: 22.8.0
+ na_ontap_ems_destination:
+ description: NetApp ONTAP configuration for EMS event destination
+ name: na_ontap_ems_destination
+ namespace: ''
+ version_added: 21.23.0
+ na_ontap_ems_filter:
+ description: NetApp ONTAP EMS Filter
+ name: na_ontap_ems_filter
+ namespace: ''
+ version_added: 22.4.0
na_ontap_export_policy:
description: NetApp ONTAP manage export-policy
name: na_ontap_export_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_export_policy_rule:
description: NetApp ONTAP manage export policy rules
name: na_ontap_export_policy_rule
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_fcp:
description: NetApp ONTAP Start, Stop and Enable FCP services.
name: na_ontap_fcp
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_fdsd:
description: NetApp ONTAP create or remove a File Directory security descriptor.
name: na_ontap_fdsd
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.8.0
na_ontap_fdsp:
description: NetApp ONTAP create or delete a file directory security policy
name: na_ontap_fdsp
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.8.0
na_ontap_fdspt:
description: NetApp ONTAP create, delete or modify File Directory security policy
tasks
name: na_ontap_fdspt
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.8.0
na_ontap_fdss:
description: NetApp ONTAP File Directory Security Set.
name: na_ontap_fdss
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.8.0
na_ontap_file_directory_policy:
description: NetApp ONTAP create, delete, or modify vserver security file-directory
policy
name: na_ontap_file_directory_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.8.0
+ na_ontap_file_security_permissions:
+ description: NetApp ONTAP NTFS file security permissions
+ name: na_ontap_file_security_permissions
+ namespace: ''
+ version_added: 22.0.0
+ na_ontap_file_security_permissions_acl:
+ description: NetApp ONTAP file security permissions ACL
+ name: na_ontap_file_security_permissions_acl
+ namespace: ''
+ version_added: 22.0.0
na_ontap_firewall_policy:
description: NetApp ONTAP Manage a firewall policy
name: na_ontap_firewall_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_firmware_upgrade:
description: NetApp ONTAP firmware upgrade for SP, shelf, ACP, and disk.
name: na_ontap_firmware_upgrade
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_flexcache:
description: NetApp ONTAP FlexCache - create/delete relationship
name: na_ontap_flexcache
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_fpolicy_event:
description: NetApp ONTAP FPolicy policy event configuration
name: na_ontap_fpolicy_event
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.4.0
na_ontap_fpolicy_ext_engine:
description: NetApp ONTAP fPolicy external engine configuration.
name: na_ontap_fpolicy_ext_engine
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.4.0
na_ontap_fpolicy_policy:
description: NetApp ONTAP - Create, delete or modify an FPolicy policy.
name: na_ontap_fpolicy_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.3.0
na_ontap_fpolicy_scope:
description: NetApp ONTAP - Create, delete or modify an FPolicy policy scope
configuration.
name: na_ontap_fpolicy_scope
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.4.0
na_ontap_fpolicy_status:
description: NetApp ONTAP - Enables or disables the specified fPolicy policy
name: na_ontap_fpolicy_status
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.4.0
na_ontap_igroup:
description: NetApp ONTAP iSCSI or FC igroup configuration
name: na_ontap_igroup
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_igroup_initiator:
description: NetApp ONTAP igroup initiator configuration
name: na_ontap_igroup_initiator
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_info:
description: NetApp information gatherer
name: na_ontap_info
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_interface:
description: NetApp ONTAP LIF configuration
name: na_ontap_interface
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_ipspace:
description: NetApp ONTAP Manage an ipspace
name: na_ontap_ipspace
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_iscsi:
description: NetApp ONTAP manage iSCSI service
name: na_ontap_iscsi
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_iscsi_security:
description: NetApp ONTAP Manage iscsi security.
name: na_ontap_iscsi_security
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
- version_added: 19.10.1
+ namespace: ''
+ version_added: 19.11.0
na_ontap_job_schedule:
description: NetApp ONTAP Job Schedule
name: na_ontap_job_schedule
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
+ na_ontap_kerberos_interface:
+ description: NetApp ONTAP module to modify kerberos interface.
+ name: na_ontap_kerberos_interface
+ namespace: ''
+ version_added: 22.6.0
na_ontap_kerberos_realm:
description: NetApp ONTAP vserver nfs kerberos realm
name: na_ontap_kerberos_realm
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_ldap:
description: NetApp ONTAP LDAP
name: na_ontap_ldap
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_ldap_client:
description: NetApp ONTAP LDAP client
name: na_ontap_ldap_client
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_license:
description: NetApp ONTAP protocol and feature license packages
name: na_ontap_license
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
+ na_ontap_local_hosts:
+ description: NetApp ONTAP local hosts
+ name: na_ontap_local_hosts
+ namespace: ''
+ version_added: 22.0.0
na_ontap_log_forward:
description: NetApp ONTAP Log Forward Configuration
name: na_ontap_log_forward
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.2.0
na_ontap_login_messages:
description: Setup login banner and message of the day
name: na_ontap_login_messages
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.1.0
na_ontap_lun:
description: NetApp ONTAP manage LUNs
name: na_ontap_lun
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_lun_copy:
description: NetApp ONTAP copy LUNs
name: na_ontap_lun_copy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_lun_map:
description: NetApp ONTAP LUN maps
name: na_ontap_lun_map
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_lun_map_reporting_nodes:
description: NetApp ONTAP LUN maps reporting nodes
name: na_ontap_lun_map_reporting_nodes
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.2.0
na_ontap_mcc_mediator:
description: NetApp ONTAP Add and Remove MetroCluster Mediator
name: na_ontap_mcc_mediator
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.9.0
na_ontap_metrocluster:
description: NetApp ONTAP set up a MetroCluster
name: na_ontap_metrocluster
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.9.0
na_ontap_metrocluster_dr_group:
description: NetApp ONTAP manage MetroCluster DR Group
name: na_ontap_metrocluster_dr_group
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.11.0
na_ontap_motd:
description: Setup motd
name: na_ontap_motd
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
+ na_ontap_name_mappings:
+ description: NetApp ONTAP name mappings
+ name: na_ontap_name_mappings
+ namespace: ''
+ version_added: 22.0.0
na_ontap_name_service_switch:
description: NetApp ONTAP Manage name service switch
name: na_ontap_name_service_switch
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: null
na_ontap_ndmp:
description: NetApp ONTAP NDMP services configuration
name: na_ontap_ndmp
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_net_ifgrp:
description: NetApp Ontap modify network interface group
name: na_ontap_net_ifgrp
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_net_port:
description: NetApp ONTAP network ports.
name: na_ontap_net_port
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_net_routes:
description: NetApp ONTAP network routes
name: na_ontap_net_routes
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_net_subnet:
description: NetApp ONTAP Create, delete, modify network subnets.
name: na_ontap_net_subnet
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_net_vlan:
description: NetApp ONTAP network VLAN
name: na_ontap_net_vlan
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_nfs:
description: NetApp ONTAP NFS status
name: na_ontap_nfs
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_node:
description: NetApp ONTAP Modify or Rename a node.
name: na_ontap_node
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_ntfs_dacl:
description: NetApp Ontap create, delate or modify NTFS DACL (discretionary
access control list)
name: na_ontap_ntfs_dacl
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.4.0
na_ontap_ntfs_sd:
description: NetApp ONTAP create, delete or modify NTFS security descriptor
name: na_ontap_ntfs_sd
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.4.0
na_ontap_ntp:
description: NetApp ONTAP NTP server
name: na_ontap_ntp
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_ntp_key:
description: NetApp ONTAP NTP key
name: na_ontap_ntp_key
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.21.0
na_ontap_nvme:
description: NetApp ONTAP Manage NVMe Service
name: na_ontap_nvme
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_nvme_namespace:
description: NetApp ONTAP Manage NVME Namespace
name: na_ontap_nvme_namespace
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_nvme_subsystem:
description: NetApp ONTAP Manage NVME Subsystem
name: na_ontap_nvme_subsystem
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_object_store:
description: NetApp ONTAP manage object store config.
name: na_ontap_object_store
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_partitions:
description: NetApp ONTAP Assign partitions and disks to nodes.
name: na_ontap_partitions
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.8.0
na_ontap_ports:
description: NetApp ONTAP add/remove ports
name: na_ontap_ports
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_portset:
description: NetApp ONTAP Create/Delete portset
name: na_ontap_portset
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_publickey:
description: NetApp ONTAP publickey configuration
name: na_ontap_publickey
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.7.0
na_ontap_qos_adaptive_policy_group:
description: NetApp ONTAP Adaptive Quality of Service policy group.
name: na_ontap_qos_adaptive_policy_group
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_qos_policy_group:
description: NetApp ONTAP manage policy group in Quality of Service.
name: na_ontap_qos_policy_group
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_qtree:
description: NetApp ONTAP manage qtrees
name: na_ontap_qtree
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_quota_policy:
description: NetApp Ontap create, assign, rename or delete quota policy
name: na_ontap_quota_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 19.11.0
na_ontap_quotas:
description: NetApp ONTAP Quotas
name: na_ontap_quotas
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_rest_cli:
description: NetApp ONTAP run any CLI command using REST api/private/cli/
name: na_ontap_rest_cli
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_rest_info:
description: NetApp ONTAP information gatherer using REST APIs
name: na_ontap_rest_info
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.5.0
na_ontap_restit:
description: NetApp ONTAP Run any REST API on ONTAP
name: na_ontap_restit
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.4.0
na_ontap_s3_buckets:
description: NetApp ONTAP S3 Buckets
name: na_ontap_s3_buckets
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.19.0
na_ontap_s3_groups:
description: NetApp ONTAP S3 groups
name: na_ontap_s3_groups
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.21.0
na_ontap_s3_policies:
description: NetApp ONTAP S3 Policies
name: na_ontap_s3_policies
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.21.0
na_ontap_s3_services:
description: NetApp ONTAP S3 services
name: na_ontap_s3_services
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.20.0
na_ontap_s3_users:
description: NetApp ONTAP S3 users
name: na_ontap_s3_users
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.20.0
na_ontap_security_certificates:
description: NetApp ONTAP manage security certificates.
name: na_ontap_security_certificates
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.7.0
na_ontap_security_config:
description: NetApp ONTAP modify security config for SSL.
name: na_ontap_security_config
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.3.0
+ na_ontap_security_ipsec_ca_certificate:
+ description: NetApp ONTAP module to add or delete ipsec ca certificate.
+ name: na_ontap_security_ipsec_ca_certificate
+ namespace: ''
+ version_added: 22.1.0
+ na_ontap_security_ipsec_config:
+ description: NetApp ONTAP module to configure IPsec config.
+ name: na_ontap_security_ipsec_config
+ namespace: ''
+ version_added: 22.1.0
+ na_ontap_security_ipsec_policy:
+ description: NetApp ONTAP module to create, modify or delete security IPsec
+ policy.
+ name: na_ontap_security_ipsec_policy
+ namespace: ''
+ version_added: 22.1.0
na_ontap_security_key_manager:
description: NetApp ONTAP security key manager.
name: na_ontap_security_key_manager
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
+ na_ontap_security_ssh:
+ description: NetApp ONTAP security ssh
+ name: na_ontap_security_ssh
+ namespace: ''
+ version_added: 21.24.0
na_ontap_service_policy:
description: NetApp ONTAP service policy configuration
name: na_ontap_service_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.7.0
na_ontap_service_processor_network:
description: NetApp ONTAP service processor network
name: na_ontap_service_processor_network
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_snaplock_clock:
description: NetApp ONTAP Sets the snaplock compliance clock.
name: na_ontap_snaplock_clock
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.4.0
na_ontap_snapmirror:
description: NetApp ONTAP or ElementSW Manage SnapMirror
name: na_ontap_snapmirror
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_snapmirror_policy:
description: NetApp ONTAP create, delete or modify SnapMirror policies
name: na_ontap_snapmirror_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.3.0
na_ontap_snapshot:
description: NetApp ONTAP manage Snapshots
name: na_ontap_snapshot
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_snapshot_policy:
description: NetApp ONTAP manage Snapshot Policy
name: na_ontap_snapshot_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_snmp:
- description: NetApp ONTAP SNMP community
+ description: NetApp ONTAP SNMP user
name: na_ontap_snmp
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
+ na_ontap_snmp_config:
+ description: NetApp ONTAP module to modify SNMP configuration.
+ name: na_ontap_snmp_config
+ namespace: ''
+ version_added: 22.9.0
na_ontap_snmp_traphosts:
description: NetApp ONTAP SNMP traphosts.
name: na_ontap_snmp_traphosts
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.3.0
na_ontap_software_update:
description: NetApp ONTAP Update Software
name: na_ontap_software_update
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_ssh_command:
description: NetApp ONTAP Run any cli command over plain SSH using paramiko.
name: na_ontap_ssh_command
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.8.0
na_ontap_storage_auto_giveback:
description: Enables or disables NetApp ONTAP storage auto giveback for a specified
node
name: na_ontap_storage_auto_giveback
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.3.0
na_ontap_storage_failover:
description: Enables or disables NetApp Ontap storage failover for a specified
node
name: na_ontap_storage_failover
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.3.0
na_ontap_svm:
description: NetApp ONTAP SVM
name: na_ontap_svm
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_svm_options:
description: NetApp ONTAP Modify SVM Options
name: na_ontap_svm_options
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
na_ontap_ucadapter:
description: NetApp ONTAP UC adapter configuration
name: na_ontap_ucadapter
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_unix_group:
description: NetApp ONTAP UNIX Group
name: na_ontap_unix_group
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_unix_user:
description: NetApp ONTAP UNIX users
name: na_ontap_unix_user
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_user:
description: NetApp ONTAP user configuration and management
name: na_ontap_user
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_user_role:
description: NetApp ONTAP user role configuration and management
name: na_ontap_user_role
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_volume:
description: NetApp ONTAP manage volumes.
name: na_ontap_volume
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_volume_autosize:
description: NetApp ONTAP manage volume autosize
name: na_ontap_volume_autosize
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_volume_clone:
description: NetApp ONTAP manage volume clones.
name: na_ontap_volume_clone
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.6.0
na_ontap_volume_efficiency:
description: NetApp ONTAP enables, disables or modifies volume efficiency
name: na_ontap_volume_efficiency
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 21.2.0
na_ontap_volume_snaplock:
description: NetApp ONTAP manage volume snaplock retention.
name: na_ontap_volume_snaplock
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.2.0
na_ontap_vscan:
description: NetApp ONTAP Vscan enable/disable.
name: na_ontap_vscan
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_vscan_on_access_policy:
description: NetApp ONTAP Vscan on access policy configuration.
name: na_ontap_vscan_on_access_policy
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_vscan_on_demand_task:
description: NetApp ONTAP Vscan on demand task configuration.
name: na_ontap_vscan_on_demand_task
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
na_ontap_vscan_scanner_pool:
description: NetApp ONTAP Vscan Scanner Pools Configuration.
name: na_ontap_vscan_scanner_pool
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.8.0
+ na_ontap_vserver_audit:
+ description: NetApp Ontap - create, delete or modify vserver audit configuration.
+ name: na_ontap_vserver_audit
+ namespace: ''
+ version_added: 22.3.0
na_ontap_vserver_cifs_security:
description: NetApp ONTAP vserver CIFS security modification
name: na_ontap_vserver_cifs_security
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.9.0
na_ontap_vserver_peer:
description: NetApp ONTAP Vserver peering
name: na_ontap_vserver_peer
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 2.7.0
+ na_ontap_vserver_peer_permissions:
+ description: NetApp Ontap - create, delete or modify vserver peer permission.
+ name: na_ontap_vserver_peer_permissions
+ namespace: ''
+ version_added: 22.3.0
na_ontap_wait_for_condition:
description: NetApp ONTAP wait_for_condition. Loop over a get status request
until a condition is met.
name: na_ontap_wait_for_condition
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.8.0
na_ontap_wwpn_alias:
description: NetApp ONTAP set FCP WWPN Alias
name: na_ontap_wwpn_alias
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.4.0
na_ontap_zapit:
description: NetApp ONTAP Run any ZAPI on ONTAP
name: na_ontap_zapit
- namespace: private.var.folders.zv.gm9l2n2n30g2k5tdmny65l_r0000gp.T.antsibull-changelog3bt20e04.collections.ansible_collections.netapp.ontap.plugins.modules
+ namespace: ''
version_added: 20.4.0
netconf: {}
shell: {}
strategy: {}
+ test: {}
vars: {}
-version: 21.22.0
+version: 22.10.0
diff --git a/ansible_collections/netapp/ontap/changelogs/changelog.yaml b/ansible_collections/netapp/ontap/changelogs/changelog.yaml
index 8d0eb138e..d383264a8 100644
--- a/ansible_collections/netapp/ontap/changelogs/changelog.yaml
+++ b/ansible_collections/netapp/ontap/changelogs/changelog.yaml
@@ -2766,6 +2766,29 @@ releases:
- DEVOPS-6680.yaml
- DEVOPS-6681.yaml
release_date: '2024-02-06'
+ 22.11.0:
+ changes:
+ bugfixes:
+ - na_ontap_dns - fix issue with modifying DNS servers in REST.
+ - na_ontap_fpolicy_policy - fixed issue with idempotency in REST.
+ - na_ontap_quotas - fixed issue with idempotency in REST.
+ - na_ontap_security_config - added warning for missing `supported_cipher_suites`
+ to maintain idempotency in REST.
+ minor_changes:
+ - na_ontap_cifs - new option `offline_files` added in REST, requires ONTAP 9.10
+ or later.
+ - na_ontap_net_ifgrp - updated documentation for parameter `name`.
+ - na_ontap_vserver_audit - new options `schedule.*` added under `log.rotation`,
+ requires ONTAP 9.6 or later.
+ fragments:
+ - DEVOPS-6356.yaml
+ - DEVOPS-6691.yaml
+ - DEVOPS-6715.yaml
+ - DEVOPS-6721.yaml
+ - DEVOPS-6747.yaml
+ - DEVOPS-6807.yaml
+ - DEVOPS-6825.yaml
+ release_date: '2024-04-08'
22.2.0:
changes:
bugfixes:
diff --git a/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6356.yaml b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6356.yaml
new file mode 100644
index 000000000..bc1f2b0d4
--- /dev/null
+++ b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6356.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+ - na_ontap_quotas - fixed issue with idempotency in REST. \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6691.yaml b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6691.yaml
new file mode 100644
index 000000000..400bd56c6
--- /dev/null
+++ b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6691.yaml
@@ -0,0 +1,2 @@
+minor_changes:
+ - na_ontap_vserver_audit - new options `schedule.*` added under `log.rotation`, requires ONTAP 9.6 or later. \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6715.yaml b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6715.yaml
new file mode 100644
index 000000000..2635e5bf0
--- /dev/null
+++ b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6715.yaml
@@ -0,0 +1,2 @@
+minor_changes:
+ - na_ontap_cifs - new option `offline_files` added in REST, requires ONTAP 9.10 or later. \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6721.yaml b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6721.yaml
new file mode 100644
index 000000000..deba2dd7e
--- /dev/null
+++ b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6721.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+ - na_ontap_dns - fix issue with modifying DNS servers in REST. \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6747.yaml b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6747.yaml
new file mode 100644
index 000000000..6af639841
--- /dev/null
+++ b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6747.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+ - na_ontap_fpolicy_policy - fixed issue with idempotency in REST. \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6807.yaml b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6807.yaml
new file mode 100644
index 000000000..44902e66d
--- /dev/null
+++ b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6807.yaml
@@ -0,0 +1,2 @@
+minor_changes:
+ - na_ontap_net_ifgrp - updated documentation for parameter `name`. \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6825.yaml b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6825.yaml
new file mode 100644
index 000000000..506f2a055
--- /dev/null
+++ b/ansible_collections/netapp/ontap/changelogs/fragments/DEVOPS-6825.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+ - na_ontap_security_config - added warning for missing `supported_cipher_suites` to maintain idempotency in REST. \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/plugins/module_utils/netapp.py b/ansible_collections/netapp/ontap/plugins/module_utils/netapp.py
index f41139423..fe1e89214 100644
--- a/ansible_collections/netapp/ontap/plugins/module_utils/netapp.py
+++ b/ansible_collections/netapp/ontap/plugins/module_utils/netapp.py
@@ -48,7 +48,7 @@ try:
except ImportError:
ANSIBLE_VERSION = 'unknown'
-COLLECTION_VERSION = "22.10.0"
+COLLECTION_VERSION = "22.11.0"
CLIENT_APP_VERSION = "%s/%s" % ("%s", COLLECTION_VERSION)
IMPORT_EXCEPTION = None
diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_cifs.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_cifs.py
index b04a37110..ea978f8f1 100644
--- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_cifs.py
+++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_cifs.py
@@ -178,6 +178,14 @@ options:
type: bool
version_added: 22.5.0
+ offline_files:
+ choices: ['none', 'manual', 'documents', 'programs']
+ description:
+ - Allows Windows clients to cache data on this share.
+ - This option is only supported with REST and requires ONTAP 9.10 or later.
+ type: str
+ version_added: 22.11.0
+
short_description: NetApp ONTAP Manage cifs-share
version_added: 2.6.0
@@ -287,7 +295,8 @@ class NetAppONTAPCifsShare:
namespace_caching=dict(required=False, type='bool'),
continuously_available=dict(required=False, type='bool'),
browsable=dict(required=False, type='bool'),
- show_previous_versions=dict(required=False, type='bool')
+ show_previous_versions=dict(required=False, type='bool'),
+ offline_files=dict(required=False, type='str', choices=['none', 'manual', 'documents', 'programs']),
))
self.module = AnsibleModule(
@@ -301,13 +310,13 @@ class NetAppONTAPCifsShare:
# Set up Rest API
self.rest_api = netapp_utils.OntapRestAPI(self.module)
partially_supported_rest_properties = [['continuously_available', (9, 10, 1)], ['namespace_caching', (9, 10, 1)],
- ['show_snapshot', (9, 10, 1)], ['allow_unencrypted_access', (9, 11)],
+ ['show_snapshot', (9, 10, 1)], ['offline_files', (9, 10, 1)], ['allow_unencrypted_access', (9, 11)],
['browsable', (9, 13, 1)], ['show_previous_versions', (9, 13, 1)]]
unsupported_rest_properties = ['share_properties', 'symlink_properties', 'vscan_fileop_profile']
self.use_rest = self.rest_api.is_rest_supported_properties(self.parameters, unsupported_rest_properties, partially_supported_rest_properties)
self.unsupported_zapi_properties = ['unix_symlink', 'access_based_enumeration', 'change_notify', 'encryption', 'home_directory',
'oplocks', 'continuously_available', 'show_snapshot', 'namespace_caching', 'allow_unencrypted_access',
- 'browsable', 'show_previous_versions']
+ 'browsable', 'show_previous_versions', 'offline_files']
self.svm_uuid = None
if not self.use_rest:
if not netapp_utils.has_netapp_lib():
@@ -447,7 +456,7 @@ class NetAppONTAPCifsShare:
'encryption,'
'oplocks,'}
if self.rest_api.meets_rest_minimum_version(self.use_rest, 9, 10, 1):
- options['fields'] += 'show_snapshot,namespace_caching,continuously_available,'
+ options['fields'] += 'show_snapshot,namespace_caching,continuously_available,offline_files,'
if self.rest_api.meets_rest_minimum_version(self.use_rest, 9, 11, 0):
options['fields'] += 'allow_unencrypted_access,'
if self.rest_api.meets_rest_minimum_version(self.use_rest, 9, 13, 1):
@@ -467,6 +476,7 @@ class NetAppONTAPCifsShare:
'encryption': record.get('encryption'),
'oplocks': record.get('oplocks'),
'continuously_available': record.get('continuously_available'),
+ 'offline_files': record.get('offline_files'),
'show_snapshot': record.get('show_snapshot'),
'namespace_caching': record.get('namespace_caching'),
'allow_unencrypted_access': record.get('allow_unencrypted_access'),
@@ -481,7 +491,7 @@ class NetAppONTAPCifsShare:
if params is None:
params = self.parameters
options = ['path', 'comment', 'unix_symlink', 'access_based_enumeration', 'change_notify', 'encryption',
- 'home_directory', 'oplocks', 'continuously_available', 'show_snapshot', 'namespace_caching',
+ 'home_directory', 'oplocks', 'continuously_available', 'offline_files', 'show_snapshot', 'namespace_caching',
'allow_unencrypted_access', 'browsable', 'show_previous_versions']
for key in options:
if key in params:
diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_dns.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_dns.py
index 3c46b0084..1bea08120 100644
--- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_dns.py
+++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_dns.py
@@ -259,10 +259,12 @@ class NetAppOntapDns:
if error:
self.module.fail_json(msg="Error getting DNS service: %s" % error)
if record:
- if params.get('scope') == 'cluster':
+ if params.get('scope') == 'cluster' or not self.na_helper.safe_get(record, ['svm', 'uuid']):
uuid = record.get('uuid')
else:
uuid = self.na_helper.safe_get(record, ['svm', 'uuid'])
+ if uuid is None:
+ self.module.fail_json(msg="Error getting DNS service: could not retrieve UUID of the DNS object")
return {
'domains': record.get('domains'),
'nameservers': record.get('servers'),
diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_fpolicy_policy.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_fpolicy_policy.py
index 47d9143cb..a99c76d76 100644
--- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_fpolicy_policy.py
+++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_fpolicy_policy.py
@@ -1,6 +1,6 @@
#!/usr/bin/python
-# (c) 2021, NetApp, Inc
+# (c) 2021-2023, NetApp, 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
@@ -181,11 +181,12 @@ class NetAppOntapFpolicyPolicy():
'vserver': message['records'][0]['vserver'],
'name': message['records'][0]['policy_name'],
'events': message['records'][0]['events'],
- 'allow_privileged_access': message['records'][0]['allow_privileged_access'],
'engine': message['records'][0]['engine'],
'is_mandatory': message['records'][0]['is_mandatory'],
'is_passthrough_read_enabled': message['records'][0]['is_passthrough_read_enabled']
}
+ allow_privileged_access = True if message['records'][0]['allow_privileged_access'] == 'yes' else False
+ return_value['allow_privileged_access'] = allow_privileged_access
if 'privileged_user_name' in message['records'][0]:
return_value['privileged_user_name'] = message['records'][0]['privileged_user_name']
diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_net_ifgrp.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_net_ifgrp.py
index 45035ed64..4a596ae12 100644
--- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_net_ifgrp.py
+++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_net_ifgrp.py
@@ -36,7 +36,7 @@ options:
name:
description:
- Specifies the interface group name.
- - Not supported with REST, use C(ports) or C(from_lag_ports).
+ - Not supported with REST, use C(ports) or C(from_lag_ports). LAG names are automatically created in REST and returned in module output.
- Required with ZAPI.
type: str
diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_quotas.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_quotas.py
index 1aca89feb..d4b13ea47 100644
--- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_quotas.py
+++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_quotas.py
@@ -594,6 +594,7 @@ class NetAppONTAPQuotas:
'files.soft_limit,'
'volume.uuid,'
'users.name,'
+ 'users.id,'
'group.name,'}
# set qtree name in query for type user and group if not ''.
@@ -601,8 +602,17 @@ class NetAppONTAPQuotas:
query['qtree.name'] = self.parameters['qtree']
if self.parameters.get('quota_target'):
type = self.parameters['type']
- field_name = 'users.name' if type == 'user' else 'group.name' if type == 'group' else 'qtree.name'
- query[field_name] = self.parameters['quota_target']
+ if type == 'user':
+ users_names = [target for target in self.parameters['quota_target'].split(',') if not target.isdigit()]
+ users_ids = [target for target in self.parameters['quota_target'].split(',') if target.isdigit()]
+ if users_names:
+ query['users.name'] = ",".join(users_names)
+ if users_ids:
+ query['users.id'] = ",".join(users_ids)
+ else:
+ field_name = 'group.name' if type == 'group' else 'qtree.name'
+ query[field_name] = self.parameters['quota_target']
+
api = 'storage/quota/rules'
# If type: user, get quota rules api returns users which has name starts with input target user names.
# Example of users list in a record:
@@ -622,9 +632,11 @@ class NetAppONTAPQuotas:
if desired_qtree != current_qtree:
continue
if type == 'user':
- desired_users = self.parameters['quota_target'].split(',')
- current_users = [user['name'] for user in item['users']]
- if set(current_users) == set(desired_users):
+ current_users = {}
+ current_users['names'] = [user['name'] for user in item['users'] if user.get('name')]
+ current_users['ids'] = [user['id'] for user in item['users'] if user.get('id')]
+ if set(current_users['names']) == set(users_names) and \
+ set(current_users['ids']) == set(users_ids):
record = item
break
elif item['group']['name'] == self.parameters['quota_target']:
diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_security_config.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_security_config.py
index aac0ea1d5..28f0f6576 100644
--- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_security_config.py
+++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_security_config.py
@@ -264,11 +264,23 @@ class NetAppOntapSecurityConfig:
if error:
self.module.fail_json(msg="Error on modifying security config: %s" % error)
+ def cipher_suites_warning_rest(self, modify):
+ current = self.get_security_config()
+ suites_for_idempotency = []
+ for current_suite in list(current.get('supported_cipher_suites')):
+ if current_suite not in self.parameters.get('supported_cipher_suites'):
+ suites_for_idempotency.append(current_suite)
+ if len(suites_for_idempotency) > 0:
+ self.module.warn("To achieve idempotency the mentioned cipher_suites must be included.")
+ self.module.warn(", ".join(suites_for_idempotency))
+
def apply(self):
current = self.get_security_config()
modify = self.na_helper.get_modified_attributes(current, self.parameters)
if self.na_helper.changed and not self.module.check_mode:
self.modify_security_config(modify)
+ if 'supported_cipher_suites' in modify:
+ self.cipher_suites_warning_rest(modify)
result = netapp_utils.generate_result(self.na_helper.changed, modify=modify)
self.module.exit_json(**result)
diff --git a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_vserver_audit.py b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_vserver_audit.py
index fc3dc3bed..3f52f918c 100644
--- a/ansible_collections/netapp/ontap/plugins/modules/na_ontap_vserver_audit.py
+++ b/ansible_collections/netapp/ontap/plugins/modules/na_ontap_vserver_audit.py
@@ -114,6 +114,38 @@ options:
- Rotates logs based on log size in bytes.
- Default value is 104857600.
type: int
+ schedule:
+ description:
+ - Rotates the audit logs based on a schedule by using the time-based rotation parameters in any combination.
+ - The rotation schedule is calculated by using all the time-related values.
+ type: dict
+ version_added: '22.11.0'
+ suboptions:
+ days:
+ description:
+ - Specifies the day of the month schedule to rotate audit log. Specify -1 to rotate the audit logs all days of a month.
+ type: list
+ elements: int
+ hours:
+ description:
+ - Specifies the hourly schedule to rotate audit log. Specify -1 to rotate the audit logs every hour.
+ type: list
+ elements: int
+ minutes:
+ description:
+ - Specifies the minutes schedule to rotate the audit log.
+ type: list
+ elements: int
+ months:
+ description:
+ - Specifies the months schedule to rotate audit log. Specify -1 to rotate the audit logs every month.
+ type: list
+ elements: int
+ weekdays:
+ description:
+ - Specifies the weekdays schedule to rotate audit log. Specify -1 to rotate the audit logs every day.
+ type: list
+ elements: int
notes:
- This module supports REST only.
@@ -180,6 +212,66 @@ EXAMPLES = """
hostname: "{{ netapp_hostname }}"
username: "{{ netapp_username }}"
password: "{{ netapp_password }}"
+
+ # The audit logs are rotated in January and March on Monday, Wednesday, and Friday,
+ # at 6:15, 6:30, 6:45, 12:15, 12:30, 12:45, 18:15, 18:30, and 18:45
+ # The last 6 audit logs are retained
+ - name: Create vserver audit configuration
+ netapp.ontap.na_ontap_vserver_audit:
+ state: present
+ vserver: ansible
+ enabled: True
+ events:
+ authorization_policy: False
+ cap_staging: False
+ cifs_logon_logoff: True
+ file_operations: True
+ file_share: False
+ security_group: False
+ user_account: False
+ log_path: "/"
+ log:
+ format: xml
+ retention:
+ count: 6
+ rotation:
+ schedule:
+ hours: [6,12,18]
+ minutes: [15,30,45]
+ months: [1,3]
+ weekdays: [1,3,5]
+ guarantee: False
+ hostname: "{{ netapp_hostname }}"
+ username: "{{ netapp_username }}"
+ password: "{{ netapp_password }}"
+
+ # The audit logs are rotated monthly, all days of the week, at 12:30
+ - name: Modify vserver audit configuration
+ netapp.ontap.na_ontap_vserver_audit:
+ state: present
+ vserver: ansible
+ enabled: True
+ events:
+ authorization_policy: False
+ cap_staging: False
+ cifs_logon_logoff: True
+ file_operations: True
+ file_share: False
+ security_group: False
+ user_account: False
+ log_path: "/"
+ log:
+ format: xml
+ rotation:
+ schedule:
+ hours: [12]
+ minutes: [30]
+ months: [-1]
+ weekdays: [-1]
+ guarantee: False
+ hostname: "{{ netapp_hostname }}"
+ username: "{{ netapp_username }}"
+ password: "{{ netapp_password }}"
"""
RETURN = """
@@ -214,6 +306,13 @@ class NetAppONTAPVserverAudit:
)),
rotation=dict(type='dict', options=dict(
size=dict(type='int'),
+ schedule=dict(type='dict', options=dict(
+ days=dict(type='list', elements='int'),
+ hours=dict(type='list', elements='int'),
+ minutes=dict(type='list', elements='int'),
+ months=dict(type='list', elements='int'),
+ weekdays=dict(type='list', elements='int'),
+ )),
)),
)),
events=dict(type='dict', options=dict(
@@ -270,6 +369,10 @@ class NetAppONTAPVserverAudit:
}
return record
+ def schedule_rotation_key_value(self, key):
+ value = self.na_helper.safe_get(self.parameters, ['log', 'rotation', 'schedule', key])
+ return [] if -1 in value else value
+
def create_vserver_audit_config_body_rest(self):
"""
Vserver audit config body for create and modify with rest API.
@@ -283,8 +386,14 @@ class NetAppONTAPVserverAudit:
body['log.retention.count'] = self.parameters['log']['retention']['count']
if self.na_helper.safe_get(self.parameters, ['log', 'retention', 'duration']):
body['log.retention.duration'] = self.parameters['log']['retention']['duration']
- if self.na_helper.safe_get(self.parameters, ['log', 'rotation', 'size']):
- body['log.rotation.size'] = self.parameters['log']['rotation']['size']
+ if self.na_helper.safe_get(self.parameters, ['log', 'rotation']):
+ if self.na_helper.safe_get(self.parameters, ['log', 'rotation', 'size']):
+ body['log.rotation.size'] = self.parameters['log']['rotation']['size']
+ else:
+ for schedule_rotation_key in ['days', 'hours', 'minutes', 'months', 'weekdays']:
+ if self.na_helper.safe_get(self.parameters, ['log', 'rotation', 'schedule', schedule_rotation_key]) is not None:
+ key = 'log.rotation.schedule.' + schedule_rotation_key
+ body[key] = self.schedule_rotation_key_value(schedule_rotation_key)
if self.na_helper.safe_get(self.parameters, ['log', 'format']):
body['log.format'] = self.parameters['log']['format']
if 'log_path' in self.parameters:
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/.gitignore b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/.gitignore
deleted file mode 100644
index bc1a1f616..000000000
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# Created by pytest automatically.
-*
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/CACHEDIR.TAG b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/CACHEDIR.TAG
deleted file mode 100644
index fce15ad7e..000000000
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/CACHEDIR.TAG
+++ /dev/null
@@ -1,4 +0,0 @@
-Signature: 8a477f597d28d172789f06886806bc55
-# This file is a cache directory tag created by pytest.
-# For information about cache directory tags, see:
-# https://bford.info/cachedir/spec.html
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/README.md b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/README.md
deleted file mode 100644
index b89018ced..000000000
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# pytest cache directory #
-
-This directory contains data from the pytest's cache plugin,
-which provides the `--lf` and `--ff` options, as well as the `cache` fixture.
-
-**Do not** commit this to version control.
-
-See [the docs](https://docs.pytest.org/en/stable/how-to/cache.html) for more information.
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/lastfailed b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/lastfailed
deleted file mode 100644
index ba7b58d20..000000000
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/lastfailed
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "test_na_ontap_lun_rest.py": true
-} \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/nodeids b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/nodeids
deleted file mode 100644
index ca22cf9ee..000000000
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/nodeids
+++ /dev/null
@@ -1,6 +0,0 @@
-[
- "test_na_ontap_lun.py::TestMyModule::test_create_error_missing_param",
- "test_na_ontap_lun.py::TestMyModule::test_module_fail_when_required_args_missing",
- "test_na_ontap_lun_rest.py::TestMyModule::test_create_error_missing_param",
- "test_na_ontap_lun_rest.py::TestMyModule::test_successful_create_appli"
-] \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/stepwise b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/stepwise
deleted file mode 100644
index 0637a088a..000000000
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/.pytest_cache/v/cache/stepwise
+++ /dev/null
@@ -1 +0,0 @@
-[] \ No newline at end of file
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_cifs.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_cifs.py
index 99aa0d140..f57aa8d68 100644
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_cifs.py
+++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_cifs.py
@@ -47,6 +47,7 @@ SRR = rest_responses({
"home_directory": True,
"oplocks": False,
"continuously_available": True,
+ "offline_files": "manual",
"show_snapshot": True,
"namespace_caching": True,
"allow_unencrypted_access": True,
@@ -407,6 +408,31 @@ def test_modify_cifs_share_properties_2():
assert create_and_apply(my_module, ARGS_REST, module_args)
+def test_modify_cifs_offline_files():
+ ''' test modify CIFS offline_files '''
+ register_responses([
+ ('GET', 'cluster', SRR['is_rest_9_13_1']),
+ ('GET', 'protocols/cifs/shares', SRR['cifs_record']),
+ ('PATCH', 'protocols/cifs/shares/671aa46e-11ad-11ec-a267-005056b30cfa/cifs_share_name', SRR['empty_good']),
+ ])
+ module_args = {
+ "offline_files": "none"
+ }
+ assert create_and_apply(my_module, ARGS_REST, module_args)
+
+
+def test_version_error_offline_files():
+ ''' test version error for offline_files '''
+ register_responses([
+ ('GET', 'cluster', SRR['is_rest'])
+ ])
+ module_args = {
+ "offline_files": "none"
+ }
+ error = create_module(my_module, ARGS_REST, module_args, fail=True)['msg']
+ assert 'Minimum version of ONTAP for offline_files is (9, 10, 1)' in error
+
+
def test_error_modify_cifs_share_path():
''' test modify CIFS share path error'''
register_responses([
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_quotas.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_quotas.py
index cd03989c6..843aa13fc 100644
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_quotas.py
+++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_quotas.py
@@ -55,12 +55,38 @@ SRR = rest_responses({
"target": {
"name": "20:05:00:50:56:b3:0c:fa"
},
+ },
+ {
+ "svm": {
+ "uuid": "671aa46e-11ad-11ec-a267-005056b30cfa",
+ "name": "ansible"
+ },
+ "files": {
+ "hard_limit": "100",
+ "soft_limit": "80"
+ },
+ "qtree": {
+ "id": "1",
+ "name": "qt1"
+ },
+ "space": {
+ "hard_limit": "1222800",
+ "soft_limit": "51200"
+ },
+ "type": "user",
+ "user_mapping": False,
+ "users": [{"id": "757"}],
+ "uuid": "264a9e0b-2e03-11e9-a610-005056a7b72d",
+ "volume": {"name": "fv", "uuid": "264a9e0b-2e03-11e9-a610-005056a7b72da"},
+ "target": {
+ "name": "20:05:00:50:56:b3:0c:fa"
+ },
}
],
"num_records": 1
}, None
),
- 'quota_record_0_empty_limtis': (200, {"records": [{
+ 'quota_record_0_empty_limits': (200, {"records": [{
"svm": {"name": "ansible"},
"files": {"hard_limit": 0},
"qtree": {"id": "1", "name": "qt1"},
@@ -441,10 +467,26 @@ def test_rest_successful_create():
('GET', 'storage/volumes', SRR['quota_status']),
('POST', 'storage/quota/rules', SRR['empty_good']),
])
+ assert create_and_apply(my_module, ARGS_REST)
+
+
+def test_rest_successful_create_userid():
+ '''Test successful rest create with users.id with idempotency check'''
+ register_responses([
+ ('GET', 'cluster', SRR['is_rest']),
+ ('GET', 'storage/quota/rules', SRR['empty_records']),
+ ('GET', 'storage/volumes', SRR['quota_status']),
+ ('POST', 'storage/quota/rules', SRR['empty_good']),
+
+ ('GET', 'cluster', SRR['is_rest']),
+ ('GET', 'storage/quota/rules', SRR['quota_record']),
+ ('GET', 'storage/volumes', SRR['quota_status']),
+ ])
module_args = {
- "users": [{"name": "quota_user"}],
+ "quota_target": "757",
}
- assert create_and_apply(my_module, ARGS_REST)
+ assert create_and_apply(my_module, ARGS_REST, module_args)
+ assert create_and_apply(my_module, ARGS_REST, module_args)['changed'] is False
@patch('time.sleep')
@@ -461,9 +503,6 @@ def test_rest_successful_create_job_error(sleep):
('GET', 'cluster/jobs/d78811c1-aebc-11ec-b4de-005056b30cfa', SRR['job_not_found']),
('GET', 'storage/volumes', SRR['volume_uuid'])
])
- module_args = {
- "users": [{"name": "quota_user"}],
- }
assert create_and_apply(my_module, ARGS_REST)
print_warnings()
assert_warning_was_raised('Ignoring job status, assuming success.')
@@ -595,10 +634,10 @@ def test_rest_successful_create_idempotency():
('GET', 'storage/quota/rules', SRR['quota_record']),
('GET', 'storage/volumes', SRR['quota_status']),
('GET', 'cluster', SRR['is_rest']),
- ('GET', 'storage/quota/rules', SRR['quota_record_0_empty_limtis']),
+ ('GET', 'storage/quota/rules', SRR['quota_record_0_empty_limits']),
('GET', 'storage/volumes', SRR['quota_status']),
('GET', 'cluster', SRR['is_rest']),
- ('GET', 'storage/quota/rules', SRR['quota_record_0_empty_limtis']),
+ ('GET', 'storage/quota/rules', SRR['quota_record_0_empty_limits']),
('GET', 'storage/volumes', SRR['quota_status'])
])
assert create_and_apply(my_module, ARGS_REST)['changed'] is False
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_security_config.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_security_config.py
index 1ffdfbc02..2a6009287 100644
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_security_config.py
+++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_security_config.py
@@ -25,9 +25,11 @@ SRR = rest_responses({
# module specific responses
'security_config_record': (200, {
"records": [{
- "is_fips_enabled": False,
- "supported_protocols": ['TLSv1.3', 'TLSv1.2', 'TLSv1.1'],
- "supported_cipher_suites": 'TLS_RSA_WITH_AES_128_CCM_8'
+ "fips": {"enabled": False},
+ "tls": {
+ "protocol_versions": ['TLSv1.3', 'TLSv1.2', 'TLSv1.1'],
+ "cipher_suites": ['TLS_RSA_WITH_AES_128_CCM_8']
+ }
}], "num_records": 1
}, None),
"no_record": (
@@ -186,11 +188,12 @@ def test_rest_modify_security_config():
('GET', 'cluster', SRR['is_rest_9_10_1']),
('GET', '/security', SRR['security_config_record']),
('PATCH', '/security', SRR['success']),
+ ('GET', '/security', SRR['security_config_record']),
])
module_args = {
"is_fips_enabled": False,
"supported_protocols": ['TLSv1.3', 'TLSv1.2', 'TLSv1.1'],
- "supported_cipher_suites": 'TLS_RSA_WITH_AES_128_CCM'
+ "supported_cipher_suites": ['TLS_RSA_WITH_AES_128_CCM']
}
assert call_main(my_main, ARGS_REST, module_args)['changed']
@@ -245,10 +248,11 @@ def test_rest_modify_security_config_fips():
('GET', 'cluster', SRR['is_rest_9_10_1']),
('GET', '/security', SRR['security_config_record']),
('PATCH', '/security', SRR['success']),
+ ('GET', '/security', SRR['security_config_record']),
])
module_args = {
"is_fips_enabled": True,
"supported_protocols": ['TLSv1.3', 'TLSv1.2'],
- "supported_cipher_suites": 'TLS_RSA_WITH_AES_128_CCM'
+ "supported_cipher_suites": ['TLS_RSA_WITH_AES_128_CCM']
}
assert call_main(my_main, ARGS_REST, module_args)['changed']
diff --git a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vserver_audit.py b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vserver_audit.py
index 9a4ec6f91..d12d075ff 100644
--- a/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vserver_audit.py
+++ b/ansible_collections/netapp/ontap/tests/unit/plugins/modules/test_na_ontap_vserver_audit.py
@@ -90,7 +90,59 @@ SRR = rest_responses({
"no_record": (
200,
{"num_records": 0},
- None)
+ None),
+ 'audit_record_time_based_rotation': (
+ 200,
+ {
+ "records": [
+ {
+ "svm": {
+ "uuid": "671aa46e-11ad-11ec-a267-005056b30cfa",
+ "name": "vserver"
+ },
+ "enabled": True,
+ "events": {
+ "authorization_policy": True,
+ "cap_staging": True,
+ "cifs_logon_logoff": False,
+ "file_operations": False,
+ "file_share": True,
+ "security_group": True,
+ "user_account": True
+ },
+ "log_path": "/",
+ "log": {
+ "format": "xml",
+ "rotation": {
+ "schedule": {
+ "hours": [
+ 6,
+ 12,
+ 18
+ ],
+ "minutes": [
+ 15,
+ 30,
+ 45
+ ],
+ "months": [
+ 1,
+ 3
+ ],
+ "weekdays": [
+ 0,
+ 2,
+ 4
+ ]
+ }
+ }
+ },
+ "guarantee": False
+ }
+ ],
+ "num_records": 1
+ }, None
+ ),
})
ARGS_REST = {
@@ -189,7 +241,8 @@ def test_create_audit_config_rest():
assert msg in error
-def test_modify_audit_config_rest():
+def test_modify_audit_config_sizebased_rotation_rest():
+ ''' Rotates logs based on log size '''
register_responses([
('GET', 'cluster', SRR['is_rest_9_10_1']),
('GET', 'protocols/audit', SRR['audit_record']),
@@ -217,6 +270,40 @@ def test_modify_audit_config_rest():
assert call_main(my_main, ARGS_REST, module_args)['changed']
+def test_modify_audit_config_timebased_rotation_rest():
+ ''' Rotates the audit logs based on a schedule '''
+ register_responses([
+ ('GET', 'cluster', SRR['is_rest_9_10_1']),
+ ('GET', 'protocols/audit', SRR['audit_record_time_based_rotation']),
+ ('PATCH', 'protocols/audit/671aa46e-11ad-11ec-a267-005056b30cfa', SRR['empty_good']),
+ ])
+ module_args = {
+ "enabled": True,
+ "events": {
+ "authorization_policy": True,
+ "cap_staging": True,
+ "cifs_logon_logoff": False,
+ "file_operations": False,
+ "file_share": True,
+ "security_group": True,
+ "user_account": True
+ },
+ "log_path": "/tmp",
+ "log": {
+ "format": "xml",
+ "rotation": {
+ "schedule": {
+ "hours": [12],
+ "minutes": [30],
+ "months": [-1],
+ "weekdays": [-1]
+ }
+ }
+ },
+ }
+ assert call_main(my_main, ARGS_REST, module_args)['changed']
+
+
def test_enable_audit_config_rest():
register_responses([
('GET', 'cluster', SRR['is_rest_9_10_1']),
diff --git a/ansible_collections/purestorage/flashblade/CHANGELOG.rst b/ansible_collections/purestorage/flashblade/CHANGELOG.rst
index 13b845abd..a673257d2 100644
--- a/ansible_collections/purestorage/flashblade/CHANGELOG.rst
+++ b/ansible_collections/purestorage/flashblade/CHANGELOG.rst
@@ -5,6 +5,18 @@ Purestorage.Flashblade Release Notes
.. contents:: Topics
+v1.17.0
+=======
+
+Minor Changes
+-------------
+
+- purefb_bucket - Add support for strict 17a-4 WORM compliance.
+- purefb_connect - Increase Fan-In and Fan-Out maximums
+- purefb_fs - Add ``group_ownership`` parameter from Purity//FB 4.4.0.
+- purefb_info - Show array network access policy from Purity//FB 4.4.0
+- purefb_policy - Add support for network access policies from Purity//FB 4.4.0
+
v1.16.0
=======
@@ -225,7 +237,6 @@ v1.6.0
Minor Changes
-------------
-- purefb_virtualhost - New module to manage API Clients
- purefb_ad - New module to manage Active Directory Account
- purefb_eula - New module to sign EULA
- purefb_info - Add Active Directory, Kerberos and Object Store Account information
@@ -234,6 +245,7 @@ Minor Changes
- purefb_s3user - Add access policy option to user creation
- purefb_timeout - Add module to set GUI idle timeout
- purefb_userpolicy - New module to manage object store user access policies
+- purefb_virtualhost - New module to manage API Clients
- purefb_virtualhost - New module to manage Object Store Virtual Hosts
New Modules
@@ -292,12 +304,12 @@ Minor Changes
Bugfixes
--------
-- purefb_policy - Resolve multiple issues related to incorrect use of timezones
- purefb_connect - Ensure changing encryption status on array connection is performed correctly
- purefb_connect - Fix breaking change created in purity_fb SDK 1.9.2 for deletion of array connections
- purefb_connect - Hide target array API token
- purefb_ds - Ensure updating directory service configurations completes correctly
- purefb_info - Fix issue getting array info when encrypted connection exists
+- purefb_policy - Resolve multiple issues related to incorrect use of timezones
New Modules
-----------
diff --git a/ansible_collections/purestorage/flashblade/FILES.json b/ansible_collections/purestorage/flashblade/FILES.json
index d7b39dbda..8f3e38a96 100644
--- a/ansible_collections/purestorage/flashblade/FILES.json
+++ b/ansible_collections/purestorage/flashblade/FILES.json
@@ -519,6 +519,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/274_fan_in.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "1c0e28b50aa1fe8a6325de6ea6dd486019ec307ccb8fa84ef543b8b2f00baef6",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/81_purefb_fs_new_options.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -610,6 +617,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/273_add_nap.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "498d161b9e61c95f2fcf64618d3304c5a46b8e16828306cf2ae585e504b01dc6",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/191_add_quota_info.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -666,6 +680,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/271_add_worm.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "e4a187b7e2f9bc1b81cf60415317dd8f966b214d113f476f2bc18900de54c6a9",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/101_fix_policy_and_timezone_error.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -715,6 +736,13 @@
"format": 1
},
{
+ "name": "changelogs/fragments/270_add_go.yaml",
+ "ftype": "file",
+ "chksum_type": "sha256",
+ "chksum_sha256": "81731ce510a6e2cd5947f609ba78ea396e19bbf3e44f36f49ae5c8991f0ca425",
+ "format": 1
+ },
+ {
"name": "changelogs/fragments/113_policy_cleanup.yaml",
"ftype": "file",
"chksum_type": "sha256",
@@ -725,14 +753,14 @@
"name": "changelogs/changelog.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "58ab80ddfd28321e4c9f245810097a8efbcd09898e013b3a83e650d2dd8440ed",
+ "chksum_sha256": "b2c3c0bab9ffe396ec0afe29c985db329e969ec0389ebc5c41e601f93f597e72",
"format": 1
},
{
"name": "changelogs/.plugin-cache.yaml",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "74f8ee5c9b2c27b9b655d822e47443fc68975023c10a6e58c08dc4b925c61bb3",
+ "chksum_sha256": "ef9e016e5b4618c4d5057f035eaf5d7be9c626f2c4265bd3f34430e1561ad6da",
"format": 1
},
{
@@ -928,7 +956,7 @@
"name": "plugins/modules/purefb_policy.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "9c6abe4b8cf5db61cd7a27db057f8d2f28cf0d2ec2bf9b398cf3f9eba68bb0e1",
+ "chksum_sha256": "94b94ab9aa31fac3e8e42024a9605dbab36d7b4b86f6030f0bcf6f00d5283f43",
"format": 1
},
{
@@ -984,7 +1012,7 @@
"name": "plugins/modules/purefb_connect.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "820c57b48e107ef852e6b2665c65ef76d67ffcde916cb21a368dcdae8e1e23e4",
+ "chksum_sha256": "eedb065fa37a7cffe50c2c7cc1ef9717f4ce3aa76ec4334cfb6ee420e44e0260",
"format": 1
},
{
@@ -1117,7 +1145,7 @@
"name": "plugins/modules/purefb_fs.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "2438642ad2a6ce605587eb84e0573010449ce0710d601cbf337dfa4690d7b736",
+ "chksum_sha256": "22af8016c0b29191ade09778e7d6279287ac866130b3fc212f85909f4a8bc099",
"format": 1
},
{
@@ -1166,7 +1194,7 @@
"name": "plugins/modules/purefb_info.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "b6dc24aac2c4733f7f37f0901a70fc3a9679cb06994d1407ba85f92bcc110d53",
+ "chksum_sha256": "70d3b538db7be7ea4b8faa6762d7e978120c112a5c4d81954425ae807ea6f91c",
"format": 1
},
{
@@ -1187,7 +1215,7 @@
"name": "plugins/modules/purefb_bucket.py",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "11e6a2e0aa40ab4f7e50a4c2be3dfd17363e094b8ac126b5ad042c4d65c16055",
+ "chksum_sha256": "507922eadc0bc73ec2a2e0c2e7cdda348203f4bb6b09f1120370c775a64f2bf8",
"format": 1
},
{
@@ -1383,7 +1411,7 @@
"name": "CHANGELOG.rst",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "de7d63a6d1d411e66f64971129b4630faaca228eb0a8348f261034aab83faa04",
+ "chksum_sha256": "cc4723553b99c762a97c9f06c61cae678c1c5cce90ffc7cc43202e23bf4885ed",
"format": 1
}
],
diff --git a/ansible_collections/purestorage/flashblade/MANIFEST.json b/ansible_collections/purestorage/flashblade/MANIFEST.json
index 2af712175..cb9fde10c 100644
--- a/ansible_collections/purestorage/flashblade/MANIFEST.json
+++ b/ansible_collections/purestorage/flashblade/MANIFEST.json
@@ -2,7 +2,7 @@
"collection_info": {
"namespace": "purestorage",
"name": "flashblade",
- "version": "1.16.0",
+ "version": "1.17.0",
"authors": [
"Pure Storage Ansible Team <pure-ansible-team@purestorage.com>"
],
@@ -30,7 +30,7 @@
"name": "FILES.json",
"ftype": "file",
"chksum_type": "sha256",
- "chksum_sha256": "14b510daea00c6bbcbf0a5bcfff2c45937740e569c86fedeb64970968dc4eecc",
+ "chksum_sha256": "985b106cb8f390a1084cc8fd39b7d5ff1d5ec674b068edc67fd1e9108b41e6cc",
"format": 1
},
"format": 1
diff --git a/ansible_collections/purestorage/flashblade/changelogs/.plugin-cache.yaml b/ansible_collections/purestorage/flashblade/changelogs/.plugin-cache.yaml
index c99d4477d..bcb6c205c 100644
--- a/ansible_collections/purestorage/flashblade/changelogs/.plugin-cache.yaml
+++ b/ansible_collections/purestorage/flashblade/changelogs/.plugin-cache.yaml
@@ -256,4 +256,4 @@ plugins:
strategy: {}
test: {}
vars: {}
-version: 1.16.0
+version: 1.17.0
diff --git a/ansible_collections/purestorage/flashblade/changelogs/changelog.yaml b/ansible_collections/purestorage/flashblade/changelogs/changelog.yaml
index eaeb07ed3..71acf6b6a 100644
--- a/ansible_collections/purestorage/flashblade/changelogs/changelog.yaml
+++ b/ansible_collections/purestorage/flashblade/changelogs/changelog.yaml
@@ -168,6 +168,20 @@ releases:
- 266_bucket_fix.yaml
- 268_multi-chassis-lag.yaml
release_date: '2024-02-27'
+ 1.17.0:
+ changes:
+ minor_changes:
+ - purefb_bucket - Add support for strict 17a-4 WORM compliance.
+ - purefb_connect - Increase Fan-In and Fan-Out maximums
+ - purefb_fs - Add ``group_ownership`` parameter from Purity//FB 4.4.0.
+ - purefb_info - Show array network access policy from Purity//FB 4.4.0
+ - purefb_policy - Add support for network access policies from Purity//FB 4.4.0
+ fragments:
+ - 270_add_go.yaml
+ - 271_add_worm.yaml
+ - 273_add_nap.yaml
+ - 274_fan_in.yaml
+ release_date: '2024-04-01'
1.3.0:
changes:
bugfixes:
@@ -210,7 +224,6 @@ releases:
1.4.0:
changes:
bugfixes:
- - purefb_policy - Resolve multiple issues related to incorrect use of timezones
- purefb_connect - Ensure changing encryption status on array connection is
performed correctly
- purefb_connect - Fix breaking change created in purity_fb SDK 1.9.2 for deletion
@@ -218,6 +231,7 @@ releases:
- purefb_connect - Hide target array API token
- purefb_ds - Ensure updating directory service configurations completes correctly
- purefb_info - Fix issue getting array info when encrypted connection exists
+ - purefb_policy - Resolve multiple issues related to incorrect use of timezones
minor_changes:
- purefb_banner - Module to manage the GUI and SSH login message
- purefb_certgrp - Module to manage FlashBlade Certificate Groups
@@ -300,7 +314,6 @@ releases:
1.6.0:
changes:
minor_changes:
- - purefb_virtualhost - New module to manage API Clients
- purefb_ad - New module to manage Active Directory Account
- purefb_eula - New module to sign EULA
- purefb_info - Add Active Directory, Kerberos and Object Store Account information
@@ -309,6 +322,7 @@ releases:
- purefb_s3user - Add access policy option to user creation
- purefb_timeout - Add module to set GUI idle timeout
- purefb_userpolicy - New module to manage object store user access policies
+ - purefb_virtualhost - New module to manage API Clients
- purefb_virtualhost - New module to manage Object Store Virtual Hosts
fragments:
- 127_add_eula.yaml
diff --git a/ansible_collections/purestorage/flashblade/changelogs/fragments/270_add_go.yaml b/ansible_collections/purestorage/flashblade/changelogs/fragments/270_add_go.yaml
new file mode 100644
index 000000000..d875db5ab
--- /dev/null
+++ b/ansible_collections/purestorage/flashblade/changelogs/fragments/270_add_go.yaml
@@ -0,0 +1,2 @@
+minor_changes:
+ - purefb_fs - Add ``group_ownership`` parameter from Purity//FB 4.4.0.
diff --git a/ansible_collections/purestorage/flashblade/changelogs/fragments/271_add_worm.yaml b/ansible_collections/purestorage/flashblade/changelogs/fragments/271_add_worm.yaml
new file mode 100644
index 000000000..379975be3
--- /dev/null
+++ b/ansible_collections/purestorage/flashblade/changelogs/fragments/271_add_worm.yaml
@@ -0,0 +1,2 @@
+minor_changes:
+ - purefb_bucket - Add support for strict 17a-4 WORM compliance.
diff --git a/ansible_collections/purestorage/flashblade/changelogs/fragments/273_add_nap.yaml b/ansible_collections/purestorage/flashblade/changelogs/fragments/273_add_nap.yaml
new file mode 100644
index 000000000..998de322e
--- /dev/null
+++ b/ansible_collections/purestorage/flashblade/changelogs/fragments/273_add_nap.yaml
@@ -0,0 +1,3 @@
+minor_changes:
+ - purefb_info - Show array network access policy from Purity//FB 4.4.0
+ - purefb_policy - Add support for network access policies from Purity//FB 4.4.0
diff --git a/ansible_collections/purestorage/flashblade/changelogs/fragments/274_fan_in.yaml b/ansible_collections/purestorage/flashblade/changelogs/fragments/274_fan_in.yaml
new file mode 100644
index 000000000..719fca54b
--- /dev/null
+++ b/ansible_collections/purestorage/flashblade/changelogs/fragments/274_fan_in.yaml
@@ -0,0 +1,2 @@
+minor_changes:
+ - purefb_connect - Increase Fan-In and Fan-Out maximums
diff --git a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_bucket.py b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_bucket.py
index 27cd7e317..11c8be479 100644
--- a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_bucket.py
+++ b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_bucket.py
@@ -118,13 +118,32 @@ options:
description:
- If set to true, adding bucket policies that grant public access to a bucket is not allowed.
type: bool
- version_added: 1.15.0
+ version_added: '1.15.0'
block_public_access:
description:
- If set to true, access to a bucket with a public policy is restricted to only authenticated
users within the account that bucket belongs to.
type: bool
- version_added: 1.15.0
+ version_added: '1.15.0'
+ eradication_mode:
+ description:
+ - The eradication mode of the bucket.
+ type: str
+ choices: [ "permission-based", "retention-based" ]
+ version_added: '1.17.0'
+ manual_eradication:
+ description:
+ - The manual eradication status of the bucket. If false, the bucket cannot be eradicated after
+ it has been destroyed, unless it is empty. If true, the bucket can be eradicated.
+ type: bool
+ version_added: '1.17.0'
+ eradication_delay:
+ description:
+ - Minimum eradication delay in days. Automatically eradicate destroyed buckets after
+ the delay time passes unless automatic eradication is delayed due to other configuration values.
+ - Valid values are integer days from 1 to 30. Default is 1.
+ type: int
+ version_added: '1.17.0'
extends_documentation_fragment:
- purestorage.flashblade.purestorage.fb
"""
@@ -194,11 +213,13 @@ from ansible_collections.purestorage.flashblade.plugins.module_utils.purefb impo
)
+SEC_PER_DAY = 86400000
MIN_REQUIRED_API_VERSION = "1.5"
VERSIONING_VERSION = "1.9"
VSO_VERSION = "2.5"
QUOTA_VERSION = "2.8"
MODE_VERSION = "2.12"
+WORM_VERSION = "2.13"
def get_s3acc(module, blade):
@@ -354,6 +375,30 @@ def create_bucket(module, blade):
msg="Failed to set Public Access config correctly for bucket {0}. "
"Error: {1}".format(module.params["name"], res.errors[0].message)
)
+ if WORM_VERSION in api_version and module.params["eradication_mode"]:
+ if not module.params["eradication_delay"]:
+ module.params["eradication_delay"] = SEC_PER_DAY
+ else:
+ module.params["eradication_delay"] = (
+ module.params["eradication_delay"] * SEC_PER_DAY
+ )
+ if not module.params["manual_eradication"]:
+ module.params["manual_eradication"] = "disabled"
+ else:
+ module.params["manual_eradication"] = "enabled"
+ worm = BucketPatch(
+ eradication_config=flashblade.BucketEradicationConfig(
+ manual_eradication=module.params["manual_eradication"],
+ eradication_mode=module.params["eradication_mode"],
+ eradication_delay=module.params["eradication_delay"],
+ )
+ )
+ res = bladev2.patch_buckets(bucket=worm, names=[module.params["name"]])
+ if res.status_code != 200:
+ module.warn(
+ msg="Failed to set Bucket Eradication config correctly for bucket {0}. "
+ "Error: {1}".format(module.params["name"], res.errors[0].message)
+ )
module.exit_json(changed=changed)
@@ -416,6 +461,7 @@ def update_bucket(module, blade, bucket):
"""Update Bucket"""
changed = False
change_pac = False
+ change_worm = False
bladev2 = get_system(module)
bucket_detail = list(bladev2.get_buckets(names=[module.params["name"]]).items)[0]
api_version = blade.api_version.list_versions().versions
@@ -520,7 +566,52 @@ def update_bucket(module, blade, bucket):
msg="Failed to update Public Access config correctly for bucket {0}. "
"Error: {1}".format(module.params["name"], res.errors[0].message)
)
- module.exit_json(changed=(changed or change_pac))
+ if WORM_VERSION in api_version:
+ current_worm = {
+ "eradication_delay": bucket_detail.eradication_config.eradication_delay,
+ "manual_eradication": bucket_detail.eradication_config.manual_eradication,
+ "eradication_mode": bucket_detail.eradication_config.eradication_mode,
+ }
+ if module.params["eradication_delay"] is None:
+ new_delay = current_worm["eradication_delay"]
+ else:
+ new_delay = module.params["eradication_delay"] * SEC_PER_DAY
+ if module.params["manual_eradication"] is None:
+ new_manual = current_worm["manual_eradication"]
+ else:
+ if module.params["manual_eradication"]:
+ new_manual = "enabled"
+ else:
+ new_manual = "disabled"
+ if (
+ module.params["eradication_mode"]
+ and module.params["eradication_mode"] != current_worm["eradication_mode"]
+ ):
+ new_mode = module.params["eradication_mode"]
+ else:
+ new_mode = current_worm["eradication_mode"]
+ new_worm = {
+ "eradication_delay": new_delay,
+ "manual_eradication": new_manual,
+ "eradication_mode": new_mode,
+ }
+ if current_worm != new_worm:
+ change_worm = True
+ worm = BucketPatch(
+ public_access_config=flashblade.BucketEradicationConfig(
+ eradication_delay=new_worm.eradication_delay,
+ manual_eradication=new_worm.manual_eradication,
+ eradication_mode=new_worm.eradication_mode,
+ )
+ )
+ if change_worm and not module.check_mode:
+ res = bladev2.patch_buckets(bucket=worm, names=[module.params["name"]])
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to update Eradication config correctly for bucket {0}. "
+ "Error: {1}".format(module.params["name"], res.errors[0].message)
+ )
+ module.exit_json(changed=(changed or change_pac or change_worm))
def eradicate_bucket(module, blade):
@@ -564,6 +655,11 @@ def main():
default="absent", choices=["enabled", "suspended", "absent"]
),
state=dict(default="present", choices=["present", "absent"]),
+ eradication_delay=dict(type="int"),
+ eradication_mode=dict(
+ type="str", choices=["permission-based", "retention-based"]
+ ),
+ manual_eradication=dict(type="bool"),
)
)
@@ -575,6 +671,12 @@ def main():
if not HAS_PYPURECLIENT:
module.fail_json(msg="py-pure-client sdk is required to support VSO mode")
+ if (
+ module.params["eradication_delay"]
+ and not 30 >= module.params["eradication_delay"] >= 1
+ ):
+ module.fail_json(msg="Eradication Delay must be between 1 and 30 days.")
+
state = module.params["state"]
blade = get_blade(module)
api_version = blade.api_version.list_versions().versions
diff --git a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_connect.py b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_connect.py
index 846351453..23e54845c 100644
--- a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_connect.py
+++ b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_connect.py
@@ -138,8 +138,8 @@ from ansible_collections.purestorage.flashblade.plugins.module_utils.purefb impo
)
-FAN_IN_MAXIMUM = 1
-FAN_OUT_MAXIMUM = 3
+FAN_IN_MAXIMUM = 5
+FAN_OUT_MAXIMUM = 5
MIN_REQUIRED_API_VERSION = "1.9"
THROTTLE_API_VERSION = "2.3"
@@ -215,7 +215,7 @@ def create_connection(module, blade):
remote_conn_cnt = (
remote_system.array_connections.list_array_connections().pagination_info.total_item_count
)
- if remote_conn_cnt == FAN_IN_MAXIMUM:
+ if remote_conn_cnt >= FAN_IN_MAXIMUM:
module.fail_json(
msg="Remote array {0} already connected to {1} other array. Fan-In not supported".format(
remote_array, remote_conn_cnt
@@ -244,7 +244,7 @@ def create_connection(module, blade):
def create_v2_connection(module, blade):
"""Create connection between REST 2 capable arrays"""
changed = True
- if blade.get_array_connections().total_item_count == FAN_OUT_MAXIMUM:
+ if blade.get_array_connections().total_item_count >= FAN_OUT_MAXIMUM:
module.fail_json(
msg="FlashBlade fan-out maximum of {0} already reached".format(
FAN_OUT_MAXIMUM
@@ -262,7 +262,7 @@ def create_v2_connection(module, blade):
)
remote_array = list(remote_system.get_arrays().items)[0].name
remote_conn_cnt = remote_system.get_array_connections().total_item_count
- if remote_conn_cnt == FAN_IN_MAXIMUM:
+ if remote_conn_cnt >= FAN_IN_MAXIMUM:
module.fail_json(
msg="Remote array {0} already connected to {1} other array. Fan-In not supported".format(
remote_array, remote_conn_cnt
diff --git a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_fs.py b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_fs.py
index 8d332e8b7..81c12d4b7 100644
--- a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_fs.py
+++ b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_fs.py
@@ -195,11 +195,17 @@ options:
version_added: "1.12.0"
continuous_availability:
description:
- - Deifines if the file system will be continuously available during
+ - Defines if the file system will be continuously available during
disruptive scenarios such as network disruption, blades failover, etc
type: bool
default: true
version_added: "1.15.0"
+ group_ownership:
+ description:
+ - The group ownership for new files and directories in a file system
+ type: str
+ choices: [ 'creator', 'parent-directory' ]
+ version_added: "1.17.0"
extends_documentation_fragment:
- purestorage.flashblade.purestorage.fb
"""
@@ -314,6 +320,7 @@ MULTIPROTOCOL_API_VERSION = "1.11"
EXPORT_POLICY_API_VERSION = "2.3"
SMB_POLICY_API_VERSION = "2.10"
CA_API_VERSION = "2.12"
+GOWNER_API_VERSION = "2.13"
def get_fs(module, blade):
@@ -567,6 +574,21 @@ def create_fs(module, blade):
res.errors[0].message,
)
)
+ if GOWNER_API_VERSION in api_version and module.params["group_ownership"]:
+ go_attr = FileSystemPatch(
+ group_ownership=module.params["group_ownership"]
+ )
+ res = system.patch_file_systems(
+ names=[module.params["name"]], file_system=go_attr
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Filesystem {0} created, but failed to set group ownership"
+ "Error: {1}".format(
+ module.params["name"],
+ res.errors[0].message,
+ )
+ )
module.exit_json(changed=changed)
@@ -911,8 +933,29 @@ def modify_fs(module, blade):
res.errors[0].message,
)
)
+ if GOWNER_API_VERSION in api_version:
+ change_go = False
+ if module.params["group_ownership"] != current_fs.group_ownership:
+ change_go = True
+ if not module.check_mode:
+ go_attr = FileSystemPatch(
+ group_ownership=module.params["group_ownership"]
+ )
+ res = system.patch_file_systems(
+ names=[module.params["name"]], file_system=go_attr
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to modify group ownership for "
+ "filesystem {0}. Error: {1}".format(
+ module.params["name"],
+ res.errors[0].message,
+ )
+ )
- module.exit_json(changed=(changed or change_export or change_share or change_ca))
+ module.exit_json(
+ changed=(changed or change_export or change_share or change_ca or change_go)
+ )
def _delete_fs(module, blade):
@@ -1057,6 +1100,7 @@ def main():
smb_aclmode=dict(
type="str", default="shared", choices=["shared", "native"]
),
+ group_ownership=dict(choices=["creator", "parent-directory"]),
policy_state=dict(default="present", choices=["present", "absent"]),
state=dict(default="present", choices=["present", "absent"]),
delete_link=dict(default=False, type="bool"),
diff --git a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_info.py b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_info.py
index 033312e82..418dacd5d 100644
--- a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_info.py
+++ b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_info.py
@@ -111,6 +111,7 @@ BUCKET_API_VERSION = "2.8"
SMB_CLIENT_API_VERSION = "2.10"
SPACE_API_VERSION = "2.11"
PUBLIC_API_VERSION = "2.12"
+NAP_API_VERSION = "2.13"
def _millisecs_to_time(millisecs):
@@ -218,6 +219,10 @@ def generate_default_dict(module, blade):
default_info["security_update"] = getattr(
blade_info, "security_update", None
)
+ if NAP_API_VERSION in api_version:
+ default_info["network_access_protocol"] = getattr(
+ blade_info.network_access_policy, "name", "None"
+ )
return default_info
diff --git a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_policy.py b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_policy.py
index ebe70aa48..36ffee997 100644
--- a/ansible_collections/purestorage/flashblade/plugins/modules/purefb_policy.py
+++ b/ansible_collections/purestorage/flashblade/plugins/modules/purefb_policy.py
@@ -52,7 +52,7 @@ options:
- Type of policy
default: snapshot
type: str
- choices: [ snapshot, access, nfs, smb_share, smb_client ]
+ choices: [ snapshot, access, nfs, smb_share, smb_client, network ]
version_added: "1.9.0"
account:
description:
@@ -344,6 +344,14 @@ options:
type: str
default: ""
version_added: '1.14.0'
+ interfaces:
+ description:
+ - Specifies which product interfaces the network access policy rule
+ applies to, whether it is permitting or denying access.
+ type: list
+ elements: str
+ choices: [ "management-ssh", "management-rest-api", "management-web-ui", "snmp", "local-network-superuser-password-access" ]
+ version_added: '1.17.0'
extends_documentation_fragment:
- purestorage.flashblade.purestorage.fb
"""
@@ -546,6 +554,8 @@ try:
SmbClientPolicyRule,
SmbClientPolicy,
ObjectStoreAccessPolicyPost,
+ NetworkAccessPolicy,
+ NetworkAccessPolicyRule,
)
except ImportError:
HAS_PYPURECLIENT = False
@@ -577,6 +587,7 @@ NFS_POLICY_API_VERSION = "2.3"
NFS_RENAME_API_VERSION = "2.4"
SMB_POLICY_API_VERSION = "2.10"
SMB_ENCRYPT_API_VERSION = "2.11"
+NET_POLICY_API_VERSION = "2.13"
def _convert_to_millisecs(hour):
@@ -1065,6 +1076,51 @@ def create_smb_client_policy(module, blade):
module.exit_json(changed=changed)
+def create_network_access_policy(module, blade):
+ """Create Network Access Policy"""
+ changed = True
+ versions = blade.api_version.list_versions().versions
+ if not module.check_mode:
+ res = blade.post_network_access_policies(names=[module.params["name"]])
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to create network access policy {0}.Error: {1}".format(
+ module.params["name"], res.errors[0].message
+ )
+ )
+ if not module.params["enabled"]:
+ res = blade.patch_network_access_policies(
+ policy=SmbClientPolicy(enabled=False), names=[module.params["name"]]
+ )
+ if res.status_code != 200:
+ blade.delete_network_access_policies(names=[module.params["name"]])
+ module.fail_json(
+ msg="Failed to create network access policy {0}.Error: {1}".format(
+ module.params["name"], res.errors[0].message
+ )
+ )
+ if not module.params["client"]:
+ module.fail_json(msg="client is required to create a new rule")
+ else:
+ rule = NetworkAccessPolicyRule(
+ client=module.params["client"],
+ effect=module.params["effect"],
+ interfaces=module.params["interfaces"],
+ )
+ res = blade.post_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ rule=rule,
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to rule for policy {0}. Error: {1}".format(
+ module.params["name"],
+ res.errors[0].message,
+ )
+ )
+ module.exit_json(changed=changed)
+
+
def update_smb_client_policy(module, blade):
"""Update SMB Client Policy Rule"""
@@ -1341,6 +1397,268 @@ def delete_nfs_policy(module, blade):
module.exit_json(changed=changed)
+def update_network_access_policy(module, blade):
+ """Update Networkk Access Policy Rule"""
+
+ changed = False
+ if module.params["client"]:
+ current_policy_rule = blade.get_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ filter="client='" + module.params["client"] + "'",
+ )
+ if (
+ current_policy_rule.status_code == 200
+ and current_policy_rule.total_item_count == 0
+ ):
+ rule = NetworkAccessPolicyRule(
+ client=module.params["client"],
+ effect=module.params["effect"],
+ interfaces=module.params["interfaces"],
+ )
+ changed = True
+ if not module.check_mode:
+ if module.params["before_rule"]:
+ before_name = (
+ module.params["name"] + "." + str(module.params["before_rule"])
+ )
+ res = blade.post_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ rule=rule,
+ before_rule_name=before_name,
+ )
+ else:
+ res = blade.post_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ rule=rule,
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to create rule for client {0} "
+ "in policy {1}. Error: {2}".format(
+ module.params["client"],
+ module.params["name"],
+ res.errors[0].message,
+ )
+ )
+ else:
+ rules = list(current_policy_rule.items)
+ cli_count = None
+ done = False
+ if module.params["client"] == "*":
+ for cli in range(0, len(rules)):
+ if rules[cli].client == "*":
+ cli_count = cli
+ if not cli_count:
+ rule = NetworkAccessPolicyRule(
+ client=module.params["client"],
+ effect=module.params["effect"],
+ interfaces=module.params["interfaces"],
+ )
+ done = True
+ changed = True
+ if not module.check_mode:
+ if module.params["before_rule"]:
+ res = blade.post_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ rule=rule,
+ before_rule_name=(
+ module.params["name"]
+ + "."
+ + str(module.params["before_rule"]),
+ ),
+ )
+ else:
+ res = blade.post_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ rule=rule,
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to create rule for "
+ "client {0} in policy {1}. Error: {2}".format(
+ module.params["client"],
+ module.params["name"],
+ res.errors[0].message,
+ )
+ )
+ if not done:
+ old_policy_rule = rules[0]
+ current_rule = {
+ "client": sorted(old_policy_rule.client),
+ "effect": old_policy_rule.effect,
+ "interfaces": old_policy_rule.interfaces,
+ }
+ if module.params["interfaces"]:
+ new_interfaces = module.params["interfaces"]
+ else:
+ new_interfaces = current_rule["interfaces"]
+ if module.params["effect"]:
+ new_effect = module.params["effect"]
+ else:
+ new_effect = current_rule["effect"]
+ if module.params["client"]:
+ new_client = sorted(module.params["client"])
+ else:
+ new_client = sorted(current_rule["client"])
+ new_rule = {
+ "client": new_client,
+ "effect": new_effect,
+ "interfaces": new_interfaces,
+ }
+ if current_rule != new_rule:
+ changed = True
+ if not module.check_mode:
+ rule = NetworkAccessPolicyRule(
+ client=module.params["client"],
+ effect=module.params["effect"],
+ interfaces=module.params["interfaces"],
+ )
+ res = blade.patch_network_access_policies_rules(
+ names=[
+ module.params["name"] + "." + str(old_policy_rule.index)
+ ],
+ rule=rule,
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to update network access client rule {0}. Error: {1}".format(
+ module.params["name"]
+ + "."
+ + str(old_policy_rule.index),
+ res.errors[0].message,
+ )
+ )
+ if (
+ module.params["before_rule"]
+ and module.params["before_rule"] != old_policy_rule.index
+ ):
+ changed = True
+ if not module.check_mode:
+ before_name = (
+ module.params["name"]
+ + "."
+ + str(module.params["before_rule"])
+ )
+ res = blade.patch_network_access_policies_rules(
+ names=[
+ module.params["name"] + "." + str(old_policy_rule.index)
+ ],
+ rule=NetworkAccessPolicyRule(),
+ before_rule_name=before_name,
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to move network access client rule {0}. Error: {1}".format(
+ module.params["name"]
+ + "."
+ + str(old_policy_rule.index),
+ res.errors[0].message,
+ )
+ )
+ current_policy = list(
+ blade.get_network_access_policies(names=[module.params["name"]]).items
+ )[0]
+ if current_policy.enabled != module.params["enabled"]:
+ changed = True
+ if not module.check_mode:
+ res = blade.patch_network_access_policies(
+ policy=NetworkAccessPolicy(enabled=module.params["enabled"]),
+ names=[module.params["name"]],
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to change state of network access policy {0}.Error: {1}".format(
+ module.params["name"], res.errors[0].message
+ )
+ )
+ module.exit_json(changed=changed)
+
+
+def delete_network_access_policy(module, blade):
+ """Delete Network Access Policy, or Rule
+
+ If client is provided then delete the client rule if it exists.
+ """
+
+ changed = False
+ policy_delete = True
+ if module.params["client"]:
+ policy_delete = False
+ res = blade.get_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ filter="client='" + module.params["client"] + "'",
+ )
+ if res.status_code == 200:
+ if res.total_item_count == 0:
+ pass
+ elif res.total_item_count == 1:
+ rule = list(res.items)[0]
+ if module.params["client"] == rule.client:
+ changed = True
+ if not module.check_mode:
+ res = blade.delete_network_access_policies_rules(
+ names=[rule.name]
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to delete rule for client {0} in policy {1}. "
+ "Error: {2}".format(
+ module.params["client"],
+ module.params["name"],
+ res.errors[0].message,
+ )
+ )
+ else:
+ rules = list(res.items)
+ for cli in range(0, len(rules)):
+ if rules[cli].client == "*":
+ changed = True
+ if not module.check_mode:
+ res = blade.delete_network_access_policies_rules(
+ names=[rules[cli].name]
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to delete rule for client {0} in policy {1}. "
+ "Error: {2}".format(
+ module.params["client"],
+ module.params["name"],
+ res.errors[0].message,
+ )
+ )
+ if policy_delete:
+ changed = True
+ if not module.check_mode:
+ res = blade.delete_network_Access_policies(names=[module.params["name"]])
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to delete network access policy {0}. Error: {1}".format(
+ module.params["name"], res.errors[0].message
+ )
+ )
+ module.exit_json(changed=changed)
+
+
+def rename_network_access_policy(module, blade):
+ """Rename Network Access Policy"""
+
+ changed = True
+ if not module.check_mode:
+ res = blade.patch_network_access_policies(
+ names=[module.params["name"]],
+ policy=NfsExportPolicy(name=module.params["rename"]),
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Failed to rename network access policy {0} to {1}. Error: {2}".format(
+ module.params["name"],
+ module.params["rename"],
+ res.errors[0].message,
+ )
+ )
+ module.exit_json(changed=changed)
+
+
def rename_nfs_policy(module, blade):
"""Rename NFS Export Policy"""
@@ -2544,7 +2862,14 @@ def main():
policy_type=dict(
type="str",
default="snapshot",
- choices=["snapshot", "access", "nfs", "smb_share", "smb_client"],
+ choices=[
+ "snapshot",
+ "access",
+ "nfs",
+ "smb_share",
+ "smb_client",
+ "network",
+ ],
),
enabled=dict(type="bool", default=True),
timezone=dict(type="str"),
@@ -2635,6 +2960,17 @@ def main():
choices=["disabled", "optional", "required"],
),
desc=dict(type="str", default=""),
+ interfaces=dict(
+ type="list",
+ elements="str",
+ choices=[
+ "management-ssh",
+ "management-rest-api",
+ "management-web-ui",
+ "snmp",
+ "local-network-superuser-password-access",
+ ],
+ ),
)
)
@@ -2644,6 +2980,7 @@ def main():
["policy_type", "nfs", ["name"]],
["policy_type", "smb_client", ["name"]],
["policy_type", "smb_share", ["name"]],
+ ["policy_type", "network", ["interfaces"]],
]
module = AnsibleModule(
@@ -2857,6 +3194,56 @@ def main():
create_smb_share_policy(module, blade)
elif state == "absent" and policy:
delete_smb_share_policy(module, blade)
+ elif module.params["policy_type"] == "network":
+ if NET_POLICY_API_VERSION not in versions:
+ module.fail_json(
+ msg=(
+ "Minimum FlashBlade REST version required: {0}".format(
+ NET_POLICY_API_VERSION
+ )
+ )
+ )
+ if not HAS_PYPURECLIENT:
+ module.fail_json(msg="py-pure-client sdk is required for this module")
+ blade = get_system(module)
+ try:
+ policy = list(
+ blade.get_network_access_policies(names=[module.params["name"]]).items
+ )[0]
+ except AttributeError:
+ policy = None
+ if module.params["rename"]:
+ try:
+ new_policy = list(
+ blade.get_network_access_policies(
+ names=[module.params["rename"]]
+ ).items
+ )[0]
+ except AttributeError:
+ new_policy = None
+ if policy and state == "present" and not module.params["rename"]:
+ if module.params["before_rule"]:
+ res = blade.get_network_access_policies_rules(
+ policy_names=[module.params["name"]],
+ names=[
+ module.params["name"] + "." + str(module.params["before_rule"])
+ ],
+ )
+ if res.status_code != 200:
+ module.fail_json(
+ msg="Rule index {0} does not exist.".format(
+ module.params["before_rule"]
+ )
+ )
+ update_network_access_policy(module, blade)
+ elif (
+ state == "present" and module.params["rename"] and policy and not new_policy
+ ):
+ rename_network_access_policy(module, blade)
+ elif state == "present" and not policy and not module.params["rename"]:
+ create_network_access_policy(module, blade)
+ elif state == "absent" and policy:
+ delete_network_access_policy(module, blade)
elif SNAPSHOT_POLICY_API_VERSION in versions:
if not HAS_PYPURECLIENT:
module.fail_json(msg="py-pure-client sdk is required for this module")
diff --git a/build-ansible.sh b/build-ansible.sh
index a4763c6d2..0106e3787 100755
--- a/build-ansible.sh
+++ b/build-ansible.sh
@@ -5,13 +5,13 @@
set -e
-VERSION="9.4.0"
+VERSION="9.5.1"
MAJOR="9"
# For idempotency, remove build data or built output first
rm -rf ansible-build-data built
-pip3 install --user --upgrade "antsibull==0.61.0"
+pip3 install --user --upgrade "antsibull==0.61.1"
git clone https://github.com/ansible-community/ansible-build-data.git
mkdir -p built collection-cache
BUILD_DATA_DIR="ansible-build-data/${MAJOR}"
diff --git a/porting_guide_9.rst b/porting_guide_9.rst
index 836c4629e..5cb141616 100644
--- a/porting_guide_9.rst
+++ b/porting_guide_9.rst
@@ -84,6 +84,43 @@ Porting custom scripts
Networking
==========
+Porting Guide for v9.5.1
+========================
+
+Major Changes
+-------------
+
+containers.podman
+~~~~~~~~~~~~~~~~~
+
+- Add quadlet support for Podman modules
+
+fortinet.fortios
+~~~~~~~~~~~~~~~~
+
+- Add notes for backup modules in the documentation in both monitor and monitor_fact modules.
+- Supported new FOS versions 7.4.2 and 7.4.3, and support data type mac_address in the collection.
+- Update the documentation for the supported versions from latest to a fix version number.
+- Update the required ansible version to 2.15.
+
+Deprecated Features
+-------------------
+
+community.crypto
+~~~~~~~~~~~~~~~~
+
+- acme.backends module utils - from community.crypto on, all implementations of ``CryptoBackend`` must override ``get_ordered_csr_identifiers()``. The current default implementation, which simply sorts the result of ``get_csr_identifiers()``, will then be removed (https://github.com/ansible-collections/community.crypto/pull/725).
+
+community.general
+~~~~~~~~~~~~~~~~~
+
+- hipchat callback plugin - the hipchat service has been discontinued and the self-hosted variant has been End of Life since 2020. The callback plugin is therefore deprecated and will be removed from community.general 10.0.0 if nobody provides compelling reasons to still keep it (https://github.com/ansible-collections/community.general/issues/8184, https://github.com/ansible-collections/community.general/pull/8189).
+
+community.vmware
+~~~~~~~~~~~~~~~~
+
+- vmware_guest_tools_info - `vm_tools_install_status` will be removed from next major version (5.0.0) of the collection since the API call that provides this information has been deprecated by VMware. Use `vm_tools_running_status` / `vm_tools_version_status` instead (https://github.com/ansible-collections/community.vmware/issues/2033).
+
Porting Guide for v9.4.0
========================
diff --git a/setup.cfg b/setup.cfg
index ba65a93f2..f115cb2fd 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -22,7 +22,7 @@ classifiers =
Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12
Programming Language :: Python :: 3 :: Only
-version = 9.4.0
+version = 9.5.1
project_urls =
Build Data = https://github.com/ansible-community/ansible-build-data
Code of Conduct = https://docs.ansible.com/ansible/latest/community/code_of_conduct.html
@@ -33,7 +33,7 @@ project_urls =
[options]
zip_safe = False
install_requires =
- ansible-core ~= 2.16.5
+ ansible-core ~= 2.16.6
python_requires = >=3.10
package_dir =
=.
@@ -908,6 +908,8 @@ ansible_collections.cisco.aci =
plugins/.*
plugins/doc_fragments/*
plugins/doc_fragments/.*
+ plugins/filter/*
+ plugins/filter/.*
plugins/httpapi/*
plugins/httpapi/.*
plugins/lookup/*
@@ -2178,6 +2180,8 @@ ansible_collections.community.general =
plugins/module_utils/storage/hpe3par/.*
plugins/modules/*
plugins/modules/.*
+ plugins/plugin_utils/*
+ plugins/plugin_utils/.*
plugins/test/*
plugins/test/.*
ansible_collections.community.grafana =
@@ -2260,6 +2264,8 @@ ansible_collections.community.hrobot =
plugins/module_utils/.*
plugins/modules/*
plugins/modules/.*
+ plugins/plugin_utils/*
+ plugins/plugin_utils/.*
ansible_collections.community.library_inventory_filtering_v1 =
*
LICENSES/*
diff --git a/tags.yaml b/tags.yaml
index f38b9a83b..1e7fe1850 100644
--- a/tags.yaml
+++ b/tags.yaml
@@ -3,8 +3,8 @@
# 'tag' field means that a collection's release wasn't tagged.
amazon.aws:
repository: https://github.com/ansible-collections/amazon.aws
- tag: 7.4.0
- version: 7.4.0
+ tag: 7.5.0
+ version: 7.5.0
ansible.netcommon:
repository: https://github.com/ansible-collections/ansible.netcommon
tag: v5.3.0
@@ -45,20 +45,20 @@ chocolatey.chocolatey:
version: 1.5.1
cisco.aci:
repository: https://github.com/CiscoDevNet/ansible-aci
- tag: v2.8.0
- version: 2.8.0
+ tag: v2.9.0
+ version: 2.9.0
cisco.asa:
repository: https://github.com/ansible-collections/cisco.asa
tag: 4.0.3
version: 4.0.3
cisco.dnac:
repository: https://github.com/cisco-en-programmability/dnacenter-ansible
- tag: v6.13.1
- version: 6.13.1
+ tag: v6.13.3
+ version: 6.13.3
cisco.intersight:
repository: https://github.com/CiscoDevNet/intersight-ansible
- tag: 2.0.7
- version: 2.0.7
+ tag: 2.0.8
+ version: 2.0.8
cisco.ios:
repository: https://github.com/ansible-collections/cisco.ios
tag: v5.3.0
@@ -69,16 +69,16 @@ cisco.iosxr:
version: 6.1.1
cisco.ise:
repository: https://github.com/CiscoISE/ansible-ise
- tag: v2.8.0
- version: 2.8.0
+ tag: v2.8.1
+ version: 2.8.1
cisco.meraki:
repository: https://github.com/meraki/dashboard-api-ansible
- tag: v2.17.2
- version: 2.17.2
+ tag: v2.18.0
+ version: 2.18.0
cisco.mso:
repository: https://github.com/CiscoDevNet/ansible-mso
- tag: v2.5.0
- version: 2.5.0
+ tag: v2.6.0
+ version: 2.6.0
cisco.nxos:
repository: https://github.com/ansible-collections/cisco.nxos
tag: v5.3.0
@@ -97,8 +97,8 @@ cloudscale_ch.cloud:
version: 2.3.1
community.aws:
repository: https://github.com/ansible-collections/community.aws
- tag: 7.1.0
- version: 7.1.0
+ tag: 7.2.0
+ version: 7.2.0
community.azure:
repository: https://github.com/ansible-collections/community.azure
tag: 2.0.0
@@ -109,24 +109,24 @@ community.ciscosmb:
version: 1.0.7
community.crypto:
repository: https://github.com/ansible-collections/community.crypto
- tag: 2.18.0
- version: 2.18.0
+ tag: 2.19.0
+ version: 2.19.0
community.digitalocean:
repository: https://github.com/ansible-collections/community.digitalocean
tag: 1.26.0
version: 1.26.0
community.dns:
repository: https://github.com/ansible-collections/community.dns
- tag: 2.8.3
- version: 2.8.3
+ tag: 2.9.0
+ version: 2.9.0
community.docker:
repository: https://github.com/ansible-collections/community.docker
- tag: 3.8.1
- version: 3.8.1
+ tag: 3.9.0
+ version: 3.9.0
community.general:
repository: https://github.com/ansible-collections/community.general
- tag: 8.5.0
- version: 8.5.0
+ tag: 8.6.0
+ version: 8.6.0
community.grafana:
repository: https://github.com/ansible-collections/grafana
tag: 1.8.0
@@ -137,20 +137,20 @@ community.hashi_vault:
version: 6.2.0
community.hrobot:
repository: https://github.com/ansible-collections/community.hrobot
- tag: 1.9.1
- version: 1.9.1
+ tag: 1.9.2
+ version: 1.9.2
community.library_inventory_filtering_v1:
repository: https://github.com/ansible-collections/community.library_inventory_filtering
- tag: 1.0.0
- version: 1.0.0
+ tag: 1.0.1
+ version: 1.0.1
community.libvirt:
repository: https://github.com/ansible-collections/community.libvirt
tag: 1.3.0
version: 1.3.0
community.mongodb:
repository: https://github.com/ansible-collections/community.mongodb
- tag: 1.7.2
- version: 1.7.2
+ tag: 1.7.3
+ version: 1.7.3
community.mysql:
repository: https://github.com/ansible-collections/community.mysql
tag: 3.9.0
@@ -173,12 +173,12 @@ community.proxysql:
version: 1.5.1
community.rabbitmq:
repository: https://github.com/ansible-collections/community.rabbitmq
- tag: 1.2.3
- version: 1.2.3
+ tag: 1.3.0
+ version: 1.3.0
community.routeros:
repository: https://github.com/ansible-collections/community.routeros
- tag: 2.14.0
- version: 2.14.0
+ tag: 2.15.0
+ version: 2.15.0
community.sap:
repository: https://github.com/ansible-collections/community.sap
tag: 2.0.0
@@ -193,8 +193,8 @@ community.sops:
version: 1.6.7
community.vmware:
repository: https://github.com/ansible-collections/community.vmware
- tag: 4.2.0
- version: 4.2.0
+ tag: 4.3.0
+ version: 4.3.0
community.windows:
repository: https://github.com/ansible-collections/community.windows
tag: 2.2.0
@@ -205,8 +205,8 @@ community.zabbix:
version: 2.3.1
containers.podman:
repository: https://github.com/containers/ansible-podman-collections
- tag: 1.12.0
- version: 1.12.0
+ tag: 1.13.0
+ version: 1.13.0
cyberark.conjur:
repository: https://github.com/cyberark/ansible-conjur-collection
tag: v1.2.2
@@ -225,8 +225,8 @@ dellemc.openmanage:
version: 8.7.0
dellemc.powerflex:
repository: https://github.com/dell/ansible-powerflex
- tag: 2.2.0
- version: 2.2.0
+ tag: 2.3.0
+ version: 2.3.0
dellemc.unity:
repository: https://github.com/dell/ansible-unity
tag: 1.7.1
@@ -242,8 +242,8 @@ fortinet.fortimanager:
version: 2.4.0
fortinet.fortios:
repository: https://github.com/fortinet-ansible-dev/ansible-galaxy-fortios-collection
- tag: 2.3.5
- version: 2.3.5
+ tag: 2.3.6
+ version: 2.3.6
frr.frr:
repository: https://github.com/ansible-collections/frr.frr
tag: 2.0.2
@@ -283,8 +283,8 @@ ibm.storage_virtualize:
version: 2.3.1
infinidat.infinibox:
repository: https://github.com/infinidat/ansible-infinidat-collection
- tag: v1.4.3
- version: 1.4.3
+ tag: v1.4.5
+ version: 1.4.5
infoblox.nios_modules:
repository: https://github.com/infobloxopen/infoblox-ansible
tag: v1.6.1
@@ -331,8 +331,8 @@ netapp.elementsw:
version: 21.7.0
netapp.ontap:
repository: https://github.com/ansible-collections/netapp.ontap
- tag: 22.10.0
- version: 22.10.0
+ tag: 22.11.0
+ version: 22.11.0
netapp.storagegrid:
repository: https://github.com/ansible-collections/netapp.storagegrid
tag: 21.12.0
@@ -375,8 +375,8 @@ purestorage.flasharray:
version: 1.27.0
purestorage.flashblade:
repository: https://github.com/Pure-Storage-Ansible/FlashBlade-Collection
- tag: 1.16.0
- version: 1.16.0
+ tag: 1.17.0
+ version: 1.17.0
purestorage.fusion:
repository: https://github.com/Pure-Storage-Ansible/Fusion-Collection
tag: 1.6.1